ven.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. 'use strict';
  2. const {
  3. serialize: serializeCreatePartyRegistration,
  4. } = require('../xml/register-party/create-party-registration');
  5. const {
  6. serialize: serializeQueryRegistration,
  7. } = require('../xml/register-party/query-registration');
  8. const {
  9. parse: parseCreatedPartyRegistration,
  10. } = require('../xml/register-party/created-party-registration');
  11. const axios = require('axios');
  12. const { escape } = require('querystring');
  13. class Ven {
  14. constructor(
  15. endpoint,
  16. clientCertPem,
  17. commonName,
  18. venId,
  19. venName,
  20. registrationId,
  21. ) {
  22. if (!endpoint.endsWith('/')) endpoint += '/';
  23. this.endpoint = endpoint;
  24. this.clientCertHeader = escape(clientCertPem);
  25. this.venId = venId;
  26. this.registrationId = registrationId;
  27. this.venName = venName;
  28. this.commonName = commonName;
  29. }
  30. async queryRegistration() {
  31. const message = {
  32. requestId: '2233',
  33. };
  34. const createdResponse = this.makeRequest(
  35. 'EiRegisterParty',
  36. message,
  37. serializeQueryRegistration,
  38. parseCreatedPartyRegistration,
  39. );
  40. // track registrationId for subsequent requests
  41. this.registrationId = createdResponse.registrationId;
  42. return createdResponse;
  43. }
  44. async register() {
  45. const message = {
  46. requestId: '2233',
  47. registrationId: this.registrationId,
  48. venId: this.venId,
  49. oadrProfileName: '2.0b',
  50. oadrTransportName: 'simplehttp',
  51. oadrReportOnly: false,
  52. oadrXmlSignature: false,
  53. oadrVenName: this.venName,
  54. oadrHttpPullModel: true,
  55. };
  56. const createdResponse = this.makeRequest(
  57. 'EiRegisterParty',
  58. message,
  59. serializeCreatePartyRegistration,
  60. parseCreatedPartyRegistration,
  61. );
  62. // track registrationId for subsequent requests
  63. this.registrationId = createdResponse.registrationId;
  64. return createdResponse;
  65. }
  66. async makeRequest(service, message, serializer, parser) {
  67. const xml = serializer(message);
  68. const config = {
  69. headers: {
  70. 'Content-Type': 'application/xml',
  71. // these next 2 headers are provided manually for now, simulating what nginx is doing.
  72. SSL_CLIENT_S_DN_CN: this.commonName || 'no_client_cert',
  73. SSL_CLIENT_CERTIFICATE: this.clientCertHeader,
  74. },
  75. };
  76. // axios will automatically reject HTTP response codes outside the 200-299 range
  77. const httpResponse = await axios.post(
  78. `${this.endpoint}OpenADR2/Simple/2.0b/${service}`,
  79. xml,
  80. config,
  81. );
  82. const response = await parser(httpResponse.data);
  83. // but OpenADR provides its own response code in the XML envelope, we need to check that
  84. if (response.responseCode < 200 || response.responseCode >= 300) {
  85. throw new Error(
  86. `Error during ${service} call. ResponseCode=${response.responseCode}, ResponseDescription=${response.responseDescription}`,
  87. );
  88. }
  89. return response;
  90. }
  91. }
  92. module.exports = {
  93. Ven,
  94. };