diff --git a/.changeset/silver-taxis-cover.md b/.changeset/silver-taxis-cover.md new file mode 100644 index 0000000000..95009ea2fa --- /dev/null +++ b/.changeset/silver-taxis-cover.md @@ -0,0 +1,8 @@ +--- +"@effect/platform-browser": patch +"@effect/platform-bun": patch +"@effect/platform": patch +"effect": patch +--- + +Add `{ once: true }` to all `"abort"` event listeners for `AbortController` to automatically remove handlers after execution diff --git a/packages/effect/src/internal/runtime.ts b/packages/effect/src/internal/runtime.ts index 36f0cdbfc7..d7fa606af0 100644 --- a/packages/effect/src/internal/runtime.ts +++ b/packages/effect/src/internal/runtime.ts @@ -290,7 +290,7 @@ export const unsafeRunPromiseExit = (runtime: Runtime.Runtime) => } else { options.signal.addEventListener("abort", () => { fiber.unsafeInterruptAsFork(fiber.id()) - }) + }, { once: true }) } } }) diff --git a/packages/effect/test/Effect/promise.test.ts b/packages/effect/test/Effect/promise.test.ts index cba293eab7..54db63dcb8 100644 --- a/packages/effect/test/Effect/promise.test.ts +++ b/packages/effect/test/Effect/promise.test.ts @@ -28,7 +28,7 @@ describe("Effect", () => { const effect = Effect.promise((signal) => { signal.addEventListener("abort", () => { aborted = true - }) + }, { once: true }) return new Promise((resolve) => { setTimeout(() => { resolve() diff --git a/packages/effect/test/Effect/tryPromise.test.ts b/packages/effect/test/Effect/tryPromise.test.ts index 1ddaf7d1e1..43e9acec78 100644 --- a/packages/effect/test/Effect/tryPromise.test.ts +++ b/packages/effect/test/Effect/tryPromise.test.ts @@ -47,7 +47,7 @@ describe("Effect", () => { const effect = Effect.tryPromise((signal) => { signal.addEventListener("abort", () => { aborted = true - }) + }, { once: true }) return new Promise((resolve) => { setTimeout(() => { resolve() @@ -70,7 +70,7 @@ describe("Effect", () => { try: (signal) => { signal.addEventListener("abort", () => { aborted = true - }) + }, { once: true }) return new Promise((resolve) => { setTimeout(() => { resolve() diff --git a/packages/platform-browser/src/internal/http/client.ts b/packages/platform-browser/src/internal/http/client.ts index 3222ccc740..1132db0ebe 100644 --- a/packages/platform-browser/src/internal/http/client.ts +++ b/packages/platform-browser/src/internal/http/client.ts @@ -43,7 +43,7 @@ export const makeXMLHttpRequest = Client.makeDefault((request, url, signal, fibe signal.addEventListener("abort", () => { xhr.abort() xhr.onreadystatechange = null - }) + }, { once: true }) xhr.open(request.method, url.toString(), true) xhr.responseType = fiber.getFiberRef(currentXHRResponseType) Object.entries(request.headers).forEach(([k, v]) => { diff --git a/packages/platform-bun/src/internal/http/server.ts b/packages/platform-bun/src/internal/http/server.ts index ecb923c103..ea81da0ef2 100644 --- a/packages/platform-bun/src/internal/http/server.ts +++ b/packages/platform-bun/src/internal/http/server.ts @@ -102,7 +102,7 @@ export const make = ( )) request.signal.addEventListener("abort", () => { runFork(fiber.interruptAsFork(Error.clientAbortFiberId)) - }) + }, { once: true }) }) } handlerStack.push(handler) diff --git a/packages/platform/src/Http/App.ts b/packages/platform/src/Http/App.ts index 9e06f41c25..aff69c91ca 100644 --- a/packages/platform/src/Http/App.ts +++ b/packages/platform/src/Http/App.ts @@ -155,7 +155,7 @@ export const toWebHandlerRuntime = (runtime: Runtime.Runtime) => { const fiber = run(Effect.provideService(handled, ServerRequest.ServerRequest, req)) request.signal.addEventListener("abort", () => { fiber.unsafeInterruptAsFork(ServerError.clientAbortFiberId) - }) + }, { once: true }) }) } }