'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) { const result = { code: required(childAttr(response, 'responseCode'), 'responseCode'), description: childAttr(response, 'responseDescription'), }; const requestId = childAttr(response, 'requestID'); if (requestId != null) { result.requestId = requestId; } return result; } async function parse(input) { const json = await parseXML(input); const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$']['oadrResponse'][0][ '$$' ]; const { code, description, requestId } = parseEiResponse( o['eiResponse'][0]['$$'], ); const result = { _type: 'oadrResponse', responseCode: code, responseDescription: description, responseRequestId: requestId, }; if (code < 200 || code >= 300) { return result; } 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'); } } function serialize(obj) { validate(obj); 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:oadrResponse') .att('@ei', 'ei:schemaVersion', '2.0b') .ele('@ei', 'ei:eiResponse') .import( serializeEiResponse( obj.responseCode, obj.responseDescription, obj.responseRequestId, ), ) .up() .import(venId) .doc(); return doc.end({ headless: true, prettyPrint: false }); } module.exports = { parse, serialize, };