oadr-response.js 1.7 KB

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