registered-report.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. 'use strict';
  2. const { parseXML, childAttr } = require('../parser');
  3. const {
  4. createDoc,
  5. parseEiResponse,
  6. serializeEiResponse,
  7. energyInteropNs,
  8. parseReportRequests,
  9. serializeReportRequests,
  10. } = require('../shared');
  11. const { fragment } = require('xmlbuilder2');
  12. async function parse(input) {
  13. const json = await parseXML(input);
  14. const o =
  15. json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'][
  16. 'oadrRegisteredReport'
  17. ][0]['$$'];
  18. const { code, description, requestId } = parseEiResponse(
  19. o['eiResponse'][0]['$$'],
  20. );
  21. const result = {
  22. _type: 'oadrRegisteredReport',
  23. responseCode: code,
  24. responseRequestId: requestId,
  25. };
  26. if (description != null) {
  27. result.responseDescription = description;
  28. }
  29. if (code < 200 || code >= 300) {
  30. return result;
  31. }
  32. if (o['oadrReportRequest'] != null) {
  33. result.requests = parseReportRequests(o['oadrReportRequest']);
  34. }
  35. const venId = childAttr(o, 'venID');
  36. if (venId != null) result.venId = venId;
  37. return result;
  38. }
  39. function validate(obj) {
  40. if (!obj.responseCode) {
  41. throw new Error('Missing responseCode');
  42. }
  43. if (!obj.responseRequestId) {
  44. throw new Error('Missing responseRequestId');
  45. }
  46. }
  47. function serialize(obj) {
  48. validate(obj);
  49. const venId =
  50. obj.venId != null
  51. ? fragment()
  52. .ele(energyInteropNs, 'ei:venID')
  53. .txt(obj.venId)
  54. : fragment();
  55. const doc = createDoc()
  56. .ele('@oadr2b', 'oadr2b:oadrPayload')
  57. .ele('oadr2b:oadrSignedObject')
  58. .ele('oadr2b:oadrRegisteredReport')
  59. .att('@ei', 'ei:schemaVersion', '2.0b')
  60. .import(serializeEiResponse(obj))
  61. .import(serializeReportRequests(obj.requests))
  62. .import(venId)
  63. .doc();
  64. return doc.end({ headless: true, prettyPrint: false });
  65. }
  66. async function canParse(input) {
  67. const json = await parseXML(input);
  68. const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'];
  69. return o['oadrRegisteredReport'] != null;
  70. }
  71. function canSerialize(message) {
  72. return message._type === 'oadrRegisteredReport';
  73. }
  74. module.exports = {
  75. parse,
  76. serialize,
  77. canParse,
  78. canSerialize,
  79. };