effect-browser 0.3.0-beta.16 → 0.3.0-beta.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +12 -4
  2. package/dist/{Browser-DRPthkNO.mjs → Browser-H63wiekr.mjs} +4 -4
  3. package/dist/Browser-H63wiekr.mjs.map +1 -0
  4. package/dist/Browser.d.mts +1 -1
  5. package/dist/Browser.mjs +1 -1
  6. package/dist/Cdp.mjs +2 -2
  7. package/dist/Chromium.mjs +2 -2
  8. package/dist/Expect.d.mts +1 -1
  9. package/dist/Expect.mjs +2 -2
  10. package/dist/Moment.d.mts +1 -1
  11. package/dist/Moment.mjs +3 -3
  12. package/dist/Moment.mjs.map +1 -1
  13. package/dist/{Page-C_VkBVwI.mjs → Page-CfB6Zn1p.mjs} +3 -7
  14. package/dist/Page-CfB6Zn1p.mjs.map +1 -0
  15. package/dist/{Page-jHmSJeOS.d.mts → Page-ku6j5t-v.d.mts} +18 -13
  16. package/dist/Page.d.mts +1 -1
  17. package/dist/Page.mjs +1 -1
  18. package/dist/{Plan-X-JkACAB.mjs → Plan-C-d5QYS8.mjs} +3 -3
  19. package/dist/{Plan-X-JkACAB.mjs.map → Plan-C-d5QYS8.mjs.map} +1 -1
  20. package/dist/{Plan-DLtRksuu.d.mts → Plan-DJ4hEEna.d.mts} +2 -2
  21. package/dist/Plan.d.mts +1 -1
  22. package/dist/Plan.mjs +1 -1
  23. package/dist/Policy.d.mts +1 -1
  24. package/dist/Policy.mjs +1 -1
  25. package/dist/Presentation.d.mts +1 -1
  26. package/dist/Presentation.mjs +2 -2
  27. package/dist/Stage.d.mts +1 -1
  28. package/dist/Stage.mjs +7 -6
  29. package/dist/Stage.mjs.map +1 -1
  30. package/dist/{Supervisor-BgWP8o9t.mjs → Supervisor-2mPjIYYs.mjs} +4 -3
  31. package/dist/{Supervisor-BgWP8o9t.mjs.map → Supervisor-2mPjIYYs.mjs.map} +1 -1
  32. package/dist/Supervisor.mjs +1 -1
  33. package/dist/{context-rYTk-3Cv.mjs → context-w3NJPRLo.mjs} +15 -8
  34. package/dist/context-w3NJPRLo.mjs.map +1 -0
  35. package/dist/index.d.mts +2 -2
  36. package/dist/index.mjs +4 -4
  37. package/dist/{page-ClEMFnBG.mjs → page-BKwfF6z-.mjs} +169 -112
  38. package/dist/page-BKwfF6z-.mjs.map +1 -0
  39. package/package.json +1 -1
  40. package/src/Moment.ts +3 -6
  41. package/src/Page.ts +13 -11
  42. package/src/Stage.ts +8 -16
  43. package/src/Supervisor.ts +6 -7
  44. package/src/internal/input/actions.ts +28 -64
  45. package/src/internal/input/dispatch.ts +22 -7
  46. package/src/internal/input/edit.inpage.ts +23 -2
  47. package/src/internal/input/evidence.inpage.ts +0 -2
  48. package/src/internal/input/guard.ts +3 -9
  49. package/src/internal/input/perform.ts +14 -10
  50. package/src/internal/input/pointer.ts +3 -6
  51. package/src/internal/input/replies.ts +19 -8
  52. package/src/internal/input/settle.ts +3 -2
  53. package/src/internal/input/targets.inpage.ts +2 -5
  54. package/src/internal/input/targets.ts +5 -21
  55. package/src/internal/page/bridge.ts +2 -2
  56. package/src/internal/page/context.ts +13 -1
  57. package/src/internal/page/navigation.ts +3 -12
  58. package/src/internal/pictures/capture.ts +7 -0
  59. package/src/internal/pictures/motion.ts +65 -0
  60. package/src/internal/pictures/pictures.ts +20 -16
  61. package/src/internal/pictures/utilsBundle.d.ts +9 -0
  62. package/src/internal/reading/reading.ts +5 -9
  63. package/src/internal/reading/ready.ts +66 -14
  64. package/src/internal/timeline/events.ts +5 -8
  65. package/src/internal/timeline/window.ts +3 -8
  66. package/dist/Browser-DRPthkNO.mjs.map +0 -1
  67. package/dist/Page-C_VkBVwI.mjs.map +0 -1
  68. package/dist/context-rYTk-3Cv.mjs.map +0 -1
  69. package/dist/page-ClEMFnBG.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Stage.mjs","names":[],"sources":["../src/Stage.ts"],"sourcesContent":["/**\n * An output's capture ownership. Cue a page while preparing an event; commit when that event\n * happens. A prepared cue belongs to its caller's scope, and a committed one to the stage.\n * Commits serialize, drain old-page input and refuse stale first frames. `shown` distinguishes\n * confirmed silence, uncertain silence and loss without treating capture silence as evidence.\n * @since 0.3.0\n */\nimport {\n Cause,\n Clock,\n Deferred,\n Duration,\n Effect,\n Exit,\n Fiber,\n Option,\n PubSub,\n Result,\n Schedule,\n Schema,\n Scope,\n Stream,\n} from \"effect\";\n\nimport { type BrowserError, Closed, consequence, InvalidRequest, Timeout } from \"./BrowserError.ts\";\nimport type { CaptureStats, Frame, ScreencastOptions } from \"./Frame.ts\";\nimport { failWith, undispatched } from \"./internal/page/context.ts\";\nimport { internalsOf } from \"./internal/page/page.ts\";\nimport { monotonicMillis } from \"./internal/pictures/clock.ts\";\nimport type { Page } from \"./Page.ts\";\n\nexport interface Options extends ScreencastOptions {\n /** Bound for each first-frame wait. Defaults to 5 seconds. */\n readonly firstFrame?: Duration.Input | undefined;\n}\n\n/** A switch that took effect, on the clock shared by browser events and frames. */\nexport class Presented extends Schema.Class<Presented>(\"effect-browser/Presented\")({\n page: Schema.String,\n at: Schema.Finite,\n latency: Schema.Finite,\n}) {}\n\nexport interface Cue {\n readonly page: Page;\n /** A frame of the current document, or the capture's failure or first-frame timeout. */\n readonly ready: Effect.Effect<void, BrowserError>;\n /** Commit on the event's host time, or now. Interruption before switching leaves the cue usable. */\n readonly commit: (options?: {\n readonly at?: number | undefined;\n }) => Effect.Effect<Presented, BrowserError>;\n}\n\n/** What the output establishes at nondecreasing host times; frames retain their capture times. */\nexport type Shown =\n | { readonly _tag: \"Painted\"; readonly frame: Frame; readonly at: number }\n | { readonly _tag: \"Still\"; readonly frame: Frame; readonly at: number }\n | { readonly _tag: \"Stalled\"; readonly frame: Frame; readonly at: number }\n | { readonly _tag: \"Gone\"; readonly page: string; readonly at: number };\n\nexport interface Stage {\n readonly present: (\n page: Page,\n options?: { readonly at?: number | undefined },\n ) => Effect.Effect<Presented, BrowserError>;\n readonly cue: (page: Page) => Effect.Effect<Cue, BrowserError, Scope.Scope>;\n /** Paint and, after every finite positive hold without paint, current evidence or loss. */\n readonly shown: (options: { readonly hold: Duration.Input }) => Stream.Stream<Shown>;\n /** Capture-timed current-page paint; use `shown` for output time. Readers retain 16 frames. */\n readonly frames: Stream.Stream<Frame>;\n readonly current: Effect.Effect<Option.Option<Page>>;\n readonly stats: (options?: {\n readonly window?: Duration.Input | undefined;\n }) => Effect.Effect<Option.Option<CaptureStats>, BrowserError>;\n}\n\ntype FeedState =\n | { readonly _tag: \"Warming\" }\n | { readonly _tag: \"Ready\"; readonly latest: Frame | undefined }\n | { readonly _tag: \"Stopped\" };\ninterface Feed {\n readonly page: Page;\n readonly scope: Scope.Closeable;\n readonly changed: PubSub.PubSub<Frame>;\n state: FeedState;\n fiber: Fiber.Fiber<void, BrowserError> | undefined;\n}\ninterface Paint {\n readonly feed: Feed;\n readonly frame: Frame;\n readonly at: number;\n}\n\ninterface Evidence {\n readonly feed: Feed;\n readonly frame: Frame;\n readonly value: Shown;\n}\n\nconst unavailable = () =>\n undispatched(\"cue\", new InvalidRequest({ detail: \"the cue's capture is no longer available\" }));\n\n/** The sole writer of a cue's capture lifecycle; presentation ownership belongs to the stage. */\nconst update = (\n feed: Feed,\n input: { readonly _tag: \"Paint\"; readonly frame: Frame } | { readonly _tag: \"Reset\" | \"Stop\" },\n) => {\n if (feed.state._tag === \"Stopped\") return;\n if (input._tag === \"Stop\") feed.state = { _tag: \"Stopped\" };\n else if (input._tag === \"Paint\") feed.state = { _tag: \"Ready\", latest: input.frame };\n else if (feed.state._tag === \"Ready\") feed.state = { _tag: \"Ready\", latest: undefined };\n};\n\nconst restartable = (error: BrowserError) => {\n const { lost, repeat } = consequence(error);\n\n return lost === \"nothing\" && repeat !== \"pointless\";\n};\n\nconst stop = (feed: Feed) =>\n Effect.suspend(() => {\n update(feed, { _tag: \"Stop\" });\n\n return Scope.close(feed.scope, Exit.void);\n });\n\nconst frameOf = (feed: Feed) => {\n const frame = feed.state._tag === \"Ready\" ? feed.state.latest : undefined;\n const internals = internalsOf(feed.page);\n\n return frame !== undefined && (internals === undefined || internals.current(frame))\n ? frame\n : undefined;\n};\n\nconst ended = (feed: Feed): Effect.Effect<never, BrowserError> =>\n feed.fiber === undefined\n ? Effect.never\n : Fiber.await(feed.fiber).pipe(\n Effect.flatMap((exit) =>\n Exit.isFailure(exit) && !Cause.hasInterruptsOnly(exit.cause)\n ? Effect.failCause(exit.cause)\n : Effect.fail(unavailable()),\n ),\n );\n\nconst firstOf = (feed: Feed, wait: Duration.Duration) =>\n Effect.suspend(() => {\n if (feed.state._tag === \"Stopped\") return Effect.fail(unavailable());\n if (feed.page.playwright.isClosed()) return failWith(\"cue\", new Closed({ cause: \"page\" }));\n if (frameOf(feed) !== undefined) return Effect.void;\n\n return Effect.raceFirst(\n Stream.fromPubSub(feed.changed).pipe(\n Stream.filter(() => frameOf(feed) !== undefined),\n Stream.runHead,\n Effect.asVoid,\n ),\n ended(feed),\n ).pipe(\n Effect.timeoutOrElse({\n duration: wait,\n orElse: () => failWith(\"cue\", new Timeout({ millis: Duration.toMillis(wait) })),\n }),\n );\n });\n\n// A timer can wake a fraction early; a commit never precedes its event.\nconst until = (at: number, now: () => number): Effect.Effect<void> =>\n Effect.suspend(() =>\n at > now()\n ? Effect.sleep(Duration.millis(Math.ceil(at - now()))).pipe(Effect.andThen(until(at, now)))\n : Effect.void,\n );\n\n/** Reserve the next turn before waking it; a fresh caller cannot overtake a queued commit. */\nconst ordered = () => {\n const waiting: Array<Deferred.Deferred<void>> = [];\n\n return <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n Effect.acquireUseRelease(\n Effect.sync(() => {\n const turn = Deferred.makeUnsafe<void>();\n\n waiting.push(turn);\n if (waiting.length === 1) Deferred.doneUnsafe(turn, Exit.void);\n\n return turn;\n }),\n (turn) => Deferred.await(turn).pipe(Effect.andThen(effect)),\n (turn) =>\n Effect.sync(() => {\n const at = waiting.indexOf(turn);\n\n waiting.splice(at, 1);\n if (at === 0 && waiting[0] !== undefined) Deferred.doneUnsafe(waiting[0], Exit.void);\n }),\n );\n};\n\n/** A terminal capture can know the connection is gone before the page receives its close event. */\nconst confirm = (feed: Feed, frame: Frame) => {\n const exit = feed.fiber?.pollUnsafe();\n\n const failure =\n exit !== undefined && Exit.isFailure(exit) ? Cause.findErrorOption(exit.cause) : Option.none();\n\n if (Option.isSome(failure) && consequence(failure.value).lost !== \"nothing\")\n return Effect.fail(failure.value);\n\n return feed.page.playwright.isClosed()\n ? failWith(\"shown\", new Closed({ cause: \"page\" }))\n : (internalsOf(feed.page)?.confirm(frame) ?? Effect.succeed(false));\n};\n\n/** Each subscriber confirms silence; a new frame or commit invalidates a probe. */\nconst evidence = (\n output: PubSub.PubSub<Paint>,\n current: () =>\n | { readonly feed: Feed; readonly frame: Frame; readonly changedAt: number }\n | undefined,\n now: () => number,\n hold: Duration.Input,\n): Stream.Stream<Shown> =>\n Stream.unwrap(\n Effect.sync(() => {\n const parsed = Duration.fromInput(hold);\n\n if (\n Option.isNone(parsed) ||\n !Duration.isFinite(parsed.value) ||\n !Duration.isPositive(parsed.value)\n )\n throw new RangeError(\"shown hold must be a finite positive duration\");\n const millis = Duration.toMillis(parsed.value);\n let checkedAt = now();\n let shownAt = Number.NEGATIVE_INFINITY;\n let seen: Pick<Paint, \"feed\" | \"frame\"> | undefined = current();\n let gone: Feed | undefined;\n\n const probe = Effect.gen(function* () {\n yield* until(Math.max(checkedAt, current()?.changedAt ?? checkedAt) + millis, now);\n checkedAt = now();\n const before = current();\n const frame = before?.frame;\n\n if (\n before === undefined ||\n frame === undefined ||\n gone === before.feed ||\n checkedAt - before.changedAt < millis\n )\n return Option.none<Evidence>();\n const { feed } = before;\n\n const confirmed = yield* Effect.result(confirm(feed, frame));\n\n if (current()?.feed !== feed || current()?.frame !== frame) return Option.none<Evidence>();\n const at = now();\n\n checkedAt = at;\n if (Result.isFailure(confirmed) && consequence(confirmed.failure).lost !== \"nothing\") {\n return Option.some<Evidence>({\n feed,\n frame,\n value: { _tag: \"Gone\", page: feed.page.id, at },\n });\n }\n\n return Option.some<Evidence>({\n feed,\n frame,\n value: {\n _tag: Result.isSuccess(confirmed) && confirmed.success ? \"Still\" : \"Stalled\",\n frame,\n at,\n },\n });\n });\n\n return Stream.merge(\n Stream.fromPubSub(output).pipe(\n Stream.map(({ feed, frame, at }): Evidence => ({\n feed,\n frame,\n value: { _tag: \"Painted\", frame, at },\n })),\n ),\n Stream.fromEffectRepeat(probe).pipe(\n Stream.filter(Option.isSome),\n Stream.map(({ value }) => value),\n ),\n ).pipe(\n // A probe can overtake queued paint while its reader is paused. It establishes nothing\n // about that reader's output until the matching frame has reached it.\n Stream.filter(({ feed, frame, value }) => {\n if (value._tag === \"Painted\" && gone !== feed) {\n seen = { feed, frame };\n\n return true;\n }\n // The subscription may have begun after its first publication.\n seen ??= { feed, frame };\n\n return value._tag !== \"Painted\" && seen?.feed === feed && seen.frame === frame;\n }),\n Stream.map(({ feed, value }) => {\n if (value._tag === \"Gone\") gone = feed;\n // A frame captured before a silence probe can arrive after the probe's evidence.\n shownAt = Math.max(shownAt, value.at);\n\n return value.at === shownAt ? value : { ...value, at: shownAt };\n }),\n );\n }),\n );\n\nconst openFeed = (\n page: Page,\n owner: Scope.Scope,\n clock: Clock.Clock,\n settings: ScreencastOptions,\n current: () => Feed | undefined,\n publish: (feed: Feed, frame: Frame) => Effect.Effect<unknown>,\n) =>\n Effect.gen(function* () {\n const scope = yield* Scope.fork(owner);\n const started = yield* Deferred.make<void>();\n\n const feed: Feed = {\n page,\n scope,\n changed: yield* PubSub.sliding<Frame>({ capacity: 1, replay: 1 }),\n state: { _tag: \"Warming\" },\n fiber: undefined,\n };\n\n yield* Scope.addFinalizer(\n scope,\n Effect.sync(() => {\n update(feed, { _tag: \"Stop\" });\n }),\n );\n yield* Effect.addFinalizer(() => (current() === feed ? Effect.void : stop(feed)));\n\n const accept = (frame: Frame) =>\n Effect.suspend(() => {\n update(feed, { _tag: \"Paint\", frame });\n\n return (current() === feed ? publish(feed, frame) : Effect.void).pipe(\n Effect.andThen(PubSub.publish(feed.changed, frame)),\n );\n });\n\n const capture = Effect.scoped(\n Effect.gen(function* () {\n update(feed, { _tag: \"Reset\" });\n\n const internals = internalsOf(page);\n\n const { stream, current: frame } = yield* (\n internals?.capture(settings) ??\n Effect.succeed({ stream: page.screencast(settings), current: undefined })\n );\n\n if (frame !== undefined && internals?.current(frame)) yield* accept(frame);\n yield* Deferred.succeed(started, undefined);\n yield* Stream.runForEach(stream, accept);\n }),\n ).pipe(\n Effect.ensuring(Effect.sync(() => update(feed, { _tag: \"Reset\" }))),\n Effect.retry({\n while: (error) => feed.state._tag === \"Ready\" && restartable(error),\n schedule: Schedule.spaced(\"500 millis\"),\n }),\n );\n\n feed.fiber = yield* capture.pipe(\n Effect.provideService(Clock.Clock, clock),\n Effect.forkIn(scope),\n );\n yield* Effect.raceFirst(Deferred.await(started), ended(feed)).pipe(\n Effect.onError(() => stop(feed)),\n );\n\n return feed;\n });\n\nexport const make = Effect.fn(\"Stage.make\")(function* (\n options: Options = {},\n): Effect.fn.Return<Stage, BrowserError, Scope.Scope> {\n const clock = yield* Clock.Clock;\n const owner = yield* Effect.scope;\n const now = () => monotonicMillis(clock);\n const waited = Duration.fromInput(options.firstFrame ?? Duration.seconds(5));\n\n if (\n Option.isNone(waited) ||\n !Duration.isFinite(waited.value) ||\n !Duration.isPositive(waited.value)\n )\n return yield* failWith(\n \"stage\",\n new InvalidRequest({ detail: \"firstFrame must be a finite positive duration\" }),\n );\n const firstFrame = waited.value;\n const settings = { quality: options.quality, size: options.size };\n const output = yield* PubSub.sliding<Paint>(16);\n const switching = ordered();\n\n let showing:\n | { readonly feed: Feed; readonly presented: Presented; frame: Frame; changedAt: number }\n | undefined;\n\n let painted = Number.NEGATIVE_INFINITY;\n\n yield* Effect.addFinalizer(() => PubSub.shutdown(output));\n\n const publish = (feed: Feed, frame: Frame, at = frame.hostTime) =>\n Effect.suspend(() => {\n painted = Math.max(painted, at);\n if (showing !== undefined) {\n showing.changedAt = now();\n showing.frame = frame;\n }\n\n return PubSub.publish(output, { feed, frame, at: painted });\n });\n\n const commit = (feed: Feed, options: { readonly at?: number | undefined } = {}) =>\n Effect.suspend(() => {\n const asked = options.at ?? now();\n\n return switching(\n Effect.gen(function* () {\n if (!Number.isFinite(asked))\n return yield* failWith(\n \"cue\",\n new InvalidRequest({ detail: \"at must be finite host milliseconds\" }),\n );\n yield* firstOf(feed, firstFrame);\n const old = showing;\n\n if (old?.feed === feed) return old.presented;\n\n yield* Effect.raceFirst(until(asked, now), ended(feed));\n\n const switchTo = Effect.suspend(() => {\n const frame = frameOf(feed);\n\n if (frame === undefined) return Effect.fail(unavailable());\n const at = Math.max(now(), asked, frame.hostTime, painted);\n\n showing = {\n feed,\n frame,\n presented: new Presented({ page: feed.page.id, at, latency: at - asked }),\n changedAt: at,\n };\n\n return publish(feed, frame, at).pipe(Effect.as(showing.presented));\n }).pipe(Effect.uninterruptible);\n\n const readyToSwitch = firstOf(feed, firstFrame).pipe(\n Effect.andThen(switchTo),\n Effect.provideService(Clock.Clock, clock),\n );\n\n const before = old === undefined ? undefined : internalsOf(old.feed.page);\n\n return yield* (\n before === undefined ? readyToSwitch : before.afterInput(readyToSwitch)\n ).pipe(\n // The cut owns old-page input through publication. Capture cleanup has its own bound\n // and must finish even if the caller leaves, without turning a completed cut into Timeout.\n Effect.ensuring(\n Effect.suspend(() =>\n showing?.feed === feed && old !== undefined ? stop(old.feed) : Effect.void,\n ),\n ),\n );\n }).pipe(Effect.provideService(Clock.Clock, clock)),\n );\n });\n\n const cue: Stage[\"cue\"] = (page) =>\n Effect.map(\n openFeed(page, owner, clock, settings, () => showing?.feed, publish),\n (feed) => ({\n page,\n ready: firstOf(feed, firstFrame).pipe(Effect.provideService(Clock.Clock, clock)),\n commit: (options) => commit(feed, options),\n }),\n );\n\n return {\n cue,\n present: (page, options) =>\n Effect.suspend(() => {\n const asked = options?.at ?? now();\n\n return showing?.feed.page === page\n ? Effect.as(firstOf(showing.feed, firstFrame), showing.presented)\n : Effect.scoped(Effect.flatMap(cue(page), (prepared) => prepared.commit({ at: asked })));\n }),\n shown: ({ hold }) =>\n evidence(output, () => showing, now, hold).pipe(Stream.provideService(Clock.Clock, clock)),\n frames: Stream.fromPubSub(output).pipe(Stream.map(({ frame }) => frame)),\n current: Effect.sync(() => Option.fromNullishOr(showing?.feed.page)),\n stats: (options = {}) =>\n showing === undefined\n ? Effect.succeedNone\n : Effect.asSome(showing.feed.page.captureStats({ window: options.window ?? \"1 second\" })),\n } satisfies Stage;\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Stage.mjs","names":[],"sources":["../src/Stage.ts"],"sourcesContent":["/**\n * An output's capture ownership. Cue a page while preparing an event; commit when that event\n * happens. A prepared cue belongs to its caller's scope, and a committed one to the stage.\n * Commits serialize, drain old-page input and refuse stale first frames. `shown` distinguishes\n * confirmed silence, uncertain silence and loss without treating capture silence as evidence.\n * @since 0.3.0\n */\nimport {\n Cause,\n Clock,\n Deferred,\n Duration,\n Effect,\n Exit,\n Fiber,\n Option,\n PubSub,\n Result,\n Schedule,\n Schema,\n Scope,\n Stream,\n} from \"effect\";\n\nimport { type BrowserError, Closed, consequence, InvalidRequest, Timeout } from \"./BrowserError.ts\";\nimport type { CaptureStats, Frame, ScreencastOptions } from \"./Frame.ts\";\nimport { failWith, refuse, undispatched } from \"./internal/page/context.ts\";\nimport { internalsOf } from \"./internal/page/page.ts\";\nimport { monotonicMillis } from \"./internal/pictures/clock.ts\";\nimport type { Page } from \"./Page.ts\";\n\nexport interface Options extends ScreencastOptions {\n /** Bound for each first-frame wait. Defaults to 5 seconds. */\n readonly firstFrame?: Duration.Input | undefined;\n}\n\n/** A switch that took effect, on the clock shared by browser events and frames. */\nexport class Presented extends Schema.Class<Presented>(\"effect-browser/Presented\")({\n page: Schema.String,\n at: Schema.Finite,\n latency: Schema.Finite,\n}) {}\n\nexport interface Cue {\n readonly page: Page;\n /** A frame of the current document, or the capture's failure or first-frame timeout. */\n readonly ready: Effect.Effect<void, BrowserError>;\n /** Commit on the event's host time, or now. Interruption before switching leaves the cue usable. */\n readonly commit: (options?: {\n readonly at?: number | undefined;\n }) => Effect.Effect<Presented, BrowserError>;\n}\n\n/** What the output establishes at nondecreasing host times; frames retain their capture times. */\nexport type Shown =\n | { readonly _tag: \"Painted\"; readonly frame: Frame; readonly at: number }\n | { readonly _tag: \"Still\"; readonly frame: Frame; readonly at: number }\n | { readonly _tag: \"Stalled\"; readonly frame: Frame; readonly at: number }\n | { readonly _tag: \"Gone\"; readonly page: string; readonly at: number };\n\nexport interface Stage {\n readonly present: (\n page: Page,\n options?: { readonly at?: number | undefined },\n ) => Effect.Effect<Presented, BrowserError>;\n readonly cue: (page: Page) => Effect.Effect<Cue, BrowserError, Scope.Scope>;\n /** Paint and, after every finite positive hold without paint, current evidence or loss. */\n readonly shown: (options: { readonly hold: Duration.Input }) => Stream.Stream<Shown>;\n /** Capture-timed current-page paint; use `shown` for output time. Readers retain 16 frames. */\n readonly frames: Stream.Stream<Frame>;\n readonly current: Effect.Effect<Option.Option<Page>>;\n readonly stats: (options?: {\n readonly window?: Duration.Input | undefined;\n }) => Effect.Effect<Option.Option<CaptureStats>, BrowserError>;\n}\n\ntype FeedState =\n | { readonly _tag: \"Warming\" }\n | { readonly _tag: \"Ready\"; readonly latest: Frame | undefined }\n | { readonly _tag: \"Stopped\" };\ninterface Feed {\n readonly page: Page;\n readonly scope: Scope.Closeable;\n readonly changed: PubSub.PubSub<Frame>;\n state: FeedState;\n fiber: Fiber.Fiber<void, BrowserError> | undefined;\n}\ninterface Paint {\n readonly feed: Feed;\n readonly frame: Frame;\n readonly at: number;\n}\n\ninterface Evidence {\n readonly feed: Feed;\n readonly frame: Frame;\n readonly value: Shown;\n}\n\nconst unavailable = () =>\n undispatched(\"cue\", new InvalidRequest({ detail: \"the cue's capture is no longer available\" }));\n\n/** The sole writer of a cue's capture lifecycle; presentation ownership belongs to the stage. */\nconst update = (\n feed: Feed,\n input: { readonly _tag: \"Paint\"; readonly frame: Frame } | { readonly _tag: \"Reset\" | \"Stop\" },\n) => {\n if (feed.state._tag === \"Stopped\") return;\n if (input._tag === \"Stop\") feed.state = { _tag: \"Stopped\" };\n else if (input._tag === \"Paint\") feed.state = { _tag: \"Ready\", latest: input.frame };\n else if (feed.state._tag === \"Ready\") feed.state = { _tag: \"Ready\", latest: undefined };\n};\n\nconst restartable = (error: BrowserError) => {\n const { lost, repeat } = consequence(error);\n\n return lost === \"nothing\" && repeat !== \"pointless\";\n};\n\nconst stop = (feed: Feed) =>\n Effect.suspend(() => {\n update(feed, { _tag: \"Stop\" });\n\n return Scope.close(feed.scope, Exit.void);\n });\n\nconst frameOf = (feed: Feed) => {\n const frame = feed.state._tag === \"Ready\" ? feed.state.latest : undefined;\n const internals = internalsOf(feed.page);\n\n return frame !== undefined && (internals === undefined || internals.current(frame))\n ? frame\n : undefined;\n};\n\nconst ended = (feed: Feed): Effect.Effect<never, BrowserError> =>\n feed.fiber === undefined\n ? Effect.never\n : Fiber.await(feed.fiber).pipe(\n Effect.flatMap((exit) =>\n Exit.isFailure(exit) && !Cause.hasInterruptsOnly(exit.cause)\n ? Effect.failCause(exit.cause)\n : Effect.fail(unavailable()),\n ),\n );\n\nconst firstOf = (feed: Feed, wait: Duration.Duration) =>\n Effect.suspend(() => {\n if (feed.state._tag === \"Stopped\") return Effect.fail(unavailable());\n if (feed.page.playwright.isClosed()) return failWith(\"cue\", new Closed({ cause: \"page\" }));\n if (frameOf(feed) !== undefined) return Effect.void;\n\n return Effect.raceFirst(\n Stream.fromPubSub(feed.changed).pipe(\n Stream.filter(() => frameOf(feed) !== undefined),\n Stream.runHead,\n Effect.asVoid,\n ),\n ended(feed),\n ).pipe(\n Effect.timeoutOrElse({\n duration: wait,\n orElse: () => failWith(\"cue\", new Timeout({ millis: Duration.toMillis(wait) })),\n }),\n );\n });\n\n// A timer can wake a fraction early; a commit never precedes its event.\nconst until = (at: number, now: () => number): Effect.Effect<void> =>\n Effect.suspend(() =>\n at > now()\n ? Effect.sleep(Duration.millis(Math.ceil(at - now()))).pipe(Effect.andThen(until(at, now)))\n : Effect.void,\n );\n\n/** Reserve the next turn before waking it; a fresh caller cannot overtake a queued commit. */\nconst ordered = () => {\n const waiting: Array<Deferred.Deferred<void>> = [];\n\n return <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n Effect.acquireUseRelease(\n Effect.sync(() => {\n const turn = Deferred.makeUnsafe<void>();\n\n waiting.push(turn);\n if (waiting.length === 1) Deferred.doneUnsafe(turn, Exit.void);\n\n return turn;\n }),\n (turn) => Deferred.await(turn).pipe(Effect.andThen(effect)),\n (turn) =>\n Effect.sync(() => {\n const at = waiting.indexOf(turn);\n\n waiting.splice(at, 1);\n if (at === 0 && waiting[0] !== undefined) Deferred.doneUnsafe(waiting[0], Exit.void);\n }),\n );\n};\n\n/** A terminal capture can know the connection is gone before the page receives its close event. */\nconst confirm = (feed: Feed, frame: Frame) => {\n const exit = feed.fiber?.pollUnsafe();\n\n const failure =\n exit !== undefined && Exit.isFailure(exit) ? Cause.findErrorOption(exit.cause) : Option.none();\n\n if (Option.isSome(failure) && consequence(failure.value).lost !== \"nothing\")\n return Effect.fail(failure.value);\n\n return feed.page.playwright.isClosed()\n ? failWith(\"shown\", new Closed({ cause: \"page\" }))\n : (internalsOf(feed.page)?.confirm(frame) ?? Effect.succeed(false));\n};\n\n/** Each subscriber confirms silence; a new frame or commit invalidates a probe. */\nconst evidence = (\n output: PubSub.PubSub<Paint>,\n current: () =>\n | { readonly feed: Feed; readonly frame: Frame; readonly changedAt: number }\n | undefined,\n now: () => number,\n hold: Duration.Input,\n): Stream.Stream<Shown> =>\n Stream.unwrap(\n Effect.sync(() => {\n const parsed = Duration.fromInput(hold);\n\n if (\n Option.isNone(parsed) ||\n !Duration.isFinite(parsed.value) ||\n !Duration.isPositive(parsed.value)\n )\n throw new RangeError(\"shown hold must be a finite positive duration\");\n const millis = Duration.toMillis(parsed.value);\n let checkedAt = now();\n let shownAt = Number.NEGATIVE_INFINITY;\n let seen: Pick<Paint, \"feed\" | \"frame\"> | undefined = current();\n let gone: Feed | undefined;\n\n const probe = Effect.gen(function* () {\n yield* until(Math.max(checkedAt, current()?.changedAt ?? checkedAt) + millis, now);\n const before = current();\n const frame = before?.frame;\n\n // Paint during the wait moves the deadline; an early wake is not a silence check.\n if (before !== undefined && now() - before.changedAt < millis)\n return Option.none<Evidence>();\n checkedAt = now();\n if (before === undefined || frame === undefined || gone === before.feed)\n return Option.none<Evidence>();\n const { feed } = before;\n\n const confirmed = yield* Effect.result(confirm(feed, frame));\n\n if (current()?.feed !== feed || current()?.frame !== frame) return Option.none<Evidence>();\n const at = now();\n\n checkedAt = at;\n if (Result.isFailure(confirmed) && consequence(confirmed.failure).lost !== \"nothing\") {\n return Option.some<Evidence>({\n feed,\n frame,\n value: { _tag: \"Gone\", page: feed.page.id, at },\n });\n }\n\n return Option.some<Evidence>({\n feed,\n frame,\n value: {\n _tag: Result.isSuccess(confirmed) && confirmed.success ? \"Still\" : \"Stalled\",\n frame,\n at,\n },\n });\n });\n\n return Stream.merge(\n Stream.fromPubSub(output).pipe(\n Stream.map(({ feed, frame, at }): Evidence => ({\n feed,\n frame,\n value: { _tag: \"Painted\", frame, at },\n })),\n ),\n Stream.fromEffectRepeat(probe).pipe(\n Stream.filter(Option.isSome),\n Stream.map(({ value }) => value),\n ),\n ).pipe(\n // A probe can overtake queued paint while its reader is paused. It establishes nothing\n // about that reader's output until the matching frame has reached it.\n Stream.filter(({ feed, frame, value }) => {\n if (value._tag === \"Painted\" && gone !== feed) {\n seen = { feed, frame };\n\n return true;\n }\n // The subscription may have begun after its first publication.\n seen ??= { feed, frame };\n\n return value._tag !== \"Painted\" && seen?.feed === feed && seen.frame === frame;\n }),\n Stream.map(({ feed, value }) => {\n if (value._tag === \"Gone\") gone = feed;\n // A frame captured before a silence probe can arrive after the probe's evidence.\n shownAt = Math.max(shownAt, value.at);\n\n return value.at === shownAt ? value : { ...value, at: shownAt };\n }),\n );\n }),\n );\n\nconst openFeed = (\n page: Page,\n owner: Scope.Scope,\n clock: Clock.Clock,\n settings: ScreencastOptions,\n current: () => Feed | undefined,\n publish: (feed: Feed, frame: Frame) => Effect.Effect<unknown>,\n) =>\n Effect.gen(function* () {\n const scope = yield* Scope.fork(owner);\n const started = yield* Deferred.make<void>();\n\n const feed: Feed = {\n page,\n scope,\n changed: yield* PubSub.sliding<Frame>({ capacity: 1, replay: 1 }),\n state: { _tag: \"Warming\" },\n fiber: undefined,\n };\n\n yield* Scope.addFinalizer(\n scope,\n Effect.sync(() => {\n update(feed, { _tag: \"Stop\" });\n }),\n );\n yield* Effect.addFinalizer(() => (current() === feed ? Effect.void : stop(feed)));\n\n const accept = (frame: Frame) =>\n Effect.suspend(() => {\n update(feed, { _tag: \"Paint\", frame });\n\n return (current() === feed ? publish(feed, frame) : Effect.void).pipe(\n Effect.andThen(PubSub.publish(feed.changed, frame)),\n );\n });\n\n const capture = Effect.scoped(\n Effect.gen(function* () {\n update(feed, { _tag: \"Reset\" });\n\n const internals = internalsOf(page);\n\n const { stream, current: frame } = yield* (\n internals?.capture(settings) ??\n Effect.succeed({ stream: page.screencast(settings), current: undefined })\n );\n\n if (frame !== undefined && internals?.current(frame)) yield* accept(frame);\n yield* Deferred.succeed(started, undefined);\n yield* Stream.runForEach(stream, accept);\n }),\n ).pipe(\n Effect.ensuring(Effect.sync(() => update(feed, { _tag: \"Reset\" }))),\n Effect.retry({\n while: (error) => feed.state._tag === \"Ready\" && restartable(error),\n schedule: Schedule.spaced(\"500 millis\"),\n }),\n );\n\n feed.fiber = yield* capture.pipe(\n Effect.provideService(Clock.Clock, clock),\n Effect.forkIn(scope),\n );\n yield* Effect.raceFirst(Deferred.await(started), ended(feed)).pipe(\n Effect.onError(() => stop(feed)),\n );\n\n return feed;\n });\n\nexport const make = Effect.fn(\"Stage.make\")(function* (\n options: Options = {},\n): Effect.fn.Return<Stage, BrowserError, Scope.Scope> {\n const clock = yield* Clock.Clock;\n const owner = yield* Effect.scope;\n const now = () => monotonicMillis(clock);\n const waited = Duration.fromInput(options.firstFrame ?? Duration.seconds(5));\n\n if (\n Option.isNone(waited) ||\n !Duration.isFinite(waited.value) ||\n !Duration.isPositive(waited.value)\n )\n return yield* refuse(\"stage\", \"firstFrame must be a finite positive duration\");\n const firstFrame = waited.value;\n const settings = { quality: options.quality, size: options.size };\n const output = yield* PubSub.sliding<Paint>(16);\n const switching = ordered();\n\n let showing:\n | { readonly feed: Feed; readonly presented: Presented; frame: Frame; changedAt: number }\n | undefined;\n\n let painted = Number.NEGATIVE_INFINITY;\n\n yield* Effect.addFinalizer(() => PubSub.shutdown(output));\n\n const publish = (feed: Feed, frame: Frame, at = frame.hostTime) =>\n Effect.suspend(() => {\n painted = Math.max(painted, at);\n if (showing !== undefined) {\n showing.changedAt = now();\n showing.frame = frame;\n }\n\n return PubSub.publish(output, { feed, frame, at: painted });\n });\n\n const commit = (feed: Feed, options: { readonly at?: number | undefined } = {}) =>\n Effect.suspend(() => {\n const asked = options.at ?? now();\n\n return switching(\n Effect.gen(function* () {\n if (!Number.isFinite(asked))\n return yield* refuse(\"cue\", \"at must be finite host milliseconds\");\n yield* firstOf(feed, firstFrame);\n const old = showing;\n\n if (old?.feed === feed) return old.presented;\n\n yield* Effect.raceFirst(until(asked, now), ended(feed));\n\n const switchTo = Effect.suspend(() => {\n const frame = frameOf(feed);\n\n if (frame === undefined) return Effect.fail(unavailable());\n const at = Math.max(now(), asked, frame.hostTime, painted);\n\n showing = {\n feed,\n frame,\n presented: new Presented({ page: feed.page.id, at, latency: at - asked }),\n changedAt: at,\n };\n\n return publish(feed, frame, at).pipe(Effect.as(showing.presented));\n }).pipe(Effect.uninterruptible);\n\n const readyToSwitch = firstOf(feed, firstFrame).pipe(\n Effect.andThen(switchTo),\n Effect.provideService(Clock.Clock, clock),\n );\n\n const before = old === undefined ? undefined : internalsOf(old.feed.page);\n\n return yield* (\n before === undefined ? readyToSwitch : before.afterInput(readyToSwitch)\n ).pipe(\n // The cut owns old-page input through publication. Capture cleanup has its own bound\n // and must finish even if the caller leaves, without turning a completed cut into Timeout.\n Effect.ensuring(\n Effect.suspend(() =>\n showing?.feed === feed && old !== undefined ? stop(old.feed) : Effect.void,\n ),\n ),\n );\n }).pipe(Effect.provideService(Clock.Clock, clock)),\n );\n });\n\n const cue: Stage[\"cue\"] = (page) =>\n Effect.map(\n openFeed(page, owner, clock, settings, () => showing?.feed, publish),\n (feed) => ({\n page,\n ready: firstOf(feed, firstFrame).pipe(Effect.provideService(Clock.Clock, clock)),\n commit: (options) => commit(feed, options),\n }),\n );\n\n return {\n cue,\n present: (page, options) =>\n Effect.suspend(() => {\n const asked = options?.at ?? now();\n\n return showing?.feed.page === page\n ? Effect.as(firstOf(showing.feed, firstFrame), showing.presented)\n : Effect.scoped(Effect.flatMap(cue(page), (prepared) => prepared.commit({ at: asked })));\n }),\n shown: ({ hold }) =>\n evidence(output, () => showing, now, hold).pipe(Stream.provideService(Clock.Clock, clock)),\n frames: Stream.fromPubSub(output).pipe(Stream.map(({ frame }) => frame)),\n current: Effect.sync(() => Option.fromNullishOr(showing?.feed.page)),\n stats: (options = {}) =>\n showing === undefined\n ? Effect.succeedNone\n : Effect.asSome(showing.feed.page.captureStats({ window: options.window ?? \"1 second\" })),\n } satisfies Stage;\n});\n"],"mappings":"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"}
