aboutsummaryrefslogtreecommitdiff
path: root/node_modules/p-cancelable/index.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-04-09 16:39:03 +0200
committerMinteck <contact@minteck.org>2022-04-09 16:40:02 +0200
commit0f8967b9113d698cdeb2d05ca85d2d9a80461c24 (patch)
tree00664ddd9c55a2c33631fd1bd33e556cea9c67e5 /node_modules/p-cancelable/index.js
parentdac03ac82bc0f8044a4b339c27b5390e4dcecf2f (diff)
downloadvoicer-0f8967b9113d698cdeb2d05ca85d2d9a80461c24.tar.gz
voicer-0f8967b9113d698cdeb2d05ca85d2d9a80461c24.tar.bz2
voicer-0f8967b9113d698cdeb2d05ca85d2d9a80461c24.zip
CommitHEADtrunk
Diffstat (limited to 'node_modules/p-cancelable/index.js')
-rw-r--r--node_modules/p-cancelable/index.js103
1 files changed, 103 insertions, 0 deletions
diff --git a/node_modules/p-cancelable/index.js b/node_modules/p-cancelable/index.js
new file mode 100644
index 0000000..26bd42e
--- /dev/null
+++ b/node_modules/p-cancelable/index.js
@@ -0,0 +1,103 @@
+'use strict';
+
+class CancelError extends Error {
+ constructor(reason) {
+ super(reason || 'Promise was canceled');
+ this.name = 'CancelError';
+ }
+
+ get isCanceled() {
+ return true;
+ }
+}
+
+class PCancelable {
+ static fn(userFn) {
+ return (...args) => {
+ return new PCancelable((resolve, reject, onCancel) => {
+ args.push(onCancel);
+ userFn(...args).then(resolve, reject);
+ });
+ };
+ }
+
+ constructor(executor) {
+ this._cancelHandlers = [];
+ this._isPending = true;
+ this._isCanceled = false;
+ this._rejectOnCancel = true;
+
+ this._promise = new Promise((resolve, reject) => {
+ this._reject = reject;
+
+ const onResolve = value => {
+ this._isPending = false;
+ resolve(value);
+ };
+
+ const onReject = error => {
+ this._isPending = false;
+ reject(error);
+ };
+
+ const onCancel = handler => {
+ this._cancelHandlers.push(handler);
+ };
+
+ Object.defineProperties(onCancel, {
+ shouldReject: {
+ get: () => this._rejectOnCancel,
+ set: bool => {
+ this._rejectOnCancel = bool;
+ }
+ }
+ });
+
+ return executor(onResolve, onReject, onCancel);
+ });
+ }
+
+ then(onFulfilled, onRejected) {
+ return this._promise.then(onFulfilled, onRejected);
+ }
+
+ catch(onRejected) {
+ return this._promise.catch(onRejected);
+ }
+
+ finally(onFinally) {
+ return this._promise.finally(onFinally);
+ }
+
+ cancel(reason) {
+ if (!this._isPending || this._isCanceled) {
+ return;
+ }
+
+ if (this._cancelHandlers.length > 0) {
+ try {
+ for (const handler of this._cancelHandlers) {
+ handler();
+ }
+ } catch (error) {
+ this._reject(error);
+ }
+ }
+
+ this._isCanceled = true;
+ if (this._rejectOnCancel) {
+ this._reject(new CancelError(reason));
+ }
+ }
+
+ get isCanceled() {
+ return this._isCanceled;
+ }
+}
+
+Object.setPrototypeOf(PCancelable.prototype, Promise.prototype);
+
+module.exports = PCancelable;
+module.exports.default = PCancelable;
+
+module.exports.CancelError = CancelError;