packages/dubbo-web-test/karma-fixup-AbortController.js (76 lines of code) (raw):
// Copyright 2021-2023 Buf Technologies, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// a simplistic polyfill for AbortController and AbortSignal
(function () {
if (globalThis.AbortController && globalThis.AbortSignal) {
return;
}
function AbortSignal() {
Object.defineProperty(this, "listeners", {
value: [],
writable: true,
configurable: true,
});
}
AbortSignal.prototype.addEventListener = function (type, callback) {
if (type !== "abort") {
return;
}
if (!(type in this.listeners)) {
this.listeners[type] = [];
}
this.listeners[type].push(callback);
};
AbortSignal.prototype.removeEventListener = function (type, callback) {
if (type !== "abort") {
return;
}
for (let i = 0; i < this.listeners.length; i++) {
if (this.listeners[i] === callback) {
this.listeners.splice(i, 1);
break;
}
}
};
AbortSignal.prototype.dispatchEvent = function (event) {
if (event.type !== "abort") {
return;
}
this.aborted = true;
if (typeof this.onabort === "function") {
this.onabort.call(this, event);
}
const l = this.listeners.concat();
for (let i = 0; i < l.length; i++) {
const listener = l[i];
try {
listener.call(this, event);
} catch (e) {
Promise.resolve().then(() => {
throw e;
});
}
}
return !event.defaultPrevented;
};
AbortSignal.prototype.toString = function () {
return "[object AbortSignal]";
};
function AbortController() {
Object.defineProperty(this, "signal", {
value: new AbortSignal(),
writable: true,
configurable: true,
});
}
AbortController.prototype.abort = function () {
let event;
try {
event = new Event("abort");
} catch (e) {
// no support for IE
}
this.signal.dispatchEvent(event);
};
AbortController.prototype.toString = function () {
return "[object AbortController]";
};
globalThis.AbortController = AbortController;
globalThis.AbortSignal = AbortSignal;
})();