@graftland/plugin-remote 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -54
- package/README.zh-CN.md +17 -51
- package/README.zh-TW.md +17 -51
- package/dist/Auth.d.ts.map +1 -1
- package/dist/Auth.js.map +1 -1
- package/dist/Config.d.ts +1151 -0
- package/dist/Config.d.ts.map +1 -0
- package/dist/Config.js +183 -0
- package/dist/Config.js.map +1 -0
- package/dist/Contract.d.ts +1 -1
- package/dist/Contract.d.ts.map +1 -1
- package/dist/Contract.js +32 -1
- package/dist/Contract.js.map +1 -1
- package/dist/Instance.d.ts.map +1 -1
- package/dist/Instance.js.map +1 -1
- package/dist/Testing.d.ts +1 -1
- package/dist/Testing.d.ts.map +1 -1
- package/dist/Testing.js.map +1 -1
- package/dist/Transport.d.ts +1 -1
- package/dist/Transport.d.ts.map +1 -1
- package/dist/Transport.js.map +1 -1
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +25 -0
- package/dist/cli.js.map +1 -0
- package/dist/host/auth/bearer.d.ts +9 -1
- package/dist/host/auth/bearer.d.ts.map +1 -1
- package/dist/host/auth/bearer.js +4 -2
- package/dist/host/auth/bearer.js.map +1 -1
- package/dist/host/auth/jwt.d.ts +9 -1
- package/dist/host/auth/jwt.d.ts.map +1 -1
- package/dist/host/auth/jwt.js +4 -2
- package/dist/host/auth/jwt.js.map +1 -1
- package/dist/host/auth/mtls.d.ts +10 -7
- package/dist/host/auth/mtls.d.ts.map +1 -1
- package/dist/host/auth/mtls.js +13 -14
- package/dist/host/auth/mtls.js.map +1 -1
- package/dist/host/auth/none.d.ts +3 -1
- package/dist/host/auth/none.js +7 -5
- package/dist/host/auth/none.js.map +1 -1
- package/dist/host/command.d.ts +14 -1
- package/dist/host/command.d.ts.map +1 -1
- package/dist/host/command.js +11 -9
- package/dist/host/command.js.map +1 -1
- package/dist/host/local.d.ts +2 -1
- package/dist/host/local.d.ts.map +1 -1
- package/dist/host/local.js +9 -30
- package/dist/host/local.js.map +1 -1
- package/dist/host/unix.d.ts +6 -1
- package/dist/host/unix.d.ts.map +1 -1
- package/dist/host/unix.js +13 -9
- package/dist/host/unix.js.map +1 -1
- package/dist/host/websocket.d.ts +10 -1
- package/dist/host/websocket.d.ts.map +1 -1
- package/dist/host/websocket.js +11 -8
- package/dist/host/websocket.js.map +1 -1
- package/dist/host/worker.d.ts +3 -1
- package/dist/host/worker.d.ts.map +1 -1
- package/dist/host/worker.js +13 -9
- package/dist/host/worker.js.map +1 -1
- package/dist/index.d.ts +6 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -64
- package/dist/index.js.map +1 -1
- package/dist/internal/Certificates.js.map +1 -1
- package/dist/internal/FailureGroup.js +6 -6
- package/dist/internal/FailureGroup.js.map +1 -1
- package/dist/internal/Peer.js.map +1 -1
- package/dist/internal/{ServeLifecycle.js → RunnerLifecycle.js} +6 -6
- package/dist/internal/RunnerLifecycle.js.map +1 -0
- package/dist/internal/Supervisor.js.map +1 -1
- package/dist/internal/assembly.d.ts +3 -2
- package/dist/internal/assembly.js +8 -8
- package/dist/internal/assembly.js.map +1 -1
- package/dist/internal/auth/config.d.ts +27 -0
- package/dist/internal/auth/config.d.ts.map +1 -0
- package/dist/internal/auth/config.js +29 -0
- package/dist/internal/auth/config.js.map +1 -0
- package/dist/internal/auth/mtls.js.map +1 -1
- package/dist/internal/auth/token.js.map +1 -1
- package/dist/internal/auth/tokenCredentials.d.ts +2 -1
- package/dist/internal/auth/tokenCredentials.d.ts.map +1 -1
- package/dist/internal/auth/tokenCredentials.js +1 -1
- package/dist/internal/auth/tokenCredentials.js.map +1 -1
- package/dist/internal/child.js +3 -3
- package/dist/internal/child.js.map +1 -1
- package/dist/internal/childMain.js +47 -0
- package/dist/internal/childMain.js.map +1 -0
- package/dist/internal/childRuntime.js +8 -8
- package/dist/internal/childRuntime.js.map +1 -1
- package/dist/internal/cleanup.js +3 -3
- package/dist/internal/cleanup.js.map +1 -1
- package/dist/internal/contract.js.map +1 -1
- package/dist/internal/credentials.d.ts +3 -2
- package/dist/internal/credentials.d.ts.map +1 -1
- package/dist/internal/credentials.js +1 -1
- package/dist/internal/credentials.js.map +1 -1
- package/dist/internal/directTransport.js.map +1 -1
- package/dist/internal/entry.d.ts +493 -3
- package/dist/internal/entry.d.ts.map +1 -1
- package/dist/internal/entry.js +22 -9
- package/dist/internal/entry.js.map +1 -1
- package/dist/internal/entryConfig.d.ts +2 -202
- package/dist/internal/entryConfig.js +2 -136
- package/dist/internal/entryConfig.js.map +1 -1
- package/dist/internal/execution.d.ts +4 -4
- package/dist/internal/execution.js +11 -11
- package/dist/internal/execution.js.map +1 -1
- package/dist/internal/follow.js +1 -1
- package/dist/internal/follow.js.map +1 -1
- package/dist/internal/forkTree.js.map +1 -1
- package/dist/internal/host/local.js.map +1 -1
- package/dist/internal/host/runner.js +4 -4
- package/dist/internal/host/runner.js.map +1 -1
- package/dist/internal/host.js +2 -2
- package/dist/internal/host.js.map +1 -1
- package/dist/internal/importer.js +1 -1
- package/dist/internal/importer.js.map +1 -1
- package/dist/internal/listenerStartup.js +1 -1
- package/dist/internal/listenerStartup.js.map +1 -1
- package/dist/internal/loadModule.js.map +1 -1
- package/dist/internal/platform.js +1 -9
- package/dist/internal/port.d.ts +1 -1
- package/dist/internal/port.js +2 -2
- package/dist/internal/port.js.map +1 -1
- package/dist/internal/runner/Bootstrap.js.map +1 -1
- package/dist/internal/runner/Connection.d.ts +3 -2
- package/dist/internal/runner/Connection.js +6 -6
- package/dist/internal/runner/Connection.js.map +1 -1
- package/dist/internal/runner/Execution.js +6 -6
- package/dist/internal/runner/Execution.js.map +1 -1
- package/dist/internal/runner/Local.js +1 -1
- package/dist/internal/runner/Local.js.map +1 -1
- package/dist/internal/runner/Lock.js.map +1 -1
- package/dist/internal/runner/Multiplex.js.map +1 -1
- package/dist/internal/runner/Packages.js.map +1 -1
- package/dist/internal/runner/ProcessObservation.js.map +1 -1
- package/dist/internal/runner/Processes.js.map +1 -1
- package/dist/internal/runner/Retention.js.map +1 -1
- package/dist/internal/runner/Store.js.map +1 -1
- package/dist/internal/runner/Supervisor.js +5 -5
- package/dist/internal/runner/Supervisor.js.map +1 -1
- package/dist/internal/runner/Watchdog.js.map +1 -1
- package/dist/internal/runner/Wire.d.ts +1 -1
- package/dist/internal/runner/Wire.js.map +1 -1
- package/dist/internal/runner/accept.js +2 -2
- package/dist/internal/runner/accept.js.map +1 -1
- package/dist/internal/runner/command.js +1 -1
- package/dist/internal/runner/command.js.map +1 -1
- package/dist/internal/runner/connectionEnded.js +1 -1
- package/dist/internal/runner/connectionEnded.js.map +1 -1
- package/dist/internal/runner/model.d.ts.map +1 -1
- package/dist/internal/runner/model.js.map +1 -1
- package/dist/internal/services.d.ts.map +1 -1
- package/dist/internal/services.js +1 -1
- package/dist/internal/services.js.map +1 -1
- package/dist/internal/socketChannel.js.map +1 -1
- package/dist/internal/stdioChannel.js.map +1 -1
- package/dist/internal/supervisorPlugin.js +48 -1
- package/dist/internal/supervisorPlugin.js.map +1 -1
- package/dist/internal/transportOptions.d.ts.map +1 -1
- package/dist/internal/watchdogMain.js +5 -3
- package/dist/internal/watchdogMain.js.map +1 -1
- package/dist/internal/websocket.js.map +1 -1
- package/dist/internal/websocketServer.js +1 -1
- package/dist/internal/websocketServer.js.map +1 -1
- package/dist/internal/workerChannel.js.map +1 -1
- package/dist/internal/workerMain.js +13 -6
- package/dist/internal/workerMain.js.map +1 -1
- package/dist/runner/auth/bearer.d.ts +8 -5
- package/dist/runner/auth/bearer.d.ts.map +1 -1
- package/dist/runner/auth/bearer.js +13 -11
- package/dist/runner/auth/bearer.js.map +1 -1
- package/dist/runner/auth/jwt.d.ts +30 -17
- package/dist/runner/auth/jwt.d.ts.map +1 -1
- package/dist/runner/auth/jwt.js +16 -28
- package/dist/runner/auth/jwt.js.map +1 -1
- package/dist/runner/auth/mtls.d.ts +8 -6
- package/dist/runner/auth/mtls.d.ts.map +1 -1
- package/dist/runner/auth/mtls.js +13 -29
- package/dist/runner/auth/mtls.js.map +1 -1
- package/dist/runner/auth/none.d.ts +7 -1
- package/dist/runner/auth/none.js +7 -5
- package/dist/runner/auth/none.js.map +1 -1
- package/dist/runner/index.d.ts +5 -1
- package/dist/runner/index.d.ts.map +1 -1
- package/dist/runner/index.js +62 -30
- package/dist/runner/index.js.map +1 -1
- package/dist/runner/stdio.d.ts +6 -1
- package/dist/runner/stdio.d.ts.map +1 -1
- package/dist/runner/stdio.js +11 -9
- package/dist/runner/stdio.js.map +1 -1
- package/dist/runner/unix.d.ts +6 -1
- package/dist/runner/unix.d.ts.map +1 -1
- package/dist/runner/unix.js +10 -8
- package/dist/runner/unix.js.map +1 -1
- package/dist/runner/websocket.d.ts +24 -1
- package/dist/runner/websocket.d.ts.map +1 -1
- package/dist/runner/websocket.js +12 -10
- package/dist/runner/websocket.js.map +1 -1
- package/package.json +14 -12
- package/schema.json +2269 -0
- package/src/Auth.ts +8 -2
- package/src/Config.ts +196 -0
- package/src/Contract.ts +12 -3
- package/src/Instance.ts +1 -0
- package/src/Testing.ts +6 -4
- package/src/Transport.ts +12 -3
- package/src/cli.ts +60 -0
- package/src/host/auth/bearer.ts +1 -0
- package/src/host/auth/jwt.ts +1 -0
- package/src/host/auth/mtls.ts +7 -12
- package/src/host/auth/none.ts +3 -1
- package/src/host/command.ts +8 -5
- package/src/host/local.ts +4 -2
- package/src/host/unix.ts +11 -7
- package/src/host/websocket.ts +10 -7
- package/src/host/worker.ts +8 -5
- package/src/index.ts +36 -23
- package/src/internal/Certificates.ts +1 -0
- package/src/internal/FailureGroup.ts +5 -3
- package/src/internal/Peer.ts +1 -0
- package/src/internal/{ServeLifecycle.ts → RunnerLifecycle.ts} +7 -5
- package/src/internal/Supervisor.ts +5 -4
- package/src/internal/assembly.ts +11 -9
- package/src/internal/auth/config.ts +44 -0
- package/src/internal/auth/mtls.ts +1 -0
- package/src/internal/auth/token.ts +1 -0
- package/src/internal/auth/tokenCredentials.ts +4 -2
- package/src/internal/child.ts +8 -6
- package/src/{bin.ts → internal/childMain.ts} +16 -61
- package/src/internal/childRuntime.ts +12 -10
- package/src/internal/cleanup.ts +3 -2
- package/src/internal/contract.ts +1 -0
- package/src/internal/credentials.ts +3 -1
- package/src/internal/directTransport.ts +9 -2
- package/src/internal/entry.ts +53 -16
- package/src/internal/entryConfig.ts +10 -132
- package/src/internal/execution.ts +17 -15
- package/src/internal/follow.ts +2 -1
- package/src/internal/forkTree.ts +2 -1
- package/src/internal/host/local.ts +1 -0
- package/src/internal/host/runner.ts +7 -5
- package/src/internal/host.ts +9 -8
- package/src/internal/importer.ts +3 -2
- package/src/internal/listenerStartup.ts +4 -2
- package/src/internal/loadModule.ts +1 -0
- package/src/internal/platform.ts +1 -12
- package/src/internal/port.ts +11 -6
- package/src/internal/runner/Bootstrap.ts +1 -0
- package/src/internal/runner/Connection.ts +13 -11
- package/src/internal/runner/Execution.ts +14 -13
- package/src/internal/runner/Local.ts +3 -2
- package/src/internal/runner/Lock.ts +1 -0
- package/src/internal/runner/Multiplex.ts +2 -1
- package/src/internal/runner/Packages.ts +7 -5
- package/src/internal/runner/ProcessObservation.ts +2 -1
- package/src/internal/runner/Processes.ts +3 -1
- package/src/internal/runner/Retention.ts +1 -0
- package/src/internal/runner/Store.ts +3 -2
- package/src/internal/runner/Supervisor.ts +22 -20
- package/src/internal/runner/Watchdog.ts +3 -1
- package/src/internal/runner/Wire.ts +13 -12
- package/src/internal/runner/accept.ts +6 -5
- package/src/internal/runner/command.ts +3 -2
- package/src/internal/runner/connectionEnded.ts +2 -1
- package/src/internal/runner/model.ts +5 -3
- package/src/internal/services.ts +9 -2
- package/src/internal/socketChannel.ts +2 -1
- package/src/internal/stdioChannel.ts +4 -2
- package/src/internal/supervisorPlugin.ts +10 -8
- package/src/internal/transportOptions.ts +1 -0
- package/src/internal/watchdogMain.ts +5 -3
- package/src/internal/websocket.ts +5 -2
- package/src/internal/websocketServer.ts +6 -4
- package/src/internal/workerChannel.ts +1 -0
- package/src/internal/workerMain.ts +21 -5
- package/src/runner/auth/bearer.ts +10 -6
- package/src/runner/auth/jwt.ts +10 -41
- package/src/runner/auth/mtls.ts +6 -3
- package/src/runner/auth/none.ts +3 -1
- package/src/runner/index.ts +102 -11
- package/src/runner/stdio.ts +15 -10
- package/src/runner/unix.ts +7 -4
- package/src/runner/websocket.ts +9 -7
- package/dist/Auth-BElTC9_X.js +0 -6
- package/dist/Bootstrap-H9gDsgsC.js +0 -9
- package/dist/ConfigDirectory-BCC6q2R4.js +0 -5
- package/dist/Contract-DsJtisvL.js +0 -83
- package/dist/Errors-DYhsGZcZ.js +0 -58
- package/dist/FailureGroup-BgT73AaR.js +0 -63
- package/dist/Framing-G9eSaeLb.js +0 -61
- package/dist/Graft-B71CPA2Y.js +0 -996
- package/dist/Packages-AgoCGotL.js +0 -108
- package/dist/Peer-DXeVrGBh.js +0 -342
- package/dist/ProcessObservation-gLgGirYv.js +0 -38
- package/dist/ServeLifecycle-Bd1FPJ6e.js +0 -24
- package/dist/Transport-DULzpsgR.js +0 -6
- package/dist/WatchdogProtocol-BZmVxrBP.js +0 -17
- package/dist/bin.js +0 -28276
- package/dist/bin.js.map +0 -1
- package/dist/childRuntime-Bm3iSg_N.js +0 -192
- package/dist/command-9zrHdbwT.js +0 -7
- package/dist/connectionEnded-BwcxQ7W8.js +0 -54
- package/dist/directTransport-DrexuPSm.js +0 -5
- package/dist/entry-psOpX3Bj.js +0 -736
- package/dist/importer-Cvf88eAY.js +0 -344
- package/dist/internal/ServeLifecycle.js.map +0 -1
- package/dist/internal/entryConfig.d.ts.map +0 -1
- package/dist/internal/platform.js.map +0 -1
- package/dist/internal/release.js +0 -25
- package/dist/internal/release.js.map +0 -1
- package/dist/internal/serve.js +0 -60
- package/dist/internal/serve.js.map +0 -1
- package/dist/port--3x2zJ4D.js +0 -285
- package/dist/release-DfZPuIcK.js +0 -23
- package/dist/rolldown-runtime-DYf_mQCB.js +0 -34
- package/dist/socketChannel-CJvL2DiB.js +0 -3658
- package/dist/supervisorPlugin-t6Z6PrhD.js +0 -733
- package/dist/token-CYBNNlhS.js +0 -17
- package/dist/tokenCredentials-CbCuk-Rt.js +0 -31
- package/dist/websocketServer-NQhODlEt.js +0 -60
- package/dist/workerChannel-C8hhBJzA.js +0 -27
- package/src/internal/release.ts +0 -72
- package/src/internal/serve.ts +0 -119
- /package/dist/{bin.d.ts → internal/childMain.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","names":[],"sources":["../../../src/internal/auth/token.ts"],"sourcesContent":["import { Effect, Option, Redacted } from \"effect\"\nimport { AuthenticationFailed } from \"../../Errors\"\n\nexport const invalid = () =>\n\tAuthenticationFailed.make({\n\t\treason: \"invalid\",\n\t\tchallenge: 'Bearer error=\"invalid_token\"',\n\t})\nexport const read = (\n\tauthorization: Option.Option<Redacted.Redacted<string>>,\n): Effect.Effect<Redacted.Redacted<string>, AuthenticationFailed> => {\n\tif (Option.isNone(authorization))\n\t\treturn Effect.fail(\n\t\t\tAuthenticationFailed.make({\n\t\t\t\treason: \"missing\",\n\t\t\t\tchallenge: \"Bearer\",\n\t\t\t}),\n\t\t)\n\tconst match = /^Bearer +([^ ]+)$/i.exec(Redacted.value(authorization.value))\n\tconst token = match?.[1]\n\treturn token === undefined\n\t\t? Effect.fail(invalid())\n\t\t: Effect.succeed(Redacted.make(token))\n}\nexport const prepare = (token: Redacted.Redacted<string>) =>\n\tEffect.succeed(Redacted.make(\"Bearer \" + Redacted.value(token)))\n"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"token.js","names":[],"sources":["../../../src/internal/auth/token.ts"],"sourcesContent":["import { Effect, Option, Redacted } from \"effect\"\n\nimport { AuthenticationFailed } from \"../../Errors\"\n\nexport const invalid = () =>\n\tAuthenticationFailed.make({\n\t\treason: \"invalid\",\n\t\tchallenge: 'Bearer error=\"invalid_token\"',\n\t})\nexport const read = (\n\tauthorization: Option.Option<Redacted.Redacted<string>>,\n): Effect.Effect<Redacted.Redacted<string>, AuthenticationFailed> => {\n\tif (Option.isNone(authorization))\n\t\treturn Effect.fail(\n\t\t\tAuthenticationFailed.make({\n\t\t\t\treason: \"missing\",\n\t\t\t\tchallenge: \"Bearer\",\n\t\t\t}),\n\t\t)\n\tconst match = /^Bearer +([^ ]+)$/i.exec(Redacted.value(authorization.value))\n\tconst token = match?.[1]\n\treturn token === undefined\n\t\t? Effect.fail(invalid())\n\t\t: Effect.succeed(Redacted.make(token))\n}\nexport const prepare = (token: Redacted.Redacted<string>) =>\n\tEffect.succeed(Redacted.make(\"Bearer \" + Redacted.value(token)))\n"],"mappings":";;;AAIA,MAAa,gBACZ,qBAAqB,KAAK;CACzB,QAAQ;CACR,WAAW;AACZ,CAAC;AACF,MAAa,QACZ,kBACoE;CACpE,IAAI,OAAO,OAAO,aAAa,GAC9B,OAAO,OAAO,KACb,qBAAqB,KAAK;EACzB,QAAQ;EACR,WAAW;CACZ,CAAC,CACF;CAED,MAAM,QADQ,qBAAqB,KAAK,SAAS,MAAM,cAAc,KAAK,CACxD,CAAC,GAAG;CACtB,OAAO,UAAU,KAAA,IACd,OAAO,KAAK,QAAQ,CAAC,IACrB,OAAO,QAAQ,SAAS,KAAK,KAAK,CAAC;AACvC;AACA,MAAa,WAAW,UACvB,OAAO,QAAQ,SAAS,KAAK,YAAY,SAAS,MAAM,KAAK,CAAC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Schema } from "effect";
|
|
1
|
+
import { Redacted, Schema } from "effect";
|
|
2
|
+
import { Graft, Plugin } from "@graftland/graft";
|
|
2
3
|
export declare const Config: Schema.Struct<{
|
|
3
4
|
readonly token: Schema.Union<readonly [Schema.RedactedFromValue<Schema.String>, Schema.Struct<{
|
|
4
5
|
readonly file: Schema.String;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenCredentials.d.ts","names":[],"sources":["../../../src/internal/auth/tokenCredentials.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"tokenCredentials.d.ts","names":[],"sources":["../../../src/internal/auth/tokenCredentials.ts"],"mappings":";;qBAiBa,QAAM,OAAA"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Credentials } from "../../Auth.js";
|
|
2
2
|
import { CredentialsError } from "../../Errors.js";
|
|
3
3
|
import { prepare } from "./token.js";
|
|
4
|
+
import { Cause, Effect, FileSystem, Option, Path, Redacted, Schema } from "effect";
|
|
4
5
|
import { Graft, Plugin } from "@graftland/graft";
|
|
5
6
|
import { ConfigDirectory } from "@graftland/loader";
|
|
6
|
-
import { Cause, Effect, FileSystem, Option, Path, Redacted, Schema } from "effect";
|
|
7
7
|
// src/internal/auth/tokenCredentials.ts
|
|
8
8
|
const Config = Schema.Struct({ token: Schema.Union([Schema.RedactedFromValue(Schema.String), Schema.Struct({ file: Schema.String })]) });
|
|
9
9
|
const plugin = (name) => Plugin.make({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenCredentials.js","names":[],"sources":["../../../src/internal/auth/tokenCredentials.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"tokenCredentials.js","names":[],"sources":["../../../src/internal/auth/tokenCredentials.ts"],"sourcesContent":["import {\n\tCause,\n\tEffect,\n\tFileSystem,\n\tOption,\n\tPath,\n\tRedacted,\n\tSchema,\n} from \"effect\"\n\nimport { Graft, Plugin } from \"@graftland/graft\"\nimport { ConfigDirectory } from \"@graftland/loader\"\n\nimport { Credentials, type Prepared } from \"../../Auth\"\nimport { CredentialsError } from \"../../Errors\"\nimport { prepare } from \"./token\"\n\nexport const Config = Schema.Struct({\n\ttoken: Schema.Union([\n\t\tSchema.RedactedFromValue(Schema.String),\n\t\tSchema.Struct({ file: Schema.String }),\n\t]),\n})\nexport const plugin = (name: string) =>\n\tPlugin.make({\n\t\tname,\n\t\tconfig: Config,\n\t\tinject: [FileSystem.FileSystem, Path.Path],\n\t\tapply: Effect.fnUntraced(function* (config) {\n\t\t\tconst fs = yield* FileSystem.FileSystem\n\t\t\tconst path = yield* Path.Path\n\t\t\tconst directory = yield* ConfigDirectory\n\t\t\tconst token = config.token\n\t\t\tconst read = Redacted.isRedacted(token)\n\t\t\t\t? Effect.succeed(token)\n\t\t\t\t: fs\n\t\t\t\t\t\t.readFileString(\n\t\t\t\t\t\t\tpath.resolve(\n\t\t\t\t\t\t\t\tOption.getOrElse(directory, () => \".\"),\n\t\t\t\t\t\t\t\ttoken.file,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.pipe(Effect.map(Redacted.make))\n\t\t\tyield* Graft.provide(Credentials, {\n\t\t\t\tkind: \"Authorization\",\n\t\t\t\tread: read.pipe(\n\t\t\t\t\tEffect.flatMap(prepare),\n\t\t\t\t\tEffect.mapBoth({\n\t\t\t\t\t\tonSuccess: (\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t): Extract<Prepared, { readonly _tag: \"Authorization\" }> => ({\n\t\t\t\t\t\t\t_tag: \"Authorization\",\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tonFailure: (error) =>\n\t\t\t\t\t\t\tCredentialsError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t})\n\t\t}),\n\t})\n"],"mappings":";;;;;;;AAiBA,MAAa,SAAS,OAAO,OAAO,EACnC,OAAO,OAAO,MAAM,CACnB,OAAO,kBAAkB,OAAO,MAAM,GACtC,OAAO,OAAO,EAAE,MAAM,OAAO,OAAO,CAAC,CACtC,CAAC,EACF,CAAC;AACD,MAAa,UAAU,SACtB,OAAO,KAAK;CACX;CACA,QAAQ;CACR,QAAQ,CAAC,WAAW,YAAY,KAAK,IAAI;CACzC,OAAO,OAAO,WAAW,WAAW,QAAQ;EAC3C,MAAM,KAAK,OAAO,WAAW;EAC7B,MAAM,OAAO,OAAO,KAAK;EACzB,MAAM,YAAY,OAAO;EACzB,MAAM,QAAQ,OAAO;EACrB,MAAM,OAAO,SAAS,WAAW,KAAK,IACnC,OAAO,QAAQ,KAAK,IACpB,GACC,eACA,KAAK,QACJ,OAAO,UAAU,iBAAiB,GAAG,GACrC,MAAM,IACP,CACD,CAAC,CACA,KAAK,OAAO,IAAI,SAAS,IAAI,CAAC;EAClC,OAAO,MAAM,QAAQ,aAAa;GACjC,MAAM;GACN,MAAM,KAAK,KACV,OAAO,QAAQ,OAAO,GACtB,OAAO,QAAQ;IACd,YACC,WAC4D;KAC5D,MAAM;KACN;IACD;IACA,YAAY,UACX,iBAAiB,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC;GACpD,CAAC,CACF;EACD,CAAC;CACF,CAAC;AACF,CAAC"}
|
package/dist/internal/child.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { loadModule } from "./loadModule.js";
|
|
2
|
-
import { ActivationFailed, AlreadyLoaded } from "./childErrors.js";
|
|
3
1
|
import { Instance } from "../Instance.js";
|
|
4
|
-
import {
|
|
2
|
+
import { ActivationFailed, AlreadyLoaded } from "./childErrors.js";
|
|
3
|
+
import { loadModule } from "./loadModule.js";
|
|
5
4
|
import { Array, Cause, Data, Deferred, Effect, Exit, Fiber, Logger, MutableRef, Option, Queue, Ref, References, Scope, Stream, SynchronizedRef } from "effect";
|
|
5
|
+
import { Graft, Plugin } from "@graftland/graft";
|
|
6
6
|
// src/internal/child.ts
|
|
7
7
|
const ChildEvent = Data.taggedEnum();
|
|
8
8
|
/** Queue data; serialization belongs to the RPC consumer, outside synchronous logger callbacks. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child.js","names":[],"sources":["../../src/internal/child.ts"],"sourcesContent":["import { loadModule } from \"./loadModule\"\nimport { AlreadyLoaded, ActivationFailed } from \"./childErrors\"\nimport { Graft, Plugin, type Fork } from \"@graftland/graft\"\nimport {\n\tArray,\n\tCause,\n\tData,\n\tDeferred,\n\tEffect,\n\tExit,\n\tFiber,\n\tLogger,\n\tMutableRef,\n\tOption,\n\tQueue,\n\tRef,\n\tReferences,\n\tScope,\n\tStream,\n\tSynchronizedRef,\n} from \"effect\"\nimport type { Schema } from \"effect\"\nimport { type RunnerContract } from \"./contract\"\nimport { Instance, type Identity } from \"../Instance\"\nimport type * as Port from \"./port\"\nimport type { Event, Log, LogEvent } from \"./control\"\n\ntype Peer = Port.Port\ntype ChildEvent = Data.TaggedEnum<{\n\tFailed: { readonly cause: Cause.Cause<unknown> }\n\tWithdrawing: {}\n\tStopped: {}\n}>\nconst ChildEvent = Data.taggedEnum<ChildEvent>()\ntype LogEntry = Omit<typeof Log.Type, \"cause\"> & {\n\treadonly cause: Cause.Cause<unknown>\n}\n\n/** Queue data; serialization belongs to the RPC consumer, outside synchronous logger callbacks. */\nexport const telemetry = Effect.fnUntraced(function* (\n\tcontract: RunnerContract,\n) {\n\tconst events = yield* Queue.bounded<ChildEvent>(2)\n\tconst logs = yield* Queue.dropping<LogEntry, Cause.Done>(128)\n\tconst dropped = MutableRef.make(0)\n\tconst encode = (cause: Cause.Cause<unknown>) =>\n\t\tcontract.encodeCause(cause).pipe(Effect.orDie)\n\tconst logger = Logger.make((entry) => {\n\t\t// Logger callbacks are synchronous; a dropping offer and loss counter cannot suspend.\n\t\tconst accepted = Queue.offerUnsafe(logs, {\n\t\t\tlevel: entry.logLevel,\n\t\t\tmessage: entry.message,\n\t\t\tcause: entry.cause,\n\t\t\tannotations: entry.fiber.getRef(References.CurrentLogAnnotations),\n\t\t})\n\t\tif (!accepted) MutableRef.increment(dropped)\n\t})\n\treturn {\n\t\tevents,\n\t\tlogs,\n\t\tlogger,\n\t\teventStream: Stream.fromQueue(events).pipe(\n\t\t\tStream.mapEffect((event): Effect.Effect<typeof Event.Type> =>\n\t\t\t\tevent._tag === \"Failed\"\n\t\t\t\t\t? encode(event.cause).pipe(\n\t\t\t\t\t\t\tEffect.map(\n\t\t\t\t\t\t\t\t(cause) =>\n\t\t\t\t\t\t\t\t\t({\n\t\t\t\t\t\t\t\t\t\t_tag: \"Failed\",\n\t\t\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t\t\t}) satisfies typeof Event.Type,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t: Effect.succeed(event),\n\t\t\t),\n\t\t),\n\t\tlogStream: Stream.fromQueue(logs).pipe(\n\t\t\tStream.mapEffect((entry) =>\n\t\t\t\tencode(entry.cause).pipe(\n\t\t\t\t\tEffect.map((cause): typeof LogEvent.Type => ({\n\t\t\t\t\t\t_tag: \"Log\",\n\t\t\t\t\t\tentry: { ...entry, cause },\n\t\t\t\t\t\tdropped: MutableRef.get(dropped),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t),\n\t\t\tStream.concat(\n\t\t\t\tStream.sync((): typeof LogEvent.Type => ({\n\t\t\t\t\t_tag: \"LogsEnded\",\n\t\t\t\t\tdropped: MutableRef.get(dropped),\n\t\t\t\t})),\n\t\t\t),\n\t\t),\n\t}\n})\ntype Telemetry = Effect.Success<ReturnType<typeof telemetry>>\ninterface Running {\n\treadonly fork: Pick<Fork.Fork<never, unknown>, \"dispose\" | \"state\">\n\treadonly bridge: Pick<Fork.Fork<never, never>, \"dispose\" | \"state\">\n\treadonly observation: Fiber.Fiber<void>\n\treadonly observedFailure: Ref.Ref<Cause.Cause<unknown>>\n}\ntype Lifecycle = Data.TaggedEnum<{\n\tIdle: {}\n\tLoading: {}\n\tRunning: { readonly running: Running }\n\tWithdrawing: { readonly running: Option.Option<Running> }\n\tDisposing: { readonly running: Option.Option<Running> }\n}>\nconst Lifecycle = Data.taggedEnum<Lifecycle>()\nconst runningOf = (state: Lifecycle): Option.Option<Running> =>\n\tstate._tag === \"Running\"\n\t\t? Option.some(state.running)\n\t\t: state._tag === \"Withdrawing\" || state._tag === \"Disposing\"\n\t\t\t? state.running\n\t\t\t: Option.none()\n\nconst cleanup = Effect.fnUntraced(function* (\n\trunning: Running,\n\tretired: boolean,\n) {\n\tconst pluginExit = yield* Effect.exit(running.fork.dispose)\n\tconst bridgeExit = yield* Effect.exit(running.bridge.dispose)\n\tyield* Fiber.join(running.observation)\n\tconst failed = yield* Ref.get(running.observedFailure)\n\treturn Array.reduce(\n\t\t[bridgeExit, pluginExit],\n\t\tretired ? failed : Cause.empty,\n\t\t(cause, exit) =>\n\t\t\tExit.isFailure(exit)\n\t\t\t\t? Cause.combine(\n\t\t\t\t\t\tcause,\n\t\t\t\t\t\tCause.fromReasons(\n\t\t\t\t\t\t\tArray.flatMap(exit.cause.reasons, (reason) =>\n\t\t\t\t\t\t\t\treason._tag === \"Fail\" ? reason.error.cause.reasons : [reason],\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: cause,\n\t)\n})\n\nexport const lifecycle = Effect.fnUntraced(function* (\n\tcontract: RunnerContract,\n\tpeer: Peer,\n\tidentity: typeof Identity.Type,\n\ttelemetry: Telemetry,\n) {\n\tconst scope = yield* Effect.scope\n\tconst instanceScope = yield* Scope.fork(scope)\n\tconst releaseExports = yield* Deferred.make<void>()\n\tconst state = yield* SynchronizedRef.make<Lifecycle>(Lifecycle.Idle())\n\t// This gate represents host consumers draining, not a second lifecycle state.\n\tconst disposing = (current: Lifecycle) =>\n\t\tLifecycle.Disposing({ running: runningOf(current) })\n\tconst release = SynchronizedRef.update(state, disposing).pipe(\n\t\tEffect.andThen(Deferred.succeed(releaseExports, undefined)),\n\t)\n\n\tconst exportBridge = Graft.plugin(\n\t\tPlugin.make({\n\t\t\tname: `${contract.name}/exports`,\n\t\t\tinject: Array.map(contract.provides, (service) => service.key),\n\t\t\tapply: Effect.fnUntraced(function* () {\n\t\t\t\tfor (const service of contract.provides)\n\t\t\t\t\tyield* service.serve(peer).pipe(\n\t\t\t\t\t\tEffect.tapCause((cause) =>\n\t\t\t\t\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t: Queue.offer(telemetry.events, ChildEvent.Failed({ cause })),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tEffect.forkScoped,\n\t\t\t\t\t)\n\t\t\t\tyield* Effect.addFinalizer(\n\t\t\t\t\tEffect.fnUntraced(function* () {\n\t\t\t\t\t\tconst withdrawing = yield* SynchronizedRef.modify(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t(current) =>\n\t\t\t\t\t\t\t\tcurrent._tag === \"Disposing\"\n\t\t\t\t\t\t\t\t\t? [false, current]\n\t\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t\t\tLifecycle.Withdrawing({\n\t\t\t\t\t\t\t\t\t\t\t\trunning: runningOf(current),\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (withdrawing)\n\t\t\t\t\t\t\tyield* Queue.offer(telemetry.events, ChildEvent.Withdrawing())\n\t\t\t\t\t\tyield* Deferred.await(releaseExports)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}),\n\t\t}),\n\t).pipe(Scope.provide(instanceScope))\n\n\tconst start = Effect.fnUntraced(function* (input: Schema.Json) {\n\t\t// Imported clients outlive Load and remain available during plugin cleanup.\n\t\tfor (const service of contract.inject)\n\t\t\tyield* service.publish(peer).pipe(\n\t\t\t\tScope.provide(scope),\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tActivationFailed.make({\n\t\t\t\t\t\tdetail: \"Publishing imported services failed\",\n\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\tconst module = yield* loadModule(contract.module)\n\t\tconst plugin = Plugin.fromModule(module)\n\t\tif (Option.isNone(plugin))\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The implementation module exports no plugin\",\n\t\t\t})\n\t\tconst fork = yield* Graft.plugin(\n\t\t\t{ ...plugin.value, retry: undefined },\n\t\t\tinput,\n\t\t).pipe(\n\t\t\tEffect.provideService(Instance, identity),\n\t\t\tScope.provide(instanceScope),\n\t\t)\n\t\tconst observedFailure = yield* Ref.make<Cause.Cause<unknown>>(Cause.empty)\n\t\tconst observation = yield* fork.state.pipe(\n\t\t\tStream.runForEach((state) =>\n\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t? Ref.set(observedFailure, state.cause)\n\t\t\t\t\t: Effect.void,\n\t\t\t),\n\t\t\tEffect.forkIn(instanceScope),\n\t\t)\n\t\tconst bridge = yield* exportBridge\n\t\treturn { fork, bridge, observedFailure, observation } satisfies Running\n\t})\n\tconst awaitActive = Effect.fnUntraced(function* (running: Running) {\n\t\tconst first = yield* running.fork.state.pipe(\n\t\t\tStream.filter((state) => state._tag !== \"Loading\"),\n\t\t\tStream.runHead,\n\t\t)\n\t\tif (Option.isNone(first))\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The remote fork disappeared during startup\",\n\t\t\t})\n\t\tif (first.value._tag === \"Failed\")\n\t\t\treturn yield* Effect.fail(contract.normalizeCause(first.value.cause))\n\t\tif (first.value._tag !== \"Active\")\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail:\n\t\t\t\t\t\"The remote plugin did not become active; check its declared dependencies\",\n\t\t\t})\n\t\tyield* running.fork.state.pipe(\n\t\t\tStream.runForEach((state) =>\n\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t? Queue.offer(\n\t\t\t\t\t\t\ttelemetry.events,\n\t\t\t\t\t\t\tChildEvent.Failed({ cause: state.cause }),\n\t\t\t\t\t\t)\n\t\t\t\t\t: Effect.void,\n\t\t\t),\n\t\t\tEffect.forkIn(instanceScope),\n\t\t)\n\t\tconst exported = yield* running.bridge.state.pipe(\n\t\t\tStream.filter(\n\t\t\t\t(state) =>\n\t\t\t\t\tstate._tag === \"Active\" ||\n\t\t\t\t\tstate._tag === \"Failed\" ||\n\t\t\t\t\tstate._tag === \"Disposed\",\n\t\t\t),\n\t\t\tStream.runHead,\n\t\t)\n\t\tif (Option.isSome(exported) && exported.value._tag === \"Failed\")\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The remote export bridge failed during startup\",\n\t\t\t\tcause: exported.value.cause,\n\t\t\t})\n\t\tif (Option.isNone(exported) || exported.value._tag !== \"Active\")\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The remote export bridge stopped during startup\",\n\t\t\t})\n\t})\n\tconst load = Effect.fnUntraced(\n\t\tfunction* (input: Schema.Json) {\n\t\t\tyield* SynchronizedRef.updateEffect(state, (current) =>\n\t\t\t\tcurrent._tag === \"Idle\"\n\t\t\t\t\t? Effect.succeed(Lifecycle.Loading())\n\t\t\t\t\t: Effect.fail(AlreadyLoaded.make({})),\n\t\t\t)\n\t\t\tconst running = yield* start(input)\n\t\t\tconst disposed = yield* SynchronizedRef.modify(\n\t\t\t\tstate,\n\t\t\t\t(current): readonly [boolean, Lifecycle] =>\n\t\t\t\t\tcurrent._tag === \"Withdrawing\"\n\t\t\t\t\t\t? [false, Lifecycle.Withdrawing({ running: Option.some(running) })]\n\t\t\t\t\t\t: current._tag === \"Disposing\"\n\t\t\t\t\t\t\t? [true, Lifecycle.Disposing({ running: Option.some(running) })]\n\t\t\t\t\t\t\t: [false, Lifecycle.Running({ running })],\n\t\t\t)\n\t\t\t// Dispose saw Loading and found nothing to stop; this load owns the cleanup.\n\t\t\tif (disposed) {\n\t\t\t\tconst cause = yield* cleanup(running, false)\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tCause.combine(\n\t\t\t\t\t\tCause.fail(\n\t\t\t\t\t\t\tActivationFailed.make({\n\t\t\t\t\t\t\t\tdetail: \"The execution was disposed during load\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcause,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tyield* awaitActive(running)\n\t\t},\n\t\tEffect.mapError((error) =>\n\t\t\tcontract.normalizeCause(Cause.isCause(error) ? error : Cause.fail(error)),\n\t\t),\n\t)\n\tconst dispose = Effect.gen(function* () {\n\t\t// One transition, so a concurrent Load or export withdrawal cannot slip between read and write.\n\t\tconst previous = yield* SynchronizedRef.getAndUpdate(state, disposing)\n\t\tyield* Deferred.succeed(releaseExports, undefined)\n\t\tconst current = runningOf(previous)\n\t\tconst retired = previous._tag === \"Withdrawing\"\n\t\tconst cause = Option.isSome(current)\n\t\t\t? yield* cleanup(current.value, retired)\n\t\t\t: Cause.empty\n\t\tyield* Queue.offer(telemetry.events, ChildEvent.Stopped())\n\t\tyield* Queue.end(telemetry.logs)\n\t\tif (cause.reasons.length > 0)\n\t\t\treturn yield* Effect.fail(contract.normalizeCause(cause))\n\t})\n\treturn { load, dispose, release }\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"child.js","names":[],"sources":["../../src/internal/child.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tData,\n\tDeferred,\n\tEffect,\n\tExit,\n\tFiber,\n\tLogger,\n\tMutableRef,\n\tOption,\n\tQueue,\n\tRef,\n\tReferences,\n\tScope,\n\tStream,\n\tSynchronizedRef,\n\ttype Schema,\n} from \"effect\"\n\nimport { Graft, Plugin, type Fork } from \"@graftland/graft\"\n\nimport { Instance, type Identity } from \"../Instance\"\nimport { ActivationFailed, AlreadyLoaded } from \"./childErrors\"\nimport { type RunnerContract } from \"./contract\"\nimport type { Event, Log, LogEvent } from \"./control\"\nimport { loadModule } from \"./loadModule\"\nimport type * as Port from \"./port\"\n\ntype Peer = Port.Port\ntype ChildEvent = Data.TaggedEnum<{\n\tFailed: { readonly cause: Cause.Cause<unknown> }\n\tWithdrawing: {}\n\tStopped: {}\n}>\nconst ChildEvent = Data.taggedEnum<ChildEvent>()\ntype LogEntry = Omit<typeof Log.Type, \"cause\"> & {\n\treadonly cause: Cause.Cause<unknown>\n}\n\n/** Queue data; serialization belongs to the RPC consumer, outside synchronous logger callbacks. */\nexport const telemetry = Effect.fnUntraced(function* (\n\tcontract: RunnerContract,\n) {\n\tconst events = yield* Queue.bounded<ChildEvent>(2)\n\tconst logs = yield* Queue.dropping<LogEntry, Cause.Done>(128)\n\tconst dropped = MutableRef.make(0)\n\tconst encode = (cause: Cause.Cause<unknown>) =>\n\t\tcontract.encodeCause(cause).pipe(Effect.orDie)\n\tconst logger = Logger.make((entry) => {\n\t\t// Logger callbacks are synchronous; a dropping offer and loss counter cannot suspend.\n\t\tconst accepted = Queue.offerUnsafe(logs, {\n\t\t\tlevel: entry.logLevel,\n\t\t\tmessage: entry.message,\n\t\t\tcause: entry.cause,\n\t\t\tannotations: entry.fiber.getRef(References.CurrentLogAnnotations),\n\t\t})\n\t\tif (!accepted) MutableRef.increment(dropped)\n\t})\n\treturn {\n\t\tevents,\n\t\tlogs,\n\t\tlogger,\n\t\teventStream: Stream.fromQueue(events).pipe(\n\t\t\tStream.mapEffect((event): Effect.Effect<typeof Event.Type> =>\n\t\t\t\tevent._tag === \"Failed\"\n\t\t\t\t\t? encode(event.cause).pipe(\n\t\t\t\t\t\t\tEffect.map(\n\t\t\t\t\t\t\t\t(cause) =>\n\t\t\t\t\t\t\t\t\t({\n\t\t\t\t\t\t\t\t\t\t_tag: \"Failed\",\n\t\t\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t\t\t}) satisfies typeof Event.Type,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t: Effect.succeed(event),\n\t\t\t),\n\t\t),\n\t\tlogStream: Stream.fromQueue(logs).pipe(\n\t\t\tStream.mapEffect((entry) =>\n\t\t\t\tencode(entry.cause).pipe(\n\t\t\t\t\tEffect.map((cause): typeof LogEvent.Type => ({\n\t\t\t\t\t\t_tag: \"Log\",\n\t\t\t\t\t\tentry: { ...entry, cause },\n\t\t\t\t\t\tdropped: MutableRef.get(dropped),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t),\n\t\t\tStream.concat(\n\t\t\t\tStream.sync((): typeof LogEvent.Type => ({\n\t\t\t\t\t_tag: \"LogsEnded\",\n\t\t\t\t\tdropped: MutableRef.get(dropped),\n\t\t\t\t})),\n\t\t\t),\n\t\t),\n\t}\n})\ntype Telemetry = Effect.Success<ReturnType<typeof telemetry>>\ninterface Running {\n\treadonly fork: Pick<Fork.Fork<never, unknown>, \"dispose\" | \"state\">\n\treadonly bridge: Pick<Fork.Fork<never, never>, \"dispose\" | \"state\">\n\treadonly observation: Fiber.Fiber<void>\n\treadonly observedFailure: Ref.Ref<Cause.Cause<unknown>>\n}\ntype Lifecycle = Data.TaggedEnum<{\n\tIdle: {}\n\tLoading: {}\n\tRunning: { readonly running: Running }\n\tWithdrawing: { readonly running: Option.Option<Running> }\n\tDisposing: { readonly running: Option.Option<Running> }\n}>\nconst Lifecycle = Data.taggedEnum<Lifecycle>()\nconst runningOf = (state: Lifecycle): Option.Option<Running> =>\n\tstate._tag === \"Running\"\n\t\t? Option.some(state.running)\n\t\t: state._tag === \"Withdrawing\" || state._tag === \"Disposing\"\n\t\t\t? state.running\n\t\t\t: Option.none()\n\nconst cleanup = Effect.fnUntraced(function* (\n\trunning: Running,\n\tretired: boolean,\n) {\n\tconst pluginExit = yield* Effect.exit(running.fork.dispose)\n\tconst bridgeExit = yield* Effect.exit(running.bridge.dispose)\n\tyield* Fiber.join(running.observation)\n\tconst failed = yield* Ref.get(running.observedFailure)\n\treturn Array.reduce(\n\t\t[bridgeExit, pluginExit],\n\t\tretired ? failed : Cause.empty,\n\t\t(cause, exit) =>\n\t\t\tExit.isFailure(exit)\n\t\t\t\t? Cause.combine(\n\t\t\t\t\t\tcause,\n\t\t\t\t\t\tCause.fromReasons(\n\t\t\t\t\t\t\tArray.flatMap(exit.cause.reasons, (reason) =>\n\t\t\t\t\t\t\t\treason._tag === \"Fail\" ? reason.error.cause.reasons : [reason],\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: cause,\n\t)\n})\n\nexport const lifecycle = Effect.fnUntraced(function* (\n\tcontract: RunnerContract,\n\tpeer: Peer,\n\tidentity: typeof Identity.Type,\n\ttelemetry: Telemetry,\n) {\n\tconst scope = yield* Effect.scope\n\tconst instanceScope = yield* Scope.fork(scope)\n\tconst releaseExports = yield* Deferred.make<void>()\n\tconst state = yield* SynchronizedRef.make<Lifecycle>(Lifecycle.Idle())\n\t// This gate represents host consumers draining, not a second lifecycle state.\n\tconst disposing = (current: Lifecycle) =>\n\t\tLifecycle.Disposing({ running: runningOf(current) })\n\tconst release = SynchronizedRef.update(state, disposing).pipe(\n\t\tEffect.andThen(Deferred.succeed(releaseExports, undefined)),\n\t)\n\n\tconst exportBridge = Graft.plugin(\n\t\tPlugin.make({\n\t\t\tname: `${contract.name}/exports`,\n\t\t\tinject: Array.map(contract.provides, (service) => service.key),\n\t\t\tapply: Effect.fnUntraced(function* () {\n\t\t\t\tfor (const service of contract.provides)\n\t\t\t\t\tyield* service.serve(peer).pipe(\n\t\t\t\t\t\tEffect.tapCause((cause) =>\n\t\t\t\t\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t: Queue.offer(telemetry.events, ChildEvent.Failed({ cause })),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tEffect.forkScoped,\n\t\t\t\t\t)\n\t\t\t\tyield* Effect.addFinalizer(\n\t\t\t\t\tEffect.fnUntraced(function* () {\n\t\t\t\t\t\tconst withdrawing = yield* SynchronizedRef.modify(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t(current) =>\n\t\t\t\t\t\t\t\tcurrent._tag === \"Disposing\"\n\t\t\t\t\t\t\t\t\t? [false, current]\n\t\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t\t\tLifecycle.Withdrawing({\n\t\t\t\t\t\t\t\t\t\t\t\trunning: runningOf(current),\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (withdrawing)\n\t\t\t\t\t\t\tyield* Queue.offer(telemetry.events, ChildEvent.Withdrawing())\n\t\t\t\t\t\tyield* Deferred.await(releaseExports)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}),\n\t\t}),\n\t).pipe(Scope.provide(instanceScope))\n\n\tconst start = Effect.fnUntraced(function* (input: Schema.Json) {\n\t\t// Imported clients outlive Load and remain available during plugin cleanup.\n\t\tfor (const service of contract.inject)\n\t\t\tyield* service.publish(peer).pipe(\n\t\t\t\tScope.provide(scope),\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tActivationFailed.make({\n\t\t\t\t\t\tdetail: \"Publishing imported services failed\",\n\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\tconst module = yield* loadModule(contract.module)\n\t\tconst plugin = Plugin.fromModule(module)\n\t\tif (Option.isNone(plugin))\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The implementation module exports no plugin\",\n\t\t\t})\n\t\tconst fork = yield* Graft.plugin(\n\t\t\t{ ...plugin.value, retry: undefined },\n\t\t\tinput,\n\t\t).pipe(\n\t\t\tEffect.provideService(Instance, identity),\n\t\t\tScope.provide(instanceScope),\n\t\t)\n\t\tconst observedFailure = yield* Ref.make<Cause.Cause<unknown>>(Cause.empty)\n\t\tconst observation = yield* fork.state.pipe(\n\t\t\tStream.runForEach((state) =>\n\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t? Ref.set(observedFailure, state.cause)\n\t\t\t\t\t: Effect.void,\n\t\t\t),\n\t\t\tEffect.forkIn(instanceScope),\n\t\t)\n\t\tconst bridge = yield* exportBridge\n\t\treturn { fork, bridge, observedFailure, observation } satisfies Running\n\t})\n\tconst awaitActive = Effect.fnUntraced(function* (running: Running) {\n\t\tconst first = yield* running.fork.state.pipe(\n\t\t\tStream.filter((state) => state._tag !== \"Loading\"),\n\t\t\tStream.runHead,\n\t\t)\n\t\tif (Option.isNone(first))\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The remote fork disappeared during startup\",\n\t\t\t})\n\t\tif (first.value._tag === \"Failed\")\n\t\t\treturn yield* Effect.fail(contract.normalizeCause(first.value.cause))\n\t\tif (first.value._tag !== \"Active\")\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail:\n\t\t\t\t\t\"The remote plugin did not become active; check its declared dependencies\",\n\t\t\t})\n\t\tyield* running.fork.state.pipe(\n\t\t\tStream.runForEach((state) =>\n\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t? Queue.offer(\n\t\t\t\t\t\t\ttelemetry.events,\n\t\t\t\t\t\t\tChildEvent.Failed({ cause: state.cause }),\n\t\t\t\t\t\t)\n\t\t\t\t\t: Effect.void,\n\t\t\t),\n\t\t\tEffect.forkIn(instanceScope),\n\t\t)\n\t\tconst exported = yield* running.bridge.state.pipe(\n\t\t\tStream.filter(\n\t\t\t\t(state) =>\n\t\t\t\t\tstate._tag === \"Active\" ||\n\t\t\t\t\tstate._tag === \"Failed\" ||\n\t\t\t\t\tstate._tag === \"Disposed\",\n\t\t\t),\n\t\t\tStream.runHead,\n\t\t)\n\t\tif (Option.isSome(exported) && exported.value._tag === \"Failed\")\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The remote export bridge failed during startup\",\n\t\t\t\tcause: exported.value.cause,\n\t\t\t})\n\t\tif (Option.isNone(exported) || exported.value._tag !== \"Active\")\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The remote export bridge stopped during startup\",\n\t\t\t})\n\t})\n\tconst load = Effect.fnUntraced(\n\t\tfunction* (input: Schema.Json) {\n\t\t\tyield* SynchronizedRef.updateEffect(state, (current) =>\n\t\t\t\tcurrent._tag === \"Idle\"\n\t\t\t\t\t? Effect.succeed(Lifecycle.Loading())\n\t\t\t\t\t: Effect.fail(AlreadyLoaded.make({})),\n\t\t\t)\n\t\t\tconst running = yield* start(input)\n\t\t\tconst disposed = yield* SynchronizedRef.modify(\n\t\t\t\tstate,\n\t\t\t\t(current): readonly [boolean, Lifecycle] =>\n\t\t\t\t\tcurrent._tag === \"Withdrawing\"\n\t\t\t\t\t\t? [false, Lifecycle.Withdrawing({ running: Option.some(running) })]\n\t\t\t\t\t\t: current._tag === \"Disposing\"\n\t\t\t\t\t\t\t? [true, Lifecycle.Disposing({ running: Option.some(running) })]\n\t\t\t\t\t\t\t: [false, Lifecycle.Running({ running })],\n\t\t\t)\n\t\t\t// Dispose saw Loading and found nothing to stop; this load owns the cleanup.\n\t\t\tif (disposed) {\n\t\t\t\tconst cause = yield* cleanup(running, false)\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tCause.combine(\n\t\t\t\t\t\tCause.fail(\n\t\t\t\t\t\t\tActivationFailed.make({\n\t\t\t\t\t\t\t\tdetail: \"The execution was disposed during load\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcause,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tyield* awaitActive(running)\n\t\t},\n\t\tEffect.mapError((error) =>\n\t\t\tcontract.normalizeCause(Cause.isCause(error) ? error : Cause.fail(error)),\n\t\t),\n\t)\n\tconst dispose = Effect.gen(function* () {\n\t\t// One transition, so a concurrent Load or export withdrawal cannot slip between read and write.\n\t\tconst previous = yield* SynchronizedRef.getAndUpdate(state, disposing)\n\t\tyield* Deferred.succeed(releaseExports, undefined)\n\t\tconst current = runningOf(previous)\n\t\tconst retired = previous._tag === \"Withdrawing\"\n\t\tconst cause = Option.isSome(current)\n\t\t\t? yield* cleanup(current.value, retired)\n\t\t\t: Cause.empty\n\t\tyield* Queue.offer(telemetry.events, ChildEvent.Stopped())\n\t\tyield* Queue.end(telemetry.logs)\n\t\tif (cause.reasons.length > 0)\n\t\t\treturn yield* Effect.fail(contract.normalizeCause(cause))\n\t})\n\treturn { load, dispose, release }\n})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { load, run } from "./childRuntime.js";
|
|
3
|
+
import { platform } from "./platform.js";
|
|
4
|
+
import { Bootstrap } from "./runner/Bootstrap.js";
|
|
5
|
+
import { start } from "./runner/Watchdog.js";
|
|
6
|
+
import { bytes } from "./stdioChannel.js";
|
|
7
|
+
import { Array, Effect, Layer, Logger, Option, Schema } from "effect";
|
|
8
|
+
import { Graft } from "@graftland/graft";
|
|
9
|
+
import process from "node:process";
|
|
10
|
+
import { pathToFileURL } from "node:url";
|
|
11
|
+
import { Argument, CliError, Command } from "effect/cli";
|
|
12
|
+
import { NodeRuntime } from "@effect/platform-node";
|
|
13
|
+
// src/internal/childMain.ts
|
|
14
|
+
/** Internal executable for local and supervised child runtimes. */
|
|
15
|
+
const child = Command.make("child", {
|
|
16
|
+
contract: Argument.String("contract"),
|
|
17
|
+
session: Argument.String("session"),
|
|
18
|
+
bootstrap: Argument.String("bootstrap").pipe(Argument.withSchema(Schema.fromJsonString(Bootstrap)))
|
|
19
|
+
}, Effect.fnUntraced(function* ({ contract, session, bootstrap }) {
|
|
20
|
+
const watchdog = yield* start;
|
|
21
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => {
|
|
22
|
+
process.stdin.destroy();
|
|
23
|
+
}));
|
|
24
|
+
if (!(yield* Effect.raceFirst(watchdog.begin.pipe(Effect.as(true)), watchdog.stop.pipe(Effect.as(false))))) return;
|
|
25
|
+
const definition = yield* load(pathToFileURL(contract).href);
|
|
26
|
+
const channel = yield* bytes;
|
|
27
|
+
return yield* run(definition, channel, session, bootstrap, watchdog.stop);
|
|
28
|
+
}));
|
|
29
|
+
const cli = Command.make("remote-child", {
|
|
30
|
+
contract: Argument.String("contract").pipe(Argument.optional),
|
|
31
|
+
session: Argument.String("session").pipe(Argument.withDefault("local"))
|
|
32
|
+
}, Effect.fnUntraced(function* ({ contract, session }) {
|
|
33
|
+
if (Option.isNone(contract)) return yield* CliError.UserError.make({
|
|
34
|
+
cause: "Missing contract module",
|
|
35
|
+
userMessage: "A contract module or the child subcommand is required"
|
|
36
|
+
});
|
|
37
|
+
const definition = yield* load(contract.value);
|
|
38
|
+
const channel = yield* bytes;
|
|
39
|
+
return yield* run(definition, channel, session);
|
|
40
|
+
})).pipe(Command.withSubcommands([child]));
|
|
41
|
+
NodeRuntime.runMain(Effect.scoped(Effect.gen(function* () {
|
|
42
|
+
const context = yield* Layer.build(Layer.provideMerge(Graft.layer, platform));
|
|
43
|
+
return yield* Command.run(cli, { version: "0.0.0" }).pipe(Effect.provideContext(context));
|
|
44
|
+
})).pipe((effect) => Effect.withFiber((main) => effect.pipe(Effect.tapCause((cause) => Array.every(cause.reasons, (reason) => reason._tag === "Interrupt" && reason.fiberId === main.id) || Array.every(cause.reasons, (reason) => reason._tag === "Fail" && CliError.isCliError(reason.error)) ? Effect.void : Effect.logError(cause)))), Effect.provideService(Logger.LogToStderr, true)), { disableErrorReporting: true });
|
|
45
|
+
export {};
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=childMain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childMain.js","names":["Watchdog.start"],"sources":["../../src/internal/childMain.ts"],"sourcesContent":["#!/usr/bin/env node\n/** Internal executable for local and supervised child runtimes. */\nimport process from \"node:process\"\nimport { pathToFileURL } from \"node:url\"\n\nimport { Array, Effect, Layer, Logger, Option, Schema } from \"effect\"\nimport { Argument, CliError, Command } from \"effect/cli\"\nimport { NodeRuntime } from \"@effect/platform-node\"\n\nimport { Graft } from \"@graftland/graft\"\n\nimport { load, run } from \"./childRuntime\"\nimport { platform } from \"./platform\"\nimport { Bootstrap } from \"./runner/Bootstrap\"\nimport * as Watchdog from \"./runner/Watchdog\"\nimport { bytes } from \"./stdioChannel\"\n\nconst child = Command.make(\n\t\"child\",\n\t{\n\t\tcontract: Argument.String(\"contract\"),\n\t\tsession: Argument.String(\"session\"),\n\t\tbootstrap: Argument.String(\"bootstrap\").pipe(\n\t\t\tArgument.withSchema(Schema.fromJsonString(Bootstrap)),\n\t\t),\n\t},\n\tEffect.fnUntraced(function* ({ contract, session, bootstrap }) {\n\t\tconst watchdog = yield* Watchdog.start\n\t\t// The executable owns stdin; it must not retain the process after a supervisor stop.\n\t\tyield* Effect.addFinalizer(() =>\n\t\t\tEffect.sync(() => {\n\t\t\t\tprocess.stdin.destroy()\n\t\t\t}),\n\t\t)\n\t\tconst begin = yield* Effect.raceFirst(\n\t\t\twatchdog.begin.pipe(Effect.as(true)),\n\t\t\twatchdog.stop.pipe(Effect.as(false)),\n\t\t)\n\t\tif (!begin) return\n\t\tconst definition = yield* load(pathToFileURL(contract).href)\n\t\tconst channel = yield* bytes\n\t\treturn yield* run(definition, channel, session, bootstrap, watchdog.stop)\n\t}),\n)\nconst cli = Command.make(\n\t\"remote-child\",\n\t{\n\t\tcontract: Argument.String(\"contract\").pipe(Argument.optional),\n\t\tsession: Argument.String(\"session\").pipe(Argument.withDefault(\"local\")),\n\t},\n\tEffect.fnUntraced(function* ({ contract, session }) {\n\t\tif (Option.isNone(contract))\n\t\t\treturn yield* CliError.UserError.make({\n\t\t\t\tcause: \"Missing contract module\",\n\t\t\t\tuserMessage: \"A contract module or the child subcommand is required\",\n\t\t\t})\n\t\tconst definition = yield* load(contract.value)\n\t\tconst channel = yield* bytes\n\t\treturn yield* run(definition, channel, session)\n\t}),\n).pipe(Command.withSubcommands([child]))\n\nNodeRuntime.runMain(\n\tEffect.scoped(\n\t\tEffect.gen(function* () {\n\t\t\tconst context = yield* Layer.build(\n\t\t\t\tLayer.provideMerge(Graft.layer, platform),\n\t\t\t)\n\t\t\treturn yield* Command.run(cli, { version: \"0.0.0\" }).pipe(\n\t\t\t\tEffect.provideContext(context),\n\t\t\t)\n\t\t}),\n\t).pipe(\n\t\t(effect) =>\n\t\t\tEffect.withFiber((main) =>\n\t\t\t\teffect.pipe(\n\t\t\t\t\tEffect.tapCause((cause) =>\n\t\t\t\t\t\t// NodeRuntime uses this fiber's id; a self-interrupt here is indistinguishable, but worker cleanup is not.\n\t\t\t\t\t\tArray.every(\n\t\t\t\t\t\t\tcause.reasons,\n\t\t\t\t\t\t\t(reason) =>\n\t\t\t\t\t\t\t\treason._tag === \"Interrupt\" && reason.fiberId === main.id,\n\t\t\t\t\t\t) ||\n\t\t\t\t\t\tArray.every(\n\t\t\t\t\t\t\tcause.reasons,\n\t\t\t\t\t\t\t(reason) =>\n\t\t\t\t\t\t\t\treason._tag === \"Fail\" && CliError.isCliError(reason.error),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t: Effect.logError(cause),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\tEffect.provideService(Logger.LogToStderr, true),\n\t),\n\t// Report inside the stderr context, including failures from resource cleanup.\n\t{ disableErrorReporting: true },\n)\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,QAAQ,QAAQ,KACrB,SACA;CACC,UAAU,SAAS,OAAO,UAAU;CACpC,SAAS,SAAS,OAAO,SAAS;CAClC,WAAW,SAAS,OAAO,WAAW,CAAC,CAAC,KACvC,SAAS,WAAW,OAAO,eAAe,SAAS,CAAC,CACrD;AACD,GACA,OAAO,WAAW,WAAW,EAAE,UAAU,SAAS,aAAa;CAC9D,MAAM,WAAW,OAAOA;CAExB,OAAO,OAAO,mBACb,OAAO,WAAW;EACjB,QAAQ,MAAM,QAAQ;CACvB,CAAC,CACF;CAKA,IAAI,EAAC,OAJgB,OAAO,UAC3B,SAAS,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC,GACnC,SAAS,KAAK,KAAK,OAAO,GAAG,KAAK,CAAC,CACpC,IACY;CACZ,MAAM,aAAa,OAAO,KAAK,cAAc,QAAQ,CAAC,CAAC,IAAI;CAC3D,MAAM,UAAU,OAAO;CACvB,OAAO,OAAO,IAAI,YAAY,SAAS,SAAS,WAAW,SAAS,IAAI;AACzE,CAAC,CACF;AACA,MAAM,MAAM,QAAQ,KACnB,gBACA;CACC,UAAU,SAAS,OAAO,UAAU,CAAC,CAAC,KAAK,SAAS,QAAQ;CAC5D,SAAS,SAAS,OAAO,SAAS,CAAC,CAAC,KAAK,SAAS,YAAY,OAAO,CAAC;AACvE,GACA,OAAO,WAAW,WAAW,EAAE,UAAU,WAAW;CACnD,IAAI,OAAO,OAAO,QAAQ,GACzB,OAAO,OAAO,SAAS,UAAU,KAAK;EACrC,OAAO;EACP,aAAa;CACd,CAAC;CACF,MAAM,aAAa,OAAO,KAAK,SAAS,KAAK;CAC7C,MAAM,UAAU,OAAO;CACvB,OAAO,OAAO,IAAI,YAAY,SAAS,OAAO;AAC/C,CAAC,CACF,CAAC,CAAC,KAAK,QAAQ,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAEvC,YAAY,QACX,OAAO,OACN,OAAO,IAAI,aAAa;CACvB,MAAM,UAAU,OAAO,MAAM,MAC5B,MAAM,aAAa,MAAM,OAAO,QAAQ,CACzC;CACA,OAAO,OAAO,QAAQ,IAAI,KAAK,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,KACpD,OAAO,eAAe,OAAO,CAC9B;AACD,CAAC,CACF,CAAC,CAAC,MACA,WACA,OAAO,WAAW,SACjB,OAAO,KACN,OAAO,UAAU,UAEhB,MAAM,MACL,MAAM,UACL,WACA,OAAO,SAAS,eAAe,OAAO,YAAY,KAAK,EACzD,KACA,MAAM,MACL,MAAM,UACL,WACA,OAAO,SAAS,UAAU,SAAS,WAAW,OAAO,KAAK,CAC5D,IACG,OAAO,OACP,OAAO,SAAS,KAAK,CACzB,CACD,CACD,GACD,OAAO,eAAe,OAAO,aAAa,IAAI,CAC/C,GAEA,EAAE,uBAAuB,KAAK,CAC/B"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { loadModule } from "./loadModule.js";
|
|
2
|
-
import { ContractNotFound } from "./childErrors.js";
|
|
3
1
|
import { fromModule } from "../Contract.js";
|
|
4
|
-
import { make } from "./port.js";
|
|
5
|
-
import { prepare } from "./contract.js";
|
|
6
|
-
import { endpoints } from "./services.js";
|
|
7
2
|
import { lifecycle, telemetry } from "./child.js";
|
|
3
|
+
import { ContractNotFound } from "./childErrors.js";
|
|
4
|
+
import { prepare } from "./contract.js";
|
|
5
|
+
import { endpoint } from "./control.js";
|
|
6
|
+
import { loadModule } from "./loadModule.js";
|
|
7
|
+
import { make } from "./port.js";
|
|
8
|
+
import { closedNormally } from "./runner/connectionEnded.js";
|
|
9
|
+
import { ExecutionError } from "./runner/model.js";
|
|
8
10
|
import { make as make$1 } from "./runner/Multiplex.js";
|
|
9
11
|
import { channel } from "./runner/Wire.js";
|
|
10
|
-
import {
|
|
11
|
-
import { closedNormally } from "./runner/connectionEnded.js";
|
|
12
|
-
import { endpoint } from "./control.js";
|
|
12
|
+
import { endpoints } from "./services.js";
|
|
13
13
|
import { Effect, Logger, Option } from "effect";
|
|
14
14
|
import { RpcServer } from "effect/rpc";
|
|
15
15
|
// src/internal/childRuntime.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"childRuntime.js","names":["Multiplex.make","channel","Port.make","Wire.channel","Services.endpoints","telemetry","Child.telemetry","Child.lifecycle"],"sources":["../../src/internal/childRuntime.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"childRuntime.js","names":["Multiplex.make","channel","Port.make","Wire.channel","Services.endpoints","telemetry","Child.telemetry","Child.lifecycle"],"sources":["../../src/internal/childRuntime.ts"],"sourcesContent":["import { Effect, Logger, Option } from \"effect\"\nimport { RpcServer } from \"effect/rpc\"\n\nimport type { Graft } from \"@graftland/graft\"\n\nimport { fromModule, type RunnerContract } from \"../Contract\"\nimport * as Child from \"./child\"\nimport { ContractNotFound } from \"./childErrors\"\nimport { prepare, type RunnerContract as PreparedContract } from \"./contract\"\nimport { endpoint } from \"./control\"\nimport { loadModule } from \"./loadModule\"\nimport * as Port from \"./port\"\nimport type { Bootstrap } from \"./runner/Bootstrap\"\nimport { closedNormally } from \"./runner/connectionEnded\"\nimport { ExecutionError } from \"./runner/model\"\nimport * as Multiplex from \"./runner/Multiplex\"\nimport * as Wire from \"./runner/Wire\"\nimport * as Services from \"./services\"\n\n/** Import a contract in the runner installation; importing this module performs no I/O. */\nexport const load = Effect.fnUntraced(function* (specifier: string) {\n\tconst module = yield* loadModule(specifier)\n\tconst contract = fromModule(module)\n\tif (Option.isNone(contract))\n\t\treturn yield* ContractNotFound.make({ module: specifier })\n\treturn contract.value\n})\n\nconst connect = Effect.fnUntraced(function* (\n\tcontract: PreparedContract,\n\tchannel: Port.Channel,\n\tsession: string,\n\tbootstrap: Bootstrap | undefined,\n) {\n\tconst mux =\n\t\tbootstrap === undefined ? undefined : yield* Multiplex.make(channel)\n\treturn yield* Port.make(mux === undefined ? channel : Wire.channel(mux, 1), {\n\t\tsession,\n\t\tserve: {\n\t\t\t...Services.endpoints(contract.provides),\n\t\t\t[endpoint]: contract.control,\n\t\t},\n\t\tcall: Services.endpoints(contract.inject),\n\t\t...(bootstrap === undefined ? {} : { limits: bootstrap.limits }),\n\t})\n})\n\n/** One execution unit; the executable supplies the platform and Graft services. */\nexport const run: (\n\tdescriptor: RunnerContract,\n\tchannel: Port.Channel,\n\tsession?: string,\n\tbootstrap?: Bootstrap,\n\tstop?: Effect.Effect<unknown, ExecutionError>,\n) => Effect.Effect<void, ExecutionError, Graft.Graft> = Effect.fnUntraced(\n\tfunction* (\n\t\tdescriptor: RunnerContract,\n\t\tchannel: Port.Channel,\n\t\tsession: string = \"local\",\n\t\tbootstrap?: Bootstrap,\n\t\tstop: Effect.Effect<unknown, ExecutionError> = Effect.never,\n\t) {\n\t\tconst contract = prepare(descriptor)\n\t\tconst telemetry = yield* Child.telemetry(contract)\n\t\tconst loggers = yield* Logger.CurrentLoggers\n\t\tyield* Effect.gen(function* () {\n\t\t\tconst peer = yield* connect(contract, channel, session, bootstrap)\n\t\t\tconst instance = yield* Child.lifecycle(\n\t\t\t\tcontract,\n\t\t\t\tpeer,\n\t\t\t\tbootstrap?.identity ?? { id: session, generation: 1 },\n\t\t\t\ttelemetry,\n\t\t\t)\n\t\t\tconst handlers = yield* contract.control.toHandlers({\n\t\t\t\tLoad: ({ input }) => instance.load(input),\n\t\t\t\tDispose: () => instance.dispose,\n\t\t\t\tEvents: () => telemetry.eventStream,\n\t\t\t\tLogs: () => telemetry.logStream,\n\t\t\t})\n\t\t\tyield* RpcServer.make(contract.control, {\n\t\t\t\tdisableFatalDefects: true,\n\t\t\t}).pipe(\n\t\t\t\tEffect.provideContext(handlers),\n\t\t\t\tEffect.provideService(\n\t\t\t\t\tRpcServer.Protocol,\n\t\t\t\t\tpeer.serverProtocol(endpoint),\n\t\t\t\t),\n\t\t\t\tEffect.forkScoped,\n\t\t\t)\n\t\t\tyield* Effect.raceFirst(\n\t\t\t\tpeer.await.pipe(\n\t\t\t\t\tEffect.catchIf(\n\t\t\t\t\t\t(error) => closedNormally(error.cause),\n\t\t\t\t\t\t() => Effect.void,\n\t\t\t\t\t),\n\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Child transport failed\",\n\t\t\t\t\t\t\tcause: error.cause,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tstop,\n\t\t\t).pipe(\n\t\t\t\t// Release exports before closing the instance scope, including on interruption.\n\t\t\t\tEffect.ensuring(instance.release),\n\t\t\t)\n\t\t}).pipe(\n\t\t\tEffect.provideService(\n\t\t\t\tLogger.CurrentLoggers,\n\t\t\t\tnew Set([...loggers, telemetry.logger]),\n\t\t\t),\n\t\t)\n\t},\n\tEffect.scoped,\n)\n"],"mappings":";;;;;;;;;;;;;;;;AAoBA,MAAa,OAAO,OAAO,WAAW,WAAW,WAAmB;CACnE,MAAM,SAAS,OAAO,WAAW,SAAS;CAC1C,MAAM,WAAW,WAAW,MAAM;CAClC,IAAI,OAAO,OAAO,QAAQ,GACzB,OAAO,OAAO,iBAAiB,KAAK,EAAE,QAAQ,UAAU,CAAC;CAC1D,OAAO,SAAS;AACjB,CAAC;AAED,MAAM,UAAU,OAAO,WAAW,WACjC,UACA,WACA,SACA,WACC;CACD,MAAM,MACL,cAAc,KAAA,IAAY,KAAA,IAAY,OAAOA,OAAeC,SAAO;CACpE,OAAO,OAAOC,KAAU,QAAQ,KAAA,IAAYD,YAAUE,QAAa,KAAK,CAAC,GAAG;EAC3E;EACA,OAAO;GACN,GAAGC,UAAmB,SAAS,QAAQ;IACtC,WAAW,SAAS;EACtB;EACA,MAAMA,UAAmB,SAAS,MAAM;EACxC,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,UAAU,OAAO;CAC/D,CAAC;AACF,CAAC;;AAGD,MAAa,MAM2C,OAAO,WAC9D,WACC,YACA,SACA,UAAkB,SAClB,WACA,OAA+C,OAAO,OACrD;CACD,MAAM,WAAW,QAAQ,UAAU;CACnC,MAAMC,cAAY,OAAOC,UAAgB,QAAQ;CACjD,MAAM,UAAU,OAAO,OAAO;CAC9B,OAAO,OAAO,IAAI,aAAa;EAC9B,MAAM,OAAO,OAAO,QAAQ,UAAU,SAAS,SAAS,SAAS;EACjE,MAAM,WAAW,OAAOC,UACvB,UACA,MACA,WAAW,YAAY;GAAE,IAAI;GAAS,YAAY;EAAE,GACpDF,WACD;EACA,MAAM,WAAW,OAAO,SAAS,QAAQ,WAAW;GACnD,OAAO,EAAE,YAAY,SAAS,KAAK,KAAK;GACxC,eAAe,SAAS;GACxB,cAAcA,YAAU;GACxB,YAAYA,YAAU;EACvB,CAAC;EACD,OAAO,UAAU,KAAK,SAAS,SAAS,EACvC,qBAAqB,KACtB,CAAC,CAAC,CAAC,KACF,OAAO,eAAe,QAAQ,GAC9B,OAAO,eACN,UAAU,UACV,KAAK,eAAe,QAAQ,CAC7B,GACA,OAAO,UACR;EACA,OAAO,OAAO,UACb,KAAK,MAAM,KACV,OAAO,SACL,UAAU,eAAe,MAAM,KAAK,SAC/B,OAAO,IACd,GACA,OAAO,UAAU,UAChB,eAAe,KAAK;GACnB,QAAQ;GACR,OAAO,MAAM;EACd,CAAC,CACF,CACD,GACA,IACD,CAAC,CAAC,KAED,OAAO,SAAS,SAAS,OAAO,CACjC;CACD,CAAC,CAAC,CAAC,KACF,OAAO,eACN,OAAO,gCACP,IAAI,IAAI,CAAC,GAAG,SAASA,YAAU,MAAM,CAAC,CACvC,CACD;AACD,GACA,OAAO,MACR"}
|
package/dist/internal/cleanup.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { close } from "./release.js";
|
|
2
|
-
import { Fork } from "@graftland/graft";
|
|
3
1
|
import { Array, Cause, Effect, Schema, Scope } from "effect";
|
|
2
|
+
import { Fork } from "@graftland/graft";
|
|
3
|
+
import * as Release from "@graftland/graft/Release";
|
|
4
4
|
// src/internal/cleanup.ts
|
|
5
5
|
/** Finalizers have no typed failure channel. Keep reasons and their annotations flat. */
|
|
6
6
|
const cleanupCause = (cause) => Cause.fromReasons(Array.flatMap(cause.reasons, (reason) => {
|
|
@@ -9,7 +9,7 @@ const cleanupCause = (cause) => Cause.fromReasons(Array.flatMap(cause.reasons, (
|
|
|
9
9
|
return [reason._tag === "Fail" ? Cause.makeDieReason(reason.error).annotate(Cause.reasonAnnotations(reason)) : reason];
|
|
10
10
|
}));
|
|
11
11
|
/** Assembly children close before the entry reports their cleanup as its own result. */
|
|
12
|
-
const children = Effect.acquireRelease(Scope.make(), (scope, exit) => close(scope, exit).pipe(Effect.catchCause((cause) => Effect.failCause(cleanupCause(cause)))));
|
|
12
|
+
const children = Effect.acquireRelease(Scope.make(), (scope, exit) => Release.close(scope, exit).pipe(Effect.catchCause((cause) => Effect.failCause(cleanupCause(cause)))));
|
|
13
13
|
export { children, cleanupCause };
|
|
14
14
|
|
|
15
15
|
//# sourceMappingURL=cleanup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.js","names":[
|
|
1
|
+
{"version":3,"file":"cleanup.js","names":[],"sources":["../../src/internal/cleanup.ts"],"sourcesContent":["import { Array, Cause, Effect, Schema, Scope } from \"effect\"\n\nimport { Fork } from \"@graftland/graft\"\nimport * as Release from \"@graftland/graft/Release\"\n\n/** Finalizers have no typed failure channel. Keep reasons and their annotations flat. */\nexport const cleanupCause = (cause: Cause.Cause<unknown>): Cause.Cause<never> =>\n\tCause.fromReasons(\n\t\tArray.flatMap(cause.reasons, (reason) => {\n\t\t\tconst error =\n\t\t\t\treason._tag === \"Fail\"\n\t\t\t\t\t? reason.error\n\t\t\t\t\t: reason._tag === \"Die\"\n\t\t\t\t\t\t? reason.defect\n\t\t\t\t\t\t: undefined\n\t\t\tif (Schema.is(Fork.CleanupError)(error))\n\t\t\t\treturn Array.map(cleanupCause(error.cause).reasons, (inner) =>\n\t\t\t\t\tinner.annotate(Cause.reasonAnnotations(reason)),\n\t\t\t\t)\n\t\t\treturn [\n\t\t\t\treason._tag === \"Fail\"\n\t\t\t\t\t? Cause.makeDieReason(reason.error).annotate(\n\t\t\t\t\t\t\tCause.reasonAnnotations(reason),\n\t\t\t\t\t\t)\n\t\t\t\t\t: reason,\n\t\t\t]\n\t\t}),\n\t)\n\n/** Assembly children close before the entry reports their cleanup as its own result. */\nexport const children = Effect.acquireRelease(Scope.make(), (scope, exit) =>\n\tRelease.close(scope, exit).pipe(\n\t\tEffect.catchCause((cause) => Effect.failCause(cleanupCause(cause))),\n\t),\n)\n"],"mappings":";;;;;AAMA,MAAa,gBAAgB,UAC5B,MAAM,YACL,MAAM,QAAQ,MAAM,UAAU,WAAW;CACxC,MAAM,QACL,OAAO,SAAS,SACb,OAAO,QACP,OAAO,SAAS,QACf,OAAO,SACP,KAAA;CACL,IAAI,OAAO,GAAG,KAAK,YAAY,CAAC,CAAC,KAAK,GACrC,OAAO,MAAM,IAAI,aAAa,MAAM,KAAK,CAAC,CAAC,UAAU,UACpD,MAAM,SAAS,MAAM,kBAAkB,MAAM,CAAC,CAC/C;CACD,OAAO,CACN,OAAO,SAAS,SACb,MAAM,cAAc,OAAO,KAAK,CAAC,CAAC,SAClC,MAAM,kBAAkB,MAAM,CAC/B,IACC,MACJ;AACD,CAAC,CACF;;AAGD,MAAa,WAAW,OAAO,eAAe,MAAM,KAAK,IAAI,OAAO,SACnE,QAAQ,MAAM,OAAO,IAAI,CAAC,CAAC,KAC1B,OAAO,YAAY,UAAU,OAAO,UAAU,aAAa,KAAK,CAAC,CAAC,CACnE,CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","names":["Contract.UndeclaredFailure","Control.make"],"sources":["../../src/internal/contract.ts"],"sourcesContent":["import { Cause, Schema } from \"effect\"\nimport * as Contract from \"../Contract\"\nimport { ChildFailure } from \"./childErrors\"\nimport * as Control from \"./control\"\n\n/** Control RPCs and child failures belong to the execution protocol, not the public descriptor. */\nexport const prepare = <\n\tS extends Schema.Top & {\n\t\treadonly Encoded: Schema.Json\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n\tE extends Schema.Top & {\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n>(\n\tcontract: Contract.Contract<S, E>,\n) => {\n\tconst failure = Schema.Union([\n\t\tcontract.error,\n\t\tContract.UndeclaredFailure,\n\t\tChildFailure,\n\t])\n\tconst codec = Schema.toCodecJson(\n\t\tSchema.Cause(failure, Schema.Defect({ includeStack: true })),\n\t)\n\tconst declared = Schema.is(failure)\n\tconst normalizeCause = (cause: Cause.Cause<unknown>) =>\n\t\tCause.map(cause, (error) =>\n\t\t\tdeclared(error)\n\t\t\t\t? error\n\t\t\t\t: Contract.UndeclaredFailure.make({ original: error }),\n\t\t)\n\treturn {\n\t\t...contract,\n\t\tcontrol: Control.make(codec),\n\t\tnormalizeCause,\n\t\tencodeCause: (cause: Cause.Cause<unknown>) =>\n\t\t\tnormalizeCause(cause).pipe(Schema.encodeEffect(codec)),\n\t\tdecodeCause: Schema.decodeUnknownEffect(codec),\n\t}\n}\n\nexport type RunnerContract = ReturnType<\n\ttypeof prepare<Schema.Codec<unknown, Schema.Json>, Schema.Codec<unknown>>\n>\n"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"contract.js","names":["Contract.UndeclaredFailure","Control.make"],"sources":["../../src/internal/contract.ts"],"sourcesContent":["import { Cause, Schema } from \"effect\"\n\nimport * as Contract from \"../Contract\"\nimport { ChildFailure } from \"./childErrors\"\nimport * as Control from \"./control\"\n\n/** Control RPCs and child failures belong to the execution protocol, not the public descriptor. */\nexport const prepare = <\n\tS extends Schema.Top & {\n\t\treadonly Encoded: Schema.Json\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n\tE extends Schema.Top & {\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n>(\n\tcontract: Contract.Contract<S, E>,\n) => {\n\tconst failure = Schema.Union([\n\t\tcontract.error,\n\t\tContract.UndeclaredFailure,\n\t\tChildFailure,\n\t])\n\tconst codec = Schema.toCodecJson(\n\t\tSchema.Cause(failure, Schema.Defect({ includeStack: true })),\n\t)\n\tconst declared = Schema.is(failure)\n\tconst normalizeCause = (cause: Cause.Cause<unknown>) =>\n\t\tCause.map(cause, (error) =>\n\t\t\tdeclared(error)\n\t\t\t\t? error\n\t\t\t\t: Contract.UndeclaredFailure.make({ original: error }),\n\t\t)\n\treturn {\n\t\t...contract,\n\t\tcontrol: Control.make(codec),\n\t\tnormalizeCause,\n\t\tencodeCause: (cause: Cause.Cause<unknown>) =>\n\t\t\tnormalizeCause(cause).pipe(Schema.encodeEffect(codec)),\n\t\tdecodeCause: Schema.decodeUnknownEffect(codec),\n\t}\n}\n\nexport type RunnerContract = ReturnType<\n\ttypeof prepare<Schema.Codec<unknown, Schema.Json>, Schema.Codec<unknown>>\n>\n"],"mappings":";;;;;;AAOA,MAAa,WAWZ,aACI;CACJ,MAAM,UAAU,OAAO,MAAM;EAC5B,SAAS;EACTA;EACA;CACD,CAAC;CACD,MAAM,QAAQ,OAAO,YACpB,OAAO,MAAM,SAAS,OAAO,OAAO,EAAE,cAAc,KAAK,CAAC,CAAC,CAC5D;CACA,MAAM,WAAW,OAAO,GAAG,OAAO;CAClC,MAAM,kBAAkB,UACvB,MAAM,IAAI,QAAQ,UACjB,SAAS,KAAK,IACX,QAAA,kBAC2B,KAAK,EAAE,UAAU,MAAM,CAAC,CACvD;CACD,OAAO;EACN,GAAG;EACH,SAASC,KAAa,KAAK;EAC3B;EACA,cAAc,UACb,eAAe,KAAK,CAAC,CAAC,KAAK,OAAO,aAAa,KAAK,CAAC;EACtD,aAAa,OAAO,oBAAoB,KAAK;CAC9C;AACD"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ClientCertificate } from "../Auth.js";
|
|
2
|
-
import { Connect as Connect$1 } from "
|
|
3
|
-
import
|
|
2
|
+
import { Connect as Connect$1 } from "../Config.js";
|
|
3
|
+
import "./entryConfig.js";
|
|
4
4
|
import { Effect, Redacted, Scope } from "effect";
|
|
5
|
+
import { Graft, Plugin } from "@graftland/graft";
|
|
5
6
|
export type Source<A, D extends ReadonlyArray<Plugin.Dependency>, E = unknown> = Effect.Effect<A, E, Scope.Scope> | {
|
|
6
7
|
readonly inject: D;
|
|
7
8
|
readonly read: Effect.Effect<A, unknown, NoInfer<Plugin.Required<D>> | Scope.Scope>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","names":[],"sources":["../../src/internal/credentials.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","names":[],"sources":["../../src/internal/credentials.ts"],"mappings":";;;;;YASY,OAAO,GAAG,UAAU,cAAc,OAAO,aAAa,eAC/D,OAAO,OAAO,GAAG,GAAG,MAAM;WAEjB,QAAQ;WACR,MAAM,OAAO,OACrB,YAEA,QAAQ,OAAO,SAAS,MAAM,MAAM;;;YAI5B,MAAM,UAAU,cAAc,OAAO;WAC5B;IAAiB,OAAO,SAAS,kBAAkB;;YAE5D,eAAe,UAAU,cAAc,OAAO;WAC5C;WAAuB;;WACvB;aAAiB;;;WAEnB;aACK;aAAuB;MAClC,OAAO,mBAAmB;;WAElB;aAAmB,OAAO,MAAM;;;WAChC;aAAgB,OAAO,MAAM;;;YAC/B,QAAQ,UAAU,cAAc,OAAO,oCACrB,UAAA,uBAAsB,KAChD;WACa;;WACA;;WACA,SAAS;IACrB,IACA,KAAK;WAAwB,OAAO,eAAe"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Credentials } from "../Auth.js";
|
|
2
2
|
import { CredentialsError } from "../Errors.js";
|
|
3
3
|
import { prepare } from "./auth/token.js";
|
|
4
|
-
import { Graft, Plugin } from "@graftland/graft";
|
|
5
4
|
import { Cause, Context, Effect, Scope } from "effect";
|
|
5
|
+
import { Graft, Plugin } from "@graftland/graft";
|
|
6
6
|
// src/internal/credentials.ts
|
|
7
7
|
const provider = (source, encode) => {
|
|
8
8
|
const input = Effect.isEffect(source) ? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","names":[],"sources":["../../src/internal/credentials.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"credentials.js","names":[],"sources":["../../src/internal/credentials.ts"],"sourcesContent":["import { Cause, Context, Effect, Redacted, Scope } from \"effect\"\n\nimport { Graft, Plugin } from \"@graftland/graft\"\n\nimport { Credentials, type ClientCertificate, type Prepared } from \"../Auth\"\nimport { CredentialsError } from \"../Errors\"\nimport { prepare } from \"./auth/token\"\nimport type * as Configuration from \"./entryConfig\"\n\nexport type Source<A, D extends ReadonlyArray<Plugin.Dependency>, E = unknown> =\n\t| Effect.Effect<A, E, Scope.Scope>\n\t| {\n\t\t\treadonly inject: D\n\t\t\treadonly read: Effect.Effect<\n\t\t\t\tA,\n\t\t\t\tunknown,\n\t\t\t\tNoInfer<Plugin.Required<D>> | Scope.Scope\n\t\t\t>\n\t }\n/** A token value, a file, or a credential effect with declared dependencies. */\nexport type Token<D extends ReadonlyArray<Plugin.Dependency>> =\n\tstring | { readonly file: string } | Source<Redacted.Redacted<string>, D>\n/** Authentication configuration shared by TypeScript connection descriptions. */\nexport type Authentication<D extends ReadonlyArray<Plugin.Dependency>> =\n\t| { readonly name: string; readonly config?: unknown }\n\t| { readonly none: { readonly identity?: string } }\n\t| {\n\t\t\treadonly mtls:\n\t\t\t\t| { readonly cert: string; readonly key: string }\n\t\t\t\t| Source<ClientCertificate, D>\n\t }\n\t| { readonly bearer: { readonly token: Token<D> } }\n\t| { readonly jwt: { readonly token: Token<D> } }\nexport type Connect<D extends ReadonlyArray<Plugin.Dependency> = readonly []> =\n\ttypeof Configuration.Connect.Encoded extends infer C\n\t\t? C extends\n\t\t\t\t| { readonly local: object }\n\t\t\t\t| { readonly worker: object }\n\t\t\t\t| { readonly command: ReadonlyArray<string> }\n\t\t\t? C\n\t\t\t: Omit<C, \"auth\"> & { readonly auth?: Authentication<D> }\n\t\t: never\n\nconst provider = <A, E, D extends ReadonlyArray<Plugin.Dependency>>(\n\tsource: Source<A, D, E>,\n\tencode: (\n\t\tread: Effect.Effect<A, CredentialsError, Scope.Scope>,\n\t) => typeof Credentials.Service,\n) => {\n\tconst input = Effect.isEffect(source) ? { inject: [], read: source } : source\n\treturn Plugin.make({\n\t\tname: \"remote-effect-credentials\",\n\t\tinject: input.inject,\n\t\tapply: Effect.fnUntraced(function* () {\n\t\t\t// Restore the provider's context without replacing each read's owning scope.\n\t\t\tconst context = yield* Effect.context<\n\t\t\t\tPlugin.Required<D> | Scope.Scope\n\t\t\t>().pipe(Effect.map(Context.omit(Scope.Scope)))\n\t\t\tconst read = input.read.pipe(\n\t\t\t\tEffect.provideContext(context),\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tCredentialsError.make({ cause: Cause.fail(error) }),\n\t\t\t\t),\n\t\t\t)\n\t\t\tyield* Graft.provide(Credentials, encode(read))\n\t\t}),\n\t})\n}\nexport const invocation = <D extends ReadonlyArray<Plugin.Dependency>>(\n\tconnect: Connect<D>,\n) => {\n\tconst auth = connect.auth\n\tif (auth === undefined) return undefined\n\tif (\"mtls\" in auth) {\n\t\tconst source = auth.mtls\n\t\tif (Effect.isEffect(source) || \"read\" in source)\n\t\t\treturn {\n\t\t\t\tplugin: provider(source, (read) => ({\n\t\t\t\t\tkind: \"Certificate\",\n\t\t\t\t\tread: read.pipe(\n\t\t\t\t\t\tEffect.map(\n\t\t\t\t\t\t\t(value): Extract<Prepared, { readonly _tag: \"Certificate\" }> => ({\n\t\t\t\t\t\t\t\t_tag: \"Certificate\",\n\t\t\t\t\t\t\t\tvalue,\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\tconfig: undefined,\n\t\t\t}\n\t}\n\tif (\"bearer\" in auth || \"jwt\" in auth) {\n\t\tconst source = \"bearer\" in auth ? auth.bearer.token : auth.jwt.token\n\t\tif (\n\t\t\ttypeof source !== \"string\" &&\n\t\t\t(Effect.isEffect(source) || \"read\" in source)\n\t\t)\n\t\t\treturn {\n\t\t\t\tplugin: provider(source, (read) => ({\n\t\t\t\t\tkind: \"Authorization\",\n\t\t\t\t\tread: read.pipe(\n\t\t\t\t\t\tEffect.flatMap(prepare),\n\t\t\t\t\t\tEffect.map(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t): Extract<Prepared, { readonly _tag: \"Authorization\" }> => ({\n\t\t\t\t\t\t\t\t_tag: \"Authorization\",\n\t\t\t\t\t\t\t\tvalue,\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\tconfig: undefined,\n\t\t\t}\n\t}\n\treturn undefined\n}\n"],"mappings":";;;;;;AA2CA,MAAM,YACL,QACA,WAGI;CACJ,MAAM,QAAQ,OAAO,SAAS,MAAM,IAAI;EAAE,QAAQ,CAAC;EAAG,MAAM;CAAO,IAAI;CACvE,OAAO,OAAO,KAAK;EAClB,MAAM;EACN,QAAQ,MAAM;EACd,OAAO,OAAO,WAAW,aAAa;GAErC,MAAM,UAAU,OAAO,OAAO,QAE5B,CAAC,CAAC,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,KAAK,CAAC,CAAC;GAC9C,MAAM,OAAO,MAAM,KAAK,KACvB,OAAO,eAAe,OAAO,GAC7B,OAAO,UAAU,UAChB,iBAAiB,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACnD,CACD;GACA,OAAO,MAAM,QAAQ,aAAa,OAAO,IAAI,CAAC;EAC/C,CAAC;CACF,CAAC;AACF;AACA,MAAa,cACZ,YACI;CACJ,MAAM,OAAO,QAAQ;CACrB,IAAI,SAAS,KAAA,GAAW,OAAO,KAAA;CAC/B,IAAI,UAAU,MAAM;EACnB,MAAM,SAAS,KAAK;EACpB,IAAI,OAAO,SAAS,MAAM,KAAK,UAAU,QACxC,OAAO;GACN,QAAQ,SAAS,SAAS,UAAU;IACnC,MAAM;IACN,MAAM,KAAK,KACV,OAAO,KACL,WAAgE;KAChE,MAAM;KACN;IACD,EACD,CACD;GACD,EAAE;GACF,QAAQ,KAAA;EACT;CACF;CACA,IAAI,YAAY,QAAQ,SAAS,MAAM;EACtC,MAAM,SAAS,YAAY,OAAO,KAAK,OAAO,QAAQ,KAAK,IAAI;EAC/D,IACC,OAAO,WAAW,aACjB,OAAO,SAAS,MAAM,KAAK,UAAU,SAEtC,OAAO;GACN,QAAQ,SAAS,SAAS,UAAU;IACnC,MAAM;IACN,MAAM,KAAK,KACV,OAAO,QAAQ,OAAO,GACtB,OAAO,KAEL,WAC4D;KAC5D,MAAM;KACN;IACD,EACD,CACD;GACD,EAAE;GACF,QAAQ,KAAA;EACT;CACF;AAED"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directTransport.js","names":[],"sources":["../../src/internal/directTransport.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"directTransport.js","names":[],"sources":["../../src/internal/directTransport.ts"],"sourcesContent":["import {\n\tContext,\n\ttype Effect,\n\ttype Option,\n\ttype PlatformError,\n\ttype Scope,\n} from \"effect\"\n\nimport type { ProcessExited, TransportError } from \"../Errors\"\nimport type { Channel } from \"../Transport\"\n\nexport interface LocalOptions {\n\treadonly command?: readonly [string, ...string[]]\n\treadonly contractModule: string\n\treadonly session: string\n}\nexport interface Execution {\n\treadonly channel: Channel\n\treadonly pid: Option.Option<number>\n\treadonly threadId?: number\n\treadonly exited: Effect.Effect<ProcessExited, TransportError>\n\treadonly failure: Effect.Effect<never, TransportError>\n}\nexport class LocalTransport extends Context.Service<\n\tLocalTransport,\n\t{\n\t\treadonly start: (\n\t\t\toptions: LocalOptions,\n\t\t) => Effect.Effect<Execution, PlatformError.PlatformError, Scope.Scope>\n\t}\n>()(\"@graftland/plugin-remote/internal/directTransport/LocalTransport\") {}\n\nexport interface WorkerOptions {\n\treadonly execArgv?: ReadonlyArray<string>\n\treadonly contractModule: string\n\treadonly session: string\n}\nexport class WorkerTransport extends Context.Service<\n\tWorkerTransport,\n\t{\n\t\treadonly start: (\n\t\t\toptions: WorkerOptions,\n\t\t) => Effect.Effect<Execution, TransportError, Scope.Scope>\n\t}\n>()(\"@graftland/plugin-remote/internal/directTransport/WorkerTransport\") {}\n"],"mappings":";;AAuBA,IAAa,iBAAb,cAAoC,QAAQ,QAO1C,CAAC,CAAC,kEAAkE,CAAC,CAAC,CAAC;AAOzE,IAAa,kBAAb,cAAqC,QAAQ,QAO3C,CAAC,CAAC,mEAAmE,CAAC,CAAC,CAAC"}
|