UNPKG

@rzl-zone/utils-js

Version:

A modern, lightweight set of JavaScript utility functions with TypeScript support for everyday development, crafted to enhance code readability and maintainability.

119 lines (114 loc) 3.37 kB
/*! * ==================================================== * Rzl Utils-JS. * ---------------------------------------------------- * Version: 3.11.0. * Author: Rizalvin Dwiky. * Repository: https://github.com/rzl-zone/utils-js. * ==================================================== */ 'use strict'; var chunkDVMHRLKP_cjs = require('./chunk-DVMHRLKP.cjs'); var chunkDAPAK2W3_cjs = require('./chunk-DAPAK2W3.cjs'); var chunkSYHPSOUU_cjs = require('./chunk-SYHPSOUU.cjs'); var CustomPromise = class extends Promise { _value; _error; _finish = []; constructor(executor) { let resolveOuter; let rejectOuter; super((resolve, reject) => { resolveOuter = resolve; rejectOuter = reject; }); executor( (v) => { this._value = v; resolveOuter(v); this._finish.forEach((f) => f(v, void 0)); }, (e) => { this._error = e; rejectOuter(e); this._finish.forEach((f) => f(void 0, e)); } ); Object.setPrototypeOf(this, new.target.prototype); } then(onfulfilled, onrejected) { return super.then(onfulfilled, onrejected); } catch(onrejected) { return super.catch(onrejected); } /** * Registers a callback to be invoked **exactly once** when the * promise settles, with access to both the resolved value and * the rejection reason. * * If the promise is already settled when `finish` is called, * the callback executes immediately on the same tick. * * @param cb Callback receiving the final `(value, error)`. * @returns `this` for fluent chaining. */ finish(cb) { if (this._value !== void 0 || this._error !== void 0) { cb(this._value, this._error); } else { this._finish.push(cb); } return this; } }; var AbortError = class extends Error { constructor(message = "The operation was aborted", name = "AbortError") { super(message); this.name = name; } }; var delay = (milliSeconds = 1e3, signal) => { if (!chunkDVMHRLKP_cjs.isInteger(milliSeconds) || milliSeconds <= 0) { throw new TypeError( `First parameter (\`milliSeconds\`) must be of type \`number\` and value must be a \`non-zero\`, \`non-NaN\`, \`non-negative\`, and \`integer-number\`, but received: \`${chunkSYHPSOUU_cjs.getPreciseType( milliSeconds )}\`, with value: \`${chunkDAPAK2W3_cjs.safeStableStringify(milliSeconds, { keepUndefined: true })}\`.` ); } if (chunkSYHPSOUU_cjs.isNull(signal) || signal && !(signal instanceof AbortSignal)) { throw new TypeError( "Second parameter (`signal`) must be an `instance of AbortSignal` if provided." ); } return new Promise((resolve, reject) => { const timer = setTimeout(() => { cleanup(); resolve(); }, milliSeconds); const cleanup = () => { clearTimeout(timer); if (signal) signal.removeEventListener("abort", onAbort); }; const onAbort = () => { cleanup(); reject( new AbortError( "Function `delay` from `@rzl-zone/utils-js` was aborted.", "AbortError" ) ); }; if (signal) { if (signal.aborted) { onAbort(); } else { signal.addEventListener("abort", onAbort, { once: true }); } } }); }; exports.CustomPromise = CustomPromise; exports.delay = delay;