@graftland/plugin-remote 0.0.0-stage → 0.3.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/LICENSE +202 -0
- package/README.md +76 -2
- package/README.zh-CN.md +71 -0
- package/README.zh-TW.md +71 -0
- package/dist/Auth-BElTC9_X.js +6 -0
- package/dist/Auth.d.ts +49 -0
- package/dist/Auth.d.ts.map +1 -0
- package/dist/Auth.js +8 -0
- package/dist/Auth.js.map +1 -0
- package/dist/Bootstrap-MCwivGN1.js +9 -0
- package/dist/ConfigDirectory-BCC6q2R4.js +5 -0
- package/dist/Contract-CcpSIJm4.js +121 -0
- package/dist/Contract.d.ts +71 -0
- package/dist/Contract.d.ts.map +1 -0
- package/dist/Contract.js +1 -0
- package/dist/Contract.js.map +1 -0
- package/dist/Errors-oPsTLY7l.js +45 -0
- package/dist/Errors.d.ts +67 -0
- package/dist/Errors.d.ts.map +1 -0
- package/dist/Errors.js +47 -0
- package/dist/Errors.js.map +1 -0
- package/dist/FailureGroup-BcH0XOBi.js +53 -0
- package/dist/Framing-zaYdOJnT.js +61 -0
- package/dist/Graft-BsYq3F-J.js +985 -0
- package/dist/Instance.d.ts +7 -0
- package/dist/Instance.d.ts.map +1 -0
- package/dist/Instance.js +14 -0
- package/dist/Instance.js.map +1 -0
- package/dist/Packages-B1TPk8pa.js +111 -0
- package/dist/Peer-IJgFK6mD.js +342 -0
- package/dist/ProcessObservation-DEGrEMfP.js +38 -0
- package/dist/ServeLifecycle-CJM0gG5B.js +24 -0
- package/dist/Testing.d.ts +26 -0
- package/dist/Testing.d.ts.map +1 -0
- package/dist/Testing.js +69 -0
- package/dist/Testing.js.map +1 -0
- package/dist/Transport-DULzpsgR.js +6 -0
- package/dist/Transport.d.ts +39 -0
- package/dist/Transport.d.ts.map +1 -0
- package/dist/Transport.js +8 -0
- package/dist/Transport.js.map +1 -0
- package/dist/WatchdogProtocol-BZmVxrBP.js +17 -0
- package/dist/_virtual/_rolldown/runtime.js +12 -0
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +28275 -0
- package/dist/bin.js.map +1 -0
- package/dist/childRuntime-DSqtFN9o.js +188 -0
- package/dist/cleanup-BPWr-5U9.js +13 -0
- package/dist/command-9zrHdbwT.js +7 -0
- package/dist/connectionEnded-DUgcobEd.js +9 -0
- package/dist/directTransport-DrexuPSm.js +5 -0
- package/dist/entry-SYsx9VNb.js +708 -0
- package/dist/host/auth/bearer.d.ts +5 -0
- package/dist/host/auth/bearer.d.ts.map +1 -0
- package/dist/host/auth/bearer.js +4 -0
- package/dist/host/auth/bearer.js.map +1 -0
- package/dist/host/auth/jwt.d.ts +5 -0
- package/dist/host/auth/jwt.d.ts.map +1 -0
- package/dist/host/auth/jwt.js +4 -0
- package/dist/host/auth/jwt.js.map +1 -0
- package/dist/host/auth/mtls.d.ts +8 -0
- package/dist/host/auth/mtls.d.ts.map +1 -0
- package/dist/host/auth/mtls.js +34 -0
- package/dist/host/auth/mtls.js.map +1 -0
- package/dist/host/auth/none.d.ts +3 -0
- package/dist/host/auth/none.d.ts.map +1 -0
- package/dist/host/auth/none.js +13 -0
- package/dist/host/auth/none.js.map +1 -0
- package/dist/host/command.d.ts +22 -0
- package/dist/host/command.d.ts.map +1 -0
- package/dist/host/command.js +61 -0
- package/dist/host/command.js.map +1 -0
- package/dist/host/local.d.ts +4 -0
- package/dist/host/local.d.ts.map +1 -0
- package/dist/host/local.js +52 -0
- package/dist/host/local.js.map +1 -0
- package/dist/host/unix.d.ts +11 -0
- package/dist/host/unix.d.ts.map +1 -0
- package/dist/host/unix.js +39 -0
- package/dist/host/unix.js.map +1 -0
- package/dist/host/websocket.d.ts +13 -0
- package/dist/host/websocket.d.ts.map +1 -0
- package/dist/host/websocket.js +36 -0
- package/dist/host/websocket.js.map +1 -0
- package/dist/host/worker.d.ts +4 -0
- package/dist/host/worker.d.ts.map +1 -0
- package/dist/host/worker.js +52 -0
- package/dist/host/worker.js.map +1 -0
- package/dist/importer-D7zSgqxq.js +347 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/Certificates.js +182 -0
- package/dist/internal/Certificates.js.map +1 -0
- package/dist/internal/FailureGroup.js +55 -0
- package/dist/internal/FailureGroup.js.map +1 -0
- package/dist/internal/Limits.d.ts +1 -0
- package/dist/internal/Limits.js +17 -0
- package/dist/internal/Limits.js.map +1 -0
- package/dist/internal/Peer.js +6 -0
- package/dist/internal/Peer.js.map +1 -0
- package/dist/internal/ServeLifecycle.js +26 -0
- package/dist/internal/ServeLifecycle.js.map +1 -0
- package/dist/internal/Supervisor.js +7 -0
- package/dist/internal/Supervisor.js.map +1 -0
- package/dist/internal/assembly.d.ts +5 -0
- package/dist/internal/assembly.js +138 -0
- package/dist/internal/assembly.js.map +1 -0
- package/dist/internal/auth/mtls.js +23 -0
- package/dist/internal/auth/mtls.js.map +1 -0
- package/dist/internal/auth/token.js +19 -0
- package/dist/internal/auth/token.js.map +1 -0
- package/dist/internal/auth/tokenCredentials.d.ts +8 -0
- package/dist/internal/auth/tokenCredentials.d.ts.map +1 -0
- package/dist/internal/auth/tokenCredentials.js +33 -0
- package/dist/internal/auth/tokenCredentials.js.map +1 -0
- package/dist/internal/child.js +125 -0
- package/dist/internal/child.js.map +1 -0
- package/dist/internal/childErrors.d.ts +33 -0
- package/dist/internal/childErrors.d.ts.map +1 -0
- package/dist/internal/childErrors.js +29 -0
- package/dist/internal/childErrors.js.map +1 -0
- package/dist/internal/childRuntime.js +59 -0
- package/dist/internal/childRuntime.js.map +1 -0
- package/dist/internal/cleanup.js +15 -0
- package/dist/internal/cleanup.js.map +1 -0
- package/dist/internal/config.js +6 -0
- package/dist/internal/config.js.map +1 -0
- package/dist/internal/control.js +42 -0
- package/dist/internal/control.js.map +1 -0
- package/dist/internal/credentials.d.ts +44 -0
- package/dist/internal/credentials.d.ts.map +1 -0
- package/dist/internal/credentials.js +54 -0
- package/dist/internal/credentials.js.map +1 -0
- package/dist/internal/directTransport.d.ts +3 -0
- package/dist/internal/directTransport.js +7 -0
- package/dist/internal/directTransport.js.map +1 -0
- package/dist/internal/entry.d.ts +9 -0
- package/dist/internal/entry.d.ts.map +1 -0
- package/dist/internal/entry.js +144 -0
- package/dist/internal/entry.js.map +1 -0
- package/dist/internal/entryConfig.d.ts +202 -0
- package/dist/internal/entryConfig.d.ts.map +1 -0
- package/dist/internal/entryConfig.js +176 -0
- package/dist/internal/entryConfig.js.map +1 -0
- package/dist/internal/execution.d.ts +5 -0
- package/dist/internal/execution.js +43 -0
- package/dist/internal/execution.js.map +1 -0
- package/dist/internal/follow.js +11 -0
- package/dist/internal/follow.js.map +1 -0
- package/dist/internal/forkTree.js +7 -0
- package/dist/internal/forkTree.js.map +1 -0
- package/dist/internal/host/local.js +28 -0
- package/dist/internal/host/local.js.map +1 -0
- package/dist/internal/host/runner.js +100 -0
- package/dist/internal/host/runner.js.map +1 -0
- package/dist/internal/host.js +71 -0
- package/dist/internal/host.js.map +1 -0
- package/dist/internal/importer.js +18 -0
- package/dist/internal/importer.js.map +1 -0
- package/dist/internal/listenerStartup.js +17 -0
- package/dist/internal/listenerStartup.js.map +1 -0
- package/dist/internal/loadModule.js +20 -0
- package/dist/internal/loadModule.js.map +1 -0
- package/dist/internal/platform.js +9 -0
- package/dist/internal/platform.js.map +1 -0
- package/dist/internal/port.d.ts +13 -0
- package/dist/internal/port.d.ts.map +1 -0
- package/dist/internal/port.js +275 -0
- package/dist/internal/port.js.map +1 -0
- package/dist/internal/release.js +25 -0
- package/dist/internal/release.js.map +1 -0
- package/dist/internal/runner/Bootstrap.js +11 -0
- package/dist/internal/runner/Bootstrap.js.map +1 -0
- package/dist/internal/runner/Connection.d.ts +11 -0
- package/dist/internal/runner/Connection.js +56 -0
- package/dist/internal/runner/Connection.js.map +1 -0
- package/dist/internal/runner/Execution.js +115 -0
- package/dist/internal/runner/Execution.js.map +1 -0
- package/dist/internal/runner/Framing.d.ts +11 -0
- package/dist/internal/runner/Framing.d.ts.map +1 -0
- package/dist/internal/runner/Framing.js +63 -0
- package/dist/internal/runner/Framing.js.map +1 -0
- package/dist/internal/runner/Local.js +46 -0
- package/dist/internal/runner/Local.js.map +1 -0
- package/dist/internal/runner/Lock.js +25 -0
- package/dist/internal/runner/Lock.js.map +1 -0
- package/dist/internal/runner/Multiplex.d.ts +5 -0
- package/dist/internal/runner/Multiplex.js +49 -0
- package/dist/internal/runner/Multiplex.js.map +1 -0
- package/dist/internal/runner/Packages.d.ts +3 -0
- package/dist/internal/runner/Packages.js +108 -0
- package/dist/internal/runner/Packages.js.map +1 -0
- package/dist/internal/runner/ProcessObservation.js +40 -0
- package/dist/internal/runner/ProcessObservation.js.map +1 -0
- package/dist/internal/runner/Processes.js +83 -0
- package/dist/internal/runner/Processes.js.map +1 -0
- package/dist/internal/runner/Retention.js +13 -0
- package/dist/internal/runner/Retention.js.map +1 -0
- package/dist/internal/runner/Store.js +78 -0
- package/dist/internal/runner/Store.js.map +1 -0
- package/dist/internal/runner/Supervisor.js +375 -0
- package/dist/internal/runner/Supervisor.js.map +1 -0
- package/dist/internal/runner/Watchdog.js +47 -0
- package/dist/internal/runner/Watchdog.js.map +1 -0
- package/dist/internal/runner/WatchdogProtocol.js +19 -0
- package/dist/internal/runner/WatchdogProtocol.js.map +1 -0
- package/dist/internal/runner/Wire.d.ts +5 -0
- package/dist/internal/runner/Wire.js +64 -0
- package/dist/internal/runner/Wire.js.map +1 -0
- package/dist/internal/runner/accept.js +57 -0
- package/dist/internal/runner/accept.js.map +1 -0
- package/dist/internal/runner/command.js +9 -0
- package/dist/internal/runner/command.js.map +1 -0
- package/dist/internal/runner/connectionEnded.js +11 -0
- package/dist/internal/runner/connectionEnded.js.map +1 -0
- package/dist/internal/runner/model.d.ts +17 -0
- package/dist/internal/runner/model.d.ts.map +1 -0
- package/dist/internal/runner/model.js +231 -0
- package/dist/internal/runner/model.js.map +1 -0
- package/dist/internal/serve.js +60 -0
- package/dist/internal/serve.js.map +1 -0
- package/dist/internal/services.d.ts +18 -0
- package/dist/internal/services.d.ts.map +1 -0
- package/dist/internal/services.js +22 -0
- package/dist/internal/services.js.map +1 -0
- package/dist/internal/socketChannel.js +24 -0
- package/dist/internal/socketChannel.js.map +1 -0
- package/dist/internal/stdioChannel.js +23 -0
- package/dist/internal/stdioChannel.js.map +1 -0
- package/dist/internal/supervisorPlugin.js +1 -0
- package/dist/internal/supervisorPlugin.js.map +1 -0
- package/dist/internal/transportOptions.d.ts +18 -0
- package/dist/internal/transportOptions.d.ts.map +1 -0
- package/dist/internal/watchdogMain.d.ts +1 -0
- package/dist/internal/watchdogMain.js +55 -0
- package/dist/internal/watchdogMain.js.map +1 -0
- package/dist/internal/websocket.js +46 -0
- package/dist/internal/websocket.js.map +1 -0
- package/dist/internal/websocketServer.js +61 -0
- package/dist/internal/websocketServer.js.map +1 -0
- package/dist/internal/workerBootstrap.js +9 -0
- package/dist/internal/workerBootstrap.js.map +1 -0
- package/dist/internal/workerChannel.js +24 -0
- package/dist/internal/workerChannel.js.map +1 -0
- package/dist/internal/workerMain.d.ts +1 -0
- package/dist/internal/workerMain.js +18 -0
- package/dist/internal/workerMain.js.map +1 -0
- package/dist/port-Blbh8tms.js +285 -0
- package/dist/release-BY4Mlluy.js +23 -0
- package/dist/rolldown-runtime-DYf_mQCB.js +34 -0
- package/dist/runner/auth/bearer.d.ts +7 -0
- package/dist/runner/auth/bearer.d.ts.map +1 -0
- package/dist/runner/auth/bearer.js +42 -0
- package/dist/runner/auth/bearer.js.map +1 -0
- package/dist/runner/auth/jwt.d.ts +19 -0
- package/dist/runner/auth/jwt.d.ts.map +1 -0
- package/dist/runner/auth/jwt.js +65 -0
- package/dist/runner/auth/jwt.js.map +1 -0
- package/dist/runner/auth/mtls.d.ts +11 -0
- package/dist/runner/auth/mtls.d.ts.map +1 -0
- package/dist/runner/auth/mtls.js +48 -0
- package/dist/runner/auth/mtls.js.map +1 -0
- package/dist/runner/auth/none.d.ts +3 -0
- package/dist/runner/auth/none.d.ts.map +1 -0
- package/dist/runner/auth/none.js +13 -0
- package/dist/runner/auth/none.js.map +1 -0
- package/dist/runner/index.d.ts +3 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +71 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/stdio.d.ts +7 -0
- package/dist/runner/stdio.d.ts.map +1 -0
- package/dist/runner/stdio.js +39 -0
- package/dist/runner/stdio.js.map +1 -0
- package/dist/runner/unix.d.ts +7 -0
- package/dist/runner/unix.d.ts.map +1 -0
- package/dist/runner/unix.js +42 -0
- package/dist/runner/unix.js.map +1 -0
- package/dist/runner/websocket.d.ts +28 -0
- package/dist/runner/websocket.d.ts.map +1 -0
- package/dist/runner/websocket.js +77 -0
- package/dist/runner/websocket.js.map +1 -0
- package/dist/socketChannel-KmtzF-9G.js +3658 -0
- package/dist/supervisorPlugin-Inb1S5IV.js +737 -0
- package/dist/token-v5ne2I0-.js +17 -0
- package/dist/tokenCredentials-WUJm2AKm.js +31 -0
- package/dist/websocketServer-MXcCJx0v.js +58 -0
- package/dist/workerChannel-P82YdNjh.js +27 -0
- package/package.json +69 -3
- package/src/Auth.ts +62 -0
- package/src/Contract.ts +100 -0
- package/src/Errors.ts +82 -0
- package/src/Instance.ts +12 -0
- package/src/Testing.ts +135 -0
- package/src/Transport.ts +52 -0
- package/src/bin.ts +145 -0
- package/src/host/auth/bearer.ts +10 -0
- package/src/host/auth/jwt.ts +10 -0
- package/src/host/auth/mtls.ts +48 -0
- package/src/host/auth/none.ts +13 -0
- package/src/host/command.ts +131 -0
- package/src/host/local.ts +41 -0
- package/src/host/unix.ts +65 -0
- package/src/host/websocket.ts +66 -0
- package/src/host/worker.ts +90 -0
- package/src/index.ts +115 -0
- package/src/internal/Certificates.ts +330 -0
- package/src/internal/FailureGroup.ts +176 -0
- package/src/internal/Limits.ts +12 -0
- package/src/internal/Peer.ts +4 -0
- package/src/internal/ServeLifecycle.ts +53 -0
- package/src/internal/Supervisor.ts +14 -0
- package/src/internal/assembly.ts +337 -0
- package/src/internal/auth/mtls.ts +40 -0
- package/src/internal/auth/token.ts +26 -0
- package/src/internal/auth/tokenCredentials.ts +65 -0
- package/src/internal/child.ts +323 -0
- package/src/internal/childErrors.ts +44 -0
- package/src/internal/childRuntime.ts +111 -0
- package/src/internal/cleanup.ts +34 -0
- package/src/internal/config.ts +8 -0
- package/src/internal/control.ts +49 -0
- package/src/internal/credentials.ts +112 -0
- package/src/internal/directTransport.ts +38 -0
- package/src/internal/entry.ts +288 -0
- package/src/internal/entryConfig.ts +190 -0
- package/src/internal/execution.ts +121 -0
- package/src/internal/follow.ts +17 -0
- package/src/internal/forkTree.ts +13 -0
- package/src/internal/host/local.ts +53 -0
- package/src/internal/host/runner.ts +187 -0
- package/src/internal/host.ts +209 -0
- package/src/internal/importer.ts +27 -0
- package/src/internal/listenerStartup.ts +55 -0
- package/src/internal/loadModule.ts +23 -0
- package/src/internal/platform.ts +12 -0
- package/src/internal/port.ts +623 -0
- package/src/internal/release.ts +71 -0
- package/src/internal/runner/Bootstrap.ts +9 -0
- package/src/internal/runner/Connection.ts +184 -0
- package/src/internal/runner/Execution.ts +244 -0
- package/src/internal/runner/Framing.ts +122 -0
- package/src/internal/runner/Local.ts +73 -0
- package/src/internal/runner/Lock.ts +29 -0
- package/src/internal/runner/Multiplex.ts +120 -0
- package/src/internal/runner/Packages.ts +178 -0
- package/src/internal/runner/ProcessObservation.ts +63 -0
- package/src/internal/runner/Processes.ts +109 -0
- package/src/internal/runner/Retention.ts +49 -0
- package/src/internal/runner/Store.ts +160 -0
- package/src/internal/runner/Supervisor.ts +901 -0
- package/src/internal/runner/Watchdog.ts +83 -0
- package/src/internal/runner/WatchdogProtocol.ts +12 -0
- package/src/internal/runner/Wire.ts +99 -0
- package/src/internal/runner/accept.ts +103 -0
- package/src/internal/runner/command.ts +15 -0
- package/src/internal/runner/connectionEnded.ts +28 -0
- package/src/internal/runner/model.ts +364 -0
- package/src/internal/serve.ts +117 -0
- package/src/internal/services.ts +74 -0
- package/src/internal/socketChannel.ts +64 -0
- package/src/internal/stdioChannel.ts +25 -0
- package/src/internal/supervisorPlugin.ts +67 -0
- package/src/internal/transportOptions.ts +17 -0
- package/src/internal/watchdogMain.ts +72 -0
- package/src/internal/websocket.ts +81 -0
- package/src/internal/websocketServer.ts +152 -0
- package/src/internal/workerBootstrap.ts +6 -0
- package/src/internal/workerChannel.ts +54 -0
- package/src/internal/workerMain.ts +23 -0
- package/src/runner/auth/bearer.ts +66 -0
- package/src/runner/auth/jwt.ts +114 -0
- package/src/runner/auth/mtls.ts +37 -0
- package/src/runner/auth/none.ts +13 -0
- package/src/runner/index.ts +97 -0
- package/src/runner/stdio.ts +76 -0
- package/src/runner/unix.ts +53 -0
- package/src/runner/websocket.ts +143 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"follow.js","names":[],"sources":["../../src/internal/follow.ts"],"sourcesContent":["import { Plugin, type Fork, type Graft } from \"@graftland/graft\"\nimport { Effect, Stream, type Cause, type Schema } from \"effect\"\n\n/** Follow startup and later failures without changing the caller's error boundary. */\nexport const follow = Effect.fnUntraced(function* <I, E, F>(\n\tfork: Fork.Fork<I, E>,\n\tfail: (cause: Cause.Cause<E | Schema.SchemaError>) => Effect.Effect<never, F>,\n): Effect.fn.Return<void, F, Graft.Graft | Plugin.Tasks<F>> {\n\tyield* fork.await.pipe(Effect.catchCause(fail))\n\tyield* Plugin.fork(\n\t\tfork.state.pipe(\n\t\t\tStream.runForEach((state) =>\n\t\t\t\tstate._tag === \"Failed\" ? fail(state.cause) : Effect.void,\n\t\t\t),\n\t\t),\n\t)\n})\n"],"mappings":";;;;AAIA,MAAa,SAAS,OAAO,WAAW,WACvC,MACA,MAC2D;CAC3D,OAAO,KAAK,MAAM,KAAK,OAAO,WAAW,IAAI,CAAC;CAC9C,OAAO,OAAO,KACb,KAAK,MAAM,KACV,OAAO,YAAY,UAClB,MAAM,SAAS,WAAW,KAAK,MAAM,KAAK,IAAI,OAAO,IACtD,CACD,CACD;AACD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Array, Option } from "effect";
|
|
2
|
+
// src/internal/forkTree.ts
|
|
3
|
+
const findSubtree = (trees, id) => Array.findFirst(trees, (tree) => tree.id === id ? Option.some(tree) : findSubtree(tree.children, id));
|
|
4
|
+
const isSubtreeActive = (tree) => tree.state._tag === "Active" && Array.every(tree.children, isSubtreeActive);
|
|
5
|
+
export { findSubtree, isSubtreeActive };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=forkTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forkTree.js","names":[],"sources":["../../src/internal/forkTree.ts"],"sourcesContent":["import type { Fork } from \"@graftland/graft\"\nimport { Array, Option } from \"effect\"\n\nexport const findSubtree = (\n\ttrees: ReadonlyArray<Fork.ForkTree>,\n\tid: number,\n): Option.Option<Fork.ForkTree> =>\n\tArray.findFirst(trees, (tree) =>\n\t\ttree.id === id ? Option.some(tree) : findSubtree(tree.children, id),\n\t)\n\nexport const isSubtreeActive = (tree: Fork.ForkTree): boolean =>\n\ttree.state._tag === \"Active\" && Array.every(tree.children, isSubtreeActive)\n"],"mappings":";;AAGA,MAAa,eACZ,OACA,OAEA,MAAM,UAAU,QAAQ,SACvB,KAAK,OAAO,KAAK,OAAO,KAAK,IAAI,IAAI,YAAY,KAAK,UAAU,EAAE,CACnE;AAED,MAAa,mBAAmB,SAC/B,KAAK,MAAM,SAAS,YAAY,MAAM,MAAM,KAAK,UAAU,eAAe"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ProcessExited, TransportError } from "../../Errors.js";
|
|
2
|
+
import { observe as observe$1 } from "../runner/ProcessObservation.js";
|
|
3
|
+
import { Cause, Effect, Fiber, Option, Sink, Stream } from "effect";
|
|
4
|
+
// src/internal/host/local.ts
|
|
5
|
+
const observe = Effect.fnUntraced(function* (child) {
|
|
6
|
+
const observation = yield* observe$1(child);
|
|
7
|
+
const exited = yield* observation.exited.pipe(Effect.mapBoth({
|
|
8
|
+
onFailure: (error) => TransportError.make({ cause: Cause.fail(error) }),
|
|
9
|
+
onSuccess: (status) => ProcessExited.make({
|
|
10
|
+
pid: Option.some(child.pid),
|
|
11
|
+
exitCode: status.code,
|
|
12
|
+
stderr: status.stderr,
|
|
13
|
+
statusCause: status.cause
|
|
14
|
+
})
|
|
15
|
+
}), Effect.forkScoped);
|
|
16
|
+
return {
|
|
17
|
+
pid: Option.some(child.pid),
|
|
18
|
+
exited: Fiber.join(exited),
|
|
19
|
+
failure: observation.failure.pipe(Effect.mapError((error) => TransportError.make({ cause: Cause.fail(error) }))),
|
|
20
|
+
channel: {
|
|
21
|
+
input: child.getOutputFd(3).pipe(Stream.concat(Stream.fromEffect(Fiber.join(exited).pipe(Effect.timeoutOption("1 second"), Effect.asVoid)).pipe(Stream.drain)), Stream.mapError((error) => TransportError.make({ cause: Cause.fail(error) }))),
|
|
22
|
+
output: child.stdin.pipe(Sink.mapError((error) => TransportError.make({ cause: Cause.fail(error) })))
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
export { observe };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +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":";;;;AAKA,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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { make } from "../FailureGroup.js";
|
|
2
|
+
import { connectWith } from "../assembly.js";
|
|
3
|
+
import { defaults } from "../Limits.js";
|
|
4
|
+
import { ProcessExited, TransportError } from "../../Errors.js";
|
|
5
|
+
import { cleanupCause } from "../cleanup.js";
|
|
6
|
+
import { make as make$1 } from "../port.js";
|
|
7
|
+
import { make as make$2 } from "../runner/Multiplex.js";
|
|
8
|
+
import { verify } from "../runner/Packages.js";
|
|
9
|
+
import { Session, channel } from "../runner/Wire.js";
|
|
10
|
+
import { awaitTermination, childOf } from "../runner/model.js";
|
|
11
|
+
import { Cause, Duration, Effect, Exit, Fiber, Option, Ref, Scope } from "effect";
|
|
12
|
+
import { RpcClient } from "effect/rpc";
|
|
13
|
+
// src/internal/host/runner.ts
|
|
14
|
+
const connect = (target, contractModule, options, resources, processScope) => Effect.gen(function* () {
|
|
15
|
+
const instance = target.instance;
|
|
16
|
+
const margin = Duration.toMillis(target.margin ?? "5 seconds");
|
|
17
|
+
const channel$1 = yield* connectWith(target.explicitAuth).pipe(Scope.provide(processScope));
|
|
18
|
+
const mux = yield* make$2(channel$1).pipe(Scope.provide(resources));
|
|
19
|
+
const control = yield* make$1(channel(mux, 0), {
|
|
20
|
+
session: "session-v1",
|
|
21
|
+
serve: {},
|
|
22
|
+
call: { session: Session }
|
|
23
|
+
}).pipe(Scope.provide(resources));
|
|
24
|
+
const session = yield* RpcClient.make(Session).pipe(Effect.provideService(RpcClient.Protocol, control.clientProtocol("session")), Scope.provide(resources));
|
|
25
|
+
const expectedGeneration = yield* session.HighWater({ instance });
|
|
26
|
+
const record = yield* session.Open({
|
|
27
|
+
instance,
|
|
28
|
+
expectedGeneration,
|
|
29
|
+
requestId: options.session,
|
|
30
|
+
limits: defaults,
|
|
31
|
+
...target.lease === void 0 ? {} : { leaseMillis: Duration.toMillis(target.lease) }
|
|
32
|
+
});
|
|
33
|
+
const failures = yield* make().pipe(Scope.provide(resources));
|
|
34
|
+
const finishStarted = yield* Ref.make(false);
|
|
35
|
+
const terminate = yield* Effect.cached(Effect.gen(function* () {
|
|
36
|
+
yield* Ref.set(finishStarted, true);
|
|
37
|
+
yield* failures.close;
|
|
38
|
+
const result = yield* awaitTermination(record.handle, session.Dispose(record.handle), record.leaseMillis, margin);
|
|
39
|
+
const { code, signal, stderr, cause } = result.exit;
|
|
40
|
+
yield* Effect.logInfo("Remote execution terminated", {
|
|
41
|
+
code,
|
|
42
|
+
...signal === null ? {} : { signal },
|
|
43
|
+
...stderr === void 0 || stderr === "" ? {} : { stderr },
|
|
44
|
+
...cause === void 0 || cause.reasons.length === 0 ? {} : { cause }
|
|
45
|
+
}).pipe(Effect.annotateLogs({
|
|
46
|
+
"remote.instance": record.handle.key.instance,
|
|
47
|
+
"remote.generation": record.handle.generation,
|
|
48
|
+
"remote.termination": result.kind
|
|
49
|
+
}));
|
|
50
|
+
if (result.cause.reasons.length > 0) return yield* Effect.failCause(cleanupCause(result.cause));
|
|
51
|
+
}));
|
|
52
|
+
yield* Scope.addFinalizer(processScope, Effect.gen(function* () {
|
|
53
|
+
if (!(yield* Ref.get(finishStarted))) yield* terminate.pipe(Effect.catchCause((cause) => Effect.failCause(cleanupCause(cause))));
|
|
54
|
+
}));
|
|
55
|
+
const renewed = yield* Effect.forever(Effect.sleep(record.leaseMillis / 3).pipe(Effect.andThen(session.Renew(record.handle)))).pipe(Effect.forkIn(resources));
|
|
56
|
+
const code = yield* session.Load({
|
|
57
|
+
handle: record.handle,
|
|
58
|
+
specifier: contractModule,
|
|
59
|
+
digest: target.expect?.digest !== void 0
|
|
60
|
+
});
|
|
61
|
+
yield* verify(code, target.expect);
|
|
62
|
+
const loaded = yield* session.Status(record.handle);
|
|
63
|
+
const peer = yield* make$1(channel(mux, 1), {
|
|
64
|
+
...options,
|
|
65
|
+
session: record.handle.token,
|
|
66
|
+
limits: record.limits
|
|
67
|
+
}).pipe(Scope.provide(resources));
|
|
68
|
+
const report = (cause) => Cause.hasInterruptsOnly(cause) ? Effect.void : failures.failCause(Cause.map(cause, (error) => TransportError.make({ cause: Cause.fail(error) })));
|
|
69
|
+
yield* failures.await.pipe(Effect.catchCause((cause) => Cause.hasInterruptsOnly(cause) ? Effect.void : peer.fail(TransportError.make({ cause }))), Effect.forkIn(resources));
|
|
70
|
+
yield* failures.run(Fiber.join(renewed).pipe(Effect.catchCause((cause) => Effect.gen(function* () {
|
|
71
|
+
if (Cause.hasInterruptsOnly(cause)) return;
|
|
72
|
+
const status = yield* Effect.exit(session.Status(record.handle).pipe(Effect.timeout("5 seconds")));
|
|
73
|
+
if (Exit.isSuccess(status) && status.value.phase === "Stopped") {
|
|
74
|
+
const exit = status.value.termination.exit;
|
|
75
|
+
yield* report(Cause.combine(cause, Cause.fail(ProcessExited.make({
|
|
76
|
+
pid: Option.map(childOf(loaded), (child) => child.pid),
|
|
77
|
+
exitCode: exit.code,
|
|
78
|
+
stderr: exit.stderr ?? "",
|
|
79
|
+
statusCause: exit.cause ?? Cause.empty
|
|
80
|
+
}))));
|
|
81
|
+
} else yield* report(Exit.isFailure(status) ? Cause.combine(cause, status.cause) : cause);
|
|
82
|
+
}))));
|
|
83
|
+
return {
|
|
84
|
+
resources,
|
|
85
|
+
pid: Option.map(childOf(loaded), (child) => child.pid),
|
|
86
|
+
diagnostics: failures.cause,
|
|
87
|
+
terminate: () => Effect.gen(function* () {
|
|
88
|
+
yield* Fiber.interrupt(renewed);
|
|
89
|
+
yield* terminate;
|
|
90
|
+
}),
|
|
91
|
+
transport: {
|
|
92
|
+
...peer,
|
|
93
|
+
failure: peer.await,
|
|
94
|
+
report
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
export { connect };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +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 * as FailureGroup from \"../FailureGroup\"\nimport {\n\tCause,\n\tEffect,\n\tDuration,\n\tExit,\n\tFiber,\n\tOption,\n\tRef,\n\tScope,\n} from \"effect\"\nimport { RpcClient } from \"effect/rpc\"\nimport { connectWith as connectCapability } from \"../assembly\"\nimport type { ConfiguredRunner, Connected } from \"../runner/Connection\"\nimport { ProcessExited, TransportError } from \"../../Errors\"\nimport { cleanupCause } from \"../cleanup\"\nimport * as Port from \"../port\"\nimport * as Multiplex from \"../runner/Multiplex\"\nimport * as Packages from \"../runner/Packages\"\nimport * as Wire from \"../runner/Wire\"\nimport { awaitTermination, defaults, childOf } from \"../runner/model\"\nexport const connect = (\n\ttarget: ConfiguredRunner,\n\tcontractModule: string,\n\toptions: Port.Options,\n\tresources: Scope.Scope,\n\tprocessScope: Scope.Scope,\n) =>\n\tEffect.gen(function* () {\n\t\tconst instance = target.instance\n\n\t\tconst margin = Duration.toMillis(target.margin ?? \"5 seconds\")\n\t\tconst channel = yield* connectCapability(target.explicitAuth).pipe(\n\t\t\tScope.provide(processScope),\n\t\t)\n\t\tconst mux = yield* Multiplex.make(channel).pipe(Scope.provide(resources))\n\t\tconst control = yield* Port.make(Wire.channel(mux, 0), {\n\t\t\tsession: \"session-v1\",\n\t\t\tserve: {},\n\t\t\tcall: { session: Wire.Session },\n\t\t}).pipe(Scope.provide(resources))\n\t\tconst session = yield* RpcClient.make(Wire.Session).pipe(\n\t\t\tEffect.provideService(\n\t\t\t\tRpcClient.Protocol,\n\t\t\t\tcontrol.clientProtocol(\"session\"),\n\t\t\t),\n\t\t\tScope.provide(resources),\n\t\t)\n\t\tconst expectedGeneration = yield* session.HighWater({ instance })\n\t\tconst record = yield* session.Open({\n\t\t\tinstance,\n\t\t\texpectedGeneration,\n\t\t\trequestId: options.session,\n\t\t\tlimits: defaults,\n\t\t\t...(target.lease === undefined\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tleaseMillis: Duration.toMillis(target.lease),\n\t\t\t\t\t}),\n\t\t})\n\t\tconst failures = yield* FailureGroup.make<TransportError>().pipe(\n\t\t\tScope.provide(resources),\n\t\t)\n\t\tconst finishStarted = yield* Ref.make(false)\n\t\tconst terminate = yield* Effect.cached(\n\t\t\tEffect.gen(function* () {\n\t\t\t\tyield* Ref.set(finishStarted, true)\n\t\t\t\tyield* failures.close\n\t\t\t\tconst result = yield* awaitTermination(\n\t\t\t\t\trecord.handle,\n\t\t\t\t\tsession.Dispose(record.handle),\n\t\t\t\t\trecord.leaseMillis,\n\t\t\t\t\tmargin,\n\t\t\t\t)\n\t\t\t\tconst { code, signal, stderr, cause } = result.exit\n\t\t\t\tyield* Effect.logInfo(\"Remote execution terminated\", {\n\t\t\t\t\tcode,\n\t\t\t\t\t...(signal === null ? {} : { signal }),\n\t\t\t\t\t...(stderr === undefined || stderr === \"\" ? {} : { stderr }),\n\t\t\t\t\t...(cause === undefined || cause.reasons.length === 0\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { cause }),\n\t\t\t\t}).pipe(\n\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\"remote.instance\": record.handle.key.instance,\n\t\t\t\t\t\t\"remote.generation\": record.handle.generation,\n\t\t\t\t\t\t\"remote.termination\": result.kind,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tif (result.cause.reasons.length > 0)\n\t\t\t\t\treturn yield* Effect.failCause(cleanupCause(result.cause))\n\t\t\t}),\n\t\t)\n\t\tyield* Scope.addFinalizer(\n\t\t\tprocessScope,\n\t\t\tEffect.gen(function* () {\n\t\t\t\tif (!(yield* Ref.get(finishStarted)))\n\t\t\t\t\tyield* terminate.pipe(\n\t\t\t\t\t\tEffect.catchCause((cause) => Effect.failCause(cleanupCause(cause))),\n\t\t\t\t\t)\n\t\t\t}),\n\t\t)\n\t\tconst renewed = yield* Effect.forever(\n\t\t\tEffect.sleep(record.leaseMillis / 3).pipe(\n\t\t\t\tEffect.andThen(session.Renew(record.handle)),\n\t\t\t),\n\t\t).pipe(Effect.forkIn(resources))\n\t\tconst code = yield* session.Load({\n\t\t\thandle: record.handle,\n\t\t\tspecifier: contractModule,\n\t\t\tdigest: target.expect?.digest !== undefined,\n\t\t})\n\t\tyield* Packages.verify(code, target.expect)\n\t\tconst loaded = yield* session.Status(record.handle)\n\t\tconst peer = yield* Port.make(Wire.channel(mux, 1), {\n\t\t\t...options,\n\t\t\tsession: record.handle.token,\n\t\t\tlimits: record.limits,\n\t\t}).pipe(Scope.provide(resources))\n\t\t// RPC forwarding cancellation is expected; resource cleanup is collected by Connection's scopes.\n\t\tconst report = (cause: Cause.Cause<unknown>) =>\n\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t? Effect.void\n\t\t\t\t: failures.failCause(\n\t\t\t\t\t\tCause.map(cause, (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\tyield* failures.await.pipe(\n\t\t\tEffect.catchCause((cause) =>\n\t\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t\t? Effect.void\n\t\t\t\t\t: peer.fail(TransportError.make({ cause })),\n\t\t\t),\n\t\t\tEffect.forkIn(resources),\n\t\t)\n\n\t\tyield* failures.run(\n\t\t\tFiber.join(renewed).pipe(\n\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tif (Cause.hasInterruptsOnly(cause)) return\n\t\t\t\t\t\tconst status = yield* Effect.exit(\n\t\t\t\t\t\t\tsession.Status(record.handle).pipe(Effect.timeout(\"5 seconds\")),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (Exit.isSuccess(status) && status.value.phase === \"Stopped\") {\n\t\t\t\t\t\t\tconst exit = status.value.termination.exit\n\t\t\t\t\t\t\tyield* report(\n\t\t\t\t\t\t\t\tCause.combine(\n\t\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t\t\tCause.fail(\n\t\t\t\t\t\t\t\t\t\tProcessExited.make({\n\t\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\t\texitCode: exit.code,\n\t\t\t\t\t\t\t\t\t\t\tstderr: exit.stderr ?? \"\",\n\t\t\t\t\t\t\t\t\t\t\tstatusCause: exit.cause ?? Cause.empty,\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\t\t),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tyield* report(\n\t\t\t\t\t\t\t\tExit.isFailure(status)\n\t\t\t\t\t\t\t\t\t? Cause.combine(cause, status.cause)\n\t\t\t\t\t\t\t\t\t: cause,\n\t\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\treturn {\n\t\t\tresources,\n\t\t\tpid: Option.map(childOf(loaded), (child) => child.pid),\n\t\t\tdiagnostics: failures.cause,\n\t\t\tterminate: () =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t// No renewal may extend a disconnected session while termination waits out its lease.\n\t\t\t\t\tyield* Fiber.interrupt(renewed)\n\t\t\t\t\tyield* terminate\n\t\t\t\t}),\n\t\t\ttransport: {\n\t\t\t\t...peer,\n\t\t\t\tfailure: peer.await,\n\t\t\t\treport,\n\t\t\t},\n\t\t} satisfies Connected\n\t})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { make } from "./FailureGroup.js";
|
|
2
|
+
import { RemoteWithdrawn } from "../Errors.js";
|
|
3
|
+
import { endpoint } from "./control.js";
|
|
4
|
+
import { cleanupCause } from "./cleanup.js";
|
|
5
|
+
import { Connection } from "./runner/Connection.js";
|
|
6
|
+
import { Array, Cause, Deferred, Effect, Option, Ref, Scope, Stream } from "effect";
|
|
7
|
+
import { RpcClient } from "effect/rpc";
|
|
8
|
+
// src/internal/host.ts
|
|
9
|
+
const race = (connection, effect) => Effect.raceFirst(effect, connection.transport.failure);
|
|
10
|
+
const forwardEvents = (contract, client, connection) => Effect.gen(function* () {
|
|
11
|
+
const stopped = yield* Deferred.make();
|
|
12
|
+
const remoteFailure = yield* make();
|
|
13
|
+
return {
|
|
14
|
+
stopped,
|
|
15
|
+
remoteFailure,
|
|
16
|
+
events: yield* race(connection, client.Events().pipe(Stream.runForEach((event) => {
|
|
17
|
+
switch (event._tag) {
|
|
18
|
+
case "Stopped": return Deferred.succeed(stopped, void 0);
|
|
19
|
+
case "Withdrawing": return remoteFailure.fail(RemoteWithdrawn.make({}));
|
|
20
|
+
case "Failed": return contract.decodeCause(event.cause).pipe(Effect.flatMap((cause) => remoteFailure.failCause(cause)));
|
|
21
|
+
}
|
|
22
|
+
}))).pipe(Effect.tapCause(connection.transport.report), Effect.forkIn(connection.resources))
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
const forwardLogs = (contract, client, connection) => Effect.gen(function* () {
|
|
26
|
+
const logsEnded = yield* Deferred.make();
|
|
27
|
+
const reportedDrops = yield* Ref.make(0);
|
|
28
|
+
yield* race(connection, client.Logs().pipe(Stream.runForEach((event) => Effect.gen(function* () {
|
|
29
|
+
const previous = yield* Ref.getAndSet(reportedDrops, event.dropped);
|
|
30
|
+
if (event.dropped > previous) yield* Effect.logWarning("Remote logs were dropped").pipe(Effect.annotateLogs({
|
|
31
|
+
...Option.isSome(connection.pid) ? { "remote.pid": connection.pid.value } : {},
|
|
32
|
+
"remote.logs.dropped": event.dropped - previous,
|
|
33
|
+
"remote.logs.droppedTotal": event.dropped
|
|
34
|
+
}));
|
|
35
|
+
if (event._tag === "LogsEnded") {
|
|
36
|
+
yield* Deferred.succeed(logsEnded, void 0);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const entry = event.entry;
|
|
40
|
+
const cause = yield* contract.decodeCause(entry.cause);
|
|
41
|
+
yield* Effect.logWithLevel(entry.level === "All" || entry.level === "None" ? "Info" : entry.level)(...Array.isArray(entry.message) ? entry.message : [entry.message], cause).pipe(Effect.annotateLogs({
|
|
42
|
+
...Option.isSome(connection.pid) ? { "remote.pid": connection.pid.value } : {},
|
|
43
|
+
...connection.threadId === void 0 ? {} : { "remote.threadId": connection.threadId },
|
|
44
|
+
"remote.annotations": entry.annotations
|
|
45
|
+
}));
|
|
46
|
+
})))).pipe(Effect.tapCause(connection.transport.report), Effect.forkIn(connection.resources));
|
|
47
|
+
return logsEnded;
|
|
48
|
+
});
|
|
49
|
+
const initialize = (contract) => Effect.gen(function* () {
|
|
50
|
+
const connection = yield* Connection;
|
|
51
|
+
const client = yield* RpcClient.make(contract.control).pipe(Effect.provideService(RpcClient.Protocol, connection.transport.clientProtocol(endpoint)), Scope.provide(connection.resources));
|
|
52
|
+
for (const service of contract.inject) yield* service.serve(connection.transport).pipe(Effect.tapCause(connection.transport.report), Effect.forkIn(connection.resources));
|
|
53
|
+
const events = yield* forwardEvents(contract, client, connection);
|
|
54
|
+
const logsEnded = yield* forwardLogs(contract, client, connection);
|
|
55
|
+
return {
|
|
56
|
+
connection,
|
|
57
|
+
client,
|
|
58
|
+
...events,
|
|
59
|
+
logsEnded
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
const load = (active, input) => race(active.connection, Effect.raceFirst(active.client.Load({ input }).pipe(Effect.catchIf((cause) => Cause.isCause(cause), Effect.failCause)), active.remoteFailure.await));
|
|
63
|
+
const dispose = (active) => Effect.gen(function* () {
|
|
64
|
+
const result = yield* race(active.connection, active.client.Dispose().pipe(Effect.catchIf(Cause.isCause, Effect.succeed)));
|
|
65
|
+
const cause = Cause.isCause(result) ? result : Cause.empty;
|
|
66
|
+
yield* race(active.connection, Deferred.await(active.stopped).pipe(Effect.andThen(Deferred.await(active.logsEnded)))).pipe(Effect.onError(() => Effect.failCause(cleanupCause(cause))));
|
|
67
|
+
return cause;
|
|
68
|
+
});
|
|
69
|
+
export { dispose, initialize, load };
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","names":["FailureGroup.make","Control.endpoint"],"sources":["../../src/internal/host.ts"],"sourcesContent":["import * as FailureGroup from \"./FailureGroup\"\nimport * as ContractModule from \"../Contract\"\nimport {\n\tCause,\n\tArray,\n\tDeferred,\n\tEffect,\n\tRef,\n\tOption,\n\tSchema,\n\tScope,\n\tStream,\n} from \"effect\"\nimport { RpcClient, type RpcClientError } from \"effect/rpc\"\nimport { RemoteWithdrawn } from \"../Errors\"\nimport * as Control from \"./control\"\nimport { cleanupCause } from \"./cleanup\"\nimport { Connection } from \"./runner/Connection\"\nimport type { Service } from \"./services\"\n\ntype ErrorSchema = Schema.Top & {\n\treadonly DecodingServices: never\n\treadonly EncodingServices: never\n}\ntype ControlGroup<E extends ErrorSchema> = ContractModule.Contract<\n\tSchema.Codec<unknown, Schema.Json>,\n\tE\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<\n\t\t\tE[\"Type\"] | ContractModule.UndeclaredFailure | ContractModule.ChildFailure\n\t\t>,\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 = <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n\tclient: Client<E>,\n\tconnection: Connection[\"Service\"],\n) =>\n\tEffect.gen(function* () {\n\t\tconst stopped = yield* Deferred.make<void>()\n\t\tconst remoteFailure = yield* FailureGroup.make<\n\t\t\t| E[\"Type\"]\n\t\t\t| ContractModule.UndeclaredFailure\n\t\t\t| ContractModule.ChildFailure\n\t\t\t| RemoteWithdrawn\n\t\t>()\n\t\tconst events = yield* race(\n\t\t\tconnection,\n\t\t\tclient.Events().pipe(\n\t\t\t\tStream.runForEach((event) => {\n\t\t\t\t\tswitch (event._tag) {\n\t\t\t\t\t\tcase \"Stopped\":\n\t\t\t\t\t\t\treturn Deferred.succeed(stopped, undefined)\n\t\t\t\t\t\tcase \"Withdrawing\":\n\t\t\t\t\t\t\treturn remoteFailure.fail(RemoteWithdrawn.make({}))\n\t\t\t\t\t\tcase \"Failed\":\n\t\t\t\t\t\t\treturn contract\n\t\t\t\t\t\t\t\t.decodeCause(event.cause)\n\t\t\t\t\t\t\t\t.pipe(Effect.flatMap((cause) => remoteFailure.failCause(cause)))\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t).pipe(\n\t\t\tEffect.tapCause(connection.transport.report),\n\t\t\tEffect.forkIn(connection.resources),\n\t\t)\n\t\treturn { stopped, remoteFailure, events }\n\t})\nconst forwardLogs = <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n\tclient: Client<E>,\n\tconnection: Connection[\"Service\"],\n) =>\n\tEffect.gen(function* () {\n\t\tconst logsEnded = yield* Deferred.make<void>()\n\t\tconst reportedDrops = yield* Ref.make(0)\n\t\tyield* race(\n\t\t\tconnection,\n\t\t\tclient.Logs().pipe(\n\t\t\t\tStream.runForEach((event) =>\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tconst previous = yield* Ref.getAndSet(reportedDrops, event.dropped)\n\t\t\t\t\t\tif (event.dropped > previous)\n\t\t\t\t\t\t\tyield* Effect.logWarning(\"Remote logs were dropped\").pipe(\n\t\t\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t\t\t...(Option.isSome(connection.pid)\n\t\t\t\t\t\t\t\t\t\t? { \"remote.pid\": connection.pid.value }\n\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t\"remote.logs.dropped\": event.dropped - previous,\n\t\t\t\t\t\t\t\t\t\"remote.logs.droppedTotal\": event.dropped,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\tif (event._tag === \"LogsEnded\") {\n\t\t\t\t\t\t\tyield* Deferred.succeed(logsEnded, undefined)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst entry = event.entry\n\t\t\t\t\t\tconst cause = yield* contract.decodeCause(entry.cause)\n\t\t\t\t\t\tyield* Effect.logWithLevel(\n\t\t\t\t\t\t\tentry.level === \"All\" || entry.level === \"None\"\n\t\t\t\t\t\t\t\t? \"Info\"\n\t\t\t\t\t\t\t\t: entry.level,\n\t\t\t\t\t\t)(\n\t\t\t\t\t\t\t...(Array.isArray(entry.message)\n\t\t\t\t\t\t\t\t? entry.message\n\t\t\t\t\t\t\t\t: [entry.message]),\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t).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...(connection.threadId === undefined\n\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t: { \"remote.threadId\": connection.threadId }),\n\t\t\t\t\t\t\t\t\"remote.annotations\": entry.annotations,\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),\n\t\t).pipe(\n\t\t\tEffect.tapCause(connection.transport.report),\n\t\t\tEffect.forkIn(connection.resources),\n\t\t)\n\t\treturn logsEnded\n\t})\nexport const initialize = <E extends ErrorSchema>(contract: Contract<E>) =>\n\tEffect.gen(function* () {\n\t\tconst connection = yield* Connection\n\t\tconst client = yield* RpcClient.make(contract.control).pipe(\n\t\t\tEffect.provideService(\n\t\t\t\tRpcClient.Protocol,\n\t\t\t\tconnection.transport.clientProtocol(Control.endpoint),\n\t\t\t),\n\t\t\tScope.provide(connection.resources),\n\t\t)\n\t\tfor (const service of contract.inject)\n\t\t\tyield* service\n\t\t\t\t.serve(connection.transport)\n\t\t\t\t.pipe(\n\t\t\t\t\tEffect.tapCause(connection.transport.report),\n\t\t\t\t\tEffect.forkIn(connection.resources),\n\t\t\t\t)\n\t\tconst events = yield* forwardEvents(contract, client, connection)\n\t\tconst logsEnded = yield* forwardLogs(contract, client, connection)\n\t\treturn { connection, client, ...events, logsEnded }\n\t})\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\t| E[\"Type\"]\n\t\t\t\t\t\t\t| ContractModule.UndeclaredFailure\n\t\t\t\t\t\t\t| ContractModule.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 = <E extends ErrorSchema>(active: Active<E>) =>\n\tEffect.gen(function* () {\n\t\tconst result = yield* race(\n\t\t\tactive.connection,\n\t\t\tactive.client\n\t\t\t\t.Dispose()\n\t\t\t\t.pipe(Effect.catchIf(Cause.isCause, Effect.succeed)),\n\t\t)\n\t\tconst cause = Cause.isCause(result) ? result : Cause.empty\n\t\t// A remote cleanup failure still permits the bounded event and log tail to drain.\n\t\tyield* race(\n\t\t\tactive.connection,\n\t\t\tDeferred.await(active.stopped).pipe(\n\t\t\t\tEffect.andThen(Deferred.await(active.logsEnded)),\n\t\t\t),\n\t\t).pipe(Effect.onError(() => Effect.failCause(cleanupCause(cause))))\n\t\treturn cause\n\t})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { registerHooks } from "node:module";
|
|
2
|
+
import { Effect, Path, String } from "effect";
|
|
3
|
+
import { SecureRandom } from "effect/crypto";
|
|
4
|
+
// src/internal/importer.ts
|
|
5
|
+
/** Bare names resolve from the application; imported dependencies keep their own parent URLs. */
|
|
6
|
+
const make = Effect.fnUntraced(function* (directory) {
|
|
7
|
+
const path = yield* Path.Path;
|
|
8
|
+
const base = yield* path.toFileUrl(path.join(directory, "graft.yml"));
|
|
9
|
+
const prefix = `graft-remote-${yield* (yield* SecureRandom.SecureRandom).uuidV4()}:`;
|
|
10
|
+
yield* Effect.acquireRelease(Effect.sync(() => registerHooks({ resolve: (specifier, context, next) => String.startsWith(prefix)(specifier) ? next(String.slice(prefix.length)(specifier), {
|
|
11
|
+
...context,
|
|
12
|
+
parentURL: base.href
|
|
13
|
+
}) : next(specifier, context) })), (hooks) => Effect.sync(() => hooks.deregister()));
|
|
14
|
+
return (specifier) => import(prefix + specifier);
|
|
15
|
+
});
|
|
16
|
+
export { make };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=importer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importer.js","names":[],"sources":["../../src/internal/importer.ts"],"sourcesContent":["import { Effect, Path, String } from \"effect\"\nimport { SecureRandom } from \"effect/crypto\"\nimport { registerHooks } from \"node:module\"\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-remote-${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":";;;;;AAKA,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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CapabilityCombinationError, CapabilityFailed } from "./assembly.js";
|
|
2
|
+
import { Array, Deferred, Effect, HashSet, Option, Stream } from "effect";
|
|
3
|
+
// src/internal/listenerStartup.ts
|
|
4
|
+
const signals = Effect.all({
|
|
5
|
+
description: Deferred.make(),
|
|
6
|
+
ready: Deferred.make()
|
|
7
|
+
});
|
|
8
|
+
/** A startup signal races its assembly's failure; no runtime failure is promoted to the owner. */
|
|
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
|
+
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 serve" }));
|
|
12
|
+
const issuers = HashSet.fromIterable(Array.getSomes(Array.map(listeners, ({ auth }) => auth._tag === "Header" ? Option.fromUndefinedOr(auth.issuer) : Option.none())));
|
|
13
|
+
return HashSet.size(issuers) > 1 ? Effect.fail(CapabilityCombinationError.make({ detail: "A runner must use a single authentication issuer" })) : Effect.void;
|
|
14
|
+
};
|
|
15
|
+
export { signals, validate, wait };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=listenerStartup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listenerStartup.js","names":[],"sources":["../../src/internal/listenerStartup.ts"],"sourcesContent":["import type { Fork } from \"@graftland/graft\"\nimport { Array, Deferred, Effect, HashSet, Option, Stream } from \"effect\"\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 serve\",\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":";;;AAUA,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,sDACT,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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ModuleImportFailed } from "./childErrors.js";
|
|
2
|
+
import { Cause, Effect } from "effect";
|
|
3
|
+
// src/internal/loadModule.ts
|
|
4
|
+
/** Native imports cannot be cancelled; late rejection still belongs to the importing context. */
|
|
5
|
+
const loadModule = Effect.fn("Remote.loadModule")(function* (module) {
|
|
6
|
+
const context = yield* Effect.context();
|
|
7
|
+
return yield* Effect.tryPromise({
|
|
8
|
+
try: (signal) => import(module).catch((cause) => {
|
|
9
|
+
if (signal.aborted) Effect.runSyncWith(context)(Effect.logError("Module import failed after cancellation", Cause.die(cause)).pipe(Effect.annotateLogs({ module })));
|
|
10
|
+
throw cause;
|
|
11
|
+
}),
|
|
12
|
+
catch: (cause) => ModuleImportFailed.make({
|
|
13
|
+
module,
|
|
14
|
+
cause
|
|
15
|
+
})
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
export { loadModule };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=loadModule.js.map
|
|
@@ -0,0 +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":";;;;AAIA,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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Layer } from "effect";
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","names":[],"sources":["../../src/internal/platform.ts"],"sourcesContent":["import { NodeServices } from \"@effect/platform-node\"\nimport { Layer } from \"effect\"\nimport { Digest, SecureRandom, Signature } from \"effect/crypto\"\nimport { FetchHttpClient } from \"effect/http\"\n\nexport const platform = Layer.mergeAll(\n\tNodeServices.layer,\n\tFetchHttpClient.layer,\n\tDigest.layerWebCrypto,\n\tSecureRandom.layerWebCrypto,\n\tSignature.layerWebCrypto.pipe(Layer.provide(SecureRandom.layerWebCrypto)),\n)\n"],"mappings":";;;;;AAKA,MAAa,WAAW,MAAM,SAC7B,aAAa,OACb,gBAAgB,OAChB,OAAO,gBACP,aAAa,gBACb,UAAU,eAAe,KAAK,MAAM,QAAQ,aAAa,cAAc,CAAC,CACzE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Channel } from "../Transport.js";
|
|
2
|
+
import { TransportError } from "../Errors.js";
|
|
3
|
+
import "./Limits.js";
|
|
4
|
+
import { Context, Effect, Scope } from "effect";
|
|
5
|
+
import { Rpc, RpcClient, RpcGroup, RpcServer } from "effect/rpc";
|
|
6
|
+
export interface Port {
|
|
7
|
+
readonly clientProtocol: (endpoint: string) => RpcClient.Protocol["Service"];
|
|
8
|
+
readonly serverProtocol: (endpoint: string) => RpcServer.Protocol["Service"];
|
|
9
|
+
readonly await: Effect.Effect<never, TransportError>;
|
|
10
|
+
readonly fail: (error: TransportError) => Effect.Effect<void>;
|
|
11
|
+
readonly end: Effect.Effect<void, TransportError>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","names":[],"sources":["../../src/internal/port.ts"],"mappings":";;;;;iBAgDiB;WACP,iBAAiB,qBAAqB,UAAU;WAChD,iBAAiB,qBAAqB,UAAU;WAChD,OAAO,OAAO,cAAc;WAC5B,OAAO,OAAO,mBAAmB,OAAO;WACxC,KAAK,OAAO,aAAa"}
|