@graftland/plugin-remote 0.3.2 → 0.4.0
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.
- package/README.md +18 -54
- package/README.zh-CN.md +17 -51
- package/README.zh-TW.md +17 -51
- package/dist/Auth.d.ts.map +1 -1
- package/dist/Auth.js.map +1 -1
- package/dist/Config.d.ts +1151 -0
- package/dist/Config.d.ts.map +1 -0
- package/dist/Config.js +183 -0
- package/dist/Config.js.map +1 -0
- package/dist/Contract.d.ts +1 -1
- package/dist/Contract.d.ts.map +1 -1
- package/dist/Contract.js +32 -1
- package/dist/Contract.js.map +1 -1
- package/dist/Instance.d.ts.map +1 -1
- package/dist/Instance.js.map +1 -1
- package/dist/Testing.d.ts +1 -1
- package/dist/Testing.d.ts.map +1 -1
- package/dist/Testing.js.map +1 -1
- package/dist/Transport.d.ts +1 -1
- package/dist/Transport.d.ts.map +1 -1
- package/dist/Transport.js.map +1 -1
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +25 -0
- package/dist/cli.js.map +1 -0
- package/dist/host/auth/bearer.d.ts +9 -1
- package/dist/host/auth/bearer.d.ts.map +1 -1
- package/dist/host/auth/bearer.js +4 -2
- package/dist/host/auth/bearer.js.map +1 -1
- package/dist/host/auth/jwt.d.ts +9 -1
- package/dist/host/auth/jwt.d.ts.map +1 -1
- package/dist/host/auth/jwt.js +4 -2
- package/dist/host/auth/jwt.js.map +1 -1
- package/dist/host/auth/mtls.d.ts +10 -7
- package/dist/host/auth/mtls.d.ts.map +1 -1
- package/dist/host/auth/mtls.js +13 -14
- package/dist/host/auth/mtls.js.map +1 -1
- package/dist/host/auth/none.d.ts +3 -1
- package/dist/host/auth/none.js +7 -5
- package/dist/host/auth/none.js.map +1 -1
- package/dist/host/command.d.ts +14 -1
- package/dist/host/command.d.ts.map +1 -1
- package/dist/host/command.js +11 -9
- package/dist/host/command.js.map +1 -1
- package/dist/host/local.d.ts +2 -1
- package/dist/host/local.d.ts.map +1 -1
- package/dist/host/local.js +9 -30
- package/dist/host/local.js.map +1 -1
- package/dist/host/unix.d.ts +6 -1
- package/dist/host/unix.d.ts.map +1 -1
- package/dist/host/unix.js +13 -9
- package/dist/host/unix.js.map +1 -1
- package/dist/host/websocket.d.ts +10 -1
- package/dist/host/websocket.d.ts.map +1 -1
- package/dist/host/websocket.js +11 -8
- package/dist/host/websocket.js.map +1 -1
- package/dist/host/worker.d.ts +3 -1
- package/dist/host/worker.d.ts.map +1 -1
- package/dist/host/worker.js +13 -9
- package/dist/host/worker.js.map +1 -1
- package/dist/index.d.ts +6 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -64
- package/dist/index.js.map +1 -1
- package/dist/internal/Certificates.js.map +1 -1
- package/dist/internal/FailureGroup.js +6 -6
- package/dist/internal/FailureGroup.js.map +1 -1
- package/dist/internal/Peer.js.map +1 -1
- package/dist/internal/{ServeLifecycle.js → RunnerLifecycle.js} +6 -6
- package/dist/internal/RunnerLifecycle.js.map +1 -0
- package/dist/internal/Supervisor.js.map +1 -1
- package/dist/internal/assembly.d.ts +3 -2
- package/dist/internal/assembly.js +8 -8
- package/dist/internal/assembly.js.map +1 -1
- package/dist/internal/auth/config.d.ts +27 -0
- package/dist/internal/auth/config.d.ts.map +1 -0
- package/dist/internal/auth/config.js +29 -0
- package/dist/internal/auth/config.js.map +1 -0
- package/dist/internal/auth/mtls.js.map +1 -1
- package/dist/internal/auth/token.js.map +1 -1
- package/dist/internal/auth/tokenCredentials.d.ts +2 -1
- package/dist/internal/auth/tokenCredentials.d.ts.map +1 -1
- package/dist/internal/auth/tokenCredentials.js +1 -1
- package/dist/internal/auth/tokenCredentials.js.map +1 -1
- package/dist/internal/child.js +3 -3
- package/dist/internal/child.js.map +1 -1
- package/dist/internal/childMain.js +47 -0
- package/dist/internal/childMain.js.map +1 -0
- package/dist/internal/childRuntime.js +8 -8
- package/dist/internal/childRuntime.js.map +1 -1
- package/dist/internal/cleanup.js +3 -3
- package/dist/internal/cleanup.js.map +1 -1
- package/dist/internal/contract.js.map +1 -1
- package/dist/internal/credentials.d.ts +3 -2
- package/dist/internal/credentials.d.ts.map +1 -1
- package/dist/internal/credentials.js +1 -1
- package/dist/internal/credentials.js.map +1 -1
- package/dist/internal/directTransport.js.map +1 -1
- package/dist/internal/entry.d.ts +493 -3
- package/dist/internal/entry.d.ts.map +1 -1
- package/dist/internal/entry.js +22 -9
- package/dist/internal/entry.js.map +1 -1
- package/dist/internal/entryConfig.d.ts +2 -202
- package/dist/internal/entryConfig.js +2 -136
- package/dist/internal/entryConfig.js.map +1 -1
- package/dist/internal/execution.d.ts +4 -4
- package/dist/internal/execution.js +11 -11
- package/dist/internal/execution.js.map +1 -1
- package/dist/internal/follow.js +1 -1
- package/dist/internal/follow.js.map +1 -1
- package/dist/internal/forkTree.js.map +1 -1
- package/dist/internal/host/local.js.map +1 -1
- package/dist/internal/host/runner.js +4 -4
- package/dist/internal/host/runner.js.map +1 -1
- package/dist/internal/host.js +2 -2
- package/dist/internal/host.js.map +1 -1
- package/dist/internal/importer.js +1 -1
- package/dist/internal/importer.js.map +1 -1
- package/dist/internal/listenerStartup.js +1 -1
- package/dist/internal/listenerStartup.js.map +1 -1
- package/dist/internal/loadModule.js.map +1 -1
- package/dist/internal/platform.js +1 -9
- package/dist/internal/port.d.ts +1 -1
- package/dist/internal/port.js +2 -2
- package/dist/internal/port.js.map +1 -1
- package/dist/internal/runner/Bootstrap.js.map +1 -1
- package/dist/internal/runner/Connection.d.ts +3 -2
- package/dist/internal/runner/Connection.js +6 -6
- package/dist/internal/runner/Connection.js.map +1 -1
- package/dist/internal/runner/Execution.js +6 -6
- package/dist/internal/runner/Execution.js.map +1 -1
- package/dist/internal/runner/Local.js +1 -1
- package/dist/internal/runner/Local.js.map +1 -1
- package/dist/internal/runner/Lock.js.map +1 -1
- package/dist/internal/runner/Multiplex.js.map +1 -1
- package/dist/internal/runner/Packages.js.map +1 -1
- package/dist/internal/runner/ProcessObservation.js.map +1 -1
- package/dist/internal/runner/Processes.js.map +1 -1
- package/dist/internal/runner/Retention.js.map +1 -1
- package/dist/internal/runner/Store.js.map +1 -1
- package/dist/internal/runner/Supervisor.js +5 -5
- package/dist/internal/runner/Supervisor.js.map +1 -1
- package/dist/internal/runner/Watchdog.js.map +1 -1
- package/dist/internal/runner/Wire.d.ts +1 -1
- package/dist/internal/runner/Wire.js.map +1 -1
- package/dist/internal/runner/accept.js +2 -2
- package/dist/internal/runner/accept.js.map +1 -1
- package/dist/internal/runner/command.js +1 -1
- package/dist/internal/runner/command.js.map +1 -1
- package/dist/internal/runner/connectionEnded.js +1 -1
- package/dist/internal/runner/connectionEnded.js.map +1 -1
- package/dist/internal/runner/model.d.ts.map +1 -1
- package/dist/internal/runner/model.js.map +1 -1
- package/dist/internal/services.d.ts.map +1 -1
- package/dist/internal/services.js +1 -1
- package/dist/internal/services.js.map +1 -1
- package/dist/internal/socketChannel.js.map +1 -1
- package/dist/internal/stdioChannel.js.map +1 -1
- package/dist/internal/supervisorPlugin.js +48 -1
- package/dist/internal/supervisorPlugin.js.map +1 -1
- package/dist/internal/transportOptions.d.ts.map +1 -1
- package/dist/internal/watchdogMain.js +5 -3
- package/dist/internal/watchdogMain.js.map +1 -1
- package/dist/internal/websocket.js.map +1 -1
- package/dist/internal/websocketServer.js +1 -1
- package/dist/internal/websocketServer.js.map +1 -1
- package/dist/internal/workerChannel.js.map +1 -1
- package/dist/internal/workerMain.js +13 -6
- package/dist/internal/workerMain.js.map +1 -1
- package/dist/runner/auth/bearer.d.ts +8 -5
- package/dist/runner/auth/bearer.d.ts.map +1 -1
- package/dist/runner/auth/bearer.js +13 -11
- package/dist/runner/auth/bearer.js.map +1 -1
- package/dist/runner/auth/jwt.d.ts +30 -17
- package/dist/runner/auth/jwt.d.ts.map +1 -1
- package/dist/runner/auth/jwt.js +16 -28
- package/dist/runner/auth/jwt.js.map +1 -1
- package/dist/runner/auth/mtls.d.ts +8 -6
- package/dist/runner/auth/mtls.d.ts.map +1 -1
- package/dist/runner/auth/mtls.js +13 -29
- package/dist/runner/auth/mtls.js.map +1 -1
- package/dist/runner/auth/none.d.ts +7 -1
- package/dist/runner/auth/none.js +7 -5
- package/dist/runner/auth/none.js.map +1 -1
- package/dist/runner/index.d.ts +5 -1
- package/dist/runner/index.d.ts.map +1 -1
- package/dist/runner/index.js +62 -30
- package/dist/runner/index.js.map +1 -1
- package/dist/runner/stdio.d.ts +6 -1
- package/dist/runner/stdio.d.ts.map +1 -1
- package/dist/runner/stdio.js +11 -9
- package/dist/runner/stdio.js.map +1 -1
- package/dist/runner/unix.d.ts +6 -1
- package/dist/runner/unix.d.ts.map +1 -1
- package/dist/runner/unix.js +10 -8
- package/dist/runner/unix.js.map +1 -1
- package/dist/runner/websocket.d.ts +24 -1
- package/dist/runner/websocket.d.ts.map +1 -1
- package/dist/runner/websocket.js +12 -10
- package/dist/runner/websocket.js.map +1 -1
- package/package.json +14 -12
- package/schema.json +2269 -0
- package/src/Auth.ts +8 -2
- package/src/Config.ts +196 -0
- package/src/Contract.ts +12 -3
- package/src/Instance.ts +1 -0
- package/src/Testing.ts +6 -4
- package/src/Transport.ts +12 -3
- package/src/cli.ts +60 -0
- package/src/host/auth/bearer.ts +1 -0
- package/src/host/auth/jwt.ts +1 -0
- package/src/host/auth/mtls.ts +7 -12
- package/src/host/auth/none.ts +3 -1
- package/src/host/command.ts +8 -5
- package/src/host/local.ts +4 -2
- package/src/host/unix.ts +11 -7
- package/src/host/websocket.ts +10 -7
- package/src/host/worker.ts +8 -5
- package/src/index.ts +36 -23
- package/src/internal/Certificates.ts +1 -0
- package/src/internal/FailureGroup.ts +5 -3
- package/src/internal/Peer.ts +1 -0
- package/src/internal/{ServeLifecycle.ts → RunnerLifecycle.ts} +7 -5
- package/src/internal/Supervisor.ts +5 -4
- package/src/internal/assembly.ts +11 -9
- package/src/internal/auth/config.ts +44 -0
- package/src/internal/auth/mtls.ts +1 -0
- package/src/internal/auth/token.ts +1 -0
- package/src/internal/auth/tokenCredentials.ts +4 -2
- package/src/internal/child.ts +8 -6
- package/src/{bin.ts → internal/childMain.ts} +16 -61
- package/src/internal/childRuntime.ts +12 -10
- package/src/internal/cleanup.ts +3 -2
- package/src/internal/contract.ts +1 -0
- package/src/internal/credentials.ts +3 -1
- package/src/internal/directTransport.ts +9 -2
- package/src/internal/entry.ts +53 -16
- package/src/internal/entryConfig.ts +10 -132
- package/src/internal/execution.ts +17 -15
- package/src/internal/follow.ts +2 -1
- package/src/internal/forkTree.ts +2 -1
- package/src/internal/host/local.ts +1 -0
- package/src/internal/host/runner.ts +7 -5
- package/src/internal/host.ts +9 -8
- package/src/internal/importer.ts +3 -2
- package/src/internal/listenerStartup.ts +4 -2
- package/src/internal/loadModule.ts +1 -0
- package/src/internal/platform.ts +1 -12
- package/src/internal/port.ts +11 -6
- package/src/internal/runner/Bootstrap.ts +1 -0
- package/src/internal/runner/Connection.ts +13 -11
- package/src/internal/runner/Execution.ts +14 -13
- package/src/internal/runner/Local.ts +3 -2
- package/src/internal/runner/Lock.ts +1 -0
- package/src/internal/runner/Multiplex.ts +2 -1
- package/src/internal/runner/Packages.ts +7 -5
- package/src/internal/runner/ProcessObservation.ts +2 -1
- package/src/internal/runner/Processes.ts +3 -1
- package/src/internal/runner/Retention.ts +1 -0
- package/src/internal/runner/Store.ts +3 -2
- package/src/internal/runner/Supervisor.ts +22 -20
- package/src/internal/runner/Watchdog.ts +3 -1
- package/src/internal/runner/Wire.ts +13 -12
- package/src/internal/runner/accept.ts +6 -5
- package/src/internal/runner/command.ts +3 -2
- package/src/internal/runner/connectionEnded.ts +2 -1
- package/src/internal/runner/model.ts +5 -3
- package/src/internal/services.ts +9 -2
- package/src/internal/socketChannel.ts +2 -1
- package/src/internal/stdioChannel.ts +4 -2
- package/src/internal/supervisorPlugin.ts +10 -8
- package/src/internal/transportOptions.ts +1 -0
- package/src/internal/watchdogMain.ts +5 -3
- package/src/internal/websocket.ts +5 -2
- package/src/internal/websocketServer.ts +6 -4
- package/src/internal/workerChannel.ts +1 -0
- package/src/internal/workerMain.ts +21 -5
- package/src/runner/auth/bearer.ts +10 -6
- package/src/runner/auth/jwt.ts +10 -41
- package/src/runner/auth/mtls.ts +6 -3
- package/src/runner/auth/none.ts +3 -1
- package/src/runner/index.ts +102 -11
- package/src/runner/stdio.ts +15 -10
- package/src/runner/unix.ts +7 -4
- package/src/runner/websocket.ts +9 -7
- package/dist/Auth-BElTC9_X.js +0 -6
- package/dist/Bootstrap-H9gDsgsC.js +0 -9
- package/dist/ConfigDirectory-BCC6q2R4.js +0 -5
- package/dist/Contract-DsJtisvL.js +0 -83
- package/dist/Errors-DYhsGZcZ.js +0 -58
- package/dist/FailureGroup-BgT73AaR.js +0 -63
- package/dist/Framing-G9eSaeLb.js +0 -61
- package/dist/Graft-B71CPA2Y.js +0 -996
- package/dist/Packages-AgoCGotL.js +0 -108
- package/dist/Peer-DXeVrGBh.js +0 -342
- package/dist/ProcessObservation-gLgGirYv.js +0 -38
- package/dist/ServeLifecycle-Bd1FPJ6e.js +0 -24
- package/dist/Transport-DULzpsgR.js +0 -6
- package/dist/WatchdogProtocol-BZmVxrBP.js +0 -17
- package/dist/bin.js +0 -28276
- package/dist/bin.js.map +0 -1
- package/dist/childRuntime-Bm3iSg_N.js +0 -192
- package/dist/command-9zrHdbwT.js +0 -7
- package/dist/connectionEnded-BwcxQ7W8.js +0 -54
- package/dist/directTransport-DrexuPSm.js +0 -5
- package/dist/entry-psOpX3Bj.js +0 -736
- package/dist/importer-Cvf88eAY.js +0 -344
- package/dist/internal/ServeLifecycle.js.map +0 -1
- package/dist/internal/entryConfig.d.ts.map +0 -1
- package/dist/internal/platform.js.map +0 -1
- package/dist/internal/release.js +0 -25
- package/dist/internal/release.js.map +0 -1
- package/dist/internal/serve.js +0 -60
- package/dist/internal/serve.js.map +0 -1
- package/dist/port--3x2zJ4D.js +0 -285
- package/dist/release-DfZPuIcK.js +0 -23
- package/dist/rolldown-runtime-DYf_mQCB.js +0 -34
- package/dist/socketChannel-CJvL2DiB.js +0 -3658
- package/dist/supervisorPlugin-t6Z6PrhD.js +0 -733
- package/dist/token-CYBNNlhS.js +0 -17
- package/dist/tokenCredentials-CbCuk-Rt.js +0 -31
- package/dist/websocketServer-NQhODlEt.js +0 -60
- package/dist/workerChannel-C8hhBJzA.js +0 -27
- package/src/internal/release.ts +0 -72
- package/src/internal/serve.ts +0 -119
- /package/dist/{bin.d.ts → internal/childMain.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Packages.js","names":[],"sources":["../../../src/internal/runner/Packages.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"Packages.js","names":[],"sources":["../../../src/internal/runner/Packages.ts"],"sourcesContent":["// @effect-diagnostics-next-line nodeBuiltinImport:off -- WebCrypto has no incremental digest API; package files are hashed as streams without buffering the directory.\nimport { createHash } from \"node:crypto\"\nimport process from \"node:process\"\nimport { fileURLToPath } from \"node:url\"\n\nimport {\n\tArray,\n\tCause,\n\tEffect,\n\tFileSystem,\n\tOrder,\n\tPath,\n\tSchema,\n\tStream,\n\tString,\n\ttype PlatformError,\n} from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\n\nimport { PackageError, type CodeIdentity } from \"./model\"\n\nconst Manifest = Schema.Struct({ name: Schema.String, version: Schema.String })\nexport interface Expected {\n\treadonly version?: string\n\treadonly digest?: string\n}\nexport const verify = (actual: CodeIdentity, expected: Expected = {}) =>\n\texpected.version !== undefined && actual.version !== expected.version\n\t\t? Effect.fail(\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: `Package version mismatch: expected ${expected.version}, received ${actual.version}`,\n\t\t\t\t}),\n\t\t\t)\n\t\t: expected.digest !== undefined && actual.digest !== expected.digest\n\t\t\t? Effect.fail(\n\t\t\t\t\tPackageError.make({\n\t\t\t\t\t\tdetail: `Package digest mismatch: expected ${expected.digest}, received ${actual.digest}`,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: Effect.void\n\n/** A path-sensitive SHA-256 of sorted entries and bytes, excluding every node_modules subtree. */\nexport const digest = Effect.fnUntraced(function* (directory: string) {\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst hash = yield* Effect.sync(() =>\n\t\tcreateHash(\"sha256\").update(\"graft-package-sha256-v1\\0\"),\n\t)\n\tconst visit = Effect.fnUntraced(function* (\n\t\trelative: string,\n\t): Effect.fn.Return<void, PackageError | PlatformError.PlatformError> {\n\t\tconst filename = path.join(directory, relative)\n\t\tconst info = yield* fs.stat(filename)\n\t\tif (info.type !== \"File\" && info.type !== \"Directory\")\n\t\t\treturn yield* PackageError.make({\n\t\t\t\tdetail: `Unsupported package entry: ${relative}`,\n\t\t\t})\n\t\tconst name = new TextEncoder().encode(relative)\n\t\tyield* Effect.sync(() => {\n\t\t\thash.update(\n\t\t\t\t`${info.type}:${name.byteLength}:${info.type === \"File\" ? info.size : 0}:`,\n\t\t\t)\n\t\t\thash.update(name)\n\t\t})\n\t\tif (info.type === \"File\") {\n\t\t\tyield* fs.stream(filename).pipe(\n\t\t\t\tStream.runForEach((bytes) =>\n\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\thash.update(bytes)\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\tconst entries = yield* fs.readDirectory(filename)\n\t\t\tfor (const entry of Array.sort(entries, Order.String)) {\n\t\t\t\tif (entry === \"node_modules\") continue\n\t\t\t\tyield* visit(relative === \"\" ? entry : `${relative}/${entry}`)\n\t\t\t}\n\t\t}\n\t})\n\tyield* visit(\"\")\n\treturn yield* Effect.sync(() => hash.digest(\"hex\"))\n})\n\n/**\n * Resolve using Node's import conditions without importing executable package code.\n * The helper's cwd is the installation root and it inherits no NODE_OPTIONS/loaders.\n * The installation directory and its package exports are trusted.\n */\nexport const resolve = Effect.fnUntraced(\n\tfunction* (root: string, specifier: string, includeDigest: boolean = false) {\n\t\tconst segments = String.split(specifier, \"/\")\n\t\tconst scoped = String.startsWith(\"@\")(specifier)\n\t\tconst name = Array.join(Array.take(segments, scoped ? 2 : 1), \"/\")\n\t\tconst fs = yield* FileSystem.FileSystem\n\t\tconst path = yield* Path.Path\n\t\tconst installation = yield* fs.realPath(root)\n\t\tconst directory = yield* fs.realPath(\n\t\t\tpath.join(installation, \"node_modules\", name),\n\t\t)\n\t\tconst manifest = yield* fs\n\t\t\t.readFileString(path.join(directory, \"package.json\"))\n\t\t\t.pipe(\n\t\t\t\tEffect.flatMap(Schema.decodeEffect(Schema.fromJsonString(Manifest))),\n\t\t\t)\n\t\tconst resolved = yield* resolveEntry(installation, specifier)\n\t\tconst filename = yield* Effect.try({\n\t\t\ttry: () => fileURLToPath(resolved),\n\t\t\tcatch: (error) =>\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: \"The package export is not a file URL\",\n\t\t\t\t\tcause: Cause.die(error),\n\t\t\t\t}),\n\t\t})\n\t\tconst entry = yield* fs.realPath(filename)\n\t\tconst identity: CodeIdentity = {\n\t\t\t...manifest,\n\t\t\t...(includeDigest ? { digest: yield* digest(directory) } : {}),\n\t\t}\n\t\treturn { directory, entry, identity }\n\t},\n\tEffect.catchTags({\n\t\tPlatformError: (error) =>\n\t\t\tEffect.fail(\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: \"Reading the installed package failed\",\n\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t}),\n\t\t\t),\n\t\tSchemaError: (error) =>\n\t\t\tEffect.fail(\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: \"Reading the package manifest failed\",\n\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t}),\n\t\t\t),\n\t}),\n)\n\nexport const resolveEntry = Effect.fnUntraced(function* (\n\tinstallation: string,\n\tspecifier: string,\n) {\n\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n\tconst child = yield* spawner.spawn(\n\t\tChildProcess.make(\n\t\t\tprocess.execPath,\n\t\t\t[\n\t\t\t\t\"--input-type=module\",\n\t\t\t\t\"--eval\",\n\t\t\t\t\"process.stdout.write(import.meta.resolve(process.argv[1]))\",\n\t\t\t\t\"--\",\n\t\t\t\tspecifier,\n\t\t\t],\n\t\t\t{\n\t\t\t\tcwd: installation,\n\t\t\t\tenv: {},\n\t\t\t\tstdin: \"ignore\",\n\t\t\t\tstdout: \"pipe\",\n\t\t\t\tstderr: \"pipe\",\n\t\t\t},\n\t\t),\n\t)\n\tconst [code, stdout, stderr] = yield* Effect.all(\n\t\t[\n\t\t\tchild.exitCode,\n\t\t\tchild.stdout.pipe(Stream.decodeText(), Stream.mkString),\n\t\t\tchild.stderr.pipe(Stream.decodeText(), Stream.mkString),\n\t\t],\n\t\t{ concurrency: \"unbounded\" },\n\t)\n\tif (code !== 0)\n\t\treturn yield* PackageError.make({\n\t\t\tdetail: `Package resolution failed: ${stderr}`,\n\t\t})\n\treturn stdout\n}, Effect.scoped)\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProcessObservation.js","names":["FailureGroup.make"],"sources":["../../../src/internal/runner/ProcessObservation.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tEffect,\n\tExit,\n\tFiber,\n\tRef,\n\tSchedule,\n\tStream,\n\tString,\n
|
|
1
|
+
{"version":3,"file":"ProcessObservation.js","names":["FailureGroup.make"],"sources":["../../../src/internal/runner/ProcessObservation.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tEffect,\n\tExit,\n\tFiber,\n\tRef,\n\tSchedule,\n\tStream,\n\tString,\n\ttype PlatformError,\n} from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/process\"\n\nimport * as FailureGroup from \"../FailureGroup\"\n\n/** Time allowed for a direct execution unit or launcher to exit after input EOF. */\nexport const stdinExitTimeout = \"1 second\"\n\n/** Readers outlive the failure monitor so forced termination still captures its diagnostic tail. */\nexport const observe = Effect.fnUntraced(function* (\n\tchild: ChildProcessSpawner.ChildProcessHandle,\n\toptions: { readonly drainStdout?: boolean } = {},\n) {\n\tconst failures = yield* FailureGroup.make<PlatformError.PlatformError>()\n\tconst tail = yield* Ref.make(\"\")\n\t// Command transports own stdout as a protocol stream.\n\tconst stdout = yield* (\n\t\toptions.drainStdout === false ? Effect.void : Stream.runDrain(child.stdout)\n\t).pipe(Effect.forkScoped)\n\tconst stderr = yield* child.stderr.pipe(\n\t\tStream.decodeText(),\n\t\tStream.runForEach((text) =>\n\t\t\tRef.update(tail, (old) => String.takeRight(old + text, 8192)),\n\t\t),\n\t\tEffect.forkScoped,\n\t)\n\tyield* failures.run(Fiber.join(stdout))\n\tyield* failures.run(Fiber.join(stderr))\n\tconst exited = yield* Effect.gen(function* () {\n\t\tconst result = yield* Effect.exit(child.exitCode)\n\t\t// exitCode can fail before exit on an input error; isRunning follows Node's exit event.\n\t\tyield* child.isRunning.pipe(\n\t\t\tEffect.repeat({\n\t\t\t\tschedule: Schedule.spaced(\"25 millis\"),\n\t\t\t\twhile: (running) => running,\n\t\t\t}),\n\t\t)\n\t\tconst err = yield* Fiber.await(stderr)\n\t\tconst out = yield* Fiber.await(stdout)\n\t\treturn {\n\t\t\tcode: Exit.isSuccess(result) ? result.value : null,\n\t\t\tsignal: null,\n\t\t\tstderr: yield* Ref.get(tail),\n\t\t\tcause: Array.reduce(\n\t\t\t\t[Exit.asVoid(result), err, out],\n\t\t\t\tCause.empty,\n\t\t\t\t(cause: Cause.Cause<PlatformError.PlatformError>, exit) =>\n\t\t\t\t\tExit.isFailure(exit) ? Cause.combine(cause, exit.cause) : cause,\n\t\t\t),\n\t\t}\n\t}).pipe(Effect.forkScoped)\n\treturn { exited: Fiber.join(exited), failure: failures.await }\n})\n"],"mappings":";;;;AAiBA,MAAa,mBAAmB;;AAGhC,MAAa,UAAU,OAAO,WAAW,WACxC,OACA,UAA8C,CAAC,GAC9C;CACD,MAAM,WAAW,OAAOA,KAA+C;CACvE,MAAM,OAAO,OAAO,IAAI,KAAK,EAAE;CAE/B,MAAM,SAAS,QACd,QAAQ,gBAAgB,QAAQ,OAAO,OAAO,OAAO,SAAS,MAAM,MAAM,EAAA,CACzE,KAAK,OAAO,UAAU;CACxB,MAAM,SAAS,OAAO,MAAM,OAAO,KAClC,OAAO,WAAW,GAClB,OAAO,YAAY,SAClB,IAAI,OAAO,OAAO,QAAQ,OAAO,UAAU,MAAM,MAAM,IAAI,CAAC,CAC7D,GACA,OAAO,UACR;CACA,OAAO,SAAS,IAAI,MAAM,KAAK,MAAM,CAAC;CACtC,OAAO,SAAS,IAAI,MAAM,KAAK,MAAM,CAAC;CACtC,MAAM,SAAS,OAAO,OAAO,IAAI,aAAa;EAC7C,MAAM,SAAS,OAAO,OAAO,KAAK,MAAM,QAAQ;EAEhD,OAAO,MAAM,UAAU,KACtB,OAAO,OAAO;GACb,UAAU,SAAS,OAAO,WAAW;GACrC,QAAQ,YAAY;EACrB,CAAC,CACF;EACA,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM;EACrC,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM;EACrC,OAAO;GACN,MAAM,KAAK,UAAU,MAAM,IAAI,OAAO,QAAQ;GAC9C,QAAQ;GACR,QAAQ,OAAO,IAAI,IAAI,IAAI;GAC3B,OAAO,MAAM,OACZ;IAAC,KAAK,OAAO,MAAM;IAAG;IAAK;GAAG,GAC9B,MAAM,QACL,OAAiD,SACjD,KAAK,UAAU,IAAI,IAAI,MAAM,QAAQ,OAAO,KAAK,KAAK,IAAI,KAC5D;EACD;CACD,CAAC,CAAC,CAAC,KAAK,OAAO,UAAU;CACzB,OAAO;EAAE,QAAQ,MAAM,KAAK,MAAM;EAAG,SAAS,SAAS;CAAM;AAC9D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Processes.js","names":[],"sources":["../../../src/internal/runner/Processes.ts"],"sourcesContent":["import { Cause, Effect, Option, Schedule, Stream, String } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\
|
|
1
|
+
{"version":3,"file":"Processes.js","names":[],"sources":["../../../src/internal/runner/Processes.ts"],"sourcesContent":["import process from \"node:process\"\n\nimport { Cause, Effect, Option, Schedule, Stream, String } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\n\nimport {\n\tExecutionError,\n\tTerminationUnconfirmed,\n\ttype ProcessIdentity,\n\ttype Termination,\n} from \"./model\"\n\nconst inspect = Effect.fnUntraced(\n\tfunction* (pid: number) {\n\t\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n\t\tconst child = yield* spawner.spawn(\n\t\t\tChildProcess.make(\n\t\t\t\t\"ps\",\n\t\t\t\t[\"-p\", `${pid}`, \"-o\", \"lstart=\", \"-o\", \"stat=\"],\n\t\t\t\t{\n\t\t\t\t\tenv: { LC_ALL: \"C\" },\n\t\t\t\t\textendEnv: true,\n\t\t\t\t\tstdin: \"ignore\",\n\t\t\t\t},\n\t\t\t),\n\t\t)\n\t\tconst [code, output, stderr] = yield* Effect.all(\n\t\t\t[\n\t\t\t\tchild.exitCode,\n\t\t\t\tchild.stdout.pipe(Stream.decodeText(), Stream.mkString),\n\t\t\t\tchild.stderr.pipe(Stream.decodeText(), Stream.mkString),\n\t\t\t],\n\t\t\t{ concurrency: \"unbounded\" },\n\t\t)\n\t\tif (code === 1 && String.trim(output) === \"\") return Option.none()\n\t\tconst [, born, status] =\n\t\t\t/^(.{24})\\s+(\\S+)$/m.exec(String.trim(output)) ?? []\n\t\tif (code !== 0 || born === undefined || status === undefined)\n\t\t\treturn yield* ExecutionError.make({\n\t\t\t\tdetail: \"Cannot inspect process identity: \" + stderr,\n\t\t\t})\n\t\tif (String.startsWith(\"Z\")(status)) return Option.none()\n\t\treturn Option.some({ born })\n\t},\n\tEffect.scoped,\n\tEffect.mapError((error) =>\n\t\terror._tag === \"ExecutionError\"\n\t\t\t? error\n\t\t\t: ExecutionError.make({\n\t\t\t\t\tdetail: \"Inspecting process identity failed\",\n\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t}),\n\t),\n)\n\nexport const identity = Effect.fnUntraced(function* (pid: number) {\n\tconst current = yield* inspect(pid)\n\tif (Option.isNone(current))\n\t\treturn yield* ExecutionError.make({\n\t\t\tdetail: \"The child exited before its identity could be recorded\",\n\t\t})\n\treturn { pid, start: current.value }\n})\n\n// The OS may discard argv before reporting a zombie; PID and start time remain the identity.\nexport const matches = Effect.fnUntraced(function* (child: ProcessIdentity) {\n\tconst current = yield* inspect(child.pid)\n\tif (Option.isNone(current) || current.value.born !== child.start.born)\n\t\treturn false\n\treturn true\n})\n\nexport const recover = Effect.fnUntraced(function* (child: ProcessIdentity) {\n\tif (!(yield* matches(child)))\n\t\treturn {\n\t\t\tkind: \"Exited\",\n\t\t\texit: { code: null, signal: null },\n\t\t\tcause: Cause.empty,\n\t\t} satisfies Termination\n\t// The PID can still be reused between this final check and kill; an external supervisor covers descendants.\n\tconst sent = yield* Effect.exit(\n\t\tEffect.try({\n\t\t\ttry: () => process.kill(child.pid, \"SIGKILL\"),\n\t\t\tcatch: (cause) =>\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Signaling the orphan failed\",\n\t\t\t\t\tcause: Cause.die(cause),\n\t\t\t\t}),\n\t\t}),\n\t)\n\tconst confirmed = yield* matches(child).pipe(\n\t\tEffect.repeat({\n\t\t\tschedule: Schedule.spaced(\"50 millis\"),\n\t\t\twhile: (value) => value,\n\t\t}),\n\t\tEffect.timeoutOption(\"10 seconds\"),\n\t)\n\tif (Option.isNone(confirmed))\n\t\treturn yield* TerminationUnconfirmed.make({\n\t\t\tdetail: \"The orphan did not exit after recovery\",\n\t\t\tcause: sent._tag === \"Failure\" ? sent.cause : Cause.empty,\n\t\t})\n\treturn {\n\t\tkind: \"Killed\",\n\t\texit: { code: null, signal: \"SIGKILL\" },\n\t\tcause: sent._tag === \"Failure\" ? sent.cause : Cause.empty,\n\t} satisfies Termination\n})\n"],"mappings":";;;;;AAYA,MAAM,UAAU,OAAO,WACtB,WAAW,KAAa;CAEvB,MAAM,QAAQ,QAAO,OADE,oBAAoB,oBAAA,CACd,MAC5B,aAAa,KACZ,MACA;EAAC;EAAM,GAAG;EAAO;EAAM;EAAW;EAAM;CAAO,GAC/C;EACC,KAAK,EAAE,QAAQ,IAAI;EACnB,WAAW;EACX,OAAO;CACR,CACD,CACD;CACA,MAAM,CAAC,MAAM,QAAQ,UAAU,OAAO,OAAO,IAC5C;EACC,MAAM;EACN,MAAM,OAAO,KAAK,OAAO,WAAW,GAAG,OAAO,QAAQ;EACtD,MAAM,OAAO,KAAK,OAAO,WAAW,GAAG,OAAO,QAAQ;CACvD,GACA,EAAE,aAAa,YAAY,CAC5B;CACA,IAAI,SAAS,KAAK,OAAO,KAAK,MAAM,MAAM,IAAI,OAAO,OAAO,KAAK;CACjE,MAAM,GAAG,MAAM,UACd,qBAAqB,KAAK,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC;CACpD,IAAI,SAAS,KAAK,SAAS,KAAA,KAAa,WAAW,KAAA,GAClD,OAAO,OAAO,eAAe,KAAK,EACjC,QAAQ,sCAAsC,OAC/C,CAAC;CACF,IAAI,OAAO,WAAW,GAAG,CAAC,CAAC,MAAM,GAAG,OAAO,OAAO,KAAK;CACvD,OAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAC5B,GACA,OAAO,QACP,OAAO,UAAU,UAChB,MAAM,SAAS,mBACZ,QACA,eAAe,KAAK;CACpB,QAAQ;CACR,OAAO,MAAM,KAAK,KAAK;AACxB,CAAC,CACJ,CACD;AAEA,MAAa,WAAW,OAAO,WAAW,WAAW,KAAa;CACjE,MAAM,UAAU,OAAO,QAAQ,GAAG;CAClC,IAAI,OAAO,OAAO,OAAO,GACxB,OAAO,OAAO,eAAe,KAAK,EACjC,QAAQ,yDACT,CAAC;CACF,OAAO;EAAE;EAAK,OAAO,QAAQ;CAAM;AACpC,CAAC;AAGD,MAAa,UAAU,OAAO,WAAW,WAAW,OAAwB;CAC3E,MAAM,UAAU,OAAO,QAAQ,MAAM,GAAG;CACxC,IAAI,OAAO,OAAO,OAAO,KAAK,QAAQ,MAAM,SAAS,MAAM,MAAM,MAChE,OAAO;CACR,OAAO;AACR,CAAC;AAED,MAAa,UAAU,OAAO,WAAW,WAAW,OAAwB;CAC3E,IAAI,EAAE,OAAO,QAAQ,KAAK,IACzB,OAAO;EACN,MAAM;EACN,MAAM;GAAE,MAAM;GAAM,QAAQ;EAAK;EACjC,OAAO,MAAM;CACd;CAED,MAAM,OAAO,OAAO,OAAO,KAC1B,OAAO,IAAI;EACV,WAAW,QAAQ,KAAK,MAAM,KAAK,SAAS;EAC5C,QAAQ,UACP,eAAe,KAAK;GACnB,QAAQ;GACR,OAAO,MAAM,IAAI,KAAK;EACvB,CAAC;CACH,CAAC,CACF;CACA,MAAM,YAAY,OAAO,QAAQ,KAAK,CAAC,CAAC,KACvC,OAAO,OAAO;EACb,UAAU,SAAS,OAAO,WAAW;EACrC,QAAQ,UAAU;CACnB,CAAC,GACD,OAAO,cAAc,YAAY,CAClC;CACA,IAAI,OAAO,OAAO,SAAS,GAC1B,OAAO,OAAO,uBAAuB,KAAK;EACzC,QAAQ;EACR,OAAO,KAAK,SAAS,YAAY,KAAK,QAAQ,MAAM;CACrD,CAAC;CACF,OAAO;EACN,MAAM;EACN,MAAM;GAAE,MAAM;GAAM,QAAQ;EAAU;EACtC,OAAO,KAAK,SAAS,YAAY,KAAK,QAAQ,MAAM;CACrD;AACD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Retention.js","names":[],"sources":["../../../src/internal/runner/Retention.ts"],"sourcesContent":["import { Array, HashMap, Option } from \"effect\"\nimport { keyOf, type SessionKey, type SessionRecord } from \"./model\"\n\n/** A terminal high-water record fences every older Open, even after its request id is forgotten. */\nexport const retain = (\n\trecords: ReadonlyArray<SessionRecord>,\n): ReadonlyArray<SessionRecord> => {\n\tconst highWater = Array.reduce(\n\t\trecords,\n\t\tHashMap.empty<SessionKey, number>(),\n\t\t(water, record) =>\n\t\t\tHashMap.set(\n\t\t\t\twater,\n\t\t\t\tkeyOf(record.handle.key),\n\t\t\t\tMath.max(\n\t\t\t\t\tOption.getOrElse(\n\t\t\t\t\t\tHashMap.get(water, keyOf(record.handle.key)),\n\t\t\t\t\t\t() => 0,\n\t\t\t\t\t),\n\t\t\t\t\trecord.handle.generation,\n\t\t\t\t),\n\t\t\t),\n\t)\n\treturn Array.filter(\n\t\trecords,\n\t\t(record) =>\n\t\t\trecord.phase !== \"Stopped\" ||\n\t\t\trecord.handle.generation ===\n\t\t\t\tOption.getOrUndefined(HashMap.get(highWater, keyOf(record.handle.key))),\n\t)\n}\n/** Apply the same retention rule to both in-memory stores. */\nexport const save = (\n\trecords: HashMap.HashMap<string, SessionRecord>,\n\trecord: SessionRecord,\n) =>\n\tHashMap.fromIterable(\n\t\tArray.map(\n\t\t\tretain(\n\t\t\t\tArray.fromIterable(\n\t\t\t\t\tHashMap.values(HashMap.set(records, record.handle.token, record)),\n\t\t\t\t),\n\t\t\t),\n\t\t\t(record): readonly [string, SessionRecord] => [\n\t\t\t\trecord.handle.token,\n\t\t\t\trecord,\n\t\t\t],\n\t\t),\n\t)\n"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"Retention.js","names":[],"sources":["../../../src/internal/runner/Retention.ts"],"sourcesContent":["import { Array, HashMap, Option } from \"effect\"\n\nimport { keyOf, type SessionKey, type SessionRecord } from \"./model\"\n\n/** A terminal high-water record fences every older Open, even after its request id is forgotten. */\nexport const retain = (\n\trecords: ReadonlyArray<SessionRecord>,\n): ReadonlyArray<SessionRecord> => {\n\tconst highWater = Array.reduce(\n\t\trecords,\n\t\tHashMap.empty<SessionKey, number>(),\n\t\t(water, record) =>\n\t\t\tHashMap.set(\n\t\t\t\twater,\n\t\t\t\tkeyOf(record.handle.key),\n\t\t\t\tMath.max(\n\t\t\t\t\tOption.getOrElse(\n\t\t\t\t\t\tHashMap.get(water, keyOf(record.handle.key)),\n\t\t\t\t\t\t() => 0,\n\t\t\t\t\t),\n\t\t\t\t\trecord.handle.generation,\n\t\t\t\t),\n\t\t\t),\n\t)\n\treturn Array.filter(\n\t\trecords,\n\t\t(record) =>\n\t\t\trecord.phase !== \"Stopped\" ||\n\t\t\trecord.handle.generation ===\n\t\t\t\tOption.getOrUndefined(HashMap.get(highWater, keyOf(record.handle.key))),\n\t)\n}\n/** Apply the same retention rule to both in-memory stores. */\nexport const save = (\n\trecords: HashMap.HashMap<string, SessionRecord>,\n\trecord: SessionRecord,\n) =>\n\tHashMap.fromIterable(\n\t\tArray.map(\n\t\t\tretain(\n\t\t\t\tArray.fromIterable(\n\t\t\t\t\tHashMap.values(HashMap.set(records, record.handle.token, record)),\n\t\t\t\t),\n\t\t\t),\n\t\t\t(record): readonly [string, SessionRecord] => [\n\t\t\t\trecord.handle.token,\n\t\t\t\trecord,\n\t\t\t],\n\t\t),\n\t)\n"],"mappings":";;;;AAKA,MAAa,UACZ,YACkC;CAClC,MAAM,YAAY,MAAM,OACvB,SACA,QAAQ,MAA0B,IACjC,OAAO,WACP,QAAQ,IACP,OACA,MAAM,OAAO,OAAO,GAAG,GACvB,KAAK,IACJ,OAAO,UACN,QAAQ,IAAI,OAAO,MAAM,OAAO,OAAO,GAAG,CAAC,SACrC,CACP,GACA,OAAO,OAAO,UACf,CACD,CACF;CACA,OAAO,MAAM,OACZ,UACC,WACA,OAAO,UAAU,aACjB,OAAO,OAAO,eACb,OAAO,eAAe,QAAQ,IAAI,WAAW,MAAM,OAAO,OAAO,GAAG,CAAC,CAAC,CACzE;AACD;;AAEA,MAAa,QACZ,SACA,WAEA,QAAQ,aACP,MAAM,IACL,OACC,MAAM,aACL,QAAQ,OAAO,QAAQ,IAAI,SAAS,OAAO,OAAO,OAAO,MAAM,CAAC,CACjE,CACD,IACC,WAA6C,CAC7C,OAAO,OAAO,OACd,MACD,CACD,CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.js","names":["Retention.save","Retention.retain"],"sources":["../../../src/internal/runner/Store.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\
|
|
1
|
+
{"version":3,"file":"Store.js","names":["Retention.save","Retention.retain"],"sources":["../../../src/internal/runner/Store.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tEffect,\n\tFileSystem,\n\tHashMap,\n\tHashSet,\n\tLayer,\n\tPath,\n\tRef,\n\tSchema,\n\tSemaphore,\n\tString,\n\ttype PlatformError,\n} from \"effect\"\nimport { Digest, SecureRandom } from \"effect/crypto\"\n\nimport { Key, SessionRecord, StateStorageError, Store } from \"./model\"\nimport * as Retention from \"./Retention\"\n\n/** Injectable store used by deterministic supervisor tests. */\nexport const memory = Effect.gen(function* () {\n\tconst records = yield* Ref.make(HashMap.empty<string, SessionRecord>())\n\treturn Store.of({\n\t\tlist: Ref.get(records).pipe(\n\t\t\tEffect.map((records) => Array.fromIterable(HashMap.values(records))),\n\t\t),\n\t\tsave: (record) => Ref.update(records, (all) => Retention.save(all, record)),\n\t})\n})\n\n/**\n * Atomically replaced records retain unfinished sessions and each key's high-water mark.\n * Older terminal request ids expire; Open fences their retries with expectedGeneration.\n * Requires exclusive directory ownership; it is not a multi-writer database.\n */\nexport const directory = Effect.fnUntraced(function* (root: string) {\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst digest = yield* Digest.Digest\n\tconst json = Schema.fromJsonString(Schema.toCodecJson(SessionRecord))\n\tconst random = yield* SecureRandom.SecureRandom\n\tconst storage = <A, R>(\n\t\teffect: Effect.Effect<\n\t\t\tA,\n\t\t\tPlatformError.PlatformError | Schema.SchemaError | StateStorageError,\n\t\t\tR\n\t\t>,\n\t) =>\n\t\teffect.pipe(\n\t\t\tEffect.mapError((error) =>\n\t\t\t\terror._tag === \"StateStorageError\"\n\t\t\t\t\t? error\n\t\t\t\t\t: StateStorageError.make({\n\t\t\t\t\t\t\tdetail: \"Runner state storage failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t),\n\t\t)\n\tyield* storage(\n\t\tfs.makeDirectory(root, { recursive: true }).pipe(Effect.uninterruptible),\n\t)\n\tconst mutex = yield* Semaphore.make(1)\n\tconst read = Effect.gen(function* () {\n\t\tconst files = yield* fs.readDirectory(root)\n\t\tconst rows = yield* Effect.forEach(\n\t\t\tArray.filter(files, String.endsWith(\".json\")),\n\t\t\t(file) =>\n\t\t\t\tfs.readFileString(path.join(root, file)).pipe(\n\t\t\t\t\tEffect.flatMap(Schema.decodeEffect(json)),\n\t\t\t\t\tEffect.map((record) => ({ file, record })),\n\t\t\t\t),\n\t\t)\n\t\treturn rows\n\t})\n\tconst compact = Effect.scoped(\n\t\tEffect.gen(function* () {\n\t\t\tconst rows = yield* read\n\t\t\tconst retained = Retention.retain(Array.map(rows, (row) => row.record))\n\t\t\tconst tokens = HashSet.fromIterable(\n\t\t\t\tArray.map(retained, (record) => record.handle.token),\n\t\t\t)\n\t\t\tconst obsolete = Array.filter(\n\t\t\t\trows,\n\t\t\t\t(row) => !HashSet.has(tokens, row.record.handle.token),\n\t\t\t)\n\t\t\tyield* Effect.forEach(\n\t\t\t\tobsolete,\n\t\t\t\t(row) =>\n\t\t\t\t\tfs.remove(path.join(root, row.file)).pipe(Effect.uninterruptible),\n\t\t\t\t{ discard: true },\n\t\t\t)\n\t\t\tif (obsolete.length > 0) {\n\t\t\t\tconst directory = yield* fs.open(root, { flag: \"r\" })\n\t\t\t\tyield* directory.sync.pipe(Effect.uninterruptible)\n\t\t\t}\n\t\t}),\n\t)\n\tyield* storage(compact)\n\treturn Store.of({\n\t\tlist: storage(\n\t\t\tmutex.withPermit(\n\t\t\t\tread.pipe(Effect.map((rows) => Array.map(rows, (row) => row.record))),\n\t\t\t),\n\t\t),\n\t\tsave: Effect.fnUntraced(\n\t\t\tfunction* (record: SessionRecord) {\n\t\t\t\tconst encoded = yield* Schema.encodeEffect(json)(record)\n\t\t\t\tconst address = yield* Schema.encodeEffect(\n\t\t\t\t\tSchema.fromJsonString(\n\t\t\t\t\t\tSchema.Struct({ key: Key, generation: Schema.Int }),\n\t\t\t\t\t),\n\t\t\t\t)({\n\t\t\t\t\tkey: record.handle.key,\n\t\t\t\t\tgeneration: record.handle.generation,\n\t\t\t\t})\n\t\t\t\tconst name = yield* digest.digestHex(\n\t\t\t\t\tDigest.sha256,\n\t\t\t\t\tnew TextEncoder().encode(address),\n\t\t\t\t)\n\t\t\t\tconst nonce = yield* random.uuidV4()\n\t\t\t\tconst temporary = path.join(root, `.${name}.${nonce}.tmp`)\n\t\t\t\tconst destination = path.join(root, name + \".json\")\n\t\t\t\tyield* Effect.acquireRelease(\n\t\t\t\t\tfs.open(temporary, { flag: \"wx\", mode: 0o600 }),\n\t\t\t\t\t() => fs.remove(temporary, { force: true }).pipe(Effect.orDie),\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.flatMap((file) =>\n\t\t\t\t\t\tfile\n\t\t\t\t\t\t\t.writeAll(new TextEncoder().encode(encoded))\n\t\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\t\tEffect.uninterruptible,\n\t\t\t\t\t\t\t\tEffect.andThen(file.sync.pipe(Effect.uninterruptible)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t// Keep rename and directory synchronization together if the caller is canceled.\n\t\t\t\tyield* Effect.uninterruptible(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* fs.rename(temporary, destination)\n\t\t\t\t\t\tconst directory = yield* fs.open(root, { flag: \"r\" })\n\t\t\t\t\t\tyield* directory.sync.pipe(Effect.uninterruptible)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t// The new high-water file is durable before any old record is removed.\n\t\t\t\tyield* compact\n\t\t\t},\n\t\t\tEffect.scoped,\n\t\t\tmutex.withPermit,\n\t\t\tstorage,\n\t\t),\n\t})\n})\n\nexport const layerMemory = Layer.effect(Store, memory)\nexport const layerDirectory = (root: string) =>\n\tLayer.effect(Store, directory(root))\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { cleanupCause } from "../cleanup.js";
|
|
1
2
|
import { make as make$1 } from "../FailureGroup.js";
|
|
2
|
-
import { close } from "../release.js";
|
|
3
|
-
import { save } from "./Retention.js";
|
|
4
3
|
import { defaults } from "../Limits.js";
|
|
5
|
-
import { cleanupCause } from "../cleanup.js";
|
|
6
4
|
import { Execution, ExecutionError, LeaseExpired, RunnerClosing, SessionConflict, SessionStopped, StaleSession, Store, TerminationUnconfirmed, childOf, keyOf, negotiate, stoppedRecord, stoppingRecord } from "./model.js";
|
|
5
|
+
import { save } from "./Retention.js";
|
|
7
6
|
import { Array, Cause, Clock, Context, Data, Deferred, Duration, Effect, Equal, Exit, FiberHandle, FiberSet, HashMap, Layer, Option, RcMap, Ref, Result, Scope, Semaphore, SynchronizedRef } from "effect";
|
|
8
7
|
import { SecureRandom } from "effect/crypto";
|
|
8
|
+
import * as Release from "@graftland/graft/Release";
|
|
9
9
|
// src/internal/runner/Supervisor.ts
|
|
10
10
|
var Supervisor = class extends Context.Service()("@graftland/plugin-remote/internal/runner/Supervisor") {};
|
|
11
11
|
const Launch = Data.taggedEnum();
|
|
@@ -159,7 +159,7 @@ const operations = (runtime) => {
|
|
|
159
159
|
const finishStop = Effect.fnUntraced(function* (entry, state, saved) {
|
|
160
160
|
yield* FiberHandle.clear(entry.loading);
|
|
161
161
|
const result = yield* terminate(state.execution, grace, confirmation);
|
|
162
|
-
const closed = yield* Effect.exit(close(entry.unitScope, Exit.void));
|
|
162
|
+
const closed = yield* Effect.exit(Release.close(entry.unitScope, Exit.void));
|
|
163
163
|
const termination = {
|
|
164
164
|
...result,
|
|
165
165
|
cause: Cause.combine(result.cause, exitCause(closed))
|
|
@@ -314,7 +314,7 @@ const protocol = Effect.fnUntraced(function* (runtime, actions) {
|
|
|
314
314
|
};
|
|
315
315
|
const retained = yield* Ref.get(records);
|
|
316
316
|
const old = yield* Ref.modify(entries, (all) => [Array.filter(Array.fromIterable(HashMap.entries(all)), ([key]) => !HashMap.has(retained, key)), HashMap.set(HashMap.filter(all, (_, key) => HashMap.has(retained, key)), token, entry)]);
|
|
317
|
-
for (const [, retired] of old) yield* close(retired.scope, Exit.void);
|
|
317
|
+
for (const [, retired] of old) yield* Release.close(retired.scope, Exit.void);
|
|
318
318
|
yield* scheduleLease(entry, deadline);
|
|
319
319
|
return record;
|
|
320
320
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Supervisor.js","names":["FailureGroup.make","Retention.save","Release.close"],"sources":["../../../src/internal/runner/Supervisor.ts"],"sourcesContent":["import * as FailureGroup from \"../FailureGroup\"\nimport {\n\tArray,\n\tCause,\n\tClock,\n\tContext,\n\tData,\n\tDeferred,\n\tDuration,\n\tEffect,\n\tEqual,\n\tExit,\n\tFiberHandle,\n\tFiberSet,\n\tHashMap,\n\tLayer,\n\tOption,\n\tRcMap,\n\tRef,\n\tResult,\n\tScope,\n\tSemaphore,\n\tSynchronizedRef,\n} from \"effect\"\nimport * as Release from \"../release\"\nimport { SecureRandom } from \"effect/crypto\"\nimport * as Retention from \"./Retention\"\nimport { cleanupCause } from \"../cleanup\"\nimport {\n\tExecution,\n\tStore,\n\tStaleSession,\n\tLeaseExpired,\n\tSessionStopped,\n\tSessionConflict,\n\tStateStorageError,\n\tExecutionError,\n\tPackageError,\n\tTerminationUnconfirmed,\n\tRunnerClosing,\n\tchildOf,\n\tdefaults,\n\tkeyOf,\n\tnegotiate,\n\tstoppingRecord,\n\tstoppedRecord,\n\ttype ActiveRecord,\n\ttype CodeIdentity,\n\ttype ExitStatus,\n\ttype Handle,\n\ttype Key,\n\ttype Limits,\n\ttype Load,\n\ttype SessionRecord,\n\ttype SessionKey,\n\ttype StopReason,\n\ttype Termination,\n\ttype Unit,\n\ttype OpenRecord,\n\ttype LoadedRecord,\n\ttype StoppingRecord,\n\ttype StoppedRecord,\n} from \"./model\"\n\nexport type SupervisorError =\n\t| StaleSession\n\t| LeaseExpired\n\t| SessionStopped\n\t| SessionConflict\n\t| StateStorageError\n\t| ExecutionError\n\t| PackageError\n\t| TerminationUnconfirmed\n\t| RunnerClosing\nexport interface Options {\n\treadonly lease?: Duration.Input\n\treadonly grace?: Duration.Input\n\treadonly confirmationTimeout?: Duration.Input\n\treadonly limits?: Limits\n}\nexport interface Open {\n\treadonly key: Key\n\treadonly requestId: string\n\treadonly expectedGeneration?: number | null\n\treadonly lease?: Duration.Input\n\treadonly limits?: Limits\n}\nexport class Supervisor extends Context.Service<\n\tSupervisor,\n\t{\n\t\treadonly await: Effect.Effect<never, SupervisorError>\n\t\treadonly status: (\n\t\t\thandle: Handle,\n\t\t) => Effect.Effect<SessionRecord, StaleSession>\n\t\treadonly highWater: (key: Key) => Effect.Effect<number | null>\n\t\treadonly open: (\n\t\t\trequest: Open,\n\t\t) => Effect.Effect<SessionRecord, SupervisorError>\n\t\treadonly renew: (handle: Handle) => Effect.Effect<number, SupervisorError>\n\t\treadonly load: (\n\t\t\thandle: Handle,\n\t\t\trequest: Load,\n\t\t) => Effect.Effect<CodeIdentity, SupervisorError>\n\t\treadonly dispose: (\n\t\t\thandle: Handle,\n\t\t) => Effect.Effect<Termination, SupervisorError>\n\t}\n>()(\"@graftland/plugin-remote/internal/runner/Supervisor\") {}\n\ntype Launch = Data.TaggedEnum<{\n\tStarting: {}\n\tRegistered: { readonly unit: Unit }\n}>\nconst Launch = Data.taggedEnum<Launch>()\ntype ExecutionState = Data.TaggedEnum<{\n\tAbsent: {}\n\tRunning: { readonly unit: Unit }\n\tExited: { readonly exit: ExitStatus }\n}>\nconst ExecutionState = Data.taggedEnum<ExecutionState>()\ntype LoadReply = Deferred.Deferred<CodeIdentity, SupervisorError>\ntype StopReply = Deferred.Deferred<Termination, SupervisorError>\ntype Session = Data.TaggedEnum<{\n\tOpen: { readonly record: typeof OpenRecord.Type; readonly deadline: bigint }\n\tLoading: {\n\t\treadonly record: typeof OpenRecord.Type\n\t\treadonly request: Load\n\t\treadonly launch: Launch\n\t\treadonly reply: LoadReply\n\t\treadonly deadline: bigint\n\t}\n\tLoaded: {\n\t\treadonly record: typeof LoadedRecord.Type\n\t\treadonly unit: Unit\n\t\treadonly deadline: bigint\n\t}\n\tStopping: {\n\t\treadonly record: typeof StoppingRecord.Type\n\t\treadonly execution: ExecutionState\n\t\treadonly reply: StopReply\n\t}\n\tStopped: {\n\t\treadonly record: typeof StoppedRecord.Type\n\t\treadonly reply: StopReply\n\t}\n}>\nconst Session = Data.taggedEnum<Session>()\ntype Live = Extract<Session, { readonly _tag: \"Open\" | \"Loading\" | \"Loaded\" }>\ntype Loading = Extract<Session, { readonly _tag: \"Loading\" }>\ntype Stopping = Extract<Session, { readonly _tag: \"Stopping\" }>\ninterface Entry {\n\treadonly state: SynchronizedRef.SynchronizedRef<Session>\n\treadonly timer: FiberHandle.FiberHandle<void, never>\n\treadonly loading: FiberHandle.FiberHandle<void, never>\n\treadonly scope: Scope.Closeable\n\treadonly unitScope: Scope.Closeable\n}\nfunction snapshot(state: Live): ActiveRecord\nfunction snapshot(state: Session): SessionRecord\nfunction snapshot(state: Session): SessionRecord {\n\treturn state._tag === \"Loading\"\n\t\t? {\n\t\t\t\t...state.record,\n\t\t\t\tphase: \"Loading\",\n\t\t\t\tload: state.request,\n\t\t\t\tlaunch:\n\t\t\t\t\tstate.launch._tag === \"Starting\"\n\t\t\t\t\t\t? { _tag: \"Starting\" }\n\t\t\t\t\t\t: { _tag: \"Registered\", child: state.launch.unit.identity },\n\t\t\t}\n\t\t: state.record\n}\nconst live = (\n\tstate: Session,\n\tnow: bigint,\n): Result.Result<Live, LeaseExpired | SessionStopped> => {\n\tif (state._tag === \"Stopping\" || state._tag === \"Stopped\")\n\t\treturn Result.fail(\n\t\t\tstate.record.reason._tag === \"Expired\"\n\t\t\t\t? LeaseExpired.make({\n\t\t\t\t\t\tdetail: \"The session lease has expired\",\n\t\t\t\t\t})\n\t\t\t\t: SessionStopped.make({\n\t\t\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t\t\t}),\n\t\t)\n\treturn now >= state.deadline\n\t\t? Result.fail(\n\t\t\t\tLeaseExpired.make({\n\t\t\t\t\tdetail: \"The session lease has expired\",\n\t\t\t\t}),\n\t\t\t)\n\t\t: Result.succeed(state)\n}\nconst executionOf = (state: Live): ExecutionState => {\n\tswitch (state._tag) {\n\t\tcase \"Open\":\n\t\t\treturn ExecutionState.Absent()\n\t\tcase \"Loading\":\n\t\t\treturn state.launch._tag === \"Registered\"\n\t\t\t\t? ExecutionState.Running({ unit: state.launch.unit })\n\t\t\t\t: ExecutionState.Absent()\n\t\tcase \"Loaded\":\n\t\t\treturn ExecutionState.Running({ unit: state.unit })\n\t}\n}\n/** All state transitions are pure; the caller serializes persistence and publication. */\nconst beginLoad = (\n\tstate: Extract<Session, { _tag: \"Open\" }>,\n\trequest: Load,\n\treply: LoadReply,\n): Loading =>\n\tSession.Loading({\n\t\trecord: state.record,\n\t\tdeadline: state.deadline,\n\t\trequest,\n\t\treply,\n\t\tlaunch: Launch.Starting(),\n\t})\nconst registerUnit = (\n\tstate: Session,\n\tunit: Unit,\n): Result.Result<Session, SessionStopped | ExecutionError> => {\n\tif (state._tag !== \"Loading\")\n\t\treturn Result.fail(\n\t\t\tSessionStopped.make({\n\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t}),\n\t\t)\n\tif (state.launch._tag === \"Registered\")\n\t\treturn Result.fail(\n\t\t\tExecutionError.make({\n\t\t\t\tdetail: \"An execution adapter registered more than one child\",\n\t\t\t}),\n\t\t)\n\treturn Result.succeed(\n\t\tSession.Loading({ ...state, launch: Launch.Registered({ unit }) }),\n\t)\n}\nconst loaded = (\n\tstate: Session,\n\tcode: CodeIdentity,\n): Result.Result<Session, SessionStopped | ExecutionError> => {\n\tif (state._tag !== \"Loading\")\n\t\treturn Result.fail(\n\t\t\tSessionStopped.make({\n\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t}),\n\t\t)\n\tif (state.launch._tag !== \"Registered\")\n\t\treturn Result.fail(\n\t\t\tExecutionError.make({\n\t\t\t\tdetail: \"Execution adapter returned without registering its child\",\n\t\t\t}),\n\t\t)\n\treturn Result.succeed(\n\t\tSession.Loaded({\n\t\t\tdeadline: state.deadline,\n\t\t\tunit: state.launch.unit,\n\t\t\trecord: {\n\t\t\t\t...state.record,\n\t\t\t\tphase: \"Loaded\",\n\t\t\t\tload: state.request,\n\t\t\t\tcode,\n\t\t\t\tchild: state.launch.unit.identity,\n\t\t\t},\n\t\t}),\n\t)\n}\nconst beginStop = (\n\tstate: Live,\n\treason: StopReason,\n\treply: StopReply,\n\texit: Option.Option<ExitStatus>,\n): Stopping =>\n\tSession.Stopping({\n\t\trecord: stoppingRecord(snapshot(state), reason),\n\t\treply,\n\t\texecution: Option.match(exit, {\n\t\t\tonNone: () => executionOf(state),\n\t\t\tonSome: (exit) => ExecutionState.Exited({ exit }),\n\t\t}),\n\t})\nconst nanos = (millis: number) => BigInt(Math.ceil(millis * 1_000_000))\nconst emptyTermination: Termination = {\n\tkind: \"Exited\",\n\texit: { code: 0, signal: null },\n\tcause: Cause.empty,\n}\nconst exitCause = <A, E>(exit: Exit.Exit<A, E>) =>\n\tExit.isFailure(exit) ? exit.cause : Cause.empty\n\n/** A signal is a request; only the exited effect confirms that the execution has stopped. */\nconst terminate = Effect.fnUntraced(function* (\n\texecution: ExecutionState,\n\tgrace: number,\n\tconfirmation: number,\n): Effect.fn.Return<Termination, TerminationUnconfirmed> {\n\tif (execution._tag === \"Absent\") return emptyTermination\n\tif (execution._tag === \"Exited\")\n\t\treturn { ...emptyTermination, exit: execution.exit }\n\tconst child = execution.unit\n\tconst graceful = yield* child.interrupt.pipe(\n\t\tEffect.andThen(child.exited),\n\t\tEffect.timeoutOption(grace),\n\t\tEffect.exit,\n\t)\n\tif (Exit.isSuccess(graceful) && Option.isSome(graceful.value))\n\t\treturn { ...emptyTermination, exit: graceful.value.value }\n\tconst killed = yield* Effect.exit(child.kill)\n\tconst forced = yield* child.exited.pipe(\n\t\tEffect.timeoutOption(confirmation),\n\t\tEffect.exit,\n\t)\n\tconst cause = Cause.combine(\n\t\tCause.combine(exitCause(graceful), exitCause(killed)),\n\t\texitCause(forced),\n\t)\n\tif (Exit.isFailure(forced) || Option.isNone(forced.value))\n\t\treturn yield* TerminationUnconfirmed.make({\n\t\t\tdetail: \"The child exit could not be confirmed\",\n\t\t\tcause,\n\t\t})\n\treturn {\n\t\tkind: \"Killed\",\n\t\texit: forced.value.value,\n\t\tcause,\n\t} satisfies Termination\n})\n\nconst initialize = Effect.fnUntraced(function* (options: Options = {}) {\n\tconst store = yield* Store\n\tconst execution = yield* Execution\n\tconst random = yield* SecureRandom.SecureRandom\n\tconst parent = yield* Effect.scope\n\tconst owner = yield* Scope.fork(parent)\n\t// Cleanup must continue after a health failure so every registered process is reaped.\n\tconst workers = yield* FiberSet.make<void, never>().pipe(Scope.provide(owner))\n\tconst locks = yield* RcMap.make({\n\t\tlookup: (_key: SessionKey) => Semaphore.make(1),\n\t}).pipe(Scope.provide(owner))\n\tconst lease = Duration.toMillis(options.lease ?? \"15 seconds\")\n\tconst grace = Duration.toMillis(options.grace ?? \"5 seconds\")\n\tconst confirmation = Duration.toMillis(\n\t\toptions.confirmationTimeout ?? \"5 seconds\",\n\t)\n\tconst limits = options.limits ?? defaults\n\tconst records = yield* Ref.make(HashMap.empty<string, SessionRecord>())\n\tconst entries = yield* Ref.make(HashMap.empty<string, Entry>())\n\tconst health = yield* FailureGroup.make<SupervisorError>().pipe(\n\t\tScope.provide(owner),\n\t)\n\tconst closing = yield* Ref.make(false)\n\treturn {\n\t\tstore,\n\t\texecution,\n\t\trandom,\n\t\towner,\n\t\tworkers,\n\t\tlocks,\n\t\tlease,\n\t\tgrace,\n\t\tconfirmation,\n\t\tlimits,\n\t\trecords,\n\t\tentries,\n\t\thealth,\n\t\tclosing,\n\t}\n})\ntype Runtime = Effect.Success<ReturnType<typeof initialize>>\nconst operations = (runtime: Runtime) => {\n\tconst {\n\t\tstore,\n\t\texecution,\n\t\tworkers,\n\t\tgrace,\n\t\tconfirmation,\n\t\trecords,\n\t\tentries,\n\t\thealth,\n\t\tclosing,\n\t} = runtime\n\n\tconst poison = health.failCause\n\tconst observe = <A>(effect: Effect.Effect<A, SupervisorError>) =>\n\t\teffect.pipe(Effect.asVoid, Effect.catchCause(poison))\n\tconst healthy = health.check.pipe(\n\t\tEffect.andThen(\n\t\t\tEffect.gen(function* () {\n\t\t\t\tif (yield* Ref.get(closing))\n\t\t\t\t\treturn yield* RunnerClosing.make({ detail: \"The runner is closing\" })\n\t\t\t}),\n\t\t),\n\t)\n\tconst persist = (record: SessionRecord) =>\n\t\tstore\n\t\t\t.save(record)\n\t\t\t.pipe(\n\t\t\t\tEffect.tapCause(poison),\n\t\t\t\tEffect.andThen(\n\t\t\t\t\tRef.update(records, (all) => Retention.save(all, record)),\n\t\t\t\t),\n\t\t\t)\n\tconst status = (handle: Handle) =>\n\t\tRef.get(records).pipe(\n\t\t\tEffect.flatMap((all) => {\n\t\t\t\tconst found = HashMap.get(all, handle.token)\n\t\t\t\treturn Option.isSome(found) &&\n\t\t\t\t\tEqual.equals(keyOf(found.value.handle.key), keyOf(handle.key)) &&\n\t\t\t\t\tfound.value.handle.generation === handle.generation\n\t\t\t\t\t? Effect.succeed(found.value)\n\t\t\t\t\t: Effect.fail(\n\t\t\t\t\t\t\tStaleSession.make({\n\t\t\t\t\t\t\t\tdetail: \"Unknown session or generation\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t}),\n\t\t)\n\tconst latest = (key: Key) =>\n\t\tRef.get(records).pipe(\n\t\t\tEffect.map((all) =>\n\t\t\t\tArray.reduce(\n\t\t\t\t\tArray.fromIterable(HashMap.values(all)),\n\t\t\t\t\t0,\n\t\t\t\t\t(value, record) =>\n\t\t\t\t\t\tEqual.equals(keyOf(record.handle.key), keyOf(key))\n\t\t\t\t\t\t\t? Math.max(value, record.handle.generation)\n\t\t\t\t\t\t\t: value,\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\tconst entryFor = Effect.fnUntraced(function* (handle: Handle) {\n\t\tyield* status(handle)\n\t\tconst all = yield* Ref.get(entries)\n\t\tconst found = HashMap.get(all, handle.token)\n\t\tif (Option.isNone(found))\n\t\t\treturn yield* SessionStopped.make({\n\t\t\t\tdetail: \"The session was retired during recovery\",\n\t\t\t})\n\t\treturn found.value\n\t})\n\tconst commit = (\n\t\tentry: Entry,\n\t\ttransition: (\n\t\t\tstate: Session,\n\t\t) => Result.Result<Session, ExecutionError | SessionStopped>,\n\t) =>\n\t\tSynchronizedRef.updateEffect(\n\t\t\tentry.state,\n\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\tconst next = yield* Effect.fromResult(transition(state))\n\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\treturn next\n\t\t\t}),\n\t\t)\n\tconst finishStop = Effect.fnUntraced(function* (\n\t\tentry: Entry,\n\t\tstate: Stopping,\n\t\tsaved: Exit.Exit<void, StateStorageError>,\n\t) {\n\t\tyield* FiberHandle.clear(entry.loading)\n\t\tconst result = yield* terminate(state.execution, grace, confirmation)\n\t\tconst closed = yield* Effect.exit(Release.close(entry.unitScope, Exit.void))\n\t\tconst termination: Termination = {\n\t\t\t...result,\n\t\t\tcause: Cause.combine(result.cause, exitCause(closed)),\n\t\t}\n\t\tconst record = stoppedRecord(\n\t\t\tstate.record.previous,\n\t\t\tstate.record.reason,\n\t\t\ttermination,\n\t\t)\n\t\tyield* SynchronizedRef.updateEffect(entry.state, () =>\n\t\t\tpersist(record).pipe(\n\t\t\t\tEffect.as(Session.Stopped({ record, reply: state.reply })),\n\t\t\t),\n\t\t)\n\t\tif (Exit.isFailure(saved)) return yield* Effect.failCause(saved.cause)\n\t\treturn termination\n\t})\n\t/** Called with the session ref locked; the worker starts after its transition is published. */\n\tconst stopLocked = Effect.fnUntraced(function* (\n\t\tentry: Entry,\n\t\tstate: Session,\n\t\treason: StopReason,\n\t\texit: Option.Option<ExitStatus>,\n\t): Effect.fn.Return<readonly [StopReply, Session]> {\n\t\tif (state._tag === \"Stopping\" || state._tag === \"Stopped\")\n\t\t\treturn [state.reply, state] as const\n\t\tconst reply = yield* Deferred.make<Termination, SupervisorError>()\n\t\tconst next = beginStop(state, reason, reply, exit)\n\t\t// Fence in memory even when the journal cannot acknowledge the transition.\n\t\tconst saved = yield* Effect.exit(persist(next.record))\n\t\tyield* FiberSet.run(\n\t\t\tworkers,\n\t\t\tfinishStop(entry, next, saved).pipe(\n\t\t\t\tEffect.onExit((result) => Deferred.done(reply, result)),\n\t\t\t\tobserve,\n\t\t\t),\n\t\t\t{ startImmediately: false },\n\t\t)\n\t\treturn [reply, next] as const\n\t})\n\tconst stop = (\n\t\tentry: Entry,\n\t\treason: StopReason,\n\t\texit: Option.Option<ExitStatus> = Option.none(),\n\t) =>\n\t\tSynchronizedRef.modifyEffect(entry.state, (state) =>\n\t\t\tstopLocked(entry, state, reason, exit),\n\t\t).pipe(Effect.uninterruptible)\n\tconst scheduleLease = (entry: Entry, deadline: bigint) =>\n\t\tFiberHandle.run(\n\t\t\tentry.timer,\n\t\t\tobserve(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\tyield* Effect.sleep(\n\t\t\t\t\t\tDuration.nanos(deadline > now ? deadline - now : 0n),\n\t\t\t\t\t)\n\t\t\t\t\tyield* SynchronizedRef.updateEffect(entry.state, (state) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate._tag === \"Stopping\" ||\n\t\t\t\t\t\t\tstate._tag === \"Stopped\" ||\n\t\t\t\t\t\t\tstate.deadline !== deadline\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn Effect.succeed(state)\n\t\t\t\t\t\treturn stopLocked(\n\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t{ _tag: \"Expired\" },\n\t\t\t\t\t\t\tOption.none(),\n\t\t\t\t\t\t).pipe(Effect.map(([, next]) => next))\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t),\n\t\t\t{ startImmediately: false },\n\t\t)\n\tconst register = (entry: Entry, unit: Unit) =>\n\t\tSynchronizedRef.updateEffect(\n\t\t\tentry.state,\n\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\tconst next = yield* Effect.fromResult(registerUnit(current, unit))\n\t\t\t\tyield* unit.renew(\n\t\t\t\t\tNumber(current.deadline - (yield* Clock.monotonicTimeNanos)) /\n\t\t\t\t\t\t1_000_000,\n\t\t\t\t)\n\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\tyield* FiberSet.run(\n\t\t\t\t\tworkers,\n\t\t\t\t\tobserve(\n\t\t\t\t\t\tunit.exited.pipe(\n\t\t\t\t\t\t\tEffect.flatMap((exit) =>\n\t\t\t\t\t\t\t\tstop(entry, { _tag: \"Exited\" }, Option.some(exit)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\treturn next\n\t\t\t}),\n\t\t).pipe(Effect.uninterruptible)\n\tconst runLoad = (entry: Entry, state: Loading) =>\n\t\texecution\n\t\t\t.spawn(state.record.handle, state.request, state.record.limits)\n\t\t\t.pipe(\n\t\t\t\tScope.provide(entry.unitScope),\n\t\t\t\tEffect.flatMap((unit) =>\n\t\t\t\t\tregister(entry, unit).pipe(\n\t\t\t\t\t\tEffect.andThen(unit.start),\n\t\t\t\t\t\tEffect.as(unit.code),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tEffect.tap((code) => commit(entry, (current) => loaded(current, code))),\n\t\t\t\tEffect.onExit(\n\t\t\t\t\tEffect.fnUntraced(function* (\n\t\t\t\t\t\tresult: Exit.Exit<CodeIdentity, SupervisorError>,\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (Exit.isSuccess(result)) {\n\t\t\t\t\t\t\tyield* Deferred.done(state.reply, result)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst current = yield* SynchronizedRef.get(entry.state)\n\t\t\t\t\t\tif (current._tag === \"Loading\")\n\t\t\t\t\t\t\tyield* stop(entry, { _tag: \"LoadFailed\", cause: result.cause })\n\t\t\t\t\t\tconst healthCause = yield* health.cause\n\t\t\t\t\t\tyield* Deferred.failCause(\n\t\t\t\t\t\t\tstate.reply,\n\t\t\t\t\t\t\tCause.combine(result.cause, healthCause),\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\t// Load's caller observes its complete exit through the reply, including cancellation.\n\t\t\t\tEffect.exit,\n\t\t\t\tEffect.asVoid,\n\t\t\t)\n\n\treturn {\n\t\tpersist,\n\t\tstatus,\n\t\tlatest,\n\t\tentryFor,\n\t\tstop,\n\t\tscheduleLease,\n\t\trunLoad,\n\t\thealthy,\n\t}\n}\ntype Operations = ReturnType<typeof operations>\nconst recover = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { store, execution, confirmation, records } = runtime\n\tconst { persist } = actions\n\t// Recover before the service is published. Construction does not resume old leases.\n\tconst stored = yield* store.list\n\tyield* Ref.set(\n\t\trecords,\n\t\tHashMap.fromIterable(\n\t\t\tArray.map(stored, (record) => [record.handle.token, record] as const),\n\t\t),\n\t)\n\tfor (const record of stored) {\n\t\tif (record.phase === \"Stopped\") continue\n\t\tconst child = childOf(record)\n\t\tconst termination = Option.isNone(child)\n\t\t\t? emptyTermination\n\t\t\t: yield* execution.recover(child.value).pipe(\n\t\t\t\t\tEffect.timeout(confirmation),\n\t\t\t\t\tEffect.catchTags({\n\t\t\t\t\t\tExecutionError: (error) =>\n\t\t\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\t\t\tTerminationUnconfirmed.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Orphan recovery did not confirm exit\",\n\t\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\tTimeoutError: (error) =>\n\t\t\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\t\t\tTerminationUnconfirmed.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Orphan recovery did not confirm exit\",\n\t\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\tyield* persist(\n\t\t\tstoppedRecord(\n\t\t\t\trecord.phase === \"Stopping\" ? record.previous : record,\n\t\t\t\t{ _tag: \"Recovery\" },\n\t\t\t\ttermination,\n\t\t\t),\n\t\t)\n\t}\n})\nconst ownShutdown = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { entries, health, closing } = runtime\n\tconst { stop } = actions\n\tyield* Effect.addFinalizer(\n\t\tEffect.fnUntraced(function* () {\n\t\t\tyield* Ref.set(closing, true)\n\t\t\tconst all = yield* Ref.get(entries)\n\t\t\tconst exits = yield* Effect.forEach(HashMap.values(all), (entry) =>\n\t\t\t\tstop(entry, { _tag: \"Shutdown\" }).pipe(\n\t\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t\t\tEffect.exit,\n\t\t\t\t),\n\t\t\t)\n\t\t\tconst initial: Cause.Cause<unknown> = yield* health.cause\n\t\t\tconst cause = Array.reduce(exits, initial, (cause, exit) =>\n\t\t\t\tCause.combine(\n\t\t\t\t\tcause,\n\t\t\t\t\tExit.isFailure(exit) ? exit.cause : exit.value.cause,\n\t\t\t\t),\n\t\t\t)\n\t\t\tif (cause.reasons.length > 0)\n\t\t\t\treturn yield* Effect.failCause(cleanupCause(cause))\n\t\t}),\n\t)\n})\nconst protocol = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { random, owner, locks, lease, limits, records, entries, health } =\n\t\truntime\n\tconst {\n\t\tpersist,\n\t\tstatus,\n\t\tlatest,\n\t\tentryFor,\n\t\tstop,\n\t\tscheduleLease,\n\t\trunLoad,\n\t\thealthy,\n\t} = actions\n\treturn Supervisor.of({\n\t\tawait: health.await,\n\t\tstatus,\n\t\thighWater: (key) =>\n\t\t\tlatest(key).pipe(Effect.map((value) => (value === 0 ? null : value))),\n\t\topen: Effect.fnUntraced(function* (request: Open) {\n\t\t\tyield* healthy\n\t\t\tconst leaseMillis = Duration.toMillis(request.lease ?? lease)\n\t\t\tconst negotiated = negotiate(limits, request.limits ?? defaults)\n\t\t\tconst lock = yield* RcMap.get(locks, keyOf(request.key))\n\t\t\treturn yield* Effect.gen(function* () {\n\t\t\t\tyield* healthy\n\t\t\t\tconst allRecords = yield* Ref.get(records)\n\t\t\t\tconst same = Array.filter(\n\t\t\t\t\tArray.fromIterable(HashMap.values(allRecords)),\n\t\t\t\t\t(row) => Equal.equals(keyOf(row.handle.key), keyOf(request.key)),\n\t\t\t\t)\n\t\t\t\tconst prior = Array.findFirst(\n\t\t\t\t\tsame,\n\t\t\t\t\t(row) => row.requestId === request.requestId,\n\t\t\t\t)\n\t\t\t\tif (Option.isSome(prior)) return prior.value\n\t\t\t\tconst generation = yield* latest(request.key)\n\t\t\t\tif (generation !== (request.expectedGeneration ?? 0))\n\t\t\t\t\treturn yield* StaleSession.make({\n\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\t\"Open expectedGeneration does not match the generation high-water mark\",\n\t\t\t\t\t})\n\t\t\t\tfor (const record of same) {\n\t\t\t\t\tconst allEntries = yield* Ref.get(entries)\n\t\t\t\t\tconst entry = HashMap.get(allEntries, record.handle.token)\n\t\t\t\t\tif (Option.isSome(entry))\n\t\t\t\t\t\tyield* stop(entry.value, { _tag: \"Superseded\" }).pipe(\n\t\t\t\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t\t\t\t\tEffect.tap((result) =>\n\t\t\t\t\t\t\t\tresult.cause.reasons.length === 0\n\t\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t\t: Effect.logWarning(\n\t\t\t\t\t\t\t\t\t\t\t\"Superseded remote execution cleanup failed\",\n\t\t\t\t\t\t\t\t\t\t\tresult.cause,\n\t\t\t\t\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.identity\": record.handle.key.identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.instance\": record.handle.key.instance,\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.generation\": record.handle.generation,\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tyield* healthy\n\t\t\t\tconst token = yield* random.uuidV4()\n\t\t\t\tconst record: typeof OpenRecord.Type = {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tphase: \"Open\",\n\t\t\t\t\thandle: {\n\t\t\t\t\t\tkey: request.key,\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\tgeneration: generation + 1,\n\t\t\t\t\t},\n\t\t\t\t\trequestId: request.requestId,\n\t\t\t\t\tleaseMillis,\n\t\t\t\t\tlimits: negotiated,\n\t\t\t\t}\n\t\t\t\treturn yield* Effect.uninterruptible(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* persist(record)\n\t\t\t\t\t\tconst deadline =\n\t\t\t\t\t\t\t(yield* Clock.monotonicTimeNanos) + nanos(leaseMillis)\n\t\t\t\t\t\tconst scope = yield* Scope.fork(owner)\n\t\t\t\t\t\tconst entry: Entry = {\n\t\t\t\t\t\t\tstate: yield* SynchronizedRef.make<Session>(\n\t\t\t\t\t\t\t\tSession.Open({ record, deadline }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tscope,\n\t\t\t\t\t\t\tunitScope: yield* Scope.fork(scope),\n\t\t\t\t\t\t\ttimer: yield* FiberHandle.make<void, never>().pipe(\n\t\t\t\t\t\t\t\tScope.provide(scope),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tloading: yield* FiberHandle.make<void, never>().pipe(\n\t\t\t\t\t\t\t\tScope.provide(scope),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// The store's retention policy is also the in-memory eviction policy.\n\t\t\t\t\t\tconst retained = yield* Ref.get(records)\n\t\t\t\t\t\tconst old = yield* Ref.modify(\n\t\t\t\t\t\t\tentries,\n\t\t\t\t\t\t\t(all) =>\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\tArray.filter(\n\t\t\t\t\t\t\t\t\t\tArray.fromIterable(HashMap.entries(all)),\n\t\t\t\t\t\t\t\t\t\t([key]) => !HashMap.has(retained, key),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tHashMap.set(\n\t\t\t\t\t\t\t\t\t\tHashMap.filter(all, (_, key) => HashMap.has(retained, key)),\n\t\t\t\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t] as const,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tfor (const [, retired] of old)\n\t\t\t\t\t\t\tyield* Release.close(retired.scope, Exit.void)\n\t\t\t\t\t\tyield* scheduleLease(entry, deadline)\n\t\t\t\t\t\treturn record\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}).pipe(lock.withPermit)\n\t\t}, Effect.scoped),\n\t\trenew: Effect.fnUntraced(function* (handle: Handle) {\n\t\t\tyield* healthy\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\t// Arming the new timer interrupts the old one, so the new deadline must be stored too.\n\t\t\t// Telling the child may block on its control pipe, so that step stays interruptible:\n\t\t\t// if it is cut short, nothing is stored and the old timer keeps its deadline.\n\t\t\treturn yield* Effect.uninterruptibleMask((restore) =>\n\t\t\t\tSynchronizedRef.modifyEffect(\n\t\t\t\t\tentry.state,\n\t\t\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\t\t\tconst running = executionOf(current)\n\t\t\t\t\t\tif (running._tag === \"Running\")\n\t\t\t\t\t\t\tyield* restore(running.unit.renew(current.record.leaseMillis))\n\t\t\t\t\t\tconst deadline = now + nanos(current.record.leaseMillis)\n\t\t\t\t\t\tyield* scheduleLease(entry, deadline)\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tcurrent.record.leaseMillis,\n\t\t\t\t\t\t\t{ ...current, deadline },\n\t\t\t\t\t\t] as const\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t}),\n\t\tload: Effect.fnUntraced(function* (handle: Handle, request: Load) {\n\t\t\tyield* healthy\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\tconst reply = yield* SynchronizedRef.modifyEffect(\n\t\t\t\tentry.state,\n\t\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\t\tif (current._tag !== \"Open\") {\n\t\t\t\t\t\tconst before =\n\t\t\t\t\t\t\tcurrent._tag === \"Loading\" ? current.request : current.record.load\n\t\t\t\t\t\tif (before.specifier !== request.specifier)\n\t\t\t\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\t\t\t\tdetail: \"Load was already requested with a different specifier\",\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tcurrent._tag === \"Loading\"\n\t\t\t\t\t\t\t\t? Deferred.await(current.reply)\n\t\t\t\t\t\t\t\t: Effect.succeed(current.record.code),\n\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t] as const\n\t\t\t\t\t}\n\t\t\t\t\tconst done = yield* Deferred.make<CodeIdentity, SupervisorError>()\n\t\t\t\t\tconst next = beginLoad(current, request, done)\n\t\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\t\tif (next._tag === \"Loading\")\n\t\t\t\t\t\tyield* FiberHandle.run(entry.loading, runLoad(entry, next), {\n\t\t\t\t\t\t\tstartImmediately: false,\n\t\t\t\t\t\t})\n\t\t\t\t\treturn [Deferred.await(done), next] as const\n\t\t\t\t}),\n\t\t\t).pipe(Effect.uninterruptible)\n\t\t\treturn yield* reply\n\t\t}),\n\t\tdispose: Effect.fnUntraced(function* (handle: Handle) {\n\t\t\tconst record = yield* status(handle)\n\t\t\tif (record.phase === \"Stopped\") return record.termination\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\treturn yield* stop(entry, { _tag: \"Disposed\" }).pipe(\n\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t)\n\t\t}),\n\t})\n})\nexport const make = Effect.fnUntraced(function* (options: Options = {}) {\n\tconst runtime = yield* initialize(options)\n\tconst actions = operations(runtime)\n\tyield* recover(runtime, actions)\n\tyield* ownShutdown(runtime, actions)\n\treturn yield* protocol(runtime, actions)\n})\nexport const layer = (options: Options = {}) =>\n\tLayer.effect(Supervisor, make(options))\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Supervisor.js","names":["FailureGroup.make","Retention.save"],"sources":["../../../src/internal/runner/Supervisor.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tClock,\n\tContext,\n\tData,\n\tDeferred,\n\tDuration,\n\tEffect,\n\tEqual,\n\tExit,\n\tFiberHandle,\n\tFiberSet,\n\tHashMap,\n\tLayer,\n\tOption,\n\tRcMap,\n\tRef,\n\tResult,\n\tScope,\n\tSemaphore,\n\tSynchronizedRef,\n} from \"effect\"\nimport { SecureRandom } from \"effect/crypto\"\n\nimport * as Release from \"@graftland/graft/Release\"\n\nimport { cleanupCause } from \"../cleanup\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport {\n\tchildOf,\n\tdefaults,\n\tExecution,\n\tExecutionError,\n\tkeyOf,\n\tLeaseExpired,\n\tnegotiate,\n\tPackageError,\n\tRunnerClosing,\n\tSessionConflict,\n\tSessionStopped,\n\tStaleSession,\n\tStateStorageError,\n\tstoppedRecord,\n\tstoppingRecord,\n\tStore,\n\tTerminationUnconfirmed,\n\ttype ActiveRecord,\n\ttype CodeIdentity,\n\ttype ExitStatus,\n\ttype Handle,\n\ttype Key,\n\ttype Limits,\n\ttype Load,\n\ttype LoadedRecord,\n\ttype OpenRecord,\n\ttype SessionKey,\n\ttype SessionRecord,\n\ttype StoppedRecord,\n\ttype StoppingRecord,\n\ttype StopReason,\n\ttype Termination,\n\ttype Unit,\n} from \"./model\"\nimport * as Retention from \"./Retention\"\n\nexport type SupervisorError =\n\t| StaleSession\n\t| LeaseExpired\n\t| SessionStopped\n\t| SessionConflict\n\t| StateStorageError\n\t| ExecutionError\n\t| PackageError\n\t| TerminationUnconfirmed\n\t| RunnerClosing\nexport interface Options {\n\treadonly lease?: Duration.Input\n\treadonly grace?: Duration.Input\n\treadonly confirmationTimeout?: Duration.Input\n\treadonly limits?: Limits\n}\nexport interface Open {\n\treadonly key: Key\n\treadonly requestId: string\n\treadonly expectedGeneration?: number | null\n\treadonly lease?: Duration.Input\n\treadonly limits?: Limits\n}\nexport class Supervisor extends Context.Service<\n\tSupervisor,\n\t{\n\t\treadonly await: Effect.Effect<never, SupervisorError>\n\t\treadonly status: (\n\t\t\thandle: Handle,\n\t\t) => Effect.Effect<SessionRecord, StaleSession>\n\t\treadonly highWater: (key: Key) => Effect.Effect<number | null>\n\t\treadonly open: (\n\t\t\trequest: Open,\n\t\t) => Effect.Effect<SessionRecord, SupervisorError>\n\t\treadonly renew: (handle: Handle) => Effect.Effect<number, SupervisorError>\n\t\treadonly load: (\n\t\t\thandle: Handle,\n\t\t\trequest: Load,\n\t\t) => Effect.Effect<CodeIdentity, SupervisorError>\n\t\treadonly dispose: (\n\t\t\thandle: Handle,\n\t\t) => Effect.Effect<Termination, SupervisorError>\n\t}\n>()(\"@graftland/plugin-remote/internal/runner/Supervisor\") {}\n\ntype Launch = Data.TaggedEnum<{\n\tStarting: {}\n\tRegistered: { readonly unit: Unit }\n}>\nconst Launch = Data.taggedEnum<Launch>()\ntype ExecutionState = Data.TaggedEnum<{\n\tAbsent: {}\n\tRunning: { readonly unit: Unit }\n\tExited: { readonly exit: ExitStatus }\n}>\nconst ExecutionState = Data.taggedEnum<ExecutionState>()\ntype LoadReply = Deferred.Deferred<CodeIdentity, SupervisorError>\ntype StopReply = Deferred.Deferred<Termination, SupervisorError>\ntype Session = Data.TaggedEnum<{\n\tOpen: { readonly record: typeof OpenRecord.Type; readonly deadline: bigint }\n\tLoading: {\n\t\treadonly record: typeof OpenRecord.Type\n\t\treadonly request: Load\n\t\treadonly launch: Launch\n\t\treadonly reply: LoadReply\n\t\treadonly deadline: bigint\n\t}\n\tLoaded: {\n\t\treadonly record: typeof LoadedRecord.Type\n\t\treadonly unit: Unit\n\t\treadonly deadline: bigint\n\t}\n\tStopping: {\n\t\treadonly record: typeof StoppingRecord.Type\n\t\treadonly execution: ExecutionState\n\t\treadonly reply: StopReply\n\t}\n\tStopped: {\n\t\treadonly record: typeof StoppedRecord.Type\n\t\treadonly reply: StopReply\n\t}\n}>\nconst Session = Data.taggedEnum<Session>()\ntype Live = Extract<Session, { readonly _tag: \"Open\" | \"Loading\" | \"Loaded\" }>\ntype Loading = Extract<Session, { readonly _tag: \"Loading\" }>\ntype Stopping = Extract<Session, { readonly _tag: \"Stopping\" }>\ninterface Entry {\n\treadonly state: SynchronizedRef.SynchronizedRef<Session>\n\treadonly timer: FiberHandle.FiberHandle<void, never>\n\treadonly loading: FiberHandle.FiberHandle<void, never>\n\treadonly scope: Scope.Closeable\n\treadonly unitScope: Scope.Closeable\n}\nfunction snapshot(state: Live): ActiveRecord\nfunction snapshot(state: Session): SessionRecord\nfunction snapshot(state: Session): SessionRecord {\n\treturn state._tag === \"Loading\"\n\t\t? {\n\t\t\t\t...state.record,\n\t\t\t\tphase: \"Loading\",\n\t\t\t\tload: state.request,\n\t\t\t\tlaunch:\n\t\t\t\t\tstate.launch._tag === \"Starting\"\n\t\t\t\t\t\t? { _tag: \"Starting\" }\n\t\t\t\t\t\t: { _tag: \"Registered\", child: state.launch.unit.identity },\n\t\t\t}\n\t\t: state.record\n}\nconst live = (\n\tstate: Session,\n\tnow: bigint,\n): Result.Result<Live, LeaseExpired | SessionStopped> => {\n\tif (state._tag === \"Stopping\" || state._tag === \"Stopped\")\n\t\treturn Result.fail(\n\t\t\tstate.record.reason._tag === \"Expired\"\n\t\t\t\t? LeaseExpired.make({\n\t\t\t\t\t\tdetail: \"The session lease has expired\",\n\t\t\t\t\t})\n\t\t\t\t: SessionStopped.make({\n\t\t\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t\t\t}),\n\t\t)\n\treturn now >= state.deadline\n\t\t? Result.fail(\n\t\t\t\tLeaseExpired.make({\n\t\t\t\t\tdetail: \"The session lease has expired\",\n\t\t\t\t}),\n\t\t\t)\n\t\t: Result.succeed(state)\n}\nconst executionOf = (state: Live): ExecutionState => {\n\tswitch (state._tag) {\n\t\tcase \"Open\":\n\t\t\treturn ExecutionState.Absent()\n\t\tcase \"Loading\":\n\t\t\treturn state.launch._tag === \"Registered\"\n\t\t\t\t? ExecutionState.Running({ unit: state.launch.unit })\n\t\t\t\t: ExecutionState.Absent()\n\t\tcase \"Loaded\":\n\t\t\treturn ExecutionState.Running({ unit: state.unit })\n\t}\n}\n/** All state transitions are pure; the caller serializes persistence and publication. */\nconst beginLoad = (\n\tstate: Extract<Session, { _tag: \"Open\" }>,\n\trequest: Load,\n\treply: LoadReply,\n): Loading =>\n\tSession.Loading({\n\t\trecord: state.record,\n\t\tdeadline: state.deadline,\n\t\trequest,\n\t\treply,\n\t\tlaunch: Launch.Starting(),\n\t})\nconst registerUnit = (\n\tstate: Session,\n\tunit: Unit,\n): Result.Result<Session, SessionStopped | ExecutionError> => {\n\tif (state._tag !== \"Loading\")\n\t\treturn Result.fail(\n\t\t\tSessionStopped.make({\n\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t}),\n\t\t)\n\tif (state.launch._tag === \"Registered\")\n\t\treturn Result.fail(\n\t\t\tExecutionError.make({\n\t\t\t\tdetail: \"An execution adapter registered more than one child\",\n\t\t\t}),\n\t\t)\n\treturn Result.succeed(\n\t\tSession.Loading({ ...state, launch: Launch.Registered({ unit }) }),\n\t)\n}\nconst loaded = (\n\tstate: Session,\n\tcode: CodeIdentity,\n): Result.Result<Session, SessionStopped | ExecutionError> => {\n\tif (state._tag !== \"Loading\")\n\t\treturn Result.fail(\n\t\t\tSessionStopped.make({\n\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t}),\n\t\t)\n\tif (state.launch._tag !== \"Registered\")\n\t\treturn Result.fail(\n\t\t\tExecutionError.make({\n\t\t\t\tdetail: \"Execution adapter returned without registering its child\",\n\t\t\t}),\n\t\t)\n\treturn Result.succeed(\n\t\tSession.Loaded({\n\t\t\tdeadline: state.deadline,\n\t\t\tunit: state.launch.unit,\n\t\t\trecord: {\n\t\t\t\t...state.record,\n\t\t\t\tphase: \"Loaded\",\n\t\t\t\tload: state.request,\n\t\t\t\tcode,\n\t\t\t\tchild: state.launch.unit.identity,\n\t\t\t},\n\t\t}),\n\t)\n}\nconst beginStop = (\n\tstate: Live,\n\treason: StopReason,\n\treply: StopReply,\n\texit: Option.Option<ExitStatus>,\n): Stopping =>\n\tSession.Stopping({\n\t\trecord: stoppingRecord(snapshot(state), reason),\n\t\treply,\n\t\texecution: Option.match(exit, {\n\t\t\tonNone: () => executionOf(state),\n\t\t\tonSome: (exit) => ExecutionState.Exited({ exit }),\n\t\t}),\n\t})\nconst nanos = (millis: number) => BigInt(Math.ceil(millis * 1_000_000))\nconst emptyTermination: Termination = {\n\tkind: \"Exited\",\n\texit: { code: 0, signal: null },\n\tcause: Cause.empty,\n}\nconst exitCause = <A, E>(exit: Exit.Exit<A, E>) =>\n\tExit.isFailure(exit) ? exit.cause : Cause.empty\n\n/** A signal is a request; only the exited effect confirms that the execution has stopped. */\nconst terminate = Effect.fnUntraced(function* (\n\texecution: ExecutionState,\n\tgrace: number,\n\tconfirmation: number,\n): Effect.fn.Return<Termination, TerminationUnconfirmed> {\n\tif (execution._tag === \"Absent\") return emptyTermination\n\tif (execution._tag === \"Exited\")\n\t\treturn { ...emptyTermination, exit: execution.exit }\n\tconst child = execution.unit\n\tconst graceful = yield* child.interrupt.pipe(\n\t\tEffect.andThen(child.exited),\n\t\tEffect.timeoutOption(grace),\n\t\tEffect.exit,\n\t)\n\tif (Exit.isSuccess(graceful) && Option.isSome(graceful.value))\n\t\treturn { ...emptyTermination, exit: graceful.value.value }\n\tconst killed = yield* Effect.exit(child.kill)\n\tconst forced = yield* child.exited.pipe(\n\t\tEffect.timeoutOption(confirmation),\n\t\tEffect.exit,\n\t)\n\tconst cause = Cause.combine(\n\t\tCause.combine(exitCause(graceful), exitCause(killed)),\n\t\texitCause(forced),\n\t)\n\tif (Exit.isFailure(forced) || Option.isNone(forced.value))\n\t\treturn yield* TerminationUnconfirmed.make({\n\t\t\tdetail: \"The child exit could not be confirmed\",\n\t\t\tcause,\n\t\t})\n\treturn {\n\t\tkind: \"Killed\",\n\t\texit: forced.value.value,\n\t\tcause,\n\t} satisfies Termination\n})\n\nconst initialize = Effect.fnUntraced(function* (options: Options = {}) {\n\tconst store = yield* Store\n\tconst execution = yield* Execution\n\tconst random = yield* SecureRandom.SecureRandom\n\tconst parent = yield* Effect.scope\n\tconst owner = yield* Scope.fork(parent)\n\t// Cleanup must continue after a health failure so every registered process is reaped.\n\tconst workers = yield* FiberSet.make<void, never>().pipe(Scope.provide(owner))\n\tconst locks = yield* RcMap.make({\n\t\tlookup: (_key: SessionKey) => Semaphore.make(1),\n\t}).pipe(Scope.provide(owner))\n\tconst lease = Duration.toMillis(options.lease ?? \"15 seconds\")\n\tconst grace = Duration.toMillis(options.grace ?? \"5 seconds\")\n\tconst confirmation = Duration.toMillis(\n\t\toptions.confirmationTimeout ?? \"5 seconds\",\n\t)\n\tconst limits = options.limits ?? defaults\n\tconst records = yield* Ref.make(HashMap.empty<string, SessionRecord>())\n\tconst entries = yield* Ref.make(HashMap.empty<string, Entry>())\n\tconst health = yield* FailureGroup.make<SupervisorError>().pipe(\n\t\tScope.provide(owner),\n\t)\n\tconst closing = yield* Ref.make(false)\n\treturn {\n\t\tstore,\n\t\texecution,\n\t\trandom,\n\t\towner,\n\t\tworkers,\n\t\tlocks,\n\t\tlease,\n\t\tgrace,\n\t\tconfirmation,\n\t\tlimits,\n\t\trecords,\n\t\tentries,\n\t\thealth,\n\t\tclosing,\n\t}\n})\ntype Runtime = Effect.Success<ReturnType<typeof initialize>>\nconst operations = (runtime: Runtime) => {\n\tconst {\n\t\tstore,\n\t\texecution,\n\t\tworkers,\n\t\tgrace,\n\t\tconfirmation,\n\t\trecords,\n\t\tentries,\n\t\thealth,\n\t\tclosing,\n\t} = runtime\n\n\tconst poison = health.failCause\n\tconst observe = <A>(effect: Effect.Effect<A, SupervisorError>) =>\n\t\teffect.pipe(Effect.asVoid, Effect.catchCause(poison))\n\tconst healthy = health.check.pipe(\n\t\tEffect.andThen(\n\t\t\tEffect.gen(function* () {\n\t\t\t\tif (yield* Ref.get(closing))\n\t\t\t\t\treturn yield* RunnerClosing.make({ detail: \"The runner is closing\" })\n\t\t\t}),\n\t\t),\n\t)\n\tconst persist = (record: SessionRecord) =>\n\t\tstore\n\t\t\t.save(record)\n\t\t\t.pipe(\n\t\t\t\tEffect.tapCause(poison),\n\t\t\t\tEffect.andThen(\n\t\t\t\t\tRef.update(records, (all) => Retention.save(all, record)),\n\t\t\t\t),\n\t\t\t)\n\tconst status = (handle: Handle) =>\n\t\tRef.get(records).pipe(\n\t\t\tEffect.flatMap((all) => {\n\t\t\t\tconst found = HashMap.get(all, handle.token)\n\t\t\t\treturn Option.isSome(found) &&\n\t\t\t\t\tEqual.equals(keyOf(found.value.handle.key), keyOf(handle.key)) &&\n\t\t\t\t\tfound.value.handle.generation === handle.generation\n\t\t\t\t\t? Effect.succeed(found.value)\n\t\t\t\t\t: Effect.fail(\n\t\t\t\t\t\t\tStaleSession.make({\n\t\t\t\t\t\t\t\tdetail: \"Unknown session or generation\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t}),\n\t\t)\n\tconst latest = (key: Key) =>\n\t\tRef.get(records).pipe(\n\t\t\tEffect.map((all) =>\n\t\t\t\tArray.reduce(\n\t\t\t\t\tArray.fromIterable(HashMap.values(all)),\n\t\t\t\t\t0,\n\t\t\t\t\t(value, record) =>\n\t\t\t\t\t\tEqual.equals(keyOf(record.handle.key), keyOf(key))\n\t\t\t\t\t\t\t? Math.max(value, record.handle.generation)\n\t\t\t\t\t\t\t: value,\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\tconst entryFor = Effect.fnUntraced(function* (handle: Handle) {\n\t\tyield* status(handle)\n\t\tconst all = yield* Ref.get(entries)\n\t\tconst found = HashMap.get(all, handle.token)\n\t\tif (Option.isNone(found))\n\t\t\treturn yield* SessionStopped.make({\n\t\t\t\tdetail: \"The session was retired during recovery\",\n\t\t\t})\n\t\treturn found.value\n\t})\n\tconst commit = (\n\t\tentry: Entry,\n\t\ttransition: (\n\t\t\tstate: Session,\n\t\t) => Result.Result<Session, ExecutionError | SessionStopped>,\n\t) =>\n\t\tSynchronizedRef.updateEffect(\n\t\t\tentry.state,\n\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\tconst next = yield* Effect.fromResult(transition(state))\n\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\treturn next\n\t\t\t}),\n\t\t)\n\tconst finishStop = Effect.fnUntraced(function* (\n\t\tentry: Entry,\n\t\tstate: Stopping,\n\t\tsaved: Exit.Exit<void, StateStorageError>,\n\t) {\n\t\tyield* FiberHandle.clear(entry.loading)\n\t\tconst result = yield* terminate(state.execution, grace, confirmation)\n\t\tconst closed = yield* Effect.exit(Release.close(entry.unitScope, Exit.void))\n\t\tconst termination: Termination = {\n\t\t\t...result,\n\t\t\tcause: Cause.combine(result.cause, exitCause(closed)),\n\t\t}\n\t\tconst record = stoppedRecord(\n\t\t\tstate.record.previous,\n\t\t\tstate.record.reason,\n\t\t\ttermination,\n\t\t)\n\t\tyield* SynchronizedRef.updateEffect(entry.state, () =>\n\t\t\tpersist(record).pipe(\n\t\t\t\tEffect.as(Session.Stopped({ record, reply: state.reply })),\n\t\t\t),\n\t\t)\n\t\tif (Exit.isFailure(saved)) return yield* Effect.failCause(saved.cause)\n\t\treturn termination\n\t})\n\t/** Called with the session ref locked; the worker starts after its transition is published. */\n\tconst stopLocked = Effect.fnUntraced(function* (\n\t\tentry: Entry,\n\t\tstate: Session,\n\t\treason: StopReason,\n\t\texit: Option.Option<ExitStatus>,\n\t): Effect.fn.Return<readonly [StopReply, Session]> {\n\t\tif (state._tag === \"Stopping\" || state._tag === \"Stopped\")\n\t\t\treturn [state.reply, state] as const\n\t\tconst reply = yield* Deferred.make<Termination, SupervisorError>()\n\t\tconst next = beginStop(state, reason, reply, exit)\n\t\t// Fence in memory even when the journal cannot acknowledge the transition.\n\t\tconst saved = yield* Effect.exit(persist(next.record))\n\t\tyield* FiberSet.run(\n\t\t\tworkers,\n\t\t\tfinishStop(entry, next, saved).pipe(\n\t\t\t\tEffect.onExit((result) => Deferred.done(reply, result)),\n\t\t\t\tobserve,\n\t\t\t),\n\t\t\t{ startImmediately: false },\n\t\t)\n\t\treturn [reply, next] as const\n\t})\n\tconst stop = (\n\t\tentry: Entry,\n\t\treason: StopReason,\n\t\texit: Option.Option<ExitStatus> = Option.none(),\n\t) =>\n\t\tSynchronizedRef.modifyEffect(entry.state, (state) =>\n\t\t\tstopLocked(entry, state, reason, exit),\n\t\t).pipe(Effect.uninterruptible)\n\tconst scheduleLease = (entry: Entry, deadline: bigint) =>\n\t\tFiberHandle.run(\n\t\t\tentry.timer,\n\t\t\tobserve(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\tyield* Effect.sleep(\n\t\t\t\t\t\tDuration.nanos(deadline > now ? deadline - now : 0n),\n\t\t\t\t\t)\n\t\t\t\t\tyield* SynchronizedRef.updateEffect(entry.state, (state) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate._tag === \"Stopping\" ||\n\t\t\t\t\t\t\tstate._tag === \"Stopped\" ||\n\t\t\t\t\t\t\tstate.deadline !== deadline\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn Effect.succeed(state)\n\t\t\t\t\t\treturn stopLocked(\n\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t{ _tag: \"Expired\" },\n\t\t\t\t\t\t\tOption.none(),\n\t\t\t\t\t\t).pipe(Effect.map(([, next]) => next))\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t),\n\t\t\t{ startImmediately: false },\n\t\t)\n\tconst register = (entry: Entry, unit: Unit) =>\n\t\tSynchronizedRef.updateEffect(\n\t\t\tentry.state,\n\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\tconst next = yield* Effect.fromResult(registerUnit(current, unit))\n\t\t\t\tyield* unit.renew(\n\t\t\t\t\tNumber(current.deadline - (yield* Clock.monotonicTimeNanos)) /\n\t\t\t\t\t\t1_000_000,\n\t\t\t\t)\n\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\tyield* FiberSet.run(\n\t\t\t\t\tworkers,\n\t\t\t\t\tobserve(\n\t\t\t\t\t\tunit.exited.pipe(\n\t\t\t\t\t\t\tEffect.flatMap((exit) =>\n\t\t\t\t\t\t\t\tstop(entry, { _tag: \"Exited\" }, Option.some(exit)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\treturn next\n\t\t\t}),\n\t\t).pipe(Effect.uninterruptible)\n\tconst runLoad = (entry: Entry, state: Loading) =>\n\t\texecution\n\t\t\t.spawn(state.record.handle, state.request, state.record.limits)\n\t\t\t.pipe(\n\t\t\t\tScope.provide(entry.unitScope),\n\t\t\t\tEffect.flatMap((unit) =>\n\t\t\t\t\tregister(entry, unit).pipe(\n\t\t\t\t\t\tEffect.andThen(unit.start),\n\t\t\t\t\t\tEffect.as(unit.code),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tEffect.tap((code) => commit(entry, (current) => loaded(current, code))),\n\t\t\t\tEffect.onExit(\n\t\t\t\t\tEffect.fnUntraced(function* (\n\t\t\t\t\t\tresult: Exit.Exit<CodeIdentity, SupervisorError>,\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (Exit.isSuccess(result)) {\n\t\t\t\t\t\t\tyield* Deferred.done(state.reply, result)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst current = yield* SynchronizedRef.get(entry.state)\n\t\t\t\t\t\tif (current._tag === \"Loading\")\n\t\t\t\t\t\t\tyield* stop(entry, { _tag: \"LoadFailed\", cause: result.cause })\n\t\t\t\t\t\tconst healthCause = yield* health.cause\n\t\t\t\t\t\tyield* Deferred.failCause(\n\t\t\t\t\t\t\tstate.reply,\n\t\t\t\t\t\t\tCause.combine(result.cause, healthCause),\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\t// Load's caller observes its complete exit through the reply, including cancellation.\n\t\t\t\tEffect.exit,\n\t\t\t\tEffect.asVoid,\n\t\t\t)\n\n\treturn {\n\t\tpersist,\n\t\tstatus,\n\t\tlatest,\n\t\tentryFor,\n\t\tstop,\n\t\tscheduleLease,\n\t\trunLoad,\n\t\thealthy,\n\t}\n}\ntype Operations = ReturnType<typeof operations>\nconst recover = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { store, execution, confirmation, records } = runtime\n\tconst { persist } = actions\n\t// Recover before the service is published. Construction does not resume old leases.\n\tconst stored = yield* store.list\n\tyield* Ref.set(\n\t\trecords,\n\t\tHashMap.fromIterable(\n\t\t\tArray.map(stored, (record) => [record.handle.token, record] as const),\n\t\t),\n\t)\n\tfor (const record of stored) {\n\t\tif (record.phase === \"Stopped\") continue\n\t\tconst child = childOf(record)\n\t\tconst termination = Option.isNone(child)\n\t\t\t? emptyTermination\n\t\t\t: yield* execution.recover(child.value).pipe(\n\t\t\t\t\tEffect.timeout(confirmation),\n\t\t\t\t\tEffect.catchTags({\n\t\t\t\t\t\tExecutionError: (error) =>\n\t\t\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\t\t\tTerminationUnconfirmed.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Orphan recovery did not confirm exit\",\n\t\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\tTimeoutError: (error) =>\n\t\t\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\t\t\tTerminationUnconfirmed.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Orphan recovery did not confirm exit\",\n\t\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\tyield* persist(\n\t\t\tstoppedRecord(\n\t\t\t\trecord.phase === \"Stopping\" ? record.previous : record,\n\t\t\t\t{ _tag: \"Recovery\" },\n\t\t\t\ttermination,\n\t\t\t),\n\t\t)\n\t}\n})\nconst ownShutdown = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { entries, health, closing } = runtime\n\tconst { stop } = actions\n\tyield* Effect.addFinalizer(\n\t\tEffect.fnUntraced(function* () {\n\t\t\tyield* Ref.set(closing, true)\n\t\t\tconst all = yield* Ref.get(entries)\n\t\t\tconst exits = yield* Effect.forEach(HashMap.values(all), (entry) =>\n\t\t\t\tstop(entry, { _tag: \"Shutdown\" }).pipe(\n\t\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t\t\tEffect.exit,\n\t\t\t\t),\n\t\t\t)\n\t\t\tconst initial: Cause.Cause<unknown> = yield* health.cause\n\t\t\tconst cause = Array.reduce(exits, initial, (cause, exit) =>\n\t\t\t\tCause.combine(\n\t\t\t\t\tcause,\n\t\t\t\t\tExit.isFailure(exit) ? exit.cause : exit.value.cause,\n\t\t\t\t),\n\t\t\t)\n\t\t\tif (cause.reasons.length > 0)\n\t\t\t\treturn yield* Effect.failCause(cleanupCause(cause))\n\t\t}),\n\t)\n})\nconst protocol = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { random, owner, locks, lease, limits, records, entries, health } =\n\t\truntime\n\tconst {\n\t\tpersist,\n\t\tstatus,\n\t\tlatest,\n\t\tentryFor,\n\t\tstop,\n\t\tscheduleLease,\n\t\trunLoad,\n\t\thealthy,\n\t} = actions\n\treturn Supervisor.of({\n\t\tawait: health.await,\n\t\tstatus,\n\t\thighWater: (key) =>\n\t\t\tlatest(key).pipe(Effect.map((value) => (value === 0 ? null : value))),\n\t\topen: Effect.fnUntraced(function* (request: Open) {\n\t\t\tyield* healthy\n\t\t\tconst leaseMillis = Duration.toMillis(request.lease ?? lease)\n\t\t\tconst negotiated = negotiate(limits, request.limits ?? defaults)\n\t\t\tconst lock = yield* RcMap.get(locks, keyOf(request.key))\n\t\t\treturn yield* Effect.gen(function* () {\n\t\t\t\tyield* healthy\n\t\t\t\tconst allRecords = yield* Ref.get(records)\n\t\t\t\tconst same = Array.filter(\n\t\t\t\t\tArray.fromIterable(HashMap.values(allRecords)),\n\t\t\t\t\t(row) => Equal.equals(keyOf(row.handle.key), keyOf(request.key)),\n\t\t\t\t)\n\t\t\t\tconst prior = Array.findFirst(\n\t\t\t\t\tsame,\n\t\t\t\t\t(row) => row.requestId === request.requestId,\n\t\t\t\t)\n\t\t\t\tif (Option.isSome(prior)) return prior.value\n\t\t\t\tconst generation = yield* latest(request.key)\n\t\t\t\tif (generation !== (request.expectedGeneration ?? 0))\n\t\t\t\t\treturn yield* StaleSession.make({\n\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\t\"Open expectedGeneration does not match the generation high-water mark\",\n\t\t\t\t\t})\n\t\t\t\tfor (const record of same) {\n\t\t\t\t\tconst allEntries = yield* Ref.get(entries)\n\t\t\t\t\tconst entry = HashMap.get(allEntries, record.handle.token)\n\t\t\t\t\tif (Option.isSome(entry))\n\t\t\t\t\t\tyield* stop(entry.value, { _tag: \"Superseded\" }).pipe(\n\t\t\t\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t\t\t\t\tEffect.tap((result) =>\n\t\t\t\t\t\t\t\tresult.cause.reasons.length === 0\n\t\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t\t: Effect.logWarning(\n\t\t\t\t\t\t\t\t\t\t\t\"Superseded remote execution cleanup failed\",\n\t\t\t\t\t\t\t\t\t\t\tresult.cause,\n\t\t\t\t\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.identity\": record.handle.key.identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.instance\": record.handle.key.instance,\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.generation\": record.handle.generation,\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tyield* healthy\n\t\t\t\tconst token = yield* random.uuidV4()\n\t\t\t\tconst record: typeof OpenRecord.Type = {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tphase: \"Open\",\n\t\t\t\t\thandle: {\n\t\t\t\t\t\tkey: request.key,\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\tgeneration: generation + 1,\n\t\t\t\t\t},\n\t\t\t\t\trequestId: request.requestId,\n\t\t\t\t\tleaseMillis,\n\t\t\t\t\tlimits: negotiated,\n\t\t\t\t}\n\t\t\t\treturn yield* Effect.uninterruptible(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* persist(record)\n\t\t\t\t\t\tconst deadline =\n\t\t\t\t\t\t\t(yield* Clock.monotonicTimeNanos) + nanos(leaseMillis)\n\t\t\t\t\t\tconst scope = yield* Scope.fork(owner)\n\t\t\t\t\t\tconst entry: Entry = {\n\t\t\t\t\t\t\tstate: yield* SynchronizedRef.make<Session>(\n\t\t\t\t\t\t\t\tSession.Open({ record, deadline }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tscope,\n\t\t\t\t\t\t\tunitScope: yield* Scope.fork(scope),\n\t\t\t\t\t\t\ttimer: yield* FiberHandle.make<void, never>().pipe(\n\t\t\t\t\t\t\t\tScope.provide(scope),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tloading: yield* FiberHandle.make<void, never>().pipe(\n\t\t\t\t\t\t\t\tScope.provide(scope),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// The store's retention policy is also the in-memory eviction policy.\n\t\t\t\t\t\tconst retained = yield* Ref.get(records)\n\t\t\t\t\t\tconst old = yield* Ref.modify(\n\t\t\t\t\t\t\tentries,\n\t\t\t\t\t\t\t(all) =>\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\tArray.filter(\n\t\t\t\t\t\t\t\t\t\tArray.fromIterable(HashMap.entries(all)),\n\t\t\t\t\t\t\t\t\t\t([key]) => !HashMap.has(retained, key),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tHashMap.set(\n\t\t\t\t\t\t\t\t\t\tHashMap.filter(all, (_, key) => HashMap.has(retained, key)),\n\t\t\t\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t] as const,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tfor (const [, retired] of old)\n\t\t\t\t\t\t\tyield* Release.close(retired.scope, Exit.void)\n\t\t\t\t\t\tyield* scheduleLease(entry, deadline)\n\t\t\t\t\t\treturn record\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}).pipe(lock.withPermit)\n\t\t}, Effect.scoped),\n\t\trenew: Effect.fnUntraced(function* (handle: Handle) {\n\t\t\tyield* healthy\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\t// Arming the new timer interrupts the old one, so the new deadline must be stored too.\n\t\t\t// Telling the child may block on its control pipe, so that step stays interruptible:\n\t\t\t// if it is cut short, nothing is stored and the old timer keeps its deadline.\n\t\t\treturn yield* Effect.uninterruptibleMask((restore) =>\n\t\t\t\tSynchronizedRef.modifyEffect(\n\t\t\t\t\tentry.state,\n\t\t\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\t\t\tconst running = executionOf(current)\n\t\t\t\t\t\tif (running._tag === \"Running\")\n\t\t\t\t\t\t\tyield* restore(running.unit.renew(current.record.leaseMillis))\n\t\t\t\t\t\tconst deadline = now + nanos(current.record.leaseMillis)\n\t\t\t\t\t\tyield* scheduleLease(entry, deadline)\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tcurrent.record.leaseMillis,\n\t\t\t\t\t\t\t{ ...current, deadline },\n\t\t\t\t\t\t] as const\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t}),\n\t\tload: Effect.fnUntraced(function* (handle: Handle, request: Load) {\n\t\t\tyield* healthy\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\tconst reply = yield* SynchronizedRef.modifyEffect(\n\t\t\t\tentry.state,\n\t\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\t\tif (current._tag !== \"Open\") {\n\t\t\t\t\t\tconst before =\n\t\t\t\t\t\t\tcurrent._tag === \"Loading\" ? current.request : current.record.load\n\t\t\t\t\t\tif (before.specifier !== request.specifier)\n\t\t\t\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\t\t\t\tdetail: \"Load was already requested with a different specifier\",\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tcurrent._tag === \"Loading\"\n\t\t\t\t\t\t\t\t? Deferred.await(current.reply)\n\t\t\t\t\t\t\t\t: Effect.succeed(current.record.code),\n\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t] as const\n\t\t\t\t\t}\n\t\t\t\t\tconst done = yield* Deferred.make<CodeIdentity, SupervisorError>()\n\t\t\t\t\tconst next = beginLoad(current, request, done)\n\t\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\t\tif (next._tag === \"Loading\")\n\t\t\t\t\t\tyield* FiberHandle.run(entry.loading, runLoad(entry, next), {\n\t\t\t\t\t\t\tstartImmediately: false,\n\t\t\t\t\t\t})\n\t\t\t\t\treturn [Deferred.await(done), next] as const\n\t\t\t\t}),\n\t\t\t).pipe(Effect.uninterruptible)\n\t\t\treturn yield* reply\n\t\t}),\n\t\tdispose: Effect.fnUntraced(function* (handle: Handle) {\n\t\t\tconst record = yield* status(handle)\n\t\t\tif (record.phase === \"Stopped\") return record.termination\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\treturn yield* stop(entry, { _tag: \"Disposed\" }).pipe(\n\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t)\n\t\t}),\n\t})\n})\nexport const make = Effect.fnUntraced(function* (options: Options = {}) {\n\tconst runtime = yield* initialize(options)\n\tconst actions = operations(runtime)\n\tyield* recover(runtime, actions)\n\tyield* ownShutdown(runtime, actions)\n\treturn yield* protocol(runtime, actions)\n})\nexport const layer = (options: Options = {}) =>\n\tLayer.effect(Supervisor, make(options))\n"],"mappings":";;;;;;;;;AAyFA,IAAa,aAAb,cAAgC,QAAQ,QAoBtC,CAAC,CAAC,qDAAqD,CAAC,CAAC,CAAC;AAM5D,MAAM,SAAS,KAAK,WAAmB;AAMvC,MAAM,iBAAiB,KAAK,WAA2B;AA2BvD,MAAM,UAAU,KAAK,WAAoB;AAazC,SAAS,SAAS,OAA+B;CAChD,OAAO,MAAM,SAAS,YACnB;EACA,GAAG,MAAM;EACT,OAAO;EACP,MAAM,MAAM;EACZ,QACC,MAAM,OAAO,SAAS,aACnB,EAAE,MAAM,WAAW,IACnB;GAAE,MAAM;GAAc,OAAO,MAAM,OAAO,KAAK;EAAS;CAC7D,IACC,MAAM;AACV;AACA,MAAM,QACL,OACA,QACwD;CACxD,IAAI,MAAM,SAAS,cAAc,MAAM,SAAS,WAC/C,OAAO,OAAO,KACb,MAAM,OAAO,OAAO,SAAS,YAC1B,aAAa,KAAK,EAClB,QAAQ,gCACT,CAAC,IACA,eAAe,KAAK,EACpB,QAAQ,qCACT,CAAC,CACJ;CACD,OAAO,OAAO,MAAM,WACjB,OAAO,KACP,aAAa,KAAK,EACjB,QAAQ,gCACT,CAAC,CACF,IACC,OAAO,QAAQ,KAAK;AACxB;AACA,MAAM,eAAe,UAAgC;CACpD,QAAQ,MAAM,MAAd;EACC,KAAK,QACJ,OAAO,eAAe,OAAO;EAC9B,KAAK,WACJ,OAAO,MAAM,OAAO,SAAS,eAC1B,eAAe,QAAQ,EAAE,MAAM,MAAM,OAAO,KAAK,CAAC,IAClD,eAAe,OAAO;EAC1B,KAAK,UACJ,OAAO,eAAe,QAAQ,EAAE,MAAM,MAAM,KAAK,CAAC;CACpD;AACD;;AAEA,MAAM,aACL,OACA,SACA,UAEA,QAAQ,QAAQ;CACf,QAAQ,MAAM;CACd,UAAU,MAAM;CAChB;CACA;CACA,QAAQ,OAAO,SAAS;AACzB,CAAC;AACF,MAAM,gBACL,OACA,SAC6D;CAC7D,IAAI,MAAM,SAAS,WAClB,OAAO,OAAO,KACb,eAAe,KAAK,EACnB,QAAQ,qCACT,CAAC,CACF;CACD,IAAI,MAAM,OAAO,SAAS,cACzB,OAAO,OAAO,KACb,eAAe,KAAK,EACnB,QAAQ,sDACT,CAAC,CACF;CACD,OAAO,OAAO,QACb,QAAQ,QAAQ;EAAE,GAAG;EAAO,QAAQ,OAAO,WAAW,EAAE,KAAK,CAAC;CAAE,CAAC,CAClE;AACD;AACA,MAAM,UACL,OACA,SAC6D;CAC7D,IAAI,MAAM,SAAS,WAClB,OAAO,OAAO,KACb,eAAe,KAAK,EACnB,QAAQ,qCACT,CAAC,CACF;CACD,IAAI,MAAM,OAAO,SAAS,cACzB,OAAO,OAAO,KACb,eAAe,KAAK,EACnB,QAAQ,2DACT,CAAC,CACF;CACD,OAAO,OAAO,QACb,QAAQ,OAAO;EACd,UAAU,MAAM;EAChB,MAAM,MAAM,OAAO;EACnB,QAAQ;GACP,GAAG,MAAM;GACT,OAAO;GACP,MAAM,MAAM;GACZ;GACA,OAAO,MAAM,OAAO,KAAK;EAC1B;CACD,CAAC,CACF;AACD;AACA,MAAM,aACL,OACA,QACA,OACA,SAEA,QAAQ,SAAS;CAChB,QAAQ,eAAe,SAAS,KAAK,GAAG,MAAM;CAC9C;CACA,WAAW,OAAO,MAAM,MAAM;EAC7B,cAAc,YAAY,KAAK;EAC/B,SAAS,SAAS,eAAe,OAAO,EAAE,KAAK,CAAC;CACjD,CAAC;AACF,CAAC;AACF,MAAM,SAAS,WAAmB,OAAO,KAAK,KAAK,SAAS,GAAS,CAAC;AACtE,MAAM,mBAAgC;CACrC,MAAM;CACN,MAAM;EAAE,MAAM;EAAG,QAAQ;CAAK;CAC9B,OAAO,MAAM;AACd;AACA,MAAM,aAAmB,SACxB,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,MAAM;;AAG3C,MAAM,YAAY,OAAO,WAAW,WACnC,WACA,OACA,cACwD;CACxD,IAAI,UAAU,SAAS,UAAU,OAAO;CACxC,IAAI,UAAU,SAAS,UACtB,OAAO;EAAE,GAAG;EAAkB,MAAM,UAAU;CAAK;CACpD,MAAM,QAAQ,UAAU;CACxB,MAAM,WAAW,OAAO,MAAM,UAAU,KACvC,OAAO,QAAQ,MAAM,MAAM,GAC3B,OAAO,cAAc,KAAK,GAC1B,OAAO,IACR;CACA,IAAI,KAAK,UAAU,QAAQ,KAAK,OAAO,OAAO,SAAS,KAAK,GAC3D,OAAO;EAAE,GAAG;EAAkB,MAAM,SAAS,MAAM;CAAM;CAC1D,MAAM,SAAS,OAAO,OAAO,KAAK,MAAM,IAAI;CAC5C,MAAM,SAAS,OAAO,MAAM,OAAO,KAClC,OAAO,cAAc,YAAY,GACjC,OAAO,IACR;CACA,MAAM,QAAQ,MAAM,QACnB,MAAM,QAAQ,UAAU,QAAQ,GAAG,UAAU,MAAM,CAAC,GACpD,UAAU,MAAM,CACjB;CACA,IAAI,KAAK,UAAU,MAAM,KAAK,OAAO,OAAO,OAAO,KAAK,GACvD,OAAO,OAAO,uBAAuB,KAAK;EACzC,QAAQ;EACR;CACD,CAAC;CACF,OAAO;EACN,MAAM;EACN,MAAM,OAAO,MAAM;EACnB;CACD;AACD,CAAC;AAED,MAAM,aAAa,OAAO,WAAW,WAAW,UAAmB,CAAC,GAAG;CACtE,MAAM,QAAQ,OAAO;CACrB,MAAM,YAAY,OAAO;CACzB,MAAM,SAAS,OAAO,aAAa;CACnC,MAAM,SAAS,OAAO,OAAO;CAC7B,MAAM,QAAQ,OAAO,MAAM,KAAK,MAAM;CAkBtC,OAAO;EACN;EACA;EACA;EACA;EACA,SAAA,OArBsB,SAAS,KAAkB,CAAC,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC;EAsB5E,OAAA,OArBoB,MAAM,KAAK,EAC/B,SAAS,SAAqB,UAAU,KAAK,CAAC,EAC/C,CAAC,CAAC,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC;EAoB3B,OAnBa,SAAS,SAAS,QAAQ,SAAS,YAmB5C;EACJ,OAnBa,SAAS,SAAS,QAAQ,SAAS,WAmB5C;EACJ,cAnBoB,SAAS,SAC7B,QAAQ,uBAAuB,WAkBpB;EACX,QAjBc,QAAQ,UAAU;EAkBhC,SAAA,OAjBsB,IAAI,KAAK,QAAQ,MAA6B,CAAC;EAkBrE,SAAA,OAjBsB,IAAI,KAAK,QAAQ,MAAqB,CAAC;EAkB7D,QAAA,OAjBqBA,OAAmC,CAAC,CAAC,KAC1D,MAAM,QAAQ,KAAK,CACpB;EAgBC,SAAA,OAfsB,IAAI,KAAK,KAAK;CAgBrC;AACD,CAAC;AAED,MAAM,cAAc,YAAqB;CACxC,MAAM,EACL,OACA,WACA,SACA,OACA,cACA,SACA,SACA,QACA,YACG;CAEJ,MAAM,SAAS,OAAO;CACtB,MAAM,WAAc,WACnB,OAAO,KAAK,OAAO,QAAQ,OAAO,WAAW,MAAM,CAAC;CACrD,MAAM,UAAU,OAAO,MAAM,KAC5B,OAAO,QACN,OAAO,IAAI,aAAa;EACvB,IAAI,OAAO,IAAI,IAAI,OAAO,GACzB,OAAO,OAAO,cAAc,KAAK,EAAE,QAAQ,wBAAwB,CAAC;CACtE,CAAC,CACF,CACD;CACA,MAAM,WAAW,WAChB,MACE,KAAK,MAAM,CAAC,CACZ,KACA,OAAO,SAAS,MAAM,GACtB,OAAO,QACN,IAAI,OAAO,UAAU,QAAQC,KAAe,KAAK,MAAM,CAAC,CACzD,CACD;CACF,MAAM,UAAU,WACf,IAAI,IAAI,OAAO,CAAC,CAAC,KAChB,OAAO,SAAS,QAAQ;EACvB,MAAM,QAAQ,QAAQ,IAAI,KAAK,OAAO,KAAK;EAC3C,OAAO,OAAO,OAAO,KAAK,KACzB,MAAM,OAAO,MAAM,MAAM,MAAM,OAAO,GAAG,GAAG,MAAM,OAAO,GAAG,CAAC,KAC7D,MAAM,MAAM,OAAO,eAAe,OAAO,aACvC,OAAO,QAAQ,MAAM,KAAK,IAC1B,OAAO,KACP,aAAa,KAAK,EACjB,QAAQ,gCACT,CAAC,CACF;CACH,CAAC,CACF;CACD,MAAM,UAAU,QACf,IAAI,IAAI,OAAO,CAAC,CAAC,KAChB,OAAO,KAAK,QACX,MAAM,OACL,MAAM,aAAa,QAAQ,OAAO,GAAG,CAAC,GACtC,IACC,OAAO,WACP,MAAM,OAAO,MAAM,OAAO,OAAO,GAAG,GAAG,MAAM,GAAG,CAAC,IAC9C,KAAK,IAAI,OAAO,OAAO,OAAO,UAAU,IACxC,KACL,CACD,CACD;CACD,MAAM,WAAW,OAAO,WAAW,WAAW,QAAgB;EAC7D,OAAO,OAAO,MAAM;EACpB,MAAM,MAAM,OAAO,IAAI,IAAI,OAAO;EAClC,MAAM,QAAQ,QAAQ,IAAI,KAAK,OAAO,KAAK;EAC3C,IAAI,OAAO,OAAO,KAAK,GACtB,OAAO,OAAO,eAAe,KAAK,EACjC,QAAQ,0CACT,CAAC;EACF,OAAO,MAAM;CACd,CAAC;CACD,MAAM,UACL,OACA,eAIA,gBAAgB,aACf,MAAM,OACN,OAAO,WAAW,WAAW,OAAgB;EAC5C,MAAM,OAAO,OAAO,OAAO,WAAW,WAAW,KAAK,CAAC;EACvD,OAAO,QAAQ,SAAS,IAAI,CAAC;EAC7B,OAAO;CACR,CAAC,CACF;CACD,MAAM,aAAa,OAAO,WAAW,WACpC,OACA,OACA,OACC;EACD,OAAO,YAAY,MAAM,MAAM,OAAO;EACtC,MAAM,SAAS,OAAO,UAAU,MAAM,WAAW,OAAO,YAAY;EACpE,MAAM,SAAS,OAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,WAAW,KAAK,IAAI,CAAC;EAC3E,MAAM,cAA2B;GAChC,GAAG;GACH,OAAO,MAAM,QAAQ,OAAO,OAAO,UAAU,MAAM,CAAC;EACrD;EACA,MAAM,SAAS,cACd,MAAM,OAAO,UACb,MAAM,OAAO,QACb,WACD;EACA,OAAO,gBAAgB,aAAa,MAAM,aACzC,QAAQ,MAAM,CAAC,CAAC,KACf,OAAO,GAAG,QAAQ,QAAQ;GAAE;GAAQ,OAAO,MAAM;EAAM,CAAC,CAAC,CAC1D,CACD;EACA,IAAI,KAAK,UAAU,KAAK,GAAG,OAAO,OAAO,OAAO,UAAU,MAAM,KAAK;EACrE,OAAO;CACR,CAAC;;CAED,MAAM,aAAa,OAAO,WAAW,WACpC,OACA,OACA,QACA,MACkD;EAClD,IAAI,MAAM,SAAS,cAAc,MAAM,SAAS,WAC/C,OAAO,CAAC,MAAM,OAAO,KAAK;EAC3B,MAAM,QAAQ,OAAO,SAAS,KAAmC;EACjE,MAAM,OAAO,UAAU,OAAO,QAAQ,OAAO,IAAI;EAEjD,MAAM,QAAQ,OAAO,OAAO,KAAK,QAAQ,KAAK,MAAM,CAAC;EACrD,OAAO,SAAS,IACf,SACA,WAAW,OAAO,MAAM,KAAK,CAAC,CAAC,KAC9B,OAAO,QAAQ,WAAW,SAAS,KAAK,OAAO,MAAM,CAAC,GACtD,OACD,GACA,EAAE,kBAAkB,MAAM,CAC3B;EACA,OAAO,CAAC,OAAO,IAAI;CACpB,CAAC;CACD,MAAM,QACL,OACA,QACA,OAAkC,OAAO,KAAK,MAE9C,gBAAgB,aAAa,MAAM,QAAQ,UAC1C,WAAW,OAAO,OAAO,QAAQ,IAAI,CACtC,CAAC,CAAC,KAAK,OAAO,eAAe;CAC9B,MAAM,iBAAiB,OAAc,aACpC,YAAY,IACX,MAAM,OACN,QACC,OAAO,IAAI,aAAa;EACvB,MAAM,MAAM,OAAO,MAAM;EACzB,OAAO,OAAO,MACb,SAAS,MAAM,WAAW,MAAM,WAAW,MAAM,EAAE,CACpD;EACA,OAAO,gBAAgB,aAAa,MAAM,QAAQ,UAAU;GAC3D,IACC,MAAM,SAAS,cACf,MAAM,SAAS,aACf,MAAM,aAAa,UAEnB,OAAO,OAAO,QAAQ,KAAK;GAC5B,OAAO,WACN,OACA,OACA,EAAE,MAAM,UAAU,GAClB,OAAO,KAAK,CACb,CAAC,CAAC,KAAK,OAAO,KAAK,GAAG,UAAU,IAAI,CAAC;EACtC,CAAC;CACF,CAAC,CACF,GACA,EAAE,kBAAkB,MAAM,CAC3B;CACD,MAAM,YAAY,OAAc,SAC/B,gBAAgB,aACf,MAAM,OACN,OAAO,WAAW,WAAW,OAAgB;EAC5C,MAAM,MAAM,OAAO,MAAM;EACzB,MAAM,UAAU,OAAO,OAAO,WAAW,KAAK,OAAO,GAAG,CAAC;EACzD,MAAM,OAAO,OAAO,OAAO,WAAW,aAAa,SAAS,IAAI,CAAC;EACjE,OAAO,KAAK,MACX,OAAO,QAAQ,YAAY,OAAO,MAAM,mBAAmB,IAC1D,GACF;EACA,OAAO,QAAQ,SAAS,IAAI,CAAC;EAC7B,OAAO,SAAS,IACf,SACA,QACC,KAAK,OAAO,KACX,OAAO,SAAS,SACf,KAAK,OAAO,EAAE,MAAM,SAAS,GAAG,OAAO,KAAK,IAAI,CAAC,CAClD,CACD,CACD,CACD;EACA,OAAO;CACR,CAAC,CACF,CAAC,CAAC,KAAK,OAAO,eAAe;CAC9B,MAAM,WAAW,OAAc,UAC9B,UACE,MAAM,MAAM,OAAO,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM,CAAC,CAC9D,KACA,MAAM,QAAQ,MAAM,SAAS,GAC7B,OAAO,SAAS,SACf,SAAS,OAAO,IAAI,CAAC,CAAC,KACrB,OAAO,QAAQ,KAAK,KAAK,GACzB,OAAO,GAAG,KAAK,IAAI,CACpB,CACD,GACA,OAAO,KAAK,SAAS,OAAO,QAAQ,YAAY,OAAO,SAAS,IAAI,CAAC,CAAC,GACtE,OAAO,OACN,OAAO,WAAW,WACjB,QACC;EACD,IAAI,KAAK,UAAU,MAAM,GAAG;GAC3B,OAAO,SAAS,KAAK,MAAM,OAAO,MAAM;GACxC;EACD;EAEA,KAAI,OADmB,gBAAgB,IAAI,MAAM,KAAK,EAAA,CAC1C,SAAS,WACpB,OAAO,KAAK,OAAO;GAAE,MAAM;GAAc,OAAO,OAAO;EAAM,CAAC;EAC/D,MAAM,cAAc,OAAO,OAAO;EAClC,OAAO,SAAS,UACf,MAAM,OACN,MAAM,QAAQ,OAAO,OAAO,WAAW,CACxC;CACD,CAAC,CACF,GAEA,OAAO,MACP,OAAO,MACR;CAEF,OAAO;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AACD;AAEA,MAAM,UAAU,OAAO,WAAW,WACjC,SACA,SACC;CACD,MAAM,EAAE,OAAO,WAAW,cAAc,YAAY;CACpD,MAAM,EAAE,YAAY;CAEpB,MAAM,SAAS,OAAO,MAAM;CAC5B,OAAO,IAAI,IACV,SACA,QAAQ,aACP,MAAM,IAAI,SAAS,WAAW,CAAC,OAAO,OAAO,OAAO,MAAM,CAAU,CACrE,CACD;CACA,KAAK,MAAM,UAAU,QAAQ;EAC5B,IAAI,OAAO,UAAU,WAAW;EAChC,MAAM,QAAQ,QAAQ,MAAM;EAC5B,MAAM,cAAc,OAAO,OAAO,KAAK,IACpC,mBACA,OAAO,UAAU,QAAQ,MAAM,KAAK,CAAC,CAAC,KACtC,OAAO,QAAQ,YAAY,GAC3B,OAAO,UAAU;GAChB,iBAAiB,UAChB,OAAO,KACN,uBAAuB,KAAK;IAC3B,QAAQ;IACR,OAAO,MAAM,KAAK,KAAK;GACxB,CAAC,CACF;GACD,eAAe,UACd,OAAO,KACN,uBAAuB,KAAK;IAC3B,QAAQ;IACR,OAAO,MAAM,KAAK,KAAK;GACxB,CAAC,CACF;EACF,CAAC,CACF;EACF,OAAO,QACN,cACC,OAAO,UAAU,aAAa,OAAO,WAAW,QAChD,EAAE,MAAM,WAAW,GACnB,WACD,CACD;CACD;AACD,CAAC;AACD,MAAM,cAAc,OAAO,WAAW,WACrC,SACA,SACC;CACD,MAAM,EAAE,SAAS,QAAQ,YAAY;CACrC,MAAM,EAAE,SAAS;CACjB,OAAO,OAAO,aACb,OAAO,WAAW,aAAa;EAC9B,OAAO,IAAI,IAAI,SAAS,IAAI;EAC5B,MAAM,MAAM,OAAO,IAAI,IAAI,OAAO;EAClC,MAAM,QAAQ,OAAO,OAAO,QAAQ,QAAQ,OAAO,GAAG,IAAI,UACzD,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,KACjC,OAAO,QAAQ,SAAS,KAAK,GAC7B,OAAO,IACR,CACD;EACA,MAAM,UAAgC,OAAO,OAAO;EACpD,MAAM,QAAQ,MAAM,OAAO,OAAO,UAAU,OAAO,SAClD,MAAM,QACL,OACA,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,KAAK,MAAM,KAChD,CACD;EACA,IAAI,MAAM,QAAQ,SAAS,GAC1B,OAAO,OAAO,OAAO,UAAU,aAAa,KAAK,CAAC;CACpD,CAAC,CACF;AACD,CAAC;AACD,MAAM,WAAW,OAAO,WAAW,WAClC,SACA,SACC;CACD,MAAM,EAAE,QAAQ,OAAO,OAAO,OAAO,QAAQ,SAAS,SAAS,WAC9D;CACD,MAAM,EACL,SACA,QACA,QACA,UACA,MACA,eACA,SACA,YACG;CACJ,OAAO,WAAW,GAAG;EACpB,OAAO,OAAO;EACd;EACA,YAAY,QACX,OAAO,GAAG,CAAC,CAAC,KAAK,OAAO,KAAK,UAAW,UAAU,IAAI,OAAO,KAAM,CAAC;EACrE,MAAM,OAAO,WAAW,WAAW,SAAe;GACjD,OAAO;GACP,MAAM,cAAc,SAAS,SAAS,QAAQ,SAAS,KAAK;GAC5D,MAAM,aAAa,UAAU,QAAQ,QAAQ,UAAU,QAAQ;GAC/D,MAAM,OAAO,OAAO,MAAM,IAAI,OAAO,MAAM,QAAQ,GAAG,CAAC;GACvD,OAAO,OAAO,OAAO,IAAI,aAAa;IACrC,OAAO;IACP,MAAM,aAAa,OAAO,IAAI,IAAI,OAAO;IACzC,MAAM,OAAO,MAAM,OAClB,MAAM,aAAa,QAAQ,OAAO,UAAU,CAAC,IAC5C,QAAQ,MAAM,OAAO,MAAM,IAAI,OAAO,GAAG,GAAG,MAAM,QAAQ,GAAG,CAAC,CAChE;IACA,MAAM,QAAQ,MAAM,UACnB,OACC,QAAQ,IAAI,cAAc,QAAQ,SACpC;IACA,IAAI,OAAO,OAAO,KAAK,GAAG,OAAO,MAAM;IACvC,MAAM,aAAa,OAAO,OAAO,QAAQ,GAAG;IAC5C,IAAI,gBAAgB,QAAQ,sBAAsB,IACjD,OAAO,OAAO,aAAa,KAAK,EAC/B,QACC,wEACF,CAAC;IACF,KAAK,MAAM,UAAU,MAAM;KAC1B,MAAM,aAAa,OAAO,IAAI,IAAI,OAAO;KACzC,MAAM,QAAQ,QAAQ,IAAI,YAAY,OAAO,OAAO,KAAK;KACzD,IAAI,OAAO,OAAO,KAAK,GACtB,OAAO,KAAK,MAAM,OAAO,EAAE,MAAM,aAAa,CAAC,CAAC,CAAC,KAChD,OAAO,QAAQ,SAAS,KAAK,GAC7B,OAAO,KAAK,WACX,OAAO,MAAM,QAAQ,WAAW,IAC7B,OAAO,OACP,OAAO,WACP,8CACA,OAAO,KACR,CAAC,CAAC,KACD,OAAO,aAAa;MACnB,mBAAmB,OAAO,OAAO,IAAI;MACrC,mBAAmB,OAAO,OAAO,IAAI;MACrC,qBAAqB,OAAO,OAAO;KACpC,CAAC,CACF,CACH,CACD;IACF;IACA,OAAO;IACP,MAAM,QAAQ,OAAO,OAAO,OAAO;IACnC,MAAM,SAAiC;KACtC,SAAS;KACT,OAAO;KACP,QAAQ;MACP,KAAK,QAAQ;MACb;MACA,YAAY,aAAa;KAC1B;KACA,WAAW,QAAQ;KACnB;KACA,QAAQ;IACT;IACA,OAAO,OAAO,OAAO,gBACpB,OAAO,IAAI,aAAa;KACvB,OAAO,QAAQ,MAAM;KACrB,MAAM,YACJ,OAAO,MAAM,sBAAsB,MAAM,WAAW;KACtD,MAAM,QAAQ,OAAO,MAAM,KAAK,KAAK;KACrC,MAAM,QAAe;MACpB,OAAO,OAAO,gBAAgB,KAC7B,QAAQ,KAAK;OAAE;OAAQ;MAAS,CAAC,CAClC;MACA;MACA,WAAW,OAAO,MAAM,KAAK,KAAK;MAClC,OAAO,OAAO,YAAY,KAAkB,CAAC,CAAC,KAC7C,MAAM,QAAQ,KAAK,CACpB;MACA,SAAS,OAAO,YAAY,KAAkB,CAAC,CAAC,KAC/C,MAAM,QAAQ,KAAK,CACpB;KACD;KAEA,MAAM,WAAW,OAAO,IAAI,IAAI,OAAO;KACvC,MAAM,MAAM,OAAO,IAAI,OACtB,UACC,QACA,CACC,MAAM,OACL,MAAM,aAAa,QAAQ,QAAQ,GAAG,CAAC,IACtC,CAAC,SAAS,CAAC,QAAQ,IAAI,UAAU,GAAG,CACtC,GACA,QAAQ,IACP,QAAQ,OAAO,MAAM,GAAG,QAAQ,QAAQ,IAAI,UAAU,GAAG,CAAC,GAC1D,OACA,KACD,CACD,CACF;KACA,KAAK,MAAM,GAAG,YAAY,KACzB,OAAO,QAAQ,MAAM,QAAQ,OAAO,KAAK,IAAI;KAC9C,OAAO,cAAc,OAAO,QAAQ;KACpC,OAAO;IACR,CAAC,CACF;GACD,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU;EACxB,GAAG,OAAO,MAAM;EAChB,OAAO,OAAO,WAAW,WAAW,QAAgB;GACnD,OAAO;GACP,MAAM,QAAQ,OAAO,SAAS,MAAM;GAIpC,OAAO,OAAO,OAAO,qBAAqB,YACzC,gBAAgB,aACf,MAAM,OACN,OAAO,WAAW,WAAW,OAAgB;IAC5C,MAAM,MAAM,OAAO,MAAM;IACzB,MAAM,UAAU,OAAO,OAAO,WAAW,KAAK,OAAO,GAAG,CAAC;IACzD,MAAM,UAAU,YAAY,OAAO;IACnC,IAAI,QAAQ,SAAS,WACpB,OAAO,QAAQ,QAAQ,KAAK,MAAM,QAAQ,OAAO,WAAW,CAAC;IAC9D,MAAM,WAAW,MAAM,MAAM,QAAQ,OAAO,WAAW;IACvD,OAAO,cAAc,OAAO,QAAQ;IACpC,OAAO,CACN,QAAQ,OAAO,aACf;KAAE,GAAG;KAAS;IAAS,CACxB;GACD,CAAC,CACF,CACD;EACD,CAAC;EACD,MAAM,OAAO,WAAW,WAAW,QAAgB,SAAe;GACjE,OAAO;GACP,MAAM,QAAQ,OAAO,SAAS,MAAM;GA8BpC,OAAO,OAAO,OA7BO,gBAAgB,aACpC,MAAM,OACN,OAAO,WAAW,WAAW,OAAgB;IAC5C,MAAM,MAAM,OAAO,MAAM;IACzB,MAAM,UAAU,OAAO,OAAO,WAAW,KAAK,OAAO,GAAG,CAAC;IACzD,IAAI,QAAQ,SAAS,QAAQ;KAG5B,KADC,QAAQ,SAAS,YAAY,QAAQ,UAAU,QAAQ,OAAO,KAAA,CACpD,cAAc,QAAQ,WAChC,OAAO,OAAO,gBAAgB,KAAK,EAClC,QAAQ,wDACT,CAAC;KACF,OAAO,CACN,QAAQ,SAAS,YACd,SAAS,MAAM,QAAQ,KAAK,IAC5B,OAAO,QAAQ,QAAQ,OAAO,IAAI,GACrC,OACD;IACD;IACA,MAAM,OAAO,OAAO,SAAS,KAAoC;IACjE,MAAM,OAAO,UAAU,SAAS,SAAS,IAAI;IAC7C,OAAO,QAAQ,SAAS,IAAI,CAAC;IAC7B,IAAI,KAAK,SAAS,WACjB,OAAO,YAAY,IAAI,MAAM,SAAS,QAAQ,OAAO,IAAI,GAAG,EAC3D,kBAAkB,MACnB,CAAC;IACF,OAAO,CAAC,SAAS,MAAM,IAAI,GAAG,IAAI;GACnC,CAAC,CACF,CAAC,CAAC,KAAK,OAAO,eAAe;EAE9B,CAAC;EACD,SAAS,OAAO,WAAW,WAAW,QAAgB;GACrD,MAAM,SAAS,OAAO,OAAO,MAAM;GACnC,IAAI,OAAO,UAAU,WAAW,OAAO,OAAO;GAC9C,MAAM,QAAQ,OAAO,SAAS,MAAM;GACpC,OAAO,OAAO,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,KAC/C,OAAO,QAAQ,SAAS,KAAK,CAC9B;EACD,CAAC;CACF,CAAC;AACF,CAAC;AACD,MAAa,OAAO,OAAO,WAAW,WAAW,UAAmB,CAAC,GAAG;CACvE,MAAM,UAAU,OAAO,WAAW,OAAO;CACzC,MAAM,UAAU,WAAW,OAAO;CAClC,OAAO,QAAQ,SAAS,OAAO;CAC/B,OAAO,YAAY,SAAS,OAAO;CACnC,OAAO,OAAO,SAAS,SAAS,OAAO;AACxC,CAAC;AACD,MAAa,SAAS,UAAmB,CAAC,MACzC,MAAM,OAAO,YAAY,KAAK,OAAO,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Watchdog.js","names":["FailureGroup.make"],"sources":["../../../src/internal/runner/Watchdog.ts"],"sourcesContent":["import { Cause, Deferred, Effect, Schema } from \"effect\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport {
|
|
1
|
+
{"version":3,"file":"Watchdog.js","names":["FailureGroup.make"],"sources":["../../../src/internal/runner/Watchdog.ts"],"sourcesContent":["import { Worker } from \"node:worker_threads\"\n\nimport { Cause, Deferred, Effect, Schema } from \"effect\"\n\nimport * as FailureGroup from \"../FailureGroup\"\nimport { ExecutionError } from \"./model\"\nimport { Notice } from \"./WatchdogProtocol\"\n\nexport const start = Effect.gen(function* () {\n\tconst ready = yield* Deferred.make<void>()\n\tconst begin = yield* Deferred.make<void>()\n\tconst stop = yield* Deferred.make<void>()\n\tconst worker = yield* Effect.acquireRelease(\n\t\tEffect.try({\n\t\t\ttry: () =>\n\t\t\t\tnew Worker(\n\t\t\t\t\tnew URL(\n\t\t\t\t\t\timport.meta.resolve(\"@graftland/plugin-remote/internal/watchdog\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\tcatch: (cause) =>\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Starting the child watchdog failed\",\n\t\t\t\t\tcause: Cause.die(cause),\n\t\t\t\t}),\n\t\t}),\n\t\t(worker) => Effect.promise(() => worker.terminate()).pipe(Effect.asVoid),\n\t)\n\tconst listeners = yield* FailureGroup.make<ExecutionError>()\n\tconst run = yield* listeners.runtime<never>()\n\tconst message = (value: unknown) =>\n\t\trun(\n\t\t\tSchema.decodeUnknownEffect(Notice)(value).pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\tdetail: \"Invalid watchdog notice\",\n\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\tEffect.flatMap((notice) =>\n\t\t\t\t\tDeferred.succeed(\n\t\t\t\t\t\tnotice === \"ready\" ? ready : notice === \"start\" ? begin : stop,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tEffect.asVoid,\n\t\t\t),\n\t\t)\n\tconst error = (error: Error) =>\n\t\trun(\n\t\t\tEffect.fail(\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Child watchdog failed\",\n\t\t\t\t\tcause: Cause.die(error),\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\tconst exit = (code: number) =>\n\t\trun(\n\t\t\tEffect.fail(\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Child watchdog exited: \" + code,\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\tyield* Effect.acquireRelease(\n\t\tEffect.sync(() => {\n\t\t\tworker.on(\"message\", message)\n\t\t\tworker.on(\"error\", error)\n\t\t\tworker.on(\"exit\", exit)\n\t\t}),\n\t\t() =>\n\t\t\tEffect.sync(() => {\n\t\t\t\tworker.off(\"message\", message)\n\t\t\t\tworker.off(\"error\", error)\n\t\t\t\tworker.off(\"exit\", exit)\n\t\t\t}),\n\t)\n\tconst failure = listeners.await\n\tyield* Effect.raceFirst(Deferred.await(ready), failure)\n\treturn {\n\t\tbegin: Effect.raceFirst(Deferred.await(begin), failure),\n\t\tstop: Effect.raceFirst(Deferred.await(stop), failure),\n\t}\n})\n"],"mappings":";;;;;;AAQA,MAAa,QAAQ,OAAO,IAAI,aAAa;CAC5C,MAAM,QAAQ,OAAO,SAAS,KAAW;CACzC,MAAM,QAAQ,OAAO,SAAS,KAAW;CACzC,MAAM,OAAO,OAAO,SAAS,KAAW;CACxC,MAAM,SAAS,OAAO,OAAO,eAC5B,OAAO,IAAI;EACV,WACC,IAAI,OACH,IAAI,IACH,YAAY,QAAQ,4CAA4C,CACjE,CACD;EACD,QAAQ,UACP,eAAe,KAAK;GACnB,QAAQ;GACR,OAAO,MAAM,IAAI,KAAK;EACvB,CAAC;CACH,CAAC,IACA,WAAW,OAAO,cAAc,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,CACxE;CACA,MAAM,YAAY,OAAOA,KAAkC;CAC3D,MAAM,MAAM,OAAO,UAAU,QAAe;CAC5C,MAAM,WAAW,UAChB,IACC,OAAO,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KACzC,OAAO,UAAU,UAChB,eAAe,KAAK;EACnB,QAAQ;EACR,OAAO,MAAM,KAAK,KAAK;CACxB,CAAC,CACF,GACA,OAAO,SAAS,WACf,SAAS,QACR,WAAW,UAAU,QAAQ,WAAW,UAAU,QAAQ,MAC1D,KAAA,CACD,CACD,GACA,OAAO,MACR,CACD;CACD,MAAM,SAAS,UACd,IACC,OAAO,KACN,eAAe,KAAK;EACnB,QAAQ;EACR,OAAO,MAAM,IAAI,KAAK;CACvB,CAAC,CACF,CACD;CACD,MAAM,QAAQ,SACb,IACC,OAAO,KACN,eAAe,KAAK,EACnB,QAAQ,4BAA4B,KACrC,CAAC,CACF,CACD;CACD,OAAO,OAAO,eACb,OAAO,WAAW;EACjB,OAAO,GAAG,WAAW,OAAO;EAC5B,OAAO,GAAG,SAAS,KAAK;EACxB,OAAO,GAAG,QAAQ,IAAI;CACvB,CAAC,SAEA,OAAO,WAAW;EACjB,OAAO,IAAI,WAAW,OAAO;EAC7B,OAAO,IAAI,SAAS,KAAK;EACzB,OAAO,IAAI,QAAQ,IAAI;CACxB,CAAC,CACH;CACA,MAAM,UAAU,UAAU;CAC1B,OAAO,OAAO,UAAU,SAAS,MAAM,KAAK,GAAG,OAAO;CACtD,OAAO;EACN,OAAO,OAAO,UAAU,SAAS,MAAM,KAAK,GAAG,OAAO;EACtD,MAAM,OAAO,UAAU,SAAS,MAAM,IAAI,GAAG,OAAO;CACrD;AACD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Wire.js","names":["Port.Priority"],"sources":["../../../src/internal/runner/Wire.ts"],"sourcesContent":["import { Cause, Effect, Sink, Stream
|
|
1
|
+
{"version":3,"file":"Wire.js","names":["Port.Priority"],"sources":["../../../src/internal/runner/Wire.ts"],"sourcesContent":["import { Cause, Effect, Schema, Sink, Stream } from \"effect\"\nimport { Rpc, RpcGroup } from \"effect/rpc\"\n\nimport { TransportError } from \"../../Errors\"\nimport * as Port from \"../port\"\nimport {\n\tCodeIdentity,\n\tExecutionError,\n\tHandle,\n\tLeaseExpired,\n\tLimits,\n\tPackageError,\n\tPositiveFinite,\n\tPositiveInt,\n\tRunnerClosing,\n\tSessionAccessDenied,\n\tSessionConflict,\n\tSessionRecord,\n\tSessionStopped,\n\tStaleSession,\n\tStateDirectoryLocked,\n\tStateStorageError,\n\tTermination,\n\tTerminationUnconfirmed,\n} from \"./model\"\nimport type * as Multiplex from \"./Multiplex\"\n\n/** The RPC boundary is the only place that assembles the runner's error schema. */\nexport const SessionError = Schema.Union([\n\tSessionAccessDenied,\n\tStaleSession,\n\tLeaseExpired,\n\tSessionStopped,\n\tSessionConflict,\n\tStateStorageError,\n\tExecutionError,\n\tPackageError,\n\tTerminationUnconfirmed,\n\tRunnerClosing,\n\tStateDirectoryLocked,\n])\nexport type SessionError = typeof SessionError.Type\n\nexport const Session = RpcGroup.make(\n\tRpc.make(\"HighWater\", {\n\t\tpayload: { instance: Schema.NonEmptyString },\n\t\tsuccess: Schema.NullOr(PositiveInt),\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Open\", {\n\t\tpayload: {\n\t\t\tinstance: Schema.NonEmptyString,\n\t\t\trequestId: Schema.NonEmptyString,\n\t\t\texpectedGeneration: Schema.NullOr(PositiveInt),\n\t\t\tleaseMillis: Schema.optionalKey(PositiveFinite),\n\t\t\tlimits: Limits,\n\t\t},\n\t\tsuccess: SessionRecord,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Load\", {\n\t\tpayload: {\n\t\t\thandle: Handle,\n\t\t\tspecifier: Schema.NonEmptyString,\n\t\t\tdigest: Schema.optionalKey(Schema.Boolean),\n\t\t},\n\t\tsuccess: CodeIdentity,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Renew\", {\n\t\tpayload: Handle,\n\t\tsuccess: Schema.Finite,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Dispose\", {\n\t\tpayload: Handle,\n\t\tsuccess: Termination,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Status\", {\n\t\tpayload: Handle,\n\t\tsuccess: SessionRecord,\n\t\terror: SessionError,\n\t}),\n).annotateRpcs(Port.Priority, \"control\")\n\nexport type Peer = Multiplex.Peer\n/** Preserve the port writer order within each byte channel. */\nexport const channel = (peer: Peer, id: 0 | 1): Port.Channel => ({\n\tinput: Stream.fromEffectRepeat(peer.take(id)),\n\toutput: Sink.forEach((bytes: Uint8Array) =>\n\t\tpeer\n\t\t\t.send(id, bytes)\n\t\t\t.pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t),\n\t\t\t),\n\t),\n})\n"],"mappings":";;;;;;;;AA4BA,MAAa,eAAe,OAAO,MAAM;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAGD,MAAa,UAAU,SAAS,KAC/B,IAAI,KAAK,aAAa;CACrB,SAAS,EAAE,UAAU,OAAO,eAAe;CAC3C,SAAS,OAAO,OAAO,WAAW;CAClC,OAAO;AACR,CAAC,GACD,IAAI,KAAK,QAAQ;CAChB,SAAS;EACR,UAAU,OAAO;EACjB,WAAW,OAAO;EAClB,oBAAoB,OAAO,OAAO,WAAW;EAC7C,aAAa,OAAO,YAAY,cAAc;EAC9C,QAAQ;CACT;CACA,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,QAAQ;CAChB,SAAS;EACR,QAAQ;EACR,WAAW,OAAO;EAClB,QAAQ,OAAO,YAAY,OAAO,OAAO;CAC1C;CACA,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,SAAS;CACjB,SAAS;CACT,SAAS,OAAO;CAChB,OAAO;AACR,CAAC,GACD,IAAI,KAAK,WAAW;CACnB,SAAS;CACT,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,UAAU;CAClB,SAAS;CACT,SAAS;CACT,OAAO;AACR,CAAC,CACF,CAAC,CAAC,aAAaA,UAAe,SAAS;;AAIvC,MAAa,WAAW,MAAY,QAA6B;CAChE,OAAO,OAAO,iBAAiB,KAAK,KAAK,EAAE,CAAC;CAC5C,QAAQ,KAAK,SAAS,UACrB,KACE,KAAK,IAAI,KAAK,CAAC,CACf,KACA,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD,CACF;AACD"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Peer } from "../Peer.js";
|
|
2
1
|
import { TransportError } from "../../Errors.js";
|
|
2
|
+
import { Peer } from "../Peer.js";
|
|
3
3
|
import { make } from "../port.js";
|
|
4
|
+
import { SessionAccessDenied, SessionConflict } from "./model.js";
|
|
4
5
|
import { make as make$1 } from "./Multiplex.js";
|
|
5
6
|
import { Session, channel } from "./Wire.js";
|
|
6
|
-
import { SessionAccessDenied, SessionConflict } from "./model.js";
|
|
7
7
|
import { Cause, Effect, Option, Ref, Scope, Semaphore } from "effect";
|
|
8
8
|
import { RpcServer } from "effect/rpc";
|
|
9
9
|
// src/internal/runner/accept.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept.js","names":["Multiplex.make","channel","Port.make","Wire.channel","Wire.Session"],"sources":["../../../src/internal/runner/accept.ts"],"sourcesContent":["import { Cause, Effect,
|
|
1
|
+
{"version":3,"file":"accept.js","names":["Multiplex.make","channel","Port.make","Wire.channel","Wire.Session"],"sources":["../../../src/internal/runner/accept.ts"],"sourcesContent":["import { Cause, Effect, Option, Ref, Scope, Semaphore } from \"effect\"\nimport { RpcServer } from \"effect/rpc\"\n\nimport { TransportError } from \"../../Errors\"\nimport type { Channel } from \"../../Transport\"\nimport { Peer } from \"../Peer\"\nimport * as Port from \"../port\"\nimport type { Channels } from \"./Execution\"\nimport { SessionAccessDenied, SessionConflict, type Handle } from \"./model\"\nimport * as Multiplex from \"./Multiplex\"\nimport type { Supervisor } from \"./Supervisor\"\nimport * as Wire from \"./Wire\"\n\nexport const accept = Effect.fnUntraced(function* (\n\tsupervisor: typeof Supervisor.Service,\n\texecution: typeof Channels.Service,\n\tchannel: Channel,\n) {\n\tconst identity = yield* Peer\n\tconst scope = yield* Effect.scope\n\tconst mux = yield* Multiplex.make(channel)\n\tconst peer = yield* Port.make(Wire.channel(mux, 0), {\n\t\tsession: \"session-v1\",\n\t\tserve: { session: Wire.Session },\n\t\tcall: {},\n\t})\n\tconst attached = yield* Ref.make(Option.none<string>())\n\tconst loading = yield* Semaphore.make(1)\n\tconst authorize = (handle: Handle) =>\n\t\thandle.key.identity === identity\n\t\t\t? Effect.void\n\t\t\t: Effect.fail(\n\t\t\t\t\tSessionAccessDenied.make({\n\t\t\t\t\t\tdetail: \"The session belongs to another authenticated identity\",\n\t\t\t\t\t}),\n\t\t\t\t)\n\tconst handlers = yield* Wire.Session.toHandlers({\n\t\tHighWater: ({ instance }) => supervisor.highWater({ identity, instance }),\n\t\tOpen: ({ instance, requestId, expectedGeneration, leaseMillis, limits }) =>\n\t\t\tsupervisor.open({\n\t\t\t\tkey: { identity, instance },\n\t\t\t\trequestId,\n\t\t\t\texpectedGeneration,\n\t\t\t\t...(leaseMillis === undefined ? {} : { lease: leaseMillis }),\n\t\t\t\tlimits,\n\t\t\t}),\n\t\tLoad: Effect.fnUntraced(function* ({ handle, ...request }) {\n\t\t\tyield* authorize(handle)\n\t\t\tconst attachment = yield* Ref.get(attached)\n\t\t\tif (Option.isSome(attachment) && attachment.value !== handle.token)\n\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\tdetail: \"A connection can attach only one execution\",\n\t\t\t\t})\n\t\t\tconst code = yield* supervisor.load(handle, request)\n\t\t\tif (Option.isNone(attachment)) {\n\t\t\t\tconst child = yield* execution\n\t\t\t\t\t.peer(handle.token)\n\t\t\t\t\t.pipe(Scope.provide(scope))\n\t\t\t\tyield* Ref.set(attached, Option.some(handle.token))\n\t\t\t\t// A child EOF must not destroy the session channel before Dispose can acknowledge exit.\n\t\t\t\tyield* Effect.all(\n\t\t\t\t\t[\n\t\t\t\t\t\tEffect.forever(\n\t\t\t\t\t\t\tEffect.flatMap(mux.take(1), (bytes) => child.send(1, bytes)),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tEffect.forever(\n\t\t\t\t\t\t\tEffect.flatMap(child.take(1), (bytes) => mux.send(1, bytes)),\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t\t{ concurrency: \"unbounded\" },\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t: child.fail(TransportError.make({ cause })),\n\t\t\t\t\t),\n\t\t\t\t\tEffect.forkIn(scope),\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn code\n\t\t}, loading.withPermit),\n\t\tRenew: (handle) =>\n\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.renew(handle))),\n\t\tDispose: (handle) =>\n\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.dispose(handle))),\n\t\tStatus: (handle) =>\n\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.status(handle))),\n\t})\n\treturn yield* RpcServer.make(Wire.Session, {\n\t\tdisableFatalDefects: true,\n\t}).pipe(\n\t\tEffect.provideContext(handlers),\n\t\tEffect.provideService(RpcServer.Protocol, peer.serverProtocol(\"session\")),\n\t\tEffect.raceFirst(mux.await),\n\t)\n})\n"],"mappings":";;;;;;;;;AAaA,MAAa,SAAS,OAAO,WAAW,WACvC,YACA,WACA,WACC;CACD,MAAM,WAAW,OAAO;CACxB,MAAM,QAAQ,OAAO,OAAO;CAC5B,MAAM,MAAM,OAAOA,OAAeC,SAAO;CACzC,MAAM,OAAO,OAAOC,KAAUC,QAAa,KAAK,CAAC,GAAG;EACnD,SAAS;EACT,OAAO,EAAE,SAASC,QAAa;EAC/B,MAAM,CAAC;CACR,CAAC;CACD,MAAM,WAAW,OAAO,IAAI,KAAK,OAAO,KAAa,CAAC;CACtD,MAAM,UAAU,OAAO,UAAU,KAAK,CAAC;CACvC,MAAM,aAAa,WAClB,OAAO,IAAI,aAAa,WACrB,OAAO,OACP,OAAO,KACP,oBAAoB,KAAK,EACxB,QAAQ,wDACT,CAAC,CACF;CACH,MAAM,WAAW,OAAA,QAAoB,WAAW;EAC/C,YAAY,EAAE,eAAe,WAAW,UAAU;GAAE;GAAU;EAAS,CAAC;EACxE,OAAO,EAAE,UAAU,WAAW,oBAAoB,aAAa,aAC9D,WAAW,KAAK;GACf,KAAK;IAAE;IAAU;GAAS;GAC1B;GACA;GACA,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,YAAY;GAC1D;EACD,CAAC;EACF,MAAM,OAAO,WAAW,WAAW,EAAE,QAAQ,GAAG,WAAW;GAC1D,OAAO,UAAU,MAAM;GACvB,MAAM,aAAa,OAAO,IAAI,IAAI,QAAQ;GAC1C,IAAI,OAAO,OAAO,UAAU,KAAK,WAAW,UAAU,OAAO,OAC5D,OAAO,OAAO,gBAAgB,KAAK,EAClC,QAAQ,6CACT,CAAC;GACF,MAAM,OAAO,OAAO,WAAW,KAAK,QAAQ,OAAO;GACnD,IAAI,OAAO,OAAO,UAAU,GAAG;IAC9B,MAAM,QAAQ,OAAO,UACnB,KAAK,OAAO,KAAK,CAAC,CAClB,KAAK,MAAM,QAAQ,KAAK,CAAC;IAC3B,OAAO,IAAI,IAAI,UAAU,OAAO,KAAK,OAAO,KAAK,CAAC;IAElD,OAAO,OAAO,IACb,CACC,OAAO,QACN,OAAO,QAAQ,IAAI,KAAK,CAAC,IAAI,UAAU,MAAM,KAAK,GAAG,KAAK,CAAC,CAC5D,GACA,OAAO,QACN,OAAO,QAAQ,MAAM,KAAK,CAAC,IAAI,UAAU,IAAI,KAAK,GAAG,KAAK,CAAC,CAC5D,CACD,GACA,EAAE,aAAa,YAAY,CAC5B,CAAC,CAAC,KACD,OAAO,YAAY,UAClB,MAAM,kBAAkB,KAAK,IAC1B,OAAO,OACP,MAAM,KAAK,eAAe,KAAK,EAAE,MAAM,CAAC,CAAC,CAC7C,GACA,OAAO,OAAO,KAAK,CACpB;GACD;GACA,OAAO;EACR,GAAG,QAAQ,UAAU;EACrB,QAAQ,WACP,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,MAAM,MAAM,CAAC,CAAC;EAChE,UAAU,WACT,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,QAAQ,MAAM,CAAC,CAAC;EAClE,SAAS,WACR,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,OAAO,MAAM,CAAC,CAAC;CAClE,CAAC;CACD,OAAO,OAAO,UAAU,KAAKA,SAAc,EAC1C,qBAAqB,KACtB,CAAC,CAAC,CAAC,KACF,OAAO,eAAe,QAAQ,GAC9B,OAAO,eAAe,UAAU,UAAU,KAAK,eAAe,SAAS,CAAC,GACxE,OAAO,UAAU,IAAI,KAAK,CAC3B;AACD,CAAC"}
|
|
@@ -3,7 +3,7 @@ import process from "node:process";
|
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
// src/internal/runner/command.ts
|
|
5
5
|
/** Resolve the executable through the installed package export, never a relative dist path. */
|
|
6
|
-
const command = (override) => Effect.sync(() => override ?? [process.execPath, fileURLToPath(import.meta.resolve("@graftland/plugin-remote/internal/
|
|
6
|
+
const command = (override) => Effect.sync(() => override ?? [process.execPath, fileURLToPath(import.meta.resolve("@graftland/plugin-remote/internal/child"))]);
|
|
7
7
|
export { command };
|
|
8
8
|
|
|
9
9
|
//# sourceMappingURL=command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","names":[],"sources":["../../../src/internal/runner/command.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"command.js","names":[],"sources":["../../../src/internal/runner/command.ts"],"sourcesContent":["import process from \"node:process\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { Effect } from \"effect\"\n\n/** Resolve the executable through the installed package export, never a relative dist path. */\nexport const command = (override?: readonly [string, ...string[]]) =>\n\tEffect.sync(\n\t\t(): readonly [string, ...string[]] =>\n\t\t\toverride ?? [\n\t\t\t\tprocess.execPath,\n\t\t\t\tfileURLToPath(\n\t\t\t\t\timport.meta.resolve(\"@graftland/plugin-remote/internal/child\"),\n\t\t\t\t),\n\t\t\t],\n\t)\n"],"mappings":";;;;;AAMA,MAAa,WAAW,aACvB,OAAO,WAEL,YAAY,CACX,QAAQ,UACR,cACC,YAAY,QAAQ,yCAAyC,CAC9D,CACD,CACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TransportError } from "../../Errors.js";
|
|
2
|
-
import { EndOfStream } from "./Framing.js";
|
|
3
2
|
import { Peer } from "../Peer.js";
|
|
3
|
+
import { EndOfStream } from "./Framing.js";
|
|
4
4
|
import { Array, Cause, Effect, Schema } from "effect";
|
|
5
5
|
import { Socket } from "effect/socket";
|
|
6
6
|
// src/internal/runner/connectionEnded.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectionEnded.js","names":[],"sources":["../../../src/internal/runner/connectionEnded.ts"],"sourcesContent":["import { Array, Cause, Effect, Schema } from \"effect\"\nimport { Socket } from \"effect/socket\"\nimport { TransportError } from \"../../Errors\"\nimport {
|
|
1
|
+
{"version":3,"file":"connectionEnded.js","names":[],"sources":["../../../src/internal/runner/connectionEnded.ts"],"sourcesContent":["import { Array, Cause, Effect, Schema } from \"effect\"\nimport { Socket } from \"effect/socket\"\n\nimport { TransportError } from \"../../Errors\"\nimport { Peer } from \"../Peer\"\nimport { EndOfStream } from \"./Framing\"\n\n// Multiplex preserves the socket reason inside TransportError; only an entirely normal close is silent.\nexport const closedNormally = (cause: Cause.Cause<unknown>): boolean =>\n\tcause.reasons.length > 0 &&\n\tArray.every(\n\t\tcause.reasons,\n\t\t(reason) =>\n\t\t\treason._tag === \"Fail\" &&\n\t\t\t(Schema.is(TransportError)(reason.error)\n\t\t\t\t? closedNormally(reason.error.cause)\n\t\t\t\t: Schema.is(EndOfStream)(reason.error) ||\n\t\t\t\t\t(Socket.isSocketError(reason.error) &&\n\t\t\t\t\t\treason.error.reason._tag === \"SocketCloseError\" &&\n\t\t\t\t\t\treason.error.reason.code === 1000)),\n\t)\nexport const connectionEnded = (cause: Cause.Cause<unknown>) =>\n\tCause.hasInterruptsOnly(cause) || closedNormally(cause)\n\t\t? Effect.void\n\t\t: Effect.flatMap(Peer, (identity) =>\n\t\t\t\tEffect.logWarning(\"Remote host connection failed\", cause).pipe(\n\t\t\t\t\tEffect.annotateLogs({ \"remote.peer\": identity }),\n\t\t\t\t),\n\t\t\t)\n"],"mappings":";;;;;;AAQA,MAAa,kBAAkB,UAC9B,MAAM,QAAQ,SAAS,KACvB,MAAM,MACL,MAAM,UACL,WACA,OAAO,SAAS,WACf,OAAO,GAAG,cAAc,CAAC,CAAC,OAAO,KAAK,IACpC,eAAe,OAAO,MAAM,KAAK,IACjC,OAAO,GAAG,WAAW,CAAC,CAAC,OAAO,KAAK,KACnC,OAAO,cAAc,OAAO,KAAK,KACjC,OAAO,MAAM,OAAO,SAAS,sBAC7B,OAAO,MAAM,OAAO,SAAS,IAClC;AACD,MAAa,mBAAmB,UAC/B,MAAM,kBAAkB,KAAK,KAAK,eAAe,KAAK,IACnD,OAAO,OACP,OAAO,QAAQ,OAAO,aACtB,OAAO,WAAW,iCAAiC,KAAK,CAAC,CAAC,KACzD,OAAO,aAAa,EAAE,eAAe,SAAS,CAAC,CAChD,CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","names":[],"sources":["../../../src/internal/runner/model.ts"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"model.d.ts","names":[],"sources":["../../../src/internal/runner/model.ts"],"mappings":";;;;;;;;;;;;WAkVmB;;qBAFN,qCAAqC"}
|