@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.
Files changed (184) hide show
  1. package/dist/Auth.d.ts +2 -2
  2. package/dist/Auth.d.ts.map +1 -1
  3. package/dist/Auth.js.map +1 -1
  4. package/dist/{Bootstrap-Dr6sX7el.js → Bootstrap-H9gDsgsC.js} +2 -2
  5. package/dist/{Contract-DL2mHvaT.js → Contract-DsJtisvL.js} +2 -2
  6. package/dist/Contract.js +1 -1
  7. package/dist/{Errors-BMKmu5Y7.js → Errors-DYhsGZcZ.js} +3 -1
  8. package/dist/Errors.d.ts +7 -0
  9. package/dist/Errors.d.ts.map +1 -1
  10. package/dist/Errors.js +3 -1
  11. package/dist/Errors.js.map +1 -1
  12. package/dist/{FailureGroup-BcH0XOBi.js → FailureGroup-BgT73AaR.js} +14 -4
  13. package/dist/{Framing-zaYdOJnT.js → Framing-G9eSaeLb.js} +1 -1
  14. package/dist/{Graft-CVyueNOf.js → Graft-B71CPA2Y.js} +20 -16
  15. package/dist/{Packages-JNL34JpS.js → Packages-AgoCGotL.js} +23 -26
  16. package/dist/{Peer-BT7eAGmh.js → Peer-DXeVrGBh.js} +5 -5
  17. package/dist/{ProcessObservation-DEGrEMfP.js → ProcessObservation-gLgGirYv.js} +1 -1
  18. package/dist/{ServeLifecycle-CJM0gG5B.js → ServeLifecycle-Bd1FPJ6e.js} +1 -1
  19. package/dist/Transport.d.ts +2 -2
  20. package/dist/Transport.d.ts.map +1 -1
  21. package/dist/Transport.js.map +1 -1
  22. package/dist/bin.js +48 -47
  23. package/dist/bin.js.map +1 -1
  24. package/dist/{childRuntime-An0HsIzl.js → childRuntime-Bm3iSg_N.js} +29 -26
  25. package/dist/{connectionEnded-DCpFCjMX.js → connectionEnded-BwcxQ7W8.js} +4 -4
  26. package/dist/{entry-B89sepMU.js → entry-psOpX3Bj.js} +72 -35
  27. package/dist/host/auth/bearer.d.ts +9 -1
  28. package/dist/host/auth/bearer.d.ts.map +1 -1
  29. package/dist/host/auth/bearer.js +1 -1
  30. package/dist/host/auth/jwt.d.ts +9 -1
  31. package/dist/host/auth/jwt.d.ts.map +1 -1
  32. package/dist/host/auth/jwt.js +1 -1
  33. package/dist/host/auth/mtls.d.ts +8 -1
  34. package/dist/host/auth/mtls.d.ts.map +1 -1
  35. package/dist/host/auth/mtls.js +2 -2
  36. package/dist/host/auth/none.d.ts +3 -1
  37. package/dist/host/auth/none.js +1 -1
  38. package/dist/host/command.d.ts +14 -1
  39. package/dist/host/command.d.ts.map +1 -1
  40. package/dist/host/command.js +4 -4
  41. package/dist/host/local.d.ts +2 -1
  42. package/dist/host/local.d.ts.map +1 -1
  43. package/dist/host/local.js +3 -3
  44. package/dist/host/unix.d.ts +6 -1
  45. package/dist/host/unix.d.ts.map +1 -1
  46. package/dist/host/unix.js +3 -3
  47. package/dist/host/websocket.d.ts +10 -1
  48. package/dist/host/websocket.d.ts.map +1 -1
  49. package/dist/host/websocket.js +3 -3
  50. package/dist/host/worker.d.ts +3 -1
  51. package/dist/host/worker.d.ts.map +1 -1
  52. package/dist/host/worker.js +4 -5
  53. package/dist/{importer-Bk6U_sn4.js → importer-Cvf88eAY.js} +5 -8
  54. package/dist/index.js +9 -9
  55. package/dist/index.js.map +1 -1
  56. package/dist/internal/Certificates.js +4 -4
  57. package/dist/internal/Certificates.js.map +1 -1
  58. package/dist/internal/FailureGroup.js +3 -2
  59. package/dist/internal/FailureGroup.js.map +1 -1
  60. package/dist/internal/assembly.d.ts +2 -1
  61. package/dist/internal/assembly.js +9 -2
  62. package/dist/internal/assembly.js.map +1 -1
  63. package/dist/internal/auth/mtls.js +1 -1
  64. package/dist/internal/auth/mtls.js.map +1 -1
  65. package/dist/internal/auth/tokenCredentials.d.ts +2 -1
  66. package/dist/internal/auth/tokenCredentials.d.ts.map +1 -1
  67. package/dist/internal/child.js +20 -17
  68. package/dist/internal/child.js.map +1 -1
  69. package/dist/internal/childRuntime.js +4 -4
  70. package/dist/internal/childRuntime.js.map +1 -1
  71. package/dist/internal/credentials.d.ts +1 -1
  72. package/dist/internal/directTransport.d.ts +1 -1
  73. package/dist/internal/entry.d.ts +415 -3
  74. package/dist/internal/entry.d.ts.map +1 -1
  75. package/dist/internal/entry.js +1 -1
  76. package/dist/internal/entry.js.map +1 -1
  77. package/dist/internal/execution.js +40 -5
  78. package/dist/internal/execution.js.map +1 -1
  79. package/dist/internal/host/runner.js +7 -6
  80. package/dist/internal/host/runner.js.map +1 -1
  81. package/dist/internal/host.js +5 -5
  82. package/dist/internal/host.js.map +1 -1
  83. package/dist/internal/port.js +5 -5
  84. package/dist/internal/port.js.map +1 -1
  85. package/dist/internal/release.js +1 -1
  86. package/dist/internal/release.js.map +1 -1
  87. package/dist/internal/runner/Connection.d.ts +1 -1
  88. package/dist/internal/runner/Connection.js +4 -4
  89. package/dist/internal/runner/Connection.js.map +1 -1
  90. package/dist/internal/runner/Execution.js +3 -3
  91. package/dist/internal/runner/Execution.js.map +1 -1
  92. package/dist/internal/runner/Framing.js +1 -1
  93. package/dist/internal/runner/Framing.js.map +1 -1
  94. package/dist/internal/runner/Local.js +1 -1
  95. package/dist/internal/runner/Local.js.map +1 -1
  96. package/dist/internal/runner/Lock.js +1 -1
  97. package/dist/internal/runner/Lock.js.map +1 -1
  98. package/dist/internal/runner/Packages.d.ts +1 -1
  99. package/dist/internal/runner/Packages.js +22 -25
  100. package/dist/internal/runner/Packages.js.map +1 -1
  101. package/dist/internal/runner/Processes.js +7 -9
  102. package/dist/internal/runner/Processes.js.map +1 -1
  103. package/dist/internal/runner/Store.js +3 -3
  104. package/dist/internal/runner/Store.js.map +1 -1
  105. package/dist/internal/runner/Supervisor.js +46 -47
  106. package/dist/internal/runner/Supervisor.js.map +1 -1
  107. package/dist/internal/runner/accept.js +3 -3
  108. package/dist/internal/runner/accept.js.map +1 -1
  109. package/dist/internal/runner/model.js +1 -1
  110. package/dist/internal/runner/model.js.map +1 -1
  111. package/dist/internal/serve.js +1 -1
  112. package/dist/internal/serve.js.map +1 -1
  113. package/dist/internal/supervisorPlugin.js +1 -1
  114. package/dist/internal/watchdogMain.js +5 -5
  115. package/dist/internal/watchdogMain.js.map +1 -1
  116. package/dist/internal/websocketServer.js +3 -1
  117. package/dist/internal/websocketServer.js.map +1 -1
  118. package/dist/internal/workerMain.js +3 -3
  119. package/dist/{port-DSVUY8Bq.js → port--3x2zJ4D.js} +8 -8
  120. package/dist/{release-BY4Mlluy.js → release-DfZPuIcK.js} +1 -1
  121. package/dist/runner/auth/bearer.d.ts +6 -1
  122. package/dist/runner/auth/bearer.d.ts.map +1 -1
  123. package/dist/runner/auth/bearer.js +2 -2
  124. package/dist/runner/auth/jwt.d.ts +29 -2
  125. package/dist/runner/auth/jwt.d.ts.map +1 -1
  126. package/dist/runner/auth/jwt.js +4 -4
  127. package/dist/runner/auth/jwt.js.map +1 -1
  128. package/dist/runner/auth/mtls.d.ts +6 -1
  129. package/dist/runner/auth/mtls.d.ts.map +1 -1
  130. package/dist/runner/auth/mtls.js +3 -3
  131. package/dist/runner/auth/none.d.ts +7 -1
  132. package/dist/runner/auth/none.js +1 -1
  133. package/dist/runner/index.d.ts +310 -1
  134. package/dist/runner/index.d.ts.map +1 -1
  135. package/dist/runner/index.js +5 -5
  136. package/dist/runner/stdio.d.ts +6 -1
  137. package/dist/runner/stdio.d.ts.map +1 -1
  138. package/dist/runner/stdio.js +3 -3
  139. package/dist/runner/unix.d.ts +6 -1
  140. package/dist/runner/unix.d.ts.map +1 -1
  141. package/dist/runner/unix.js +3 -3
  142. package/dist/runner/websocket.d.ts +24 -1
  143. package/dist/runner/websocket.d.ts.map +1 -1
  144. package/dist/runner/websocket.js +4 -4
  145. package/dist/{socketChannel-C_ppdSzz.js → socketChannel-CJvL2DiB.js} +2 -2
  146. package/dist/{supervisorPlugin-CivhM7x5.js → supervisorPlugin-t6Z6PrhD.js} +72 -76
  147. package/dist/{token-Cc_1CTbE.js → token-CYBNNlhS.js} +1 -1
  148. package/dist/{tokenCredentials-CI6mMRRd.js → tokenCredentials-CbCuk-Rt.js} +3 -3
  149. package/dist/{websocketServer-D2Hk7wsA.js → websocketServer-NQhODlEt.js} +5 -3
  150. package/dist/{workerChannel-cmLc13vm.js → workerChannel-C8hhBJzA.js} +1 -1
  151. package/package.json +4 -4
  152. package/src/Auth.ts +9 -2
  153. package/src/Errors.ts +8 -0
  154. package/src/Transport.ts +6 -2
  155. package/src/bin.ts +28 -30
  156. package/src/index.ts +5 -3
  157. package/src/internal/Certificates.ts +10 -13
  158. package/src/internal/FailureGroup.ts +128 -121
  159. package/src/internal/assembly.ts +19 -10
  160. package/src/internal/auth/mtls.ts +19 -20
  161. package/src/internal/child.ts +248 -239
  162. package/src/internal/childRuntime.ts +81 -80
  163. package/src/internal/entry.ts +10 -11
  164. package/src/internal/execution.ts +69 -12
  165. package/src/internal/host/runner.ts +153 -153
  166. package/src/internal/host.ts +116 -120
  167. package/src/internal/port.ts +100 -103
  168. package/src/internal/release.ts +3 -2
  169. package/src/internal/runner/Connection.ts +52 -60
  170. package/src/internal/runner/Execution.ts +163 -164
  171. package/src/internal/runner/Framing.ts +9 -10
  172. package/src/internal/runner/Local.ts +26 -27
  173. package/src/internal/runner/Lock.ts +23 -25
  174. package/src/internal/runner/Packages.ts +67 -70
  175. package/src/internal/runner/Processes.ts +89 -92
  176. package/src/internal/runner/Store.ts +110 -114
  177. package/src/internal/runner/Supervisor.ts +392 -405
  178. package/src/internal/runner/accept.ts +76 -84
  179. package/src/internal/runner/model.ts +20 -21
  180. package/src/internal/serve.ts +15 -13
  181. package/src/internal/watchdogMain.ts +16 -11
  182. package/src/internal/websocketServer.ts +18 -3
  183. package/src/runner/auth/jwt.ts +10 -6
  184. 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 = (entries: Fork.Fork, lifecycle: typeof ServeLifecycle.Service) =>\n\tEffect.gen(function* () {\n\t\tconst disposed = yield* Effect.exit(entries.dispose)\n\t\tconst released = yield* Effect.exit(Deferred.await(lifecycle.released))\n\t\tconst cause = Array.reduce(\n\t\t\t[disposed, released],\n\t\t\tCause.empty,\n\t\t\t(cause: Cause.Cause<unknown>, exit: Exit.Exit<void, unknown>) =>\n\t\t\t\tExit.isFailure(exit) ? Cause.combine(cause, exit.cause) : cause,\n\t\t)\n\t\tif (cause.reasons.length > 0)\n\t\t\treturn yield* Effect.failCause(cleanupCause(cause))\n\t})\n\nconst load = Effect.fnUntraced(function* (config: string, directory: string) {\n\tconst lifecycle = yield* make\n\tyield* Graft.provide(ServeLifecycle, lifecycle)\n\tconst importer = yield* Importer.make(directory)\n\tconst resolver = yield* ModuleResolver.make({ base: directory, importer })\n\tyield* Graft.provide(ModuleResolver.ModuleResolver, resolver)\n\tconst entries = yield* Graft.plugin(Include.Include, {\n\t\tpath: config,\n\t\twatch: false,\n\t})\n\tyield* entries.await\n\tconst startup = yield* Graft.plugin(ready)\n\tyield* startup.await\n\treturn yield* Deferred.await(lifecycle.ended).pipe(\n\t\tEffect.ensuring(close(entries, lifecycle)),\n\t)\n})\nexport const run = Effect.fnUntraced(function* (config: string) {\n\tconst path = yield* Path.Path\n\tconst file = path.resolve(config)\n\tconst directory = path.dirname(file)\n\treturn yield* load(file, directory).pipe(\n\t\tEffect.mapError((error) =>\n\t\t\tStartupError.make({\n\t\t\t\tdetail: \"Starting the runner failed\",\n\t\t\t\tcause: Cause.fail(error),\n\t\t\t}),\n\t\t),\n\t\tEffect.provideService(ConfigDirectory, Option.some(directory)),\n\t\tEffect.provideService(Logger.LogToStderr, true),\n\t)\n})\n"],"mappings":";;;;;;;;AAyBA,MAAM,SACL,UAEA,OAAO,QACN,QACC,SAAS;CACT,IAAI,KAAK,MAAM,SAAS,UACvB,OAAO,OAAO,KACb,aAAa,KAAK;EACjB,QAAQ,gBAAgB,KAAK,KAAK;EAClC,OAAO,KAAK,MAAM;CACnB,CAAC,CACF;CACD,OAAO,MAAM,KAAK,QAAQ;AAC3B,GACA,EAAE,SAAS,KAAK,CACjB;AACD,MAAM,QAAQ,OAAO,KAAK;CACzB,MAAM;CACN,QAAQ,CAAC,OAAO,MAAM;CACtB,OAAO,OAAO,WAAW,aAAa;EACrC,MAAM,SAAS,OAAO,OAAO;EAE7B,OAAO,OAAO,MAAM,KACnB,OAAO,UACN,MAAM,MAAM,KACX,OAAO,KAAK,UAAU,YAAY,OAAO,OAAO,KAAK,EAAE,CAAC,GACxD,OAAO,OAAO,OAAO,MAAM,GAC3B,OAAO,YAAY,SAAS,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAChD,CACD,CACD;EAGA,OAAO,MAAM,MAAM,KAClB,OAAO,KAAK,UAAU,YAAY,OAAO,OAAO,KAAK,EAAE,CAAC,GACxD,OAAO,OAAO,OAAO,MAAM,GAC3B,OAAO,KAAK,SAAS,KAAK,KAAK,GAC/B,OAAO,KAAK,SAAS,MAAM,CAAC,IAAI,CAAC,CAAC,GAClC,OAAO,OAAO,eAAe,GAC7B,OAAO,OACR;CACD,CAAC;AACF,CAAC;;AAGD,MAAM,SAAS,SAAoB,cAClC,OAAO,IAAI,aAAa;CACvB,MAAM,WAAW,OAAO,OAAO,KAAK,QAAQ,OAAO;CACnD,MAAM,WAAW,OAAO,OAAO,KAAK,SAAS,MAAM,UAAU,QAAQ,CAAC;CACtE,MAAM,QAAQ,MAAM,OACnB,CAAC,UAAU,QAAQ,GACnB,MAAM,QACL,OAA6B,SAC7B,KAAK,UAAU,IAAI,IAAI,MAAM,QAAQ,OAAO,KAAK,KAAK,IAAI,KAC5D;CACA,IAAI,MAAM,QAAQ,SAAS,GAC1B,OAAO,OAAO,OAAO,UAAU,aAAa,KAAK,CAAC;AACpD,CAAC;AAEF,MAAM,OAAO,OAAO,WAAW,WAAW,QAAgB,WAAmB;CAC5E,MAAM,YAAY,OAAOA;CACzB,OAAO,MAAM,QAAQ,gBAAgB,SAAS;CAC9C,MAAM,WAAW,OAAOC,KAAc,SAAS;CAC/C,MAAM,WAAW,OAAO,eAAe,KAAK;EAAE,MAAM;EAAW;CAAS,CAAC;CACzE,OAAO,MAAM,QAAQ,eAAe,gBAAgB,QAAQ;CAC5D,MAAM,UAAU,OAAO,MAAM,OAAO,QAAQ,SAAS;EACpD,MAAM;EACN,OAAO;CACR,CAAC;CACD,OAAO,QAAQ;CAEf,QAAO,OADgB,MAAM,OAAO,KAAK,EAAA,CAC1B;CACf,OAAO,OAAO,SAAS,MAAM,UAAU,KAAK,CAAC,CAAC,KAC7C,OAAO,SAAS,MAAM,SAAS,SAAS,CAAC,CAC1C;AACD,CAAC;AACD,MAAa,MAAM,OAAO,WAAW,WAAW,QAAgB;CAC/D,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,OAAO,KAAK,QAAQ,MAAM;CAChC,MAAM,YAAY,KAAK,QAAQ,IAAI;CACnC,OAAO,OAAO,KAAK,MAAM,SAAS,CAAC,CAAC,KACnC,OAAO,UAAU,UAChB,aAAa,KAAK;EACjB,QAAQ;EACR,OAAO,MAAM,KAAK,KAAK;CACxB,CAAC,CACF,GACA,OAAO,eAAe,iBAAiB,OAAO,KAAK,SAAS,CAAC,GAC7D,OAAO,eAAe,OAAO,aAAa,IAAI,CAC/C;AACD,CAAC"}
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-CivhM7x5.js";
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.sync(() => performance.now());
12
- const expire = (deadline) => Effect.gen(function* () {
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(Math.min(remaining, 2147483647));
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((command) => Effect.gen(function* () {
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 = Effect.sync(() => performance.now())\nconst expire = (deadline: number): Effect.Effect<never> =>\n\tEffect.gen(function* () {\n\t\tconst remaining = deadline - (yield* now)\n\t\tif (remaining <= 0) return yield* die\n\t\tyield* Effect.sleep(Math.min(remaining, 2147483647))\n\t\treturn yield* expire(deadline)\n\t})\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((command) =>\n\t\t\t\tEffect.gen(function* () {\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;AACD,MAAM,MAAM,OAAO,WAAW,YAAY,IAAI,CAAC;AAC/C,MAAM,UAAU,aACf,OAAO,IAAI,aAAa;CACvB,MAAM,YAAY,YAAY,OAAO;CACrC,IAAI,aAAa,GAAG,OAAO,OAAO;CAClC,OAAO,OAAO,MAAM,KAAK,IAAI,WAAW,UAAU,CAAC;CACnD,OAAO,OAAO,OAAO,QAAQ;AAC9B,CAAC;AACF,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,YAAY,YAClB,OAAO,IAAI,aAAa;EACvB,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"}
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) => Effect.logWarning("Remote host authentication failed", { reason: error.reason }, ...error.cause === void 0 ? [] : [error.cause]).pipe(Effect.as(HttpServerResponse.empty({
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, TransportError } 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) =>\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,\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":";;;;;;;;AAmBA,MAAM,aAAa,UAClB,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
+ {"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-CVyueNOf.js";
2
- import { n as run, r as platform, t as load } from "../childRuntime-An0HsIzl.js";
3
- import { n as Bootstrap, t as make } from "../workerChannel-cmLc13vm.js";
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-zaYdOJnT.js";
2
- import { t as make$1 } from "./FailureGroup-BcH0XOBi.js";
3
- import { l as TransportError } from "./Errors-BMKmu5Y7.js";
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 = (bytes, options) => Effect.gen(function* () {
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 = (state) => Effect.tx(Effect.gen(function* () {
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(() => Effect.uninterruptible(Effect.gen(function* () {
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
- }))), Effect.forkScoped);
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, (cause) => Effect.gen(function* () {
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: any;
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":";qBAmBa,QAAM,OAAA"}
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-CVyueNOf.js";
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-Cc_1CTbE.js";
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 { Schema } from "effect";
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: any;
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":";qBAmBa,gBAAc,OAAA;qBAOd,QAAM,OAAA"}
1
+ {"version":3,"file":"jwt.d.ts","names":[],"sources":["../../../src/runner/auth/jwt.ts"],"mappings":";;qBAmBa,gBAAc,OAAA;qBAOd,QAAM,OAAA"}
@@ -1,8 +1,8 @@
1
- import { a as provide, l as make } from "../../Graft-CVyueNOf.js";
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-BMKmu5Y7.js";
5
- import { r as read } from "../../token-Cc_1CTbE.js";
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\tAuthenticationFailed.make({\n\t\t\t\t\t\t\t\t\treason: \"invalid\",\n\t\t\t\t\t\t\t\t\tchallenge: 'Bearer error=\"invalid_token\"',\n\t\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\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,GACA,OAAO,UAAU,UAChB,qBAAqB,KAAK;IACzB,QAAQ;IACR,WAAW;IACX,OAAO,MAAM,KAAK,KAAK;GACxB,CAAC,CACF,GACA,OAAO,eAAe,UAAU,WAAW,SAAS,GACpD,OAAO,eAAe,QAAQ,CAC/B,CACD,CACD;EACF,CAAC;CACF,CAAC;AACF,CAAC"}
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: any;
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":";;qBAMa,QAAM,OAAA;;;qBASN,OAAI,eAEd,QAAQ;WAA6B"}
1
+ {"version":3,"file":"mtls.d.ts","names":[],"sources":["../../../src/runner/auth/mtls.ts"],"mappings":";;;qBAMa,QAAM,OAAA;;;qBASN,OAAI,eAEd,QAAQ;WAA6B"}
@@ -1,7 +1,7 @@
1
- import { a as provide, l as make$1 } from "../../Graft-CVyueNOf.js";
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-BMKmu5Y7.js";
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 = (san) => Effect.gen(function* () {
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
- declare const _default: any;
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
@@ -1,4 +1,4 @@
1
- import { a as provide, l as make } from "../../Graft-CVyueNOf.js";
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