summaryrefslogtreecommitdiff
path: root/node_modules/axios/lib/cancel/CancelToken.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/axios/lib/cancel/CancelToken.js')
-rw-r--r--node_modules/axios/lib/cancel/CancelToken.js121
1 files changed, 121 insertions, 0 deletions
diff --git a/node_modules/axios/lib/cancel/CancelToken.js b/node_modules/axios/lib/cancel/CancelToken.js
new file mode 100644
index 0000000..20d8f68
--- /dev/null
+++ b/node_modules/axios/lib/cancel/CancelToken.js
@@ -0,0 +1,121 @@
+'use strict';
+
+import CanceledError from './CanceledError.js';
+
+/**
+ * A `CancelToken` is an object that can be used to request cancellation of an operation.
+ *
+ * @param {Function} executor The executor function.
+ *
+ * @returns {CancelToken}
+ */
+class CancelToken {
+ constructor(executor) {
+ if (typeof executor !== 'function') {
+ throw new TypeError('executor must be a function.');
+ }
+
+ let resolvePromise;
+
+ this.promise = new Promise(function promiseExecutor(resolve) {
+ resolvePromise = resolve;
+ });
+
+ const token = this;
+
+ // eslint-disable-next-line func-names
+ this.promise.then(cancel => {
+ if (!token._listeners) return;
+
+ let i = token._listeners.length;
+
+ while (i-- > 0) {
+ token._listeners[i](cancel);
+ }
+ token._listeners = null;
+ });
+
+ // eslint-disable-next-line func-names
+ this.promise.then = onfulfilled => {
+ let _resolve;
+ // eslint-disable-next-line func-names
+ const promise = new Promise(resolve => {
+ token.subscribe(resolve);
+ _resolve = resolve;
+ }).then(onfulfilled);
+
+ promise.cancel = function reject() {
+ token.unsubscribe(_resolve);
+ };
+
+ return promise;
+ };
+
+ executor(function cancel(message, config, request) {
+ if (token.reason) {
+ // Cancellation has already been requested
+ return;
+ }
+
+ token.reason = new CanceledError(message, config, request);
+ resolvePromise(token.reason);
+ });
+ }
+
+ /**
+ * Throws a `CanceledError` if cancellation has been requested.
+ */
+ throwIfRequested() {
+ if (this.reason) {
+ throw this.reason;
+ }
+ }
+
+ /**
+ * Subscribe to the cancel signal
+ */
+
+ subscribe(listener) {
+ if (this.reason) {
+ listener(this.reason);
+ return;
+ }
+
+ if (this._listeners) {
+ this._listeners.push(listener);
+ } else {
+ this._listeners = [listener];
+ }
+ }
+
+ /**
+ * Unsubscribe from the cancel signal
+ */
+
+ unsubscribe(listener) {
+ if (!this._listeners) {
+ return;
+ }
+ const index = this._listeners.indexOf(listener);
+ if (index !== -1) {
+ this._listeners.splice(index, 1);
+ }
+ }
+
+ /**
+ * Returns an object that contains a new `CancelToken` and a function that, when called,
+ * cancels the `CancelToken`.
+ */
+ static source() {
+ let cancel;
+ const token = new CancelToken(function executor(c) {
+ cancel = c;
+ });
+ return {
+ token,
+ cancel
+ };
+ }
+}
+
+export default CancelToken;