consul/ui/packages/consul-ui/app/utils/http/request.js

65 lines
1.6 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import EventTarget from 'consul-ui/utils/dom/event-target/rsvp';
export default class extends EventTarget {
constructor(method, url, headers) {
super();
this._url = url;
this._method = method;
this._headers = headers;
this._headers = {
...headers,
'content-type': 'application/json',
};
if (typeof this._headers.body.index !== 'undefined') {
// this should probably be in a response
this._headers['content-type'] = 'text/event-stream';
}
}
headers() {
return this._headers;
}
open(xhr) {
this._xhr = xhr;
this.dispatchEvent({ type: 'open' });
}
respond(data) {
this.dispatchEvent({ type: 'message', data: data });
}
error(error) {
// if the xhr was aborted (status = 0)
// and this requests was aborted with a different status
// switch the status
if (error.statusCode === 0 && typeof this.statusCode !== 'undefined') {
error.statusCode = this.statusCode;
}
this.dispatchEvent({ type: 'error', error: error });
}
close() {
this.dispatchEvent({ type: 'close' });
}
connection() {
return this._xhr;
}
abort(statusCode = 0) {
if (this.headers()['content-type'] === 'text/event-stream') {
this.statusCode = statusCode;
const xhr = this.connection();
// unsent and opened get aborted
// headers and loading means wait for it
// to finish for the moment
if (xhr.readyState) {
switch (xhr.readyState) {
case 0:
case 1:
xhr.abort();
break;
}
}
}
}
}