From d7b343fae82745c02e94bde45698c2c455441d6d Mon Sep 17 00:00:00 2001 From: Filip Date: Thu, 15 Jan 2026 00:52:54 +0100 Subject: [PATCH] fix: close eventStream when page closes --- src/event-stream.test.ts | 49 ++++++++++++++++++++++++++++++++++++++++ src/page.ts | 10 ++++++-- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/event-stream.test.ts diff --git a/src/event-stream.test.ts b/src/event-stream.test.ts new file mode 100644 index 0000000..0e26945 --- /dev/null +++ b/src/event-stream.test.ts @@ -0,0 +1,49 @@ +import { layer } from "@effect/vitest"; +import { Effect, Stream } from "effect"; +import { chromium } from "playwright-core"; +import { PlaywrightBrowser } from "./browser"; +import { PlaywrightEnvironment } from "./experimental"; + +layer(PlaywrightEnvironment.layer(chromium))("eventStream", (it) => { + it.scoped("should complete when the page closes", () => + Effect.gen(function* () { + const browser = yield* PlaywrightBrowser; + const page = yield* browser.newPage(); + + // Subscribe to an event stream + const stream = page.eventStream("console"); + + // Run the stream in the background + const fiber = yield* Stream.runCollect(stream).pipe(Effect.fork); + + // Close the page + yield* page.close; + + // Wait for the stream to complete + yield* fiber.await; + + // test will timeout if the stream does not complete + }).pipe(PlaywrightEnvironment.withBrowser), + ); + + it.scoped("should complete when the browser closes", () => + Effect.gen(function* () { + const browser = yield* PlaywrightBrowser; + const page = yield* browser.newPage(); + + // Subscribe to an event stream + const stream = page.eventStream("console"); + + // Run the stream in the background + const fiber = yield* Stream.runCollect(stream).pipe(Effect.fork); + + // Close the browser + yield* browser.close; + + // Wait for the stream to complete + yield* fiber.await; + + // test will timeout if the stream does not complete + }).pipe(PlaywrightEnvironment.withBrowser), + ); +}); diff --git a/src/page.ts b/src/page.ts index f2429fb..9e14349 100644 --- a/src/page.ts +++ b/src/page.ts @@ -247,11 +247,17 @@ export class PlaywrightPage extends Context.Tag( Effect.acquireRelease( Effect.sync(() => { const callback = emit.single; + const closeCallback = emit.end; page.on(event, callback); + page.once("close", closeCallback); - return callback; + return { callback, closeCallback }; }), - (callback) => Effect.sync(() => page.off(event, callback)), + ({ callback, closeCallback }) => + Effect.sync(() => { + page.off(event, callback); + page.off("close", closeCallback); + }), ), ).pipe( Stream.map((e) => {