diff options
author | Guilherme Bernal <guilherme@cubos.io> | 2022-09-28 11:09:33 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-28 16:09:33 +0200 |
commit | 6c55772f0d5101e0d2b8df3b0653a02e1581122f (patch) | |
tree | c63e36c5a7822f0ad7d620f078604b81f5792b82 /core/01_core.js | |
parent | b8e3f4c71dae5b43a03e8cfb36e71865e8eeaabf (diff) |
feat(core): add Deno.core.setPromiseHooks (#15475)
Diffstat (limited to 'core/01_core.js')
-rw-r--r-- | core/01_core.js | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/core/01_core.js b/core/01_core.js index 08f839c98..655b4219e 100644 --- a/core/01_core.js +++ b/core/01_core.js @@ -12,6 +12,7 @@ Map, Array, ArrayPrototypeFill, + ArrayPrototypePush, ArrayPrototypeMap, ErrorCaptureStackTrace, Promise, @@ -266,6 +267,43 @@ } const InterruptedPrototype = Interrupted.prototype; + const promiseHooks = { + init: [], + before: [], + after: [], + resolve: [], + hasBeenSet: false, + }; + + function setPromiseHooks(init, before, after, resolve) { + if (init) ArrayPrototypePush(promiseHooks.init, init); + if (before) ArrayPrototypePush(promiseHooks.before, before); + if (after) ArrayPrototypePush(promiseHooks.after, after); + if (resolve) ArrayPrototypePush(promiseHooks.resolve, resolve); + + if (!promiseHooks.hasBeenSet) { + promiseHooks.hasBeenSet = true; + + ops.op_set_promise_hooks((promise, parentPromise) => { + for (let i = 0; i < promiseHooks.init.length; ++i) { + promiseHooks.init[i](promise, parentPromise); + } + }, (promise) => { + for (let i = 0; i < promiseHooks.before.length; ++i) { + promiseHooks.before[i](promise); + } + }, (promise) => { + for (let i = 0; i < promiseHooks.after.length; ++i) { + promiseHooks.after[i](promise); + } + }, (promise) => { + for (let i = 0; i < promiseHooks.resolve.length; ++i) { + promiseHooks.resolve[i](promise); + } + }); + } + } + // Extra Deno.core.* exports const core = ObjectAssign(globalThis.Deno.core, { opAsync, @@ -286,6 +324,7 @@ refOp, unrefOp, setReportExceptionCallback, + setPromiseHooks, close: (rid) => ops.op_close(rid), tryClose: (rid) => ops.op_try_close(rid), read: opAsync.bind(null, "op_read"), |