'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'; function parseEiResponse(response) { return { code: required(childAttr(response, 'responseCode'), 'responseCode'), description: childAttr(response, 'responseDescription'), requestId: required(childAttr(response, 'requestID'), 'requestID'), }; } async function parse(input) { const json = await parseXML(input); const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'][ 'oadrCanceledPartyRegistration' ][0]['$$']; const { code, description, requestId } = parseEiResponse( o['eiResponse'][0]['$$'], ); const result = { responseCode: code, responseDescription: description, responseRequestId: requestId, }; if (code < 200 || code >= 300) { return result; } const registrationId = childAttr(o, 'registrationID'); if (registrationId != null) result.registrationId = registrationId; const venId = childAttr(o, 'venID'); if (venId != null) result.venId = venId; return result; } function serializeEiResponse(code, description, requestId) { const descriptionFrag = description != null ? fragment() .ele(energyInteropNs, 'ei:responseDescription') .txt(description) : fragment(); return fragment() .ele(energyInteropNs, 'ei:responseCode') .txt(code) .up() .import(descriptionFrag) .ele(energyInteropPayloadsNs, 'pyld:requestID') .txt(requestId) .up(); } function validate(obj) { if (!obj.responseCode) { throw new Error('Missing responseCode'); } if (!obj.responseRequestId) { throw new Error('Missing responseRequestId'); } } function serialize(obj) { validate(obj); const registrationId = obj.registrationId != null ? fragment() .ele(energyInteropNs, 'ei:registrationID') .txt(obj.registrationId) : fragment(); const venId = obj.venId != null ? fragment() .ele(energyInteropNs, 'ei:venID') .txt(obj.venId) : fragment(); const doc = create({ namespaceAlias: { ns: oadrPayloadNs, oadr2b: oadrNs, ei: energyInteropNs, pyld: energyInteropPayloadsNs }, }) .ele('@oadr2b', 'oadr2b:oadrPayload') .ele('oadr2b:oadrSignedObject') .ele('oadr2b:oadrCanceledPartyRegistration') .att('@ei', 'ei:schemaVersion', '2.0b') .ele('@ei', 'ei:eiResponse') .import( serializeEiResponse( obj.responseCode, obj.responseDescription, obj.responseRequestId, ), ) .up() .import(registrationId) .import(venId) .doc(); return doc.end({ headless: true, prettyPrint: false }); } module.exports = { parse, serialize, };