-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(ext/node): polyfill node:domain module (#23088)
Closes #16852 --------- Co-authored-by: Nathan Whitaker <nathan@deno.com>
- Loading branch information
1 parent
86bc7a4
commit 778b0b8
Showing
3 changed files
with
190 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. | ||
// Copyright © Benjamin Lupton | ||
// This code has been forked by https://github.com/bevry/domain-browser/commit/8bce7f4a093966ca850da75b024239ad5d0b33c6 | ||
|
||
import domain from "node:domain"; | ||
import { EventEmitter } from "node:events"; | ||
import { assertEquals } from "@std/assert/mod.ts"; | ||
|
||
Deno.test("should work on throws", async function () { | ||
const deferred = Promise.withResolvers<void>(); | ||
const d = domain.create(); | ||
|
||
d.on("error", function (err) { | ||
// @ts-ignore node:domain types are out of date | ||
assertEquals(err && err.message, "a thrown error", "error message"); | ||
deferred.resolve(); | ||
}); | ||
d.run(function () { | ||
throw new Error("a thrown error"); | ||
}); | ||
await deferred.promise; | ||
}); | ||
|
||
Deno.test("should be able to add emitters", async function () { | ||
const deferred = Promise.withResolvers<void>(); | ||
const d = domain.create(); | ||
const emitter = new EventEmitter(); | ||
|
||
d.add(emitter); | ||
d.on("error", function (err) { | ||
assertEquals(err && err.message, "an emitted error", "error message"); | ||
deferred.resolve(); | ||
}); | ||
|
||
emitter.emit("error", new Error("an emitted error")); | ||
await deferred.promise; | ||
}); | ||
|
||
Deno.test("should be able to remove emitters", async function () { | ||
const deferred = Promise.withResolvers<void>(); | ||
const emitter = new EventEmitter(); | ||
const d = domain.create(); | ||
let domainGotError = false; | ||
|
||
d.add(emitter); | ||
d.on("error", function (_err) { | ||
domainGotError = true; | ||
}); | ||
|
||
emitter.on("error", function (err) { | ||
assertEquals( | ||
err && err.message, | ||
"This error should not go to the domain", | ||
"error message", | ||
); | ||
|
||
// Make sure nothing race condition-y is happening | ||
setTimeout(function () { | ||
assertEquals(domainGotError, false, "no domain error"); | ||
deferred.resolve(); | ||
}, 0); | ||
}); | ||
|
||
d.remove(emitter); | ||
emitter.emit("error", new Error("This error should not go to the domain")); | ||
await deferred.promise; | ||
}); | ||
|
||
Deno.test("bind should work", async function () { | ||
const deferred = Promise.withResolvers<void>(); | ||
const d = domain.create(); | ||
|
||
d.on("error", function (err) { | ||
assertEquals(err && err.message, "a thrown error", "error message"); | ||
deferred.resolve(); | ||
}); | ||
d.bind(function (err: Error, a: number, b: number) { | ||
assertEquals(err && err.message, "a passed error", "error message"); | ||
assertEquals(a, 2, "value of a"); | ||
assertEquals(b, 3, "value of b"); | ||
throw new Error("a thrown error"); | ||
})(new Error("a passed error"), 2, 3); | ||
await deferred.promise; | ||
}); | ||
|
||
Deno.test("intercept should work", async function () { | ||
const deferred = Promise.withResolvers<void>(); | ||
const d = domain.create(); | ||
let count = 0; | ||
d.on("error", function (err) { | ||
if (count === 0) { | ||
assertEquals(err && err.message, "a thrown error", "error message"); | ||
} else if (count === 1) { | ||
assertEquals(err && err.message, "a passed error", "error message"); | ||
deferred.resolve(); | ||
} | ||
count++; | ||
}); | ||
|
||
d.intercept(function (a: number, b: number) { | ||
assertEquals(a, 2, "value of a"); | ||
assertEquals(b, 3, "value of b"); | ||
throw new Error("a thrown error"); | ||
// @ts-ignore node:domain types are out of date | ||
})(null, 2, 3); | ||
|
||
d.intercept(function (_a: number, _b: number) { | ||
throw new Error("should never reach here"); | ||
// @ts-ignore node:domain types are out of date | ||
})(new Error("a passed error"), 2, 3); | ||
await deferred.promise; | ||
}); |