@graftland/plugin-remote 0.3.3 → 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.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.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 +3 -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 +1 -1
- package/dist/host/auth/none.js +7 -5
- package/dist/host/auth/none.js.map +1 -1
- package/dist/host/command.d.ts +1 -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.map +1 -1
- package/dist/host/local.js +9 -30
- package/dist/host/local.js.map +1 -1
- package/dist/host/unix.d.ts +1 -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 +1 -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 +1 -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 -3
- 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 +1 -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 +104 -26
- 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 +3 -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 +4 -18
- 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 +3 -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 +1 -1
- package/dist/runner/auth/none.js +7 -5
- package/dist/runner/auth/none.js.map +1 -1
- package/dist/runner/index.d.ts +3 -308
- 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 +1 -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 +1 -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 +1 -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":"local.js","names":["ProcessObservation.observe"],"sources":["../../../src/internal/host/local.ts"],"sourcesContent":["import { Cause, Effect, Fiber, Option, Sink, Stream } from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/process\"\nimport { ProcessExited, TransportError } from \"../../Errors\"\nimport * as ProcessObservation from \"../runner/ProcessObservation\"\n\nexport const observe = Effect.fnUntraced(function* (\n\tchild: ChildProcessSpawner.ChildProcessHandle,\n) {\n\tconst observation = yield* ProcessObservation.observe(child)\n\tconst exited = yield* observation.exited.pipe(\n\t\tEffect.mapBoth({\n\t\t\tonFailure: (error) => TransportError.make({ cause: Cause.fail(error) }),\n\t\t\tonSuccess: (status) =>\n\t\t\t\tProcessExited.make({\n\t\t\t\t\tpid: Option.some(child.pid),\n\t\t\t\t\texitCode: status.code,\n\t\t\t\t\tstderr: status.stderr,\n\t\t\t\t\tstatusCause: status.cause,\n\t\t\t\t}),\n\t\t}),\n\t\tEffect.forkScoped,\n\t)\n\treturn {\n\t\tpid: Option.some(child.pid),\n\t\texited: Fiber.join(exited),\n\t\tfailure: observation.failure.pipe(\n\t\t\tEffect.mapError((error) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t),\n\t\t),\n\t\tchannel: {\n\t\t\tinput: child.getOutputFd(3).pipe(\n\t\t\t\t// EOF can precede Node's exit event; prefer complete process diagnostics.\n\t\t\t\tStream.concat(\n\t\t\t\t\tStream.fromEffect(\n\t\t\t\t\t\tFiber.join(exited).pipe(\n\t\t\t\t\t\t\tEffect.timeoutOption(\"1 second\"),\n\t\t\t\t\t\t\tEffect.asVoid,\n\t\t\t\t\t\t),\n\t\t\t\t\t).pipe(Stream.drain),\n\t\t\t\t),\n\t\t\t\tStream.mapError((error) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t),\n\t\t\t),\n\t\t\toutput: child.stdin.pipe(\n\t\t\t\tSink.mapError((error) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t),\n\t\t\t),\n\t\t},\n\t}\n})\n"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"local.js","names":["ProcessObservation.observe"],"sources":["../../../src/internal/host/local.ts"],"sourcesContent":["import { Cause, Effect, Fiber, Option, Sink, Stream } from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/process\"\n\nimport { ProcessExited, TransportError } from \"../../Errors\"\nimport * as ProcessObservation from \"../runner/ProcessObservation\"\n\nexport const observe = Effect.fnUntraced(function* (\n\tchild: ChildProcessSpawner.ChildProcessHandle,\n) {\n\tconst observation = yield* ProcessObservation.observe(child)\n\tconst exited = yield* observation.exited.pipe(\n\t\tEffect.mapBoth({\n\t\t\tonFailure: (error) => TransportError.make({ cause: Cause.fail(error) }),\n\t\t\tonSuccess: (status) =>\n\t\t\t\tProcessExited.make({\n\t\t\t\t\tpid: Option.some(child.pid),\n\t\t\t\t\texitCode: status.code,\n\t\t\t\t\tstderr: status.stderr,\n\t\t\t\t\tstatusCause: status.cause,\n\t\t\t\t}),\n\t\t}),\n\t\tEffect.forkScoped,\n\t)\n\treturn {\n\t\tpid: Option.some(child.pid),\n\t\texited: Fiber.join(exited),\n\t\tfailure: observation.failure.pipe(\n\t\t\tEffect.mapError((error) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t),\n\t\t),\n\t\tchannel: {\n\t\t\tinput: child.getOutputFd(3).pipe(\n\t\t\t\t// EOF can precede Node's exit event; prefer complete process diagnostics.\n\t\t\t\tStream.concat(\n\t\t\t\t\tStream.fromEffect(\n\t\t\t\t\t\tFiber.join(exited).pipe(\n\t\t\t\t\t\t\tEffect.timeoutOption(\"1 second\"),\n\t\t\t\t\t\t\tEffect.asVoid,\n\t\t\t\t\t\t),\n\t\t\t\t\t).pipe(Stream.drain),\n\t\t\t\t),\n\t\t\t\tStream.mapError((error) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t),\n\t\t\t),\n\t\t\toutput: child.stdin.pipe(\n\t\t\t\tSink.mapError((error) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t),\n\t\t\t),\n\t\t},\n\t}\n})\n"],"mappings":";;;;AAMA,MAAa,UAAU,OAAO,WAAW,WACxC,OACC;CACD,MAAM,cAAc,OAAOA,UAA2B,KAAK;CAC3D,MAAM,SAAS,OAAO,YAAY,OAAO,KACxC,OAAO,QAAQ;EACd,YAAY,UAAU,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC;EACtE,YAAY,WACX,cAAc,KAAK;GAClB,KAAK,OAAO,KAAK,MAAM,GAAG;GAC1B,UAAU,OAAO;GACjB,QAAQ,OAAO;GACf,aAAa,OAAO;EACrB,CAAC;CACH,CAAC,GACD,OAAO,UACR;CACA,OAAO;EACN,KAAK,OAAO,KAAK,MAAM,GAAG;EAC1B,QAAQ,MAAM,KAAK,MAAM;EACzB,SAAS,YAAY,QAAQ,KAC5B,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;EACA,SAAS;GACR,OAAO,MAAM,YAAY,CAAC,CAAC,CAAC,KAE3B,OAAO,OACN,OAAO,WACN,MAAM,KAAK,MAAM,CAAC,CAAC,KAClB,OAAO,cAAc,UAAU,GAC/B,OAAO,MACR,CACD,CAAC,CAAC,KAAK,OAAO,KAAK,CACpB,GACA,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;GACA,QAAQ,MAAM,MAAM,KACnB,KAAK,UAAU,UACd,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;EACD;CACD;AACD,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { make } from "../FailureGroup.js";
|
|
2
|
-
import { connectWith } from "../assembly.js";
|
|
3
1
|
import { ProcessExited, TransportError } from "../../Errors.js";
|
|
4
|
-
import {
|
|
2
|
+
import { connectWith } from "../assembly.js";
|
|
5
3
|
import { cleanupCause } from "../cleanup.js";
|
|
4
|
+
import { defaults } from "../Limits.js";
|
|
5
|
+
import { make } from "../FailureGroup.js";
|
|
6
6
|
import { make as make$1 } from "../port.js";
|
|
7
|
+
import { awaitTermination, childOf } from "../runner/model.js";
|
|
7
8
|
import { make as make$2 } from "../runner/Multiplex.js";
|
|
8
9
|
import { verify } from "../runner/Packages.js";
|
|
9
10
|
import { Session, channel } from "../runner/Wire.js";
|
|
10
|
-
import { awaitTermination, childOf } from "../runner/model.js";
|
|
11
11
|
import { Cause, Duration, Effect, Exit, Fiber, Option, Ref, Scope } from "effect";
|
|
12
12
|
import { RpcClient } from "effect/rpc";
|
|
13
13
|
// src/internal/host/runner.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","names":["channel","connectCapability","Multiplex.make","Port.make","Wire.channel","Wire.Session","FailureGroup.make","Packages.verify"],"sources":["../../../src/internal/host/runner.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"runner.js","names":["channel","connectCapability","Multiplex.make","Port.make","Wire.channel","Wire.Session","FailureGroup.make","Packages.verify"],"sources":["../../../src/internal/host/runner.ts"],"sourcesContent":["import {\n\tCause,\n\tDuration,\n\tEffect,\n\tExit,\n\tFiber,\n\tOption,\n\tRef,\n\tScope,\n} from \"effect\"\nimport { RpcClient } from \"effect/rpc\"\n\nimport { ProcessExited, TransportError } from \"../../Errors\"\nimport { connectWith as connectCapability } from \"../assembly\"\nimport { cleanupCause } from \"../cleanup\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport * as Port from \"../port\"\nimport type { ConfiguredRunner, Connected } from \"../runner/Connection\"\nimport { awaitTermination, childOf, defaults } from \"../runner/model\"\nimport * as Multiplex from \"../runner/Multiplex\"\nimport * as Packages from \"../runner/Packages\"\nimport * as Wire from \"../runner/Wire\"\n\nexport const connect = Effect.fnUntraced(function* (\n\ttarget: ConfiguredRunner,\n\tcontractModule: string,\n\toptions: Port.Options,\n\tresources: Scope.Scope,\n\tprocessScope: Scope.Scope,\n) {\n\tconst instance = target.instance\n\n\tconst margin = Duration.toMillis(target.margin ?? \"5 seconds\")\n\tconst channel = yield* connectCapability(target.explicitAuth).pipe(\n\t\tScope.provide(processScope),\n\t)\n\tconst mux = yield* Multiplex.make(channel).pipe(Scope.provide(resources))\n\tconst control = yield* Port.make(Wire.channel(mux, 0), {\n\t\tsession: \"session-v1\",\n\t\tserve: {},\n\t\tcall: { session: Wire.Session },\n\t}).pipe(Scope.provide(resources))\n\tconst session = yield* RpcClient.make(Wire.Session).pipe(\n\t\tEffect.provideService(\n\t\t\tRpcClient.Protocol,\n\t\t\tcontrol.clientProtocol(\"session\"),\n\t\t),\n\t\tScope.provide(resources),\n\t)\n\tconst expectedGeneration = yield* session.HighWater({ instance })\n\tconst record = yield* session.Open({\n\t\tinstance,\n\t\texpectedGeneration,\n\t\trequestId: options.session,\n\t\tlimits: defaults,\n\t\t...(target.lease === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tleaseMillis: Duration.toMillis(target.lease),\n\t\t\t\t}),\n\t})\n\tconst failures = yield* FailureGroup.make<TransportError>().pipe(\n\t\tScope.provide(resources),\n\t)\n\tconst finishStarted = yield* Ref.make(false)\n\tconst terminate = yield* Effect.cached(\n\t\tEffect.gen(function* () {\n\t\t\tyield* Ref.set(finishStarted, true)\n\t\t\t// A failed close must not skip Dispose; both outcomes are reported together below.\n\t\t\tconst closed = yield* Effect.exit(failures.close)\n\t\t\tconst result = yield* awaitTermination(\n\t\t\t\trecord.handle,\n\t\t\t\tsession.Dispose(record.handle),\n\t\t\t\trecord.leaseMillis,\n\t\t\t\tmargin,\n\t\t\t)\n\t\t\tconst { code, signal, stderr, cause } = result.exit\n\t\t\tyield* Effect.logInfo(\"Remote execution terminated\", {\n\t\t\t\tcode,\n\t\t\t\t...(signal === null ? {} : { signal }),\n\t\t\t\t...(stderr === undefined || stderr === \"\" ? {} : { stderr }),\n\t\t\t\t...(cause === undefined || cause.reasons.length === 0 ? {} : { cause }),\n\t\t\t}).pipe(\n\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\"remote.instance\": record.handle.key.instance,\n\t\t\t\t\t\"remote.generation\": record.handle.generation,\n\t\t\t\t\t\"remote.termination\": result.kind,\n\t\t\t\t}),\n\t\t\t)\n\t\t\tconst failure = Exit.isFailure(closed)\n\t\t\t\t? Cause.combine(closed.cause, result.cause)\n\t\t\t\t: result.cause\n\t\t\tif (failure.reasons.length > 0)\n\t\t\t\treturn yield* Effect.failCause(cleanupCause(failure))\n\t\t}),\n\t)\n\tyield* Scope.addFinalizer(\n\t\tprocessScope,\n\t\tEffect.gen(function* () {\n\t\t\tif (!(yield* Ref.get(finishStarted)))\n\t\t\t\tyield* terminate.pipe(\n\t\t\t\t\tEffect.catchCause((cause) => Effect.failCause(cleanupCause(cause))),\n\t\t\t\t)\n\t\t}),\n\t)\n\tconst renewed = yield* Effect.forever(\n\t\tEffect.sleep(record.leaseMillis / 3).pipe(\n\t\t\tEffect.andThen(session.Renew(record.handle)),\n\t\t),\n\t).pipe(Effect.forkIn(resources))\n\tconst code = yield* session.Load({\n\t\thandle: record.handle,\n\t\tspecifier: contractModule,\n\t\tdigest: target.expect?.digest !== undefined,\n\t})\n\tyield* Packages.verify(code, target.expect)\n\tconst loaded = yield* session.Status(record.handle)\n\tconst peer = yield* Port.make(Wire.channel(mux, 1), {\n\t\t...options,\n\t\tsession: record.handle.token,\n\t\tlimits: record.limits,\n\t}).pipe(Scope.provide(resources))\n\t// RPC forwarding cancellation is expected; resource cleanup is collected by Connection's scopes.\n\tconst report = (cause: Cause.Cause<unknown>) =>\n\t\tCause.hasInterruptsOnly(cause)\n\t\t\t? Effect.void\n\t\t\t: failures.failCause(\n\t\t\t\t\tCause.map(cause, (error) =>\n\t\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t),\n\t\t\t\t)\n\tyield* failures.await.pipe(\n\t\tEffect.catchCause((cause) =>\n\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t? Effect.void\n\t\t\t\t: peer.fail(TransportError.make({ cause })),\n\t\t),\n\t\tEffect.forkIn(resources),\n\t)\n\n\tyield* failures.run(\n\t\tFiber.join(renewed).pipe(\n\t\t\tEffect.catchCause(\n\t\t\t\tEffect.fnUntraced(function* (cause) {\n\t\t\t\t\tif (Cause.hasInterruptsOnly(cause)) return\n\t\t\t\t\tconst status = yield* Effect.exit(\n\t\t\t\t\t\tsession.Status(record.handle).pipe(Effect.timeout(\"5 seconds\")),\n\t\t\t\t\t)\n\t\t\t\t\tif (Exit.isSuccess(status) && status.value.phase === \"Stopped\") {\n\t\t\t\t\t\tconst exit = status.value.termination.exit\n\t\t\t\t\t\tyield* report(\n\t\t\t\t\t\t\tCause.combine(\n\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t\tCause.fail(\n\t\t\t\t\t\t\t\t\tProcessExited.make({\n\t\t\t\t\t\t\t\t\t\tpid: Option.map(childOf(loaded), (child) => child.pid),\n\t\t\t\t\t\t\t\t\t\texitCode: exit.code,\n\t\t\t\t\t\t\t\t\t\tstderr: exit.stderr ?? \"\",\n\t\t\t\t\t\t\t\t\t\tstatusCause: exit.cause ?? Cause.empty,\n\t\t\t\t\t\t\t\t\t}),\n\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\t} else\n\t\t\t\t\t\tyield* report(\n\t\t\t\t\t\t\tExit.isFailure(status)\n\t\t\t\t\t\t\t\t? Cause.combine(cause, status.cause)\n\t\t\t\t\t\t\t\t: cause,\n\t\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t)\n\treturn {\n\t\tresources,\n\t\tpid: Option.map(childOf(loaded), (child) => child.pid),\n\t\tdiagnostics: failures.cause,\n\t\tterminate: Effect.fnUntraced(function* () {\n\t\t\t// No renewal may extend a disconnected session while termination waits out its lease.\n\t\t\tyield* Fiber.interrupt(renewed)\n\t\t\tyield* terminate\n\t\t}),\n\t\ttransport: {\n\t\t\t...peer,\n\t\t\tfailure: peer.await,\n\t\t\treport,\n\t\t},\n\t} satisfies Connected\n})\n"],"mappings":";;;;;;;;;;;;;AAuBA,MAAa,UAAU,OAAO,WAAW,WACxC,QACA,gBACA,SACA,WACA,cACC;CACD,MAAM,WAAW,OAAO;CAExB,MAAM,SAAS,SAAS,SAAS,OAAO,UAAU,WAAW;CAC7D,MAAMA,YAAU,OAAOC,YAAkB,OAAO,YAAY,CAAC,CAAC,KAC7D,MAAM,QAAQ,YAAY,CAC3B;CACA,MAAM,MAAM,OAAOC,OAAeF,SAAO,CAAC,CAAC,KAAK,MAAM,QAAQ,SAAS,CAAC;CACxE,MAAM,UAAU,OAAOG,OAAUC,QAAa,KAAK,CAAC,GAAG;EACtD,SAAS;EACT,OAAO,CAAC;EACR,MAAM,EAAE,SAASC,QAAa;CAC/B,CAAC,CAAC,CAAC,KAAK,MAAM,QAAQ,SAAS,CAAC;CAChC,MAAM,UAAU,OAAO,UAAU,KAAKA,OAAY,CAAC,CAAC,KACnD,OAAO,eACN,UAAU,UACV,QAAQ,eAAe,SAAS,CACjC,GACA,MAAM,QAAQ,SAAS,CACxB;CACA,MAAM,qBAAqB,OAAO,QAAQ,UAAU,EAAE,SAAS,CAAC;CAChE,MAAM,SAAS,OAAO,QAAQ,KAAK;EAClC;EACA;EACA,WAAW,QAAQ;EACnB,QAAQ;EACR,GAAI,OAAO,UAAU,KAAA,IAClB,CAAC,IACD,EACA,aAAa,SAAS,SAAS,OAAO,KAAK,EAC5C;CACH,CAAC;CACD,MAAM,WAAW,OAAOC,KAAkC,CAAC,CAAC,KAC3D,MAAM,QAAQ,SAAS,CACxB;CACA,MAAM,gBAAgB,OAAO,IAAI,KAAK,KAAK;CAC3C,MAAM,YAAY,OAAO,OAAO,OAC/B,OAAO,IAAI,aAAa;EACvB,OAAO,IAAI,IAAI,eAAe,IAAI;EAElC,MAAM,SAAS,OAAO,OAAO,KAAK,SAAS,KAAK;EAChD,MAAM,SAAS,OAAO,iBACrB,OAAO,QACP,QAAQ,QAAQ,OAAO,MAAM,GAC7B,OAAO,aACP,MACD;EACA,MAAM,EAAE,MAAM,QAAQ,QAAQ,UAAU,OAAO;EAC/C,OAAO,OAAO,QAAQ,+BAA+B;GACpD;GACA,GAAI,WAAW,OAAO,CAAC,IAAI,EAAE,OAAO;GACpC,GAAI,WAAW,KAAA,KAAa,WAAW,KAAK,CAAC,IAAI,EAAE,OAAO;GAC1D,GAAI,UAAU,KAAA,KAAa,MAAM,QAAQ,WAAW,IAAI,CAAC,IAAI,EAAE,MAAM;EACtE,CAAC,CAAC,CAAC,KACF,OAAO,aAAa;GACnB,mBAAmB,OAAO,OAAO,IAAI;GACrC,qBAAqB,OAAO,OAAO;GACnC,sBAAsB,OAAO;EAC9B,CAAC,CACF;EACA,MAAM,UAAU,KAAK,UAAU,MAAM,IAClC,MAAM,QAAQ,OAAO,OAAO,OAAO,KAAK,IACxC,OAAO;EACV,IAAI,QAAQ,QAAQ,SAAS,GAC5B,OAAO,OAAO,OAAO,UAAU,aAAa,OAAO,CAAC;CACtD,CAAC,CACF;CACA,OAAO,MAAM,aACZ,cACA,OAAO,IAAI,aAAa;EACvB,IAAI,EAAE,OAAO,IAAI,IAAI,aAAa,IACjC,OAAO,UAAU,KAChB,OAAO,YAAY,UAAU,OAAO,UAAU,aAAa,KAAK,CAAC,CAAC,CACnE;CACF,CAAC,CACF;CACA,MAAM,UAAU,OAAO,OAAO,QAC7B,OAAO,MAAM,OAAO,cAAc,CAAC,CAAC,CAAC,KACpC,OAAO,QAAQ,QAAQ,MAAM,OAAO,MAAM,CAAC,CAC5C,CACD,CAAC,CAAC,KAAK,OAAO,OAAO,SAAS,CAAC;CAC/B,MAAM,OAAO,OAAO,QAAQ,KAAK;EAChC,QAAQ,OAAO;EACf,WAAW;EACX,QAAQ,OAAO,QAAQ,WAAW,KAAA;CACnC,CAAC;CACD,OAAOC,OAAgB,MAAM,OAAO,MAAM;CAC1C,MAAM,SAAS,OAAO,QAAQ,OAAO,OAAO,MAAM;CAClD,MAAM,OAAO,OAAOJ,OAAUC,QAAa,KAAK,CAAC,GAAG;EACnD,GAAG;EACH,SAAS,OAAO,OAAO;EACvB,QAAQ,OAAO;CAChB,CAAC,CAAC,CAAC,KAAK,MAAM,QAAQ,SAAS,CAAC;CAEhC,MAAM,UAAU,UACf,MAAM,kBAAkB,KAAK,IAC1B,OAAO,OACP,SAAS,UACT,MAAM,IAAI,QAAQ,UACjB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;CACH,OAAO,SAAS,MAAM,KACrB,OAAO,YAAY,UAClB,MAAM,kBAAkB,KAAK,IAC1B,OAAO,OACP,KAAK,KAAK,eAAe,KAAK,EAAE,MAAM,CAAC,CAAC,CAC5C,GACA,OAAO,OAAO,SAAS,CACxB;CAEA,OAAO,SAAS,IACf,MAAM,KAAK,OAAO,CAAC,CAAC,KACnB,OAAO,WACN,OAAO,WAAW,WAAW,OAAO;EACnC,IAAI,MAAM,kBAAkB,KAAK,GAAG;EACpC,MAAM,SAAS,OAAO,OAAO,KAC5B,QAAQ,OAAO,OAAO,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,CAAC,CAC/D;EACA,IAAI,KAAK,UAAU,MAAM,KAAK,OAAO,MAAM,UAAU,WAAW;GAC/D,MAAM,OAAO,OAAO,MAAM,YAAY;GACtC,OAAO,OACN,MAAM,QACL,OACA,MAAM,KACL,cAAc,KAAK;IAClB,KAAK,OAAO,IAAI,QAAQ,MAAM,IAAI,UAAU,MAAM,GAAG;IACrD,UAAU,KAAK;IACf,QAAQ,KAAK,UAAU;IACvB,aAAa,KAAK,SAAS,MAAM;GAClC,CAAC,CACF,CACD,CACD;EACD,OACC,OAAO,OACN,KAAK,UAAU,MAAM,IAClB,MAAM,QAAQ,OAAO,OAAO,KAAK,IACjC,KACJ;CACF,CAAC,CACF,CACD,CACD;CACA,OAAO;EACN;EACA,KAAK,OAAO,IAAI,QAAQ,MAAM,IAAI,UAAU,MAAM,GAAG;EACrD,aAAa,SAAS;EACtB,WAAW,OAAO,WAAW,aAAa;GAEzC,OAAO,MAAM,UAAU,OAAO;GAC9B,OAAO;EACR,CAAC;EACD,WAAW;GACV,GAAG;GACH,SAAS,KAAK;GACd;EACD;CACD;AACD,CAAC"}
|
package/dist/internal/host.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { make } from "./FailureGroup.js";
|
|
2
1
|
import { RemoteWithdrawn } from "../Errors.js";
|
|
3
|
-
import { endpoint } from "./control.js";
|
|
4
2
|
import { cleanupCause } from "./cleanup.js";
|
|
3
|
+
import { endpoint } from "./control.js";
|
|
4
|
+
import { make } from "./FailureGroup.js";
|
|
5
5
|
import { Connection } from "./runner/Connection.js";
|
|
6
6
|
import { Array, Cause, Deferred, Effect, Option, Ref, Scope, Stream } from "effect";
|
|
7
7
|
import { RpcClient } from "effect/rpc";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","names":["FailureGroup.make","Control.endpoint"],"sources":["../../src/internal/host.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"host.js","names":["FailureGroup.make","Control.endpoint"],"sources":["../../src/internal/host.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tDeferred,\n\tEffect,\n\tOption,\n\tRef,\n\tSchema,\n\tScope,\n\tStream,\n} from \"effect\"\nimport { RpcClient, type RpcClientError } from \"effect/rpc\"\n\nimport * as ContractModule from \"../Contract\"\nimport type { Service } from \"../Contract\"\nimport { RemoteWithdrawn } from \"../Errors\"\nimport type { ChildFailure } from \"./childErrors\"\nimport { cleanupCause } from \"./cleanup\"\nimport type { prepare } from \"./contract\"\nimport * as Control from \"./control\"\nimport * as FailureGroup from \"./FailureGroup\"\nimport { Connection } from \"./runner/Connection\"\n\ntype ErrorSchema = Schema.Top & {\n\treadonly DecodingServices: never\n\treadonly EncodingServices: never\n}\ntype ControlGroup<E extends ErrorSchema> = ReturnType<\n\ttypeof prepare<Schema.Codec<unknown, Schema.Json>, E>\n>[\"control\"]\ninterface Contract<E extends ErrorSchema> {\n\treadonly control: ControlGroup<E>\n\treadonly inject: ReadonlyArray<Service>\n\treadonly decodeCause: (\n\t\tinput: unknown,\n\t) => Effect.Effect<\n\t\tCause.Cause<E[\"Type\"] | ContractModule.UndeclaredFailure | ChildFailure>,\n\t\tSchema.SchemaError\n\t>\n}\ntype Client<E extends ErrorSchema> = RpcClient.FromGroup<\n\tControlGroup<E>,\n\tRpcClientError.RpcClientError\n>\nconst race = <A, E, R>(\n\tconnection: Connection[\"Service\"],\n\teffect: Effect.Effect<A, E, R>,\n) => Effect.raceFirst(effect, connection.transport.failure)\n\nconst forwardEvents = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n\tclient: Client<E>,\n\tconnection: Connection[\"Service\"],\n) {\n\tconst stopped = yield* Deferred.make<void>()\n\tconst remoteFailure = yield* FailureGroup.make<\n\t\t| E[\"Type\"]\n\t\t| ContractModule.UndeclaredFailure\n\t\t| ChildFailure\n\t\t| RemoteWithdrawn\n\t>()\n\tconst events = yield* race(\n\t\tconnection,\n\t\tclient.Events().pipe(\n\t\t\tStream.runForEach((event) => {\n\t\t\t\tswitch (event._tag) {\n\t\t\t\t\tcase \"Stopped\":\n\t\t\t\t\t\treturn Deferred.succeed(stopped, undefined)\n\t\t\t\t\tcase \"Withdrawing\":\n\t\t\t\t\t\treturn remoteFailure.fail(RemoteWithdrawn.make({}))\n\t\t\t\t\tcase \"Failed\":\n\t\t\t\t\t\treturn contract\n\t\t\t\t\t\t\t.decodeCause(event.cause)\n\t\t\t\t\t\t\t.pipe(Effect.flatMap((cause) => remoteFailure.failCause(cause)))\n\t\t\t\t}\n\t\t\t}),\n\t\t),\n\t).pipe(\n\t\tEffect.tapCause(connection.transport.report),\n\t\tEffect.forkIn(connection.resources),\n\t)\n\treturn { stopped, remoteFailure, events }\n})\nconst forwardLogs = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n\tclient: Client<E>,\n\tconnection: Connection[\"Service\"],\n) {\n\tconst logsEnded = yield* Deferred.make<void>()\n\tconst reportedDrops = yield* Ref.make(0)\n\tyield* race(\n\t\tconnection,\n\t\tclient.Logs().pipe(\n\t\t\tStream.runForEach(\n\t\t\t\tEffect.fnUntraced(function* (event) {\n\t\t\t\t\tconst previous = yield* Ref.getAndSet(reportedDrops, event.dropped)\n\t\t\t\t\tif (event.dropped > previous)\n\t\t\t\t\t\tyield* Effect.logWarning(\"Remote logs were dropped\").pipe(\n\t\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t\t...(Option.isSome(connection.pid)\n\t\t\t\t\t\t\t\t\t? { \"remote.pid\": connection.pid.value }\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\"remote.logs.dropped\": event.dropped - previous,\n\t\t\t\t\t\t\t\t\"remote.logs.droppedTotal\": event.dropped,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\tif (event._tag === \"LogsEnded\") {\n\t\t\t\t\t\tyield* Deferred.succeed(logsEnded, undefined)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst entry = event.entry\n\t\t\t\t\tconst cause = yield* contract.decodeCause(entry.cause)\n\t\t\t\t\tyield* Effect.logWithLevel(\n\t\t\t\t\t\tentry.level === \"All\" || entry.level === \"None\"\n\t\t\t\t\t\t\t? \"Info\"\n\t\t\t\t\t\t\t: entry.level,\n\t\t\t\t\t)(\n\t\t\t\t\t\t...(Array.isArray(entry.message) ? entry.message : [entry.message]),\n\t\t\t\t\t\tcause,\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t...(Option.isSome(connection.pid)\n\t\t\t\t\t\t\t\t? { \"remote.pid\": connection.pid.value }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t...(connection.threadId === undefined\n\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t: { \"remote.threadId\": connection.threadId }),\n\t\t\t\t\t\t\t\"remote.annotations\": entry.annotations,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t).pipe(\n\t\tEffect.tapCause(connection.transport.report),\n\t\tEffect.forkIn(connection.resources),\n\t)\n\treturn logsEnded\n})\nexport const initialize = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n) {\n\tconst connection = yield* Connection\n\tconst client = yield* RpcClient.make(contract.control).pipe(\n\t\tEffect.provideService(\n\t\t\tRpcClient.Protocol,\n\t\t\tconnection.transport.clientProtocol(Control.endpoint),\n\t\t),\n\t\tScope.provide(connection.resources),\n\t)\n\tfor (const service of contract.inject)\n\t\tyield* service\n\t\t\t.serve(connection.transport)\n\t\t\t.pipe(\n\t\t\t\tEffect.tapCause(connection.transport.report),\n\t\t\t\tEffect.forkIn(connection.resources),\n\t\t\t)\n\tconst events = yield* forwardEvents(contract, client, connection)\n\tconst logsEnded = yield* forwardLogs(contract, client, connection)\n\treturn { connection, client, ...events, logsEnded }\n})\ntype Active<E extends ErrorSchema> = Effect.Success<\n\tReturnType<typeof initialize<E>>\n>\nexport const load = <E extends ErrorSchema>(\n\tactive: Active<E>,\n\tinput: Schema.Json,\n) =>\n\trace(\n\t\tactive.connection,\n\t\tEffect.raceFirst(\n\t\t\tactive.client\n\t\t\t\t.Load({ input })\n\t\t\t\t.pipe(\n\t\t\t\t\tEffect.catchIf(\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t): cause is Cause.Cause<\n\t\t\t\t\t\t\tE[\"Type\"] | ContractModule.UndeclaredFailure | ChildFailure\n\t\t\t\t\t\t> => Cause.isCause(cause),\n\t\t\t\t\t\tEffect.failCause,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\tactive.remoteFailure.await,\n\t\t),\n\t)\nexport const dispose = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tactive: Active<E>,\n) {\n\tconst result = yield* race(\n\t\tactive.connection,\n\t\tactive.client.Dispose().pipe(Effect.catchIf(Cause.isCause, Effect.succeed)),\n\t)\n\tconst cause = Cause.isCause(result) ? result : Cause.empty\n\t// A remote cleanup failure still permits the bounded event and log tail to drain.\n\tyield* race(\n\t\tactive.connection,\n\t\tDeferred.await(active.stopped).pipe(\n\t\t\tEffect.andThen(Deferred.await(active.logsEnded)),\n\t\t),\n\t).pipe(Effect.onError(() => Effect.failCause(cleanupCause(cause))))\n\treturn cause\n})\n"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { SecureRandom } from "effect/crypto";
|
|
|
6
6
|
const make = Effect.fnUntraced(function* (directory) {
|
|
7
7
|
const path = yield* Path.Path;
|
|
8
8
|
const base = yield* path.toFileUrl(path.join(directory, "graft.yml"));
|
|
9
|
-
const prefix = `graft-
|
|
9
|
+
const prefix = `graft-module-${yield* (yield* SecureRandom.SecureRandom).uuidV4()}:`;
|
|
10
10
|
yield* Effect.acquireRelease(Effect.sync(() => registerHooks({ resolve: (specifier, context, next) => String.startsWith(prefix)(specifier) ? next(String.slice(prefix.length)(specifier), {
|
|
11
11
|
...context,
|
|
12
12
|
parentURL: base.href
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importer.js","names":[],"sources":["../../src/internal/importer.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"importer.js","names":[],"sources":["../../src/internal/importer.ts"],"sourcesContent":["import { registerHooks } from \"node:module\"\n\nimport { Effect, Path, String } from \"effect\"\nimport { SecureRandom } from \"effect/crypto\"\n\n/** Bare names resolve from the application; imported dependencies keep their own parent URLs. */\nexport const make = Effect.fnUntraced(function* (directory: string) {\n\tconst path = yield* Path.Path\n\tconst base = yield* path.toFileUrl(path.join(directory, \"graft.yml\"))\n\tconst random = yield* SecureRandom.SecureRandom\n\tconst id = yield* random.uuidV4()\n\tconst prefix = `graft-module-${id}:`\n\tyield* Effect.acquireRelease(\n\t\tEffect.sync(() =>\n\t\t\tregisterHooks({\n\t\t\t\tresolve: (specifier, context, next) =>\n\t\t\t\t\tString.startsWith(prefix)(specifier)\n\t\t\t\t\t\t? next(String.slice(prefix.length)(specifier), {\n\t\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\t\tparentURL: base.href,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: next(specifier, context),\n\t\t\t}),\n\t\t),\n\t\t(hooks) => Effect.sync(() => hooks.deregister()),\n\t)\n\treturn (specifier: string): Promise<unknown> => import(prefix + specifier)\n})\n"],"mappings":";;;;;AAMA,MAAa,OAAO,OAAO,WAAW,WAAW,WAAmB;CACnE,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,OAAO,OAAO,KAAK,UAAU,KAAK,KAAK,WAAW,WAAW,CAAC;CAGpE,MAAM,SAAS,gBAAgB,QADb,OADI,aAAa,aAAA,CACV,OAAO,EACE;CAClC,OAAO,OAAO,eACb,OAAO,WACN,cAAc,EACb,UAAU,WAAW,SAAS,SAC7B,OAAO,WAAW,MAAM,CAAC,CAAC,SAAS,IAChC,KAAK,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC,SAAS,GAAG;EAC7C,GAAG;EACH,WAAW,KAAK;CACjB,CAAC,IACA,KAAK,WAAW,OAAO,EAC5B,CAAC,CACF,IACC,UAAU,OAAO,WAAW,MAAM,WAAW,CAAC,CAChD;CACA,QAAQ,cAAwC,OAAO,SAAS;AACjE,CAAC"}
|
|
@@ -8,7 +8,7 @@ const signals = Effect.all({
|
|
|
8
8
|
/** A startup signal races its assembly's failure; no runtime failure is promoted to the owner. */
|
|
9
9
|
const wait = (fork, signal) => Deferred.await(signal).pipe(Effect.raceFirst(fork.state.pipe(Stream.runForEach((state) => state._tag === "Failed" ? Effect.fail(CapabilityFailed.make({ cause: state.cause })) : Effect.void), Effect.andThen(Effect.never))));
|
|
10
10
|
const validate = (listeners) => {
|
|
11
|
-
if (listeners.length !== 1 && Array.some(listeners, ({ properties }) => properties.protocol === "stdio")) return Effect.fail(CapabilityCombinationError.make({ detail: "A stdio listener must be the only listener in
|
|
11
|
+
if (listeners.length !== 1 && Array.some(listeners, ({ properties }) => properties.protocol === "stdio")) return Effect.fail(CapabilityCombinationError.make({ detail: "A stdio listener must be the only listener in the runner" }));
|
|
12
12
|
const issuers = HashSet.fromIterable(Array.getSomes(Array.map(listeners, ({ auth }) => auth._tag === "Header" ? Option.fromUndefinedOr(auth.issuer) : Option.none())));
|
|
13
13
|
return HashSet.size(issuers) > 1 ? Effect.fail(CapabilityCombinationError.make({ detail: "A runner must use a single authentication issuer" })) : Effect.void;
|
|
14
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listenerStartup.js","names":[],"sources":["../../src/internal/listenerStartup.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"listenerStartup.js","names":[],"sources":["../../src/internal/listenerStartup.ts"],"sourcesContent":["import { Array, Deferred, Effect, HashSet, Option, Stream } from \"effect\"\n\nimport type { Fork } from \"@graftland/graft\"\n\nimport type { AuthenticatorApi } from \"../Auth\"\nimport type { Properties } from \"../Transport\"\nimport { CapabilityCombinationError, CapabilityFailed } from \"./assembly\"\n\nexport interface Description {\n\treadonly properties: Properties\n\treadonly auth: AuthenticatorApi\n}\nexport const signals = Effect.all({\n\tdescription: Deferred.make<Description>(),\n\tready: Deferred.make<void>(),\n})\n/** A startup signal races its assembly's failure; no runtime failure is promoted to the owner. */\nexport const wait = <A>(fork: Fork.Fork, signal: Deferred.Deferred<A>) =>\n\tDeferred.await(signal).pipe(\n\t\tEffect.raceFirst(\n\t\t\tfork.state.pipe(\n\t\t\t\tStream.runForEach((state) =>\n\t\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t\t? Effect.fail(CapabilityFailed.make({ cause: state.cause }))\n\t\t\t\t\t\t: Effect.void,\n\t\t\t\t),\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\t),\n\t)\nexport const validate = (listeners: ReadonlyArray<Description>) => {\n\tif (\n\t\tlisteners.length !== 1 &&\n\t\tArray.some(listeners, ({ properties }) => properties.protocol === \"stdio\")\n\t)\n\t\treturn Effect.fail(\n\t\t\tCapabilityCombinationError.make({\n\t\t\t\tdetail: \"A stdio listener must be the only listener in the runner\",\n\t\t\t}),\n\t\t)\n\tconst issuers = HashSet.fromIterable(\n\t\tArray.getSomes(\n\t\t\tArray.map(listeners, ({ auth }) =>\n\t\t\t\tauth._tag === \"Header\"\n\t\t\t\t\t? Option.fromUndefinedOr(auth.issuer)\n\t\t\t\t\t: Option.none(),\n\t\t\t),\n\t\t),\n\t)\n\treturn HashSet.size(issuers) > 1\n\t\t? Effect.fail(\n\t\t\t\tCapabilityCombinationError.make({\n\t\t\t\t\tdetail: \"A runner must use a single authentication issuer\",\n\t\t\t\t}),\n\t\t\t)\n\t\t: Effect.void\n}\n"],"mappings":";;;AAYA,MAAa,UAAU,OAAO,IAAI;CACjC,aAAa,SAAS,KAAkB;CACxC,OAAO,SAAS,KAAW;AAC5B,CAAC;;AAED,MAAa,QAAW,MAAiB,WACxC,SAAS,MAAM,MAAM,CAAC,CAAC,KACtB,OAAO,UACN,KAAK,MAAM,KACV,OAAO,YAAY,UAClB,MAAM,SAAS,WACZ,OAAO,KAAK,iBAAiB,KAAK,EAAE,OAAO,MAAM,MAAM,CAAC,CAAC,IACzD,OAAO,IACX,GACA,OAAO,QAAQ,OAAO,KAAK,CAC5B,CACD,CACD;AACD,MAAa,YAAY,cAA0C;CAClE,IACC,UAAU,WAAW,KACrB,MAAM,KAAK,YAAY,EAAE,iBAAiB,WAAW,aAAa,OAAO,GAEzE,OAAO,OAAO,KACb,2BAA2B,KAAK,EAC/B,QAAQ,2DACT,CAAC,CACF;CACD,MAAM,UAAU,QAAQ,aACvB,MAAM,SACL,MAAM,IAAI,YAAY,EAAE,WACvB,KAAK,SAAS,WACX,OAAO,gBAAgB,KAAK,MAAM,IAClC,OAAO,KAAK,CAChB,CACD,CACD;CACA,OAAO,QAAQ,KAAK,OAAO,IAAI,IAC5B,OAAO,KACP,2BAA2B,KAAK,EAC/B,QAAQ,mDACT,CAAC,CACF,IACC,OAAO;AACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadModule.js","names":[],"sources":["../../src/internal/loadModule.ts"],"sourcesContent":["import { Cause, Effect } from \"effect\"\nimport { ModuleImportFailed } from \"./childErrors\"\n\n/** Native imports cannot be cancelled; late rejection still belongs to the importing context. */\nexport const loadModule = Effect.fn(\"Remote.loadModule\")(function* (\n\tmodule: string,\n) {\n\tconst context = yield* Effect.context<never>()\n\treturn yield* Effect.tryPromise({\n\t\ttry: (signal) =>\n\t\t\timport(module).catch((cause) => {\n\t\t\t\tif (signal.aborted)\n\t\t\t\t\tEffect.runSyncWith(context)(\n\t\t\t\t\t\tEffect.logError(\n\t\t\t\t\t\t\t\"Module import failed after cancellation\",\n\t\t\t\t\t\t\tCause.die(cause),\n\t\t\t\t\t\t).pipe(Effect.annotateLogs({ module })),\n\t\t\t\t\t)\n\t\t\t\tthrow cause\n\t\t\t}),\n\t\tcatch: (cause) => ModuleImportFailed.make({ module, cause }),\n\t})\n})\n"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"loadModule.js","names":[],"sources":["../../src/internal/loadModule.ts"],"sourcesContent":["import { Cause, Effect } from \"effect\"\n\nimport { ModuleImportFailed } from \"./childErrors\"\n\n/** Native imports cannot be cancelled; late rejection still belongs to the importing context. */\nexport const loadModule = Effect.fn(\"Remote.loadModule\")(function* (\n\tmodule: string,\n) {\n\tconst context = yield* Effect.context<never>()\n\treturn yield* Effect.tryPromise({\n\t\ttry: (signal) =>\n\t\t\timport(module).catch((cause) => {\n\t\t\t\tif (signal.aborted)\n\t\t\t\t\tEffect.runSyncWith(context)(\n\t\t\t\t\t\tEffect.logError(\n\t\t\t\t\t\t\t\"Module import failed after cancellation\",\n\t\t\t\t\t\t\tCause.die(cause),\n\t\t\t\t\t\t).pipe(Effect.annotateLogs({ module })),\n\t\t\t\t\t)\n\t\t\t\tthrow cause\n\t\t\t}),\n\t\tcatch: (cause) => ModuleImportFailed.make({ module, cause }),\n\t})\n})\n"],"mappings":";;;;AAKA,MAAa,aAAa,OAAO,GAAG,mBAAmB,CAAC,CAAC,WACxD,QACC;CACD,MAAM,UAAU,OAAO,OAAO,QAAe;CAC7C,OAAO,OAAO,OAAO,WAAW;EAC/B,MAAM,WACL,OAAO,OAAO,CAAC,OAAO,UAAU;GAC/B,IAAI,OAAO,SACV,OAAO,YAAY,OAAO,CAAC,CAC1B,OAAO,SACN,2CACA,MAAM,IAAI,KAAK,CAChB,CAAC,CAAC,KAAK,OAAO,aAAa,EAAE,OAAO,CAAC,CAAC,CACvC;GACD,MAAM;EACP,CAAC;EACF,QAAQ,UAAU,mBAAmB,KAAK;GAAE;GAAQ;EAAM,CAAC;CAC5D,CAAC;AACF,CAAC"}
|
|
@@ -1,9 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { Digest, SecureRandom, Signature } from "effect/crypto";
|
|
3
|
-
import { NodeServices } from "@effect/platform-node";
|
|
4
|
-
import { FetchHttpClient } from "effect/http";
|
|
5
|
-
// src/internal/platform.ts
|
|
6
|
-
const platform = Layer.mergeAll(NodeServices.layer, FetchHttpClient.layer, Digest.layerWebCrypto, SecureRandom.layerWebCrypto, Signature.layerWebCrypto.pipe(Layer.provide(SecureRandom.layerWebCrypto)));
|
|
7
|
-
export { platform };
|
|
8
|
-
|
|
9
|
-
//# sourceMappingURL=platform.js.map
|
|
1
|
+
export { platform } from "@graftland/cli/Application";
|
package/dist/internal/port.d.ts
CHANGED
package/dist/internal/port.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { EndOfStream } from "./runner/Framing.js";
|
|
2
|
-
import { make as make$1 } from "./FailureGroup.js";
|
|
3
1
|
import { TransportError } from "../Errors.js";
|
|
2
|
+
import { make as make$1 } from "./FailureGroup.js";
|
|
4
3
|
import { defaults } from "./Limits.js";
|
|
4
|
+
import { EndOfStream } from "./runner/Framing.js";
|
|
5
5
|
import { Array, Cause, Context, Data, Deferred, Effect, Fiber, HashMap, Option, Queue, Record, Result, Schema, Stream, TxQueue, TxRef } from "effect";
|
|
6
6
|
import { RpcClient, RpcClientError, RpcSerialization, RpcServer } from "effect/rpc";
|
|
7
7
|
// src/internal/port.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port.js","names":["FailureGroup.make"],"sources":["../../src/internal/port.ts"],"sourcesContent":["import { EndOfStream } from \"./runner/Framing\"\nexport type { Channel } from \"../Transport\"\nimport type { Channel } from \"../Transport\"\nimport {\n\tArray,\n\tCause,\n\tContext,\n\tData,\n\tDeferred,\n\tEffect,\n\tFiber,\n\tHashMap,\n\tOption,\n\tQueue,\n\tRecord,\n\tResult,\n\tSchema,\n\ttype Scope,\n\tStream,\n\tTxQueue,\n\tTxRef,\n} from \"effect\"\nimport {\n\tRpcClient,\n\tRpcClientError,\n\tRpcSerialization,\n\tRpcServer,\n} from \"effect/rpc\"\nimport type { Rpc, RpcGroup, RpcMessage } from \"effect/rpc\"\nimport * as FailureGroup from \"./FailureGroup\"\nimport { TransportError } from \"../Errors\"\nimport { defaults, type Limits } from \"./Limits\"\nexport type Priority = keyof Limits\n\nexport const Priority = Context.Reference<Priority>(\n\t\"@graftland/plugin-remote/internal/port/Priority\",\n\t{ defaultValue: () => \"data\" },\n)\ntype Endpoint = Pick<RpcGroup.RpcGroup<Rpc.Any>, \"requests\">\n\nexport interface Options {\n\treadonly session: string\n\treadonly serve: Readonly<Record<string, Endpoint>>\n\treadonly call: Readonly<Record<string, Endpoint>>\n\t/** Limits are shared across endpoints, separately for each direction.\n\t * Each peer's inbound limits must accommodate the other's outbound limits. */\n\treadonly limits?: Partial<Record<Priority, number>>\n}\nexport interface Port {\n\treadonly clientProtocol: (endpoint: string) => RpcClient.Protocol[\"Service\"]\n\treadonly serverProtocol: (endpoint: string) => RpcServer.Protocol[\"Service\"]\n\treadonly await: Effect.Effect<never, TransportError>\n\treadonly fail: (error: TransportError) => Effect.Effect<void>\n\treadonly end: Effect.Effect<void, TransportError>\n}\nclass RequestKey extends Data.Class<{\n\treadonly endpoint: string\n\treadonly id: string | number\n}> {}\ninterface RequestState<A> {\n\treadonly queue: Queue.Queue<A, Cause.Done>\n\treadonly priority: Priority\n\treadonly sent: boolean\n}\nconst Frame = Schema.Struct({\n\tsession: Schema.String,\n\tendpoint: Schema.String,\n\tdirection: Schema.Literals([\"request\", \"response\"]),\n\tpriority: Schema.Literals([\"control\", \"data\", \"log\"]),\n\tmessage: Schema.Unknown,\n})\ntype Frame = typeof Frame.Type\ninterface Pending {\n\treadonly frame: Frame\n\treadonly request: Option.Option<RequestKey>\n}\nconst Id = Schema.Union([Schema.String, Schema.Finite])\n// Only routing fields belong to this transport. The RPC serialization codec\n// validates payloads, chunks and exits before handlers or callers see them. These\n// protocol callbacks are an opaque handoff, not validation of a complete RpcMessage.\n// EncodedSchema requires binary payloads\n// in Effect 4.1.2 and cannot describe these JSON codec messages.\nconst isRequest = Schema.is(\n\tSchema.Union([\n\t\tSchema.TaggedStruct(\"Request\", { id: Id, tag: Schema.String }),\n\t\tSchema.TaggedStruct(\"Ack\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Interrupt\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Eof\", {}),\n\t]),\n)\nconst isResponse = Schema.is(\n\tSchema.Union([\n\t\tSchema.TaggedStruct(\"Exit\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Chunk\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Defect\", { defect: Schema.Unknown }),\n\t]),\n)\nconst Request = Schema.declare<\n\tExclude<RpcMessage.FromClientEncoded, RpcMessage.Ping>\n>((input): input is Exclude<RpcMessage.FromClientEncoded, RpcMessage.Ping> =>\n\tisRequest(input),\n)\nconst Response = Schema.declare<\n\tExclude<\n\t\tRpcMessage.FromServerEncoded,\n\t\tRpcMessage.Pong | RpcMessage.ClientProtocolError | RpcMessage.RequestEncoded\n\t>\n>(\n\t(\n\t\tinput,\n\t): input is Exclude<\n\t\tRpcMessage.FromServerEncoded,\n\t\tRpcMessage.Pong | RpcMessage.ClientProtocolError | RpcMessage.RequestEncoded\n\t> => isResponse(input),\n)\nconst error = (message: string) =>\n\tTransportError.make({ cause: Cause.die(new Error(message)) })\nconst rpcError = (cause: Cause.Cause<TransportError>) =>\n\tRpcClientError.RpcClientError.make({\n\t\treason: RpcClientError.RpcClientDefect.make({\n\t\t\tmessage: \"Remote connection failed\",\n\t\t\tcause,\n\t\t}),\n\t})\nconst priority = (group: Endpoint, tag: string): Priority => {\n\tconst rpc = group.requests.get(tag)\n\treturn rpc === undefined ? \"data\" : Context.get(rpc.annotations, Priority)\n}\nconst mailbox = <A>(priority: Priority) =>\n\tQueue.dropping<A, Cause.Done>(2).pipe(\n\t\tEffect.map((queue): RequestState<A> => ({ queue, priority, sent: false })),\n\t)\nconst deliver = Effect.fnUntraced(function* <A>(\n\trequestState: RequestState<A>,\n\tmessage: A,\n) {\n\t// One unacknowledged chunk and its terminal Exit may coexist.\n\tif (!(yield* Queue.offer(requestState.queue, message)))\n\t\treturn yield* error(\"RPC request mailbox overflow\")\n})\n\ntype ServerEndpoint = {\n\treadonly group: Endpoint\n\treadonly ready: Deferred.Deferred<\n\t\tParameters<RpcServer.Protocol[\"Service\"][\"run\"]>[0]\n\t>\n\treadonly disconnects: Queue.Queue<number>\n}\ntype ClientEndpoint = {\n\treadonly group: Endpoint\n\treadonly ready: Deferred.Deferred<\n\t\tParameters<RpcClient.Protocol[\"Service\"][\"run\"]>[1]\n\t>\n}\ninterface State {\n\treadonly bytes: Channel\n\treadonly options: Options\n\treadonly limits: Record<Priority, number>\n\treadonly workers: FailureGroup.FailureGroup<TransportError>\n\treadonly incoming: TxRef.TxRef<\n\t\tHashMap.HashMap<RequestKey, RequestState<RpcMessage.FromClientEncoded>>\n\t>\n\treadonly outgoing: TxRef.TxRef<\n\t\tHashMap.HashMap<RequestKey, RequestState<RpcMessage.FromServerEncoded>>\n\t>\n\treadonly queues: Record<Priority, TxQueue.TxQueue<Pending, Cause.Done>>\n\treadonly servers: HashMap.HashMap<string, ServerEndpoint>\n\treadonly clients: HashMap.HashMap<string, ClientEndpoint>\n}\nconst initialize = Effect.fnUntraced(function* (\n\tbytes: Channel,\n\toptions: Options,\n): Effect.fn.Return<State, never, Scope.Scope> {\n\tconst limits = { ...defaults, ...options.limits }\n\tconst workers = yield* FailureGroup.make<TransportError>()\n\tconst incoming = yield* TxRef.make(\n\t\tHashMap.empty<RequestKey, RequestState<RpcMessage.FromClientEncoded>>(),\n\t)\n\tconst outgoing = yield* TxRef.make(\n\t\tHashMap.empty<RequestKey, RequestState<RpcMessage.FromServerEncoded>>(),\n\t)\n\tconst queues = {\n\t\tcontrol: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t\tdata: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t\tlog: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t}\n\tconst servers = yield* Effect.forEach(\n\t\tRecord.toEntries(options.serve),\n\t\tEffect.fnUntraced(function* ([name, group]) {\n\t\t\treturn [\n\t\t\t\tname,\n\t\t\t\t{\n\t\t\t\t\tgroup,\n\t\t\t\t\tready:\n\t\t\t\t\t\tyield* Deferred.make<\n\t\t\t\t\t\t\tParameters<RpcServer.Protocol[\"Service\"][\"run\"]>[0]\n\t\t\t\t\t\t>(),\n\t\t\t\t\tdisconnects: yield* Queue.dropping<number>(1),\n\t\t\t\t},\n\t\t\t] satisfies readonly [string, unknown]\n\t\t}),\n\t).pipe(Effect.map(HashMap.fromIterable))\n\tconst clients = yield* Effect.forEach(\n\t\tRecord.toEntries(options.call),\n\t\tEffect.fnUntraced(function* ([name, group]) {\n\t\t\treturn [\n\t\t\t\tname,\n\t\t\t\t{\n\t\t\t\t\tgroup,\n\t\t\t\t\tready:\n\t\t\t\t\t\tyield* Deferred.make<\n\t\t\t\t\t\t\tParameters<RpcClient.Protocol[\"Service\"][\"run\"]>[1]\n\t\t\t\t\t\t>(),\n\t\t\t\t},\n\t\t\t] satisfies readonly [string, unknown]\n\t\t}),\n\t).pipe(Effect.map(HashMap.fromIterable))\n\treturn {\n\t\tbytes,\n\t\toptions,\n\t\tlimits,\n\t\tworkers,\n\t\tincoming,\n\t\toutgoing,\n\t\tqueues,\n\t\tservers,\n\t\tclients,\n\t}\n})\n\nconst admit = Effect.fnUntraced(function* <A>(\n\tstate: State,\n\ttable: TxRef.TxRef<HashMap.HashMap<RequestKey, RequestState<A>>>,\n\tkey: RequestKey,\n\trequestState: RequestState<A>,\n\tdirection: \"incoming\" | \"outgoing\",\n) {\n\tyield* Effect.tx(\n\t\tEffect.gen(function* () {\n\t\t\tyield* state.workers.check\n\t\t\tconst current = yield* TxRef.get(table)\n\t\t\tconst count = Array.filter(\n\t\t\t\tArray.fromIterable(HashMap.values(current)),\n\t\t\t\t(entry) => entry.priority === requestState.priority,\n\t\t\t).length\n\t\t\tif (count >= state.limits[requestState.priority]) {\n\t\t\t\tif (direction === \"outgoing\") return yield* Effect.txRetry\n\t\t\t\treturn yield* error(\n\t\t\t\t\t`RPC admission limit exceeded for ${requestState.priority}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tyield* TxRef.set(table, HashMap.set(current, key, requestState))\n\t\t}),\n\t)\n})\nconst remove = Effect.fnUntraced(function* <A>(\n\ttable: TxRef.TxRef<HashMap.HashMap<RequestKey, RequestState<A>>>,\n\tkey: RequestKey,\n\trequestState: RequestState<A>,\n) {\n\tyield* TxRef.update(table, HashMap.remove(key))\n\tyield* Queue.end(requestState.queue)\n})\nconst enqueue = (\n\tstate: State,\n\tframe: Frame,\n\trequest: Option.Option<RequestKey> = Option.none(),\n) =>\n\tEffect.tx(\n\t\tstate.workers.check.pipe(\n\t\t\tEffect.andThen(\n\t\t\t\tTxQueue.offer(state.queues[frame.priority], { frame, request }).pipe(\n\t\t\t\t\tEffect.flatMap((accepted) =>\n\t\t\t\t\t\taccepted ? Effect.void : error(\"Remote output has ended\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t\tEffect.asVoid,\n\t\t),\n\t)\nconst frame = (\n\tstate: State,\n\tendpoint: string,\n\tdirection: Frame[\"direction\"],\n\tp: Priority,\n\tmessage: unknown,\n): Frame => ({\n\tsession: state.options.session,\n\tendpoint,\n\tdirection,\n\tpriority: p,\n\tmessage,\n})\n// Protocol sends are owned too: interrupting a caller cancels admission or enqueue.\nconst send = Effect.fnUntraced(function* (\n\tstate: State,\n\teffect: Effect.Effect<void, TransportError>,\n) {\n\tconst fiber = yield* state.workers.run(\n\t\tstate.workers.check.pipe(Effect.andThen(effect)),\n\t)\n\tconst result = yield* Fiber.await(fiber).pipe(\n\t\tEffect.onInterrupt(() => Fiber.interrupt(fiber)),\n\t)\n\t// Group teardown interrupts this worker; callers still receive the connection cause.\n\tyield* state.workers.check\n\tyield* result\n})\nconst cancel = Effect.fnUntraced(function* (state: State, key: RequestKey) {\n\tconst canceled = yield* Effect.tx(\n\t\tEffect.gen(function* () {\n\t\t\tconst table = yield* TxRef.get(state.outgoing)\n\t\t\tconst requestState = HashMap.get(table, key)\n\t\t\tif (Option.isNone(requestState))\n\t\t\t\treturn Option.none<RequestState<RpcMessage.FromServerEncoded>>()\n\t\t\tif (requestState.value.sent) {\n\t\t\t\tyield* enqueue(\n\t\t\t\t\tstate,\n\t\t\t\t\tframe(state, key.endpoint, \"request\", \"control\", {\n\t\t\t\t\t\t_tag: \"Interrupt\",\n\t\t\t\t\t\trequestId: key.id,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\treturn Option.none<RequestState<RpcMessage.FromServerEncoded>>()\n\t\t\t}\n\t\t\tyield* TxRef.set(state.outgoing, HashMap.remove(table, key))\n\t\t\treturn requestState\n\t\t}),\n\t)\n\tif (Option.isSome(canceled)) yield* Queue.end(canceled.value.queue)\n})\nconst clientProtocol = (\n\tstate: State,\n\tendpoint: string,\n): RpcClient.Protocol[\"Service\"] => {\n\t// Accessors accept endpoints declared when the port was created.\n\tconst client = Option.getOrThrow(HashMap.get(state.clients, endpoint))\n\treturn RpcClient.Protocol.of({\n\t\tcodecFor: RpcSerialization.json.codecFor,\n\t\tsupportsAck: true,\n\t\tsupportsTransferables: false,\n\t\trun: (_id, receive) =>\n\t\t\tDeferred.succeed(client.ready, receive).pipe(\n\t\t\t\tEffect.andThen(state.workers.await),\n\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\treceive({ _tag: \"ClientProtocolError\", error: rpcError(cause) }),\n\t\t\t\t),\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\tsend: (_id, message) =>\n\t\t\tsend(\n\t\t\t\tstate,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tif (message._tag === \"Request\") {\n\t\t\t\t\t\tif (message.discard === true || message.isNotification === true)\n\t\t\t\t\t\t\treturn yield* error(\n\t\t\t\t\t\t\t\t\"Discard and notification requests are not supported\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\tconst key = new RequestKey({ endpoint, id: message.id })\n\t\t\t\t\t\tconst requestState = yield* mailbox<RpcMessage.FromServerEncoded>(\n\t\t\t\t\t\t\tpriority(client.group, message.tag),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tyield* admit(state, state.outgoing, key, requestState, \"outgoing\")\n\t\t\t\t\t\tyield* state.workers.run(\n\t\t\t\t\t\t\tStream.fromQueue(requestState.queue).pipe(\n\t\t\t\t\t\t\t\tStream.runForEach(\n\t\t\t\t\t\t\t\t\tEffect.fnUntraced(function* (response) {\n\t\t\t\t\t\t\t\t\t\tconst receive = yield* Deferred.await(client.ready)\n\t\t\t\t\t\t\t\t\t\tif (response._tag === \"Exit\")\n\t\t\t\t\t\t\t\t\t\t\tyield* remove(state.outgoing, key, requestState)\n\t\t\t\t\t\t\t\t\t\tyield* receive(response)\n\t\t\t\t\t\t\t\t\t}),\n\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\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"request\", requestState.priority, message),\n\t\t\t\t\t\t\tOption.some(key),\n\t\t\t\t\t\t)\n\t\t\t\t\t} else if (message._tag === \"Interrupt\") {\n\t\t\t\t\t\tyield* cancel(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tnew RequestKey({ endpoint, id: message.requestId }),\n\t\t\t\t\t\t)\n\t\t\t\t\t} else if (message._tag === \"Ack\") {\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"request\", \"control\", message),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t).pipe(Effect.mapError((failure) => rpcError(Cause.fail(failure)))),\n\t})\n}\nconst serverProtocol = (\n\tstate: State,\n\tendpoint: string,\n): RpcServer.Protocol[\"Service\"] => {\n\t// Accessors accept endpoints declared when the port was created.\n\tconst server = Option.getOrThrow(HashMap.get(state.servers, endpoint))\n\treturn RpcServer.Protocol.of({\n\t\tcodecFor: RpcSerialization.json.codecFor,\n\t\tsupportsAck: true,\n\t\tsupportsTransferables: false,\n\t\tsupportsSpanPropagation: false,\n\t\tsupportsNotifications: false,\n\t\tclientIds: Effect.succeed(new Set([0])),\n\t\tinitialMessage: Effect.succeedNone,\n\t\tdisconnects: server.disconnects,\n\t\tend: () => Effect.void,\n\t\trun: (receive) =>\n\t\t\tDeferred.succeed(server.ready, receive).pipe(\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\tsend: (_id, message) =>\n\t\t\tsend(\n\t\t\t\tstate,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tif (message._tag === \"Chunk\" || message._tag === \"Exit\") {\n\t\t\t\t\t\tconst key = new RequestKey({ endpoint, id: message.requestId })\n\t\t\t\t\t\tconst requestState = yield* TxRef.get(state.incoming).pipe(\n\t\t\t\t\t\t\tEffect.map(HashMap.get(key)),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (Option.isNone(requestState)) return\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(\n\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\tendpoint,\n\t\t\t\t\t\t\t\t\"response\",\n\t\t\t\t\t\t\t\tmessage._tag === \"Exit\"\n\t\t\t\t\t\t\t\t\t? \"control\"\n\t\t\t\t\t\t\t\t\t: requestState.value.priority,\n\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (message._tag === \"Exit\")\n\t\t\t\t\t\t\tyield* remove(state.incoming, key, requestState.value)\n\t\t\t\t\t} else\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"response\", \"control\", message),\n\t\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t).pipe(\n\t\t\t\t// Disconnect already carries this cause to the server; late sends need no second failure.\n\t\t\t\tEffect.catchTag(\"TransportError\", () => Effect.void),\n\t\t\t),\n\t})\n}\nconst next = Effect.fnUntraced(function* (state: State) {\n\tyield* state.workers.check\n\tfor (const p of [\n\t\t\"control\",\n\t\t\"data\",\n\t\t\"log\",\n\t] satisfies ReadonlyArray<Priority>) {\n\t\tconst pending = yield* TxQueue.poll(state.queues[p])\n\t\tif (Option.isNone(pending)) continue\n\t\tconst { frame, request } = pending.value\n\t\tif (Option.isSome(request)) {\n\t\t\tconst table = yield* TxRef.get(state.outgoing)\n\t\t\tconst requestState = HashMap.get(table, request.value)\n\t\t\tif (Option.isNone(requestState)) return Option.none<Frame>()\n\t\t\tyield* TxRef.set(\n\t\t\t\tstate.outgoing,\n\t\t\t\tHashMap.set(table, request.value, {\n\t\t\t\t\t...requestState.value,\n\t\t\t\t\tsent: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn Option.some(frame)\n\t}\n\tif (\n\t\t(yield* TxQueue.isDone(state.queues.control)) &&\n\t\t(yield* TxQueue.isDone(state.queues.data)) &&\n\t\t(yield* TxQueue.isDone(state.queues.log))\n\t)\n\t\treturn yield* Cause.done()\n\treturn yield* Effect.txRetry\n}, Effect.tx)\nconst writer = (state: State) =>\n\tStream.fromEffectRepeat(next(state)).pipe(\n\t\tStream.filterMap(Result.fromOption(() => undefined)),\n\t\tStream.mapEffect((frame) =>\n\t\t\tSchema.encodeEffect(Schema.fromJsonString(Frame))(frame).pipe(\n\t\t\t\tEffect.mapError((cause) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tStream.map((json) => new TextEncoder().encode(json + \"\\n\")),\n\t\tStream.run(state.bytes.output),\n\t)\nconst read = Effect.fnUntraced(function* (state: State, raw: unknown) {\n\tconst current = yield* Schema.decodeUnknownEffect(Frame)(raw).pipe(\n\t\tEffect.mapError((cause) =>\n\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t),\n\t)\n\tif (current.session !== state.options.session) return\n\tif (current.direction === \"request\") {\n\t\tconst server = HashMap.get(state.servers, current.endpoint)\n\t\tif (Option.isNone(server))\n\t\t\treturn yield* error(`Unknown RPC server endpoint: ${current.endpoint}`)\n\t\tconst message = yield* Schema.decodeUnknownEffect(Request)(\n\t\t\tcurrent.message,\n\t\t).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t),\n\t\t)\n\t\tif (message._tag === \"Eof\")\n\t\t\treturn yield* TransportError.make({\n\t\t\t\tcause: Cause.fail(EndOfStream.make({})),\n\t\t\t})\n\t\tconst key = new RequestKey({\n\t\t\tendpoint: current.endpoint,\n\t\t\tid: message._tag === \"Request\" ? message.id : message.requestId,\n\t\t})\n\t\tif (message._tag === \"Request\") {\n\t\t\tconst p = priority(server.value.group, message.tag)\n\t\t\tconst requestState = yield* mailbox<RpcMessage.FromClientEncoded>(p)\n\t\t\tyield* admit(state, state.incoming, key, requestState, \"incoming\")\n\t\t\tyield* state.workers.run(\n\t\t\t\tStream.fromQueue(requestState.queue).pipe(\n\t\t\t\t\tStream.runForEach(\n\t\t\t\t\t\tEffect.fnUntraced(function* (request) {\n\t\t\t\t\t\t\tconst receive = yield* Deferred.await(server.value.ready)\n\t\t\t\t\t\t\tyield* receive(0, request)\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\tyield* deliver(requestState, message)\n\t\t} else {\n\t\t\tconst requestState = yield* TxRef.get(state.incoming).pipe(\n\t\t\t\tEffect.map(HashMap.get(key)),\n\t\t\t)\n\t\t\tif (Option.isSome(requestState))\n\t\t\t\tyield* deliver(requestState.value, message)\n\t\t}\n\t} else {\n\t\tconst message = yield* Schema.decodeUnknownEffect(Response)(\n\t\t\tcurrent.message,\n\t\t).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t),\n\t\t)\n\t\tif (message._tag === \"Defect\")\n\t\t\treturn yield* TransportError.make({ cause: Cause.die(message.defect) })\n\t\tconst key = new RequestKey({\n\t\t\tendpoint: current.endpoint,\n\t\t\tid: message.requestId,\n\t\t})\n\t\tconst requestState = yield* TxRef.get(state.outgoing).pipe(\n\t\t\tEffect.map(HashMap.get(key)),\n\t\t)\n\t\tif (Option.isSome(requestState)) yield* deliver(requestState.value, message)\n\t}\n})\nconst reader = (state: State) =>\n\tstate.bytes.input.pipe(\n\t\tStream.decodeText(),\n\t\tStream.splitLines,\n\t\tStream.filter((line) => line.length > 0),\n\t\tStream.mapEffect((line) =>\n\t\t\tSchema.decodeEffect(Schema.fromJsonString(Schema.Unknown))(line).pipe(\n\t\t\t\tEffect.mapError((cause) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tStream.runForEach((raw) => read(state, raw)),\n\t\tEffect.andThen(\n\t\t\tEffect.fail(\n\t\t\t\tTransportError.make({ cause: Cause.fail(EndOfStream.make({})) }),\n\t\t\t),\n\t\t),\n\t)\n\n/** One RPC client/server per declared endpoint; servers may start after the port. */\nexport const make = Effect.fnUntraced(function* (\n\tbytes: Channel,\n\toptions: Options,\n): Effect.fn.Return<Port, never, import(\"effect\").Scope.Scope> {\n\tconst state = yield* initialize(bytes, options)\n\t// The same failure remains observable through Port.await and client requests.\n\t// This observer only publishes disconnects, even while the owner closes its scope.\n\tyield* state.workers.await.pipe(\n\t\tEffect.catchCause(\n\t\t\tEffect.fnUntraced(function* () {\n\t\t\t\tfor (const server of HashMap.values(state.servers))\n\t\t\t\t\tyield* Queue.offer(server.disconnects, 0)\n\t\t\t\tyield* Effect.tx(\n\t\t\t\t\tTxRef.set(state.incoming, HashMap.empty()).pipe(\n\t\t\t\t\t\tEffect.andThen(TxRef.set(state.outgoing, HashMap.empty())),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}, Effect.uninterruptible),\n\t\t),\n\t\tEffect.forkScoped,\n\t)\n\tconst writing = yield* state.workers.run(writer(state))\n\tyield* state.workers.run(reader(state))\n\treturn {\n\t\tclientProtocol: (endpoint) => clientProtocol(state, endpoint),\n\t\tserverProtocol: (endpoint) => serverProtocol(state, endpoint),\n\t\tawait: state.workers.await,\n\t\tfail: state.workers.fail,\n\t\tend: Effect.tx(\n\t\t\tEffect.forEach(Record.values(state.queues), TxQueue.end, {\n\t\t\t\tdiscard: true,\n\t\t\t}),\n\t\t).pipe(Effect.andThen(Fiber.join(writing))),\n\t}\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"port.js","names":["FailureGroup.make"],"sources":["../../src/internal/port.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tContext,\n\tData,\n\tDeferred,\n\tEffect,\n\tFiber,\n\tHashMap,\n\tOption,\n\tQueue,\n\tRecord,\n\tResult,\n\tSchema,\n\tStream,\n\tTxQueue,\n\tTxRef,\n\ttype Scope,\n} from \"effect\"\nimport {\n\tRpcClient,\n\tRpcClientError,\n\tRpcSerialization,\n\tRpcServer,\n\ttype Rpc,\n\ttype RpcGroup,\n\ttype RpcMessage,\n} from \"effect/rpc\"\n\nimport { TransportError } from \"../Errors\"\nimport type { Channel } from \"../Transport\"\nimport * as FailureGroup from \"./FailureGroup\"\nimport { defaults, type Limits } from \"./Limits\"\nimport { EndOfStream } from \"./runner/Framing\"\n\nexport type { Channel } from \"../Transport\"\n\nexport type Priority = keyof Limits\n\nexport const Priority = Context.Reference<Priority>(\n\t\"@graftland/plugin-remote/internal/port/Priority\",\n\t{ defaultValue: () => \"data\" },\n)\ntype Endpoint = Pick<RpcGroup.RpcGroup<Rpc.Any>, \"requests\">\n\nexport interface Options {\n\treadonly session: string\n\treadonly serve: Readonly<Record<string, Endpoint>>\n\treadonly call: Readonly<Record<string, Endpoint>>\n\t/** Limits are shared across endpoints, separately for each direction.\n\t * Each peer's inbound limits must accommodate the other's outbound limits. */\n\treadonly limits?: Partial<Record<Priority, number>>\n}\nexport interface Port {\n\treadonly clientProtocol: (endpoint: string) => RpcClient.Protocol[\"Service\"]\n\treadonly serverProtocol: (endpoint: string) => RpcServer.Protocol[\"Service\"]\n\treadonly await: Effect.Effect<never, TransportError>\n\treadonly fail: (error: TransportError) => Effect.Effect<void>\n\treadonly end: Effect.Effect<void, TransportError>\n}\nclass RequestKey extends Data.Class<{\n\treadonly endpoint: string\n\treadonly id: string | number\n}> {}\ninterface RequestState<A> {\n\treadonly queue: Queue.Queue<A, Cause.Done>\n\treadonly priority: Priority\n\treadonly sent: boolean\n}\nconst Frame = Schema.Struct({\n\tsession: Schema.String,\n\tendpoint: Schema.String,\n\tdirection: Schema.Literals([\"request\", \"response\"]),\n\tpriority: Schema.Literals([\"control\", \"data\", \"log\"]),\n\tmessage: Schema.Unknown,\n})\ntype Frame = typeof Frame.Type\ninterface Pending {\n\treadonly frame: Frame\n\treadonly request: Option.Option<RequestKey>\n}\nconst Id = Schema.Union([Schema.String, Schema.Finite])\n// Only routing fields belong to this transport. The RPC serialization codec\n// validates payloads, chunks and exits before handlers or callers see them. These\n// protocol callbacks are an opaque handoff, not validation of a complete RpcMessage.\n// EncodedSchema requires binary payloads\n// in Effect 4.1.2 and cannot describe these JSON codec messages.\nconst isRequest = Schema.is(\n\tSchema.Union([\n\t\tSchema.TaggedStruct(\"Request\", { id: Id, tag: Schema.String }),\n\t\tSchema.TaggedStruct(\"Ack\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Interrupt\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Eof\", {}),\n\t]),\n)\nconst isResponse = Schema.is(\n\tSchema.Union([\n\t\tSchema.TaggedStruct(\"Exit\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Chunk\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Defect\", { defect: Schema.Unknown }),\n\t]),\n)\nconst Request = Schema.declare<\n\tExclude<RpcMessage.FromClientEncoded, RpcMessage.Ping>\n>((input): input is Exclude<RpcMessage.FromClientEncoded, RpcMessage.Ping> =>\n\tisRequest(input),\n)\nconst Response = Schema.declare<\n\tExclude<\n\t\tRpcMessage.FromServerEncoded,\n\t\tRpcMessage.Pong | RpcMessage.ClientProtocolError | RpcMessage.RequestEncoded\n\t>\n>(\n\t(\n\t\tinput,\n\t): input is Exclude<\n\t\tRpcMessage.FromServerEncoded,\n\t\tRpcMessage.Pong | RpcMessage.ClientProtocolError | RpcMessage.RequestEncoded\n\t> => isResponse(input),\n)\nconst error = (message: string) =>\n\tTransportError.make({ cause: Cause.die(new Error(message)) })\nconst rpcError = (cause: Cause.Cause<TransportError>) =>\n\tRpcClientError.RpcClientError.make({\n\t\treason: RpcClientError.RpcClientDefect.make({\n\t\t\tmessage: \"Remote connection failed\",\n\t\t\tcause,\n\t\t}),\n\t})\nconst priority = (group: Endpoint, tag: string): Priority => {\n\tconst rpc = group.requests.get(tag)\n\treturn rpc === undefined ? \"data\" : Context.get(rpc.annotations, Priority)\n}\nconst mailbox = <A>(priority: Priority) =>\n\tQueue.dropping<A, Cause.Done>(2).pipe(\n\t\tEffect.map((queue): RequestState<A> => ({ queue, priority, sent: false })),\n\t)\nconst deliver = Effect.fnUntraced(function* <A>(\n\trequestState: RequestState<A>,\n\tmessage: A,\n) {\n\t// One unacknowledged chunk and its terminal Exit may coexist.\n\tif (!(yield* Queue.offer(requestState.queue, message)))\n\t\treturn yield* error(\"RPC request mailbox overflow\")\n})\n\ntype ServerEndpoint = {\n\treadonly group: Endpoint\n\treadonly ready: Deferred.Deferred<\n\t\tParameters<RpcServer.Protocol[\"Service\"][\"run\"]>[0]\n\t>\n\treadonly disconnects: Queue.Queue<number>\n}\ntype ClientEndpoint = {\n\treadonly group: Endpoint\n\treadonly ready: Deferred.Deferred<\n\t\tParameters<RpcClient.Protocol[\"Service\"][\"run\"]>[1]\n\t>\n}\ninterface State {\n\treadonly bytes: Channel\n\treadonly options: Options\n\treadonly limits: Record<Priority, number>\n\treadonly workers: FailureGroup.FailureGroup<TransportError>\n\treadonly incoming: TxRef.TxRef<\n\t\tHashMap.HashMap<RequestKey, RequestState<RpcMessage.FromClientEncoded>>\n\t>\n\treadonly outgoing: TxRef.TxRef<\n\t\tHashMap.HashMap<RequestKey, RequestState<RpcMessage.FromServerEncoded>>\n\t>\n\treadonly queues: Record<Priority, TxQueue.TxQueue<Pending, Cause.Done>>\n\treadonly servers: HashMap.HashMap<string, ServerEndpoint>\n\treadonly clients: HashMap.HashMap<string, ClientEndpoint>\n}\nconst initialize = Effect.fnUntraced(function* (\n\tbytes: Channel,\n\toptions: Options,\n): Effect.fn.Return<State, never, Scope.Scope> {\n\tconst limits = { ...defaults, ...options.limits }\n\tconst workers = yield* FailureGroup.make<TransportError>()\n\tconst incoming = yield* TxRef.make(\n\t\tHashMap.empty<RequestKey, RequestState<RpcMessage.FromClientEncoded>>(),\n\t)\n\tconst outgoing = yield* TxRef.make(\n\t\tHashMap.empty<RequestKey, RequestState<RpcMessage.FromServerEncoded>>(),\n\t)\n\tconst queues = {\n\t\tcontrol: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t\tdata: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t\tlog: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t}\n\tconst servers = yield* Effect.forEach(\n\t\tRecord.toEntries(options.serve),\n\t\tEffect.fnUntraced(function* ([name, group]) {\n\t\t\treturn [\n\t\t\t\tname,\n\t\t\t\t{\n\t\t\t\t\tgroup,\n\t\t\t\t\tready:\n\t\t\t\t\t\tyield* Deferred.make<\n\t\t\t\t\t\t\tParameters<RpcServer.Protocol[\"Service\"][\"run\"]>[0]\n\t\t\t\t\t\t>(),\n\t\t\t\t\tdisconnects: yield* Queue.dropping<number>(1),\n\t\t\t\t},\n\t\t\t] satisfies readonly [string, unknown]\n\t\t}),\n\t).pipe(Effect.map(HashMap.fromIterable))\n\tconst clients = yield* Effect.forEach(\n\t\tRecord.toEntries(options.call),\n\t\tEffect.fnUntraced(function* ([name, group]) {\n\t\t\treturn [\n\t\t\t\tname,\n\t\t\t\t{\n\t\t\t\t\tgroup,\n\t\t\t\t\tready:\n\t\t\t\t\t\tyield* Deferred.make<\n\t\t\t\t\t\t\tParameters<RpcClient.Protocol[\"Service\"][\"run\"]>[1]\n\t\t\t\t\t\t>(),\n\t\t\t\t},\n\t\t\t] satisfies readonly [string, unknown]\n\t\t}),\n\t).pipe(Effect.map(HashMap.fromIterable))\n\treturn {\n\t\tbytes,\n\t\toptions,\n\t\tlimits,\n\t\tworkers,\n\t\tincoming,\n\t\toutgoing,\n\t\tqueues,\n\t\tservers,\n\t\tclients,\n\t}\n})\n\nconst admit = Effect.fnUntraced(function* <A>(\n\tstate: State,\n\ttable: TxRef.TxRef<HashMap.HashMap<RequestKey, RequestState<A>>>,\n\tkey: RequestKey,\n\trequestState: RequestState<A>,\n\tdirection: \"incoming\" | \"outgoing\",\n) {\n\tyield* Effect.tx(\n\t\tEffect.gen(function* () {\n\t\t\tyield* state.workers.check\n\t\t\tconst current = yield* TxRef.get(table)\n\t\t\tconst count = Array.filter(\n\t\t\t\tArray.fromIterable(HashMap.values(current)),\n\t\t\t\t(entry) => entry.priority === requestState.priority,\n\t\t\t).length\n\t\t\tif (count >= state.limits[requestState.priority]) {\n\t\t\t\tif (direction === \"outgoing\") return yield* Effect.txRetry\n\t\t\t\treturn yield* error(\n\t\t\t\t\t`RPC admission limit exceeded for ${requestState.priority}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tyield* TxRef.set(table, HashMap.set(current, key, requestState))\n\t\t}),\n\t)\n})\nconst remove = Effect.fnUntraced(function* <A>(\n\ttable: TxRef.TxRef<HashMap.HashMap<RequestKey, RequestState<A>>>,\n\tkey: RequestKey,\n\trequestState: RequestState<A>,\n) {\n\tyield* TxRef.update(table, HashMap.remove(key))\n\tyield* Queue.end(requestState.queue)\n})\nconst enqueue = (\n\tstate: State,\n\tframe: Frame,\n\trequest: Option.Option<RequestKey> = Option.none(),\n) =>\n\tEffect.tx(\n\t\tstate.workers.check.pipe(\n\t\t\tEffect.andThen(\n\t\t\t\tTxQueue.offer(state.queues[frame.priority], { frame, request }).pipe(\n\t\t\t\t\tEffect.flatMap((accepted) =>\n\t\t\t\t\t\taccepted ? Effect.void : error(\"Remote output has ended\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t\tEffect.asVoid,\n\t\t),\n\t)\nconst frame = (\n\tstate: State,\n\tendpoint: string,\n\tdirection: Frame[\"direction\"],\n\tp: Priority,\n\tmessage: unknown,\n): Frame => ({\n\tsession: state.options.session,\n\tendpoint,\n\tdirection,\n\tpriority: p,\n\tmessage,\n})\n// Protocol sends are owned too: interrupting a caller cancels admission or enqueue.\nconst send = Effect.fnUntraced(function* (\n\tstate: State,\n\teffect: Effect.Effect<void, TransportError>,\n) {\n\tconst fiber = yield* state.workers.run(\n\t\tstate.workers.check.pipe(Effect.andThen(effect)),\n\t)\n\tconst result = yield* Fiber.await(fiber).pipe(\n\t\tEffect.onInterrupt(() => Fiber.interrupt(fiber)),\n\t)\n\t// Group teardown interrupts this worker; callers still receive the connection cause.\n\tyield* state.workers.check\n\tyield* result\n})\nconst cancel = Effect.fnUntraced(function* (state: State, key: RequestKey) {\n\tconst canceled = yield* Effect.tx(\n\t\tEffect.gen(function* () {\n\t\t\tconst table = yield* TxRef.get(state.outgoing)\n\t\t\tconst requestState = HashMap.get(table, key)\n\t\t\tif (Option.isNone(requestState))\n\t\t\t\treturn Option.none<RequestState<RpcMessage.FromServerEncoded>>()\n\t\t\tif (requestState.value.sent) {\n\t\t\t\tyield* enqueue(\n\t\t\t\t\tstate,\n\t\t\t\t\tframe(state, key.endpoint, \"request\", \"control\", {\n\t\t\t\t\t\t_tag: \"Interrupt\",\n\t\t\t\t\t\trequestId: key.id,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\treturn Option.none<RequestState<RpcMessage.FromServerEncoded>>()\n\t\t\t}\n\t\t\tyield* TxRef.set(state.outgoing, HashMap.remove(table, key))\n\t\t\treturn requestState\n\t\t}),\n\t)\n\tif (Option.isSome(canceled)) yield* Queue.end(canceled.value.queue)\n})\nconst clientProtocol = (\n\tstate: State,\n\tendpoint: string,\n): RpcClient.Protocol[\"Service\"] => {\n\t// Accessors accept endpoints declared when the port was created.\n\tconst client = Option.getOrThrow(HashMap.get(state.clients, endpoint))\n\treturn RpcClient.Protocol.of({\n\t\tcodecFor: RpcSerialization.json.codecFor,\n\t\tsupportsAck: true,\n\t\tsupportsTransferables: false,\n\t\trun: (_id, receive) =>\n\t\t\tDeferred.succeed(client.ready, receive).pipe(\n\t\t\t\tEffect.andThen(state.workers.await),\n\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\treceive({ _tag: \"ClientProtocolError\", error: rpcError(cause) }),\n\t\t\t\t),\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\tsend: (_id, message) =>\n\t\t\tsend(\n\t\t\t\tstate,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tif (message._tag === \"Request\") {\n\t\t\t\t\t\tif (message.discard === true || message.isNotification === true)\n\t\t\t\t\t\t\treturn yield* error(\n\t\t\t\t\t\t\t\t\"Discard and notification requests are not supported\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\tconst key = new RequestKey({ endpoint, id: message.id })\n\t\t\t\t\t\tconst requestState = yield* mailbox<RpcMessage.FromServerEncoded>(\n\t\t\t\t\t\t\tpriority(client.group, message.tag),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tyield* admit(state, state.outgoing, key, requestState, \"outgoing\")\n\t\t\t\t\t\tyield* state.workers.run(\n\t\t\t\t\t\t\tStream.fromQueue(requestState.queue).pipe(\n\t\t\t\t\t\t\t\tStream.runForEach(\n\t\t\t\t\t\t\t\t\tEffect.fnUntraced(function* (response) {\n\t\t\t\t\t\t\t\t\t\tconst receive = yield* Deferred.await(client.ready)\n\t\t\t\t\t\t\t\t\t\tif (response._tag === \"Exit\")\n\t\t\t\t\t\t\t\t\t\t\tyield* remove(state.outgoing, key, requestState)\n\t\t\t\t\t\t\t\t\t\tyield* receive(response)\n\t\t\t\t\t\t\t\t\t}),\n\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\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"request\", requestState.priority, message),\n\t\t\t\t\t\t\tOption.some(key),\n\t\t\t\t\t\t)\n\t\t\t\t\t} else if (message._tag === \"Interrupt\") {\n\t\t\t\t\t\tyield* cancel(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tnew RequestKey({ endpoint, id: message.requestId }),\n\t\t\t\t\t\t)\n\t\t\t\t\t} else if (message._tag === \"Ack\") {\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"request\", \"control\", message),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t).pipe(Effect.mapError((failure) => rpcError(Cause.fail(failure)))),\n\t})\n}\nconst serverProtocol = (\n\tstate: State,\n\tendpoint: string,\n): RpcServer.Protocol[\"Service\"] => {\n\t// Accessors accept endpoints declared when the port was created.\n\tconst server = Option.getOrThrow(HashMap.get(state.servers, endpoint))\n\treturn RpcServer.Protocol.of({\n\t\tcodecFor: RpcSerialization.json.codecFor,\n\t\tsupportsAck: true,\n\t\tsupportsTransferables: false,\n\t\tsupportsSpanPropagation: false,\n\t\tsupportsNotifications: false,\n\t\tclientIds: Effect.succeed(new Set([0])),\n\t\tinitialMessage: Effect.succeedNone,\n\t\tdisconnects: server.disconnects,\n\t\tend: () => Effect.void,\n\t\trun: (receive) =>\n\t\t\tDeferred.succeed(server.ready, receive).pipe(\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\tsend: (_id, message) =>\n\t\t\tsend(\n\t\t\t\tstate,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tif (message._tag === \"Chunk\" || message._tag === \"Exit\") {\n\t\t\t\t\t\tconst key = new RequestKey({ endpoint, id: message.requestId })\n\t\t\t\t\t\tconst requestState = yield* TxRef.get(state.incoming).pipe(\n\t\t\t\t\t\t\tEffect.map(HashMap.get(key)),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (Option.isNone(requestState)) return\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(\n\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\tendpoint,\n\t\t\t\t\t\t\t\t\"response\",\n\t\t\t\t\t\t\t\tmessage._tag === \"Exit\"\n\t\t\t\t\t\t\t\t\t? \"control\"\n\t\t\t\t\t\t\t\t\t: requestState.value.priority,\n\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (message._tag === \"Exit\")\n\t\t\t\t\t\t\tyield* remove(state.incoming, key, requestState.value)\n\t\t\t\t\t} else\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"response\", \"control\", message),\n\t\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t).pipe(\n\t\t\t\t// Disconnect already carries this cause to the server; late sends need no second failure.\n\t\t\t\tEffect.catchTag(\"TransportError\", () => Effect.void),\n\t\t\t),\n\t})\n}\nconst next = Effect.fnUntraced(function* (state: State) {\n\tyield* state.workers.check\n\tfor (const p of [\n\t\t\"control\",\n\t\t\"data\",\n\t\t\"log\",\n\t] satisfies ReadonlyArray<Priority>) {\n\t\tconst pending = yield* TxQueue.poll(state.queues[p])\n\t\tif (Option.isNone(pending)) continue\n\t\tconst { frame, request } = pending.value\n\t\tif (Option.isSome(request)) {\n\t\t\tconst table = yield* TxRef.get(state.outgoing)\n\t\t\tconst requestState = HashMap.get(table, request.value)\n\t\t\tif (Option.isNone(requestState)) return Option.none<Frame>()\n\t\t\tyield* TxRef.set(\n\t\t\t\tstate.outgoing,\n\t\t\t\tHashMap.set(table, request.value, {\n\t\t\t\t\t...requestState.value,\n\t\t\t\t\tsent: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn Option.some(frame)\n\t}\n\tif (\n\t\t(yield* TxQueue.isDone(state.queues.control)) &&\n\t\t(yield* TxQueue.isDone(state.queues.data)) &&\n\t\t(yield* TxQueue.isDone(state.queues.log))\n\t)\n\t\treturn yield* Cause.done()\n\treturn yield* Effect.txRetry\n}, Effect.tx)\nconst writer = (state: State) =>\n\tStream.fromEffectRepeat(next(state)).pipe(\n\t\tStream.filterMap(Result.fromOption(() => undefined)),\n\t\tStream.mapEffect((frame) =>\n\t\t\tSchema.encodeEffect(Schema.fromJsonString(Frame))(frame).pipe(\n\t\t\t\tEffect.mapError((cause) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tStream.map((json) => new TextEncoder().encode(json + \"\\n\")),\n\t\tStream.run(state.bytes.output),\n\t)\nconst read = Effect.fnUntraced(function* (state: State, raw: unknown) {\n\tconst current = yield* Schema.decodeUnknownEffect(Frame)(raw).pipe(\n\t\tEffect.mapError((cause) =>\n\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t),\n\t)\n\tif (current.session !== state.options.session) return\n\tif (current.direction === \"request\") {\n\t\tconst server = HashMap.get(state.servers, current.endpoint)\n\t\tif (Option.isNone(server))\n\t\t\treturn yield* error(`Unknown RPC server endpoint: ${current.endpoint}`)\n\t\tconst message = yield* Schema.decodeUnknownEffect(Request)(\n\t\t\tcurrent.message,\n\t\t).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t),\n\t\t)\n\t\tif (message._tag === \"Eof\")\n\t\t\treturn yield* TransportError.make({\n\t\t\t\tcause: Cause.fail(EndOfStream.make({})),\n\t\t\t})\n\t\tconst key = new RequestKey({\n\t\t\tendpoint: current.endpoint,\n\t\t\tid: message._tag === \"Request\" ? message.id : message.requestId,\n\t\t})\n\t\tif (message._tag === \"Request\") {\n\t\t\tconst p = priority(server.value.group, message.tag)\n\t\t\tconst requestState = yield* mailbox<RpcMessage.FromClientEncoded>(p)\n\t\t\tyield* admit(state, state.incoming, key, requestState, \"incoming\")\n\t\t\tyield* state.workers.run(\n\t\t\t\tStream.fromQueue(requestState.queue).pipe(\n\t\t\t\t\tStream.runForEach(\n\t\t\t\t\t\tEffect.fnUntraced(function* (request) {\n\t\t\t\t\t\t\tconst receive = yield* Deferred.await(server.value.ready)\n\t\t\t\t\t\t\tyield* receive(0, request)\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\tyield* deliver(requestState, message)\n\t\t} else {\n\t\t\tconst requestState = yield* TxRef.get(state.incoming).pipe(\n\t\t\t\tEffect.map(HashMap.get(key)),\n\t\t\t)\n\t\t\tif (Option.isSome(requestState))\n\t\t\t\tyield* deliver(requestState.value, message)\n\t\t}\n\t} else {\n\t\tconst message = yield* Schema.decodeUnknownEffect(Response)(\n\t\t\tcurrent.message,\n\t\t).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t),\n\t\t)\n\t\tif (message._tag === \"Defect\")\n\t\t\treturn yield* TransportError.make({ cause: Cause.die(message.defect) })\n\t\tconst key = new RequestKey({\n\t\t\tendpoint: current.endpoint,\n\t\t\tid: message.requestId,\n\t\t})\n\t\tconst requestState = yield* TxRef.get(state.outgoing).pipe(\n\t\t\tEffect.map(HashMap.get(key)),\n\t\t)\n\t\tif (Option.isSome(requestState)) yield* deliver(requestState.value, message)\n\t}\n})\nconst reader = (state: State) =>\n\tstate.bytes.input.pipe(\n\t\tStream.decodeText(),\n\t\tStream.splitLines,\n\t\tStream.filter((line) => line.length > 0),\n\t\tStream.mapEffect((line) =>\n\t\t\tSchema.decodeEffect(Schema.fromJsonString(Schema.Unknown))(line).pipe(\n\t\t\t\tEffect.mapError((cause) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tStream.runForEach((raw) => read(state, raw)),\n\t\tEffect.andThen(\n\t\t\tEffect.fail(\n\t\t\t\tTransportError.make({ cause: Cause.fail(EndOfStream.make({})) }),\n\t\t\t),\n\t\t),\n\t)\n\n/** One RPC client/server per declared endpoint; servers may start after the port. */\nexport const make = Effect.fnUntraced(function* (\n\tbytes: Channel,\n\toptions: Options,\n): Effect.fn.Return<Port, never, import(\"effect\").Scope.Scope> {\n\tconst state = yield* initialize(bytes, options)\n\t// The same failure remains observable through Port.await and client requests.\n\t// This observer only publishes disconnects, even while the owner closes its scope.\n\tyield* state.workers.await.pipe(\n\t\tEffect.catchCause(\n\t\t\tEffect.fnUntraced(function* () {\n\t\t\t\tfor (const server of HashMap.values(state.servers))\n\t\t\t\t\tyield* Queue.offer(server.disconnects, 0)\n\t\t\t\tyield* Effect.tx(\n\t\t\t\t\tTxRef.set(state.incoming, HashMap.empty()).pipe(\n\t\t\t\t\t\tEffect.andThen(TxRef.set(state.outgoing, HashMap.empty())),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}, Effect.uninterruptible),\n\t\t),\n\t\tEffect.forkScoped,\n\t)\n\tconst writing = yield* state.workers.run(writer(state))\n\tyield* state.workers.run(reader(state))\n\treturn {\n\t\tclientProtocol: (endpoint) => clientProtocol(state, endpoint),\n\t\tserverProtocol: (endpoint) => serverProtocol(state, endpoint),\n\t\tawait: state.workers.await,\n\t\tfail: state.workers.fail,\n\t\tend: Effect.tx(\n\t\t\tEffect.forEach(Record.values(state.queues), TxQueue.end, {\n\t\t\t\tdiscard: true,\n\t\t\t}),\n\t\t).pipe(Effect.andThen(Fiber.join(writing))),\n\t}\n})\n"],"mappings":";;;;;;;AAuCA,MAAa,WAAW,QAAQ,UAC/B,mDACA,EAAE,oBAAoB,OAAO,CAC9B;AAkBA,IAAM,aAAN,cAAyB,KAAK,MAG3B,CAAC;AAMJ,MAAM,QAAQ,OAAO,OAAO;CAC3B,SAAS,OAAO;CAChB,UAAU,OAAO;CACjB,WAAW,OAAO,SAAS,CAAC,WAAW,UAAU,CAAC;CAClD,UAAU,OAAO,SAAS;EAAC;EAAW;EAAQ;CAAK,CAAC;CACpD,SAAS,OAAO;AACjB,CAAC;AAMD,MAAM,KAAK,OAAO,MAAM,CAAC,OAAO,QAAQ,OAAO,MAAM,CAAC;AAMtD,MAAM,YAAY,OAAO,GACxB,OAAO,MAAM;CACZ,OAAO,aAAa,WAAW;EAAE,IAAI;EAAI,KAAK,OAAO;CAAO,CAAC;CAC7D,OAAO,aAAa,OAAO,EAAE,WAAW,GAAG,CAAC;CAC5C,OAAO,aAAa,aAAa,EAAE,WAAW,GAAG,CAAC;CAClD,OAAO,aAAa,OAAO,CAAC,CAAC;AAC9B,CAAC,CACF;AACA,MAAM,aAAa,OAAO,GACzB,OAAO,MAAM;CACZ,OAAO,aAAa,QAAQ,EAAE,WAAW,GAAG,CAAC;CAC7C,OAAO,aAAa,SAAS,EAAE,WAAW,GAAG,CAAC;CAC9C,OAAO,aAAa,UAAU,EAAE,QAAQ,OAAO,QAAQ,CAAC;AACzD,CAAC,CACF;AACA,MAAM,UAAU,OAAO,SAEpB,UACF,UAAU,KAAK,CAChB;AACA,MAAM,WAAW,OAAO,SAOtB,UAII,WAAW,KAAK,CACtB;AACA,MAAM,SAAS,YACd,eAAe,KAAK,EAAE,OAAO,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC,EAAE,CAAC;AAC7D,MAAM,YAAY,UACjB,eAAe,eAAe,KAAK,EAClC,QAAQ,eAAe,gBAAgB,KAAK;CAC3C,SAAS;CACT;AACD,CAAC,EACF,CAAC;AACF,MAAM,YAAY,OAAiB,QAA0B;CAC5D,MAAM,MAAM,MAAM,SAAS,IAAI,GAAG;CAClC,OAAO,QAAQ,KAAA,IAAY,SAAS,QAAQ,IAAI,IAAI,aAAa,QAAQ;AAC1E;AACA,MAAM,WAAc,aACnB,MAAM,SAAwB,CAAC,CAAC,CAAC,KAChC,OAAO,KAAK,WAA4B;CAAE;CAAO;CAAU,MAAM;AAAM,EAAE,CAC1E;AACD,MAAM,UAAU,OAAO,WAAW,WACjC,cACA,SACC;CAED,IAAI,EAAE,OAAO,MAAM,MAAM,aAAa,OAAO,OAAO,IACnD,OAAO,OAAO,MAAM,8BAA8B;AACpD,CAAC;AA8BD,MAAM,aAAa,OAAO,WAAW,WACpC,OACA,SAC8C;CA6C9C,OAAO;EACN;EACA;EACA,QAAA;GA/CgB,GAAG;GAAU,GAAG,QAAQ;EA+CnC;EACL,SAAA,OA/CsBA,OAAkC;EAgDxD,UAAA,OA/CuB,MAAM,KAC7B,QAAQ,MAA8D,CACvE;EA8CC,UAAA,OA7CuB,MAAM,KAC7B,QAAQ,MAA8D,CACvE;EA4CC,QAAA;GA1CA,SAAS,OAAO,QAAQ,UAA+B;GACvD,MAAM,OAAO,QAAQ,UAA+B;GACpD,KAAK,OAAO,QAAQ,UAA+B;EAwC9C;EACL,SAAA,OAvCsB,OAAO,QAC7B,OAAO,UAAU,QAAQ,KAAK,GAC9B,OAAO,WAAW,WAAW,CAAC,MAAM,QAAQ;GAC3C,OAAO,CACN,MACA;IACC;IACA,OACC,OAAO,SAAS,KAEd;IACH,aAAa,OAAO,MAAM,SAAiB,CAAC;GAC7C,CACD;EACD,CAAC,CACF,CAAC,CAAC,KAAK,OAAO,IAAI,QAAQ,YAAY,CAAC;EAyBtC,SAAA,OAxBsB,OAAO,QAC7B,OAAO,UAAU,QAAQ,IAAI,GAC7B,OAAO,WAAW,WAAW,CAAC,MAAM,QAAQ;GAC3C,OAAO,CACN,MACA;IACC;IACA,OACC,OAAO,SAAS,KAEd;GACJ,CACD;EACD,CAAC,CACF,CAAC,CAAC,KAAK,OAAO,IAAI,QAAQ,YAAY,CAAC;CAWvC;AACD,CAAC;AAED,MAAM,QAAQ,OAAO,WAAW,WAC/B,OACA,OACA,KACA,cACA,WACC;CACD,OAAO,OAAO,GACb,OAAO,IAAI,aAAa;EACvB,OAAO,MAAM,QAAQ;EACrB,MAAM,UAAU,OAAO,MAAM,IAAI,KAAK;EAKtC,IAJc,MAAM,OACnB,MAAM,aAAa,QAAQ,OAAO,OAAO,CAAC,IACzC,UAAU,MAAM,aAAa,aAAa,QAC5C,CAAC,CAAC,UACW,MAAM,OAAO,aAAa,WAAW;GACjD,IAAI,cAAc,YAAY,OAAO,OAAO,OAAO;GACnD,OAAO,OAAO,MACb,oCAAoC,aAAa,UAClD;EACD;EACA,OAAO,MAAM,IAAI,OAAO,QAAQ,IAAI,SAAS,KAAK,YAAY,CAAC;CAChE,CAAC,CACF;AACD,CAAC;AACD,MAAM,SAAS,OAAO,WAAW,WAChC,OACA,KACA,cACC;CACD,OAAO,MAAM,OAAO,OAAO,QAAQ,OAAO,GAAG,CAAC;CAC9C,OAAO,MAAM,IAAI,aAAa,KAAK;AACpC,CAAC;AACD,MAAM,WACL,OACA,OACA,UAAqC,OAAO,KAAK,MAEjD,OAAO,GACN,MAAM,QAAQ,MAAM,KACnB,OAAO,QACN,QAAQ,MAAM,MAAM,OAAO,MAAM,WAAW;CAAE;CAAO;AAAQ,CAAC,CAAC,CAAC,KAC/D,OAAO,SAAS,aACf,WAAW,OAAO,OAAO,MAAM,yBAAyB,CACzD,CACD,CACD,GACA,OAAO,MACR,CACD;AACD,MAAM,SACL,OACA,UACA,WACA,GACA,aACY;CACZ,SAAS,MAAM,QAAQ;CACvB;CACA;CACA,UAAU;CACV;AACD;AAEA,MAAM,OAAO,OAAO,WAAW,WAC9B,OACA,QACC;CACD,MAAM,QAAQ,OAAO,MAAM,QAAQ,IAClC,MAAM,QAAQ,MAAM,KAAK,OAAO,QAAQ,MAAM,CAAC,CAChD;CACA,MAAM,SAAS,OAAO,MAAM,MAAM,KAAK,CAAC,CAAC,KACxC,OAAO,kBAAkB,MAAM,UAAU,KAAK,CAAC,CAChD;CAEA,OAAO,MAAM,QAAQ;CACrB,OAAO;AACR,CAAC;AACD,MAAM,SAAS,OAAO,WAAW,WAAW,OAAc,KAAiB;CAC1E,MAAM,WAAW,OAAO,OAAO,GAC9B,OAAO,IAAI,aAAa;EACvB,MAAM,QAAQ,OAAO,MAAM,IAAI,MAAM,QAAQ;EAC7C,MAAM,eAAe,QAAQ,IAAI,OAAO,GAAG;EAC3C,IAAI,OAAO,OAAO,YAAY,GAC7B,OAAO,OAAO,KAAiD;EAChE,IAAI,aAAa,MAAM,MAAM;GAC5B,OAAO,QACN,OACA,MAAM,OAAO,IAAI,UAAU,WAAW,WAAW;IAChD,MAAM;IACN,WAAW,IAAI;GAChB,CAAC,CACF;GACA,OAAO,OAAO,KAAiD;EAChE;EACA,OAAO,MAAM,IAAI,MAAM,UAAU,QAAQ,OAAO,OAAO,GAAG,CAAC;EAC3D,OAAO;CACR,CAAC,CACF;CACA,IAAI,OAAO,OAAO,QAAQ,GAAG,OAAO,MAAM,IAAI,SAAS,MAAM,KAAK;AACnE,CAAC;AACD,MAAM,kBACL,OACA,aACmC;CAEnC,MAAM,SAAS,OAAO,WAAW,QAAQ,IAAI,MAAM,SAAS,QAAQ,CAAC;CACrE,OAAO,UAAU,SAAS,GAAG;EAC5B,UAAU,iBAAiB,KAAK;EAChC,aAAa;EACb,uBAAuB;EACvB,MAAM,KAAK,YACV,SAAS,QAAQ,OAAO,OAAO,OAAO,CAAC,CAAC,KACvC,OAAO,QAAQ,MAAM,QAAQ,KAAK,GAClC,OAAO,YAAY,UAClB,QAAQ;GAAE,MAAM;GAAuB,OAAO,SAAS,KAAK;EAAE,CAAC,CAChE,GACA,OAAO,QAAQ,OAAO,KAAK,CAC5B;EACD,OAAO,KAAK,YACX,KACC,OACA,OAAO,IAAI,aAAa;GACvB,IAAI,QAAQ,SAAS,WAAW;IAC/B,IAAI,QAAQ,YAAY,QAAQ,QAAQ,mBAAmB,MAC1D,OAAO,OAAO,MACb,qDACD;IACD,MAAM,MAAM,IAAI,WAAW;KAAE;KAAU,IAAI,QAAQ;IAAG,CAAC;IACvD,MAAM,eAAe,OAAO,QAC3B,SAAS,OAAO,OAAO,QAAQ,GAAG,CACnC;IACA,OAAO,MAAM,OAAO,MAAM,UAAU,KAAK,cAAc,UAAU;IACjE,OAAO,MAAM,QAAQ,IACpB,OAAO,UAAU,aAAa,KAAK,CAAC,CAAC,KACpC,OAAO,WACN,OAAO,WAAW,WAAW,UAAU;KACtC,MAAM,UAAU,OAAO,SAAS,MAAM,OAAO,KAAK;KAClD,IAAI,SAAS,SAAS,QACrB,OAAO,OAAO,MAAM,UAAU,KAAK,YAAY;KAChD,OAAO,QAAQ,QAAQ;IACxB,CAAC,CACF,CACD,CACD;IACA,OAAO,QACN,OACA,MAAM,OAAO,UAAU,WAAW,aAAa,UAAU,OAAO,GAChE,OAAO,KAAK,GAAG,CAChB;GACD,OAAO,IAAI,QAAQ,SAAS,aAC3B,OAAO,OACN,OACA,IAAI,WAAW;IAAE;IAAU,IAAI,QAAQ;GAAU,CAAC,CACnD;QACM,IAAI,QAAQ,SAAS,OAC3B,OAAO,QACN,OACA,MAAM,OAAO,UAAU,WAAW,WAAW,OAAO,CACrD;EAEF,CAAC,CACF,CAAC,CAAC,KAAK,OAAO,UAAU,YAAY,SAAS,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC;CACpE,CAAC;AACF;AACA,MAAM,kBACL,OACA,aACmC;CAEnC,MAAM,SAAS,OAAO,WAAW,QAAQ,IAAI,MAAM,SAAS,QAAQ,CAAC;CACrE,OAAO,UAAU,SAAS,GAAG;EAC5B,UAAU,iBAAiB,KAAK;EAChC,aAAa;EACb,uBAAuB;EACvB,yBAAyB;EACzB,uBAAuB;EACvB,WAAW,OAAO,wBAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;EACtC,gBAAgB,OAAO;EACvB,aAAa,OAAO;EACpB,WAAW,OAAO;EAClB,MAAM,YACL,SAAS,QAAQ,OAAO,OAAO,OAAO,CAAC,CAAC,KACvC,OAAO,QAAQ,OAAO,KAAK,CAC5B;EACD,OAAO,KAAK,YACX,KACC,OACA,OAAO,IAAI,aAAa;GACvB,IAAI,QAAQ,SAAS,WAAW,QAAQ,SAAS,QAAQ;IACxD,MAAM,MAAM,IAAI,WAAW;KAAE;KAAU,IAAI,QAAQ;IAAU,CAAC;IAC9D,MAAM,eAAe,OAAO,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC,KACrD,OAAO,IAAI,QAAQ,IAAI,GAAG,CAAC,CAC5B;IACA,IAAI,OAAO,OAAO,YAAY,GAAG;IACjC,OAAO,QACN,OACA,MACC,OACA,UACA,YACA,QAAQ,SAAS,SACd,YACA,aAAa,MAAM,UACtB,OACD,CACD;IACA,IAAI,QAAQ,SAAS,QACpB,OAAO,OAAO,MAAM,UAAU,KAAK,aAAa,KAAK;GACvD,OACC,OAAO,QACN,OACA,MAAM,OAAO,UAAU,YAAY,WAAW,OAAO,CACtD;EACF,CAAC,CACF,CAAC,CAAC,KAED,OAAO,SAAS,wBAAwB,OAAO,IAAI,CACpD;CACF,CAAC;AACF;AACA,MAAM,OAAO,OAAO,WAAW,WAAW,OAAc;CACvD,OAAO,MAAM,QAAQ;CACrB,KAAK,MAAM,KAAK;EACf;EACA;EACA;CACD,GAAqC;EACpC,MAAM,UAAU,OAAO,QAAQ,KAAK,MAAM,OAAO,EAAE;EACnD,IAAI,OAAO,OAAO,OAAO,GAAG;EAC5B,MAAM,EAAE,OAAO,YAAY,QAAQ;EACnC,IAAI,OAAO,OAAO,OAAO,GAAG;GAC3B,MAAM,QAAQ,OAAO,MAAM,IAAI,MAAM,QAAQ;GAC7C,MAAM,eAAe,QAAQ,IAAI,OAAO,QAAQ,KAAK;GACrD,IAAI,OAAO,OAAO,YAAY,GAAG,OAAO,OAAO,KAAY;GAC3D,OAAO,MAAM,IACZ,MAAM,UACN,QAAQ,IAAI,OAAO,QAAQ,OAAO;IACjC,GAAG,aAAa;IAChB,MAAM;GACP,CAAC,CACF;EACD;EACA,OAAO,OAAO,KAAK,KAAK;CACzB;CACA,KACE,OAAO,QAAQ,OAAO,MAAM,OAAO,OAAO,OAC1C,OAAO,QAAQ,OAAO,MAAM,OAAO,IAAI,OACvC,OAAO,QAAQ,OAAO,MAAM,OAAO,GAAG,IAEvC,OAAO,OAAO,MAAM,KAAK;CAC1B,OAAO,OAAO,OAAO;AACtB,GAAG,OAAO,EAAE;AACZ,MAAM,UAAU,UACf,OAAO,iBAAiB,KAAK,KAAK,CAAC,CAAC,CAAC,KACpC,OAAO,UAAU,OAAO,iBAAiB,KAAA,CAAS,CAAC,GACnD,OAAO,WAAW,UACjB,OAAO,aAAa,OAAO,eAAe,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KACxD,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD,CACD,GACA,OAAO,KAAK,SAAS,IAAI,YAAY,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC,GAC1D,OAAO,IAAI,MAAM,MAAM,MAAM,CAC9B;AACD,MAAM,OAAO,OAAO,WAAW,WAAW,OAAc,KAAc;CACrE,MAAM,UAAU,OAAO,OAAO,oBAAoB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAC7D,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;CACA,IAAI,QAAQ,YAAY,MAAM,QAAQ,SAAS;CAC/C,IAAI,QAAQ,cAAc,WAAW;EACpC,MAAM,SAAS,QAAQ,IAAI,MAAM,SAAS,QAAQ,QAAQ;EAC1D,IAAI,OAAO,OAAO,MAAM,GACvB,OAAO,OAAO,MAAM,gCAAgC,QAAQ,UAAU;EACvE,MAAM,UAAU,OAAO,OAAO,oBAAoB,OAAO,CAAC,CACzD,QAAQ,OACT,CAAC,CAAC,KACD,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;EACA,IAAI,QAAQ,SAAS,OACpB,OAAO,OAAO,eAAe,KAAK,EACjC,OAAO,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,EACvC,CAAC;EACF,MAAM,MAAM,IAAI,WAAW;GAC1B,UAAU,QAAQ;GAClB,IAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,QAAQ;EACvD,CAAC;EACD,IAAI,QAAQ,SAAS,WAAW;GAC/B,MAAM,IAAI,SAAS,OAAO,MAAM,OAAO,QAAQ,GAAG;GAClD,MAAM,eAAe,OAAO,QAAsC,CAAC;GACnE,OAAO,MAAM,OAAO,MAAM,UAAU,KAAK,cAAc,UAAU;GACjE,OAAO,MAAM,QAAQ,IACpB,OAAO,UAAU,aAAa,KAAK,CAAC,CAAC,KACpC,OAAO,WACN,OAAO,WAAW,WAAW,SAAS;IAErC,QAAO,OADgB,SAAS,MAAM,OAAO,MAAM,KAAK,EAAA,CACzC,GAAG,OAAO;GAC1B,CAAC,CACF,CACD,CACD;GACA,OAAO,QAAQ,cAAc,OAAO;EACrC,OAAO;GACN,MAAM,eAAe,OAAO,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC,KACrD,OAAO,IAAI,QAAQ,IAAI,GAAG,CAAC,CAC5B;GACA,IAAI,OAAO,OAAO,YAAY,GAC7B,OAAO,QAAQ,aAAa,OAAO,OAAO;EAC5C;CACD,OAAO;EACN,MAAM,UAAU,OAAO,OAAO,oBAAoB,QAAQ,CAAC,CAC1D,QAAQ,OACT,CAAC,CAAC,KACD,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;EACA,IAAI,QAAQ,SAAS,UACpB,OAAO,OAAO,eAAe,KAAK,EAAE,OAAO,MAAM,IAAI,QAAQ,MAAM,EAAE,CAAC;EACvE,MAAM,MAAM,IAAI,WAAW;GAC1B,UAAU,QAAQ;GAClB,IAAI,QAAQ;EACb,CAAC;EACD,MAAM,eAAe,OAAO,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC,KACrD,OAAO,IAAI,QAAQ,IAAI,GAAG,CAAC,CAC5B;EACA,IAAI,OAAO,OAAO,YAAY,GAAG,OAAO,QAAQ,aAAa,OAAO,OAAO;CAC5E;AACD,CAAC;AACD,MAAM,UAAU,UACf,MAAM,MAAM,MAAM,KACjB,OAAO,WAAW,GAClB,OAAO,YACP,OAAO,QAAQ,SAAS,KAAK,SAAS,CAAC,GACvC,OAAO,WAAW,SACjB,OAAO,aAAa,OAAO,eAAe,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAChE,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD,CACD,GACA,OAAO,YAAY,QAAQ,KAAK,OAAO,GAAG,CAAC,GAC3C,OAAO,QACN,OAAO,KACN,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAChE,CACD,CACD;;AAGD,MAAa,OAAO,OAAO,WAAW,WACrC,OACA,SAC8D;CAC9D,MAAM,QAAQ,OAAO,WAAW,OAAO,OAAO;CAG9C,OAAO,MAAM,QAAQ,MAAM,KAC1B,OAAO,WACN,OAAO,WAAW,aAAa;EAC9B,KAAK,MAAM,UAAU,QAAQ,OAAO,MAAM,OAAO,GAChD,OAAO,MAAM,MAAM,OAAO,aAAa,CAAC;EACzC,OAAO,OAAO,GACb,MAAM,IAAI,MAAM,UAAU,QAAQ,MAAM,CAAC,CAAC,CAAC,KAC1C,OAAO,QAAQ,MAAM,IAAI,MAAM,UAAU,QAAQ,MAAM,CAAC,CAAC,CAC1D,CACD;CACD,GAAG,OAAO,eAAe,CAC1B,GACA,OAAO,UACR;CACA,MAAM,UAAU,OAAO,MAAM,QAAQ,IAAI,OAAO,KAAK,CAAC;CACtD,OAAO,MAAM,QAAQ,IAAI,OAAO,KAAK,CAAC;CACtC,OAAO;EACN,iBAAiB,aAAa,eAAe,OAAO,QAAQ;EAC5D,iBAAiB,aAAa,eAAe,OAAO,QAAQ;EAC5D,OAAO,MAAM,QAAQ;EACrB,MAAM,MAAM,QAAQ;EACpB,KAAK,OAAO,GACX,OAAO,QAAQ,OAAO,OAAO,MAAM,MAAM,GAAG,QAAQ,KAAK,EACxD,SAAS,KACV,CAAC,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,MAAM,KAAK,OAAO,CAAC,CAAC;CAC3C;AACD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bootstrap.js","names":[],"sources":["../../../src/internal/runner/Bootstrap.ts"],"sourcesContent":["import { Schema } from \"effect\"\nimport { Identity } from \"../../Instance\"\nimport { Limits } from \"./model\"\n\nexport const Bootstrap = Schema.Struct({\n\tidentity: Identity,\n\tlimits: Limits,\n})\nexport type Bootstrap = typeof Bootstrap.Type\n"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"Bootstrap.js","names":[],"sources":["../../../src/internal/runner/Bootstrap.ts"],"sourcesContent":["import { Schema } from \"effect\"\n\nimport { Identity } from \"../../Instance\"\nimport { Limits } from \"./model\"\n\nexport const Bootstrap = Schema.Struct({\n\tidentity: Identity,\n\tlimits: Limits,\n})\nexport type Bootstrap = typeof Bootstrap.Type\n"],"mappings":";;;;AAKA,MAAa,YAAY,OAAO,OAAO;CACtC,UAAU;CACV,QAAQ;AACT,CAAC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import "../assembly.js";
|
|
2
|
-
import "../../
|
|
2
|
+
import "../../index.js";
|
|
3
3
|
import "./model.js";
|
|
4
4
|
import "../../Transport.js";
|
|
5
5
|
import "../../Auth.js";
|
|
6
|
+
import "../../Errors.js";
|
|
6
7
|
import "../directTransport.js";
|
|
7
|
-
import "./Packages.js";
|
|
8
8
|
import "../port.js";
|
|
9
|
+
import "./Packages.js";
|
|
9
10
|
import "./Wire.js";
|
|
10
11
|
import { Cause, Context, Duration, Effect, Option, PlatformError, Schema, Scope } from "effect";
|
|
11
12
|
import { RpcClientError } from "effect/rpc";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { cleanupCause } from "../cleanup.js";
|
|
1
2
|
import { LocalTransport, WorkerTransport } from "../directTransport.js";
|
|
2
3
|
import { connect } from "../host/runner.js";
|
|
3
|
-
import { close } from "../release.js";
|
|
4
|
-
import { cleanupCause } from "../cleanup.js";
|
|
5
4
|
import { connect as connect$1 } from "./Local.js";
|
|
6
5
|
import { Array, Cause, Context, Effect, Exit, Scope } from "effect";
|
|
6
|
+
import * as Release from "@graftland/graft/Release";
|
|
7
7
|
// src/internal/runner/Connection.ts
|
|
8
8
|
var Connection = class extends Context.Service()("@graftland/plugin-remote/internal/runner/Connection") {};
|
|
9
9
|
const connected = Connection.of;
|
|
@@ -25,8 +25,8 @@ const scopes = Effect.acquireRelease(Effect.all({
|
|
|
25
25
|
resources: Scope.make(),
|
|
26
26
|
process: Scope.make()
|
|
27
27
|
}), Effect.fnUntraced(function* (scopes, exit) {
|
|
28
|
-
const process = yield* Effect.exit(close(scopes.process, exit));
|
|
29
|
-
const resources = yield* Effect.exit(close(scopes.resources, exit));
|
|
28
|
+
const process = yield* Effect.exit(Release.close(scopes.process, exit));
|
|
29
|
+
const resources = yield* Effect.exit(Release.close(scopes.resources, exit));
|
|
30
30
|
yield* finish([reason(process), reason(resources)]);
|
|
31
31
|
}));
|
|
32
32
|
/** Setup supplies a concrete control lifecycle; release never reads a later-installed effect. */
|
|
@@ -35,9 +35,9 @@ const acquire = Effect.fnUntraced(function* (target, contractModule, options, se
|
|
|
35
35
|
const connection = yield* Effect.acquireRelease(Effect.gen(function* () {
|
|
36
36
|
return target._tag === "Local" || target._tag === "Worker" ? yield* Local(target, contractModule, options, owned.resources, owned.process).pipe(Effect.map(connected)) : yield* connect(target, contractModule, options, owned.resources, owned.process);
|
|
37
37
|
}).pipe(Effect.interruptible), Effect.fnUntraced(function* (connection, exit) {
|
|
38
|
-
const process = yield* Effect.exit(close(owned.process, exit));
|
|
38
|
+
const process = yield* Effect.exit(Release.close(owned.process, exit));
|
|
39
39
|
yield* connection.diagnostics;
|
|
40
|
-
const resources = yield* Effect.exit(close(owned.resources, exit));
|
|
40
|
+
const resources = yield* Effect.exit(Release.close(owned.resources, exit));
|
|
41
41
|
const diagnostics = yield* connection.diagnostics;
|
|
42
42
|
yield* finish([
|
|
43
43
|
reason(process),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Connection.js","names":["LocalProcess.connect","
|
|
1
|
+
{"version":3,"file":"Connection.js","names":["LocalProcess.connect","RunnerConnection.connect"],"sources":["../../../src/internal/runner/Connection.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tContext,\n\tDuration,\n\tEffect,\n\tExit,\n\tOption,\n\tScope,\n\ttype PlatformError,\n\ttype Schema,\n} from \"effect\"\nimport type { RpcClientError } from \"effect/rpc\"\n\nimport * as Release from \"@graftland/graft/Release\"\n\nimport {\n\tLocalTerminationTimeout,\n\tProcessExited,\n\tTransportError,\n} from \"../../Errors\"\nimport { cleanupCause } from \"../cleanup\"\nimport {\n\tLocalTransport,\n\tWorkerTransport,\n\ttype Execution,\n} from \"../directTransport\"\nimport * as RunnerConnection from \"../host/runner\"\nimport * as Port from \"../port\"\nimport * as LocalProcess from \"./Local\"\nimport type { RemoteTerminationUnconfirmed } from \"./model\"\nimport type { Expected } from \"./Packages\"\nimport * as Wire from \"./Wire\"\n\nexport interface LocalTarget {\n\treadonly _tag: \"Local\"\n\treadonly command?: readonly [string, ...string[]]\n}\nexport interface WorkerTarget {\n\treadonly _tag: \"Worker\"\n\treadonly execArgv?: ReadonlyArray<string>\n}\n\nexport interface ConfiguredRunner {\n\treadonly instance: string\n\treadonly lease?: Duration.Input\n\treadonly margin?: Duration.Input\n\treadonly expect?: Expected\n\treadonly _tag: \"Connector\"\n\treadonly explicitAuth?: boolean\n}\nexport type Target = LocalTarget | WorkerTarget | ConfiguredRunner\n\ntype Peer = Port.Port\nexport interface Connected {\n\treadonly resources: Scope.Scope\n\treadonly pid: Option.Option<number>\n\treadonly threadId?: number\n\treadonly diagnostics: Effect.Effect<Cause.Cause<unknown>>\n\treadonly terminate: (\n\t\tgraceful: boolean,\n\t) => Effect.Effect<\n\t\tvoid,\n\t\t| ProcessExited\n\t\t| LocalTerminationTimeout\n\t\t| TransportError\n\t\t| Schema.SchemaError\n\t\t| Wire.SessionError\n\t\t| RemoteTerminationUnconfirmed\n\t\t| RpcClientError.RpcClientError\n\t>\n\treadonly transport: {\n\t\treadonly clientProtocol: Peer[\"clientProtocol\"]\n\t\treadonly serverProtocol: Peer[\"serverProtocol\"]\n\t\treadonly failure: Effect.Effect<never, ProcessExited | TransportError>\n\t\treadonly report: (cause: Cause.Cause<unknown>) => Effect.Effect<void>\n\t}\n}\nexport class Connection extends Context.Service<Connection, Connected>()(\n\t\"@graftland/plugin-remote/internal/runner/Connection\",\n) {}\nconst connected = Connection.of\n\nconst Local = Effect.fnUntraced(function* (\n\ttarget: LocalTarget | WorkerTarget,\n\tcontractModule: string,\n\toptions: Port.Options,\n\tresources: Scope.Scope,\n\tprocessScope: Scope.Scope,\n) {\n\tconst transport = yield* target._tag === \"Local\"\n\t\t? LocalTransport\n\t\t: WorkerTransport\n\tconst started: Effect.Effect<\n\t\tExecution,\n\t\tPlatformError.PlatformError | TransportError,\n\t\tScope.Scope\n\t> = transport.start({ ...target, contractModule, session: options.session })\n\tconst execution = yield* started.pipe(Scope.provide(processScope))\n\treturn yield* LocalProcess.connect(execution, options).pipe(\n\t\tScope.provide(resources),\n\t)\n})\n\nconst reason = <A, E>(exit: Exit.Exit<A, E>) =>\n\tExit.isFailure(exit) ? exit.cause : Cause.empty\nconst finish = (causes: ReadonlyArray<Cause.Cause<unknown>>) => {\n\tconst cause = Array.reduce(causes, Cause.empty, Cause.combine)\n\treturn cause.reasons.length === 0\n\t\t? Effect.void\n\t\t: Effect.failCause(cleanupCause(cause))\n}\n\n/** Close partially acquired resources too; the normal release observes exit before stopping readers. */\nconst scopes = Effect.acquireRelease(\n\tEffect.all({ resources: Scope.make(), process: Scope.make() }),\n\tEffect.fnUntraced(function* (scopes, exit) {\n\t\tconst process = yield* Effect.exit(Release.close(scopes.process, exit))\n\t\tconst resources = yield* Effect.exit(Release.close(scopes.resources, exit))\n\t\tyield* finish([reason(process), reason(resources)])\n\t}),\n)\n\n/** Setup supplies a concrete control lifecycle; release never reads a later-installed effect. */\nexport const acquire = Effect.fnUntraced(function* <A, E, R, D, DR>(\n\ttarget: Target,\n\tcontractModule: string,\n\toptions: Port.Options,\n\tsetup: Effect.Effect<A, E, R | Connection>,\n\tdispose: (value: A) => Effect.Effect<Cause.Cause<unknown>, D, DR>,\n\ttimeout: Duration.Input,\n) {\n\tconst owned = yield* scopes\n\tconst connection = yield* Effect.acquireRelease(\n\t\tEffect.gen(function* () {\n\t\t\treturn target._tag === \"Local\" || target._tag === \"Worker\"\n\t\t\t\t? yield* Local(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tcontractModule,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\towned.resources,\n\t\t\t\t\t\towned.process,\n\t\t\t\t\t).pipe(Effect.map(connected))\n\t\t\t\t: yield* RunnerConnection.connect(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tcontractModule,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\towned.resources,\n\t\t\t\t\t\towned.process,\n\t\t\t\t\t)\n\t\t}).pipe(Effect.interruptible),\n\t\tEffect.fnUntraced(function* (connection, exit) {\n\t\t\tconst process = yield* Effect.exit(Release.close(owned.process, exit))\n\t\t\t// Wait for exit while readers are alive; collect their final cause after resources close.\n\t\t\tyield* connection.diagnostics\n\t\t\tconst resources = yield* Effect.exit(Release.close(owned.resources, exit))\n\t\t\tconst diagnostics = yield* connection.diagnostics\n\t\t\tyield* finish([reason(process), reason(resources), diagnostics])\n\t\t}),\n\t)\n\treturn yield* Effect.acquireRelease(\n\t\tsetup.pipe(Effect.provideService(Connection, connection)),\n\t\tEffect.fnUntraced(function* (value) {\n\t\t\tconst graceful = yield* dispose(value).pipe(\n\t\t\t\tEffect.interruptible,\n\t\t\t\tEffect.timeout(timeout),\n\t\t\t\tEffect.exit,\n\t\t\t)\n\t\t\tconst terminated = yield* Effect.exit(\n\t\t\t\tconnection.terminate(Exit.isSuccess(graceful)),\n\t\t\t)\n\t\t\tyield* finish([\n\t\t\t\tExit.isSuccess(graceful) ? graceful.value : graceful.cause,\n\t\t\t\treason(terminated),\n\t\t\t])\n\t\t}),\n\t)\n})\n"],"mappings":";;;;;;;AA8EA,IAAa,aAAb,cAAgC,QAAQ,QAA+B,CAAC,CACvE,qDACD,CAAC,CAAC,CAAC;AACH,MAAM,YAAY,WAAW;AAE7B,MAAM,QAAQ,OAAO,WAAW,WAC/B,QACA,gBACA,SACA,WACA,cACC;CASD,MAAM,YAAY,QADd,OAPqB,OAAO,SAAS,UACtC,iBACA,gBAAA,CAKW,MAAM;EAAE,GAAG;EAAQ;EAAgB,SAAS,QAAQ;CAAQ,CAC3C,CAAC,CAAC,KAAK,MAAM,QAAQ,YAAY,CAAC;CACjE,OAAO,OAAOA,UAAqB,WAAW,OAAO,CAAC,CAAC,KACtD,MAAM,QAAQ,SAAS,CACxB;AACD,CAAC;AAED,MAAM,UAAgB,SACrB,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,MAAM;AAC3C,MAAM,UAAU,WAAgD;CAC/D,MAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,OAAO,MAAM,OAAO;CAC7D,OAAO,MAAM,QAAQ,WAAW,IAC7B,OAAO,OACP,OAAO,UAAU,aAAa,KAAK,CAAC;AACxC;;AAGA,MAAM,SAAS,OAAO,eACrB,OAAO,IAAI;CAAE,WAAW,MAAM,KAAK;CAAG,SAAS,MAAM,KAAK;AAAE,CAAC,GAC7D,OAAO,WAAW,WAAW,QAAQ,MAAM;CAC1C,MAAM,UAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,SAAS,IAAI,CAAC;CACtE,MAAM,YAAY,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,WAAW,IAAI,CAAC;CAC1E,OAAO,OAAO,CAAC,OAAO,OAAO,GAAG,OAAO,SAAS,CAAC,CAAC;AACnD,CAAC,CACF;;AAGA,MAAa,UAAU,OAAO,WAAW,WACxC,QACA,gBACA,SACA,OACA,SACA,SACC;CACD,MAAM,QAAQ,OAAO;CACrB,MAAM,aAAa,OAAO,OAAO,eAChC,OAAO,IAAI,aAAa;EACvB,OAAO,OAAO,SAAS,WAAW,OAAO,SAAS,WAC/C,OAAO,MACP,QACA,gBACA,SACA,MAAM,WACN,MAAM,OACP,CAAC,CAAC,KAAK,OAAO,IAAI,SAAS,CAAC,IAC3B,OAAOC,QACP,QACA,gBACA,SACA,MAAM,WACN,MAAM,OACP;CACH,CAAC,CAAC,CAAC,KAAK,OAAO,aAAa,GAC5B,OAAO,WAAW,WAAW,YAAY,MAAM;EAC9C,MAAM,UAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,SAAS,IAAI,CAAC;EAErE,OAAO,WAAW;EAClB,MAAM,YAAY,OAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,WAAW,IAAI,CAAC;EACzE,MAAM,cAAc,OAAO,WAAW;EACtC,OAAO,OAAO;GAAC,OAAO,OAAO;GAAG,OAAO,SAAS;GAAG;EAAW,CAAC;CAChE,CAAC,CACF;CACA,OAAO,OAAO,OAAO,eACpB,MAAM,KAAK,OAAO,eAAe,YAAY,UAAU,CAAC,GACxD,OAAO,WAAW,WAAW,OAAO;EACnC,MAAM,WAAW,OAAO,QAAQ,KAAK,CAAC,CAAC,KACtC,OAAO,eACP,OAAO,QAAQ,OAAO,GACtB,OAAO,IACR;EACA,MAAM,aAAa,OAAO,OAAO,KAChC,WAAW,UAAU,KAAK,UAAU,QAAQ,CAAC,CAC9C;EACA,OAAO,OAAO,CACb,KAAK,UAAU,QAAQ,IAAI,SAAS,QAAQ,SAAS,OACrD,OAAO,UAAU,CAClB,CAAC;CACF,CAAC,CACF;AACD,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { observe } from "./ProcessObservation.js";
|
|
2
|
-
import { make as make$1 } from "../FailureGroup.js";
|
|
3
|
-
import { CommandJson } from "./WatchdogProtocol.js";
|
|
4
1
|
import { TransportError } from "../../Errors.js";
|
|
2
|
+
import { make as make$1 } from "../FailureGroup.js";
|
|
3
|
+
import { Bootstrap } from "./Bootstrap.js";
|
|
4
|
+
import { command } from "./command.js";
|
|
5
|
+
import { Execution, ExecutionError, SessionConflict, SessionStopped } from "./model.js";
|
|
5
6
|
import { make as make$2 } from "./Multiplex.js";
|
|
6
7
|
import { resolve } from "./Packages.js";
|
|
7
8
|
import { identity, recover } from "./Processes.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { command } from "./command.js";
|
|
9
|
+
import { observe } from "./ProcessObservation.js";
|
|
10
|
+
import { CommandJson } from "./WatchdogProtocol.js";
|
|
11
11
|
import { Array, Cause, Context, Effect, FileSystem, HashMap, HashSet, Layer, Path, Queue, Ref, Schema, Sink, Stream } from "effect";
|
|
12
12
|
import { ChildProcess, ChildProcessSpawner } from "effect/process";
|
|
13
13
|
// src/internal/runner/Execution.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Execution.js","names":["Processes.recover","Packages.resolve","ProcessObservation.observe","FailureGroup.make","Multiplex.make","identity","Processes.identity"],"sources":["../../../src/internal/runner/Execution.ts"],"sourcesContent":["import * as ProcessObservation from \"./ProcessObservation\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport { Command, CommandJson } from \"./WatchdogProtocol\"\nimport {\n\tArray,\n\tCause,\n\tFileSystem,\n\tPath,\n\tSchema,\n\tContext,\n\tEffect,\n\tHashMap,\n\tHashSet,\n\tQueue,\n\tRef,\n\tSink,\n\tStream,\n\tLayer,\n\tScope,\n} from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\nimport { TransportError } from \"../../Errors\"\nimport * as Multiplex from \"./Multiplex\"\nimport * as Packages from \"./Packages\"\nimport * as Processes from \"./Processes\"\nimport {\n\tExecution,\n\tExecutionError,\n\tSessionConflict,\n\tSessionStopped,\n} from \"./model\"\nimport { Bootstrap } from \"./Bootstrap\"\nimport { command } from \"./command\"\n\nexport class Channels extends Context.Service<\n\tChannels,\n\t{\n\t\treadonly peer: (\n\t\t\ttoken: string,\n\t\t) => Effect.Effect<\n\t\t\tMultiplex.Peer,\n\t\t\tSessionStopped | SessionConflict,\n\t\t\tScope.Scope\n\t\t>\n\t}\n>()(\"@graftland/plugin-remote/internal/runner/Execution/Channels\") {}\n\nexport const make = Effect.fnUntraced(function* (root: string) {\n\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst platform = Context.make(\n\t\tChildProcessSpawner.ChildProcessSpawner,\n\t\tspawner,\n\t).pipe(Context.add(FileSystem.FileSystem, fs), Context.add(Path.Path, path))\n\n\tconst peers = yield* Ref.make(HashMap.empty<string, Multiplex.Peer>())\n\tconst claimed = yield* Ref.make(HashSet.empty<string>())\n\tconst driver = Execution.of({\n\t\trecover: (child) =>\n\t\t\tProcesses.recover(child).pipe(Effect.provideContext(platform)),\n\t\tspawn: Effect.fnUntraced(\n\t\t\tfunction* (handle, request, limits) {\n\t\t\t\tconst resolved = yield* Packages.resolve(\n\t\t\t\t\troot,\n\t\t\t\t\trequest.specifier,\n\t\t\t\t\trequest.digest,\n\t\t\t\t)\n\t\t\t\tconst argv = yield* command()\n\t\t\t\tconst child = yield* spawner.spawn(\n\t\t\t\t\tChildProcess.make(\n\t\t\t\t\t\targv[0],\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t...Array.drop(argv, 1),\n\t\t\t\t\t\t\t\"child\",\n\t\t\t\t\t\t\tresolved.entry,\n\t\t\t\t\t\t\thandle.token,\n\t\t\t\t\t\t\tyield* Schema.encodeEffect(Schema.fromJsonString(Bootstrap))({\n\t\t\t\t\t\t\t\tidentity: {\n\t\t\t\t\t\t\t\t\tid: handle.key.instance,\n\t\t\t\t\t\t\t\t\tgeneration: handle.generation,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tlimits,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstdin: \"pipe\",\n\t\t\t\t\t\t\tstdout: \"pipe\",\n\t\t\t\t\t\t\tstderr: \"pipe\",\n\t\t\t\t\t\t\tadditionalFds: {\n\t\t\t\t\t\t\t\tfd3: { type: \"output\" },\n\t\t\t\t\t\t\t\tfd4: { type: \"input\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tforceKillAfter: \"1 second\",\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst observation = yield* ProcessObservation.observe(child)\n\t\t\t\tconst exited = observation.exited.pipe(\n\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Observing child exit failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst failures = yield* FailureGroup.make<ExecutionError>()\n\t\t\t\tyield* failures.run(\n\t\t\t\t\tobservation.failure.pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Reading child output failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\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\tconst controls = yield* Queue.bounded<string>(4)\n\n\t\t\t\tyield* failures.run(\n\t\t\t\t\tStream.fromQueue(controls).pipe(\n\t\t\t\t\t\tStream.map((line) => new TextEncoder().encode(line + \"\\n\")),\n\t\t\t\t\t\tStream.run(child.getInputFd(4)),\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Child supervision channel failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\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\tconst send = (value: typeof Command.Type) =>\n\t\t\t\t\tEffect.raceFirst(\n\t\t\t\t\t\tSchema.encodeEffect(CommandJson)(value).pipe(\n\t\t\t\t\t\t\tEffect.flatMap((line) => Queue.offer(controls, line)),\n\t\t\t\t\t\t\tEffect.asVoid,\n\t\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Encoding watchdog command failed\",\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\t),\n\t\t\t\t\t\tfailures.await,\n\t\t\t\t\t)\n\t\t\t\tconst peer = yield* Multiplex.make({\n\t\t\t\t\tinput: child\n\t\t\t\t\t\t.getOutputFd(3)\n\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\tStream.mapError((error) =>\n\t\t\t\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\toutput: child.stdin.pipe(\n\t\t\t\t\t\tSink.mapError((error) =>\n\t\t\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t})\n\t\t\t\tconst identity = yield* Processes.identity(child.pid)\n\t\t\t\tyield* Ref.update(peers, HashMap.set(handle.token, peer))\n\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\tRef.update(peers, HashMap.remove(handle.token)),\n\t\t\t\t)\n\t\t\t\treturn {\n\t\t\t\t\tcode: resolved.identity,\n\t\t\t\t\tstart: send({ kind: \"start\" }),\n\t\t\t\t\tidentity,\n\t\t\t\t\texited,\n\t\t\t\t\tinterrupt: send({ kind: \"stop\" }),\n\t\t\t\t\tkill: child.kill({ killSignal: \"SIGKILL\" }).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Killing the child failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\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\trenew: (millis: number) => send({ kind: \"renew\", millis }),\n\t\t\t\t}\n\t\t\t},\n\t\t\tEffect.provideContext(platform),\n\t\t\tEffect.catchTags({\n\t\t\t\tPlatformError: (error) =>\n\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Starting the child failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\tSchemaError: (error) =>\n\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Encoding child bootstrap failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t}),\n\t\t),\n\t})\n\treturn {\n\t\tdriver,\n\t\tpeer: (token: string) =>\n\t\t\tEffect.acquireRelease(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst peer = yield* Ref.get(peers).pipe(\n\t\t\t\t\t\tEffect.flatMap((all) => {\n\t\t\t\t\t\t\tconst peer = HashMap.get(all, token)\n\t\t\t\t\t\t\treturn peer._tag === \"Some\"\n\t\t\t\t\t\t\t\t? Effect.succeed(peer.value)\n\t\t\t\t\t\t\t\t: Effect.fail(\n\t\t\t\t\t\t\t\t\t\tSessionStopped.make({\n\t\t\t\t\t\t\t\t\t\t\tdetail: \"The execution channel is no longer available\",\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\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\tconst occupied = yield* Ref.modify(\n\t\t\t\t\t\tclaimed,\n\t\t\t\t\t\t(all) =>\n\t\t\t\t\t\t\t[HashSet.has(all, token), HashSet.add(all, token)] as const,\n\t\t\t\t\t)\n\t\t\t\t\tif (occupied)\n\t\t\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\t\t\tdetail: \"The instance channel is already attached\",\n\t\t\t\t\t\t})\n\t\t\t\t\treturn peer\n\t\t\t\t}),\n\t\t\t\t() => Ref.update(claimed, HashSet.remove(token)),\n\t\t\t),\n\t}\n})\n\nexport const layer = (root: string) =>\n\tLayer.effectContext(\n\t\tmake(root).pipe(\n\t\t\tEffect.map((execution) =>\n\t\t\t\tContext.make(Execution, execution.driver).pipe(\n\t\t\t\t\tContext.add(Channels, { peer: execution.peer }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t)\n"],"mappings":";;;;;;;;;;;;;AAkCA,IAAa,WAAb,cAA8B,QAAQ,QAWpC,CAAC,CAAC,6DAA6D,CAAC,CAAC,CAAC;AAEpE,MAAa,OAAO,OAAO,WAAW,WAAW,MAAc;CAC9D,MAAM,UAAU,OAAO,oBAAoB;CAC3C,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,WAAW,QAAQ,KACxB,oBAAoB,qBACpB,OACD,CAAC,CAAC,KAAK,QAAQ,IAAI,WAAW,YAAY,EAAE,GAAG,QAAQ,IAAI,KAAK,MAAM,IAAI,CAAC;CAE3E,MAAM,QAAQ,OAAO,IAAI,KAAK,QAAQ,MAA8B,CAAC;CACrE,MAAM,UAAU,OAAO,IAAI,KAAK,QAAQ,MAAc,CAAC;CA+IvD,OAAO;EACN,QA/Ic,UAAU,GAAG;GAC3B,UAAU,UACTA,QAAkB,KAAK,CAAC,CAAC,KAAK,OAAO,eAAe,QAAQ,CAAC;GAC9D,OAAO,OAAO,WACb,WAAW,QAAQ,SAAS,QAAQ;IACnC,MAAM,WAAW,OAAOC,QACvB,MACA,QAAQ,WACR,QAAQ,MACT;IACA,MAAM,OAAO,OAAO,QAAQ;IAC5B,MAAM,QAAQ,OAAO,QAAQ,MAC5B,aAAa,KACZ,KAAK,IACL;KACC,GAAG,MAAM,KAAK,MAAM,CAAC;KACrB;KACA,SAAS;KACT,OAAO;KACP,OAAO,OAAO,aAAa,OAAO,eAAe,SAAS,CAAC,CAAC,CAAC;MAC5D,UAAU;OACT,IAAI,OAAO,IAAI;OACf,YAAY,OAAO;MACpB;MACA;KACD,CAAC;IACF,GACA;KACC,OAAO;KACP,QAAQ;KACR,QAAQ;KACR,eAAe;MACd,KAAK,EAAE,MAAM,SAAS;MACtB,KAAK,EAAE,MAAM,QAAQ;KACtB;KACA,gBAAgB;IACjB,CACD,CACD;IACA,MAAM,cAAc,OAAOC,QAA2B,KAAK;IAC3D,MAAM,SAAS,YAAY,OAAO,KACjC,OAAO,UAAU,UAChB,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF,CACD;IACA,MAAM,WAAW,OAAOC,OAAkC;IAC1D,OAAO,SAAS,IACf,YAAY,QAAQ,KACnB,OAAO,UAAU,UAChB,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF,CACD,CACD;IACA,MAAM,WAAW,OAAO,MAAM,QAAgB,CAAC;IAE/C,OAAO,SAAS,IACf,OAAO,UAAU,QAAQ,CAAC,CAAC,KAC1B,OAAO,KAAK,SAAS,IAAI,YAAY,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC,GAC1D,OAAO,IAAI,MAAM,WAAW,CAAC,CAAC,GAC9B,OAAO,UAAU,UAChB,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF,CACD,CACD;IACA,MAAM,QAAQ,UACb,OAAO,UACN,OAAO,aAAa,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KACvC,OAAO,SAAS,SAAS,MAAM,MAAM,UAAU,IAAI,CAAC,GACpD,OAAO,QACP,OAAO,UAAU,UAChB,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF,CACD,GACA,SAAS,KACV;IACD,MAAM,OAAO,OAAOC,OAAe;KAClC,OAAO,MACL,YAAY,CAAC,CAAC,CACd,KACA,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;KACD,QAAQ,MAAM,MAAM,KACnB,KAAK,UAAU,UACd,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;IACD,CAAC;IACD,MAAMC,aAAW,OAAOC,SAAmB,MAAM,GAAG;IACpD,OAAO,IAAI,OAAO,OAAO,QAAQ,IAAI,OAAO,OAAO,IAAI,CAAC;IACxD,OAAO,OAAO,mBACb,IAAI,OAAO,OAAO,QAAQ,OAAO,OAAO,KAAK,CAAC,CAC/C;IACA,OAAO;KACN,MAAM,SAAS;KACf,OAAO,KAAK,EAAE,MAAM,QAAQ,CAAC;KAC7B,UAAA;KACA;KACA,WAAW,KAAK,EAAE,MAAM,OAAO,CAAC;KAChC,MAAM,MAAM,KAAK,EAAE,YAAY,UAAU,CAAC,CAAC,CAAC,KAC3C,OAAO,UAAU,UAChB,eAAe,KAAK;MACnB,QAAQ;MACR,OAAO,MAAM,KAAK,KAAK;KACxB,CAAC,CACF,CACD;KACA,QAAQ,WAAmB,KAAK;MAAE,MAAM;MAAS;KAAO,CAAC;IAC1D;GACD,GACA,OAAO,eAAe,QAAQ,GAC9B,OAAO,UAAU;IAChB,gBAAgB,UACf,OAAO,KACN,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF;IACD,cAAc,UACb,OAAO,KACN,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF;GACF,CAAC,CACF;EACD,CAEM;EACL,OAAO,UACN,OAAO,eACN,OAAO,IAAI,aAAa;GACvB,MAAM,OAAO,OAAO,IAAI,IAAI,KAAK,CAAC,CAAC,KAClC,OAAO,SAAS,QAAQ;IACvB,MAAM,OAAO,QAAQ,IAAI,KAAK,KAAK;IACnC,OAAO,KAAK,SAAS,SAClB,OAAO,QAAQ,KAAK,KAAK,IACzB,OAAO,KACP,eAAe,KAAK,EACnB,QAAQ,+CACT,CAAC,CACF;GACH,CAAC,CACF;GAMA,IAAI,OALoB,IAAI,OAC3B,UACC,QACA,CAAC,QAAQ,IAAI,KAAK,KAAK,GAAG,QAAQ,IAAI,KAAK,KAAK,CAAC,CACnD,GAEC,OAAO,OAAO,gBAAgB,KAAK,EAClC,QAAQ,2CACT,CAAC;GACF,OAAO;EACR,CAAC,SACK,IAAI,OAAO,SAAS,QAAQ,OAAO,KAAK,CAAC,CAChD;CACF;AACD,CAAC;AAED,MAAa,SAAS,SACrB,MAAM,cACL,KAAK,IAAI,CAAC,CAAC,KACV,OAAO,KAAK,cACX,QAAQ,KAAK,WAAW,UAAU,MAAM,CAAC,CAAC,KACzC,QAAQ,IAAI,UAAU,EAAE,MAAM,UAAU,KAAK,CAAC,CAC/C,CACD,CACD,CACD"}
|
|
1
|
+
{"version":3,"file":"Execution.js","names":["Processes.recover","Packages.resolve","ProcessObservation.observe","FailureGroup.make","Multiplex.make","identity","Processes.identity"],"sources":["../../../src/internal/runner/Execution.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tContext,\n\tEffect,\n\tFileSystem,\n\tHashMap,\n\tHashSet,\n\tLayer,\n\tPath,\n\tQueue,\n\tRef,\n\tSchema,\n\tScope,\n\tSink,\n\tStream,\n} from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\n\nimport { TransportError } from \"../../Errors\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport { Bootstrap } from \"./Bootstrap\"\nimport { command } from \"./command\"\nimport {\n\tExecution,\n\tExecutionError,\n\tSessionConflict,\n\tSessionStopped,\n} from \"./model\"\nimport * as Multiplex from \"./Multiplex\"\nimport * as Packages from \"./Packages\"\nimport * as Processes from \"./Processes\"\nimport * as ProcessObservation from \"./ProcessObservation\"\nimport { Command, CommandJson } from \"./WatchdogProtocol\"\n\nexport class Channels extends Context.Service<\n\tChannels,\n\t{\n\t\treadonly peer: (\n\t\t\ttoken: string,\n\t\t) => Effect.Effect<\n\t\t\tMultiplex.Peer,\n\t\t\tSessionStopped | SessionConflict,\n\t\t\tScope.Scope\n\t\t>\n\t}\n>()(\"@graftland/plugin-remote/internal/runner/Execution/Channels\") {}\n\nexport const make = Effect.fnUntraced(function* (root: string) {\n\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst platform = Context.make(\n\t\tChildProcessSpawner.ChildProcessSpawner,\n\t\tspawner,\n\t).pipe(Context.add(FileSystem.FileSystem, fs), Context.add(Path.Path, path))\n\n\tconst peers = yield* Ref.make(HashMap.empty<string, Multiplex.Peer>())\n\tconst claimed = yield* Ref.make(HashSet.empty<string>())\n\tconst driver = Execution.of({\n\t\trecover: (child) =>\n\t\t\tProcesses.recover(child).pipe(Effect.provideContext(platform)),\n\t\tspawn: Effect.fnUntraced(\n\t\t\tfunction* (handle, request, limits) {\n\t\t\t\tconst resolved = yield* Packages.resolve(\n\t\t\t\t\troot,\n\t\t\t\t\trequest.specifier,\n\t\t\t\t\trequest.digest,\n\t\t\t\t)\n\t\t\t\tconst argv = yield* command()\n\t\t\t\tconst child = yield* spawner.spawn(\n\t\t\t\t\tChildProcess.make(\n\t\t\t\t\t\targv[0],\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t...Array.drop(argv, 1),\n\t\t\t\t\t\t\t\"child\",\n\t\t\t\t\t\t\tresolved.entry,\n\t\t\t\t\t\t\thandle.token,\n\t\t\t\t\t\t\tyield* Schema.encodeEffect(Schema.fromJsonString(Bootstrap))({\n\t\t\t\t\t\t\t\tidentity: {\n\t\t\t\t\t\t\t\t\tid: handle.key.instance,\n\t\t\t\t\t\t\t\t\tgeneration: handle.generation,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tlimits,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstdin: \"pipe\",\n\t\t\t\t\t\t\tstdout: \"pipe\",\n\t\t\t\t\t\t\tstderr: \"pipe\",\n\t\t\t\t\t\t\tadditionalFds: {\n\t\t\t\t\t\t\t\tfd3: { type: \"output\" },\n\t\t\t\t\t\t\t\tfd4: { type: \"input\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tforceKillAfter: \"1 second\",\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst observation = yield* ProcessObservation.observe(child)\n\t\t\t\tconst exited = observation.exited.pipe(\n\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Observing child exit failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst failures = yield* FailureGroup.make<ExecutionError>()\n\t\t\t\tyield* failures.run(\n\t\t\t\t\tobservation.failure.pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Reading child output failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\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\tconst controls = yield* Queue.bounded<string>(4)\n\n\t\t\t\tyield* failures.run(\n\t\t\t\t\tStream.fromQueue(controls).pipe(\n\t\t\t\t\t\tStream.map((line) => new TextEncoder().encode(line + \"\\n\")),\n\t\t\t\t\t\tStream.run(child.getInputFd(4)),\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Child supervision channel failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\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\tconst send = (value: typeof Command.Type) =>\n\t\t\t\t\tEffect.raceFirst(\n\t\t\t\t\t\tSchema.encodeEffect(CommandJson)(value).pipe(\n\t\t\t\t\t\t\tEffect.flatMap((line) => Queue.offer(controls, line)),\n\t\t\t\t\t\t\tEffect.asVoid,\n\t\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Encoding watchdog command failed\",\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\t),\n\t\t\t\t\t\tfailures.await,\n\t\t\t\t\t)\n\t\t\t\tconst peer = yield* Multiplex.make({\n\t\t\t\t\tinput: child\n\t\t\t\t\t\t.getOutputFd(3)\n\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\tStream.mapError((error) =>\n\t\t\t\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\toutput: child.stdin.pipe(\n\t\t\t\t\t\tSink.mapError((error) =>\n\t\t\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t})\n\t\t\t\tconst identity = yield* Processes.identity(child.pid)\n\t\t\t\tyield* Ref.update(peers, HashMap.set(handle.token, peer))\n\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\tRef.update(peers, HashMap.remove(handle.token)),\n\t\t\t\t)\n\t\t\t\treturn {\n\t\t\t\t\tcode: resolved.identity,\n\t\t\t\t\tstart: send({ kind: \"start\" }),\n\t\t\t\t\tidentity,\n\t\t\t\t\texited,\n\t\t\t\t\tinterrupt: send({ kind: \"stop\" }),\n\t\t\t\t\tkill: child.kill({ killSignal: \"SIGKILL\" }).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Killing the child failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\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\trenew: (millis: number) => send({ kind: \"renew\", millis }),\n\t\t\t\t}\n\t\t\t},\n\t\t\tEffect.provideContext(platform),\n\t\t\tEffect.catchTags({\n\t\t\t\tPlatformError: (error) =>\n\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Starting the child failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\tSchemaError: (error) =>\n\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Encoding child bootstrap failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t}),\n\t\t),\n\t})\n\treturn {\n\t\tdriver,\n\t\tpeer: (token: string) =>\n\t\t\tEffect.acquireRelease(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst peer = yield* Ref.get(peers).pipe(\n\t\t\t\t\t\tEffect.flatMap((all) => {\n\t\t\t\t\t\t\tconst peer = HashMap.get(all, token)\n\t\t\t\t\t\t\treturn peer._tag === \"Some\"\n\t\t\t\t\t\t\t\t? Effect.succeed(peer.value)\n\t\t\t\t\t\t\t\t: Effect.fail(\n\t\t\t\t\t\t\t\t\t\tSessionStopped.make({\n\t\t\t\t\t\t\t\t\t\t\tdetail: \"The execution channel is no longer available\",\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\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\tconst occupied = yield* Ref.modify(\n\t\t\t\t\t\tclaimed,\n\t\t\t\t\t\t(all) =>\n\t\t\t\t\t\t\t[HashSet.has(all, token), HashSet.add(all, token)] as const,\n\t\t\t\t\t)\n\t\t\t\t\tif (occupied)\n\t\t\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\t\t\tdetail: \"The instance channel is already attached\",\n\t\t\t\t\t\t})\n\t\t\t\t\treturn peer\n\t\t\t\t}),\n\t\t\t\t() => Ref.update(claimed, HashSet.remove(token)),\n\t\t\t),\n\t}\n})\n\nexport const layer = (root: string) =>\n\tLayer.effectContext(\n\t\tmake(root).pipe(\n\t\t\tEffect.map((execution) =>\n\t\t\t\tContext.make(Execution, execution.driver).pipe(\n\t\t\t\t\tContext.add(Channels, { peer: execution.peer }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t)\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { make } from "../FailureGroup.js";
|
|
2
1
|
import { LocalTerminationTimeout, TransportError } from "../../Errors.js";
|
|
2
|
+
import { make } from "../FailureGroup.js";
|
|
3
3
|
import { make as make$1 } from "../port.js";
|
|
4
4
|
import { stdinExitTimeout } from "./ProcessObservation.js";
|
|
5
5
|
import { Cause, Effect, Fiber, Option } from "effect";
|