request-event.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. 'use strict';
  2. const { parseXML, childAttr, required } = 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. async function parse(input) {
  10. const json = await parseXML(input);
  11. const o =
  12. json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'][
  13. 'oadrRequestEvent'
  14. ][0]['$$']['eiRequestEvent'][0]['$$'];
  15. const result = {
  16. _type: 'oadrRequestEvent',
  17. requestId: required(childAttr(o, 'requestID'), 'requestID'),
  18. venId: required(childAttr(o, 'venID'), 'venID'),
  19. };
  20. const replyLimit = childAttr(o, 'replyLimit');
  21. if (replyLimit != null) result.replyLimit = replyLimit;
  22. return result;
  23. }
  24. function serializeEiRequestEvent(requestId, venId, replyLimit) {
  25. const replyLimitFrag =
  26. replyLimit != null
  27. ? fragment()
  28. .ele(energyInteropPayloadsNs, 'pyld:replyLimit')
  29. .txt(replyLimit)
  30. : fragment();
  31. return fragment()
  32. .ele(energyInteropPayloadsNs, 'pyld:requestID')
  33. .txt(requestId)
  34. .up()
  35. .ele(energyInteropNs, 'ei:venID')
  36. .txt(venId)
  37. .up()
  38. .import(replyLimitFrag);
  39. }
  40. function serialize(obj) {
  41. const doc = create({
  42. namespaceAlias: {
  43. ns: oadrPayloadNs,
  44. oadr2b: oadrNs,
  45. ei: energyInteropNs,
  46. pyld: energyInteropPayloadsNs,
  47. },
  48. })
  49. .ele('@oadr2b', 'oadr2b:oadrPayload')
  50. .ele('oadr2b:oadrSignedObject')
  51. .ele('oadr2b:oadrRequestEvent')
  52. .att(energyInteropNs, 'ei:schemaVersion', '2.0b')
  53. .ele('@pyld', 'pyld:eiRequestEvent')
  54. .import(serializeEiRequestEvent(obj.requestId, obj.venId, obj.replyLimit))
  55. .doc();
  56. return doc.end({ headless: true, prettyPrint: false });
  57. }
  58. module.exports = {
  59. parse,
  60. serialize,
  61. };