@@ -656,13 +656,14 @@ const makeScoped = Effect.fn("Supervisor.make")(function* (options) {
656
656
  if (yield* Deferred.isDone(releases.deferred)) yield* FiberMap.join(releases);
657
657
  }, Effect.ensuring(end));
658
658
  const retire = yield* Effect.cached(stop({ _tag: "Retire" }));
659
+ const browserOf = (target) => Effect.map(waitFor(state, waitTimeout, clock, target), (live) => live.value.opened.browser);
659
660
  yield* Effect.addFinalizer(() => options.keep === true ? stop({ _tag: "Keep" }) : retire);
660
661
  yield* perform(started);
661
662
  return {
662
- browser: Effect.map(waitFor(state, waitTimeout, clock), (live) => live.value.opened.browser),
663
+ browser: browserOf(),
663
664
  use: leasing(state, apply, waitTimeout, now, clock),
664
665
  states: Stream.fromPubSubTake(events),
665
- rotate: apply({ _tag: "Rotate" }).pipe(Effect.flatMap(({ reply }) => reply === void 0 ? Effect.fail(retired()) : Effect.map(waitFor(state, waitTimeout, clock, reply), (live) => live.value.opened.browser))),
666
+ rotate: apply({ _tag: "Rotate" }).pipe(Effect.flatMap(({ reply }) => reply === void 0 ? Effect.fail(retired()) : browserOf(reply))),
666
667
  retire
667
668
  };
