ven.js 3.6 KB

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