1// @effect-diagnostics nodeBuiltinImport:off - Entry point for the inherited-pipe shutdown regression test.
2import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
3import * as NodeServices from "@effect/platform-node/NodeServices";
4import * as Console from "effect/Console";
5import * as Context from "effect/Context";
6import * as Effect from "effect/Effect";
7import * as Exit from "effect/Exit";
8import * as Fiber from "effect/Fiber";
9import * as Layer from "effect/Layer";
10import * as Stream from "effect/Stream";
11
12import * as ServerSettings from "../../serverSettings.ts";
13
14import * as ServerConfig from "../../config.ts";
15import * as DesktopTelemetryReceiver from "../../resourceTelemetry/DesktopTelemetryReceiver.ts";
16import * as DesktopBrowserChannel from "../DesktopBrowserChannel.ts";
17
18const key = { threadId: "thread-1", tabId: "tab-1" };
19
20Effect.gen(function* () {
21 const base = yield* ServerConfig.ServerConfig.pipe(
22 Effect.provide(ServerConfig.layerTest(process.cwd(), { prefix: "t3-pipe-lifecycle-" })),
23 );
24 const context = yield* Layer.build(
25 Layer.merge(DesktopBrowserChannel.layer, DesktopTelemetryReceiver.layer).pipe(
26 Layer.provide(ServerSettings.layerTest()),
27 Layer.provide(
28 Layer.succeed(ServerConfig.ServerConfig, {
29 ...base,
30 desktopBrowserFd: 3,
31 desktopBrowserControlFd: 4,
32 desktopTelemetryFd: 5,
33 desktopTelemetryControlFd: 6,
34 }),
35 ),
36 ),
37 );
38 const browser = Context.get(context, DesktopBrowserChannel.DesktopBrowserChannel);
39 const telemetry = Context.get(context, DesktopTelemetryReceiver.DesktopTelemetryReceiver);
40 const health = yield* telemetry.subscribeHealth;
41 const healthy = yield* health.changes.pipe(
42 Stream.filter((value) => value.status === "healthy"),
43 Stream.runHead,
44 Effect.forkScoped,
45 );
46 const detached = yield* browser.detached.pipe(Stream.runHead, Effect.forkScoped);
47 yield* Console.log("ready");
48 if (!(yield* browser.awaitAttached(key, "5 seconds"))) {
49 return yield* Effect.die("The browser attach message was not received.");
50 }
51 yield* Fiber.join(healthy);
52 yield* Console.log("attached");
53 yield* Fiber.join(detached);
54 const endpoint = yield* Effect.exit(Effect.scoped(browser.endpoint(key)));
55 if (Exit.isSuccess(endpoint)) return yield* Effect.die("A detached tab received an endpoint.");
56 yield* Console.log("verified");
57}).pipe(Effect.scoped, Effect.provide(NodeServices.layer), NodeRuntime.runMain);