| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- import { BaseClient, BaseResponse } from './base.js';
- import { AbortError } from '../../utils.js';
- class XHRResponse extends BaseResponse {
- /**
- * BaseResponse facade for XMLHttpRequest
- * @param {XMLHttpRequest} xhr
- * @param {ArrayBuffer} data
- */
- constructor(xhr, data) {
- super();
- this.xhr = xhr;
- this.data = data;
- }
- get status() {
- return this.xhr.status;
- }
- getHeader(name) {
- return this.xhr.getResponseHeader(name);
- }
- async getData() {
- return this.data;
- }
- }
- export class XHRClient extends BaseClient {
- constructRequest(headers, signal) {
- return new Promise((resolve, reject) => {
- const xhr = new XMLHttpRequest();
- xhr.open('GET', this.url);
- xhr.responseType = 'arraybuffer';
- for (const [key, value] of Object.entries(headers)) {
- xhr.setRequestHeader(key, value);
- }
- // hook signals
- xhr.onload = () => {
- const data = xhr.response;
- resolve(new XHRResponse(xhr, data));
- };
- xhr.onerror = reject;
- xhr.onabort = () => reject(new AbortError('Request aborted'));
- xhr.send();
- if (signal) {
- if (signal.aborted) {
- xhr.abort();
- }
- signal.addEventListener('abort', () => xhr.abort());
- }
- });
- }
- async request({ headers, signal } = {}) {
- const response = await this.constructRequest(headers, signal);
- return response;
- }
- }
|