1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-23 07:44:48 -05:00
denoland-deno/ext/node/polyfills/domain.ts
Bartek Iwańczuk 778b0b8eb5
fix(ext/node): polyfill node:domain module (#23088)
Closes https://github.com/denoland/deno/issues/16852

---------

Co-authored-by: Nathan Whitaker <nathan@deno.com>
2024-04-03 21:37:10 +02:00

90 lines
1.8 KiB
TypeScript

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
// Copyright Joyent and Node contributors. All rights reserved. MIT license.
// This code has been inspired by https://github.com/bevry/domain-browser/commit/8bce7f4a093966ca850da75b024239ad5d0b33c6
import { primordials } from "ext:core/mod.js";
const {
ArrayPrototypeSlice,
FunctionPrototypeBind,
FunctionPrototypeCall,
FunctionPrototypeApply,
} = primordials;
import { EventEmitter } from "node:events";
function emitError(e) {
this.emit("error", e);
}
export function create() {
return new Domain();
}
export class Domain extends EventEmitter {
#handler;
constructor() {
super();
this.#handler = FunctionPrototypeBind(emitError, this);
}
add(emitter) {
emitter.on("error", this.#handler);
}
remove(emitter) {
emitter.off("error", this.#handler);
}
bind(fn) {
// deno-lint-ignore no-this-alias
const self = this;
return function () {
try {
FunctionPrototypeApply(fn, null, ArrayPrototypeSlice(arguments));
} catch (e) {
FunctionPrototypeCall(emitError, self, e);
}
};
}
intercept(fn) {
// deno-lint-ignore no-this-alias
const self = this;
return function (e) {
if (e) {
FunctionPrototypeCall(emitError, self, e);
} else {
try {
FunctionPrototypeApply(fn, null, ArrayPrototypeSlice(arguments, 1));
} catch (e) {
FunctionPrototypeCall(emitError, self, e);
}
}
};
}
run(fn) {
try {
fn();
} catch (e) {
FunctionPrototypeCall(emitError, this, e);
}
return this;
}
dispose() {
this.removeAllListeners();
return this;
}
enter() {
return this;
}
exit() {
return this;
}
}
export default {
create,
Domain,
};