668
669
  });
@@ -672,4 +673,4 @@ function make(options) {
672
673
  //#endregion
673
674
  export { Settled as _, Unavailable as a, Down as c, Kept as d, Lost as f, Reopening as g, Released as h, Supervisor_exports as i, Draining as l, Opening as m, Releasing as n, make as o, Open as p, Superseded as r, Closed as s, Generation as t, GenerationState as u, Unconfirmed as v };
674
675
 
675
- //# sourceMappingURL=Supervisor-BgWP8o9t.mjs.map
676
+ //# sourceMappingURL=Supervisor-2mPjIYYs.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Supervisor-BgWP8o9t.mjs","names":["Lifecycle.GenerationState","Lifecycle.resolve","Lifecycle.lookup","Lifecycle.Settled","Lifecycle.Unconfirmed","Lifecycle.combine","Lifecycle.start","Lifecycle.transition"],"sources":["../src/internal/supervisor/lifecycle.ts","../src/Supervisor.ts"],"sourcesContent":["/**\n * A supervisor's life as one state and one transition function, and the generation states it\n * publishes. The transition has no effects: `Supervisor.make` applies each input under one lock,\n * publishes the events in order and runs the commands, so the rules here are tested alone.\n */\nimport { Schema } from \"effect\";\n\nimport { DisconnectCause } from \"../../BrowserEvent.ts\";\n\n/** The provider confirmed that the generation's browser ended. */\nexport class Settled extends Schema.TaggedClass<Settled>()(\"Settled\", {}) {}\n\n/** The provider could not confirm the end by its deadline, so the browser may still run, and bill. */\nexport class Unconfirmed extends Schema.TaggedClass<Unconfirmed>()(\"Unconfirmed\", {\n detail: Schema.String,\n}) {}\n\nexport const Released = Schema.Union([Settled, Unconfirmed]);\n\nexport type Released = typeof Released.Type;\n\n/** Opening, but not after a loss: the first generation, a rotation, or the one after `Down`. */\nexport class Opening extends Schema.TaggedClass<Opening>()(\"Opening\", {}) {}\n\n/** Opening after the generation before it was lost. */\nexport class Reopening extends Schema.TaggedClass<Reopening>()(\"Reopening\", {}) {}\n\n/** Open: `browser` gives this generation until the next one opens. */\nexport class Open extends Schema.TaggedClass<Open>()(\"Open\", {}) {}\n\n/** No longer serving; holds end at this host-monotonic deadline or when their owners let go. */\nexport class Draining extends Schema.TaggedClass<Draining>()(\"Draining\", {\n reason: Schema.Literals([\"rotated\", \"lost\", \"retired\"]),\n revokeAt: Schema.Finite,\n}) {}\n\n/** Lost through disconnection or a consumer's declaration that it is unusable. */\nexport class Lost extends Schema.TaggedClass<Lost>()(\"Lost\", {\n cause: Schema.Union([DisconnectCause, Schema.Literal(\"declared\")]),\n detail: Schema.optional(Schema.String),\n}) {}\n\n/**\n * It never opened: its last try failed with `cause`, which the provider deems definite, or after\n * which the reopen schedule gave up. `released` combines this generation's failed-try cleanup,\n * retaining the first unconfirmed end; it is absent when no try reported cleanup.\n */\nexport class Down extends Schema.TaggedClass<Down>()(\"Down\", {\n detail: Schema.String,\n cause: Schema.Defect(),\n released: Schema.optional(Released),\n}) {}\n\n/** It ended. `released` includes reported cleanup when retired while opening, if any. */\nexport class Closed extends Schema.TaggedClass<Closed>()(\"Closed\", {\n released: Schema.optional(Released),\n}) {}\n\n/**\n * It was serving as the supervisor's scope closed, and was left running, not released: its scope\n * closed, and its provider runs it on, and bills, until something adopts and releases it.\n */\nexport class Kept extends Schema.TaggedClass<Kept>()(\"Kept\", {}) {}\n\nexport const GenerationState = Schema.Union([\n Opening,\n Reopening,\n Open,\n Draining,\n Lost,\n Down,\n Closed,\n Kept,\n]);\n\nexport type GenerationState = typeof GenerationState.Type;\n\n/** A generation that opened: its number, and what the runtime keeps to serve and end it. */\nexport interface Live<A> {\n readonly number: number;\n readonly value: A;\n}\n\nexport interface Held<A, H> extends Live<A> {\n readonly holds: ReadonlySet<H>;\n}\n\n/** Release ownership remains here until the provider and generation scope have finished. */\nexport interface Drain<A, H> {\n readonly _tag: \"Draining\" | \"Releasing\" | \"Leaving\";\n readonly live: Held<A, H>;\n readonly ending: Draining;\n}\n\n/** One serving generation, one shared acquisition, and prior generations still owned. */\nexport type State<A, H = unknown> = (\n | { readonly _tag: \"Opening\"; readonly number: number; readonly serving: Held<A, H> | undefined }\n | { readonly _tag: \"Open\"; readonly serving: Held<A, H> }\n | {\n readonly _tag: \"Down\";\n readonly number: number;\n readonly detail: string;\n readonly cause: unknown;\n readonly serving: Held<A, H> | undefined;\n }\n | { readonly _tag: \"Retired\" }\n) & {\n readonly draining: ReadonlyMap<number, Drain<A, H>>;\n /** Retain the first unconfirmed end, otherwise the latest settled end, without its resources. */\n readonly released?: Released | undefined;\n /** Failed-try outcomes by their opening generation, forgotten when that opening ends. */\n readonly attempts?: ReadonlyMap<number, Released> | undefined;\n};\n\nexport type Input<A, H = unknown> =\n | { readonly _tag: \"Opened\"; readonly live: Live<A> }\n | { readonly _tag: \"AttemptReleased\"; readonly number: number; readonly released: Released }\n | {\n readonly _tag: \"Failed\";\n readonly number: number;\n readonly detail: string;\n readonly cause: unknown;\n }\n | { readonly _tag: \"Abandoned\"; readonly number: number }\n | {\n readonly _tag: \"Lost\";\n readonly number: number;\n readonly cause: Lost[\"cause\"];\n readonly detail?: string | undefined;\n }\n | { readonly _tag: \"Rotate\"; readonly due?: number | undefined }\n | { readonly _tag: \"Retire\" }\n | { readonly _tag: \"Keep\" }\n | {\n readonly _tag: \"Hold\";\n readonly number?: number | undefined;\n readonly hold: H;\n }\n | { readonly _tag: \"Let\"; readonly number: number; readonly hold: H }\n | { readonly _tag: \"Revoke\"; readonly number: number }\n | {\n readonly _tag: \"Released\";\n readonly number: number;\n readonly released?: Released | undefined;\n };\n\nexport type Command<A> =\n | { readonly _tag: \"Open\"; readonly number: number }\n | { readonly _tag: \"Watch\"; readonly live: Live<A> }\n /** Signal ending and arrange revocation. Repeated only when loss/retirement accelerates it. */\n | { readonly _tag: \"Drain\"; readonly live: Live<A>; readonly ending: Draining }\n /** Revoke/close holds, await their Let inputs, release the provider, then close its scope. */\n | { readonly _tag: \"Release\"; readonly live: Live<A>; readonly ending: Draining }\n | { readonly _tag: \"Leave\"; readonly live: Live<A>; readonly ending: Draining };\n\nexport interface Step<A, H = unknown> {\n readonly state: State<A, H>;\n readonly events: ReadonlyArray<readonly [number, GenerationState]>;\n readonly commands: ReadonlyArray<Command<A>>;\n readonly reply?: number | undefined;\n readonly borrowed?: Live<A> | undefined;\n}\n\nexport const start = <A, H = unknown>(): Step<A, H> => ({\n state: { _tag: \"Opening\", number: 1, serving: undefined, draining: new Map() },\n events: [[1, new Opening()]],\n commands: [{ _tag: \"Open\", number: 1 }],\n});\n\nconst servingOf = <A, H>(state: State<A, H>) =>\n state._tag === \"Retired\" ? undefined : state.serving;\n\n/** The holds still owned for a generation, including one whose release has begun. */\nexport const lookup = <A, H>(state: State<A, H>, number: number): Held<A, H> | undefined =>\n servingOf(state)?.number === number ? servingOf(state) : state.draining.get(number)?.live;\n\n/** A transition's local result builder; input state and its collections remain immutable. */\ninterface Change<A, H> {\n readonly now: number;\n readonly handover: number;\n readonly exclusive: boolean;\n state: State<A, H>;\n events: Array<readonly [number, GenerationState]>;\n commands: Array<Command<A>>;\n reply?: number;\n borrowed?: Live<A>;\n}\n\n/** The sole writer of a drain's ending and phase; each release command is emitted once. */\nconst draining = <A, H>(change: Change<A, H>, drain: Drain<A, H>) => {\n const before = change.state.draining.get(drain.live.number);\n const { live, ending, _tag } = drain;\n\n change.state = {\n ...change.state,\n draining: new Map(change.state.draining).set(live.number, drain),\n };\n if (before?.ending !== ending) {\n change.events.push([live.number, ending]);\n change.commands.push({ _tag: \"Drain\", live, ending });\n }\n if (_tag !== \"Draining\" && before?._tag !== _tag)\n change.commands.push({ _tag: _tag === \"Leaving\" ? \"Leave\" : \"Release\", live, ending });\n};\n\nconst end = <A, H>(\n change: Change<A, H>,\n live: Held<A, H>,\n reason: Draining[\"reason\"],\n keep = false,\n) => {\n const ending = new Draining({\n reason,\n revokeAt: change.now + (reason === \"rotated\" ? change.handover : 0),\n });\n\n draining(change, {\n live,\n ending,\n _tag: keep\n ? \"Leaving\"\n : live.holds.size === 0 || ending.revokeAt <= change.now\n ? \"Releasing\"\n : \"Draining\",\n });\n};\n\nconst revoke = <A, H>(change: Change<A, H>, number: number, reason?: \"lost\" | \"retired\") => {\n const drain = change.state.draining.get(number);\n\n if (drain?._tag !== \"Draining\" || (reason === undefined && change.now < drain.ending.revokeAt))\n return;\n draining(change, {\n ...drain,\n _tag: \"Releasing\",\n ending: reason === undefined ? drain.ending : new Draining({ reason, revokeAt: change.now }),\n });\n};\n\nconst holds = <A, H>(\n change: Change<A, H>,\n input: Extract<Input<A, H>, { readonly _tag: \"Hold\" | \"Let\" }>,\n) => {\n const number = input.number ?? servingOf(change.state)?.number;\n const live = number === undefined ? undefined : lookup(change.state, number);\n\n if (live === undefined) return;\n const drain = change.state.draining.get(live.number);\n\n if (\n input._tag === \"Hold\" &&\n drain !== undefined &&\n (drain._tag !== \"Draining\" || change.now >= drain.ending.revokeAt)\n )\n return;\n if (live.holds.has(input.hold) === (input._tag === \"Hold\")) return;\n const holds = new Set(live.holds);\n\n if (input._tag === \"Hold\") {\n holds.add(input.hold);\n change.borrowed = live;\n } else holds.delete(input.hold);\n const held = { ...live, holds };\n\n if (drain !== undefined)\n draining(change, {\n ...drain,\n live: held,\n _tag: drain._tag === \"Draining\" && holds.size === 0 ? \"Releasing\" : drain._tag,\n });\n else if (change.state._tag !== \"Retired\") change.state = { ...change.state, serving: held };\n};\n\nconst next = <A, H>(change: Change<A, H>, number: number, reopen: boolean) => {\n const { exclusive } = change;\n const current = servingOf(change.state);\n\n if (current !== undefined && (reopen || exclusive))\n end(change, current, reopen ? \"lost\" : \"rotated\");\n change.state = {\n _tag: \"Opening\",\n number,\n serving: reopen || exclusive ? undefined : current,\n draining: change.state.draining,\n released: change.state.released,\n attempts: change.state.attempts,\n };\n change.events.push([number, reopen ? new Reopening() : new Opening()]);\n change.commands.push({ _tag: \"Open\", number });\n};\n\nconst lost = <A, H>(\n change: Change<A, H>,\n input: Extract<Input<A, H>, { readonly _tag: \"Lost\" }>,\n) => {\n const { state } = change;\n const drain = state.draining.get(input.number);\n const current = servingOf(state);\n\n if (input.cause === \"declared\" && current?.number !== input.number) return;\n if (drain?._tag === \"Draining\") {\n change.events.push([input.number, new Lost({ cause: input.cause })]);\n revoke(change, input.number, \"lost\");\n } else if (state._tag !== \"Retired\" && current?.number === input.number) {\n change.events.push([input.number, new Lost({ cause: input.cause, detail: input.detail })]);\n if (state._tag !== \"Opening\")\n next(change, (state._tag === \"Open\" ? current.number : state.number) + 1, true);\n else {\n change.state = { ...state, serving: undefined };\n end(change, current, \"lost\");\n }\n }\n};\n\n/** End one opening without confusing its cleanup with preceding generations' releases. */\nconst finishAttempt = <A, H>(change: Change<A, H>, number: number) => {\n const attempts = new Map(change.state.attempts);\n const released = attempts.get(number);\n\n attempts.delete(number);\n change.state = { ...change.state, attempts };\n\n return released;\n};\n\n/** Pure admission and lifecycle changes. A rejected hold preserves state identity. */\nexport const transition = <A, H = unknown>(\n state: State<A, H>,\n input: Input<A, H>,\n exclusive: boolean,\n now = 0,\n handover = 30_000,\n): Step<A, H> => {\n const change: Change<A, H> = {\n state,\n events: [],\n commands: [],\n exclusive,\n handover,\n now,\n };\n\n switch (input._tag) {\n case \"Hold\":\n case \"Let\":\n holds(change, input);\n break;\n case \"Revoke\":\n revoke(change, input.number);\n break;\n case \"Opened\": {\n const live = { ...input.live, holds: new Set<H>() };\n\n if (lookup(state, live.number) !== undefined) break;\n if (state._tag !== \"Opening\" || state.number !== live.number) end(change, live, \"retired\");\n else {\n finishAttempt(change, live.number);\n change.events.push([live.number, new Open()]);\n change.commands.push({ _tag: \"Watch\", live });\n if (state.serving !== undefined) end(change, state.serving, \"rotated\");\n change.state = {\n _tag: \"Open\",\n serving: live,\n draining: change.state.draining,\n released: change.state.released,\n attempts: change.state.attempts,\n };\n }\n break;\n }\n case \"Failed\": {\n const { number, detail, cause } = input;\n\n if (state._tag === \"Opening\" && state.number === number)\n change.state = { ...state, _tag: \"Down\", detail, cause };\n change.events.push([\n number,\n new Down({ detail, cause, released: finishAttempt(change, number) }),\n ]);\n break;\n }\n case \"Abandoned\":\n change.events.push([\n input.number,\n new Closed({ released: finishAttempt(change, input.number) }),\n ]);\n break;\n case \"AttemptReleased\":\n change.state = {\n ...state,\n released: combine(state.released, input.released),\n attempts: new Map(state.attempts).set(\n input.number,\n combine(state.attempts?.get(input.number), input.released),\n ),\n };\n break;\n case \"Released\": {\n const { number, released } = input;\n const drain = state.draining.get(number);\n\n if (drain === undefined || drain._tag === \"Draining\" || drain.live.holds.size > 0) break;\n const draining = new Map(state.draining);\n\n draining.delete(number);\n change.state = { ...state, draining, released: combine(state.released, released) };\n const outcome = combine(finishAttempt(change, number), released);\n\n change.events.push([\n number,\n released === undefined ? new Kept() : new Closed({ released: outcome }),\n ]);\n break;\n }\n case \"Lost\":\n lost(change, input);\n break;\n case \"Rotate\": {\n if (\n state._tag === \"Retired\" ||\n (input.due !== undefined && (state._tag !== \"Open\" || state.serving.number !== input.due))\n )\n break;\n change.reply =\n state._tag === \"Opening\"\n ? state.number\n : (state._tag === \"Open\" ? state.serving.number : state.number) + 1;\n if (state._tag !== \"Opening\") next(change, change.reply, false);\n break;\n }\n case \"Keep\":\n case \"Retire\":\n if (state._tag === \"Retired\") break;\n for (const number of state.draining.keys()) revoke(change, number, \"retired\");\n if (state.serving !== undefined) end(change, state.serving, \"retired\", input._tag === \"Keep\");\n change.state = {\n _tag: \"Retired\",\n draining: change.state.draining,\n released: change.state.released,\n attempts: change.state.attempts,\n };\n }\n\n return change;\n};\n\n/** Later confirmations cannot establish that an earlier unconfirmed session ended. */\nexport function combine(before: Released | undefined, next: Released): Released;\n\nexport function combine(\n before: Released | undefined,\n next: Released | undefined,\n): Released | undefined;\n\nexport function combine(before: Released | undefined, next: Released | undefined) {\n return before?._tag === \"Unconfirmed\" ? before : (next ?? before);\n}\n\nexport type Resolution<A> =\n | { readonly _tag: \"Serve\"; readonly live: Live<A> }\n | {\n readonly _tag: \"Unavailable\";\n readonly reason: \"down\" | \"retired\";\n readonly detail: string;\n readonly cause?: unknown;\n };\n\n/** An unheld browser resolution; use obtains its hold atomically through Hold instead. */\nexport const resolve = <A, H>(\n state: State<A, H>,\n target: number | undefined,\n): Resolution<A> | undefined => {\n if (state._tag === \"Retired\")\n return { _tag: \"Unavailable\", reason: \"retired\", detail: \"the supervisor was retired\" };\n if (\n state.serving !== undefined &&\n (target === undefined || (state._tag === \"Open\" && state.serving.number >= target))\n )\n return { _tag: \"Serve\", live: state.serving };\n if (state._tag === \"Down\" && (target === undefined || state.number >= target))\n return { _tag: \"Unavailable\", reason: \"down\", detail: state.detail, cause: state.cause };\n\n return undefined;\n};\n","/**\n * A browser kept open across losses and session ends, as a series of generations, each a new\n * browser from the same provider. Pages don't carry over from one generation to the next.\n *\n * `make` opens the first generation at once with the provider's `open`, in a scope of its own, so\n * a caller that stops waiting never interrupts a half-open browser. `browser` gives the current\n * generation; callers wait, bounded, and share one open. A loss is published at once and the next\n * generation opens on the `reopen` schedule, which also retries a failed open, unless the provider\n * deems its failure `definite`: that goes `Down` at once, with its cause. `rotate` opens the\n * next generation now, and so does the time `rotateBefore` ahead of a generation's `expiresAt`. A\n * rotation makes the next generation before it breaks the current one, unless generations are\n * `exclusive`, as sessions saving to one stored context must be: then the current one is released\n * first. `retire` stops reopening at once and releases what is open; the scope's close retires\n * too, unless the supervisor `keep`s: then it leaves the serving generation running, `Kept`. `states`\n * publishes each generation's changes, with the provider's release outcome last.\n *\n * Providers supply the specifics: `Browserbase.supervise` opens hosted sessions this way.\n *\n * @since 0.3.0\n */\nimport {\n Cause,\n Clock,\n Context,\n DateTime,\n Deferred,\n Duration,\n Effect,\n Exit,\n FiberHandle,\n FiberMap,\n Option,\n Predicate,\n PubSub,\n Schedule,\n Schema,\n Scope,\n Semaphore,\n Stream,\n SubscriptionRef,\n type Take,\n} from \"effect\";\n\nimport type * as Browser from \"./Browser.ts\";\nimport * as Lifecycle from \"./internal/supervisor/lifecycle.ts\";\n\nexport {\n Closed,\n Down,\n Draining,\n GenerationState,\n Kept,\n Lost,\n Open,\n Opening,\n Released,\n Reopening,\n Settled,\n Unconfirmed,\n} from \"./internal/supervisor/lifecycle.ts\";\n\n/** One change in a generation's life. `at` is wall-clock epoch milliseconds from the Effect `Clock`. */\nexport class Generation extends Schema.Class<Generation>(\"effect-browser/Generation\")({\n number: Schema.Int.check(Schema.isGreaterThan(0)),\n at: Schema.Finite,\n hostTime: Schema.Finite,\n state: Lifecycle.GenerationState,\n}) {}\n\n/**\n * No browser to give: none opened within `waitTimeout` (`opening`), the latest generation failed\n * to open (`down`, with what it failed with as `cause`), or the supervisor was retired.\n */\nexport class Unavailable extends Schema.TaggedError<Unavailable>()(\"Unavailable\", {\n reason: Schema.Literals([\"opening\", \"down\", \"retired\"]),\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect()),\n}) {\n override get message() {\n return `no browser: ${this.detail}`;\n }\n}\n\n/** One generation, as a provider opened it in the scope the supervisor gave it. */\nexport interface Opened<A = void> {\n readonly value: A;\n readonly browser: Browser.Service;\n /**\n * End the generation, and say whether the provider confirmed its end. The supervisor asks it\n * before it closes the generation's scope; without it, closing the scope ends the generation,\n * which counts as `Settled`.\n */\n readonly release?: Effect.Effect<Lifecycle.Released> | undefined;\n}\n\n/** Facts available before an acquisition attempt; awaiting `after` never changes release order. */\nexport interface Admission {\n readonly number: number;\n /**\n * Every earlier session that stopped serving, including failed attempts and older drains.\n * Waits for all pending releases; an Unconfirmed end remains visible to later attempts.\n * Undefined before any release. A still-serving nonexclusive predecessor is excluded.\n */\n readonly after: Effect.Effect<Lifecycle.Released> | undefined;\n}\n\n/**\n * Optional service supplied during `open`. Providers report failed-attempt cleanup here before\n * their scope closes; successful generations instead return `Opened.release`. Reporting does\n * not release resources or replace the original acquisition failure. Terminal `Down` and opening\n * `Closed` states publish the reported outcomes of their own generation's tries.\n */\nexport class Releasing extends Context.Service<\n Releasing,\n { readonly released: (outcome: Lifecycle.Released) => Effect.Effect<void> }\n>()(\"effect-browser/Supervisor/Releasing\") {}\n\nexport interface Options<E, R, A = void> {\n /** Opens one generation in the scope it is given. */\n readonly open: Effect.Effect<Opened<A>, E, R>;\n /** Runs before every open attempt, including the first; failures follow `reopen` and `definite`. */\n readonly admit?: ((opening: Admission) => Effect.Effect<void, E, R>) | undefined;\n /** When to try a failed open again. Defaults to exponential from 1 second, for 5 minutes. */\n readonly reopen?: Schedule.Schedule<unknown, E> | undefined;\n /**\n * Failures no new try mends, such as a refused key: an open that fails so is `Down` at once.\n * Defaults to none.\n */\n readonly definite?: ((error: E) => boolean) | undefined;\n /**\n * Rotate this long ahead of a generation's `expiresAt`, but no sooner than halfway through its\n * life. Without it, a generation's end is a loss.\n */\n readonly rotateBefore?: Duration.Input | undefined;\n /** Generations must not overlap: a rotation releases the current one before it opens the next. */\n readonly exclusive?: boolean | undefined;\n /** Finite, nonnegative time outgoing holds may finish; defaults to 30 seconds. */\n readonly handover?: Duration.Input | undefined;\n /**\n * Closing the scope leaves the serving generation running, `Kept`: it closes the generation's\n * scope but never asks `release`. For providers whose scope only disconnects, such as\n * `Browserbase.supervise` with `keep`. `retire` still releases it.\n */\n readonly keep?: boolean | undefined;\n /** How long `browser` and `rotate` wait for a generation to open. Defaults to 2 minutes. */\n readonly waitTimeout?: Duration.Input | undefined;\n}\n\n/** Work whose generation was revoked; input receipts still determine whether input reached a site. */\nexport class Superseded extends Schema.TaggedError<Superseded>()(\"Superseded\", {\n generation: Schema.Int,\n reason: Schema.Literals([\"rotated\", \"lost\", \"retired\"]),\n revokeAt: Schema.Finite,\n}) {}\n\nexport interface Lease<A> {\n readonly generation: number;\n readonly browser: Browser.Service;\n readonly value: A;\n /** Declare this serving generation unusable and revoke it now; stale declarations do nothing. */\n readonly lose: (detail: string) => Effect.Effect<void>;\n /** First notice that serving ended; loss or retirement may revoke before its deadline. */\n readonly ending: Effect.Effect<Superseded>;\n /** An independent scope; its resources close before provider release. Fails once revoked. */\n readonly retain: Effect.Effect<Scope.Closeable, Superseded>;\n}\n\nexport interface UseOptions {\n /** Finite, nonnegative wait for a serving generation. Zero makes an immediate attempt. */\n readonly wait?: Duration.Input | undefined;\n}\n\nexport interface Supervisor<A = void> {\n /** Scoped work on the current generation. Revocation interrupts it and waits for its cleanup. */\n readonly use: <B, E, R>(\n work: (lease: Lease<A>) => Effect.Effect<B, E, R>,\n options?: UseOptions,\n ) => Effect.Effect<B, E | Unavailable | Superseded, Exclude<R, Scope.Scope>>;\n /** The current generation's browser, waiting up to `waitTimeout` while none is open. */\n readonly browser: Effect.Effect<Browser.Service, Unavailable>;\n /** Each generation's changes, in order. A new reader first gets the latest 64; ends on retiring. */\n readonly states: Stream.Stream<Generation>;\n /** Open the next generation now, or join the one opening, and wait for it. */\n readonly rotate: Effect.Effect<Browser.Service, Unavailable>;\n /** Stop opening at once, release every generation, and wait until each release has finished. */\n readonly retire: Effect.Effect<void>;\n}\n\ntype Hold =\n | { readonly _tag: \"Use\" }\n | { readonly _tag: \"Retained\"; readonly scope: Scope.Closeable };\n\ninterface Held<A> {\n readonly opened: Opened<A>;\n readonly ending: Deferred.Deferred<Superseded>;\n readonly revoked: Deferred.Deferred<Superseded>;\n readonly released: Deferred.Deferred<Lifecycle.Released>;\n readonly scope: Scope.Closeable;\n}\n\ntype State<A> = Lifecycle.State<Held<A>, Hold>;\ntype Input<A> = Lifecycle.Input<Held<A>, Hold>;\ntype Step<A> = Lifecycle.Step<Held<A>, Hold>;\ntype Apply<A> = (input: Input<A>) => Effect.Effect<Step<A>>;\n\nconst superseded = (generation: number, { reason, revokeAt }: Lifecycle.Draining) =>\n new Superseded({ generation, reason, revokeAt });\n\nconst retired = () => new Unavailable({ reason: \"retired\", detail: \"the supervisor was retired\" });\n\nconst describe = (cause: Cause.Cause<unknown>) => {\n const error = Cause.squash(cause);\n\n return Predicate.isError(error) ? error.message : String(error);\n};\n\nconst timedOut = () =>\n new Unavailable({ reason: \"opening\", detail: \"no generation opened within the wait\" });\n\nconst bounded = (input: Duration.Input, name: string) =>\n Effect.suspend(() => {\n const duration = Duration.fromInput(input);\n\n return Option.isSome(duration) &&\n Duration.isFinite(duration.value) &&\n !Duration.isNegative(duration.value)\n ? Effect.succeed(duration.value)\n : Effect.die(new RangeError(`${name} must be a finite nonnegative duration`));\n });\n\n/** Resolve immediately before starting a bounded wait, including when its duration is zero. */\nconst waitFor = <A, H>(\n state: SubscriptionRef.SubscriptionRef<Lifecycle.State<A, H>>,\n wait: Duration.Duration,\n clock: Clock.Clock,\n target?: number,\n) => {\n const result = (resolution: Lifecycle.Resolution<A>) =>\n resolution._tag === \"Serve\"\n ? Effect.succeed(resolution.live)\n : Effect.fail(new Unavailable(resolution));\n\n return Effect.suspend(() => {\n const current = Lifecycle.resolve(state.value, target);\n\n return current === undefined\n ? SubscriptionRef.changes(state).pipe(\n Stream.map((state) => Lifecycle.resolve(state, target)),\n Stream.filter(Predicate.isNotUndefined),\n Stream.runHead,\n Effect.flatMap(Option.match({ onNone: () => Effect.fail(retired()), onSome: result })),\n Effect.timeoutOrElse({ duration: wait, orElse: () => Effect.fail(timedOut()) }),\n )\n : result(current);\n }).pipe(Effect.provideService(Clock.Clock, clock));\n};\n\n/** Sleep until `before` ahead of `expiresAt`, but no sooner than halfway there from now. */\nconst untilRotation = (expiresAt: DateTime.Utc, before: Duration.Duration) =>\n Clock.currentTimeMillis.pipe(\n Effect.flatMap((now) => {\n const left = DateTime.toEpochMillis(expiresAt) - now;\n\n return Effect.sleep(Duration.millis(Math.max(left - Duration.toMillis(before), left / 2, 0)));\n }),\n );\n\n/** Native timers may wake a fraction early; a revocation must reach its monotonic deadline. */\nconst until = (at: number, now: () => number): Effect.Effect<void> =>\n Effect.suspend(() =>\n now() >= at\n ? Effect.void\n : Effect.sleep(Duration.millis(Math.ceil(at - now()))).pipe(Effect.andThen(until(at, now))),\n );\n\n/** Borrowed work and transferred scopes hold a generation until cleanup lets it go. */\nconst leasing = <A>(\n state: SubscriptionRef.SubscriptionRef<State<A>>,\n apply: Apply<A>,\n waitTimeout: Duration.Duration,\n now: () => number,\n clock: Clock.Clock,\n) => {\n const borrow = Effect.fnUntraced(function* (hold: Hold, wait: Duration.Duration) {\n const until = now() + Duration.toMillis(wait);\n\n for (;;) {\n const step = yield* apply({ _tag: \"Hold\", hold });\n\n if (step.borrowed !== undefined) return step.borrowed;\n yield* waitFor(state, Duration.millis(Math.max(0, until - now())), clock).pipe(\n Effect.interruptible,\n );\n if (now() >= until) return yield* timedOut();\n }\n });\n\n const leaseOf = (live: Lifecycle.Live<Held<A>>): Lease<A> => ({\n generation: live.number,\n browser: live.value.opened.browser,\n value: live.value.opened.value,\n lose: (detail) =>\n apply({ _tag: \"Lost\", number: live.number, cause: \"declared\", detail }).pipe(Effect.asVoid),\n ending: Deferred.await(live.value.ending),\n retain: Effect.uninterruptible(\n Effect.gen(function* () {\n const scope = yield* Scope.make();\n const hold: Hold = { _tag: \"Retained\", scope };\n const step = yield* apply({ _tag: \"Hold\", number: live.number, hold });\n\n if (step.borrowed === undefined) {\n yield* Scope.close(scope, Exit.void);\n\n return yield* yield* Deferred.await(live.value.ending);\n }\n yield* Scope.addFinalizer(\n scope,\n apply({ _tag: \"Let\", number: live.number, hold }).pipe(Effect.asVoid),\n );\n\n return scope;\n }),\n ),\n });\n\n const use: Supervisor<A>[\"use\"] = (work, options = {}) =>\n Effect.scoped(\n Effect.gen(function* () {\n const hold: Hold = { _tag: \"Use\" };\n const wait = yield* bounded(options.wait ?? waitTimeout, \"wait\");\n\n const live = yield* Effect.acquireRelease(borrow(hold, wait), (live) =>\n apply({ _tag: \"Let\", number: live.number, hold }).pipe(Effect.asVoid),\n );\n\n const revoked = Deferred.await(live.value.revoked).pipe(Effect.flatMap(Effect.fail));\n\n return yield* Effect.raceFirst(\n work(leaseOf(live)).pipe(\n // Declaring loss and returning can finish before the race's other fiber runs.\n Effect.tap(() =>\n Deferred.isDone(live.value.revoked).pipe(\n Effect.flatMap((done) => (done ? revoked : Effect.void)),\n ),\n ),\n ),\n revoked,\n );\n }),\n );\n\n return use;\n};\n\ntype Provider = Omit<Opened, \"value\">;\ntype MakeOptions<E, R, A> = Omit<Options<E, R, A>, \"open\"> & {\n readonly open: Effect.Effect<Opened<A> | Provider, E, R>;\n};\n\nconst acquireGeneration = <A, E, R>(\n open: Effect.Effect<Opened<A> | Provider, E, R>,\n own: Scope.Scope,\n) =>\n Effect.uninterruptibleMask((restore) =>\n Effect.flatMap(Scope.fork(own), (scope) =>\n restore(open.pipe(Scope.provide(scope))).pipe(\n Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause))),\n Effect.map((opened): Held<A | void> => ({\n opened: { ...opened, value: \"value\" in opened ? opened.value : undefined },\n scope,\n ending: Deferred.makeUnsafe<Superseded>(),\n revoked: Deferred.makeUnsafe<Superseded>(),\n released: Deferred.makeUnsafe<Lifecycle.Released>(),\n })),\n ),\n ),\n );\n\nconst watchGeneration = <A>(\n live: Lifecycle.Live<Held<A>>,\n rotateBefore: Duration.Duration | undefined,\n apply: Apply<A>,\n) => {\n const { browser } = live.value.opened;\n\n const loss = browser.disconnected.pipe(\n Effect.flatMap((cause) => apply({ _tag: \"Lost\", number: live.number, cause })),\n );\n\n const rotation =\n browser.expiresAt === undefined || rotateBefore === undefined\n ? Effect.void\n : untilRotation(browser.expiresAt, rotateBefore).pipe(\n Effect.andThen(apply({ _tag: \"Rotate\", due: live.number })),\n );\n\n return Effect.all([loss, rotation], { concurrency: 2, discard: true });\n};\n\n// After revocation, retained resources and use finalizers let go before the provider.\nconst releaseGeneration = Effect.fnUntraced(function* <A>(\n command: Extract<Lifecycle.Command<Held<A>>, { readonly _tag: \"Release\" | \"Leave\" }>,\n state: SubscriptionRef.SubscriptionRef<State<A>>,\n apply: Apply<A>,\n) {\n const { live } = command;\n\n const cleaned = yield* Effect.forEach(\n Lifecycle.lookup(state.value, live.number)?.holds ?? [],\n (hold) =>\n Effect.exit(hold._tag === \"Retained\" ? Scope.close(hold.scope, Exit.void) : Effect.void),\n { concurrency: 8 },\n );\n\n yield* SubscriptionRef.changes(state).pipe(\n Stream.filter((current) => (Lifecycle.lookup(current, live.number)?.holds.size ?? 0) === 0),\n Stream.runHead,\n );\n\n const released =\n command._tag === \"Leave\"\n ? undefined\n : yield* (live.value.opened.release ?? Effect.succeed(new Lifecycle.Settled())).pipe(\n Effect.catchCause((cause) =>\n Effect.succeed(\n new Lifecycle.Unconfirmed({ detail: `the release failed: ${describe(cause)}` }),\n ),\n ),\n );\n\n const closed = yield* Effect.exit(Scope.close(live.value.scope, Exit.void));\n\n yield* apply({ _tag: \"Released\", number: live.number, released });\n if (released !== undefined) yield* Deferred.succeed(live.value.released, released);\n yield* Exit.asVoidAll([...cleaned, closed]);\n});\n\nconst admissionAfter = <A>(state: State<A>) => {\n const released = state.released;\n\n const pending = [...state.draining.values()]\n .filter((drain) => drain._tag !== \"Leaving\")\n .map(({ live }) => live.value.released);\n\n return pending.length === 0 && released === undefined\n ? undefined\n : Effect.gen(function* () {\n let outcome = released;\n\n for (const release of pending)\n outcome = Lifecycle.combine(outcome, yield* Deferred.await(release));\n\n return outcome ?? new Lifecycle.Settled();\n });\n};\n\nconst makeScoped = Effect.fn(\"Supervisor.make\")(function* <E, R, A>(\n options: MakeOptions<E, R, A>,\n): Effect.fn.Return<Supervisor<A | void>, never, Scope.Scope | Exclude<R, Scope.Scope>> {\n const clock = yield* Clock.Clock;\n const now = () => Number(clock.monotonicTimeNanosUnsafe()) / 1e6;\n const context = yield* Effect.context<Exclude<R, Scope.Scope>>();\n const own = yield* Scope.fork(yield* Effect.scope);\n const exclusive = options.exclusive ?? false;\n\n const reopen: Schedule.Schedule<unknown, E> =\n options.reopen ??\n Schedule.exponential(\"1 second\").pipe(Schedule.upTo({ duration: Duration.minutes(5) }));\n\n const rotateBefore =\n options.rotateBefore === undefined ? undefined : Duration.fromInputUnsafe(options.rotateBefore);\n\n const waitTimeout = yield* bounded(options.waitTimeout ?? Duration.minutes(2), \"waitTimeout\");\n\n const handover = Duration.toMillis(\n yield* bounded(options.handover ?? Duration.seconds(30), \"handover\"),\n );\n\n const started = Lifecycle.start<Held<A | void>, Hold>();\n const state = yield* SubscriptionRef.make(started.state);\n const applying = yield* Semaphore.make(1);\n const events = yield* PubSub.unbounded<Take.Take<Generation>>({ replay: 64 });\n const opening = yield* FiberHandle.make<unknown, never>();\n const releases = yield* FiberMap.make<number, unknown, never>();\n const runOpen = yield* FiberHandle.runtime(opening)();\n const runRelease = yield* FiberMap.runtime(releases)();\n\n const apply: Apply<A | void> = Effect.fnUntraced(\n function* (input: Input<A | void>) {\n const current = state.value;\n const step = Lifecycle.transition(current, input, exclusive, now(), handover);\n\n if (step.state !== current) yield* SubscriptionRef.set(state, step.state);\n yield* perform(step);\n\n return step;\n },\n (effect) => applying.withPermit(effect),\n Effect.uninterruptible,\n Effect.provideService(Clock.Clock, clock),\n );\n\n const perform = Effect.fnUntraced(function* (step: Step<A | void>): Effect.fn.Return<void> {\n for (const [number, generation] of step.events)\n PubSub.publishUnsafe(events, [\n new Generation({\n number,\n at: clock.currentTimeMillisUnsafe(),\n hostTime: now(),\n state: generation,\n }),\n ]);\n for (const command of step.commands)\n switch (command._tag) {\n case \"Open\":\n runOpen(openGeneration(command.number));\n break;\n case \"Watch\":\n yield* Effect.forkIn(\n Effect.provideContext(watchGeneration(command.live, rotateBefore, apply), context),\n command.live.value.scope,\n );\n break;\n case \"Drain\": {\n const ending = superseded(command.live.number, command.ending);\n\n yield* Deferred.succeed(command.live.value.ending, ending);\n yield* Effect.forkIn(\n until(ending.revokeAt, now).pipe(\n Effect.andThen(\n Effect.suspend(() => apply({ _tag: \"Revoke\", number: command.live.number })),\n ),\n ),\n command.live.value.scope,\n );\n break;\n }\n case \"Release\":\n case \"Leave\":\n yield* Deferred.succeed(\n command.live.value.revoked,\n superseded(command.live.number, command.ending),\n );\n runRelease(command.live.number, releaseGeneration(command, state, apply));\n break;\n }\n });\n\n const openGeneration = (number: number) => {\n const openOnce = acquireGeneration(\n Effect.gen(function* () {\n const after = admissionAfter(state.value);\n\n if (exclusive && after !== undefined) yield* after;\n yield* options.admit?.({ number, after }) ?? Effect.void;\n\n return yield* options.open.pipe(\n Effect.provideService(Releasing, {\n released: (released) =>\n apply({ _tag: \"AttemptReleased\", number, released }).pipe(Effect.asVoid),\n }),\n );\n }),\n own,\n ).pipe(Effect.provideContext(context));\n\n return Effect.uninterruptibleMask((restore) =>\n restore(\n Effect.retry(openOnce, {\n schedule: reopen,\n while: (error) => !options.definite?.(error),\n }),\n ).pipe(\n Effect.exit,\n Effect.flatMap((exit) => {\n if (Exit.isSuccess(exit))\n return apply({ _tag: \"Opened\", live: { number, value: exit.value } });\n const cause = exit.cause;\n\n return apply(\n Cause.hasInterruptsOnly(cause)\n ? { _tag: \"Abandoned\", number }\n : { _tag: \"Failed\", number, detail: describe(cause), cause: Cause.squash(cause) },\n );\n }),\n ),\n );\n };\n\n const end = yield* Effect.cached(PubSub.publish(events, Exit.void));\n\n const stop = Effect.fnUntraced(function* (input: Input<A | void>) {\n yield* apply(input);\n yield* FiberHandle.clear(opening);\n yield* FiberMap.awaitEmpty(releases);\n if (yield* Deferred.isDone(releases.deferred)) yield* FiberMap.join(releases);\n }, Effect.ensuring(end));\n\n const retire = yield* Effect.cached(stop({ _tag: \"Retire\" }));\n\n yield* Effect.addFinalizer(() => (options.keep === true ? stop({ _tag: \"Keep\" }) : retire));\n yield* perform(started);\n\n return {\n browser: Effect.map(waitFor(state, waitTimeout, clock), (live) => live.value.opened.browser),\n use: leasing(state, apply, waitTimeout, now, clock),\n states: Stream.fromPubSubTake(events),\n rotate: apply({ _tag: \"Rotate\" }).pipe(\n Effect.flatMap(({ reply }) =>\n reply === undefined\n ? Effect.fail(retired())\n : Effect.map(\n waitFor(state, waitTimeout, clock, reply),\n (live) => live.value.opened.browser,\n ),\n ),\n ),\n retire,\n };\n});\n\n/** Supervise scoped generation values. Browser-only providers retain their existing void value. */\nexport function make<E, R, A = void>(\n options: Options<E, R, A>,\n): Effect.Effect<Supervisor<A>, never, Scope.Scope | Exclude<R, Scope.Scope>>;\n\nexport function make<E, R>(\n options: MakeOptions<E, R, never>,\n): Effect.Effect<Supervisor<void>, never, Scope.Scope | Exclude<R, Scope.Scope>>;\n\nexport function make<E, R, A>(options: MakeOptions<E, R, A>) {\n return makeScoped(options);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Supervisor-2mPjIYYs.mjs","names":["Lifecycle.GenerationState","Lifecycle.resolve","Lifecycle.lookup","Lifecycle.Settled","Lifecycle.Unconfirmed","Lifecycle.combine","Lifecycle.start","Lifecycle.transition"],"sources":["../src/internal/supervisor/lifecycle.ts","../src/Supervisor.ts"],"sourcesContent":["/**\n * A supervisor's life as one state and one transition function, and the generation states it\n * publishes. The transition has no effects: `Supervisor.make` applies each input under one lock,\n * publishes the events in order and runs the commands, so the rules here are tested alone.\n */\nimport { Schema } from \"effect\";\n\nimport { DisconnectCause } from \"../../BrowserEvent.ts\";\n\n/** The provider confirmed that the generation's browser ended. */\nexport class Settled extends Schema.TaggedClass<Settled>()(\"Settled\", {}) {}\n\n/** The provider could not confirm the end by its deadline, so the browser may still run, and bill. */\nexport class Unconfirmed extends Schema.TaggedClass<Unconfirmed>()(\"Unconfirmed\", {\n detail: Schema.String,\n}) {}\n\nexport const Released = Schema.Union([Settled, Unconfirmed]);\n\nexport type Released = typeof Released.Type;\n\n/** Opening, but not after a loss: the first generation, a rotation, or the one after `Down`. */\nexport class Opening extends Schema.TaggedClass<Opening>()(\"Opening\", {}) {}\n\n/** Opening after the generation before it was lost. */\nexport class Reopening extends Schema.TaggedClass<Reopening>()(\"Reopening\", {}) {}\n\n/** Open: `browser` gives this generation until the next one opens. */\nexport class Open extends Schema.TaggedClass<Open>()(\"Open\", {}) {}\n\n/** No longer serving; holds end at this host-monotonic deadline or when their owners let go. */\nexport class Draining extends Schema.TaggedClass<Draining>()(\"Draining\", {\n reason: Schema.Literals([\"rotated\", \"lost\", \"retired\"]),\n revokeAt: Schema.Finite,\n}) {}\n\n/** Lost through disconnection or a consumer's declaration that it is unusable. */\nexport class Lost extends Schema.TaggedClass<Lost>()(\"Lost\", {\n cause: Schema.Union([DisconnectCause, Schema.Literal(\"declared\")]),\n detail: Schema.optional(Schema.String),\n}) {}\n\n/**\n * It never opened: its last try failed with `cause`, which the provider deems definite, or after\n * which the reopen schedule gave up. `released` combines this generation's failed-try cleanup,\n * retaining the first unconfirmed end; it is absent when no try reported cleanup.\n */\nexport class Down extends Schema.TaggedClass<Down>()(\"Down\", {\n detail: Schema.String,\n cause: Schema.Defect(),\n released: Schema.optional(Released),\n}) {}\n\n/** It ended. `released` includes reported cleanup when retired while opening, if any. */\nexport class Closed extends Schema.TaggedClass<Closed>()(\"Closed\", {\n released: Schema.optional(Released),\n}) {}\n\n/**\n * It was serving as the supervisor's scope closed, and was left running, not released: its scope\n * closed, and its provider runs it on, and bills, until something adopts and releases it.\n */\nexport class Kept extends Schema.TaggedClass<Kept>()(\"Kept\", {}) {}\n\nexport const GenerationState = Schema.Union([\n Opening,\n Reopening,\n Open,\n Draining,\n Lost,\n Down,\n Closed,\n Kept,\n]);\n\nexport type GenerationState = typeof GenerationState.Type;\n\n/** A generation that opened: its number, and what the runtime keeps to serve and end it. */\nexport interface Live<A> {\n readonly number: number;\n readonly value: A;\n}\n\nexport interface Held<A, H> extends Live<A> {\n readonly holds: ReadonlySet<H>;\n}\n\n/** Release ownership remains here until the provider and generation scope have finished. */\nexport interface Drain<A, H> {\n readonly _tag: \"Draining\" | \"Releasing\" | \"Leaving\";\n readonly live: Held<A, H>;\n readonly ending: Draining;\n}\n\n/** One serving generation, one shared acquisition, and prior generations still owned. */\nexport type State<A, H = unknown> = (\n | { readonly _tag: \"Opening\"; readonly number: number; readonly serving: Held<A, H> | undefined }\n | { readonly _tag: \"Open\"; readonly serving: Held<A, H> }\n | {\n readonly _tag: \"Down\";\n readonly number: number;\n readonly detail: string;\n readonly cause: unknown;\n readonly serving: Held<A, H> | undefined;\n }\n | { readonly _tag: \"Retired\" }\n) & {\n readonly draining: ReadonlyMap<number, Drain<A, H>>;\n /** Retain the first unconfirmed end, otherwise the latest settled end, without its resources. */\n readonly released?: Released | undefined;\n /** Failed-try outcomes by their opening generation, forgotten when that opening ends. */\n readonly attempts?: ReadonlyMap<number, Released> | undefined;\n};\n\nexport type Input<A, H = unknown> =\n | { readonly _tag: \"Opened\"; readonly live: Live<A> }\n | { readonly _tag: \"AttemptReleased\"; readonly number: number; readonly released: Released }\n | {\n readonly _tag: \"Failed\";\n readonly number: number;\n readonly detail: string;\n readonly cause: unknown;\n }\n | { readonly _tag: \"Abandoned\"; readonly number: number }\n | {\n readonly _tag: \"Lost\";\n readonly number: number;\n readonly cause: Lost[\"cause\"];\n readonly detail?: string | undefined;\n }\n | { readonly _tag: \"Rotate\"; readonly due?: number | undefined }\n | { readonly _tag: \"Retire\" }\n | { readonly _tag: \"Keep\" }\n | {\n readonly _tag: \"Hold\";\n readonly number?: number | undefined;\n readonly hold: H;\n }\n | { readonly _tag: \"Let\"; readonly number: number; readonly hold: H }\n | { readonly _tag: \"Revoke\"; readonly number: number }\n | {\n readonly _tag: \"Released\";\n readonly number: number;\n readonly released?: Released | undefined;\n };\n\nexport type Command<A> =\n | { readonly _tag: \"Open\"; readonly number: number }\n | { readonly _tag: \"Watch\"; readonly live: Live<A> }\n /** Signal ending and arrange revocation. Repeated only when loss/retirement accelerates it. */\n | { readonly _tag: \"Drain\"; readonly live: Live<A>; readonly ending: Draining }\n /** Revoke/close holds, await their Let inputs, release the provider, then close its scope. */\n | { readonly _tag: \"Release\"; readonly live: Live<A>; readonly ending: Draining }\n | { readonly _tag: \"Leave\"; readonly live: Live<A>; readonly ending: Draining };\n\nexport interface Step<A, H = unknown> {\n readonly state: State<A, H>;\n readonly events: ReadonlyArray<readonly [number, GenerationState]>;\n readonly commands: ReadonlyArray<Command<A>>;\n readonly reply?: number | undefined;\n readonly borrowed?: Live<A> | undefined;\n}\n\nexport const start = <A, H = unknown>(): Step<A, H> => ({\n state: { _tag: \"Opening\", number: 1, serving: undefined, draining: new Map() },\n events: [[1, new Opening()]],\n commands: [{ _tag: \"Open\", number: 1 }],\n});\n\nconst servingOf = <A, H>(state: State<A, H>) =>\n state._tag === \"Retired\" ? undefined : state.serving;\n\n/** The holds still owned for a generation, including one whose release has begun. */\nexport const lookup = <A, H>(state: State<A, H>, number: number): Held<A, H> | undefined =>\n servingOf(state)?.number === number ? servingOf(state) : state.draining.get(number)?.live;\n\n/** A transition's local result builder; input state and its collections remain immutable. */\ninterface Change<A, H> {\n readonly now: number;\n readonly handover: number;\n readonly exclusive: boolean;\n state: State<A, H>;\n events: Array<readonly [number, GenerationState]>;\n commands: Array<Command<A>>;\n reply?: number;\n borrowed?: Live<A>;\n}\n\n/** The sole writer of a drain's ending and phase; each release command is emitted once. */\nconst draining = <A, H>(change: Change<A, H>, drain: Drain<A, H>) => {\n const before = change.state.draining.get(drain.live.number);\n const { live, ending, _tag } = drain;\n\n change.state = {\n ...change.state,\n draining: new Map(change.state.draining).set(live.number, drain),\n };\n if (before?.ending !== ending) {\n change.events.push([live.number, ending]);\n change.commands.push({ _tag: \"Drain\", live, ending });\n }\n if (_tag !== \"Draining\" && before?._tag !== _tag)\n change.commands.push({ _tag: _tag === \"Leaving\" ? \"Leave\" : \"Release\", live, ending });\n};\n\nconst end = <A, H>(\n change: Change<A, H>,\n live: Held<A, H>,\n reason: Draining[\"reason\"],\n keep = false,\n) => {\n const ending = new Draining({\n reason,\n revokeAt: change.now + (reason === \"rotated\" ? change.handover : 0),\n });\n\n draining(change, {\n live,\n ending,\n _tag: keep\n ? \"Leaving\"\n : live.holds.size === 0 || ending.revokeAt <= change.now\n ? \"Releasing\"\n : \"Draining\",\n });\n};\n\nconst revoke = <A, H>(change: Change<A, H>, number: number, reason?: \"lost\" | \"retired\") => {\n const drain = change.state.draining.get(number);\n\n if (drain?._tag !== \"Draining\" || (reason === undefined && change.now < drain.ending.revokeAt))\n return;\n draining(change, {\n ...drain,\n _tag: \"Releasing\",\n ending: reason === undefined ? drain.ending : new Draining({ reason, revokeAt: change.now }),\n });\n};\n\nconst holds = <A, H>(\n change: Change<A, H>,\n input: Extract<Input<A, H>, { readonly _tag: \"Hold\" | \"Let\" }>,\n) => {\n const number = input.number ?? servingOf(change.state)?.number;\n const live = number === undefined ? undefined : lookup(change.state, number);\n\n if (live === undefined) return;\n const drain = change.state.draining.get(live.number);\n\n if (\n input._tag === \"Hold\" &&\n drain !== undefined &&\n (drain._tag !== \"Draining\" || change.now >= drain.ending.revokeAt)\n )\n return;\n if (live.holds.has(input.hold) === (input._tag === \"Hold\")) return;\n const holds = new Set(live.holds);\n\n if (input._tag === \"Hold\") {\n holds.add(input.hold);\n change.borrowed = live;\n } else holds.delete(input.hold);\n const held = { ...live, holds };\n\n if (drain !== undefined)\n draining(change, {\n ...drain,\n live: held,\n _tag: drain._tag === \"Draining\" && holds.size === 0 ? \"Releasing\" : drain._tag,\n });\n else if (change.state._tag !== \"Retired\") change.state = { ...change.state, serving: held };\n};\n\nconst next = <A, H>(change: Change<A, H>, number: number, reopen: boolean) => {\n const { exclusive } = change;\n const current = servingOf(change.state);\n\n if (current !== undefined && (reopen || exclusive))\n end(change, current, reopen ? \"lost\" : \"rotated\");\n change.state = {\n _tag: \"Opening\",\n number,\n serving: reopen || exclusive ? undefined : current,\n draining: change.state.draining,\n released: change.state.released,\n attempts: change.state.attempts,\n };\n change.events.push([number, reopen ? new Reopening() : new Opening()]);\n change.commands.push({ _tag: \"Open\", number });\n};\n\nconst lost = <A, H>(\n change: Change<A, H>,\n input: Extract<Input<A, H>, { readonly _tag: \"Lost\" }>,\n) => {\n const { state } = change;\n const drain = state.draining.get(input.number);\n const current = servingOf(state);\n\n if (input.cause === \"declared\" && current?.number !== input.number) return;\n if (drain?._tag === \"Draining\") {\n change.events.push([input.number, new Lost({ cause: input.cause })]);\n revoke(change, input.number, \"lost\");\n } else if (state._tag !== \"Retired\" && current?.number === input.number) {\n change.events.push([input.number, new Lost({ cause: input.cause, detail: input.detail })]);\n if (state._tag !== \"Opening\")\n next(change, (state._tag === \"Open\" ? current.number : state.number) + 1, true);\n else {\n change.state = { ...state, serving: undefined };\n end(change, current, \"lost\");\n }\n }\n};\n\n/** End one opening without confusing its cleanup with preceding generations' releases. */\nconst finishAttempt = <A, H>(change: Change<A, H>, number: number) => {\n const attempts = new Map(change.state.attempts);\n const released = attempts.get(number);\n\n attempts.delete(number);\n change.state = { ...change.state, attempts };\n\n return released;\n};\n\n/** Pure admission and lifecycle changes. A rejected hold preserves state identity. */\nexport const transition = <A, H = unknown>(\n state: State<A, H>,\n input: Input<A, H>,\n exclusive: boolean,\n now = 0,\n handover = 30_000,\n): Step<A, H> => {\n const change: Change<A, H> = {\n state,\n events: [],\n commands: [],\n exclusive,\n handover,\n now,\n };\n\n switch (input._tag) {\n case \"Hold\":\n case \"Let\":\n holds(change, input);\n break;\n case \"Revoke\":\n revoke(change, input.number);\n break;\n case \"Opened\": {\n const live = { ...input.live, holds: new Set<H>() };\n\n if (lookup(state, live.number) !== undefined) break;\n if (state._tag !== \"Opening\" || state.number !== live.number) end(change, live, \"retired\");\n else {\n finishAttempt(change, live.number);\n change.events.push([live.number, new Open()]);\n change.commands.push({ _tag: \"Watch\", live });\n if (state.serving !== undefined) end(change, state.serving, \"rotated\");\n change.state = {\n _tag: \"Open\",\n serving: live,\n draining: change.state.draining,\n released: change.state.released,\n attempts: change.state.attempts,\n };\n }\n break;\n }\n case \"Failed\": {\n const { number, detail, cause } = input;\n\n if (state._tag === \"Opening\" && state.number === number)\n change.state = { ...state, _tag: \"Down\", detail, cause };\n change.events.push([\n number,\n new Down({ detail, cause, released: finishAttempt(change, number) }),\n ]);\n break;\n }\n case \"Abandoned\":\n change.events.push([\n input.number,\n new Closed({ released: finishAttempt(change, input.number) }),\n ]);\n break;\n case \"AttemptReleased\":\n change.state = {\n ...state,\n released: combine(state.released, input.released),\n attempts: new Map(state.attempts).set(\n input.number,\n combine(state.attempts?.get(input.number), input.released),\n ),\n };\n break;\n case \"Released\": {\n const { number, released } = input;\n const drain = state.draining.get(number);\n\n if (drain === undefined || drain._tag === \"Draining\" || drain.live.holds.size > 0) break;\n const draining = new Map(state.draining);\n\n draining.delete(number);\n change.state = { ...state, draining, released: combine(state.released, released) };\n const outcome = combine(finishAttempt(change, number), released);\n\n change.events.push([\n number,\n released === undefined ? new Kept() : new Closed({ released: outcome }),\n ]);\n break;\n }\n case \"Lost\":\n lost(change, input);\n break;\n case \"Rotate\": {\n if (\n state._tag === \"Retired\" ||\n (input.due !== undefined && (state._tag !== \"Open\" || state.serving.number !== input.due))\n )\n break;\n change.reply =\n state._tag === \"Opening\"\n ? state.number\n : (state._tag === \"Open\" ? state.serving.number : state.number) + 1;\n if (state._tag !== \"Opening\") next(change, change.reply, false);\n break;\n }\n case \"Keep\":\n case \"Retire\":\n if (state._tag === \"Retired\") break;\n for (const number of state.draining.keys()) revoke(change, number, \"retired\");\n if (state.serving !== undefined) end(change, state.serving, \"retired\", input._tag === \"Keep\");\n change.state = {\n _tag: \"Retired\",\n draining: change.state.draining,\n released: change.state.released,\n attempts: change.state.attempts,\n };\n }\n\n return change;\n};\n\n/** Later confirmations cannot establish that an earlier unconfirmed session ended. */\nexport function combine(before: Released | undefined, next: Released): Released;\n\nexport function combine(\n before: Released | undefined,\n next: Released | undefined,\n): Released | undefined;\n\nexport function combine(before: Released | undefined, next: Released | undefined) {\n return before?._tag === \"Unconfirmed\" ? before : (next ?? before);\n}\n\nexport type Resolution<A> =\n | { readonly _tag: \"Serve\"; readonly live: Live<A> }\n | {\n readonly _tag: \"Unavailable\";\n readonly reason: \"down\" | \"retired\";\n readonly detail: string;\n readonly cause?: unknown;\n };\n\n/** An unheld browser resolution; use obtains its hold atomically through Hold instead. */\nexport const resolve = <A, H>(\n state: State<A, H>,\n target: number | undefined,\n): Resolution<A> | undefined => {\n if (state._tag === \"Retired\")\n return { _tag: \"Unavailable\", reason: \"retired\", detail: \"the supervisor was retired\" };\n if (\n state.serving !== undefined &&\n (target === undefined || (state._tag === \"Open\" && state.serving.number >= target))\n )\n return { _tag: \"Serve\", live: state.serving };\n if (state._tag === \"Down\" && (target === undefined || state.number >= target))\n return { _tag: \"Unavailable\", reason: \"down\", detail: state.detail, cause: state.cause };\n\n return undefined;\n};\n","/**\n * A browser kept open across losses and session ends, as a series of generations, each a new\n * browser from the same provider. Pages don't carry over from one generation to the next.\n *\n * `make` opens the first generation at once with the provider's `open`, in a scope of its own, so\n * a caller that stops waiting never interrupts a half-open browser. `browser` gives the current\n * generation; callers wait, bounded, and share one open. A loss is published at once and the next\n * generation opens on the `reopen` schedule, which also retries a failed open, unless the provider\n * deems its failure `definite`: that goes `Down` at once, with its cause. `rotate` opens the\n * next generation now, and so does the time `rotateBefore` ahead of a generation's `expiresAt`. A\n * rotation makes the next generation before it breaks the current one, unless generations are\n * `exclusive`, as sessions saving to one stored context must be: then the current one is released\n * first. `retire` stops reopening at once and releases what is open; the scope's close retires\n * too, unless the supervisor `keep`s: then it leaves the serving generation running, `Kept`. `states`\n * publishes each generation's changes, with the provider's release outcome last.\n *\n * Providers supply the specifics: `Browserbase.supervise` opens hosted sessions this way.\n *\n * @since 0.3.0\n */\nimport {\n Cause,\n Clock,\n Context,\n DateTime,\n Deferred,\n Duration,\n Effect,\n Exit,\n FiberHandle,\n FiberMap,\n Option,\n Predicate,\n PubSub,\n Schedule,\n Schema,\n Scope,\n Semaphore,\n Stream,\n SubscriptionRef,\n type Take,\n} from \"effect\";\n\nimport type * as Browser from \"./Browser.ts\";\nimport * as Lifecycle from \"./internal/supervisor/lifecycle.ts\";\n\nexport {\n Closed,\n Down,\n Draining,\n GenerationState,\n Kept,\n Lost,\n Open,\n Opening,\n Released,\n Reopening,\n Settled,\n Unconfirmed,\n} from \"./internal/supervisor/lifecycle.ts\";\n\n/** One change in a generation's life. `at` is wall-clock epoch milliseconds from the Effect `Clock`. */\nexport class Generation extends Schema.Class<Generation>(\"effect-browser/Generation\")({\n number: Schema.Int.check(Schema.isGreaterThan(0)),\n at: Schema.Finite,\n hostTime: Schema.Finite,\n state: Lifecycle.GenerationState,\n}) {}\n\n/**\n * No browser to give: none opened within `waitTimeout` (`opening`), the latest generation failed\n * to open (`down`, with what it failed with as `cause`), or the supervisor was retired.\n */\nexport class Unavailable extends Schema.TaggedError<Unavailable>()(\"Unavailable\", {\n reason: Schema.Literals([\"opening\", \"down\", \"retired\"]),\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect()),\n}) {\n override get message() {\n return `no browser: ${this.detail}`;\n }\n}\n\n/** One generation, as a provider opened it in the scope the supervisor gave it. */\nexport interface Opened<A = void> {\n readonly value: A;\n readonly browser: Browser.Service;\n /**\n * End the generation, and say whether the provider confirmed its end. The supervisor asks it\n * before it closes the generation's scope; without it, closing the scope ends the generation,\n * which counts as `Settled`.\n */\n readonly release?: Effect.Effect<Lifecycle.Released> | undefined;\n}\n\n/** Facts available before an acquisition attempt; awaiting `after` never changes release order. */\nexport interface Admission {\n readonly number: number;\n /**\n * Every earlier session that stopped serving, including failed attempts and older drains.\n * Waits for all pending releases; an Unconfirmed end remains visible to later attempts.\n * Undefined before any release. A still-serving nonexclusive predecessor is excluded.\n */\n readonly after: Effect.Effect<Lifecycle.Released> | undefined;\n}\n\n/**\n * Optional service supplied during `open`. Providers report failed-attempt cleanup here before\n * their scope closes; successful generations instead return `Opened.release`. Reporting does\n * not release resources or replace the original acquisition failure. Terminal `Down` and opening\n * `Closed` states publish the reported outcomes of their own generation's tries.\n */\nexport class Releasing extends Context.Service<\n Releasing,\n { readonly released: (outcome: Lifecycle.Released) => Effect.Effect<void> }\n>()(\"effect-browser/Supervisor/Releasing\") {}\n\nexport interface Options<E, R, A = void> {\n /** Opens one generation in the scope it is given. */\n readonly open: Effect.Effect<Opened<A>, E, R>;\n /** Runs before every open attempt, including the first; failures follow `reopen` and `definite`. */\n readonly admit?: ((opening: Admission) => Effect.Effect<void, E, R>) | undefined;\n /** When to try a failed open again. Defaults to exponential from 1 second, for 5 minutes. */\n readonly reopen?: Schedule.Schedule<unknown, E> | undefined;\n /**\n * Failures no new try mends, such as a refused key: an open that fails so is `Down` at once.\n * Defaults to none.\n */\n readonly definite?: ((error: E) => boolean) | undefined;\n /**\n * Rotate this long ahead of a generation's `expiresAt`, but no sooner than halfway through its\n * life. Without it, a generation's end is a loss.\n */\n readonly rotateBefore?: Duration.Input | undefined;\n /** Generations must not overlap: a rotation releases the current one before it opens the next. */\n readonly exclusive?: boolean | undefined;\n /** Finite, nonnegative time outgoing holds may finish; defaults to 30 seconds. */\n readonly handover?: Duration.Input | undefined;\n /**\n * Closing the scope leaves the serving generation running, `Kept`: it closes the generation's\n * scope but never asks `release`. For providers whose scope only disconnects, such as\n * `Browserbase.supervise` with `keep`. `retire` still releases it.\n */\n readonly keep?: boolean | undefined;\n /** How long `browser` and `rotate` wait for a generation to open. Defaults to 2 minutes. */\n readonly waitTimeout?: Duration.Input | undefined;\n}\n\n/** Work whose generation was revoked; input receipts still determine whether input reached a site. */\nexport class Superseded extends Schema.TaggedError<Superseded>()(\"Superseded\", {\n generation: Schema.Int,\n reason: Schema.Literals([\"rotated\", \"lost\", \"retired\"]),\n revokeAt: Schema.Finite,\n}) {}\n\nexport interface Lease<A> {\n readonly generation: number;\n readonly browser: Browser.Service;\n readonly value: A;\n /** Declare this serving generation unusable and revoke it now; stale declarations do nothing. */\n readonly lose: (detail: string) => Effect.Effect<void>;\n /** First notice that serving ended; loss or retirement may revoke before its deadline. */\n readonly ending: Effect.Effect<Superseded>;\n /** An independent scope; its resources close before provider release. Fails once revoked. */\n readonly retain: Effect.Effect<Scope.Closeable, Superseded>;\n}\n\nexport interface UseOptions {\n /** Finite, nonnegative wait for a serving generation. Zero makes an immediate attempt. */\n readonly wait?: Duration.Input | undefined;\n}\n\nexport interface Supervisor<A = void> {\n /** Scoped work on the current generation. Revocation interrupts it and waits for its cleanup. */\n readonly use: <B, E, R>(\n work: (lease: Lease<A>) => Effect.Effect<B, E, R>,\n options?: UseOptions,\n ) => Effect.Effect<B, E | Unavailable | Superseded, Exclude<R, Scope.Scope>>;\n /** The current generation's browser, waiting up to `waitTimeout` while none is open. */\n readonly browser: Effect.Effect<Browser.Service, Unavailable>;\n /** Each generation's changes, in order. A new reader first gets the latest 64; ends on retiring. */\n readonly states: Stream.Stream<Generation>;\n /** Open the next generation now, or join the one opening, and wait for it. */\n readonly rotate: Effect.Effect<Browser.Service, Unavailable>;\n /** Stop opening at once, release every generation, and wait until each release has finished. */\n readonly retire: Effect.Effect<void>;\n}\n\ntype Hold =\n | { readonly _tag: \"Use\" }\n | { readonly _tag: \"Retained\"; readonly scope: Scope.Closeable };\n\ninterface Held<A> {\n readonly opened: Opened<A>;\n readonly ending: Deferred.Deferred<Superseded>;\n readonly revoked: Deferred.Deferred<Superseded>;\n readonly released: Deferred.Deferred<Lifecycle.Released>;\n readonly scope: Scope.Closeable;\n}\n\ntype State<A> = Lifecycle.State<Held<A>, Hold>;\ntype Input<A> = Lifecycle.Input<Held<A>, Hold>;\ntype Step<A> = Lifecycle.Step<Held<A>, Hold>;\ntype Apply<A> = (input: Input<A>) => Effect.Effect<Step<A>>;\n\nconst superseded = (generation: number, { reason, revokeAt }: Lifecycle.Draining) =>\n new Superseded({ generation, reason, revokeAt });\n\nconst retired = () => new Unavailable({ reason: \"retired\", detail: \"the supervisor was retired\" });\n\nconst describe = (cause: Cause.Cause<unknown>) => {\n const error = Cause.squash(cause);\n\n return Predicate.isError(error) ? error.message : String(error);\n};\n\nconst timedOut = () =>\n new Unavailable({ reason: \"opening\", detail: \"no generation opened within the wait\" });\n\nconst bounded = (input: Duration.Input, name: string) =>\n Effect.suspend(() => {\n const duration = Duration.fromInput(input);\n\n return Option.isSome(duration) &&\n Duration.isFinite(duration.value) &&\n !Duration.isNegative(duration.value)\n ? Effect.succeed(duration.value)\n : Effect.die(new RangeError(`${name} must be a finite nonnegative duration`));\n });\n\n/** Resolve immediately before starting a bounded wait, including when its duration is zero. */\nconst waitFor = <A, H>(\n state: SubscriptionRef.SubscriptionRef<Lifecycle.State<A, H>>,\n wait: Duration.Duration,\n clock: Clock.Clock,\n target?: number,\n) => {\n const result = (resolution: Lifecycle.Resolution<A>) =>\n resolution._tag === \"Serve\"\n ? Effect.succeed(resolution.live)\n : Effect.fail(new Unavailable(resolution));\n\n return Effect.suspend(() => {\n const current = Lifecycle.resolve(state.value, target);\n\n return current === undefined\n ? SubscriptionRef.changes(state).pipe(\n Stream.map((state) => Lifecycle.resolve(state, target)),\n Stream.filter(Predicate.isNotUndefined),\n Stream.runHead,\n Effect.flatMap(Option.match({ onNone: () => Effect.fail(retired()), onSome: result })),\n Effect.timeoutOrElse({ duration: wait, orElse: () => Effect.fail(timedOut()) }),\n )\n : result(current);\n }).pipe(Effect.provideService(Clock.Clock, clock));\n};\n\n/** Sleep until `before` ahead of `expiresAt`, but no sooner than halfway there from now. */\nconst untilRotation = (expiresAt: DateTime.Utc, before: Duration.Duration) =>\n Clock.currentTimeMillis.pipe(\n Effect.flatMap((now) => {\n const left = DateTime.toEpochMillis(expiresAt) - now;\n\n return Effect.sleep(Duration.millis(Math.max(left - Duration.toMillis(before), left / 2, 0)));\n }),\n );\n\n/** Native timers may wake a fraction early; a revocation must reach its monotonic deadline. */\nconst until = (at: number, now: () => number): Effect.Effect<void> =>\n Effect.suspend(() =>\n now() >= at\n ? Effect.void\n : Effect.sleep(Duration.millis(Math.ceil(at - now()))).pipe(Effect.andThen(until(at, now))),\n );\n\n/** Borrowed work and transferred scopes hold a generation until cleanup lets it go. */\nconst leasing = <A>(\n state: SubscriptionRef.SubscriptionRef<State<A>>,\n apply: Apply<A>,\n waitTimeout: Duration.Duration,\n now: () => number,\n clock: Clock.Clock,\n) => {\n const borrow = Effect.fnUntraced(function* (hold: Hold, wait: Duration.Duration) {\n const until = now() + Duration.toMillis(wait);\n\n for (;;) {\n const step = yield* apply({ _tag: \"Hold\", hold });\n\n if (step.borrowed !== undefined) return step.borrowed;\n yield* waitFor(state, Duration.millis(Math.max(0, until - now())), clock).pipe(\n Effect.interruptible,\n );\n if (now() >= until) return yield* timedOut();\n }\n });\n\n const leaseOf = (live: Lifecycle.Live<Held<A>>): Lease<A> => ({\n generation: live.number,\n browser: live.value.opened.browser,\n value: live.value.opened.value,\n lose: (detail) =>\n apply({ _tag: \"Lost\", number: live.number, cause: \"declared\", detail }).pipe(Effect.asVoid),\n ending: Deferred.await(live.value.ending),\n retain: Effect.uninterruptible(\n Effect.gen(function* () {\n const scope = yield* Scope.make();\n const hold: Hold = { _tag: \"Retained\", scope };\n const step = yield* apply({ _tag: \"Hold\", number: live.number, hold });\n\n if (step.borrowed === undefined) {\n yield* Scope.close(scope, Exit.void);\n\n return yield* yield* Deferred.await(live.value.ending);\n }\n yield* Scope.addFinalizer(\n scope,\n apply({ _tag: \"Let\", number: live.number, hold }).pipe(Effect.asVoid),\n );\n\n return scope;\n }),\n ),\n });\n\n const use: Supervisor<A>[\"use\"] = (work, options = {}) =>\n Effect.scoped(\n Effect.gen(function* () {\n const hold: Hold = { _tag: \"Use\" };\n const wait = yield* bounded(options.wait ?? waitTimeout, \"wait\");\n\n const live = yield* Effect.acquireRelease(borrow(hold, wait), (live) =>\n apply({ _tag: \"Let\", number: live.number, hold }).pipe(Effect.asVoid),\n );\n\n const revoked = Deferred.await(live.value.revoked).pipe(Effect.flatMap(Effect.fail));\n\n return yield* Effect.raceFirst(\n work(leaseOf(live)).pipe(\n // Declaring loss and returning can finish before the race's other fiber runs.\n Effect.tap(() =>\n Deferred.isDone(live.value.revoked).pipe(\n Effect.flatMap((done) => (done ? revoked : Effect.void)),\n ),\n ),\n ),\n revoked,\n );\n }),\n );\n\n return use;\n};\n\ntype Provider = Omit<Opened, \"value\">;\ntype MakeOptions<E, R, A> = Omit<Options<E, R, A>, \"open\"> & {\n readonly open: Effect.Effect<Opened<A> | Provider, E, R>;\n};\n\nconst acquireGeneration = <A, E, R>(\n open: Effect.Effect<Opened<A> | Provider, E, R>,\n own: Scope.Scope,\n) =>\n Effect.uninterruptibleMask((restore) =>\n Effect.flatMap(Scope.fork(own), (scope) =>\n restore(open.pipe(Scope.provide(scope))).pipe(\n Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause))),\n Effect.map((opened): Held<A | void> => ({\n opened: { ...opened, value: \"value\" in opened ? opened.value : undefined },\n scope,\n ending: Deferred.makeUnsafe<Superseded>(),\n revoked: Deferred.makeUnsafe<Superseded>(),\n released: Deferred.makeUnsafe<Lifecycle.Released>(),\n })),\n ),\n ),\n );\n\nconst watchGeneration = <A>(\n live: Lifecycle.Live<Held<A>>,\n rotateBefore: Duration.Duration | undefined,\n apply: Apply<A>,\n) => {\n const { browser } = live.value.opened;\n\n const loss = browser.disconnected.pipe(\n Effect.flatMap((cause) => apply({ _tag: \"Lost\", number: live.number, cause })),\n );\n\n const rotation =\n browser.expiresAt === undefined || rotateBefore === undefined\n ? Effect.void\n : untilRotation(browser.expiresAt, rotateBefore).pipe(\n Effect.andThen(apply({ _tag: \"Rotate\", due: live.number })),\n );\n\n return Effect.all([loss, rotation], { concurrency: 2, discard: true });\n};\n\n// After revocation, retained resources and use finalizers let go before the provider.\nconst releaseGeneration = Effect.fnUntraced(function* <A>(\n command: Extract<Lifecycle.Command<Held<A>>, { readonly _tag: \"Release\" | \"Leave\" }>,\n state: SubscriptionRef.SubscriptionRef<State<A>>,\n apply: Apply<A>,\n) {\n const { live } = command;\n\n const cleaned = yield* Effect.forEach(\n Lifecycle.lookup(state.value, live.number)?.holds ?? [],\n (hold) =>\n Effect.exit(hold._tag === \"Retained\" ? Scope.close(hold.scope, Exit.void) : Effect.void),\n { concurrency: 8 },\n );\n\n yield* SubscriptionRef.changes(state).pipe(\n Stream.filter((current) => (Lifecycle.lookup(current, live.number)?.holds.size ?? 0) === 0),\n Stream.runHead,\n );\n\n const released =\n command._tag === \"Leave\"\n ? undefined\n : yield* (live.value.opened.release ?? Effect.succeed(new Lifecycle.Settled())).pipe(\n Effect.catchCause((cause) =>\n Effect.succeed(\n new Lifecycle.Unconfirmed({ detail: `the release failed: ${describe(cause)}` }),\n ),\n ),\n );\n\n const closed = yield* Effect.exit(Scope.close(live.value.scope, Exit.void));\n\n yield* apply({ _tag: \"Released\", number: live.number, released });\n if (released !== undefined) yield* Deferred.succeed(live.value.released, released);\n yield* Exit.asVoidAll([...cleaned, closed]);\n});\n\nconst admissionAfter = <A>(state: State<A>) => {\n const released = state.released;\n\n const pending = [...state.draining.values()]\n .filter((drain) => drain._tag !== \"Leaving\")\n .map(({ live }) => live.value.released);\n\n return pending.length === 0 && released === undefined\n ? undefined\n : Effect.gen(function* () {\n let outcome = released;\n\n for (const release of pending)\n outcome = Lifecycle.combine(outcome, yield* Deferred.await(release));\n\n return outcome ?? new Lifecycle.Settled();\n });\n};\n\nconst makeScoped = Effect.fn(\"Supervisor.make\")(function* <E, R, A>(\n options: MakeOptions<E, R, A>,\n): Effect.fn.Return<Supervisor<A | void>, never, Scope.Scope | Exclude<R, Scope.Scope>> {\n const clock = yield* Clock.Clock;\n const now = () => Number(clock.monotonicTimeNanosUnsafe()) / 1e6;\n const context = yield* Effect.context<Exclude<R, Scope.Scope>>();\n const own = yield* Scope.fork(yield* Effect.scope);\n const exclusive = options.exclusive ?? false;\n\n const reopen: Schedule.Schedule<unknown, E> =\n options.reopen ??\n Schedule.exponential(\"1 second\").pipe(Schedule.upTo({ duration: Duration.minutes(5) }));\n\n const rotateBefore =\n options.rotateBefore === undefined ? undefined : Duration.fromInputUnsafe(options.rotateBefore);\n\n const waitTimeout = yield* bounded(options.waitTimeout ?? Duration.minutes(2), \"waitTimeout\");\n\n const handover = Duration.toMillis(\n yield* bounded(options.handover ?? Duration.seconds(30), \"handover\"),\n );\n\n const started = Lifecycle.start<Held<A | void>, Hold>();\n const state = yield* SubscriptionRef.make(started.state);\n const applying = yield* Semaphore.make(1);\n const events = yield* PubSub.unbounded<Take.Take<Generation>>({ replay: 64 });\n const opening = yield* FiberHandle.make<unknown, never>();\n const releases = yield* FiberMap.make<number, unknown, never>();\n const runOpen = yield* FiberHandle.runtime(opening)();\n const runRelease = yield* FiberMap.runtime(releases)();\n\n const apply: Apply<A | void> = Effect.fnUntraced(\n function* (input: Input<A | void>) {\n const current = state.value;\n const step = Lifecycle.transition(current, input, exclusive, now(), handover);\n\n if (step.state !== current) yield* SubscriptionRef.set(state, step.state);\n yield* perform(step);\n\n return step;\n },\n (effect) => applying.withPermit(effect),\n Effect.uninterruptible,\n Effect.provideService(Clock.Clock, clock),\n );\n\n const perform = Effect.fnUntraced(function* (step: Step<A | void>): Effect.fn.Return<void> {\n for (const [number, generation] of step.events)\n PubSub.publishUnsafe(events, [\n new Generation({\n number,\n at: clock.currentTimeMillisUnsafe(),\n hostTime: now(),\n state: generation,\n }),\n ]);\n for (const command of step.commands)\n switch (command._tag) {\n case \"Open\":\n runOpen(openGeneration(command.number));\n break;\n case \"Watch\":\n yield* Effect.forkIn(\n Effect.provideContext(watchGeneration(command.live, rotateBefore, apply), context),\n command.live.value.scope,\n );\n break;\n case \"Drain\": {\n const ending = superseded(command.live.number, command.ending);\n\n yield* Deferred.succeed(command.live.value.ending, ending);\n yield* Effect.forkIn(\n until(ending.revokeAt, now).pipe(\n Effect.andThen(\n Effect.suspend(() => apply({ _tag: \"Revoke\", number: command.live.number })),\n ),\n ),\n command.live.value.scope,\n );\n break;\n }\n case \"Release\":\n case \"Leave\":\n yield* Deferred.succeed(\n command.live.value.revoked,\n superseded(command.live.number, command.ending),\n );\n runRelease(command.live.number, releaseGeneration(command, state, apply));\n break;\n }\n });\n\n const openGeneration = (number: number) => {\n const openOnce = acquireGeneration(\n Effect.gen(function* () {\n const after = admissionAfter(state.value);\n\n if (exclusive && after !== undefined) yield* after;\n yield* options.admit?.({ number, after }) ?? Effect.void;\n\n return yield* options.open.pipe(\n Effect.provideService(Releasing, {\n released: (released) =>\n apply({ _tag: \"AttemptReleased\", number, released }).pipe(Effect.asVoid),\n }),\n );\n }),\n own,\n ).pipe(Effect.provideContext(context));\n\n return Effect.uninterruptibleMask((restore) =>\n restore(\n Effect.retry(openOnce, {\n schedule: reopen,\n while: (error) => !options.definite?.(error),\n }),\n ).pipe(\n Effect.exit,\n Effect.flatMap((exit) => {\n if (Exit.isSuccess(exit))\n return apply({ _tag: \"Opened\", live: { number, value: exit.value } });\n const cause = exit.cause;\n\n return apply(\n Cause.hasInterruptsOnly(cause)\n ? { _tag: \"Abandoned\", number }\n : { _tag: \"Failed\", number, detail: describe(cause), cause: Cause.squash(cause) },\n );\n }),\n ),\n );\n };\n\n const end = yield* Effect.cached(PubSub.publish(events, Exit.void));\n\n const stop = Effect.fnUntraced(function* (input: Input<A | void>) {\n yield* apply(input);\n yield* FiberHandle.clear(opening);\n yield* FiberMap.awaitEmpty(releases);\n if (yield* Deferred.isDone(releases.deferred)) yield* FiberMap.join(releases);\n }, Effect.ensuring(end));\n\n const retire = yield* Effect.cached(stop({ _tag: \"Retire\" }));\n\n // The browser of the generation serving, or of the one `target` names once it serves.\n const browserOf = (target?: number) =>\n Effect.map(waitFor(state, waitTimeout, clock, target), (live) => live.value.opened.browser);\n\n yield* Effect.addFinalizer(() => (options.keep === true ? stop({ _tag: \"Keep\" }) : retire));\n yield* perform(started);\n\n return {\n browser: browserOf(),\n use: leasing(state, apply, waitTimeout, now, clock),\n states: Stream.fromPubSubTake(events),\n rotate: apply({ _tag: \"Rotate\" }).pipe(\n Effect.flatMap(({ reply }) =>\n reply === undefined ? Effect.fail(retired()) : browserOf(reply),\n ),\n ),\n retire,\n };\n});\n\n/** Supervise scoped generation values. Browser-only providers retain their existing void value. */\nexport function make<E, R, A = void>(\n options: Options<E, R, A>,\n): Effect.Effect<Supervisor<A>, never, Scope.Scope | Exclude<R, Scope.Scope>>;\n\nexport function make<E, R>(\n options: MakeOptions<E, R, never>,\n): Effect.Effect<Supervisor<void>, never, Scope.Scope | Exclude<R, Scope.Scope>>;\n\nexport function make<E, R, A>(options: MakeOptions<E, R, A>) {\n return makeScoped(options);\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAa,UAAb,cAA6B,OAAO,YAAqB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;;AAG3E,IAAa,cAAb,cAAiC,OAAO,YAAyB,CAAC,CAAC,eAAe,EAChF,QAAQ,OAAO,OACjB,CAAC,CAAC,CAAC,CAAC;AAEJ,MAAa,WAAW,OAAO,MAAM,CAAC,SAAS,WAAW,CAAC;;AAK3D,IAAa,UAAb,cAA6B,OAAO,YAAqB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;;AAG3E,IAAa,YAAb,cAA+B,OAAO,YAAuB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;;AAGjF,IAAa,OAAb,cAA0B,OAAO,YAAkB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;;AAGlE,IAAa,WAAb,cAA8B,OAAO,YAAsB,CAAC,CAAC,YAAY;CACvE,QAAQ,OAAO,SAAS;EAAC;EAAW;EAAQ;CAAS,CAAC;CACtD,UAAU,OAAO;AACnB,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,OAAb,cAA0B,OAAO,YAAkB,CAAC,CAAC,QAAQ;CAC3D,OAAO,OAAO,MAAM,CAAC,iBAAiB,OAAO,QAAQ,UAAU,CAAC,CAAC;CACjE,QAAQ,OAAO,SAAS,OAAO,MAAM;AACvC,CAAC,CAAC,CAAC,CAAC;;;;;;AAOJ,IAAa,OAAb,cAA0B,OAAO,YAAkB,CAAC,CAAC,QAAQ;CAC3D,QAAQ,OAAO;CACf,OAAO,OAAO,OAAO;CACrB,UAAU,OAAO,SAAS,QAAQ;AACpC,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,SAAb,cAA4B,OAAO,YAAoB,CAAC,CAAC,UAAU,EACjE,UAAU,OAAO,SAAS,QAAQ,EACpC,CAAC,CAAC,CAAC,CAAC;;;;;AAMJ,IAAa,OAAb,cAA0B,OAAO,YAAkB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAElE,MAAa,kBAAkB,OAAO,MAAM;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AA0FD,MAAa,eAA2C;CACtD,OAAO;EAAE,MAAM;EAAW,QAAQ;EAAG,SAAS,KAAA;EAAW,0BAAU,IAAI,IAAI;CAAE;CAC7E,QAAQ,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;CAC3B,UAAU,CAAC;EAAE,MAAM;EAAQ,QAAQ;CAAE,CAAC;AACxC;AAEA,MAAM,aAAmB,UACvB,MAAM,SAAS,YAAY,KAAA,IAAY,MAAM;;AAG/C,MAAa,UAAgB,OAAoB,WAC/C,UAAU,KAAK,CAAC,EAAE,WAAW,SAAS,UAAU,KAAK,IAAI,MAAM,SAAS,IAAI,MAAM,CAAC,EAAE;;AAevF,MAAM,YAAkB,QAAsB,UAAuB;CACnE,MAAM,SAAS,OAAO,MAAM,SAAS,IAAI,MAAM,KAAK,MAAM;CAC1D,MAAM,EAAE,MAAM,QAAQ,SAAS;CAE/B,OAAO,QAAQ;EACb,GAAG,OAAO;EACV,UAAU,IAAI,IAAI,OAAO,MAAM,QAAQ,CAAC,CAAC,IAAI,KAAK,QAAQ,KAAK;CACjE;CACA,IAAI,QAAQ,WAAW,QAAQ;EAC7B,OAAO,OAAO,KAAK,CAAC,KAAK,QAAQ,MAAM,CAAC;EACxC,OAAO,SAAS,KAAK;GAAE,MAAM;GAAS;GAAM;EAAO,CAAC;CACtD;CACA,IAAI,SAAS,cAAc,QAAQ,SAAS,MAC1C,OAAO,SAAS,KAAK;EAAE,MAAM,SAAS,YAAY,UAAU;EAAW;EAAM;CAAO,CAAC;AACzF;AAEA,MAAM,OACJ,QACA,MACA,QACA,OAAO,UACJ;CACH,MAAM,SAAS,IAAI,SAAS;EAC1B;EACA,UAAU,OAAO,OAAO,WAAW,YAAY,OAAO,WAAW;CACnE,CAAC;CAED,SAAS,QAAQ;EACf;EACA;EACA,MAAM,OACF,YACA,KAAK,MAAM,SAAS,KAAK,OAAO,YAAY,OAAO,MACjD,cACA;CACR,CAAC;AACH;AAEA,MAAM,UAAgB,QAAsB,QAAgB,WAAgC;CAC1F,MAAM,QAAQ,OAAO,MAAM,SAAS,IAAI,MAAM;CAE9C,IAAI,OAAO,SAAS,cAAe,WAAW,KAAA,KAAa,OAAO,MAAM,MAAM,OAAO,UACnF;CACF,SAAS,QAAQ;EACf,GAAG;EACH,MAAM;EACN,QAAQ,WAAW,KAAA,IAAY,MAAM,SAAS,IAAI,SAAS;GAAE;GAAQ,UAAU,OAAO;EAAI,CAAC;CAC7F,CAAC;AACH;AAEA,MAAM,SACJ,QACA,UACG;CACH,MAAM,SAAS,MAAM,UAAU,UAAU,OAAO,KAAK,CAAC,EAAE;CACxD,MAAM,OAAO,WAAW,KAAA,IAAY,KAAA,IAAY,OAAO,OAAO,OAAO,MAAM;CAE3E,IAAI,SAAS,KAAA,GAAW;CACxB,MAAM,QAAQ,OAAO,MAAM,SAAS,IAAI,KAAK,MAAM;CAEnD,IACE,MAAM,SAAS,UACf,UAAU,KAAA,MACT,MAAM,SAAS,cAAc,OAAO,OAAO,MAAM,OAAO,WAEzD;CACF,IAAI,KAAK,MAAM,IAAI,MAAM,IAAI,OAAO,MAAM,SAAS,SAAS;CAC5D,MAAM,QAAQ,IAAI,IAAI,KAAK,KAAK;CAEhC,IAAI,MAAM,SAAS,QAAQ;EACzB,MAAM,IAAI,MAAM,IAAI;EACpB,OAAO,WAAW;CACpB,OAAO,MAAM,OAAO,MAAM,IAAI;CAC9B,MAAM,OAAO;EAAE,GAAG;EAAM;CAAM;CAE9B,IAAI,UAAU,KAAA,GACZ,SAAS,QAAQ;EACf,GAAG;EACH,MAAM;EACN,MAAM,MAAM,SAAS,cAAc,MAAM,SAAS,IAAI,cAAc,MAAM;CAC5E,CAAC;MACE,IAAI,OAAO,MAAM,SAAS,WAAW,OAAO,QAAQ;EAAE,GAAG,OAAO;EAAO,SAAS;CAAK;AAC5F;AAEA,MAAM,QAAc,QAAsB,QAAgB,WAAoB;CAC5E,MAAM,EAAE,cAAc;CACtB,MAAM,UAAU,UAAU,OAAO,KAAK;CAEtC,IAAI,YAAY,KAAA,MAAc,UAAU,YACtC,IAAI,QAAQ,SAAS,SAAS,SAAS,SAAS;CAClD,OAAO,QAAQ;EACb,MAAM;EACN;EACA,SAAS,UAAU,YAAY,KAAA,IAAY;EAC3C,UAAU,OAAO,MAAM;EACvB,UAAU,OAAO,MAAM;EACvB,UAAU,OAAO,MAAM;CACzB;CACA,OAAO,OAAO,KAAK,CAAC,QAAQ,SAAS,IAAI,UAAU,IAAI,IAAI,QAAQ,CAAC,CAAC;CACrE,OAAO,SAAS,KAAK;EAAE,MAAM;EAAQ;CAAO,CAAC;AAC/C;AAEA,MAAM,QACJ,QACA,UACG;CACH,MAAM,EAAE,UAAU;CAClB,MAAM,QAAQ,MAAM,SAAS,IAAI,MAAM,MAAM;CAC7C,MAAM,UAAU,UAAU,KAAK;CAE/B,IAAI,MAAM,UAAU,cAAc,SAAS,WAAW,MAAM,QAAQ;CACpE,IAAI,OAAO,SAAS,YAAY;EAC9B,OAAO,OAAO,KAAK,CAAC,MAAM,QAAQ,IAAI,KAAK,EAAE,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC;EACnE,OAAO,QAAQ,MAAM,QAAQ,MAAM;CACrC,OAAO,IAAI,MAAM,SAAS,aAAa,SAAS,WAAW,MAAM,QAAQ;EACvE,OAAO,OAAO,KAAK,CAAC,MAAM,QAAQ,IAAI,KAAK;GAAE,OAAO,MAAM;GAAO,QAAQ,MAAM;EAAO,CAAC,CAAC,CAAC;EACzF,IAAI,MAAM,SAAS,WACjB,KAAK,SAAS,MAAM,SAAS,SAAS,QAAQ,SAAS,MAAM,UAAU,GAAG,IAAI;OAC3E;GACH,OAAO,QAAQ;IAAE,GAAG;IAAO,SAAS,KAAA;GAAU;GAC9C,IAAI,QAAQ,SAAS,MAAM;EAC7B;CACF;AACF;;AAGA,MAAM,iBAAuB,QAAsB,WAAmB;CACpE,MAAM,WAAW,IAAI,IAAI,OAAO,MAAM,QAAQ;CAC9C,MAAM,WAAW,SAAS,IAAI,MAAM;CAEpC,SAAS,OAAO,MAAM;CACtB,OAAO,QAAQ;EAAE,GAAG,OAAO;EAAO;CAAS;CAE3C,OAAO;AACT;;AAGA,MAAa,cACX,OACA,OACA,WACA,MAAM,GACN,WAAW,QACI;CACf,MAAM,SAAuB;EAC3B;EACA,QAAQ,CAAC;EACT,UAAU,CAAC;EACX;EACA;EACA;CACF;CAEA,QAAQ,MAAM,MAAd;EACE,KAAK;EACL,KAAK;GACH,MAAM,QAAQ,KAAK;GACnB;EACF,KAAK;GACH,OAAO,QAAQ,MAAM,MAAM;GAC3B;EACF,KAAK,UAAU;GACb,MAAM,OAAO;IAAE,GAAG,MAAM;IAAM,uBAAO,IAAI,IAAO;GAAE;GAElD,IAAI,OAAO,OAAO,KAAK,MAAM,MAAM,KAAA,GAAW;GAC9C,IAAI,MAAM,SAAS,aAAa,MAAM,WAAW,KAAK,QAAQ,IAAI,QAAQ,MAAM,SAAS;QACpF;IACH,cAAc,QAAQ,KAAK,MAAM;IACjC,OAAO,OAAO,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC;IAC5C,OAAO,SAAS,KAAK;KAAE,MAAM;KAAS;IAAK,CAAC;IAC5C,IAAI,MAAM,YAAY,KAAA,GAAW,IAAI,QAAQ,MAAM,SAAS,SAAS;IACrE,OAAO,QAAQ;KACb,MAAM;KACN,SAAS;KACT,UAAU,OAAO,MAAM;KACvB,UAAU,OAAO,MAAM;KACvB,UAAU,OAAO,MAAM;IACzB;GACF;GACA;EACF;EACA,KAAK,UAAU;GACb,MAAM,EAAE,QAAQ,QAAQ,UAAU;GAElC,IAAI,MAAM,SAAS,aAAa,MAAM,WAAW,QAC/C,OAAO,QAAQ;IAAE,GAAG;IAAO,MAAM;IAAQ;IAAQ;GAAM;GACzD,OAAO,OAAO,KAAK,CACjB,QACA,IAAI,KAAK;IAAE;IAAQ;IAAO,UAAU,cAAc,QAAQ,MAAM;GAAE,CAAC,CACrE,CAAC;GACD;EACF;EACA,KAAK;GACH,OAAO,OAAO,KAAK,CACjB,MAAM,QACN,IAAI,OAAO,EAAE,UAAU,cAAc,QAAQ,MAAM,MAAM,EAAE,CAAC,CAC9D,CAAC;GACD;EACF,KAAK;GACH,OAAO,QAAQ;IACb,GAAG;IACH,UAAU,QAAQ,MAAM,UAAU,MAAM,QAAQ;IAChD,UAAU,IAAI,IAAI,MAAM,QAAQ,CAAC,CAAC,IAChC,MAAM,QACN,QAAQ,MAAM,UAAU,IAAI,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3D;GACF;GACA;EACF,KAAK,YAAY;GACf,MAAM,EAAE,QAAQ,aAAa;GAC7B,MAAM,QAAQ,MAAM,SAAS,IAAI,MAAM;GAEvC,IAAI,UAAU,KAAA,KAAa,MAAM,SAAS,cAAc,MAAM,KAAK,MAAM,OAAO,GAAG;GACnF,MAAM,WAAW,IAAI,IAAI,MAAM,QAAQ;GAEvC,SAAS,OAAO,MAAM;GACtB,OAAO,QAAQ;IAAE,GAAG;IAAO;IAAU,UAAU,QAAQ,MAAM,UAAU,QAAQ;GAAE;GACjF,MAAM,UAAU,QAAQ,cAAc,QAAQ,MAAM,GAAG,QAAQ;GAE/D,OAAO,OAAO,KAAK,CACjB,QACA,aAAa,KAAA,IAAY,IAAI,KAAK,IAAI,IAAI,OAAO,EAAE,UAAU,QAAQ,CAAC,CACxE,CAAC;GACD;EACF;EACA,KAAK;GACH,KAAK,QAAQ,KAAK;GAClB;EACF,KAAK;GACH,IACE,MAAM,SAAS,aACd,MAAM,QAAQ,KAAA,MAAc,MAAM,SAAS,UAAU,MAAM,QAAQ,WAAW,MAAM,MAErF;GACF,OAAO,QACL,MAAM,SAAS,YACX,MAAM,UACL,MAAM,SAAS,SAAS,MAAM,QAAQ,SAAS,MAAM,UAAU;GACtE,IAAI,MAAM,SAAS,WAAW,KAAK,QAAQ,OAAO,OAAO,KAAK;GAC9D;EAEF,KAAK;EACL,KAAK;GACH,IAAI,MAAM,SAAS,WAAW;GAC9B,KAAK,MAAM,UAAU,MAAM,SAAS,KAAK,GAAG,OAAO,QAAQ,QAAQ,SAAS;GAC5E,IAAI,MAAM,YAAY,KAAA,GAAW,IAAI,QAAQ,MAAM,SAAS,WAAW,MAAM,SAAS,MAAM;GAC5F,OAAO,QAAQ;IACb,MAAM;IACN,UAAU,OAAO,MAAM;IACvB,UAAU,OAAO,MAAM;IACvB,UAAU,OAAO,MAAM;GACzB;CACJ;CAEA,OAAO;AACT;AAUA,SAAgB,QAAQ,QAA8B,MAA4B;CAChF,OAAO,QAAQ,SAAS,gBAAgB,SAAU,QAAQ;AAC5D;;AAYA,MAAa,WACX,OACA,WAC8B;CAC9B,IAAI,MAAM,SAAS,WACjB,OAAO;EAAE,MAAM;EAAe,QAAQ;EAAW,QAAQ;CAA6B;CACxF,IACE,MAAM,YAAY,KAAA,MACjB,WAAW,KAAA,KAAc,MAAM,SAAS,UAAU,MAAM,QAAQ,UAAU,SAE3E,OAAO;EAAE,MAAM;EAAS,MAAM,MAAM;CAAQ;CAC9C,IAAI,MAAM,SAAS,WAAW,WAAW,KAAA,KAAa,MAAM,UAAU,SACpE,OAAO;EAAE,MAAM;EAAe,QAAQ;EAAQ,QAAQ,MAAM;EAAQ,OAAO,MAAM;CAAM;AAG3F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACraA,IAAa,aAAb,cAAgC,OAAO,MAAkB,2BAA2B,CAAC,CAAC;CACpF,QAAQ,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC;CAChD,IAAI,OAAO;CACX,UAAU,OAAO;CACjB,OAAOA;AACT,CAAC,CAAC,CAAC,CAAC;;;;;AAMJ,IAAa,cAAb,cAAiC,OAAO,YAAyB,CAAC,CAAC,eAAe;CAChF,QAAQ,OAAO,SAAS;EAAC;EAAW;EAAQ;CAAS,CAAC;CACtD,QAAQ,OAAO;CACf,OAAO,OAAO,SAAS,OAAO,OAAO,CAAC;AACxC,CAAC,CAAC,CAAC;CACD,IAAa,UAAU;EACrB,OAAO,eAAe,KAAK;CAC7B;AACF;;;;;;;AA+BA,IAAa,YAAb,cAA+B,QAAQ,QAGrC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC;;AAkC5C,IAAa,aAAb,cAAgC,OAAO,YAAwB,CAAC,CAAC,cAAc;CAC7E,YAAY,OAAO;CACnB,QAAQ,OAAO,SAAS;EAAC;EAAW;EAAQ;CAAS,CAAC;CACtD,UAAU,OAAO;AACnB,CAAC,CAAC,CAAC,CAAC;AAoDJ,MAAM,cAAc,YAAoB,EAAE,QAAQ,eAChD,IAAI,WAAW;CAAE;CAAY;CAAQ;AAAS,CAAC;AAEjD,MAAM,gBAAgB,IAAI,YAAY;CAAE,QAAQ;CAAW,QAAQ;AAA6B,CAAC;AAEjG,MAAM,YAAY,UAAgC;CAChD,MAAM,QAAQ,MAAM,OAAO,KAAK;CAEhC,OAAO,UAAU,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;AAChE;AAEA,MAAM,iBACJ,IAAI,YAAY;CAAE,QAAQ;CAAW,QAAQ;AAAuC,CAAC;AAEvF,MAAM,WAAW,OAAuB,SACtC,OAAO,cAAc;CACnB,MAAM,WAAW,SAAS,UAAU,KAAK;CAEzC,OAAO,OAAO,OAAO,QAAQ,KAC3B,SAAS,SAAS,SAAS,KAAK,KAChC,CAAC,SAAS,WAAW,SAAS,KAAK,IACjC,OAAO,QAAQ,SAAS,KAAK,IAC7B,OAAO,oBAAI,IAAI,WAAW,GAAG,KAAK,uCAAuC,CAAC;AAChF,CAAC;;AAGH,MAAM,WACJ,OACA,MACA,OACA,WACG;CACH,MAAM,UAAU,eACd,WAAW,SAAS,UAChB,OAAO,QAAQ,WAAW,IAAI,IAC9B,OAAO,KAAK,IAAI,YAAY,UAAU,CAAC;CAE7C,OAAO,OAAO,cAAc;EAC1B,MAAM,UAAUC,QAAkB,MAAM,OAAO,MAAM;EAErD,OAAO,YAAY,KAAA,IACf,gBAAgB,QAAQ,KAAK,CAAC,CAAC,KAC7B,OAAO,KAAK,UAAUA,QAAkB,OAAO,MAAM,CAAC,GACtD,OAAO,OAAO,UAAU,cAAc,GACtC,OAAO,SACP,OAAO,QAAQ,OAAO,MAAM;GAAE,cAAc,OAAO,KAAK,QAAQ,CAAC;GAAG,QAAQ;EAAO,CAAC,CAAC,GACrF,OAAO,cAAc;GAAE,UAAU;GAAM,cAAc,OAAO,KAAK,SAAS,CAAC;EAAE,CAAC,CAChF,IACA,OAAO,OAAO;CACpB,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,MAAM,OAAO,KAAK,CAAC;AACnD;;AAGA,MAAM,iBAAiB,WAAyB,WAC9C,MAAM,kBAAkB,KACtB,OAAO,SAAS,QAAQ;CACtB,MAAM,OAAO,SAAS,cAAc,SAAS,IAAI;CAEjD,OAAO,OAAO,MAAM,SAAS,OAAO,KAAK,IAAI,OAAO,SAAS,SAAS,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;AAC9F,CAAC,CACH;;AAGF,MAAM,SAAS,IAAY,QACzB,OAAO,cACL,IAAI,KAAK,KACL,OAAO,OACP,OAAO,MAAM,SAAS,OAAO,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,QAAQ,MAAM,IAAI,GAAG,CAAC,CAAC,CAC9F;;AAGF,MAAM,WACJ,OACA,OACA,aACA,KACA,UACG;CACH,MAAM,SAAS,OAAO,WAAW,WAAW,MAAY,MAAyB;EAC/E,MAAM,QAAQ,IAAI,IAAI,SAAS,SAAS,IAAI;EAE5C,SAAS;GACP,MAAM,OAAO,OAAO,MAAM;IAAE,MAAM;IAAQ;GAAK,CAAC;GAEhD,IAAI,KAAK,aAAa,KAAA,GAAW,OAAO,KAAK;GAC7C,OAAO,QAAQ,OAAO,SAAS,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KACxE,OAAO,aACT;GACA,IAAI,IAAI,KAAK,OAAO,OAAO,OAAO,SAAS;EAC7C;CACF,CAAC;CAED,MAAM,WAAW,UAA6C;EAC5D,YAAY,KAAK;EACjB,SAAS,KAAK,MAAM,OAAO;EAC3B,OAAO,KAAK,MAAM,OAAO;EACzB,OAAO,WACL,MAAM;GAAE,MAAM;GAAQ,QAAQ,KAAK;GAAQ,OAAO;GAAY;EAAO,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM;EAC5F,QAAQ,SAAS,MAAM,KAAK,MAAM,MAAM;EACxC,QAAQ,OAAO,gBACb,OAAO,IAAI,aAAa;GACtB,MAAM,QAAQ,OAAO,MAAM,KAAK;GAChC,MAAM,OAAa;IAAE,MAAM;IAAY;GAAM;GAG7C,KAAI,OAFgB,MAAM;IAAE,MAAM;IAAQ,QAAQ,KAAK;IAAQ;GAAK,CAAC,EAAA,CAE5D,aAAa,KAAA,GAAW;IAC/B,OAAO,MAAM,MAAM,OAAO,KAAK,IAAI;IAEnC,OAAO,OAAO,OAAO,SAAS,MAAM,KAAK,MAAM,MAAM;GACvD;GACA,OAAO,MAAM,aACX,OACA,MAAM;IAAE,MAAM;IAAO,QAAQ,KAAK;IAAQ;GAAK,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,CACtE;GAEA,OAAO;EACT,CAAC,CACH;CACF;CAEA,MAAM,OAA6B,MAAM,UAAU,CAAC,MAClD,OAAO,OACL,OAAO,IAAI,aAAa;EACtB,MAAM,OAAa,EAAE,MAAM,MAAM;EACjC,MAAM,OAAO,OAAO,QAAQ,QAAQ,QAAQ,aAAa,MAAM;EAE/D,MAAM,OAAO,OAAO,OAAO,eAAe,OAAO,MAAM,IAAI,IAAI,SAC7D,MAAM;GAAE,MAAM;GAAO,QAAQ,KAAK;GAAQ;EAAK,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,CACtE;EAEA,MAAM,UAAU,SAAS,MAAM,KAAK,MAAM,OAAO,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,IAAI,CAAC;EAEnF,OAAO,OAAO,OAAO,UACnB,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,KAElB,OAAO,UACL,SAAS,OAAO,KAAK,MAAM,OAAO,CAAC,CAAC,KAClC,OAAO,SAAS,SAAU,OAAO,UAAU,OAAO,IAAK,CACzD,CACF,CACF,GACA,OACF;CACF,CAAC,CACH;CAEF,OAAO;AACT;AAOA,MAAM,qBACJ,MACA,QAEA,OAAO,qBAAqB,YAC1B,OAAO,QAAQ,MAAM,KAAK,GAAG,IAAI,UAC/B,QAAQ,KAAK,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,KACvC,OAAO,SAAS,UAAU,MAAM,MAAM,OAAO,KAAK,UAAU,KAAK,CAAC,CAAC,GACnE,OAAO,KAAK,YAA4B;CACtC,QAAQ;EAAE,GAAG;EAAQ,OAAO,WAAW,SAAS,OAAO,QAAQ,KAAA;CAAU;CACzE;CACA,QAAQ,SAAS,WAAuB;CACxC,SAAS,SAAS,WAAuB;CACzC,UAAU,SAAS,WAA+B;AACpD,EAAE,CACJ,CACF,CACF;AAEF,MAAM,mBACJ,MACA,cACA,UACG;CACH,MAAM,EAAE,YAAY,KAAK,MAAM;CAE/B,MAAM,OAAO,QAAQ,aAAa,KAChC,OAAO,SAAS,UAAU,MAAM;EAAE,MAAM;EAAQ,QAAQ,KAAK;EAAQ;CAAM,CAAC,CAAC,CAC/E;CAEA,MAAM,WACJ,QAAQ,cAAc,KAAA,KAAa,iBAAiB,KAAA,IAChD,OAAO,OACP,cAAc,QAAQ,WAAW,YAAY,CAAC,CAAC,KAC7C,OAAO,QAAQ,MAAM;EAAE,MAAM;EAAU,KAAK,KAAK;CAAO,CAAC,CAAC,CAC5D;CAEN,OAAO,OAAO,IAAI,CAAC,MAAM,QAAQ,GAAG;EAAE,aAAa;EAAG,SAAS;CAAK,CAAC;AACvE;AAGA,MAAM,oBAAoB,OAAO,WAAW,WAC1C,SACA,OACA,OACA;CACA,MAAM,EAAE,SAAS;CAEjB,MAAM,UAAU,OAAO,OAAO,QAC5BC,OAAiB,MAAM,OAAO,KAAK,MAAM,CAAC,EAAE,SAAS,CAAC,IACrD,SACC,OAAO,KAAK,KAAK,SAAS,aAAa,MAAM,MAAM,KAAK,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,GACzF,EAAE,aAAa,EAAE,CACnB;CAEA,OAAO,gBAAgB,QAAQ,KAAK,CAAC,CAAC,KACpC,OAAO,QAAQ,aAAaA,OAAiB,SAAS,KAAK,MAAM,CAAC,EAAE,MAAM,QAAQ,OAAO,CAAC,GAC1F,OAAO,OACT;CAEA,MAAM,WACJ,QAAQ,SAAS,UACb,KAAA,IACA,QAAQ,KAAK,MAAM,OAAO,WAAW,OAAO,QAAQ,IAAIC,QAAkB,CAAC,EAAA,CAAG,KAC5E,OAAO,YAAY,UACjB,OAAO,QACL,IAAIC,YAAsB,EAAE,QAAQ,uBAAuB,SAAS,KAAK,IAAI,CAAC,CAChF,CACF,CACF;CAEN,MAAM,SAAS,OAAO,OAAO,KAAK,MAAM,MAAM,KAAK,MAAM,OAAO,KAAK,IAAI,CAAC;CAE1E,OAAO,MAAM;EAAE,MAAM;EAAY,QAAQ,KAAK;EAAQ;CAAS,CAAC;CAChE,IAAI,aAAa,KAAA,GAAW,OAAO,SAAS,QAAQ,KAAK,MAAM,UAAU,QAAQ;CACjF,OAAO,KAAK,UAAU,CAAC,GAAG,SAAS,MAAM,CAAC;AAC5C,CAAC;AAED,MAAM,kBAAqB,UAAoB;CAC7C,MAAM,WAAW,MAAM;CAEvB,MAAM,UAAU,CAAC,GAAG,MAAM,SAAS,OAAO,CAAC,CAAC,CACzC,QAAQ,UAAU,MAAM,SAAS,SAAS,CAAC,CAC3C,KAAK,EAAE,WAAW,KAAK,MAAM,QAAQ;CAExC,OAAO,QAAQ,WAAW,KAAK,aAAa,KAAA,IACxC,KAAA,IACA,OAAO,IAAI,aAAa;EACtB,IAAI,UAAU;EAEd,KAAK,MAAM,WAAW,SACpB,UAAUC,QAAkB,SAAS,OAAO,SAAS,MAAM,OAAO,CAAC;EAErE,OAAO,WAAW,IAAIF,QAAkB;CAC1C,CAAC;AACP;AAEA,MAAM,aAAa,OAAO,GAAG,iBAAiB,CAAC,CAAC,WAC9C,SACsF;CACtF,MAAM,QAAQ,OAAO,MAAM;CAC3B,MAAM,YAAY,OAAO,MAAM,yBAAyB,CAAC,IAAI;CAC7D,MAAM,UAAU,OAAO,OAAO,QAAiC;CAC/D,MAAM,MAAM,OAAO,MAAM,KAAK,OAAO,OAAO,KAAK;CACjD,MAAM,YAAY,QAAQ,aAAa;CAEvC,MAAM,SACJ,QAAQ,UACR,SAAS,YAAY,UAAU,CAAC,CAAC,KAAK,SAAS,KAAK,EAAE,UAAU,SAAS,QAAQ,CAAC,EAAE,CAAC,CAAC;CAExF,MAAM,eACJ,QAAQ,iBAAiB,KAAA,IAAY,KAAA,IAAY,SAAS,gBAAgB,QAAQ,YAAY;CAEhG,MAAM,cAAc,OAAO,QAAQ,QAAQ,eAAe,SAAS,QAAQ,CAAC,GAAG,aAAa;CAE5F,MAAM,WAAW,SAAS,SACxB,OAAO,QAAQ,QAAQ,YAAY,SAAS,QAAQ,EAAE,GAAG,UAAU,CACrE;CAEA,MAAM,UAAUG,MAAsC;CACtD,MAAM,QAAQ,OAAO,gBAAgB,KAAK,QAAQ,KAAK;CACvD,MAAM,WAAW,OAAO,UAAU,KAAK,CAAC;CACxC,MAAM,SAAS,OAAO,OAAO,UAAiC,EAAE,QAAQ,GAAG,CAAC;CAC5E,MAAM,UAAU,OAAO,YAAY,KAAqB;CACxD,MAAM,WAAW,OAAO,SAAS,KAA6B;CAC9D,MAAM,UAAU,OAAO,YAAY,QAAQ,OAAO,CAAC,CAAC;CACpD,MAAM,aAAa,OAAO,SAAS,QAAQ,QAAQ,CAAC,CAAC;CAErD,MAAM,QAAyB,OAAO,WACpC,WAAW,OAAwB;EACjC,MAAM,UAAU,MAAM;EACtB,MAAM,OAAOC,WAAqB,SAAS,OAAO,WAAW,IAAI,GAAG,QAAQ;EAE5E,IAAI,KAAK,UAAU,SAAS,OAAO,gBAAgB,IAAI,OAAO,KAAK,KAAK;EACxE,OAAO,QAAQ,IAAI;EAEnB,OAAO;CACT,IACC,WAAW,SAAS,WAAW,MAAM,GACtC,OAAO,iBACP,OAAO,eAAe,MAAM,OAAO,KAAK,CAC1C;CAEA,MAAM,UAAU,OAAO,WAAW,WAAW,MAA8C;EACzF,KAAK,MAAM,CAAC,QAAQ,eAAe,KAAK,QACtC,OAAO,cAAc,QAAQ,CAC3B,IAAI,WAAW;GACb;GACA,IAAI,MAAM,wBAAwB;GAClC,UAAU,IAAI;GACd,OAAO;EACT,CAAC,CACH,CAAC;EACH,KAAK,MAAM,WAAW,KAAK,UACzB,QAAQ,QAAQ,MAAhB;GACE,KAAK;IACH,QAAQ,eAAe,QAAQ,MAAM,CAAC;IACtC;GACF,KAAK;IACH,OAAO,OAAO,OACZ,OAAO,eAAe,gBAAgB,QAAQ,MAAM,cAAc,KAAK,GAAG,OAAO,GACjF,QAAQ,KAAK,MAAM,KACrB;IACA;GACF,KAAK,SAAS;IACZ,MAAM,SAAS,WAAW,QAAQ,KAAK,QAAQ,QAAQ,MAAM;IAE7D,OAAO,SAAS,QAAQ,QAAQ,KAAK,MAAM,QAAQ,MAAM;IACzD,OAAO,OAAO,OACZ,MAAM,OAAO,UAAU,GAAG,CAAC,CAAC,KAC1B,OAAO,QACL,OAAO,cAAc,MAAM;KAAE,MAAM;KAAU,QAAQ,QAAQ,KAAK;IAAO,CAAC,CAAC,CAC7E,CACF,GACA,QAAQ,KAAK,MAAM,KACrB;IACA;GACF;GACA,KAAK;GACL,KAAK;IACH,OAAO,SAAS,QACd,QAAQ,KAAK,MAAM,SACnB,WAAW,QAAQ,KAAK,QAAQ,QAAQ,MAAM,CAChD;IACA,WAAW,QAAQ,KAAK,QAAQ,kBAAkB,SAAS,OAAO,KAAK,CAAC;EAE5E;CACJ,CAAC;CAED,MAAM,kBAAkB,WAAmB;EACzC,MAAM,WAAW,kBACf,OAAO,IAAI,aAAa;GACtB,MAAM,QAAQ,eAAe,MAAM,KAAK;GAExC,IAAI,aAAa,UAAU,KAAA,GAAW,OAAO;GAC7C,OAAO,QAAQ,QAAQ;IAAE;IAAQ;GAAM,CAAC,KAAK,OAAO;GAEpD,OAAO,OAAO,QAAQ,KAAK,KACzB,OAAO,eAAe,WAAW,EAC/B,WAAW,aACT,MAAM;IAAE,MAAM;IAAmB;IAAQ;GAAS,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,EAC3E,CAAC,CACH;EACF,CAAC,GACD,GACF,CAAC,CAAC,KAAK,OAAO,eAAe,OAAO,CAAC;EAErC,OAAO,OAAO,qBAAqB,YACjC,QACE,OAAO,MAAM,UAAU;GACrB,UAAU;GACV,QAAQ,UAAU,CAAC,QAAQ,WAAW,KAAK;EAC7C,CAAC,CACH,CAAC,CAAC,KACA,OAAO,MACP,OAAO,SAAS,SAAS;GACvB,IAAI,KAAK,UAAU,IAAI,GACrB,OAAO,MAAM;IAAE,MAAM;IAAU,MAAM;KAAE;KAAQ,OAAO,KAAK;IAAM;GAAE,CAAC;GACtE,MAAM,QAAQ,KAAK;GAEnB,OAAO,MACL,MAAM,kBAAkB,KAAK,IACzB;IAAE,MAAM;IAAa;GAAO,IAC5B;IAAE,MAAM;IAAU;IAAQ,QAAQ,SAAS,KAAK;IAAG,OAAO,MAAM,OAAO,KAAK;GAAE,CACpF;EACF,CAAC,CACH,CACF;CACF;CAEA,MAAM,MAAM,OAAO,OAAO,OAAO,OAAO,QAAQ,QAAQ,KAAK,IAAI,CAAC;CAElE,MAAM,OAAO,OAAO,WAAW,WAAW,OAAwB;EAChE,OAAO,MAAM,KAAK;EAClB,OAAO,YAAY,MAAM,OAAO;EAChC,OAAO,SAAS,WAAW,QAAQ;EACnC,IAAI,OAAO,SAAS,OAAO,SAAS,QAAQ,GAAG,OAAO,SAAS,KAAK,QAAQ;CAC9E,GAAG,OAAO,SAAS,GAAG,CAAC;CAEvB,MAAM,SAAS,OAAO,OAAO,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC,CAAC;CAG5D,MAAM,aAAa,WACjB,OAAO,IAAI,QAAQ,OAAO,aAAa,OAAO,MAAM,IAAI,SAAS,KAAK,MAAM,OAAO,OAAO;CAE5F,OAAO,OAAO,mBAAoB,QAAQ,SAAS,OAAO,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,MAAO;CAC1F,OAAO,QAAQ,OAAO;CAEtB,OAAO;EACL,SAAS,UAAU;EACnB,KAAK,QAAQ,OAAO,OAAO,aAAa,KAAK,KAAK;EAClD,QAAQ,OAAO,eAAe,MAAM;EACpC,QAAQ,MAAM,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,KAChC,OAAO,SAAS,EAAE,YAChB,UAAU,KAAA,IAAY,OAAO,KAAK,QAAQ,CAAC,IAAI,UAAU,KAAK,CAChE,CACF;EACA;CACF;AACF,CAAC;AAWD,SAAgB,KAAc,SAA+B;CAC3D,OAAO,WAAW,OAAO;AAC3B"}
@@ -1,2 +1,2 @@
1
- import { _ as Settled, a as Unavailable, c as Down, d as Kept, f as Lost, g as Reopening, h as Released, l as Draining, m as Opening, n as Releasing, o as make, p as Open, r as Superseded, s as Closed, t as Generation, u as GenerationState, v as Unconfirmed } from "./Supervisor-BgWP8o9t.mjs";
1
+ import { _ as Settled, a as Unavailable, c as Down, d as Kept, f as Lost, g as Reopening, h as Released, l as Draining, m as Opening, n as Releasing, o as make, p as Open, r as Superseded, s as Closed, t as Generation, u as GenerationState, v as Unconfirmed } from "./Supervisor-2mPjIYYs.mjs";
2
2
  export { Closed, Down, Draining, Generation, GenerationState, Kept, Lost, Open, Opening, Released, Releasing, Reopening, Settled, Superseded, Unavailable, Unconfirmed, make };
@@ -1,5 +1,5 @@
1
1
  import { maximumSamples } from "./Motion.mjs";
2
- import { BrowserError, Closed, Failed, Timeout } from "./BrowserError.mjs";
2
+ import { BrowserError, Closed, Failed, InvalidRequest, Timeout } from "./BrowserError.mjs";
3
3
  import { a as redactWithin, l as make$2 } from "./url-Cd04Okid.mjs";
4
4
  import { Clock, Context, Data, Duration, Effect, Fiber, MutableRef, Option, Schema } from "effect";
5
5
  var InputFailure = class extends Data.TaggedError("InputFailure") {};
@@ -49,14 +49,11 @@ const make$1 = () => {
49
49
  const submit = (command) => {
50
50
  if (reserved < 1) throw new Error("input must reserve capacity before dispatch");
51
51
  reserved--;
52
- let response;
53
52
  try {
54
- response = command();
53
+ track(command(), true);
55
54
  } catch (cause) {
56
55
  failure ??= new InputFailure({ cause });
57
- return;
58
56
  }
59
- track(response, true);
60
57
  };
61
58
  const reserve = (commands, maximum, limit) => Effect.gen(function* () {
62
59
  yield* requireOpen;
@@ -69,12 +66,18 @@ const make$1 = () => {
69
66
  }
70
67
  reserved += commands;
71
68
  });
72
- return {
69
+ const run = {
73
70
  track,
74
71
  afterIdle: (end) => {
75
72
  if (pending.size === 0) end();
76
73
  else endings.add(end);
77
74
  },
75
+ recover: (cleanup, scope) => Effect.gen(function* () {
76
+ const replies = [...pending];
77
+ const done = Promise.withResolvers();
78
+ track(done.promise);
79
+ yield* Effect.promise(() => Promise.all(replies)).pipe(Effect.andThen(cleanup), Effect.ensuring(Effect.sync(() => done.resolve())), Effect.provideService(Current, run), Effect.interruptible, Effect.forkIn(scope));
80
+ }),
78
81
  reserve: (commands) => reserve(commands, 64, 64),
79
82
  reserveMotion: (commands) => reserve(commands, maximumSamples, 64 + maximumSamples),
80
83
  send: (command) => Effect.gen(function* () {
@@ -118,6 +121,7 @@ const make$1 = () => {
118
121
  reserved = 0;
119
122
  })
120
123
  };
124
+ return run;
121
125
  })
122
126
  };
123
127
  };
