'use strict'; const { parseXML, childAttr, required } = require('../parser'); const { create, fragment } = require('xmlbuilder2'); const oadrPayloadNs = 'http://www.w3.org/2000/09/xmldsig#'; const oadrNs = 'http://openadr.org/oadr-2.0b/2012/07'; const energyInteropNs = 'http://docs.oasis-open.org/ns/energyinterop/201110'; const energyInteropPayloadsNs = 'http://docs.oasis-open.org/ns/energyinterop/201110/payloads'; async function parse(input) { const json = await parseXML(input); const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'][ 'oadrRequestEvent' ][0]['$$']['eiRequestEvent'][0]['$$']; const result = { _type: 'oadrRequestEvent', requestId: required(childAttr(o, 'requestID'), 'requestID'), venId: required(childAttr(o, 'venID'), 'venID'), }; const replyLimit = childAttr(o, 'replyLimit'); if (replyLimit != null) result.replyLimit = replyLimit; return result; } function serializeEiRequestEvent(requestId, venId, replyLimit) { const replyLimitFrag = replyLimit != null ? fragment() .ele(energyInteropPayloadsNs, 'pyld:replyLimit') .txt(replyLimit) : fragment(); return fragment() .ele(energyInteropPayloadsNs, 'pyld:requestID') .txt(requestId) .up() .ele(energyInteropNs, 'ei:venID') .txt(venId) .up() .import(replyLimitFrag); } function serialize(obj) { const doc = create({ namespaceAlias: { ns: oadrPayloadNs, oadr2b: oadrNs, ei: energyInteropNs, pyld: energyInteropPayloadsNs, }, }) .ele('@oadr2b', 'oadr2b:oadrPayload') .ele('oadr2b:oadrSignedObject') .ele('oadr2b:oadrRequestEvent') .att(energyInteropNs, 'ei:schemaVersion', '2.0b') .ele('@pyld', 'pyld:eiRequestEvent') .import(serializeEiRequestEvent(obj.requestId, obj.venId, obj.replyLimit)) .doc(); return doc.end({ headless: true, prettyPrint: false }); } async function canParse(input) { const json = await parseXML(input); const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$']; return o['oadrRequestEvent'] != null; } module.exports = { parse, serialize, canParse, };