@graftland/plugin-remote 0.3.1 → 0.3.3
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/dist/Auth.d.ts +2 -2
- package/dist/Auth.d.ts.map +1 -1
- package/dist/Auth.js.map +1 -1
- package/dist/{Bootstrap-Dr6sX7el.js → Bootstrap-H9gDsgsC.js} +2 -2
- package/dist/{Contract-DL2mHvaT.js → Contract-DsJtisvL.js} +2 -2
- package/dist/Contract.js +1 -1
- package/dist/{Errors-BMKmu5Y7.js → Errors-DYhsGZcZ.js} +3 -1
- package/dist/Errors.d.ts +7 -0
- package/dist/Errors.d.ts.map +1 -1
- package/dist/Errors.js +3 -1
- package/dist/Errors.js.map +1 -1
- package/dist/{FailureGroup-BcH0XOBi.js → FailureGroup-BgT73AaR.js} +14 -4
- package/dist/{Framing-zaYdOJnT.js → Framing-G9eSaeLb.js} +1 -1
- package/dist/{Graft-CVyueNOf.js → Graft-B71CPA2Y.js} +20 -16
- package/dist/{Packages-JNL34JpS.js → Packages-AgoCGotL.js} +23 -26
- package/dist/{Peer-BT7eAGmh.js → Peer-DXeVrGBh.js} +5 -5
- package/dist/{ProcessObservation-DEGrEMfP.js → ProcessObservation-gLgGirYv.js} +1 -1
- package/dist/{ServeLifecycle-CJM0gG5B.js → ServeLifecycle-Bd1FPJ6e.js} +1 -1
- package/dist/Transport.d.ts +2 -2
- package/dist/Transport.d.ts.map +1 -1
- package/dist/Transport.js.map +1 -1
- package/dist/bin.js +48 -47
- package/dist/bin.js.map +1 -1
- package/dist/{childRuntime-An0HsIzl.js → childRuntime-Bm3iSg_N.js} +29 -26
- package/dist/{connectionEnded-DCpFCjMX.js → connectionEnded-BwcxQ7W8.js} +4 -4
- package/dist/{entry-B89sepMU.js → entry-psOpX3Bj.js} +72 -35
- 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 +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 +1 -1
- package/dist/host/auth/mtls.d.ts +8 -1
- package/dist/host/auth/mtls.d.ts.map +1 -1
- package/dist/host/auth/mtls.js +2 -2
- package/dist/host/auth/none.d.ts +3 -1
- package/dist/host/auth/none.js +1 -1
- package/dist/host/command.d.ts +14 -1
- package/dist/host/command.d.ts.map +1 -1
- package/dist/host/command.js +4 -4
- package/dist/host/local.d.ts +2 -1
- package/dist/host/local.d.ts.map +1 -1
- package/dist/host/local.js +3 -3
- package/dist/host/unix.d.ts +6 -1
- package/dist/host/unix.d.ts.map +1 -1
- package/dist/host/unix.js +3 -3
- package/dist/host/websocket.d.ts +10 -1
- package/dist/host/websocket.d.ts.map +1 -1
- package/dist/host/websocket.js +3 -3
- package/dist/host/worker.d.ts +3 -1
- package/dist/host/worker.d.ts.map +1 -1
- package/dist/host/worker.js +4 -5
- package/dist/{importer-Bk6U_sn4.js → importer-Cvf88eAY.js} +5 -8
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/internal/Certificates.js +4 -4
- package/dist/internal/Certificates.js.map +1 -1
- package/dist/internal/FailureGroup.js +3 -2
- package/dist/internal/FailureGroup.js.map +1 -1
- package/dist/internal/assembly.d.ts +2 -1
- package/dist/internal/assembly.js +9 -2
- package/dist/internal/assembly.js.map +1 -1
- package/dist/internal/auth/mtls.js +1 -1
- package/dist/internal/auth/mtls.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/child.js +20 -17
- package/dist/internal/child.js.map +1 -1
- package/dist/internal/childRuntime.js +4 -4
- package/dist/internal/childRuntime.js.map +1 -1
- package/dist/internal/credentials.d.ts +1 -1
- package/dist/internal/directTransport.d.ts +1 -1
- package/dist/internal/entry.d.ts +415 -3
- package/dist/internal/entry.d.ts.map +1 -1
- package/dist/internal/entry.js +1 -1
- package/dist/internal/entry.js.map +1 -1
- package/dist/internal/execution.js +40 -5
- package/dist/internal/execution.js.map +1 -1
- package/dist/internal/host/runner.js +7 -6
- package/dist/internal/host/runner.js.map +1 -1
- package/dist/internal/host.js +5 -5
- package/dist/internal/host.js.map +1 -1
- package/dist/internal/port.js +5 -5
- package/dist/internal/port.js.map +1 -1
- package/dist/internal/release.js +1 -1
- package/dist/internal/release.js.map +1 -1
- package/dist/internal/runner/Connection.d.ts +1 -1
- package/dist/internal/runner/Connection.js +4 -4
- package/dist/internal/runner/Connection.js.map +1 -1
- package/dist/internal/runner/Execution.js +3 -3
- package/dist/internal/runner/Execution.js.map +1 -1
- package/dist/internal/runner/Framing.js +1 -1
- package/dist/internal/runner/Framing.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 +1 -1
- package/dist/internal/runner/Lock.js.map +1 -1
- package/dist/internal/runner/Packages.d.ts +1 -1
- package/dist/internal/runner/Packages.js +22 -25
- package/dist/internal/runner/Packages.js.map +1 -1
- package/dist/internal/runner/Processes.js +7 -9
- package/dist/internal/runner/Processes.js.map +1 -1
- package/dist/internal/runner/Store.js +3 -3
- package/dist/internal/runner/Store.js.map +1 -1
- package/dist/internal/runner/Supervisor.js +46 -47
- package/dist/internal/runner/Supervisor.js.map +1 -1
- package/dist/internal/runner/accept.js +3 -3
- package/dist/internal/runner/accept.js.map +1 -1
- package/dist/internal/runner/model.js +1 -1
- package/dist/internal/runner/model.js.map +1 -1
- package/dist/internal/serve.js +1 -1
- package/dist/internal/serve.js.map +1 -1
- package/dist/internal/supervisorPlugin.js +1 -1
- package/dist/internal/watchdogMain.js +5 -5
- package/dist/internal/watchdogMain.js.map +1 -1
- package/dist/internal/websocketServer.js +3 -1
- package/dist/internal/websocketServer.js.map +1 -1
- package/dist/internal/workerMain.js +3 -3
- package/dist/{port-DSVUY8Bq.js → port--3x2zJ4D.js} +8 -8
- package/dist/{release-BY4Mlluy.js → release-DfZPuIcK.js} +1 -1
- package/dist/runner/auth/bearer.d.ts +6 -1
- package/dist/runner/auth/bearer.d.ts.map +1 -1
- package/dist/runner/auth/bearer.js +2 -2
- package/dist/runner/auth/jwt.d.ts +29 -2
- package/dist/runner/auth/jwt.d.ts.map +1 -1
- package/dist/runner/auth/jwt.js +4 -4
- package/dist/runner/auth/jwt.js.map +1 -1
- package/dist/runner/auth/mtls.d.ts +6 -1
- package/dist/runner/auth/mtls.d.ts.map +1 -1
- package/dist/runner/auth/mtls.js +3 -3
- package/dist/runner/auth/none.d.ts +7 -1
- package/dist/runner/auth/none.js +1 -1
- package/dist/runner/index.d.ts +310 -1
- package/dist/runner/index.d.ts.map +1 -1
- package/dist/runner/index.js +5 -5
- package/dist/runner/stdio.d.ts +6 -1
- package/dist/runner/stdio.d.ts.map +1 -1
- package/dist/runner/stdio.js +3 -3
- package/dist/runner/unix.d.ts +6 -1
- package/dist/runner/unix.d.ts.map +1 -1
- package/dist/runner/unix.js +3 -3
- package/dist/runner/websocket.d.ts +24 -1
- package/dist/runner/websocket.d.ts.map +1 -1
- package/dist/runner/websocket.js +4 -4
- package/dist/{socketChannel-C_ppdSzz.js → socketChannel-CJvL2DiB.js} +2 -2
- package/dist/{supervisorPlugin-CivhM7x5.js → supervisorPlugin-t6Z6PrhD.js} +72 -76
- package/dist/{token-Cc_1CTbE.js → token-CYBNNlhS.js} +1 -1
- package/dist/{tokenCredentials-CI6mMRRd.js → tokenCredentials-CbCuk-Rt.js} +3 -3
- package/dist/{websocketServer-D2Hk7wsA.js → websocketServer-NQhODlEt.js} +5 -3
- package/dist/{workerChannel-cmLc13vm.js → workerChannel-C8hhBJzA.js} +1 -1
- package/package.json +4 -4
- package/src/Auth.ts +9 -2
- package/src/Errors.ts +8 -0
- package/src/Transport.ts +6 -2
- package/src/bin.ts +28 -30
- package/src/index.ts +5 -3
- package/src/internal/Certificates.ts +10 -13
- package/src/internal/FailureGroup.ts +128 -121
- package/src/internal/assembly.ts +19 -10
- package/src/internal/auth/mtls.ts +19 -20
- package/src/internal/child.ts +248 -239
- package/src/internal/childRuntime.ts +81 -80
- package/src/internal/entry.ts +10 -11
- package/src/internal/execution.ts +69 -12
- package/src/internal/host/runner.ts +153 -153
- package/src/internal/host.ts +116 -120
- package/src/internal/port.ts +100 -103
- package/src/internal/release.ts +3 -2
- package/src/internal/runner/Connection.ts +52 -60
- package/src/internal/runner/Execution.ts +163 -164
- package/src/internal/runner/Framing.ts +9 -10
- package/src/internal/runner/Local.ts +26 -27
- package/src/internal/runner/Lock.ts +23 -25
- package/src/internal/runner/Packages.ts +67 -70
- package/src/internal/runner/Processes.ts +89 -92
- package/src/internal/runner/Store.ts +110 -114
- package/src/internal/runner/Supervisor.ts +392 -405
- package/src/internal/runner/accept.ts +76 -84
- package/src/internal/runner/model.ts +20 -21
- package/src/internal/serve.ts +15 -13
- package/src/internal/watchdogMain.ts +16 -11
- package/src/internal/websocketServer.ts +18 -3
- package/src/runner/auth/jwt.ts +10 -6
- package/dist/cleanup-CXLa1Wd9.js +0 -13
|
@@ -1 +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 = (
|
|
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 = Effect.fnUntraced(function* (\n\tentries: Fork.Fork,\n\tlifecycle: typeof ServeLifecycle.Service,\n) {\n\tconst disposed = yield* Effect.exit(entries.dispose)\n\tconst released = yield* Effect.exit(Deferred.await(lifecycle.released))\n\tconst cause = Array.reduce(\n\t\t[disposed, released],\n\t\tCause.empty,\n\t\t(cause: Cause.Cause<unknown>, exit: Exit.Exit<void, unknown>) =>\n\t\t\tExit.isFailure(exit) ? Cause.combine(cause, exit.cause) : cause,\n\t)\n\tif (cause.reasons.length > 0)\n\t\treturn yield* Effect.failCause(cleanupCause(cause))\n})\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,QAAQ,OAAO,WAAW,WAC/B,SACA,WACC;CACD,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;AAED,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as Config, n as default } from "../supervisorPlugin-
|
|
1
|
+
export { t as Config, n as default } from "../supervisorPlugin-t6Z6PrhD.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as Notice, t as CommandJson } from "../WatchdogProtocol-BZmVxrBP.js";
|
|
2
|
-
import { Effect, FiberHandle, Ref, Schema, Stream } from "effect";
|
|
2
|
+
import { Clock, Effect, FiberHandle, Ref, Schema, Stream } from "effect";
|
|
3
3
|
import { NodeRuntime, NodeStream } from "@effect/platform-node";
|
|
4
4
|
import process from "node:process";
|
|
5
5
|
import { parentPort } from "node:worker_threads";
|
|
@@ -8,11 +8,11 @@ import { Socket } from "node:net";
|
|
|
8
8
|
/** Executable worker: fd 4 and the lease timer remain independent of the plugin thread. */
|
|
9
9
|
const die = Effect.sync(() => process.kill(process.pid, "SIGKILL")).pipe(Effect.andThen(Effect.never));
|
|
10
10
|
const notify = (notice) => Schema.encodeEffect(Notice)(notice).pipe(Effect.flatMap((message) => Effect.sync(() => parentPort?.postMessage(message))));
|
|
11
|
-
const now = Effect.
|
|
12
|
-
const expire =
|
|
11
|
+
const now = Clock.monotonicTimeNanos.pipe(Effect.map((nanos) => Number(nanos) / 1e6));
|
|
12
|
+
const expire = Effect.fnUntraced(function* (deadline) {
|
|
13
13
|
const remaining = deadline - (yield* now);
|
|
14
14
|
if (remaining <= 0) return yield* die;
|
|
15
|
-
yield* Effect.sleep(
|
|
15
|
+
yield* Effect.sleep(remaining);
|
|
16
16
|
return yield* expire(deadline);
|
|
17
17
|
});
|
|
18
18
|
const main = Effect.scoped(Effect.gen(function* () {
|
|
@@ -30,7 +30,7 @@ const main = Effect.scoped(Effect.gen(function* () {
|
|
|
30
30
|
socket.destroy();
|
|
31
31
|
}));
|
|
32
32
|
yield* notify("ready");
|
|
33
|
-
yield* NodeStream.fromReadable({ evaluate: () => input }).pipe(Stream.decodeText(), Stream.splitLines, Stream.mapEffect((line) => Schema.decodeEffect(CommandJson)(line)), Stream.runForEach(
|
|
33
|
+
yield* NodeStream.fromReadable({ evaluate: () => input }).pipe(Stream.decodeText(), Stream.splitLines, Stream.mapEffect((line) => Schema.decodeEffect(CommandJson)(line)), Stream.runForEach(Effect.fnUntraced(function* (command) {
|
|
34
34
|
if (command.kind === "start") return yield* notify("start");
|
|
35
35
|
if (command.kind === "stop") {
|
|
36
36
|
yield* Ref.update(lease, (state) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchdogMain.js","names":[],"sources":["../../src/internal/watchdogMain.ts"],"sourcesContent":["/** Executable worker: fd 4 and the lease timer remain independent of the plugin thread. */\nimport { NodeRuntime, NodeStream } from \"@effect/platform-node\"\nimport { Effect, FiberHandle, Ref, Schema, Stream } from \"effect\"\nimport { Socket } from \"node:net\"\nimport { parentPort } from \"node:worker_threads\"\nimport process from \"node:process\"\nimport { CommandJson, Notice } from \"./runner/WatchdogProtocol\"\n\n// The runner machine is trusted. A suspended machine cannot enforce a deadline until it resumes.\n// Killing this live process has no PID lookup; external supervisor kills retain a small PID reuse window.\nconst die = Effect.sync(() => process.kill(process.pid, \"SIGKILL\")).pipe(\n\tEffect.andThen(Effect.never),\n)\nconst notify = (notice: typeof Notice.Type) =>\n\tSchema.encodeEffect(Notice)(notice).pipe(\n\t\tEffect.flatMap((message) =>\n\t\t\tEffect.sync(() => parentPort?.postMessage(message)),\n\t\t),\n\t)\nconst now =
|
|
1
|
+
{"version":3,"file":"watchdogMain.js","names":[],"sources":["../../src/internal/watchdogMain.ts"],"sourcesContent":["/** Executable worker: fd 4 and the lease timer remain independent of the plugin thread. */\nimport { NodeRuntime, NodeStream } from \"@effect/platform-node\"\nimport { Clock, Effect, FiberHandle, Ref, Schema, Stream } from \"effect\"\nimport { Socket } from \"node:net\"\nimport { parentPort } from \"node:worker_threads\"\nimport process from \"node:process\"\nimport { CommandJson, Notice } from \"./runner/WatchdogProtocol\"\n\n// The runner machine is trusted. A suspended machine cannot enforce a deadline until it resumes.\n// Killing this live process has no PID lookup; external supervisor kills retain a small PID reuse window.\nconst die = Effect.sync(() => process.kill(process.pid, \"SIGKILL\")).pipe(\n\tEffect.andThen(Effect.never),\n)\nconst notify = (notice: typeof Notice.Type) =>\n\tSchema.encodeEffect(Notice)(notice).pipe(\n\t\tEffect.flatMap((message) =>\n\t\t\tEffect.sync(() => parentPort?.postMessage(message)),\n\t\t),\n\t)\n// Milliseconds on the monotonic clock, which the lease sleep also uses.\nconst now = Clock.monotonicTimeNanos.pipe(\n\tEffect.map((nanos) => Number(nanos) / 1_000_000),\n)\nconst expire = Effect.fnUntraced(function* (\n\tdeadline: number,\n): Effect.fn.Return<never> {\n\tconst remaining = deadline - (yield* now)\n\tif (remaining <= 0) return yield* die\n\t// The clock splits sleeps longer than the platform timer limit.\n\tyield* Effect.sleep(remaining)\n\treturn yield* expire(deadline)\n})\nconst main = Effect.scoped(\n\tEffect.gen(function* () {\n\t\tconst lease = yield* Ref.make({\n\t\t\tdeadline: (yield* now) + 30000,\n\t\t\tstopped: false,\n\t\t})\n\t\tconst timer = yield* FiberHandle.make<never, never>()\n\t\tyield* FiberHandle.run(timer, expire((yield* Ref.get(lease)).deadline))\n\t\tconst input = yield* Effect.acquireRelease(\n\t\t\tEffect.sync(() => new Socket({ fd: 4, readable: true, writable: false })),\n\t\t\t(socket) =>\n\t\t\t\tEffect.sync(() => {\n\t\t\t\t\tsocket.destroy()\n\t\t\t\t}),\n\t\t)\n\t\tyield* notify(\"ready\")\n\t\tyield* NodeStream.fromReadable({ evaluate: () => input }).pipe(\n\t\t\tStream.decodeText(),\n\t\t\tStream.splitLines,\n\t\t\tStream.mapEffect((line) => Schema.decodeEffect(CommandJson)(line)),\n\t\t\tStream.runForEach(\n\t\t\t\tEffect.fnUntraced(function* (command: typeof CommandJson.Type) {\n\t\t\t\t\tif (command.kind === \"start\") return yield* notify(\"start\")\n\t\t\t\t\tif (command.kind === \"stop\") {\n\t\t\t\t\t\tyield* Ref.update(lease, (state) => ({ ...state, stopped: true }))\n\t\t\t\t\t\treturn yield* notify(\"stop\")\n\t\t\t\t\t}\n\t\t\t\t\tconst current = yield* Ref.get(lease)\n\t\t\t\t\tconst time = yield* now\n\t\t\t\t\tif (current.stopped || time >= current.deadline) return yield* die\n\t\t\t\t\tconst deadline = time + command.millis\n\t\t\t\t\tyield* Ref.set(lease, { deadline, stopped: false })\n\t\t\t\t\tyield* FiberHandle.run(timer, expire(deadline))\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\treturn yield* die\n\t}),\n).pipe(\n\tEffect.catchCause((cause) =>\n\t\tEffect.logError(\"Watchdog failed\", cause).pipe(Effect.andThen(die)),\n\t),\n)\n\nNodeRuntime.runMain(main)\n"],"mappings":";;;;;;;;AAUA,MAAM,MAAM,OAAO,WAAW,QAAQ,KAAK,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KACnE,OAAO,QAAQ,OAAO,KAAK,CAC5B;AACA,MAAM,UAAU,WACf,OAAO,aAAa,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KACnC,OAAO,SAAS,YACf,OAAO,WAAW,YAAY,YAAY,OAAO,CAAC,CACnD,CACD;AAED,MAAM,MAAM,MAAM,mBAAmB,KACpC,OAAO,KAAK,UAAU,OAAO,KAAK,IAAI,GAAS,CAChD;AACA,MAAM,SAAS,OAAO,WAAW,WAChC,UAC0B;CAC1B,MAAM,YAAY,YAAY,OAAO;CACrC,IAAI,aAAa,GAAG,OAAO,OAAO;CAElC,OAAO,OAAO,MAAM,SAAS;CAC7B,OAAO,OAAO,OAAO,QAAQ;AAC9B,CAAC;AACD,MAAM,OAAO,OAAO,OACnB,OAAO,IAAI,aAAa;CACvB,MAAM,QAAQ,OAAO,IAAI,KAAK;EAC7B,WAAW,OAAO,OAAO;EACzB,SAAS;CACV,CAAC;CACD,MAAM,QAAQ,OAAO,YAAY,KAAmB;CACpD,OAAO,YAAY,IAAI,OAAO,QAAQ,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,QAAQ,CAAC;CACtE,MAAM,QAAQ,OAAO,OAAO,eAC3B,OAAO,WAAW,IAAI,OAAO;EAAE,IAAI;EAAG,UAAU;EAAM,UAAU;CAAM,CAAC,CAAC,IACvE,WACA,OAAO,WAAW;EACjB,OAAO,QAAQ;CAChB,CAAC,CACH;CACA,OAAO,OAAO,OAAO;CACrB,OAAO,WAAW,aAAa,EAAE,gBAAgB,MAAM,CAAC,CAAC,CAAC,KACzD,OAAO,WAAW,GAClB,OAAO,YACP,OAAO,WAAW,SAAS,OAAO,aAAa,WAAW,CAAC,CAAC,IAAI,CAAC,GACjE,OAAO,WACN,OAAO,WAAW,WAAW,SAAkC;EAC9D,IAAI,QAAQ,SAAS,SAAS,OAAO,OAAO,OAAO,OAAO;EAC1D,IAAI,QAAQ,SAAS,QAAQ;GAC5B,OAAO,IAAI,OAAO,QAAQ,WAAW;IAAE,GAAG;IAAO,SAAS;GAAK,EAAE;GACjE,OAAO,OAAO,OAAO,MAAM;EAC5B;EACA,MAAM,UAAU,OAAO,IAAI,IAAI,KAAK;EACpC,MAAM,OAAO,OAAO;EACpB,IAAI,QAAQ,WAAW,QAAQ,QAAQ,UAAU,OAAO,OAAO;EAC/D,MAAM,WAAW,OAAO,QAAQ;EAChC,OAAO,IAAI,IAAI,OAAO;GAAE;GAAU,SAAS;EAAM,CAAC;EAClD,OAAO,YAAY,IAAI,OAAO,OAAO,QAAQ,CAAC;CAC/C,CAAC,CACF,CACD;CACA,OAAO,OAAO;AACf,CAAC,CACF,CAAC,CAAC,KACD,OAAO,YAAY,UAClB,OAAO,SAAS,mBAAmB,KAAK,CAAC,CAAC,KAAK,OAAO,QAAQ,GAAG,CAAC,CACnE,CACD;AAEA,YAAY,QAAQ,IAAI"}
|
|
@@ -6,7 +6,9 @@ import { NodeHttpServer, NodeHttpServerRequest } from "@effect/platform-node";
|
|
|
6
6
|
import { HttpServerRequest, HttpServerResponse } from "effect/http";
|
|
7
7
|
import { TLSSocket } from "node:tls";
|
|
8
8
|
// src/internal/websocketServer.ts
|
|
9
|
-
const rejection = (error) =>
|
|
9
|
+
const rejection = (error) => error._tag === "AuthenticatorUnavailable" ? unavailable(error) : unauthorized(error);
|
|
10
|
+
const unavailable = (error) => Effect.logError("Remote host authenticator is unavailable", error.cause).pipe(Effect.as(HttpServerResponse.empty({ status: 503 })));
|
|
11
|
+
const unauthorized = (error) => Effect.logWarning("Remote host authentication failed", { reason: error.reason }, ...error.cause === void 0 ? [] : [error.cause]).pipe(Effect.as(HttpServerResponse.empty({
|
|
10
12
|
status: 401,
|
|
11
13
|
headers: error.challenge === void 0 ? {} : { "www-authenticate": error.challenge }
|
|
12
14
|
})));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocketServer.js","names":["Channel.fromSocket"],"sources":["../../src/internal/websocketServer.ts"],"sourcesContent":["import { NodeHttpServer, NodeHttpServerRequest } from \"@effect/platform-node\"\nimport {\n\tArray,\n\tCause,\n\tDeferred,\n\tEffect,\n\tOption,\n\tRedacted,\n\tScope,\n\tString,\n} from \"effect\"\nimport { HttpServerRequest, HttpServerResponse } from \"effect/http\"\nimport type { Socket } from \"effect/socket\"\nimport { TLSSocket } from \"node:tls\"\nimport { AuthenticationFailed
|
|
1
|
+
{"version":3,"file":"websocketServer.js","names":["Channel.fromSocket"],"sources":["../../src/internal/websocketServer.ts"],"sourcesContent":["import { NodeHttpServer, NodeHttpServerRequest } from \"@effect/platform-node\"\nimport {\n\tArray,\n\tCause,\n\tDeferred,\n\tEffect,\n\tOption,\n\tRedacted,\n\tScope,\n\tString,\n} from \"effect\"\nimport { HttpServerRequest, HttpServerResponse } from \"effect/http\"\nimport type { Socket } from \"effect/socket\"\nimport { TLSSocket } from \"node:tls\"\nimport {\n\ttype AuthenticationFailed,\n\ttype AuthenticatorUnavailable,\n\tTransportError,\n} from \"../Errors\"\nimport type { Accept, Handshake, Serving } from \"../Transport\"\nimport * as Channel from \"./socketChannel\"\nimport { path, protocol, payloadLimit } from \"./websocket\"\n\nconst rejection = (error: AuthenticationFailed | AuthenticatorUnavailable) =>\n\terror._tag === \"AuthenticatorUnavailable\"\n\t\t? unavailable(error)\n\t\t: unauthorized(error)\n\n// The credential was not judged, so the client is told to retry rather than to replace it.\nconst unavailable = (error: AuthenticatorUnavailable) =>\n\tEffect.logError(\"Remote host authenticator is unavailable\", error.cause).pipe(\n\t\tEffect.as(HttpServerResponse.empty({ status: 503 })),\n\t)\n\nconst unauthorized = (error: AuthenticationFailed) =>\n\tEffect.logWarning(\n\t\t\"Remote host authentication failed\",\n\t\t{\n\t\t\treason: error.reason,\n\t\t},\n\t\t...(error.cause === undefined ? [] : [error.cause]),\n\t).pipe(\n\t\tEffect.as(\n\t\t\tHttpServerResponse.empty({\n\t\t\t\tstatus: 401,\n\t\t\t\theaders:\n\t\t\t\t\terror.challenge === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { \"www-authenticate\": error.challenge },\n\t\t\t}),\n\t\t),\n\t)\n\nconst handshake: Effect.Effect<\n\tHandshake,\n\tnever,\n\tHttpServerRequest.HttpServerRequest\n> = Effect.gen(function* () {\n\tconst request = yield* HttpServerRequest.HttpServerRequest\n\tconst { socket } = NodeHttpServerRequest.toIncomingMessage(request)\n\t// Only a TLS-verified peer is certificate evidence; forwarded headers are not.\n\tconst peer =\n\t\tsocket instanceof TLSSocket && socket.authorized\n\t\t\t? Option.some(socket.getPeerCertificate())\n\t\t\t: Option.none()\n\treturn {\n\t\tauthorization: Option.map(\n\t\t\tOption.fromUndefinedOr(request.headers[\"authorization\"]),\n\t\t\tRedacted.make,\n\t\t),\n\t\tcertificate: Option.map(peer, (certificate) => ({\n\t\t\tder: certificate.raw,\n\t\t\tsubjectAltName: Option.fromUndefinedOr(certificate.subjectaltname),\n\t\t})),\n\t}\n})\n\nconst open = Effect.fnUntraced(function* (\n\tcreateServer: Parameters<typeof NodeHttpServer.make>[0],\n\toptions: Pick<NodeHttpServer.Options, \"host\" | \"port\" | \"path\">,\n) {\n\t// The lazily created ws server belongs here, so serving scopes close before ws.close waits.\n\tconst resources = yield* Effect.acquireRelease(Scope.make(), Scope.close)\n\tconst ready = yield* Deferred.make<void>()\n\tconst server = yield* NodeHttpServer.make(createServer, {\n\t\t...options,\n\t\tdisablePreemptiveShutdown: true,\n\t\twebsocket: {\n\t\t\tperMessageDeflate: false,\n\t\t\tmaxPayload: payloadLimit,\n\t\t\thandleProtocols: (protocols) =>\n\t\t\t\tprotocols.has(protocol) ? protocol : false,\n\t\t},\n\t}).pipe(Scope.provide(resources))\n\treturn {\n\t\taddress: server.address,\n\t\tready: Deferred.await(ready),\n\t\trun: <A, E, R>(\n\t\t\taccept: Effect.Effect<\n\t\t\t\t(socket: Socket.Socket) => Effect.Effect<A, E, R>,\n\t\t\t\tAuthenticationFailed | AuthenticatorUnavailable,\n\t\t\t\tHttpServerRequest.HttpServerRequest\n\t\t\t>,\n\t\t) =>\n\t\t\tserver\n\t\t\t\t.serve(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tconst request = yield* HttpServerRequest.HttpServerRequest\n\t\t\t\t\t\tif (request.url !== path)\n\t\t\t\t\t\t\treturn HttpServerResponse.empty({ status: 404 })\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tString.toLowerCase(request.headers[\"upgrade\"] ?? \"\") !==\n\t\t\t\t\t\t\t\t\"websocket\" ||\n\t\t\t\t\t\t\t!Array.some(\n\t\t\t\t\t\t\t\tString.split(\n\t\t\t\t\t\t\t\t\trequest.headers[\"sec-websocket-protocol\"] ?? \"\",\n\t\t\t\t\t\t\t\t\t\",\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t(value) => String.trim(value) === protocol,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn HttpServerResponse.empty({ status: 400 })\n\t\t\t\t\t\tconst session = yield* Effect.result(accept)\n\t\t\t\t\t\tif (session._tag === \"Failure\")\n\t\t\t\t\t\t\treturn yield* rejection(session.failure)\n\t\t\t\t\t\t// Authentication finishes before upgrade; session work is owned by the request scope.\n\t\t\t\t\t\tyield* request.upgrade.pipe(\n\t\t\t\t\t\t\tEffect.flatMap(session.success),\n\t\t\t\t\t\t\tEffect.interruptible,\n\t\t\t\t\t\t\tEffect.scoped,\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn HttpServerResponse.empty()\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.pipe(\n\t\t\t\t\tEffect.andThen(Deferred.succeed(ready, undefined)),\n\t\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t\t),\n\t}\n})\n\nexport const bind = Effect.fnUntraced(function* (\n\tcreateServer: Parameters<typeof NodeHttpServer.make>[0],\n\toptions: Pick<NodeHttpServer.Options, \"host\" | \"port\" | \"path\">,\n) {\n\tconst server = yield* open(createServer, options)\n\treturn {\n\t\taddress: server.address,\n\t\tready: server.ready,\n\t\tserve: (accept: Accept) =>\n\t\t\tserver\n\t\t\t\t.run(\n\t\t\t\t\thandshake.pipe(\n\t\t\t\t\t\tEffect.flatMap(accept),\n\t\t\t\t\t\tEffect.map(\n\t\t\t\t\t\t\t(session) => (socket: Socket.Socket) =>\n\t\t\t\t\t\t\t\tChannel.fromSocket(socket).pipe(Effect.flatMap(session)),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.pipe(\n\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t),\n\t\t\t\t),\n\t} satisfies Serving & { readonly address: typeof server.address }\n})\n"],"mappings":";;;;;;;;AAuBA,MAAM,aAAa,UAClB,MAAM,SAAS,6BACZ,YAAY,KAAK,IACjB,aAAa,KAAK;AAGtB,MAAM,eAAe,UACpB,OAAO,SAAS,4CAA4C,MAAM,KAAK,CAAC,CAAC,KACxE,OAAO,GAAG,mBAAmB,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC,CACpD;AAED,MAAM,gBAAgB,UACrB,OAAO,WACN,qCACA,EACC,QAAQ,MAAM,OACf,GACA,GAAI,MAAM,UAAU,KAAA,IAAY,CAAC,IAAI,CAAC,MAAM,KAAK,CAClD,CAAC,CAAC,KACD,OAAO,GACN,mBAAmB,MAAM;CACxB,QAAQ;CACR,SACC,MAAM,cAAc,KAAA,IACjB,CAAC,IACD,EAAE,oBAAoB,MAAM,UAAU;AAC3C,CAAC,CACF,CACD;AAED,MAAM,YAIF,OAAO,IAAI,aAAa;CAC3B,MAAM,UAAU,OAAO,kBAAkB;CACzC,MAAM,EAAE,WAAW,sBAAsB,kBAAkB,OAAO;CAElE,MAAM,OACL,kBAAkB,aAAa,OAAO,aACnC,OAAO,KAAK,OAAO,mBAAmB,CAAC,IACvC,OAAO,KAAK;CAChB,OAAO;EACN,eAAe,OAAO,IACrB,OAAO,gBAAgB,QAAQ,QAAQ,gBAAgB,GACvD,SAAS,IACV;EACA,aAAa,OAAO,IAAI,OAAO,iBAAiB;GAC/C,KAAK,YAAY;GACjB,gBAAgB,OAAO,gBAAgB,YAAY,cAAc;EAClE,EAAE;CACH;AACD,CAAC;AAED,MAAM,OAAO,OAAO,WAAW,WAC9B,cACA,SACC;CAED,MAAM,YAAY,OAAO,OAAO,eAAe,MAAM,KAAK,GAAG,MAAM,KAAK;CACxE,MAAM,QAAQ,OAAO,SAAS,KAAW;CACzC,MAAM,SAAS,OAAO,eAAe,KAAK,cAAc;EACvD,GAAG;EACH,2BAA2B;EAC3B,WAAW;GACV,mBAAmB;GACnB,YAAY;GACZ,kBAAkB,cACjB,UAAU,IAAA,iBAAY,IAAI,WAAW;EACvC;CACD,CAAC,CAAC,CAAC,KAAK,MAAM,QAAQ,SAAS,CAAC;CAChC,OAAO;EACN,SAAS,OAAO;EAChB,OAAO,SAAS,MAAM,KAAK;EAC3B,MACC,WAMA,OACE,MACA,OAAO,IAAI,aAAa;GACvB,MAAM,UAAU,OAAO,kBAAkB;GACzC,IAAI,QAAQ,QAAA,UACX,OAAO,mBAAmB,MAAM,EAAE,QAAQ,IAAI,CAAC;GAChD,IACC,OAAO,YAAY,QAAQ,QAAQ,cAAc,EAAE,MAClD,eACD,CAAC,MAAM,KACN,OAAO,MACN,QAAQ,QAAQ,6BAA6B,IAC7C,GACD,IACC,UAAU,OAAO,KAAK,KAAK,MAAA,iBAC7B,GAEA,OAAO,mBAAmB,MAAM,EAAE,QAAQ,IAAI,CAAC;GAChD,MAAM,UAAU,OAAO,OAAO,OAAO,MAAM;GAC3C,IAAI,QAAQ,SAAS,WACpB,OAAO,OAAO,UAAU,QAAQ,OAAO;GAExC,OAAO,QAAQ,QAAQ,KACtB,OAAO,QAAQ,QAAQ,OAAO,GAC9B,OAAO,eACP,OAAO,MACR;GACA,OAAO,mBAAmB,MAAM;EACjC,CAAC,CACF,CAAC,CACA,KACA,OAAO,QAAQ,SAAS,QAAQ,OAAO,KAAA,CAAS,CAAC,GACjD,OAAO,QAAQ,OAAO,KAAK,CAC5B;CACH;AACD,CAAC;AAED,MAAa,OAAO,OAAO,WAAW,WACrC,cACA,SACC;CACD,MAAM,SAAS,OAAO,KAAK,cAAc,OAAO;CAChD,OAAO;EACN,SAAS,OAAO;EAChB,OAAO,OAAO;EACd,QAAQ,WACP,OACE,IACA,UAAU,KACT,OAAO,QAAQ,MAAM,GACrB,OAAO,KACL,aAAa,WACbA,WAAmB,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,CAAC,CACzD,CACD,CACD,CAAC,CACA,KACA,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;CACH;AACD,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { r as layer } from "../Graft-
|
|
2
|
-
import { n as run, r as platform, t as load } from "../childRuntime-
|
|
3
|
-
import { n as Bootstrap, t as make } from "../workerChannel-
|
|
1
|
+
import { r as layer } from "../Graft-B71CPA2Y.js";
|
|
2
|
+
import { n as run, r as platform, t as load } from "../childRuntime-Bm3iSg_N.js";
|
|
3
|
+
import { n as Bootstrap, t as make } from "../workerChannel-C8hhBJzA.js";
|
|
4
4
|
import { Effect, Layer, Schema } from "effect";
|
|
5
5
|
import { NodeRuntime } from "@effect/platform-node";
|
|
6
6
|
import { parentPort, workerData } from "node:worker_threads";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as EndOfStream } from "./Framing-
|
|
2
|
-
import { t as make$1 } from "./FailureGroup-
|
|
3
|
-
import {
|
|
1
|
+
import { t as EndOfStream } from "./Framing-G9eSaeLb.js";
|
|
2
|
+
import { t as make$1 } from "./FailureGroup-BgT73AaR.js";
|
|
3
|
+
import { u as TransportError } from "./Errors-DYhsGZcZ.js";
|
|
4
4
|
import { Array, Cause, Context, Data, Deferred, Effect, Fiber, HashMap, Option, Queue, Record, Result, Schema, Stream, TxQueue, TxRef } from "effect";
|
|
5
5
|
import { RpcClient, RpcClientError, RpcSerialization, RpcServer } from "effect/rpc";
|
|
6
6
|
// packages/remote/src/internal/Limits.ts
|
|
@@ -64,7 +64,7 @@ const mailbox = (priority) => Queue.dropping(2).pipe(Effect.map((queue) => ({
|
|
|
64
64
|
const deliver = Effect.fnUntraced(function* (requestState, message) {
|
|
65
65
|
if (!(yield* Queue.offer(requestState.queue, message))) return yield* error("RPC request mailbox overflow");
|
|
66
66
|
});
|
|
67
|
-
const initialize =
|
|
67
|
+
const initialize = Effect.fnUntraced(function* (bytes, options) {
|
|
68
68
|
return {
|
|
69
69
|
bytes,
|
|
70
70
|
options,
|
|
@@ -204,7 +204,7 @@ const serverProtocol = (state, endpoint) => {
|
|
|
204
204
|
})).pipe(Effect.catchTag("TransportError", () => Effect.void))
|
|
205
205
|
});
|
|
206
206
|
};
|
|
207
|
-
const next =
|
|
207
|
+
const next = Effect.fnUntraced(function* (state) {
|
|
208
208
|
yield* state.workers.check;
|
|
209
209
|
for (const p of [
|
|
210
210
|
"control",
|
|
@@ -227,7 +227,7 @@ const next = (state) => Effect.tx(Effect.gen(function* () {
|
|
|
227
227
|
}
|
|
228
228
|
if ((yield* TxQueue.isDone(state.queues.control)) && (yield* TxQueue.isDone(state.queues.data)) && (yield* TxQueue.isDone(state.queues.log))) return yield* Cause.done();
|
|
229
229
|
return yield* Effect.txRetry;
|
|
230
|
-
})
|
|
230
|
+
}, Effect.tx);
|
|
231
231
|
const writer = (state) => Stream.fromEffectRepeat(next(state)).pipe(Stream.filterMap(Result.fromOption(() => void 0)), Stream.mapEffect((frame) => Schema.encodeEffect(Schema.fromJsonString(Frame))(frame).pipe(Effect.mapError((cause) => TransportError.make({ cause: Cause.fail(cause) })))), Stream.map((json) => new TextEncoder().encode(json + "\n")), Stream.run(state.bytes.output));
|
|
232
232
|
const read = Effect.fnUntraced(function* (state, raw) {
|
|
233
233
|
const current = yield* Schema.decodeUnknownEffect(Frame)(raw).pipe(Effect.mapError((cause) => TransportError.make({ cause: Cause.fail(cause) })));
|
|
@@ -268,10 +268,10 @@ const reader = (state) => state.bytes.input.pipe(Stream.decodeText(), Stream.spl
|
|
|
268
268
|
/** One RPC client/server per declared endpoint; servers may start after the port. */
|
|
269
269
|
const make = Effect.fnUntraced(function* (bytes, options) {
|
|
270
270
|
const state = yield* initialize(bytes, options);
|
|
271
|
-
yield* state.workers.await.pipe(Effect.catchCause(
|
|
271
|
+
yield* state.workers.await.pipe(Effect.catchCause(Effect.fnUntraced(function* () {
|
|
272
272
|
for (const server of HashMap.values(state.servers)) yield* Queue.offer(server.disconnects, 0);
|
|
273
273
|
yield* Effect.tx(TxRef.set(state.incoming, HashMap.empty()).pipe(Effect.andThen(TxRef.set(state.outgoing, HashMap.empty()))));
|
|
274
|
-
}))
|
|
274
|
+
}, Effect.uninterruptible)), Effect.forkScoped);
|
|
275
275
|
const writing = yield* state.workers.run(writer(state));
|
|
276
276
|
yield* state.workers.run(reader(state));
|
|
277
277
|
return {
|
|
@@ -7,7 +7,7 @@ var ReleaseInterrupted = class extends Schema.TaggedError()("ReleaseInterrupted"
|
|
|
7
7
|
}
|
|
8
8
|
};
|
|
9
9
|
/** Keep a known release failure distinguishable from cancellation through enclosing scopes. */
|
|
10
|
-
const close = (scope, exit) => Effect.uninterruptible(Scope.close(scope, exit).pipe(Effect.catchCauseIf(Cause.hasInterruptsOnly,
|
|
10
|
+
const close = (scope, exit) => Effect.uninterruptible(Scope.close(scope, exit).pipe(Effect.catchCauseIf(Cause.hasInterruptsOnly, Effect.fnUntraced(function* (cause) {
|
|
11
11
|
const pending = yield* Effect.exit(Effect.interruptible(Effect.void));
|
|
12
12
|
const [cancelled, interrupted] = Array.partition(cause.reasons, (reason) => Exit.isFailure(pending) && Array.some(pending.cause.reasons, (external) => reason._tag === "Interrupt" && external._tag === "Interrupt" && reason.fiberId === external.fiberId) ? Result.succeed(reason) : Result.fail(reason));
|
|
13
13
|
if (interrupted.length === 0) return yield* Effect.failCause(cause);
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import { Graft, Plugin } from "@graftland/graft";
|
|
1
2
|
import { Schema } from "effect";
|
|
2
3
|
export declare const Config: Schema.Struct<{
|
|
3
4
|
readonly tokens: Schema.String;
|
|
4
5
|
}>;
|
|
5
|
-
declare const _default:
|
|
6
|
+
declare const _default: Plugin.Definition<{
|
|
7
|
+
readonly tokens: string;
|
|
8
|
+
}, {
|
|
9
|
+
readonly tokens: string;
|
|
10
|
+
}, import("effect/encoding/EncodingError").EncodingError | import("effect/PlatformError").PlatformError | Schema.SchemaError | Graft.ServiceConflict>;
|
|
6
11
|
export { _default as default };
|
|
7
12
|
//# sourceMappingURL=bearer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bearer.d.ts","names":[],"sources":["../../../src/runner/auth/bearer.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bearer.d.ts","names":[],"sources":["../../../src/runner/auth/bearer.ts"],"mappings":";;qBAmBa,QAAM,OAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as provide, l as make } from "../../Graft-
|
|
1
|
+
import { a as provide, l as make } from "../../Graft-B71CPA2Y.js";
|
|
2
2
|
import { t as Authenticator } from "../../Auth-BElTC9_X.js";
|
|
3
3
|
import { t as ConfigDirectory } from "../../ConfigDirectory-BCC6q2R4.js";
|
|
4
|
-
import { r as read, t as invalid } from "../../token-
|
|
4
|
+
import { r as read, t as invalid } from "../../token-CYBNNlhS.js";
|
|
5
5
|
import { Array, Effect, FileSystem, Option, Path, Record, Redacted, Schema } from "effect";
|
|
6
6
|
import { Digest } from "effect/crypto";
|
|
7
7
|
import { Hex } from "effect/encoding";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Graft, Plugin } from "@graftland/graft";
|
|
2
|
+
import { Duration, Schema } from "effect";
|
|
2
3
|
export declare const ClockTolerance: Schema.DurationFromString;
|
|
3
4
|
export declare const Config: Schema.Struct<{
|
|
4
5
|
readonly issuer: Schema.NonEmptyString;
|
|
@@ -14,6 +15,32 @@ export declare const Config: Schema.Struct<{
|
|
|
14
15
|
readonly jwksUrl: Schema.optionalKey<Schema.Never>;
|
|
15
16
|
}>]>;
|
|
16
17
|
}>;
|
|
17
|
-
declare const _default:
|
|
18
|
+
declare const _default: Plugin.Definition<{
|
|
19
|
+
readonly issuer: string;
|
|
20
|
+
readonly audience: readonly [string, ...string[]];
|
|
21
|
+
readonly algorithms: readonly ["ES256" | "ES384" | "ES512" | "EdDSA" | "PS256" | "PS384" | "PS512" | "RS256" | "RS384" | "RS512", ...("ES256" | "ES384" | "ES512" | "EdDSA" | "PS256" | "PS384" | "PS512" | "RS256" | "RS384" | "RS512")[]];
|
|
22
|
+
readonly identityClaim: string;
|
|
23
|
+
readonly clockTolerance: Duration.Duration;
|
|
24
|
+
readonly keys: {
|
|
25
|
+
readonly jwksUrl: string;
|
|
26
|
+
readonly publicKey?: never;
|
|
27
|
+
} | {
|
|
28
|
+
readonly publicKey: string;
|
|
29
|
+
readonly jwksUrl?: never;
|
|
30
|
+
};
|
|
31
|
+
}, {
|
|
32
|
+
readonly issuer: string;
|
|
33
|
+
readonly audience: readonly [string, ...string[]];
|
|
34
|
+
readonly algorithms: readonly ["ES256" | "ES384" | "ES512" | "EdDSA" | "PS256" | "PS384" | "PS512" | "RS256" | "RS384" | "RS512", ...("ES256" | "ES384" | "ES512" | "EdDSA" | "PS256" | "PS384" | "PS512" | "RS256" | "RS384" | "RS512")[]];
|
|
35
|
+
readonly identityClaim?: string;
|
|
36
|
+
readonly clockTolerance?: string;
|
|
37
|
+
readonly keys: {
|
|
38
|
+
readonly jwksUrl: string;
|
|
39
|
+
readonly publicKey?: never;
|
|
40
|
+
} | {
|
|
41
|
+
readonly publicKey: string;
|
|
42
|
+
readonly jwksUrl?: never;
|
|
43
|
+
};
|
|
44
|
+
}, import("effect/jose/JoseError").JoseError | import("effect/PlatformError").PlatformError | Schema.SchemaError | Graft.ServiceConflict>;
|
|
18
45
|
export { _default as default };
|
|
19
46
|
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.d.ts","names":[],"sources":["../../../src/runner/auth/jwt.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","names":[],"sources":["../../../src/runner/auth/jwt.ts"],"mappings":";;qBAmBa,gBAAc,OAAA;qBAOd,QAAM,OAAA"}
|
package/dist/runner/auth/jwt.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { a as provide, l as make } from "../../Graft-
|
|
1
|
+
import { a as provide, l as make } from "../../Graft-B71CPA2Y.js";
|
|
2
2
|
import { t as Authenticator } from "../../Auth-BElTC9_X.js";
|
|
3
3
|
import { t as ConfigDirectory } from "../../ConfigDirectory-BCC6q2R4.js";
|
|
4
|
-
import { t as AuthenticationFailed } from "../../Errors-
|
|
5
|
-
import { r as read } from "../../token-
|
|
4
|
+
import { n as AuthenticatorUnavailable, t as AuthenticationFailed } from "../../Errors-DYhsGZcZ.js";
|
|
5
|
+
import { r as read } from "../../token-CYBNNlhS.js";
|
|
6
6
|
import { Cause, Duration, Effect, FileSystem, Layer, Option, Path, Schema } from "effect";
|
|
7
7
|
import { Signature } from "effect/crypto";
|
|
8
8
|
import { HttpClient } from "effect/http";
|
|
@@ -54,7 +54,7 @@ var jwt_default = make({
|
|
|
54
54
|
algorithms: config.algorithms,
|
|
55
55
|
clockTolerance: config.clockTolerance,
|
|
56
56
|
requiredClaims: ["exp"]
|
|
57
|
-
}).pipe(Effect.flatMap((verified) => Schema.decodeUnknownEffect(Schema.NonEmptyString)(verified.claims[config.identityClaim])), Effect.mapError((error) => AuthenticationFailed.make({
|
|
57
|
+
}).pipe(Effect.flatMap((verified) => Schema.decodeUnknownEffect(Schema.NonEmptyString)(verified.claims[config.identityClaim])), Effect.mapError((error) => error._tag === "JoseError" && error.reason._tag === "KeySetUnavailable" ? AuthenticatorUnavailable.make({ cause: Cause.fail(error) }) : AuthenticationFailed.make({
|
|
58
58
|
reason: "invalid",
|
|
59
59
|
challenge: "Bearer error=\"invalid_token\"",
|
|
60
60
|
cause: Cause.fail(error)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.js","names":["Token.read"],"sources":["../../../src/runner/auth/jwt.ts"],"sourcesContent":["import { Option } from \"effect\"\nimport { Graft, Plugin } from \"@graftland/graft\"\nimport {\n\tCause,\n\tDuration,\n\tEffect,\n\tFileSystem,\n\tLayer,\n\tPath,\n\tSchema,\n} from \"effect\"\nimport { Jwk, Jwks, Jwt } from \"effect/jose\"\nimport { Signature } from \"effect/crypto\"\nimport { HttpClient } from \"effect/http\"\nimport { Authenticator } from \"../../Auth\"\nimport { ConfigDirectory } from \"@graftland/loader\"\nimport { AuthenticationFailed } from \"../../Errors\"\nimport * as Token from \"../../internal/auth/token\"\n\nexport const ClockTolerance = Schema.DurationFromString.check(\n\tSchema.makeFilter(\n\t\t(duration) =>\n\t\t\tDuration.isFinite(duration) && Duration.toMillis(duration) >= 0,\n\t\t{ expected: \"a finite, non-negative duration\" },\n\t),\n)\nexport const Config = Schema.Struct({\n\tissuer: Schema.NonEmptyString,\n\taudience: Schema.NonEmptyArray(Schema.NonEmptyString),\n\talgorithms: Schema.NonEmptyArray(Jwk.AsymmetricAlgorithm),\n\tidentityClaim: Schema.NonEmptyString.pipe(\n\t\tSchema.withDecodingDefaultKey(Effect.succeed(\"sub\")),\n\t),\n\tclockTolerance: ClockTolerance.pipe(\n\t\tSchema.withDecodingDefaultKey(Effect.succeed(\"5 seconds\")),\n\t),\n\tkeys: Schema.Union([\n\t\tSchema.Struct({\n\t\t\tjwksUrl: Schema.String,\n\t\t\tpublicKey: Schema.optionalKey(Schema.Never),\n\t\t}),\n\t\tSchema.Struct({\n\t\t\tpublicKey: Schema.String,\n\t\t\tjwksUrl: Schema.optionalKey(Schema.Never),\n\t\t}),\n\t]),\n})\nconst keys = Effect.fnUntraced(function* (config: typeof Config.Type) {\n\tif (config.keys.jwksUrl !== undefined)\n\t\treturn Jwks.layerRemote({ url: config.keys.jwksUrl })\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst directory = yield* ConfigDirectory.pipe(\n\t\tEffect.map(Option.getOrElse(() => \".\")),\n\t)\n\tconst pem = yield* fs.readFileString(\n\t\tpath.resolve(directory, config.keys.publicKey),\n\t)\n\t// A single PEM must support the allowed algorithms; use JWKS for multiple key types.\n\tconst keys = yield* Effect.forEach(config.algorithms, (algorithm) =>\n\t\tJwk.importSpki(pem, algorithm).pipe(Effect.flatMap(Jwk.exportPublic)),\n\t)\n\treturn Jwks.layerLocal({ keys })\n})\nexport default Plugin.make({\n\tname: \"remote-jwt-authenticator\",\n\tconfig: Config,\n\tinject: [\n\t\tFileSystem.FileSystem,\n\t\tPath.Path,\n\t\tSignature.Signature,\n\t\tHttpClient.HttpClient,\n\t],\n\tapply: Effect.fnUntraced(function* (config) {\n\t\tconst keySet = yield* keys(config)\n\t\tconst services = yield* Layer.build(keySet)\n\t\tconst signature = yield* Signature.Signature\n\t\tyield* Graft.provide(Authenticator, {\n\t\t\t_tag: \"Header\",\n\t\t\tissuer: config.issuer,\n\t\t\tauthenticate: (authorization) =>\n\t\t\t\tToken.read(authorization).pipe(\n\t\t\t\t\tEffect.flatMap((token) =>\n\t\t\t\t\t\tJwt.verifyWithKeySet(\n\t\t\t\t\t\t\tSchema.Record(Schema.String, Schema.Unknown),\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tissuer: config.issuer,\n\t\t\t\t\t\t\t\taudience: config.audience,\n\t\t\t\t\t\t\t\talgorithms: config.algorithms,\n\t\t\t\t\t\t\t\tclockTolerance: config.clockTolerance,\n\t\t\t\t\t\t\t\trequiredClaims: [\"exp\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tEffect.flatMap((verified) =>\n\t\t\t\t\t\t\t\tSchema.decodeUnknownEffect(Schema.NonEmptyString)(\n\t\t\t\t\t\t\t\t\tverified.claims[config.identityClaim],\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\t\
|
|
1
|
+
{"version":3,"file":"jwt.js","names":["Token.read"],"sources":["../../../src/runner/auth/jwt.ts"],"sourcesContent":["import { Option } from \"effect\"\nimport { Graft, Plugin } from \"@graftland/graft\"\nimport {\n\tCause,\n\tDuration,\n\tEffect,\n\tFileSystem,\n\tLayer,\n\tPath,\n\tSchema,\n} from \"effect\"\nimport { Jwk, Jwks, Jwt } from \"effect/jose\"\nimport { Signature } from \"effect/crypto\"\nimport { HttpClient } from \"effect/http\"\nimport { Authenticator } from \"../../Auth\"\nimport { ConfigDirectory } from \"@graftland/loader\"\nimport { AuthenticationFailed, AuthenticatorUnavailable } from \"../../Errors\"\nimport * as Token from \"../../internal/auth/token\"\n\nexport const ClockTolerance = Schema.DurationFromString.check(\n\tSchema.makeFilter(\n\t\t(duration) =>\n\t\t\tDuration.isFinite(duration) && Duration.toMillis(duration) >= 0,\n\t\t{ expected: \"a finite, non-negative duration\" },\n\t),\n)\nexport const Config = Schema.Struct({\n\tissuer: Schema.NonEmptyString,\n\taudience: Schema.NonEmptyArray(Schema.NonEmptyString),\n\talgorithms: Schema.NonEmptyArray(Jwk.AsymmetricAlgorithm),\n\tidentityClaim: Schema.NonEmptyString.pipe(\n\t\tSchema.withDecodingDefaultKey(Effect.succeed(\"sub\")),\n\t),\n\tclockTolerance: ClockTolerance.pipe(\n\t\tSchema.withDecodingDefaultKey(Effect.succeed(\"5 seconds\")),\n\t),\n\tkeys: Schema.Union([\n\t\tSchema.Struct({\n\t\t\tjwksUrl: Schema.String,\n\t\t\tpublicKey: Schema.optionalKey(Schema.Never),\n\t\t}),\n\t\tSchema.Struct({\n\t\t\tpublicKey: Schema.String,\n\t\t\tjwksUrl: Schema.optionalKey(Schema.Never),\n\t\t}),\n\t]),\n})\nconst keys = Effect.fnUntraced(function* (config: typeof Config.Type) {\n\tif (config.keys.jwksUrl !== undefined)\n\t\treturn Jwks.layerRemote({ url: config.keys.jwksUrl })\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst directory = yield* ConfigDirectory.pipe(\n\t\tEffect.map(Option.getOrElse(() => \".\")),\n\t)\n\tconst pem = yield* fs.readFileString(\n\t\tpath.resolve(directory, config.keys.publicKey),\n\t)\n\t// A single PEM must support the allowed algorithms; use JWKS for multiple key types.\n\tconst keys = yield* Effect.forEach(config.algorithms, (algorithm) =>\n\t\tJwk.importSpki(pem, algorithm).pipe(Effect.flatMap(Jwk.exportPublic)),\n\t)\n\treturn Jwks.layerLocal({ keys })\n})\nexport default Plugin.make({\n\tname: \"remote-jwt-authenticator\",\n\tconfig: Config,\n\tinject: [\n\t\tFileSystem.FileSystem,\n\t\tPath.Path,\n\t\tSignature.Signature,\n\t\tHttpClient.HttpClient,\n\t],\n\tapply: Effect.fnUntraced(function* (config) {\n\t\tconst keySet = yield* keys(config)\n\t\tconst services = yield* Layer.build(keySet)\n\t\tconst signature = yield* Signature.Signature\n\t\tyield* Graft.provide(Authenticator, {\n\t\t\t_tag: \"Header\",\n\t\t\tissuer: config.issuer,\n\t\t\tauthenticate: (authorization) =>\n\t\t\t\tToken.read(authorization).pipe(\n\t\t\t\t\tEffect.flatMap((token) =>\n\t\t\t\t\t\tJwt.verifyWithKeySet(\n\t\t\t\t\t\t\tSchema.Record(Schema.String, Schema.Unknown),\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tissuer: config.issuer,\n\t\t\t\t\t\t\t\taudience: config.audience,\n\t\t\t\t\t\t\t\talgorithms: config.algorithms,\n\t\t\t\t\t\t\t\tclockTolerance: config.clockTolerance,\n\t\t\t\t\t\t\t\trequiredClaims: [\"exp\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tEffect.flatMap((verified) =>\n\t\t\t\t\t\t\t\tSchema.decodeUnknownEffect(Schema.NonEmptyString)(\n\t\t\t\t\t\t\t\t\tverified.claims[config.identityClaim],\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// An unreachable key set says nothing about the token; the client must not discard it.\n\t\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\t\terror._tag === \"JoseError\" &&\n\t\t\t\t\t\t\t\terror.reason._tag === \"KeySetUnavailable\"\n\t\t\t\t\t\t\t\t\t? AuthenticatorUnavailable.make({ cause: Cause.fail(error) })\n\t\t\t\t\t\t\t\t\t: AuthenticationFailed.make({\n\t\t\t\t\t\t\t\t\t\t\treason: \"invalid\",\n\t\t\t\t\t\t\t\t\t\t\tchallenge: 'Bearer error=\"invalid_token\"',\n\t\t\t\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tEffect.provideService(Signature.Signature, signature),\n\t\t\t\t\t\t\tEffect.provideContext(services),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t})\n\t}),\n})\n"],"mappings":";;;;;;;;;;AAmBA,MAAa,iBAAiB,OAAO,mBAAmB,MACvD,OAAO,YACL,aACA,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,QAAQ,KAAK,GAC/D,EAAE,UAAU,kCAAkC,CAC/C,CACD;AACA,MAAa,SAAS,OAAO,OAAO;CACnC,QAAQ,OAAO;CACf,UAAU,OAAO,cAAc,OAAO,cAAc;CACpD,YAAY,OAAO,cAAc,IAAI,mBAAmB;CACxD,eAAe,OAAO,eAAe,KACpC,OAAO,uBAAuB,OAAO,QAAQ,KAAK,CAAC,CACpD;CACA,gBAAgB,eAAe,KAC9B,OAAO,uBAAuB,OAAO,QAAQ,WAAW,CAAC,CAC1D;CACA,MAAM,OAAO,MAAM,CAClB,OAAO,OAAO;EACb,SAAS,OAAO;EAChB,WAAW,OAAO,YAAY,OAAO,KAAK;CAC3C,CAAC,GACD,OAAO,OAAO;EACb,WAAW,OAAO;EAClB,SAAS,OAAO,YAAY,OAAO,KAAK;CACzC,CAAC,CACF,CAAC;AACF,CAAC;AACD,MAAM,OAAO,OAAO,WAAW,WAAW,QAA4B;CACrE,IAAI,OAAO,KAAK,YAAY,KAAA,GAC3B,OAAO,KAAK,YAAY,EAAE,KAAK,OAAO,KAAK,QAAQ,CAAC;CACrD,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,YAAY,OAAO,gBAAgB,KACxC,OAAO,IAAI,OAAO,gBAAgB,GAAG,CAAC,CACvC;CACA,MAAM,MAAM,OAAO,GAAG,eACrB,KAAK,QAAQ,WAAW,OAAO,KAAK,SAAS,CAC9C;CAEA,MAAM,OAAO,OAAO,OAAO,QAAQ,OAAO,aAAa,cACtD,IAAI,WAAW,KAAK,SAAS,CAAC,CAAC,KAAK,OAAO,QAAQ,IAAI,YAAY,CAAC,CACrE;CACA,OAAO,KAAK,WAAW,EAAE,KAAK,CAAC;AAChC,CAAC;AACD,IAAA,cAAe,OAAO,KAAK;CAC1B,MAAM;CACN,QAAQ;CACR,QAAQ;EACP,WAAW;EACX,KAAK;EACL,UAAU;EACV,WAAW;CACZ;CACA,OAAO,OAAO,WAAW,WAAW,QAAQ;EAC3C,MAAM,SAAS,OAAO,KAAK,MAAM;EACjC,MAAM,WAAW,OAAO,MAAM,MAAM,MAAM;EAC1C,MAAM,YAAY,OAAO,UAAU;EACnC,OAAO,MAAM,QAAQ,eAAe;GACnC,MAAM;GACN,QAAQ,OAAO;GACf,eAAe,kBACdA,KAAW,aAAa,CAAC,CAAC,KACzB,OAAO,SAAS,UACf,IAAI,iBACH,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,GAC3C,OACA;IACC,QAAQ,OAAO;IACf,UAAU,OAAO;IACjB,YAAY,OAAO;IACnB,gBAAgB,OAAO;IACvB,gBAAgB,CAAC,KAAK;GACvB,CACD,CAAC,CAAC,KACD,OAAO,SAAS,aACf,OAAO,oBAAoB,OAAO,cAAc,CAAC,CAChD,SAAS,OAAO,OAAO,cACxB,CACD,GAEA,OAAO,UAAU,UAChB,MAAM,SAAS,eACf,MAAM,OAAO,SAAS,sBACnB,yBAAyB,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,IAC1D,qBAAqB,KAAK;IAC1B,QAAQ;IACR,WAAW;IACX,OAAO,MAAM,KAAK,KAAK;GACxB,CAAC,CACJ,GACA,OAAO,eAAe,UAAU,WAAW,SAAS,GACpD,OAAO,eAAe,QAAQ,CAC/B,CACD,CACD;EACF,CAAC;CACF,CAAC;AACF,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AuthenticatorApi } from "../../Auth.js";
|
|
2
|
+
import { Graft, Plugin } from "@graftland/graft";
|
|
2
3
|
import { Schema } from "effect";
|
|
3
4
|
export declare const Config: Schema.Struct<{
|
|
4
5
|
readonly ca: Schema.String;
|
|
@@ -6,6 +7,10 @@ export declare const Config: Schema.Struct<{
|
|
|
6
7
|
export declare const make: (ca: string) => Extract<AuthenticatorApi, {
|
|
7
8
|
readonly _tag: "Mtls";
|
|
8
9
|
}>;
|
|
9
|
-
declare const _default:
|
|
10
|
+
declare const _default: Plugin.Definition<{
|
|
11
|
+
readonly ca: string;
|
|
12
|
+
}, {
|
|
13
|
+
readonly ca: string;
|
|
14
|
+
}, import("effect/PlatformError").PlatformError | Schema.SchemaError | Graft.ServiceConflict>;
|
|
10
15
|
export { _default as default };
|
|
11
16
|
//# sourceMappingURL=mtls.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mtls.d.ts","names":[],"sources":["../../../src/runner/auth/mtls.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"mtls.d.ts","names":[],"sources":["../../../src/runner/auth/mtls.ts"],"mappings":";;;qBAMa,QAAM,OAAA;;;qBASN,OAAI,eAEd,QAAQ;WAA6B"}
|
package/dist/runner/auth/mtls.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as provide, l as make$1 } from "../../Graft-
|
|
1
|
+
import { a as provide, l as make$1 } from "../../Graft-B71CPA2Y.js";
|
|
2
2
|
import { t as Authenticator } from "../../Auth-BElTC9_X.js";
|
|
3
3
|
import { t as ConfigDirectory } from "../../ConfigDirectory-BCC6q2R4.js";
|
|
4
|
-
import { t as AuthenticationFailed } from "../../Errors-
|
|
4
|
+
import { t as AuthenticationFailed } from "../../Errors-DYhsGZcZ.js";
|
|
5
5
|
import { Array, Cause, Effect, FileSystem, Option, Path, Schema, String } from "effect";
|
|
6
6
|
// packages/remote/src/internal/auth/mtls.ts
|
|
7
7
|
const uriValue = (field) => {
|
|
@@ -12,7 +12,7 @@ const uriValue = (field) => {
|
|
|
12
12
|
}))) : Effect.succeed(value);
|
|
13
13
|
};
|
|
14
14
|
/** Read exactly one graft URI from Node's plain or JSON-quoted SAN representation. */
|
|
15
|
-
const identityFromSubjectAltName =
|
|
15
|
+
const identityFromSubjectAltName = Effect.fnUntraced(function* (san) {
|
|
16
16
|
const values = yield* Effect.forEach(Array.filter(String.split(san ?? "", ", "), String.startsWith("URI:")), uriValue);
|
|
17
17
|
const uris = Array.filter(values, String.startsWith("graft://"));
|
|
18
18
|
const [uri] = uris;
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { Graft, Plugin } from "@graftland/graft";
|
|
2
|
+
import { Schema } from "effect";
|
|
3
|
+
declare const _default: Plugin.Definition<{
|
|
4
|
+
readonly identity: string;
|
|
5
|
+
}, {
|
|
6
|
+
readonly identity?: string;
|
|
7
|
+
}, Schema.SchemaError | Graft.ServiceConflict>;
|
|
2
8
|
export { _default as default };
|
|
3
9
|
//# sourceMappingURL=none.d.ts.map
|
package/dist/runner/auth/none.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as provide, l as make } from "../../Graft-
|
|
1
|
+
import { a as provide, l as make } from "../../Graft-B71CPA2Y.js";
|
|
2
2
|
import { t as Authenticator } from "../../Auth-BElTC9_X.js";
|
|
3
3
|
import { Effect, Schema } from "effect";
|
|
4
4
|
// packages/remote/src/runner/auth/none.ts
|