@graftland/plugin-remote 0.0.0-stage → 0.2.0-beta.2
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,19 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
// src/internal/runner/WatchdogProtocol.ts
|
|
3
|
+
const Command = Schema.Union([
|
|
4
|
+
Schema.Struct({
|
|
5
|
+
kind: Schema.Literal("renew"),
|
|
6
|
+
millis: Schema.Finite.check(Schema.isGreaterThan(0))
|
|
7
|
+
}),
|
|
8
|
+
Schema.Struct({ kind: Schema.Literal("start") }),
|
|
9
|
+
Schema.Struct({ kind: Schema.Literal("stop") })
|
|
10
|
+
]);
|
|
11
|
+
const CommandJson = Schema.fromJsonString(Command);
|
|
12
|
+
const Notice = Schema.Literals([
|
|
13
|
+
"ready",
|
|
14
|
+
"start",
|
|
15
|
+
"stop"
|
|
16
|
+
]);
|
|
17
|
+
export { Command, CommandJson, Notice };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=WatchdogProtocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WatchdogProtocol.js","names":[],"sources":["../../../src/internal/runner/WatchdogProtocol.ts"],"sourcesContent":["import { Schema } from \"effect\"\n\nexport const Command = Schema.Union([\n\tSchema.Struct({\n\t\tkind: Schema.Literal(\"renew\"),\n\t\tmillis: Schema.Finite.check(Schema.isGreaterThan(0)),\n\t}),\n\tSchema.Struct({ kind: Schema.Literal(\"start\") }),\n\tSchema.Struct({ kind: Schema.Literal(\"stop\") }),\n])\nexport const CommandJson = Schema.fromJsonString(Command)\nexport const Notice = Schema.Literals([\"ready\", \"start\", \"stop\"])\n"],"mappings":";;AAEA,MAAa,UAAU,OAAO,MAAM;CACnC,OAAO,OAAO;EACb,MAAM,OAAO,QAAQ,OAAO;EAC5B,QAAQ,OAAO,OAAO,MAAM,OAAO,cAAc,CAAC,CAAC;CACpD,CAAC;CACD,OAAO,OAAO,EAAE,MAAM,OAAO,QAAQ,OAAO,EAAE,CAAC;CAC/C,OAAO,OAAO,EAAE,MAAM,OAAO,QAAQ,MAAM,EAAE,CAAC;AAC/C,CAAC;AACD,MAAa,cAAc,OAAO,eAAe,OAAO;AACxD,MAAa,SAAS,OAAO,SAAS;CAAC;CAAS;CAAS;AAAM,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { TransportError } from "../../Errors.js";
|
|
2
|
+
import { Limits, PositiveFinite, PositiveInt } from "../Limits.js";
|
|
3
|
+
import { Priority } from "../port.js";
|
|
4
|
+
import { CodeIdentity, ExecutionError, Handle, LeaseExpired, PackageError, RunnerClosing, SessionAccessDenied, SessionConflict, SessionRecord, SessionStopped, StaleSession, StateDirectoryLocked, StateStorageError, Termination, TerminationUnconfirmed } from "./model.js";
|
|
5
|
+
import { Cause, Effect, Schema, Sink, Stream } from "effect";
|
|
6
|
+
import { Rpc, RpcGroup } from "effect/rpc";
|
|
7
|
+
// src/internal/runner/Wire.ts
|
|
8
|
+
/** The RPC boundary is the only place that assembles the runner's error schema. */
|
|
9
|
+
const SessionError = Schema.Union([
|
|
10
|
+
SessionAccessDenied,
|
|
11
|
+
StaleSession,
|
|
12
|
+
LeaseExpired,
|
|
13
|
+
SessionStopped,
|
|
14
|
+
SessionConflict,
|
|
15
|
+
StateStorageError,
|
|
16
|
+
ExecutionError,
|
|
17
|
+
PackageError,
|
|
18
|
+
TerminationUnconfirmed,
|
|
19
|
+
RunnerClosing,
|
|
20
|
+
StateDirectoryLocked
|
|
21
|
+
]);
|
|
22
|
+
const Session = RpcGroup.make(Rpc.make("HighWater", {
|
|
23
|
+
payload: { instance: Schema.NonEmptyString },
|
|
24
|
+
success: Schema.NullOr(PositiveInt),
|
|
25
|
+
error: SessionError
|
|
26
|
+
}), Rpc.make("Open", {
|
|
27
|
+
payload: {
|
|
28
|
+
instance: Schema.NonEmptyString,
|
|
29
|
+
requestId: Schema.NonEmptyString,
|
|
30
|
+
expectedGeneration: Schema.NullOr(PositiveInt),
|
|
31
|
+
leaseMillis: Schema.optionalKey(PositiveFinite),
|
|
32
|
+
limits: Limits
|
|
33
|
+
},
|
|
34
|
+
success: SessionRecord,
|
|
35
|
+
error: SessionError
|
|
36
|
+
}), Rpc.make("Load", {
|
|
37
|
+
payload: {
|
|
38
|
+
handle: Handle,
|
|
39
|
+
specifier: Schema.NonEmptyString,
|
|
40
|
+
digest: Schema.optionalKey(Schema.Boolean)
|
|
41
|
+
},
|
|
42
|
+
success: CodeIdentity,
|
|
43
|
+
error: SessionError
|
|
44
|
+
}), Rpc.make("Renew", {
|
|
45
|
+
payload: Handle,
|
|
46
|
+
success: Schema.Finite,
|
|
47
|
+
error: SessionError
|
|
48
|
+
}), Rpc.make("Dispose", {
|
|
49
|
+
payload: Handle,
|
|
50
|
+
success: Termination,
|
|
51
|
+
error: SessionError
|
|
52
|
+
}), Rpc.make("Status", {
|
|
53
|
+
payload: Handle,
|
|
54
|
+
success: SessionRecord,
|
|
55
|
+
error: SessionError
|
|
56
|
+
})).annotateRpcs(Priority, "control");
|
|
57
|
+
/** Preserve the port writer order within each byte channel. */
|
|
58
|
+
const channel = (peer, id) => ({
|
|
59
|
+
input: Stream.fromEffectRepeat(peer.take(id)),
|
|
60
|
+
output: Sink.forEach((bytes) => peer.send(id, bytes).pipe(Effect.mapError((error) => TransportError.make({ cause: Cause.fail(error) }))))
|
|
61
|
+
});
|
|
62
|
+
export { Session, SessionError, channel };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=Wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Wire.js","names":["Port.Priority"],"sources":["../../../src/internal/runner/Wire.ts"],"sourcesContent":["import { Cause, Effect, Sink, Stream, Schema } from \"effect\"\nimport { Rpc, RpcGroup } from \"effect/rpc\"\nimport { TransportError } from \"../../Errors\"\nimport * as Port from \"../port\"\nimport type * as Multiplex from \"./Multiplex\"\nimport {\n\tCodeIdentity,\n\tHandle,\n\tLimits,\n\tPositiveInt,\n\tPositiveFinite,\n\tSessionRecord,\n\tSessionAccessDenied,\n\tStaleSession,\n\tLeaseExpired,\n\tSessionStopped,\n\tSessionConflict,\n\tStateStorageError,\n\tExecutionError,\n\tPackageError,\n\tTerminationUnconfirmed,\n\tRunnerClosing,\n\tStateDirectoryLocked,\n\tTermination,\n} from \"./model\"\n\n/** The RPC boundary is the only place that assembles the runner's error schema. */\nexport const SessionError = Schema.Union([\n\tSessionAccessDenied,\n\tStaleSession,\n\tLeaseExpired,\n\tSessionStopped,\n\tSessionConflict,\n\tStateStorageError,\n\tExecutionError,\n\tPackageError,\n\tTerminationUnconfirmed,\n\tRunnerClosing,\n\tStateDirectoryLocked,\n])\nexport type SessionError = typeof SessionError.Type\n\nexport const Session = RpcGroup.make(\n\tRpc.make(\"HighWater\", {\n\t\tpayload: { instance: Schema.NonEmptyString },\n\t\tsuccess: Schema.NullOr(PositiveInt),\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Open\", {\n\t\tpayload: {\n\t\t\tinstance: Schema.NonEmptyString,\n\t\t\trequestId: Schema.NonEmptyString,\n\t\t\texpectedGeneration: Schema.NullOr(PositiveInt),\n\t\t\tleaseMillis: Schema.optionalKey(PositiveFinite),\n\t\t\tlimits: Limits,\n\t\t},\n\t\tsuccess: SessionRecord,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Load\", {\n\t\tpayload: {\n\t\t\thandle: Handle,\n\t\t\tspecifier: Schema.NonEmptyString,\n\t\t\tdigest: Schema.optionalKey(Schema.Boolean),\n\t\t},\n\t\tsuccess: CodeIdentity,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Renew\", {\n\t\tpayload: Handle,\n\t\tsuccess: Schema.Finite,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Dispose\", {\n\t\tpayload: Handle,\n\t\tsuccess: Termination,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Status\", {\n\t\tpayload: Handle,\n\t\tsuccess: SessionRecord,\n\t\terror: SessionError,\n\t}),\n).annotateRpcs(Port.Priority, \"control\")\n\nexport type Peer = Multiplex.Peer\n/** Preserve the port writer order within each byte channel. */\nexport const channel = (peer: Peer, id: 0 | 1): Port.Channel => ({\n\tinput: Stream.fromEffectRepeat(peer.take(id)),\n\toutput: Sink.forEach((bytes: Uint8Array) =>\n\t\tpeer\n\t\t\t.send(id, bytes)\n\t\t\t.pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t),\n\t\t\t),\n\t),\n})\n"],"mappings":";;;;;;;;AA2BA,MAAa,eAAe,OAAO,MAAM;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAGD,MAAa,UAAU,SAAS,KAC/B,IAAI,KAAK,aAAa;CACrB,SAAS,EAAE,UAAU,OAAO,eAAe;CAC3C,SAAS,OAAO,OAAO,WAAW;CAClC,OAAO;AACR,CAAC,GACD,IAAI,KAAK,QAAQ;CAChB,SAAS;EACR,UAAU,OAAO;EACjB,WAAW,OAAO;EAClB,oBAAoB,OAAO,OAAO,WAAW;EAC7C,aAAa,OAAO,YAAY,cAAc;EAC9C,QAAQ;CACT;CACA,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,QAAQ;CAChB,SAAS;EACR,QAAQ;EACR,WAAW,OAAO;EAClB,QAAQ,OAAO,YAAY,OAAO,OAAO;CAC1C;CACA,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,SAAS;CACjB,SAAS;CACT,SAAS,OAAO;CAChB,OAAO;AACR,CAAC,GACD,IAAI,KAAK,WAAW;CACnB,SAAS;CACT,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,UAAU;CAClB,SAAS;CACT,SAAS;CACT,OAAO;AACR,CAAC,CACF,CAAC,CAAC,aAAaA,UAAe,SAAS;;AAIvC,MAAa,WAAW,MAAY,QAA6B;CAChE,OAAO,OAAO,iBAAiB,KAAK,KAAK,EAAE,CAAC;CAC5C,QAAQ,KAAK,SAAS,UACrB,KACE,KAAK,IAAI,KAAK,CAAC,CACf,KACA,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD,CACF;AACD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Peer } from "../Peer.js";
|
|
2
|
+
import { TransportError } from "../../Errors.js";
|
|
3
|
+
import { make } from "../port.js";
|
|
4
|
+
import { make as make$1 } from "./Multiplex.js";
|
|
5
|
+
import { Session, channel } from "./Wire.js";
|
|
6
|
+
import { SessionAccessDenied, SessionConflict } from "./model.js";
|
|
7
|
+
import { Cause, Effect, Option, Ref, Scope, Semaphore } from "effect";
|
|
8
|
+
import { RpcServer } from "effect/rpc";
|
|
9
|
+
// src/internal/runner/accept.ts
|
|
10
|
+
const accept = (supervisor, execution, channel$1) => Effect.gen(function* () {
|
|
11
|
+
const identity = yield* Peer;
|
|
12
|
+
const scope = yield* Effect.scope;
|
|
13
|
+
const mux = yield* make$1(channel$1);
|
|
14
|
+
const peer = yield* make(channel(mux, 0), {
|
|
15
|
+
session: "session-v1",
|
|
16
|
+
serve: { session: Session },
|
|
17
|
+
call: {}
|
|
18
|
+
});
|
|
19
|
+
const attached = yield* Ref.make(Option.none());
|
|
20
|
+
const loading = yield* Semaphore.make(1);
|
|
21
|
+
const authorize = (handle) => handle.key.identity === identity ? Effect.void : Effect.fail(SessionAccessDenied.make({ detail: "The session belongs to another authenticated identity" }));
|
|
22
|
+
const handlers = yield* Session.toHandlers({
|
|
23
|
+
HighWater: ({ instance }) => supervisor.highWater({
|
|
24
|
+
identity,
|
|
25
|
+
instance
|
|
26
|
+
}),
|
|
27
|
+
Open: ({ instance, requestId, expectedGeneration, leaseMillis, limits }) => supervisor.open({
|
|
28
|
+
key: {
|
|
29
|
+
identity,
|
|
30
|
+
instance
|
|
31
|
+
},
|
|
32
|
+
requestId,
|
|
33
|
+
expectedGeneration,
|
|
34
|
+
...leaseMillis === void 0 ? {} : { lease: leaseMillis },
|
|
35
|
+
limits
|
|
36
|
+
}),
|
|
37
|
+
Load: ({ handle, ...request }) => Effect.gen(function* () {
|
|
38
|
+
yield* authorize(handle);
|
|
39
|
+
const attachment = yield* Ref.get(attached);
|
|
40
|
+
if (Option.isSome(attachment) && attachment.value !== handle.token) return yield* SessionConflict.make({ detail: "A connection can attach only one execution" });
|
|
41
|
+
const code = yield* supervisor.load(handle, request);
|
|
42
|
+
if (Option.isNone(attachment)) {
|
|
43
|
+
const child = yield* execution.peer(handle.token).pipe(Scope.provide(scope));
|
|
44
|
+
yield* Ref.set(attached, Option.some(handle.token));
|
|
45
|
+
yield* Effect.all([Effect.forever(Effect.flatMap(mux.take(1), (bytes) => child.send(1, bytes))), Effect.forever(Effect.flatMap(child.take(1), (bytes) => mux.send(1, bytes)))], { concurrency: "unbounded" }).pipe(Effect.catchCause((cause) => Cause.hasInterruptsOnly(cause) ? Effect.void : child.fail(TransportError.make({ cause }))), Effect.forkIn(scope));
|
|
46
|
+
}
|
|
47
|
+
return code;
|
|
48
|
+
}).pipe(loading.withPermit),
|
|
49
|
+
Renew: (handle) => authorize(handle).pipe(Effect.andThen(supervisor.renew(handle))),
|
|
50
|
+
Dispose: (handle) => authorize(handle).pipe(Effect.andThen(supervisor.dispose(handle))),
|
|
51
|
+
Status: (handle) => authorize(handle).pipe(Effect.andThen(supervisor.status(handle)))
|
|
52
|
+
});
|
|
53
|
+
return yield* RpcServer.make(Session, { disableFatalDefects: true }).pipe(Effect.provideContext(handlers), Effect.provideService(RpcServer.Protocol, peer.serverProtocol("session")), Effect.raceFirst(mux.await));
|
|
54
|
+
});
|
|
55
|
+
export { accept };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=accept.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accept.js","names":["Multiplex.make","channel","Port.make","Wire.channel","Wire.Session"],"sources":["../../../src/internal/runner/accept.ts"],"sourcesContent":["import { Cause, Effect, Ref, Option, Scope, Semaphore } from \"effect\"\nimport { RpcServer } from \"effect/rpc\"\nimport { Peer } from \"../Peer\"\nimport { TransportError } from \"../../Errors\"\nimport type { Channel } from \"../../Transport\"\nimport type { Supervisor } from \"./Supervisor\"\nimport type { Channels } from \"./Execution\"\nimport * as Port from \"../port\"\nimport * as Multiplex from \"./Multiplex\"\nimport * as Wire from \"./Wire\"\nimport { SessionAccessDenied, SessionConflict, type Handle } from \"./model\"\n\nexport const accept = (\n\tsupervisor: typeof Supervisor.Service,\n\texecution: typeof Channels.Service,\n\tchannel: Channel,\n) =>\n\tEffect.gen(function* () {\n\t\tconst identity = yield* Peer\n\t\tconst scope = yield* Effect.scope\n\t\tconst mux = yield* Multiplex.make(channel)\n\t\tconst peer = yield* Port.make(Wire.channel(mux, 0), {\n\t\t\tsession: \"session-v1\",\n\t\t\tserve: { session: Wire.Session },\n\t\t\tcall: {},\n\t\t})\n\t\tconst attached = yield* Ref.make(Option.none<string>())\n\t\tconst loading = yield* Semaphore.make(1)\n\t\tconst authorize = (handle: Handle) =>\n\t\t\thandle.key.identity === identity\n\t\t\t\t? Effect.void\n\t\t\t\t: Effect.fail(\n\t\t\t\t\t\tSessionAccessDenied.make({\n\t\t\t\t\t\t\tdetail: \"The session belongs to another authenticated identity\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\tconst handlers = yield* Wire.Session.toHandlers({\n\t\t\tHighWater: ({ instance }) => supervisor.highWater({ identity, instance }),\n\t\t\tOpen: ({\n\t\t\t\tinstance,\n\t\t\t\trequestId,\n\t\t\t\texpectedGeneration,\n\t\t\t\tleaseMillis,\n\t\t\t\tlimits,\n\t\t\t}) =>\n\t\t\t\tsupervisor.open({\n\t\t\t\t\tkey: { identity, instance },\n\t\t\t\t\trequestId,\n\t\t\t\t\texpectedGeneration,\n\t\t\t\t\t...(leaseMillis === undefined ? {} : { lease: leaseMillis }),\n\t\t\t\t\tlimits,\n\t\t\t\t}),\n\t\t\tLoad: ({ handle, ...request }) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tyield* authorize(handle)\n\t\t\t\t\tconst attachment = yield* Ref.get(attached)\n\t\t\t\t\tif (Option.isSome(attachment) && attachment.value !== handle.token)\n\t\t\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\t\t\tdetail: \"A connection can attach only one execution\",\n\t\t\t\t\t\t})\n\t\t\t\t\tconst code = yield* supervisor.load(handle, request)\n\t\t\t\t\tif (Option.isNone(attachment)) {\n\t\t\t\t\t\tconst child = yield* execution\n\t\t\t\t\t\t\t.peer(handle.token)\n\t\t\t\t\t\t\t.pipe(Scope.provide(scope))\n\t\t\t\t\t\tyield* Ref.set(attached, Option.some(handle.token))\n\t\t\t\t\t\t// A child EOF must not destroy the session channel before Dispose can acknowledge exit.\n\t\t\t\t\t\tyield* Effect.all(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tEffect.forever(\n\t\t\t\t\t\t\t\t\tEffect.flatMap(mux.take(1), (bytes) => child.send(1, bytes)),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tEffect.forever(\n\t\t\t\t\t\t\t\t\tEffect.flatMap(child.take(1), (bytes) => mux.send(1, bytes)),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t{ concurrency: \"unbounded\" },\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\t\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t\t: child.fail(TransportError.make({ cause })),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tEffect.forkIn(scope),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn code\n\t\t\t\t}).pipe(loading.withPermit),\n\t\t\tRenew: (handle) =>\n\t\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.renew(handle))),\n\t\t\tDispose: (handle) =>\n\t\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.dispose(handle))),\n\t\t\tStatus: (handle) =>\n\t\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.status(handle))),\n\t\t})\n\t\treturn yield* RpcServer.make(Wire.Session, {\n\t\t\tdisableFatalDefects: true,\n\t\t}).pipe(\n\t\t\tEffect.provideContext(handlers),\n\t\t\tEffect.provideService(RpcServer.Protocol, peer.serverProtocol(\"session\")),\n\t\t\tEffect.raceFirst(mux.await),\n\t\t)\n\t})\n"],"mappings":";;;;;;;;;AAYA,MAAa,UACZ,YACA,WACA,cAEA,OAAO,IAAI,aAAa;CACvB,MAAM,WAAW,OAAO;CACxB,MAAM,QAAQ,OAAO,OAAO;CAC5B,MAAM,MAAM,OAAOA,OAAeC,SAAO;CACzC,MAAM,OAAO,OAAOC,KAAUC,QAAa,KAAK,CAAC,GAAG;EACnD,SAAS;EACT,OAAO,EAAE,SAASC,QAAa;EAC/B,MAAM,CAAC;CACR,CAAC;CACD,MAAM,WAAW,OAAO,IAAI,KAAK,OAAO,KAAa,CAAC;CACtD,MAAM,UAAU,OAAO,UAAU,KAAK,CAAC;CACvC,MAAM,aAAa,WAClB,OAAO,IAAI,aAAa,WACrB,OAAO,OACP,OAAO,KACP,oBAAoB,KAAK,EACxB,QAAQ,wDACT,CAAC,CACF;CACH,MAAM,WAAW,OAAA,QAAoB,WAAW;EAC/C,YAAY,EAAE,eAAe,WAAW,UAAU;GAAE;GAAU;EAAS,CAAC;EACxE,OAAO,EACN,UACA,WACA,oBACA,aACA,aAEA,WAAW,KAAK;GACf,KAAK;IAAE;IAAU;GAAS;GAC1B;GACA;GACA,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,YAAY;GAC1D;EACD,CAAC;EACF,OAAO,EAAE,QAAQ,GAAG,cACnB,OAAO,IAAI,aAAa;GACvB,OAAO,UAAU,MAAM;GACvB,MAAM,aAAa,OAAO,IAAI,IAAI,QAAQ;GAC1C,IAAI,OAAO,OAAO,UAAU,KAAK,WAAW,UAAU,OAAO,OAC5D,OAAO,OAAO,gBAAgB,KAAK,EAClC,QAAQ,6CACT,CAAC;GACF,MAAM,OAAO,OAAO,WAAW,KAAK,QAAQ,OAAO;GACnD,IAAI,OAAO,OAAO,UAAU,GAAG;IAC9B,MAAM,QAAQ,OAAO,UACnB,KAAK,OAAO,KAAK,CAAC,CAClB,KAAK,MAAM,QAAQ,KAAK,CAAC;IAC3B,OAAO,IAAI,IAAI,UAAU,OAAO,KAAK,OAAO,KAAK,CAAC;IAElD,OAAO,OAAO,IACb,CACC,OAAO,QACN,OAAO,QAAQ,IAAI,KAAK,CAAC,IAAI,UAAU,MAAM,KAAK,GAAG,KAAK,CAAC,CAC5D,GACA,OAAO,QACN,OAAO,QAAQ,MAAM,KAAK,CAAC,IAAI,UAAU,IAAI,KAAK,GAAG,KAAK,CAAC,CAC5D,CACD,GACA,EAAE,aAAa,YAAY,CAC5B,CAAC,CAAC,KACD,OAAO,YAAY,UAClB,MAAM,kBAAkB,KAAK,IAC1B,OAAO,OACP,MAAM,KAAK,eAAe,KAAK,EAAE,MAAM,CAAC,CAAC,CAC7C,GACA,OAAO,OAAO,KAAK,CACpB;GACD;GACA,OAAO;EACR,CAAC,CAAC,CAAC,KAAK,QAAQ,UAAU;EAC3B,QAAQ,WACP,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,MAAM,MAAM,CAAC,CAAC;EAChE,UAAU,WACT,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,QAAQ,MAAM,CAAC,CAAC;EAClE,SAAS,WACR,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,OAAO,MAAM,CAAC,CAAC;CAClE,CAAC;CACD,OAAO,OAAO,UAAU,KAAKA,SAAc,EAC1C,qBAAqB,KACtB,CAAC,CAAC,CAAC,KACF,OAAO,eAAe,QAAQ,GAC9B,OAAO,eAAe,UAAU,UAAU,KAAK,eAAe,SAAS,CAAC,GACxE,OAAO,UAAU,IAAI,KAAK,CAC3B;AACD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import process from "node:process";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
// src/internal/runner/command.ts
|
|
5
|
+
/** Resolve the executable through the installed package export, never a relative dist path. */
|
|
6
|
+
const command = (override) => Effect.sync(() => override ?? [process.execPath, fileURLToPath(import.meta.resolve("@graftland/plugin-remote/internal/bin"))]);
|
|
7
|
+
export { command };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","names":[],"sources":["../../../src/internal/runner/command.ts"],"sourcesContent":["import { Effect } from \"effect\"\nimport process from \"node:process\"\nimport { fileURLToPath } from \"node:url\"\n\n/** Resolve the executable through the installed package export, never a relative dist path. */\nexport const command = (override?: readonly [string, ...string[]]) =>\n\tEffect.sync(\n\t\t(): readonly [string, ...string[]] =>\n\t\t\toverride ?? [\n\t\t\t\tprocess.execPath,\n\t\t\t\tfileURLToPath(\n\t\t\t\t\timport.meta.resolve(\"@graftland/plugin-remote/internal/bin\"),\n\t\t\t\t),\n\t\t\t],\n\t)\n"],"mappings":";;;;;AAKA,MAAa,WAAW,aACvB,OAAO,WAEL,YAAY,CACX,QAAQ,UACR,cACC,YAAY,QAAQ,uCAAuC,CAC5D,CACD,CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TransportError } from "../../Errors.js";
|
|
2
|
+
import { EndOfStream } from "./Framing.js";
|
|
3
|
+
import { Peer } from "../Peer.js";
|
|
4
|
+
import { Array, Cause, Effect, Schema } from "effect";
|
|
5
|
+
import { Socket } from "effect/socket";
|
|
6
|
+
// src/internal/runner/connectionEnded.ts
|
|
7
|
+
const closedNormally = (cause) => cause.reasons.length > 0 && Array.every(cause.reasons, (reason) => reason._tag === "Fail" && (Schema.is(TransportError)(reason.error) ? closedNormally(reason.error.cause) : Schema.is(EndOfStream)(reason.error) || Socket.isSocketError(reason.error) && reason.error.reason._tag === "SocketCloseError" && reason.error.reason.code === 1e3));
|
|
8
|
+
const connectionEnded = (cause) => Cause.hasInterruptsOnly(cause) || closedNormally(cause) ? Effect.void : Effect.flatMap(Peer, (identity) => Effect.logWarning("Remote host connection failed", cause).pipe(Effect.annotateLogs({ "remote.peer": identity })));
|
|
9
|
+
export { closedNormally, connectionEnded };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=connectionEnded.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionEnded.js","names":[],"sources":["../../../src/internal/runner/connectionEnded.ts"],"sourcesContent":["import { Array, Cause, Effect, Schema } from \"effect\"\nimport { Socket } from \"effect/socket\"\nimport { TransportError } from \"../../Errors\"\nimport { EndOfStream } from \"./Framing\"\nimport { Peer } from \"../Peer\"\n\n// Multiplex preserves the socket reason inside TransportError; only an entirely normal close is silent.\nexport const closedNormally = (cause: Cause.Cause<unknown>): boolean =>\n\tcause.reasons.length > 0 &&\n\tArray.every(\n\t\tcause.reasons,\n\t\t(reason) =>\n\t\t\treason._tag === \"Fail\" &&\n\t\t\t(Schema.is(TransportError)(reason.error)\n\t\t\t\t? closedNormally(reason.error.cause)\n\t\t\t\t: Schema.is(EndOfStream)(reason.error) ||\n\t\t\t\t\t(Socket.isSocketError(reason.error) &&\n\t\t\t\t\t\treason.error.reason._tag === \"SocketCloseError\" &&\n\t\t\t\t\t\treason.error.reason.code === 1000)),\n\t)\nexport const connectionEnded = (cause: Cause.Cause<unknown>) =>\n\tCause.hasInterruptsOnly(cause) || closedNormally(cause)\n\t\t? Effect.void\n\t\t: Effect.flatMap(Peer, (identity) =>\n\t\t\t\tEffect.logWarning(\"Remote host connection failed\", cause).pipe(\n\t\t\t\t\tEffect.annotateLogs({ \"remote.peer\": identity }),\n\t\t\t\t),\n\t\t\t)\n"],"mappings":";;;;;;AAOA,MAAa,kBAAkB,UAC9B,MAAM,QAAQ,SAAS,KACvB,MAAM,MACL,MAAM,UACL,WACA,OAAO,SAAS,WACf,OAAO,GAAG,cAAc,CAAC,CAAC,OAAO,KAAK,IACpC,eAAe,OAAO,MAAM,KAAK,IACjC,OAAO,GAAG,WAAW,CAAC,CAAC,OAAO,KAAK,KACnC,OAAO,cAAc,OAAO,KAAK,KACjC,OAAO,MAAM,OAAO,SAAS,sBAC7B,OAAO,MAAM,OAAO,SAAS,IAClC;AACD,MAAa,mBAAmB,UAC/B,MAAM,kBAAkB,KAAK,KAAK,eAAe,KAAK,IACnD,OAAO,OACP,OAAO,QAAQ,OAAO,aACtB,OAAO,WAAW,iCAAiC,KAAK,CAAC,CAAC,KACzD,OAAO,aAAa,EAAE,eAAe,SAAS,CAAC,CAChD,CACD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import "../Limits.js";
|
|
2
|
+
import { Cause, Context, Data, Effect, Option, Schema, Scope } from "effect";
|
|
3
|
+
declare const RemoteTerminationUnconfirmed_base: Schema.Class<RemoteTerminationUnconfirmed, Schema.TaggedStruct<"RemoteTerminationUnconfirmed", {
|
|
4
|
+
readonly handle: Schema.Struct<{
|
|
5
|
+
readonly key: Schema.Struct<{
|
|
6
|
+
readonly identity: Schema.NonEmptyString;
|
|
7
|
+
readonly instance: Schema.NonEmptyString;
|
|
8
|
+
}>;
|
|
9
|
+
readonly token: Schema.NonEmptyString;
|
|
10
|
+
readonly generation: Schema.Int;
|
|
11
|
+
}>;
|
|
12
|
+
}>, Cause.YieldableError & {
|
|
13
|
+
readonly brand: unique symbol;
|
|
14
|
+
}>;
|
|
15
|
+
export declare class RemoteTerminationUnconfirmed extends RemoteTerminationUnconfirmed_base {}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","names":[],"sources":["../../../src/internal/runner/model.ts"],"mappings":";;;;;;;;;;;;WAgVmB;;qBAFN,qCAAqC"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { Limits, PositiveFinite, PositiveInt, defaults } from "../Limits.js";
|
|
2
|
+
import { Array, Cause, Context, Data, Duration, Effect, Option, Schema } from "effect";
|
|
3
|
+
// src/internal/runner/model.ts
|
|
4
|
+
const diagnosticCause = Schema.Cause(Schema.Defect({ includeStack: true }), Schema.Defect({ includeStack: true }));
|
|
5
|
+
var PackageError = class extends Schema.TaggedError()("PackageError", {
|
|
6
|
+
detail: Schema.String,
|
|
7
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
8
|
+
}) {
|
|
9
|
+
get message() {
|
|
10
|
+
return this.detail;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
var SessionAccessDenied = class extends Schema.TaggedError()("SessionAccessDenied", {
|
|
14
|
+
detail: Schema.String,
|
|
15
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
16
|
+
}) {
|
|
17
|
+
get message() {
|
|
18
|
+
return this.detail;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
var StaleSession = class extends Schema.TaggedError()("StaleSession", {
|
|
22
|
+
detail: Schema.String,
|
|
23
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
24
|
+
}) {
|
|
25
|
+
get message() {
|
|
26
|
+
return this.detail;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var LeaseExpired = class extends Schema.TaggedError()("LeaseExpired", {
|
|
30
|
+
detail: Schema.String,
|
|
31
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
32
|
+
}) {
|
|
33
|
+
get message() {
|
|
34
|
+
return this.detail;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var SessionStopped = class extends Schema.TaggedError()("SessionStopped", {
|
|
38
|
+
detail: Schema.String,
|
|
39
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
40
|
+
}) {
|
|
41
|
+
get message() {
|
|
42
|
+
return this.detail;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
var SessionConflict = class extends Schema.TaggedError()("SessionConflict", {
|
|
46
|
+
detail: Schema.String,
|
|
47
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
48
|
+
}) {
|
|
49
|
+
get message() {
|
|
50
|
+
return this.detail;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var StateStorageError = class extends Schema.TaggedError()("StateStorageError", {
|
|
54
|
+
detail: Schema.String,
|
|
55
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
56
|
+
}) {
|
|
57
|
+
get message() {
|
|
58
|
+
return this.detail;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
var ExecutionError = class extends Schema.TaggedError()("ExecutionError", {
|
|
62
|
+
detail: Schema.String,
|
|
63
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
64
|
+
}) {
|
|
65
|
+
get message() {
|
|
66
|
+
return this.detail;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
var TerminationUnconfirmed = class extends Schema.TaggedError()("TerminationUnconfirmed", {
|
|
70
|
+
detail: Schema.String,
|
|
71
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
72
|
+
}) {
|
|
73
|
+
get message() {
|
|
74
|
+
return this.detail;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
var RunnerClosing = class extends Schema.TaggedError()("RunnerClosing", {
|
|
78
|
+
detail: Schema.String,
|
|
79
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
80
|
+
}) {
|
|
81
|
+
get message() {
|
|
82
|
+
return this.detail;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
var StateDirectoryLocked = class extends Schema.TaggedError()("StateDirectoryLocked", {
|
|
86
|
+
detail: Schema.String,
|
|
87
|
+
cause: Schema.optionalKey(diagnosticCause)
|
|
88
|
+
}) {
|
|
89
|
+
get message() {
|
|
90
|
+
return this.detail;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const Key = Schema.Struct({
|
|
94
|
+
identity: Schema.NonEmptyString,
|
|
95
|
+
instance: Schema.NonEmptyString
|
|
96
|
+
});
|
|
97
|
+
/** Structural keys keep identity namespaces separate without delimiter conventions. */
|
|
98
|
+
var SessionKey = class extends Data.Class {};
|
|
99
|
+
const keyOf = (key) => new SessionKey(key);
|
|
100
|
+
const negotiate = (local, peer) => ({
|
|
101
|
+
control: Math.min(local.control, peer.control),
|
|
102
|
+
data: Math.min(local.data, peer.data),
|
|
103
|
+
log: Math.min(local.log, peer.log)
|
|
104
|
+
});
|
|
105
|
+
const Handle = Schema.Struct({
|
|
106
|
+
key: Key,
|
|
107
|
+
token: Schema.NonEmptyString,
|
|
108
|
+
generation: PositiveInt
|
|
109
|
+
});
|
|
110
|
+
const ProcessIdentity = Schema.Struct({
|
|
111
|
+
pid: Schema.Int,
|
|
112
|
+
start: Schema.Struct({ born: Schema.String })
|
|
113
|
+
});
|
|
114
|
+
const ExitStatus = Schema.Struct({
|
|
115
|
+
stderr: Schema.optionalKey(Schema.String),
|
|
116
|
+
cause: Schema.optionalKey(diagnosticCause),
|
|
117
|
+
code: Schema.NullOr(Schema.Int),
|
|
118
|
+
signal: Schema.NullOr(Schema.String)
|
|
119
|
+
});
|
|
120
|
+
const CodeIdentity = Schema.Struct({
|
|
121
|
+
name: Schema.String,
|
|
122
|
+
version: Schema.String,
|
|
123
|
+
digest: Schema.optionalKey(Schema.String)
|
|
124
|
+
});
|
|
125
|
+
const Load = Schema.Struct({
|
|
126
|
+
specifier: Schema.String,
|
|
127
|
+
digest: Schema.optionalKey(Schema.Boolean)
|
|
128
|
+
});
|
|
129
|
+
const Termination = Schema.Struct({
|
|
130
|
+
kind: Schema.Literals(["Exited", "Killed"]),
|
|
131
|
+
exit: ExitStatus,
|
|
132
|
+
cause: diagnosticCause
|
|
133
|
+
});
|
|
134
|
+
const Fields = {
|
|
135
|
+
version: Schema.Literal(1),
|
|
136
|
+
handle: Handle,
|
|
137
|
+
requestId: Schema.String,
|
|
138
|
+
leaseMillis: Schema.Finite,
|
|
139
|
+
limits: Limits
|
|
140
|
+
};
|
|
141
|
+
const OpenRecord = Schema.Struct({
|
|
142
|
+
...Fields,
|
|
143
|
+
phase: Schema.Literal("Open")
|
|
144
|
+
});
|
|
145
|
+
const Launch = Schema.Union([Schema.TaggedStruct("Starting", {}), Schema.TaggedStruct("Registered", { child: ProcessIdentity })]);
|
|
146
|
+
const LoadingRecord = Schema.Struct({
|
|
147
|
+
...Fields,
|
|
148
|
+
phase: Schema.Literal("Loading"),
|
|
149
|
+
load: Load,
|
|
150
|
+
launch: Launch
|
|
151
|
+
});
|
|
152
|
+
const LoadedRecord = Schema.Struct({
|
|
153
|
+
...Fields,
|
|
154
|
+
phase: Schema.Literal("Loaded"),
|
|
155
|
+
load: Load,
|
|
156
|
+
child: ProcessIdentity,
|
|
157
|
+
code: CodeIdentity
|
|
158
|
+
});
|
|
159
|
+
const ActiveRecord = Schema.Union([
|
|
160
|
+
OpenRecord,
|
|
161
|
+
LoadingRecord,
|
|
162
|
+
LoadedRecord
|
|
163
|
+
]);
|
|
164
|
+
const StopReason = Schema.Union([...Array.map([
|
|
165
|
+
"Disposed",
|
|
166
|
+
"Expired",
|
|
167
|
+
"Superseded",
|
|
168
|
+
"Recovery",
|
|
169
|
+
"Shutdown",
|
|
170
|
+
"Exited"
|
|
171
|
+
], (tag) => Schema.TaggedStruct(tag, {})), Schema.TaggedStruct("LoadFailed", { cause: diagnosticCause })]);
|
|
172
|
+
const StoppingRecord = Schema.Struct({
|
|
173
|
+
...Fields,
|
|
174
|
+
phase: Schema.Literal("Stopping"),
|
|
175
|
+
previous: ActiveRecord,
|
|
176
|
+
reason: StopReason
|
|
177
|
+
});
|
|
178
|
+
const StoppedRecord = Schema.Struct({
|
|
179
|
+
...Fields,
|
|
180
|
+
phase: Schema.Literal("Stopped"),
|
|
181
|
+
previous: ActiveRecord,
|
|
182
|
+
reason: StopReason,
|
|
183
|
+
termination: Termination
|
|
184
|
+
});
|
|
185
|
+
const SessionRecord = Schema.Union([
|
|
186
|
+
OpenRecord,
|
|
187
|
+
LoadingRecord,
|
|
188
|
+
LoadedRecord,
|
|
189
|
+
StoppingRecord,
|
|
190
|
+
StoppedRecord
|
|
191
|
+
]);
|
|
192
|
+
const childOf = (record) => {
|
|
193
|
+
switch (record.phase) {
|
|
194
|
+
case "Open": return Option.none();
|
|
195
|
+
case "Loading": return record.launch._tag === "Registered" ? Option.some(record.launch.child) : Option.none();
|
|
196
|
+
case "Loaded": return Option.some(record.child);
|
|
197
|
+
case "Stopping":
|
|
198
|
+
case "Stopped": return childOf(record.previous);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
const stoppingRecord = (previous, reason) => ({
|
|
202
|
+
version: previous.version,
|
|
203
|
+
handle: previous.handle,
|
|
204
|
+
requestId: previous.requestId,
|
|
205
|
+
leaseMillis: previous.leaseMillis,
|
|
206
|
+
limits: previous.limits,
|
|
207
|
+
phase: "Stopping",
|
|
208
|
+
previous,
|
|
209
|
+
reason
|
|
210
|
+
});
|
|
211
|
+
const stoppedRecord = (previous, reason, termination) => ({
|
|
212
|
+
...stoppingRecord(previous, reason),
|
|
213
|
+
phase: "Stopped",
|
|
214
|
+
termination
|
|
215
|
+
});
|
|
216
|
+
var Store = class extends Context.Service()("@graftland/plugin-remote/internal/runner/model/Store") {};
|
|
217
|
+
var Execution = class extends Context.Service()("@graftland/plugin-remote/internal/runner/model/Execution") {};
|
|
218
|
+
var RemoteTerminationUnconfirmed = class extends Schema.TaggedError()("RemoteTerminationUnconfirmed", { handle: Handle }) {};
|
|
219
|
+
/** Losing contact never becomes a successful stop merely because a lease duration passed. */
|
|
220
|
+
const awaitTermination = (handle, confirmation, leaseMillis, marginMillis) => Effect.gen(function* () {
|
|
221
|
+
const [elapsed, result] = yield* Effect.exit(Effect.timeoutOption(confirmation, leaseMillis + marginMillis)).pipe(Effect.timed);
|
|
222
|
+
if (result._tag === "Success") {
|
|
223
|
+
if (Option.isSome(result.value)) return result.value.value;
|
|
224
|
+
return yield* RemoteTerminationUnconfirmed.make({ handle });
|
|
225
|
+
}
|
|
226
|
+
yield* Effect.sleep(Math.max(0, leaseMillis + marginMillis - Duration.toMillis(elapsed)));
|
|
227
|
+
return yield* Effect.failCause(Cause.combine(result.cause, Cause.fail(RemoteTerminationUnconfirmed.make({ handle }))));
|
|
228
|
+
});
|
|
229
|
+
export { ActiveRecord, CodeIdentity, Execution, ExecutionError, ExitStatus, Handle, Key, Launch, LeaseExpired, Limits, Load, LoadedRecord, LoadingRecord, OpenRecord, PackageError, PositiveFinite, PositiveInt, ProcessIdentity, RemoteTerminationUnconfirmed, RunnerClosing, SessionAccessDenied, SessionConflict, SessionKey, SessionRecord, SessionStopped, StaleSession, StateDirectoryLocked, StateStorageError, StopReason, StoppedRecord, StoppingRecord, Store, Termination, TerminationUnconfirmed, awaitTermination, childOf, defaults, keyOf, negotiate, stoppedRecord, stoppingRecord };
|
|
230
|
+
|
|
231
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","names":[],"sources":["../../../src/internal/runner/model.ts"],"sourcesContent":["import { Limits, PositiveInt } from \"../Limits\"\nexport { Limits, PositiveInt, PositiveFinite, defaults } from \"../Limits\"\nimport {\n\tArray,\n\tCause,\n\tContext,\n\tData,\n\tDuration,\n\tEffect,\n\tOption,\n\tSchema,\n} from \"effect\"\nimport type { Scope } from \"effect\"\n\nconst diagnosticCause = Schema.Cause(\n\tSchema.Defect({ includeStack: true }),\n\tSchema.Defect({ includeStack: true }),\n)\nexport class PackageError extends Schema.TaggedError<\n\tPackageError,\n\t{ readonly brand: unique symbol }\n>()(\"PackageError\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport class SessionAccessDenied extends Schema.TaggedError<\n\tSessionAccessDenied,\n\t{ readonly brand: unique symbol }\n>()(\"SessionAccessDenied\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport class StaleSession extends Schema.TaggedError<\n\tStaleSession,\n\t{ readonly brand: unique symbol }\n>()(\"StaleSession\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport class LeaseExpired extends Schema.TaggedError<\n\tLeaseExpired,\n\t{ readonly brand: unique symbol }\n>()(\"LeaseExpired\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport class SessionStopped extends Schema.TaggedError<\n\tSessionStopped,\n\t{ readonly brand: unique symbol }\n>()(\"SessionStopped\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport class SessionConflict extends Schema.TaggedError<\n\tSessionConflict,\n\t{ readonly brand: unique symbol }\n>()(\"SessionConflict\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport class StateStorageError extends Schema.TaggedError<\n\tStateStorageError,\n\t{ readonly brand: unique symbol }\n>()(\"StateStorageError\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport class ExecutionError extends Schema.TaggedError<\n\tExecutionError,\n\t{ readonly brand: unique symbol }\n>()(\"ExecutionError\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport class TerminationUnconfirmed extends Schema.TaggedError<\n\tTerminationUnconfirmed,\n\t{ readonly brand: unique symbol }\n>()(\"TerminationUnconfirmed\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport class RunnerClosing extends Schema.TaggedError<\n\tRunnerClosing,\n\t{ readonly brand: unique symbol }\n>()(\"RunnerClosing\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport class StateDirectoryLocked extends Schema.TaggedError<\n\tStateDirectoryLocked,\n\t{ readonly brand: unique symbol }\n>()(\"StateDirectoryLocked\", {\n\tdetail: Schema.String,\n\tcause: Schema.optionalKey(diagnosticCause),\n}) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\nexport const Key = Schema.Struct({\n\tidentity: Schema.NonEmptyString,\n\tinstance: Schema.NonEmptyString,\n})\nexport type Key = typeof Key.Type\n/** Structural keys keep identity namespaces separate without delimiter conventions. */\nexport class SessionKey extends Data.Class<Key> {}\nexport const keyOf = (key: Key) => new SessionKey(key)\nexport const negotiate = (local: Limits, peer: Limits): Limits => ({\n\tcontrol: Math.min(local.control, peer.control),\n\tdata: Math.min(local.data, peer.data),\n\tlog: Math.min(local.log, peer.log),\n})\nexport const Handle = Schema.Struct({\n\tkey: Key,\n\ttoken: Schema.NonEmptyString,\n\tgeneration: PositiveInt,\n})\nexport type Handle = typeof Handle.Type\nexport const ProcessIdentity = Schema.Struct({\n\tpid: Schema.Int,\n\tstart: Schema.Struct({ born: Schema.String }),\n})\nexport type ProcessIdentity = typeof ProcessIdentity.Type\nexport const ExitStatus = Schema.Struct({\n\tstderr: Schema.optionalKey(Schema.String),\n\tcause: Schema.optionalKey(diagnosticCause),\n\tcode: Schema.NullOr(Schema.Int),\n\tsignal: Schema.NullOr(Schema.String),\n})\nexport type ExitStatus = typeof ExitStatus.Type\nexport const CodeIdentity = Schema.Struct({\n\tname: Schema.String,\n\tversion: Schema.String,\n\tdigest: Schema.optionalKey(Schema.String),\n})\nexport type CodeIdentity = typeof CodeIdentity.Type\nexport const Load = Schema.Struct({\n\tspecifier: Schema.String,\n\tdigest: Schema.optionalKey(Schema.Boolean),\n})\nexport type Load = typeof Load.Type\nexport const Termination = Schema.Struct({\n\tkind: Schema.Literals([\"Exited\", \"Killed\"]),\n\texit: ExitStatus,\n\tcause: diagnosticCause,\n})\nexport type Termination = typeof Termination.Type\nconst Fields = {\n\tversion: Schema.Literal(1),\n\thandle: Handle,\n\trequestId: Schema.String,\n\tleaseMillis: Schema.Finite,\n\tlimits: Limits,\n}\nexport const OpenRecord = Schema.Struct({\n\t...Fields,\n\tphase: Schema.Literal(\"Open\"),\n})\nexport const Launch = Schema.Union([\n\tSchema.TaggedStruct(\"Starting\", {}),\n\tSchema.TaggedStruct(\"Registered\", { child: ProcessIdentity }),\n])\nexport const LoadingRecord = Schema.Struct({\n\t...Fields,\n\tphase: Schema.Literal(\"Loading\"),\n\tload: Load,\n\tlaunch: Launch,\n})\nexport const LoadedRecord = Schema.Struct({\n\t...Fields,\n\tphase: Schema.Literal(\"Loaded\"),\n\tload: Load,\n\tchild: ProcessIdentity,\n\tcode: CodeIdentity,\n})\nexport const ActiveRecord = Schema.Union([\n\tOpenRecord,\n\tLoadingRecord,\n\tLoadedRecord,\n])\nexport type ActiveRecord = typeof ActiveRecord.Type\nexport const StopReason = Schema.Union([\n\t...Array.map(\n\t\t[\n\t\t\t\"Disposed\",\n\t\t\t\"Expired\",\n\t\t\t\"Superseded\",\n\t\t\t\"Recovery\",\n\t\t\t\"Shutdown\",\n\t\t\t\"Exited\",\n\t\t] as const,\n\t\t(tag) => Schema.TaggedStruct(tag, {}),\n\t),\n\tSchema.TaggedStruct(\"LoadFailed\", { cause: diagnosticCause }),\n])\nexport type StopReason = typeof StopReason.Type\nexport const StoppingRecord = Schema.Struct({\n\t...Fields,\n\tphase: Schema.Literal(\"Stopping\"),\n\tprevious: ActiveRecord,\n\treason: StopReason,\n})\nexport const StoppedRecord = Schema.Struct({\n\t...Fields,\n\tphase: Schema.Literal(\"Stopped\"),\n\tprevious: ActiveRecord,\n\treason: StopReason,\n\ttermination: Termination,\n})\nexport const SessionRecord = Schema.Union([\n\tOpenRecord,\n\tLoadingRecord,\n\tLoadedRecord,\n\tStoppingRecord,\n\tStoppedRecord,\n])\nexport type SessionRecord = typeof SessionRecord.Type\nexport const childOf = (\n\trecord: SessionRecord,\n): Option.Option<ProcessIdentity> => {\n\tswitch (record.phase) {\n\t\tcase \"Open\":\n\t\t\treturn Option.none()\n\t\tcase \"Loading\":\n\t\t\treturn record.launch._tag === \"Registered\"\n\t\t\t\t? Option.some(record.launch.child)\n\t\t\t\t: Option.none()\n\t\tcase \"Loaded\":\n\t\t\treturn Option.some(record.child)\n\t\tcase \"Stopping\":\n\t\tcase \"Stopped\":\n\t\t\treturn childOf(record.previous)\n\t}\n}\nexport const stoppingRecord = (\n\tprevious: ActiveRecord,\n\treason: StopReason,\n): typeof StoppingRecord.Type => ({\n\tversion: previous.version,\n\thandle: previous.handle,\n\trequestId: previous.requestId,\n\tleaseMillis: previous.leaseMillis,\n\tlimits: previous.limits,\n\tphase: \"Stopping\",\n\tprevious,\n\treason,\n})\nexport const stoppedRecord = (\n\tprevious: ActiveRecord,\n\treason: StopReason,\n\ttermination: Termination,\n): typeof StoppedRecord.Type => ({\n\t...stoppingRecord(previous, reason),\n\tphase: \"Stopped\",\n\ttermination,\n})\n\nexport class Store extends Context.Service<\n\tStore,\n\t{\n\t\treadonly list: Effect.Effect<\n\t\t\tReadonlyArray<SessionRecord>,\n\t\t\tStateStorageError\n\t\t>\n\t\treadonly save: (\n\t\t\trecord: SessionRecord,\n\t\t) => Effect.Effect<void, StateStorageError>\n\t}\n>()(\"@graftland/plugin-remote/internal/runner/model/Store\") {}\nexport type ExecutionFailure =\n\tExecutionError | PackageError | TerminationUnconfirmed\nexport interface Unit {\n\treadonly code: CodeIdentity\n\t/** The supervisor persists identity and renews the lease before releasing the child startup gate. */\n\treadonly start: Effect.Effect<void, ExecutionFailure>\n\treadonly identity: ProcessIdentity\n\treadonly exited: Effect.Effect<ExitStatus, ExecutionFailure>\n\treadonly interrupt: Effect.Effect<void, ExecutionFailure>\n\treadonly kill: Effect.Effect<void, ExecutionFailure>\n\treadonly renew: (millis: number) => Effect.Effect<void, ExecutionFailure>\n}\nexport class Execution extends Context.Service<\n\tExecution,\n\t{\n\t\treadonly spawn: (\n\t\t\thandle: Handle,\n\t\t\trequest: Load,\n\t\t\tlimits: Limits,\n\t\t) => Effect.Effect<Unit, ExecutionFailure, Scope.Scope>\n\t\treadonly recover: (\n\t\t\tchild: ProcessIdentity,\n\t\t) => Effect.Effect<Termination, ExecutionFailure>\n\t}\n>()(\"@graftland/plugin-remote/internal/runner/model/Execution\") {}\nexport class RemoteTerminationUnconfirmed extends Schema.TaggedError<\n\tRemoteTerminationUnconfirmed,\n\t{ readonly brand: unique symbol }\n>()(\"RemoteTerminationUnconfirmed\", { handle: Handle }) {}\n/** Losing contact never becomes a successful stop merely because a lease duration passed. */\nexport const awaitTermination = <E, R>(\n\thandle: Handle,\n\tconfirmation: Effect.Effect<Termination, E, R>,\n\tleaseMillis: number,\n\tmarginMillis: number,\n) =>\n\tEffect.gen(function* () {\n\t\tconst [elapsed, result] = yield* Effect.exit(\n\t\t\tEffect.timeoutOption(confirmation, leaseMillis + marginMillis),\n\t\t).pipe(Effect.timed)\n\t\tif (result._tag === \"Success\") {\n\t\t\tif (Option.isSome(result.value)) return result.value.value\n\t\t\treturn yield* RemoteTerminationUnconfirmed.make({ handle })\n\t\t}\n\t\t// Confirmation and the disconnected wait share one deadline.\n\t\tyield* Effect.sleep(\n\t\t\tMath.max(0, leaseMillis + marginMillis - Duration.toMillis(elapsed)),\n\t\t)\n\t\treturn yield* Effect.failCause(\n\t\t\tCause.combine(\n\t\t\t\tresult.cause,\n\t\t\t\tCause.fail(RemoteTerminationUnconfirmed.make({ handle })),\n\t\t\t),\n\t\t)\n\t})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { findSubtree, isSubtreeActive } from "./forkTree.js";
|
|
2
|
+
import { make } from "./importer.js";
|
|
3
|
+
import { ServeLifecycle, StartupError, make as make$1 } from "./ServeLifecycle.js";
|
|
4
|
+
import { cleanupCause } from "./cleanup.js";
|
|
5
|
+
import { Graft, Plugin } from "@graftland/graft";
|
|
6
|
+
import { ConfigDirectory, Include, Loader, ModuleResolver } from "@graftland/loader";
|
|
7
|
+
import { Array, Cause, Deferred, Effect, Exit, Logger, Option, Path, Stream } from "effect";
|
|
8
|
+
// src/internal/serve.ts
|
|
9
|
+
const check = (trees) => Effect.forEach(trees, (tree) => {
|
|
10
|
+
if (tree.state._tag === "Failed") return Effect.fail(StartupError.make({
|
|
11
|
+
detail: `Runner entry ${tree.name} failed`,
|
|
12
|
+
cause: tree.state.cause
|
|
13
|
+
}));
|
|
14
|
+
return check(tree.children);
|
|
15
|
+
}, { discard: true });
|
|
16
|
+
const ready = Plugin.make({
|
|
17
|
+
name: "remote-ready",
|
|
18
|
+
inject: [Loader.Loader],
|
|
19
|
+
apply: Effect.fnUntraced(function* () {
|
|
20
|
+
const loader = yield* Loader.Loader;
|
|
21
|
+
yield* loader.ready.pipe(Effect.raceFirst(Graft.forks.pipe(Stream.map((trees) => findSubtree(trees, loader.root.id)), Stream.filter(Option.isSome), Stream.runForEach((tree) => check([tree.value])))));
|
|
22
|
+
yield* Graft.forks.pipe(Stream.map((trees) => findSubtree(trees, loader.root.id)), Stream.filter(Option.isSome), Stream.map((tree) => tree.value), Stream.tap((tree) => check([tree])), Stream.filter(isSubtreeActive), Stream.runHead);
|
|
23
|
+
})
|
|
24
|
+
});
|
|
25
|
+
/** Loader logs child cleanup errors; the supervisor's release signal also reaches the command exit. */
|
|
26
|
+
const close = (entries, lifecycle) => Effect.gen(function* () {
|
|
27
|
+
const disposed = yield* Effect.exit(entries.dispose);
|
|
28
|
+
const released = yield* Effect.exit(Deferred.await(lifecycle.released));
|
|
29
|
+
const cause = Array.reduce([disposed, released], Cause.empty, (cause, exit) => Exit.isFailure(exit) ? Cause.combine(cause, exit.cause) : cause);
|
|
30
|
+
if (cause.reasons.length > 0) return yield* Effect.failCause(cleanupCause(cause));
|
|
31
|
+
});
|
|
32
|
+
const load = Effect.fnUntraced(function* (config, directory) {
|
|
33
|
+
const lifecycle = yield* make$1;
|
|
34
|
+
yield* Graft.provide(ServeLifecycle, lifecycle);
|
|
35
|
+
const importer = yield* make(directory);
|
|
36
|
+
const resolver = yield* ModuleResolver.make({
|
|
37
|
+
base: directory,
|
|
38
|
+
importer
|
|
39
|
+
});
|
|
40
|
+
yield* Graft.provide(ModuleResolver.ModuleResolver, resolver);
|
|
41
|
+
const entries = yield* Graft.plugin(Include.Include, {
|
|
42
|
+
path: config,
|
|
43
|
+
watch: false
|
|
44
|
+
});
|
|
45
|
+
yield* entries.await;
|
|
46
|
+
yield* (yield* Graft.plugin(ready)).await;
|
|
47
|
+
return yield* Deferred.await(lifecycle.ended).pipe(Effect.ensuring(close(entries, lifecycle)));
|
|
48
|
+
});
|
|
49
|
+
const run = Effect.fnUntraced(function* (config) {
|
|
50
|
+
const path = yield* Path.Path;
|
|
51
|
+
const file = path.resolve(config);
|
|
52
|
+
const directory = path.dirname(file);
|
|
53
|
+
return yield* load(file, directory).pipe(Effect.mapError((error) => StartupError.make({
|
|
54
|
+
detail: "Starting the runner failed",
|
|
55
|
+
cause: Cause.fail(error)
|
|
56
|
+
})), Effect.provideService(ConfigDirectory, Option.some(directory)), Effect.provideService(Logger.LogToStderr, true));
|
|
57
|
+
});
|
|
58
|
+
export { run };
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","names":["make","Importer.make"],"sources":["../../src/internal/serve.ts"],"sourcesContent":["import { findSubtree, isSubtreeActive } from \"./forkTree\"\nimport { Graft, Plugin, type Fork } from \"@graftland/graft\"\nimport {\n\tConfigDirectory,\n\tInclude,\n\tLoader,\n\tModuleResolver,\n} from \"@graftland/loader\"\nimport {\n\tArray,\n\tCause,\n\tDeferred,\n\tEffect,\n\tExit,\n\tLogger,\n\tOption,\n\tPath,\n\tStream,\n} from \"effect\"\nimport * as Importer from \"./importer\"\n\nimport { ServeLifecycle, StartupError, make } from \"./ServeLifecycle\"\nimport { cleanupCause } from \"./cleanup\"\nexport { StartupError } from \"./ServeLifecycle\"\n\nconst check = (\n\ttrees: ReadonlyArray<Fork.ForkTree>,\n): Effect.Effect<void, StartupError> =>\n\tEffect.forEach(\n\t\ttrees,\n\t\t(tree) => {\n\t\t\tif (tree.state._tag === \"Failed\")\n\t\t\t\treturn Effect.fail(\n\t\t\t\t\tStartupError.make({\n\t\t\t\t\t\tdetail: `Runner entry ${tree.name} failed`,\n\t\t\t\t\t\tcause: tree.state.cause,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\treturn check(tree.children)\n\t\t},\n\t\t{ discard: true },\n\t)\nconst ready = Plugin.make({\n\tname: \"remote-ready\",\n\tinject: [Loader.Loader],\n\tapply: Effect.fnUntraced(function* () {\n\t\tconst loader = yield* Loader.Loader\n\t\t// A failed authenticator can leave its listener child Pending while the outer plugin is Applying.\n\t\tyield* loader.ready.pipe(\n\t\t\tEffect.raceFirst(\n\t\t\t\tGraft.forks.pipe(\n\t\t\t\t\tStream.map((trees) => findSubtree(trees, loader.root.id)),\n\t\t\t\t\tStream.filter(Option.isSome),\n\t\t\t\t\tStream.runForEach((tree) => check([tree.value])),\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t\t// Pending can still be reacting to a provider published during startup.\n\t\t// Observe the loader's subtree, excluding this startup observer itself.\n\t\tyield* Graft.forks.pipe(\n\t\t\tStream.map((trees) => findSubtree(trees, loader.root.id)),\n\t\t\tStream.filter(Option.isSome),\n\t\t\tStream.map((tree) => tree.value),\n\t\t\tStream.tap((tree) => check([tree])),\n\t\t\tStream.filter(isSubtreeActive),\n\t\t\tStream.runHead,\n\t\t)\n\t}),\n})\n\n/** Loader logs child cleanup errors; the supervisor's release signal also reaches the command exit. */\nconst close = (entries: Fork.Fork, lifecycle: typeof ServeLifecycle.Service) =>\n\tEffect.gen(function* () {\n\t\tconst disposed = yield* Effect.exit(entries.dispose)\n\t\tconst released = yield* Effect.exit(Deferred.await(lifecycle.released))\n\t\tconst cause = Array.reduce(\n\t\t\t[disposed, released],\n\t\t\tCause.empty,\n\t\t\t(cause: Cause.Cause<unknown>, exit: Exit.Exit<void, unknown>) =>\n\t\t\t\tExit.isFailure(exit) ? Cause.combine(cause, exit.cause) : cause,\n\t\t)\n\t\tif (cause.reasons.length > 0)\n\t\t\treturn yield* Effect.failCause(cleanupCause(cause))\n\t})\n\nconst load = Effect.fnUntraced(function* (config: string, directory: string) {\n\tconst lifecycle = yield* make\n\tyield* Graft.provide(ServeLifecycle, lifecycle)\n\tconst importer = yield* Importer.make(directory)\n\tconst resolver = yield* ModuleResolver.make({ base: directory, importer })\n\tyield* Graft.provide(ModuleResolver.ModuleResolver, resolver)\n\tconst entries = yield* Graft.plugin(Include.Include, {\n\t\tpath: config,\n\t\twatch: false,\n\t})\n\tyield* entries.await\n\tconst startup = yield* Graft.plugin(ready)\n\tyield* startup.await\n\treturn yield* Deferred.await(lifecycle.ended).pipe(\n\t\tEffect.ensuring(close(entries, lifecycle)),\n\t)\n})\nexport const run = Effect.fnUntraced(function* (config: string) {\n\tconst path = yield* Path.Path\n\tconst file = path.resolve(config)\n\tconst directory = path.dirname(file)\n\treturn yield* load(file, directory).pipe(\n\t\tEffect.mapError((error) =>\n\t\t\tStartupError.make({\n\t\t\t\tdetail: \"Starting the runner failed\",\n\t\t\t\tcause: Cause.fail(error),\n\t\t\t}),\n\t\t),\n\t\tEffect.provideService(ConfigDirectory, Option.some(directory)),\n\t\tEffect.provideService(Logger.LogToStderr, true),\n\t)\n})\n"],"mappings":";;;;;;;;AAyBA,MAAM,SACL,UAEA,OAAO,QACN,QACC,SAAS;CACT,IAAI,KAAK,MAAM,SAAS,UACvB,OAAO,OAAO,KACb,aAAa,KAAK;EACjB,QAAQ,gBAAgB,KAAK,KAAK;EAClC,OAAO,KAAK,MAAM;CACnB,CAAC,CACF;CACD,OAAO,MAAM,KAAK,QAAQ;AAC3B,GACA,EAAE,SAAS,KAAK,CACjB;AACD,MAAM,QAAQ,OAAO,KAAK;CACzB,MAAM;CACN,QAAQ,CAAC,OAAO,MAAM;CACtB,OAAO,OAAO,WAAW,aAAa;EACrC,MAAM,SAAS,OAAO,OAAO;EAE7B,OAAO,OAAO,MAAM,KACnB,OAAO,UACN,MAAM,MAAM,KACX,OAAO,KAAK,UAAU,YAAY,OAAO,OAAO,KAAK,EAAE,CAAC,GACxD,OAAO,OAAO,OAAO,MAAM,GAC3B,OAAO,YAAY,SAAS,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAChD,CACD,CACD;EAGA,OAAO,MAAM,MAAM,KAClB,OAAO,KAAK,UAAU,YAAY,OAAO,OAAO,KAAK,EAAE,CAAC,GACxD,OAAO,OAAO,OAAO,MAAM,GAC3B,OAAO,KAAK,SAAS,KAAK,KAAK,GAC/B,OAAO,KAAK,SAAS,MAAM,CAAC,IAAI,CAAC,CAAC,GAClC,OAAO,OAAO,eAAe,GAC7B,OAAO,OACR;CACD,CAAC;AACF,CAAC;;AAGD,MAAM,SAAS,SAAoB,cAClC,OAAO,IAAI,aAAa;CACvB,MAAM,WAAW,OAAO,OAAO,KAAK,QAAQ,OAAO;CACnD,MAAM,WAAW,OAAO,OAAO,KAAK,SAAS,MAAM,UAAU,QAAQ,CAAC;CACtE,MAAM,QAAQ,MAAM,OACnB,CAAC,UAAU,QAAQ,GACnB,MAAM,QACL,OAA6B,SAC7B,KAAK,UAAU,IAAI,IAAI,MAAM,QAAQ,OAAO,KAAK,KAAK,IAAI,KAC5D;CACA,IAAI,MAAM,QAAQ,SAAS,GAC1B,OAAO,OAAO,OAAO,UAAU,aAAa,KAAK,CAAC;AACpD,CAAC;AAEF,MAAM,OAAO,OAAO,WAAW,WAAW,QAAgB,WAAmB;CAC5E,MAAM,YAAY,OAAOA;CACzB,OAAO,MAAM,QAAQ,gBAAgB,SAAS;CAC9C,MAAM,WAAW,OAAOC,KAAc,SAAS;CAC/C,MAAM,WAAW,OAAO,eAAe,KAAK;EAAE,MAAM;EAAW;CAAS,CAAC;CACzE,OAAO,MAAM,QAAQ,eAAe,gBAAgB,QAAQ;CAC5D,MAAM,UAAU,OAAO,MAAM,OAAO,QAAQ,SAAS;EACpD,MAAM;EACN,OAAO;CACR,CAAC;CACD,OAAO,QAAQ;CAEf,QAAO,OADgB,MAAM,OAAO,KAAK,EAAA,CAC1B;CACf,OAAO,OAAO,SAAS,MAAM,UAAU,KAAK,CAAC,CAAC,KAC7C,OAAO,SAAS,MAAM,SAAS,SAAS,CAAC,CAC1C;AACD,CAAC;AACD,MAAa,MAAM,OAAO,WAAW,WAAW,QAAgB;CAC/D,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,OAAO,KAAK,QAAQ,MAAM;CAChC,MAAM,YAAY,KAAK,QAAQ,IAAI;CACnC,OAAO,OAAO,KAAK,MAAM,SAAS,CAAC,CAAC,KACnC,OAAO,UAAU,UAChB,aAAa,KAAK;EACjB,QAAQ;EACR,OAAO,MAAM,KAAK,KAAK;CACxB,CAAC,CACF,GACA,OAAO,eAAe,iBAAiB,OAAO,KAAK,SAAS,CAAC,GAC7D,OAAO,eAAe,OAAO,aAAa,IAAI,CAC/C;AACD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Port } from "./port.js";
|
|
2
|
+
import { Graft } from "@graftland/graft";
|
|
3
|
+
import { Context, Effect, Scope } from "effect";
|
|
4
|
+
import { Rpc, RpcClient, RpcClientError, RpcGroup } from "effect/rpc";
|
|
5
|
+
type Peer = Port;
|
|
6
|
+
/** RPC types stay inside the descriptor; Graft supplies its dynamic activation context. */
|
|
7
|
+
export interface Service<R = never, ClientR = never> {
|
|
8
|
+
readonly key: Context.Key<unknown, unknown>;
|
|
9
|
+
readonly group: Pick<RpcGroup.RpcGroup<Rpc.Any>, "requests">;
|
|
10
|
+
readonly serve: (port: Pick<Peer, "serverProtocol">) => Effect.Effect<never, never, R>;
|
|
11
|
+
readonly publish: (port: Pick<Peer, "clientProtocol">) => Effect.Effect<void, Graft.ServiceConflict, Graft.Graft | Scope.Scope | ClientR>;
|
|
12
|
+
}
|
|
13
|
+
export declare const service: <I, S, R extends Rpc.Any, H extends RpcGroup.HandlersFrom<R>>(key: Context.Key<I, S>, group: RpcGroup.RpcGroup<R>, mapping: {
|
|
14
|
+
readonly toHandlers: (value: S) => H;
|
|
15
|
+
readonly fromClient: (client: RpcClient.RpcClient<R, RpcClientError.RpcClientError>) => S;
|
|
16
|
+
}) => Service<RpcGroup.HandlersServices<R, H> | Rpc.Middleware<R> | Rpc.ServicesServer<R>, Rpc.MiddlewareClient<R>>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","names":["Port.Port"],"sources":["../../src/internal/services.ts"],"mappings":";;;;KAOK,OAAOA;;iBAGK,QAAQ,WAAW;WAC1B,KAAK,QAAQ;WACb,OAAO,KAAK,SAAS,SAAS,IAAI;WAClC,QACR,MAAM,KAAK,4BACP,OAAO,qBAAqB;WACxB,UACR,MAAM,KAAK,4BACP,OAAO,aAEX,MAAM,iBACN,MAAM,QAAQ,MAAM,QAAQ;;qBAGjB,UACZ,GACA,GACA,UAAU,IAAI,KACd,UAAU,SAAS,aAAa,IAAE,KAE7B,QAAQ,IAAI,GAAG,IAAE,OACf,SAAS,SAAS,IAAE;WAEjB,aAAa,OAAO,MAAM;WAC1B,aACR,QAAQ,UAAU,UAAU,GAAG,eAAe,oBAC1C;MAEJ,QACF,SAAS,iBAAiB,GAAG,KAAK,IAAI,WAAW,KAAK,IAAI,eAAe,IACzE,IAAI,iBAAiB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Graft } from "@graftland/graft";
|
|
2
|
+
import { Array, Context, Effect, Record } from "effect";
|
|
3
|
+
import { RpcClient, RpcServer } from "effect/rpc";
|
|
4
|
+
// src/internal/services.ts
|
|
5
|
+
const service = (key, group, mapping) => ({
|
|
6
|
+
key,
|
|
7
|
+
group,
|
|
8
|
+
serve: Effect.fnUntraced(function* (port) {
|
|
9
|
+
const context = yield* Effect.context();
|
|
10
|
+
const value = yield* Effect.fromOption(Context.getOption(context, key)).pipe(Effect.orDie);
|
|
11
|
+
const handlers = yield* group.toHandlers(mapping.toHandlers(value));
|
|
12
|
+
return yield* RpcServer.make(group, { disableFatalDefects: true }).pipe(Effect.provideContext(handlers), Effect.provideService(RpcServer.Protocol, port.serverProtocol(key.key)));
|
|
13
|
+
}),
|
|
14
|
+
publish: Effect.fnUntraced(function* (port) {
|
|
15
|
+
const client = yield* RpcClient.make(group).pipe(Effect.provideService(RpcClient.Protocol, port.clientProtocol(key.key)));
|
|
16
|
+
yield* Graft.provide(key, mapping.fromClient(client));
|
|
17
|
+
})
|
|
18
|
+
});
|
|
19
|
+
const endpoints = (services) => Record.fromEntries(Array.map(services, (service) => [service.key.key, service.group]));
|
|
20
|
+
export { endpoints, service };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","names":[],"sources":["../../src/internal/services.ts"],"sourcesContent":["import { Array, Context, Effect, Record } from \"effect\"\nimport { Graft } from \"@graftland/graft\"\nimport { RpcClient, RpcServer } from \"effect/rpc\"\nimport type { Scope } from \"effect\"\nimport type { Rpc, RpcClientError, RpcGroup } from \"effect/rpc\"\nimport type * as Port from \"./port\"\n\ntype Peer = Port.Port\n\n/** RPC types stay inside the descriptor; Graft supplies its dynamic activation context. */\nexport interface Service<R = never, ClientR = never> {\n\treadonly key: Context.Key<unknown, unknown>\n\treadonly group: Pick<RpcGroup.RpcGroup<Rpc.Any>, \"requests\">\n\treadonly serve: (\n\t\tport: Pick<Peer, \"serverProtocol\">,\n\t) => Effect.Effect<never, never, R>\n\treadonly publish: (\n\t\tport: Pick<Peer, \"clientProtocol\">,\n\t) => Effect.Effect<\n\t\tvoid,\n\t\tGraft.ServiceConflict,\n\t\tGraft.Graft | Scope.Scope | ClientR\n\t>\n}\nexport const service = <\n\tI,\n\tS,\n\tR extends Rpc.Any,\n\tH extends RpcGroup.HandlersFrom<R>,\n>(\n\tkey: Context.Key<I, S>,\n\tgroup: RpcGroup.RpcGroup<R>,\n\tmapping: {\n\t\treadonly toHandlers: (value: S) => H\n\t\treadonly fromClient: (\n\t\t\tclient: RpcClient.RpcClient<R, RpcClientError.RpcClientError>,\n\t\t) => S\n\t},\n): Service<\n\tRpcGroup.HandlersServices<R, H> | Rpc.Middleware<R> | Rpc.ServicesServer<R>,\n\tRpc.MiddlewareClient<R>\n> => ({\n\tkey,\n\tgroup,\n\tserve: Effect.fnUntraced(function* (port) {\n\t\t// Graft admits the activation from this descriptor's key before serving it.\n\t\tconst context = yield* Effect.context<never>()\n\t\tconst value = yield* Effect.fromOption(\n\t\t\tContext.getOption(context, key),\n\t\t).pipe(Effect.orDie)\n\t\tconst handlers = yield* group.toHandlers(mapping.toHandlers(value))\n\t\treturn yield* RpcServer.make(group, { disableFatalDefects: true }).pipe(\n\t\t\tEffect.provideContext(handlers),\n\t\t\tEffect.provideService(RpcServer.Protocol, port.serverProtocol(key.key)),\n\t\t)\n\t}),\n\tpublish: Effect.fnUntraced(function* (port) {\n\t\tconst client = yield* RpcClient.make(group).pipe(\n\t\t\tEffect.provideService(RpcClient.Protocol, port.clientProtocol(key.key)),\n\t\t)\n\t\tyield* Graft.provide(key, mapping.fromClient(client))\n\t}),\n})\nexport const endpoints = (services: ReadonlyArray<Service>) =>\n\tRecord.fromEntries(\n\t\tArray.map(\n\t\t\tservices,\n\t\t\t(service) =>\n\t\t\t\t[service.key.key, service.group] satisfies readonly [\n\t\t\t\t\tstring,\n\t\t\t\t\tService[\"group\"],\n\t\t\t\t],\n\t\t),\n\t)\n"],"mappings":";;;;AAwBA,MAAa,WAMZ,KACA,OACA,aASK;CACL;CACA;CACA,OAAO,OAAO,WAAW,WAAW,MAAM;EAEzC,MAAM,UAAU,OAAO,OAAO,QAAe;EAC7C,MAAM,QAAQ,OAAO,OAAO,WAC3B,QAAQ,UAAU,SAAS,GAAG,CAC/B,CAAC,CAAC,KAAK,OAAO,KAAK;EACnB,MAAM,WAAW,OAAO,MAAM,WAAW,QAAQ,WAAW,KAAK,CAAC;EAClE,OAAO,OAAO,UAAU,KAAK,OAAO,EAAE,qBAAqB,KAAK,CAAC,CAAC,CAAC,KAClE,OAAO,eAAe,QAAQ,GAC9B,OAAO,eAAe,UAAU,UAAU,KAAK,eAAe,IAAI,GAAG,CAAC,CACvE;CACD,CAAC;CACD,SAAS,OAAO,WAAW,WAAW,MAAM;EAC3C,MAAM,SAAS,OAAO,UAAU,KAAK,KAAK,CAAC,CAAC,KAC3C,OAAO,eAAe,UAAU,UAAU,KAAK,eAAe,IAAI,GAAG,CAAC,CACvE;EACA,OAAO,MAAM,QAAQ,KAAK,QAAQ,WAAW,MAAM,CAAC;CACrD,CAAC;AACF;AACA,MAAa,aAAa,aACzB,OAAO,YACN,MAAM,IACL,WACC,YACA,CAAC,QAAQ,IAAI,KAAK,QAAQ,KAAK,CAIjC,CACD"}
|