'use strict'; const { parseXML, childAttr, required, number } = require('../parser'); const { createDoc, parseEiResponse, serializeEiResponse, energyInteropNs, energyInteropPayloadsNs, oadrPayloadNs, } = require('../shared'); const { fragment } = require('xmlbuilder2'); function parseEventResponse(eventResponse) { const result = { responseCode: required( childAttr(eventResponse, 'responseCode'), 'responseCode', ), responseRequestId: required( childAttr(eventResponse, 'requestID'), 'requestID', ), optType: required(childAttr(eventResponse, 'optType'), 'optType'), eventId: required( childAttr(eventResponse['qualifiedEventID'][0]['$$'], 'eventID'), 'qualifiedEventID.eventID', ), modificationNumber: required( number( childAttr( eventResponse['qualifiedEventID'][0]['$$'], 'modificationNumber', ), ), 'qualifiedEventID.modificationNumber', ), }; const responseDescription = childAttr(eventResponse, 'responseDescription'); if (responseDescription != null) result.responseDescription = responseDescription; return result; } function parseEventResponses(eventResponses) { if (eventResponses['$$'] == null) { return []; } const unwrappedEventResponses = eventResponses['$$']['eventResponse']; return unwrappedEventResponses.map(x => parseEventResponse(x['$$'])); } function parseEiCreatedEvent(eiCreatedEvent) { const { code, description, requestId } = parseEiResponse( eiCreatedEvent['eiResponse'][0]['$$'], ); const result = { _type: 'oadrCreatedEvent', responseCode: code, responseRequestId: requestId, venId: required(childAttr(eiCreatedEvent, 'venID'), 'venID'), }; if (description != null) result.responseDescription = description; const eventResponses = childAttr(eiCreatedEvent, 'eventResponses'); if (eventResponses != null) result.eventResponses = parseEventResponses(eventResponses); return result; } async function parse(input) { const json = await parseXML(input); const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'][ 'oadrCreatedEvent' ][0]['$$']; return parseEiCreatedEvent(o['eiCreatedEvent'][0]['$$']); } function serializeEventResponse(eventResponse) { const descriptionFrag = eventResponse.responseDescription != null ? fragment() .ele(energyInteropNs, 'ei:responseDescription') .txt(eventResponse.responseDescription) : fragment(); return fragment() .ele(energyInteropNs, 'ei:eventResponse') .ele(energyInteropNs, 'ei:responseCode') .txt(eventResponse.responseCode) .up() .import(descriptionFrag) .ele(energyInteropPayloadsNs, 'pyld:requestID') .txt(eventResponse.responseRequestId) .up() .ele(energyInteropNs, 'ei:optType') .txt(eventResponse.optType) .up() .ele(energyInteropNs, 'ei:qualifiedEventID') .ele(energyInteropNs, 'ei:eventID') .txt(eventResponse.eventId) .up() .ele(energyInteropNs, 'ei:modificationNumber') .txt(eventResponse.modificationNumber) .up() .up(); } function serializeEventResponses(eventResponses) { const result = fragment(); const responsesHolder = result.ele(energyInteropNs, 'ei:eventResponses'); eventResponses.forEach(x => responsesHolder.import(serializeEventResponse(x)), ); return result; } function serializeEiCreatedEvent(eiCreatedEvent) { const result = fragment(); const eiCreatedEventHolder = result.ele(oadrPayloadNs, 'pyld:eiCreatedEvent'); eiCreatedEventHolder.import(serializeEiResponse(eiCreatedEvent)); eiCreatedEventHolder.import( serializeEventResponses(eiCreatedEvent.eventResponses), ); if (eiCreatedEvent.venId != null) { eiCreatedEventHolder .ele(energyInteropNs, 'ei:venID') .txt(eiCreatedEvent.venId); } return result; } function serialize(obj) { const doc = createDoc() .ele('@oadr2b', 'oadr2b:oadrPayload') .ele('oadr2b:oadrSignedObject') .ele('oadr2b:oadrCreatedEvent') .import(serializeEiCreatedEvent(obj)) .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['oadrCreatedEvent'] != null; } function canSerialize(message) { return message._type === 'oadrCreatedEvent'; } module.exports = { parse, serialize, canParse, canSerialize, };