@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
JavaScript
/*!
* ====================================================
* Rzl Utils-JS.
* ----------------------------------------------------
* Version: 3.11.0.
* Author: Rizalvin Dwiky.
* Repository: https://github.com/rzl-zone/utils-js.
* ====================================================
*/
;
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;