proxify-method
Version:
Project for flexible extension of the existing functionality
63 lines • 2.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.proxifyAsync = void 0;
function proxifyAsync(resultPromise, chainMehod, fromResult = false) {
let proxifiedResult = resultPromise;
const callQueue = [];
const proxed = new Proxy({}, {
get(_t, p) {
if (p === 'toJSON') {
return function () {
if (fromResult) {
return proxifiedResult;
}
else {
return resultPromise;
}
};
}
if (chainMehod[p]) {
return function (...expectation) {
callQueue.push(async function () {
const resolved = await resultPromise;
return chainMehod[p](...expectation, resolved);
});
return proxed;
};
}
else if (p === 'then' || p === 'catch') {
if (!callQueue.length) {
return function (...args) {
return resultPromise[p].call(resultPromise, ...args);
};
}
if (callQueue.length === 1) {
return async function (onRes, onRej) {
const result = await callQueue[0]().catch(onRej);
if (fromResult) {
return result;
}
return resultPromise[p].call(resultPromise, onRes, onRej);
};
}
return async function (onRes, onRej) {
const catcher = p === 'catch' ? onRes : onRej;
for (const queuedCall of callQueue) {
proxifiedResult = await queuedCall(fromResult ? proxifiedResult : undefined)
.catch((error) => ({ error, ____proxed____error: true }));
if (proxifiedResult && proxifiedResult.____proxed____error) {
return catcher(proxifiedResult.error);
}
}
if (fromResult) {
return proxifiedResult;
}
return resultPromise[p].call(resultPromise, onRes, onRej);
};
}
}
});
return proxed;
}
exports.proxifyAsync = proxifyAsync;
//# sourceMappingURL=async.proxify.js.map