http.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.HttpClient = void 0;
  7. const http_1 = __importDefault(require("http"));
  8. const https_1 = __importDefault(require("https"));
  9. const url_1 = __importDefault(require("url"));
  10. const base_js_1 = require("./base.js");
  11. const utils_js_1 = require("../../utils.js");
  12. class HttpResponse extends base_js_1.BaseResponse {
  13. /**
  14. * BaseResponse facade for node HTTP/HTTPS API Response
  15. * @param {http.ServerResponse} response
  16. */
  17. constructor(response, dataPromise) {
  18. super();
  19. this.response = response;
  20. this.dataPromise = dataPromise;
  21. }
  22. get status() {
  23. return this.response.statusCode;
  24. }
  25. getHeader(name) {
  26. return this.response.headers[name];
  27. }
  28. async getData() {
  29. const data = await this.dataPromise;
  30. return data;
  31. }
  32. }
  33. class HttpClient extends base_js_1.BaseClient {
  34. constructor(url) {
  35. super(url);
  36. this.parsedUrl = url_1.default.parse(this.url);
  37. this.httpApi = (this.parsedUrl.protocol === 'http:' ? http_1.default : https_1.default);
  38. }
  39. constructRequest(headers, signal) {
  40. return new Promise((resolve, reject) => {
  41. const request = this.httpApi.get({
  42. ...this.parsedUrl,
  43. headers,
  44. }, (response) => {
  45. const dataPromise = new Promise((resolveData) => {
  46. const chunks = [];
  47. // collect chunks
  48. response.on('data', (chunk) => {
  49. chunks.push(chunk);
  50. });
  51. // concatenate all chunks and resolve the promise with the resulting buffer
  52. response.on('end', () => {
  53. const data = Buffer.concat(chunks).buffer;
  54. resolveData(data);
  55. });
  56. response.on('error', reject);
  57. });
  58. resolve(new HttpResponse(response, dataPromise));
  59. });
  60. request.on('error', reject);
  61. if (signal) {
  62. if (signal.aborted) {
  63. request.destroy(new utils_js_1.AbortError('Request aborted'));
  64. }
  65. signal.addEventListener('abort', () => request.destroy(new utils_js_1.AbortError('Request aborted')));
  66. }
  67. });
  68. }
  69. async request({ headers, signal } = {}) {
  70. const response = await this.constructRequest(headers, signal);
  71. return response;
  72. }
  73. }
  74. exports.HttpClient = HttpClient;
  75. //# sourceMappingURL=http.js.map