@@ -229,6 +233,8 @@ const undispatched = (operation, reason) => new BrowserError({
229
233
  dispatched: false
230
234
  });
231
235
  const failWith = (operation, reason) => Effect.fail(undispatched(operation, reason));
236
+ /** Refuse a request to `operation` that could never succeed, before sending anything. */
237
+ const refuse = (operation, detail) => failWith(operation, new InvalidRequest({ detail }));
232
238
  const decodeWith = (operation, schema) => (value) => Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError((error) => undispatched(operation, new Failed({ detail: error.message }))));
233
239
  const make = (options, scope) => {
234
240
  const { id, clock } = options;
@@ -312,6 +318,7 @@ const make = (options, scope) => {
312
318
  lane,
313
319
  pointer,
314
320
  now,
321
+ scope,
315
322
  owned,
316
323
  span,
317
324
  protocol,
@@ -323,6 +330,6 @@ const make = (options, scope) => {
323
330
  };
324
331
  };
325
332
  //#endregion
326
- export { make as a, estimate as c, toBrowserSeconds as d, toHostTime as f, make$1 as h, failWith as i, mapping as l, Current as m, contextGone as n, reasonOf as o, uncertaintyAt as p, decodeWith as r, undispatched as s, call as t, monotonicMillis as u };
333
+ export { make as a, undispatched as c, monotonicMillis as d, toBrowserSeconds as f, make$1 as g, Current as h, failWith as i, estimate as l, uncertaintyAt as m, contextGone as n, reasonOf as o, toHostTime as p, decodeWith as r, refuse as s, call as t, mapping as u };
327
334
 
328
- //# sourceMappingURL=context-rYTk-3Cv.mjs.map
335
+ //# sourceMappingURL=context-w3NJPRLo.mjs.map