created-event.js 5.2 KB

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