summaryrefslogtreecommitdiff
path: root/core/01_core.js
diff options
context:
space:
mode:
authorGuilherme Bernal <guilherme@cubos.io>2022-09-28 11:09:33 -0300
committerGitHub <noreply@github.com>2022-09-28 16:09:33 +0200
commit6c55772f0d5101e0d2b8df3b0653a02e1581122f (patch)
treec63e36c5a7822f0ad7d620f078604b81f5792b82 /core/01_core.js
parentb8e3f4c71dae5b43a03e8cfb36e71865e8eeaabf (diff)
feat(core): add Deno.core.setPromiseHooks (#15475)
Diffstat (limited to 'core/01_core.js')
-rw-r--r--core/01_core.js39
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"),