created-event.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. 'use strict';
  2. const { parseXML, childAttr, required, number } = require('../parser');
  3. const {
  4. createDoc,
  5. parseEiResponse,
  6. serializeEiResponse,
  7. energyInteropNs,
  8. energyInteropPayloadsNs,
  9. oadrPayloadNs,
  10. } = require('../shared');
  11. const { fragment } = require('xmlbuilder2');
  12. function parseEventResponse(eventResponse) {
  13. const result = {
  14. responseCode: required(
  15. childAttr(eventResponse, 'responseCode'),
  16. 'responseCode',
  17. ),
  18. responseRequestId: required(
  19. childAttr(eventResponse, 'requestID'),
  20. 'requestID',
  21. ),
  22. optType: required(childAttr(eventResponse, 'optType'), 'optType'),
  23. eventId: required(
  24. childAttr(eventResponse['qualifiedEventID'][0]['$$'], 'eventID'),
  25. 'qualifiedEventID.eventID',
  26. ),
  27. modificationNumber: required(
  28. number(
  29. childAttr(
  30. eventResponse['qualifiedEventID'][0]['$$'],
  31. 'modificationNumber',
  32. ),
  33. ),
  34. 'qualifiedEventID.modificationNumber',
  35. ),
  36. };
  37. const responseDescription = childAttr(eventResponse, 'responseDescription');
  38. if (responseDescription != null)
  39. result.responseDescription = responseDescription;
  40. return result;
  41. }
  42. function parseEventResponses(eventResponses) {
  43. if (eventResponses['$$'] == null) {
  44. return [];
  45. }
  46. const unwrappedEventResponses = eventResponses['$$']['eventResponse'];
  47. return unwrappedEventResponses.map(x => parseEventResponse(x['$$']));
  48. }
  49. function parseEiCreatedEvent(eiCreatedEvent) {
  50. const { code, description, requestId } = parseEiResponse(
  51. eiCreatedEvent['eiResponse'][0]['$$'],
  52. );
  53. const result = {
  54. _type: 'oadrCreatedEvent',
  55. responseCode: code,
  56. responseRequestId: requestId,
  57. venId: required(childAttr(eiCreatedEvent, 'venID'), 'venID'),
  58. };
  59. if (description != null) result.responseDescription = description;
  60. const eventResponses = childAttr(eiCreatedEvent, 'eventResponses');
  61. if (eventResponses != null)
  62. result.eventResponses = parseEventResponses(eventResponses);
  63. return result;
  64. }
  65. async function parse(input) {
  66. const json = await parseXML(input);
  67. const o =
  68. json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'][
  69. 'oadrCreatedEvent'
  70. ][0]['$$'];
  71. return parseEiCreatedEvent(o['eiCreatedEvent'][0]['$$']);
  72. }
  73. function serializeEventResponse(eventResponse) {
  74. const descriptionFrag =
  75. eventResponse.responseDescription != null
  76. ? fragment()
  77. .ele(energyInteropNs, 'ei:responseDescription')
  78. .txt(eventResponse.responseDescription)
  79. : fragment();
  80. return fragment()
  81. .ele(energyInteropNs, 'ei:eventResponse')
  82. .ele(energyInteropNs, 'ei:responseCode')
  83. .txt(eventResponse.responseCode)
  84. .up()
  85. .import(descriptionFrag)
  86. .ele(energyInteropPayloadsNs, 'pyld:requestID')
  87. .txt(eventResponse.responseRequestId)
  88. .up()
  89. .ele(energyInteropNs, 'ei:optType')
  90. .txt(eventResponse.optType)
  91. .up()
  92. .ele(energyInteropNs, 'ei:qualifiedEventID')
  93. .ele(energyInteropNs, 'ei:eventID')
  94. .txt(eventResponse.eventId)
  95. .up()
  96. .ele(energyInteropNs, 'ei:modificationNumber')
  97. .txt(eventResponse.modificationNumber)
  98. .up()
  99. .up();
  100. }
  101. function serializeEventResponses(eventResponses) {
  102. const result = fragment();
  103. const responsesHolder = result.ele(energyInteropNs, 'ei:eventResponses');
  104. eventResponses.forEach(x =>
  105. responsesHolder.import(serializeEventResponse(x)),
  106. );
  107. return result;
  108. }
  109. function serializeEiCreatedEvent(eiCreatedEvent) {
  110. const result = fragment();
  111. const eiCreatedEventHolder = result.ele(oadrPayloadNs, 'pyld:eiCreatedEvent');
  112. eiCreatedEventHolder.import(serializeEiResponse(eiCreatedEvent));
  113. eiCreatedEventHolder.import(
  114. serializeEventResponses(eiCreatedEvent.eventResponses),
  115. );
  116. if (eiCreatedEvent.venId != null) {
  117. eiCreatedEventHolder
  118. .ele(energyInteropNs, 'ei:venID')
  119. .txt(eiCreatedEvent.venId);
  120. }
  121. return result;
  122. }
  123. function serialize(obj) {
  124. const doc = createDoc()
  125. .ele('@oadr2b', 'oadr2b:oadrPayload')
  126. .ele('oadr2b:oadrSignedObject')
  127. .ele('oadr2b:oadrCreatedEvent')
  128. .import(serializeEiCreatedEvent(obj))
  129. .doc();
  130. return doc.end({ headless: true, prettyPrint: false });
  131. }
  132. async function canParse(input) {
  133. const json = await parseXML(input);
  134. const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'];
  135. return o['oadrCreatedEvent'] != null;
  136. }
  137. function canSerialize(message) {
  138. return message._type === 'oadrCreatedEvent';
  139. }
  140. module.exports = {
  141. parse,
  142. serialize,
  143. canParse,
  144. canSerialize,
  145. };