@graftland/plugin-remote 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/README.md +18 -54
  2. package/README.zh-CN.md +17 -51
  3. package/README.zh-TW.md +17 -51
  4. package/dist/Auth.d.ts.map +1 -1
  5. package/dist/Auth.js.map +1 -1
  6. package/dist/Config.d.ts +1151 -0
  7. package/dist/Config.d.ts.map +1 -0
  8. package/dist/Config.js +183 -0
  9. package/dist/Config.js.map +1 -0
  10. package/dist/Contract.d.ts +1 -1
  11. package/dist/Contract.d.ts.map +1 -1
  12. package/dist/Contract.js +32 -1
  13. package/dist/Contract.js.map +1 -1
  14. package/dist/Instance.d.ts.map +1 -1
  15. package/dist/Instance.js.map +1 -1
  16. package/dist/Testing.d.ts +1 -1
  17. package/dist/Testing.d.ts.map +1 -1
  18. package/dist/Testing.js.map +1 -1
  19. package/dist/Transport.d.ts +1 -1
  20. package/dist/Transport.d.ts.map +1 -1
  21. package/dist/Transport.js.map +1 -1
  22. package/dist/cli.d.ts +4 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +25 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/host/auth/bearer.d.ts +9 -1
  27. package/dist/host/auth/bearer.d.ts.map +1 -1
  28. package/dist/host/auth/bearer.js +4 -2
  29. package/dist/host/auth/bearer.js.map +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 +4 -2
  33. package/dist/host/auth/jwt.js.map +1 -1
  34. package/dist/host/auth/mtls.d.ts +10 -7
  35. package/dist/host/auth/mtls.d.ts.map +1 -1
  36. package/dist/host/auth/mtls.js +13 -14
  37. package/dist/host/auth/mtls.js.map +1 -1
  38. package/dist/host/auth/none.d.ts +3 -1
  39. package/dist/host/auth/none.js +7 -5
  40. package/dist/host/auth/none.js.map +1 -1
  41. package/dist/host/command.d.ts +14 -1
  42. package/dist/host/command.d.ts.map +1 -1
  43. package/dist/host/command.js +11 -9
  44. package/dist/host/command.js.map +1 -1
  45. package/dist/host/local.d.ts +2 -1
  46. package/dist/host/local.d.ts.map +1 -1
  47. package/dist/host/local.js +9 -30
  48. package/dist/host/local.js.map +1 -1
  49. package/dist/host/unix.d.ts +6 -1
  50. package/dist/host/unix.d.ts.map +1 -1
  51. package/dist/host/unix.js +13 -9
  52. package/dist/host/unix.js.map +1 -1
  53. package/dist/host/websocket.d.ts +10 -1
  54. package/dist/host/websocket.d.ts.map +1 -1
  55. package/dist/host/websocket.js +11 -8
  56. package/dist/host/websocket.js.map +1 -1
  57. package/dist/host/worker.d.ts +3 -1
  58. package/dist/host/worker.d.ts.map +1 -1
  59. package/dist/host/worker.js +13 -9
  60. package/dist/host/worker.js.map +1 -1
  61. package/dist/index.d.ts +6 -8
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +30 -64
  64. package/dist/index.js.map +1 -1
  65. package/dist/internal/Certificates.js.map +1 -1
  66. package/dist/internal/FailureGroup.js +6 -6
  67. package/dist/internal/FailureGroup.js.map +1 -1
  68. package/dist/internal/Peer.js.map +1 -1
  69. package/dist/internal/{ServeLifecycle.js → RunnerLifecycle.js} +6 -6
  70. package/dist/internal/RunnerLifecycle.js.map +1 -0
  71. package/dist/internal/Supervisor.js.map +1 -1
  72. package/dist/internal/assembly.d.ts +3 -2
  73. package/dist/internal/assembly.js +8 -8
  74. package/dist/internal/assembly.js.map +1 -1
  75. package/dist/internal/auth/config.d.ts +27 -0
  76. package/dist/internal/auth/config.d.ts.map +1 -0
  77. package/dist/internal/auth/config.js +29 -0
  78. package/dist/internal/auth/config.js.map +1 -0
  79. package/dist/internal/auth/mtls.js.map +1 -1
  80. package/dist/internal/auth/token.js.map +1 -1
  81. package/dist/internal/auth/tokenCredentials.d.ts +2 -1
  82. package/dist/internal/auth/tokenCredentials.d.ts.map +1 -1
  83. package/dist/internal/auth/tokenCredentials.js +1 -1
  84. package/dist/internal/auth/tokenCredentials.js.map +1 -1
  85. package/dist/internal/child.js +3 -3
  86. package/dist/internal/child.js.map +1 -1
  87. package/dist/internal/childMain.js +47 -0
  88. package/dist/internal/childMain.js.map +1 -0
  89. package/dist/internal/childRuntime.js +8 -8
  90. package/dist/internal/childRuntime.js.map +1 -1
  91. package/dist/internal/cleanup.js +3 -3
  92. package/dist/internal/cleanup.js.map +1 -1
  93. package/dist/internal/contract.js.map +1 -1
  94. package/dist/internal/credentials.d.ts +3 -2
  95. package/dist/internal/credentials.d.ts.map +1 -1
  96. package/dist/internal/credentials.js +1 -1
  97. package/dist/internal/credentials.js.map +1 -1
  98. package/dist/internal/directTransport.js.map +1 -1
  99. package/dist/internal/entry.d.ts +493 -3
  100. package/dist/internal/entry.d.ts.map +1 -1
  101. package/dist/internal/entry.js +22 -9
  102. package/dist/internal/entry.js.map +1 -1
  103. package/dist/internal/entryConfig.d.ts +2 -202
  104. package/dist/internal/entryConfig.js +2 -136
  105. package/dist/internal/entryConfig.js.map +1 -1
  106. package/dist/internal/execution.d.ts +4 -4
  107. package/dist/internal/execution.js +11 -11
  108. package/dist/internal/execution.js.map +1 -1
  109. package/dist/internal/follow.js +1 -1
  110. package/dist/internal/follow.js.map +1 -1
  111. package/dist/internal/forkTree.js.map +1 -1
  112. package/dist/internal/host/local.js.map +1 -1
  113. package/dist/internal/host/runner.js +4 -4
  114. package/dist/internal/host/runner.js.map +1 -1
  115. package/dist/internal/host.js +2 -2
  116. package/dist/internal/host.js.map +1 -1
  117. package/dist/internal/importer.js +1 -1
  118. package/dist/internal/importer.js.map +1 -1
  119. package/dist/internal/listenerStartup.js +1 -1
  120. package/dist/internal/listenerStartup.js.map +1 -1
  121. package/dist/internal/loadModule.js.map +1 -1
  122. package/dist/internal/platform.js +1 -9
  123. package/dist/internal/port.d.ts +1 -1
  124. package/dist/internal/port.js +2 -2
  125. package/dist/internal/port.js.map +1 -1
  126. package/dist/internal/runner/Bootstrap.js.map +1 -1
  127. package/dist/internal/runner/Connection.d.ts +3 -2
  128. package/dist/internal/runner/Connection.js +6 -6
  129. package/dist/internal/runner/Connection.js.map +1 -1
  130. package/dist/internal/runner/Execution.js +6 -6
  131. package/dist/internal/runner/Execution.js.map +1 -1
  132. package/dist/internal/runner/Local.js +1 -1
  133. package/dist/internal/runner/Local.js.map +1 -1
  134. package/dist/internal/runner/Lock.js.map +1 -1
  135. package/dist/internal/runner/Multiplex.js.map +1 -1
  136. package/dist/internal/runner/Packages.js.map +1 -1
  137. package/dist/internal/runner/ProcessObservation.js.map +1 -1
  138. package/dist/internal/runner/Processes.js.map +1 -1
  139. package/dist/internal/runner/Retention.js.map +1 -1
  140. package/dist/internal/runner/Store.js.map +1 -1
  141. package/dist/internal/runner/Supervisor.js +5 -5
  142. package/dist/internal/runner/Supervisor.js.map +1 -1
  143. package/dist/internal/runner/Watchdog.js.map +1 -1
  144. package/dist/internal/runner/Wire.d.ts +1 -1
  145. package/dist/internal/runner/Wire.js.map +1 -1
  146. package/dist/internal/runner/accept.js +2 -2
  147. package/dist/internal/runner/accept.js.map +1 -1
  148. package/dist/internal/runner/command.js +1 -1
  149. package/dist/internal/runner/command.js.map +1 -1
  150. package/dist/internal/runner/connectionEnded.js +1 -1
  151. package/dist/internal/runner/connectionEnded.js.map +1 -1
  152. package/dist/internal/runner/model.d.ts.map +1 -1
  153. package/dist/internal/runner/model.js.map +1 -1
  154. package/dist/internal/services.d.ts.map +1 -1
  155. package/dist/internal/services.js +1 -1
  156. package/dist/internal/services.js.map +1 -1
  157. package/dist/internal/socketChannel.js.map +1 -1
  158. package/dist/internal/stdioChannel.js.map +1 -1
  159. package/dist/internal/supervisorPlugin.js +48 -1
  160. package/dist/internal/supervisorPlugin.js.map +1 -1
  161. package/dist/internal/transportOptions.d.ts.map +1 -1
  162. package/dist/internal/watchdogMain.js +5 -3
  163. package/dist/internal/watchdogMain.js.map +1 -1
  164. package/dist/internal/websocket.js.map +1 -1
  165. package/dist/internal/websocketServer.js +1 -1
  166. package/dist/internal/websocketServer.js.map +1 -1
  167. package/dist/internal/workerChannel.js.map +1 -1
  168. package/dist/internal/workerMain.js +13 -6
  169. package/dist/internal/workerMain.js.map +1 -1
  170. package/dist/runner/auth/bearer.d.ts +8 -5
  171. package/dist/runner/auth/bearer.d.ts.map +1 -1
  172. package/dist/runner/auth/bearer.js +13 -11
  173. package/dist/runner/auth/bearer.js.map +1 -1
  174. package/dist/runner/auth/jwt.d.ts +30 -17
  175. package/dist/runner/auth/jwt.d.ts.map +1 -1
  176. package/dist/runner/auth/jwt.js +16 -28
  177. package/dist/runner/auth/jwt.js.map +1 -1
  178. package/dist/runner/auth/mtls.d.ts +8 -6
  179. package/dist/runner/auth/mtls.d.ts.map +1 -1
  180. package/dist/runner/auth/mtls.js +13 -29
  181. package/dist/runner/auth/mtls.js.map +1 -1
  182. package/dist/runner/auth/none.d.ts +7 -1
  183. package/dist/runner/auth/none.js +7 -5
  184. package/dist/runner/auth/none.js.map +1 -1
  185. package/dist/runner/index.d.ts +5 -1
  186. package/dist/runner/index.d.ts.map +1 -1
  187. package/dist/runner/index.js +62 -30
  188. package/dist/runner/index.js.map +1 -1
  189. package/dist/runner/stdio.d.ts +6 -1
  190. package/dist/runner/stdio.d.ts.map +1 -1
  191. package/dist/runner/stdio.js +11 -9
  192. package/dist/runner/stdio.js.map +1 -1
  193. package/dist/runner/unix.d.ts +6 -1
  194. package/dist/runner/unix.d.ts.map +1 -1
  195. package/dist/runner/unix.js +10 -8
  196. package/dist/runner/unix.js.map +1 -1
  197. package/dist/runner/websocket.d.ts +24 -1
  198. package/dist/runner/websocket.d.ts.map +1 -1
  199. package/dist/runner/websocket.js +12 -10
  200. package/dist/runner/websocket.js.map +1 -1
  201. package/package.json +14 -12
  202. package/schema.json +2269 -0
  203. package/src/Auth.ts +8 -2
  204. package/src/Config.ts +196 -0
  205. package/src/Contract.ts +12 -3
  206. package/src/Instance.ts +1 -0
  207. package/src/Testing.ts +6 -4
  208. package/src/Transport.ts +12 -3
  209. package/src/cli.ts +60 -0
  210. package/src/host/auth/bearer.ts +1 -0
  211. package/src/host/auth/jwt.ts +1 -0
  212. package/src/host/auth/mtls.ts +7 -12
  213. package/src/host/auth/none.ts +3 -1
  214. package/src/host/command.ts +8 -5
  215. package/src/host/local.ts +4 -2
  216. package/src/host/unix.ts +11 -7
  217. package/src/host/websocket.ts +10 -7
  218. package/src/host/worker.ts +8 -5
  219. package/src/index.ts +36 -23
  220. package/src/internal/Certificates.ts +1 -0
  221. package/src/internal/FailureGroup.ts +5 -3
  222. package/src/internal/Peer.ts +1 -0
  223. package/src/internal/{ServeLifecycle.ts → RunnerLifecycle.ts} +7 -5
  224. package/src/internal/Supervisor.ts +5 -4
  225. package/src/internal/assembly.ts +11 -9
  226. package/src/internal/auth/config.ts +44 -0
  227. package/src/internal/auth/mtls.ts +1 -0
  228. package/src/internal/auth/token.ts +1 -0
  229. package/src/internal/auth/tokenCredentials.ts +4 -2
  230. package/src/internal/child.ts +8 -6
  231. package/src/{bin.ts → internal/childMain.ts} +16 -61
  232. package/src/internal/childRuntime.ts +12 -10
  233. package/src/internal/cleanup.ts +3 -2
  234. package/src/internal/contract.ts +1 -0
  235. package/src/internal/credentials.ts +3 -1
  236. package/src/internal/directTransport.ts +9 -2
  237. package/src/internal/entry.ts +53 -16
  238. package/src/internal/entryConfig.ts +10 -132
  239. package/src/internal/execution.ts +17 -15
  240. package/src/internal/follow.ts +2 -1
  241. package/src/internal/forkTree.ts +2 -1
  242. package/src/internal/host/local.ts +1 -0
  243. package/src/internal/host/runner.ts +7 -5
  244. package/src/internal/host.ts +9 -8
  245. package/src/internal/importer.ts +3 -2
  246. package/src/internal/listenerStartup.ts +4 -2
  247. package/src/internal/loadModule.ts +1 -0
  248. package/src/internal/platform.ts +1 -12
  249. package/src/internal/port.ts +11 -6
  250. package/src/internal/runner/Bootstrap.ts +1 -0
  251. package/src/internal/runner/Connection.ts +13 -11
  252. package/src/internal/runner/Execution.ts +14 -13
  253. package/src/internal/runner/Local.ts +3 -2
  254. package/src/internal/runner/Lock.ts +1 -0
  255. package/src/internal/runner/Multiplex.ts +2 -1
  256. package/src/internal/runner/Packages.ts +7 -5
  257. package/src/internal/runner/ProcessObservation.ts +2 -1
  258. package/src/internal/runner/Processes.ts +3 -1
  259. package/src/internal/runner/Retention.ts +1 -0
  260. package/src/internal/runner/Store.ts +3 -2
  261. package/src/internal/runner/Supervisor.ts +22 -20
  262. package/src/internal/runner/Watchdog.ts +3 -1
  263. package/src/internal/runner/Wire.ts +13 -12
  264. package/src/internal/runner/accept.ts +6 -5
  265. package/src/internal/runner/command.ts +3 -2
  266. package/src/internal/runner/connectionEnded.ts +2 -1
  267. package/src/internal/runner/model.ts +5 -3
  268. package/src/internal/services.ts +9 -2
  269. package/src/internal/socketChannel.ts +2 -1
  270. package/src/internal/stdioChannel.ts +4 -2
  271. package/src/internal/supervisorPlugin.ts +10 -8
  272. package/src/internal/transportOptions.ts +1 -0
  273. package/src/internal/watchdogMain.ts +5 -3
  274. package/src/internal/websocket.ts +5 -2
  275. package/src/internal/websocketServer.ts +6 -4
  276. package/src/internal/workerChannel.ts +1 -0
  277. package/src/internal/workerMain.ts +21 -5
  278. package/src/runner/auth/bearer.ts +10 -6
  279. package/src/runner/auth/jwt.ts +10 -41
  280. package/src/runner/auth/mtls.ts +6 -3
  281. package/src/runner/auth/none.ts +3 -1
  282. package/src/runner/index.ts +102 -11
  283. package/src/runner/stdio.ts +15 -10
  284. package/src/runner/unix.ts +7 -4
  285. package/src/runner/websocket.ts +9 -7
  286. package/dist/Auth-BElTC9_X.js +0 -6
  287. package/dist/Bootstrap-H9gDsgsC.js +0 -9
  288. package/dist/ConfigDirectory-BCC6q2R4.js +0 -5
  289. package/dist/Contract-DsJtisvL.js +0 -83
  290. package/dist/Errors-DYhsGZcZ.js +0 -58
  291. package/dist/FailureGroup-BgT73AaR.js +0 -63
  292. package/dist/Framing-G9eSaeLb.js +0 -61
  293. package/dist/Graft-B71CPA2Y.js +0 -996
  294. package/dist/Packages-AgoCGotL.js +0 -108
  295. package/dist/Peer-DXeVrGBh.js +0 -342
  296. package/dist/ProcessObservation-gLgGirYv.js +0 -38
  297. package/dist/ServeLifecycle-Bd1FPJ6e.js +0 -24
  298. package/dist/Transport-DULzpsgR.js +0 -6
  299. package/dist/WatchdogProtocol-BZmVxrBP.js +0 -17
  300. package/dist/bin.js +0 -28276
  301. package/dist/bin.js.map +0 -1
  302. package/dist/childRuntime-Bm3iSg_N.js +0 -192
  303. package/dist/command-9zrHdbwT.js +0 -7
  304. package/dist/connectionEnded-BwcxQ7W8.js +0 -54
  305. package/dist/directTransport-DrexuPSm.js +0 -5
  306. package/dist/entry-psOpX3Bj.js +0 -736
  307. package/dist/importer-Cvf88eAY.js +0 -344
  308. package/dist/internal/ServeLifecycle.js.map +0 -1
  309. package/dist/internal/entryConfig.d.ts.map +0 -1
  310. package/dist/internal/platform.js.map +0 -1
  311. package/dist/internal/release.js +0 -25
  312. package/dist/internal/release.js.map +0 -1
  313. package/dist/internal/serve.js +0 -60
  314. package/dist/internal/serve.js.map +0 -1
  315. package/dist/port--3x2zJ4D.js +0 -285
  316. package/dist/release-DfZPuIcK.js +0 -23
  317. package/dist/rolldown-runtime-DYf_mQCB.js +0 -34
  318. package/dist/socketChannel-CJvL2DiB.js +0 -3658
  319. package/dist/supervisorPlugin-t6Z6PrhD.js +0 -733
  320. package/dist/token-CYBNNlhS.js +0 -17
  321. package/dist/tokenCredentials-CbCuk-Rt.js +0 -31
  322. package/dist/websocketServer-NQhODlEt.js +0 -60
  323. package/dist/workerChannel-C8hhBJzA.js +0 -27
  324. package/src/internal/release.ts +0 -72
  325. package/src/internal/serve.ts +0 -119
  326. /package/dist/{bin.d.ts → internal/childMain.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","names":["FailureGroup.make","Control.endpoint"],"sources":["../../src/internal/host.ts"],"sourcesContent":["import * as FailureGroup from \"./FailureGroup\"\nimport * as ContractModule from \"../Contract\"\nimport {\n\tCause,\n\tArray,\n\tDeferred,\n\tEffect,\n\tRef,\n\tOption,\n\tSchema,\n\tScope,\n\tStream,\n} from \"effect\"\nimport { RpcClient, type RpcClientError } from \"effect/rpc\"\nimport { RemoteWithdrawn } from \"../Errors\"\nimport * as Control from \"./control\"\nimport { cleanupCause } from \"./cleanup\"\nimport { Connection } from \"./runner/Connection\"\nimport type { Service } from \"../Contract\"\nimport type { ChildFailure } from \"./childErrors\"\nimport type { prepare } from \"./contract\"\n\ntype ErrorSchema = Schema.Top & {\n\treadonly DecodingServices: never\n\treadonly EncodingServices: never\n}\ntype ControlGroup<E extends ErrorSchema> = ReturnType<\n\ttypeof prepare<Schema.Codec<unknown, Schema.Json>, E>\n>[\"control\"]\ninterface Contract<E extends ErrorSchema> {\n\treadonly control: ControlGroup<E>\n\treadonly inject: ReadonlyArray<Service>\n\treadonly decodeCause: (\n\t\tinput: unknown,\n\t) => Effect.Effect<\n\t\tCause.Cause<E[\"Type\"] | ContractModule.UndeclaredFailure | ChildFailure>,\n\t\tSchema.SchemaError\n\t>\n}\ntype Client<E extends ErrorSchema> = RpcClient.FromGroup<\n\tControlGroup<E>,\n\tRpcClientError.RpcClientError\n>\nconst race = <A, E, R>(\n\tconnection: Connection[\"Service\"],\n\teffect: Effect.Effect<A, E, R>,\n) => Effect.raceFirst(effect, connection.transport.failure)\n\nconst forwardEvents = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n\tclient: Client<E>,\n\tconnection: Connection[\"Service\"],\n) {\n\tconst stopped = yield* Deferred.make<void>()\n\tconst remoteFailure = yield* FailureGroup.make<\n\t\t| E[\"Type\"]\n\t\t| ContractModule.UndeclaredFailure\n\t\t| ChildFailure\n\t\t| RemoteWithdrawn\n\t>()\n\tconst events = yield* race(\n\t\tconnection,\n\t\tclient.Events().pipe(\n\t\t\tStream.runForEach((event) => {\n\t\t\t\tswitch (event._tag) {\n\t\t\t\t\tcase \"Stopped\":\n\t\t\t\t\t\treturn Deferred.succeed(stopped, undefined)\n\t\t\t\t\tcase \"Withdrawing\":\n\t\t\t\t\t\treturn remoteFailure.fail(RemoteWithdrawn.make({}))\n\t\t\t\t\tcase \"Failed\":\n\t\t\t\t\t\treturn contract\n\t\t\t\t\t\t\t.decodeCause(event.cause)\n\t\t\t\t\t\t\t.pipe(Effect.flatMap((cause) => remoteFailure.failCause(cause)))\n\t\t\t\t}\n\t\t\t}),\n\t\t),\n\t).pipe(\n\t\tEffect.tapCause(connection.transport.report),\n\t\tEffect.forkIn(connection.resources),\n\t)\n\treturn { stopped, remoteFailure, events }\n})\nconst forwardLogs = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n\tclient: Client<E>,\n\tconnection: Connection[\"Service\"],\n) {\n\tconst logsEnded = yield* Deferred.make<void>()\n\tconst reportedDrops = yield* Ref.make(0)\n\tyield* race(\n\t\tconnection,\n\t\tclient.Logs().pipe(\n\t\t\tStream.runForEach(\n\t\t\t\tEffect.fnUntraced(function* (event) {\n\t\t\t\t\tconst previous = yield* Ref.getAndSet(reportedDrops, event.dropped)\n\t\t\t\t\tif (event.dropped > previous)\n\t\t\t\t\t\tyield* Effect.logWarning(\"Remote logs were dropped\").pipe(\n\t\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t\t...(Option.isSome(connection.pid)\n\t\t\t\t\t\t\t\t\t? { \"remote.pid\": connection.pid.value }\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\"remote.logs.dropped\": event.dropped - previous,\n\t\t\t\t\t\t\t\t\"remote.logs.droppedTotal\": event.dropped,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\tif (event._tag === \"LogsEnded\") {\n\t\t\t\t\t\tyield* Deferred.succeed(logsEnded, undefined)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst entry = event.entry\n\t\t\t\t\tconst cause = yield* contract.decodeCause(entry.cause)\n\t\t\t\t\tyield* Effect.logWithLevel(\n\t\t\t\t\t\tentry.level === \"All\" || entry.level === \"None\"\n\t\t\t\t\t\t\t? \"Info\"\n\t\t\t\t\t\t\t: entry.level,\n\t\t\t\t\t)(\n\t\t\t\t\t\t...(Array.isArray(entry.message) ? entry.message : [entry.message]),\n\t\t\t\t\t\tcause,\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t...(Option.isSome(connection.pid)\n\t\t\t\t\t\t\t\t? { \"remote.pid\": connection.pid.value }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t...(connection.threadId === undefined\n\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t: { \"remote.threadId\": connection.threadId }),\n\t\t\t\t\t\t\t\"remote.annotations\": entry.annotations,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t).pipe(\n\t\tEffect.tapCause(connection.transport.report),\n\t\tEffect.forkIn(connection.resources),\n\t)\n\treturn logsEnded\n})\nexport const initialize = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n) {\n\tconst connection = yield* Connection\n\tconst client = yield* RpcClient.make(contract.control).pipe(\n\t\tEffect.provideService(\n\t\t\tRpcClient.Protocol,\n\t\t\tconnection.transport.clientProtocol(Control.endpoint),\n\t\t),\n\t\tScope.provide(connection.resources),\n\t)\n\tfor (const service of contract.inject)\n\t\tyield* service\n\t\t\t.serve(connection.transport)\n\t\t\t.pipe(\n\t\t\t\tEffect.tapCause(connection.transport.report),\n\t\t\t\tEffect.forkIn(connection.resources),\n\t\t\t)\n\tconst events = yield* forwardEvents(contract, client, connection)\n\tconst logsEnded = yield* forwardLogs(contract, client, connection)\n\treturn { connection, client, ...events, logsEnded }\n})\ntype Active<E extends ErrorSchema> = Effect.Success<\n\tReturnType<typeof initialize<E>>\n>\nexport const load = <E extends ErrorSchema>(\n\tactive: Active<E>,\n\tinput: Schema.Json,\n) =>\n\trace(\n\t\tactive.connection,\n\t\tEffect.raceFirst(\n\t\t\tactive.client\n\t\t\t\t.Load({ input })\n\t\t\t\t.pipe(\n\t\t\t\t\tEffect.catchIf(\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t): cause is Cause.Cause<\n\t\t\t\t\t\t\tE[\"Type\"] | ContractModule.UndeclaredFailure | ChildFailure\n\t\t\t\t\t\t> => Cause.isCause(cause),\n\t\t\t\t\t\tEffect.failCause,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\tactive.remoteFailure.await,\n\t\t),\n\t)\nexport const dispose = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tactive: Active<E>,\n) {\n\tconst result = yield* race(\n\t\tactive.connection,\n\t\tactive.client.Dispose().pipe(Effect.catchIf(Cause.isCause, Effect.succeed)),\n\t)\n\tconst cause = Cause.isCause(result) ? result : Cause.empty\n\t// A remote cleanup failure still permits the bounded event and log tail to drain.\n\tyield* race(\n\t\tactive.connection,\n\t\tDeferred.await(active.stopped).pipe(\n\t\t\tEffect.andThen(Deferred.await(active.logsEnded)),\n\t\t),\n\t).pipe(Effect.onError(() => Effect.failCause(cleanupCause(cause))))\n\treturn cause\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"host.js","names":["FailureGroup.make","Control.endpoint"],"sources":["../../src/internal/host.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tDeferred,\n\tEffect,\n\tOption,\n\tRef,\n\tSchema,\n\tScope,\n\tStream,\n} from \"effect\"\nimport { RpcClient, type RpcClientError } from \"effect/rpc\"\n\nimport * as ContractModule from \"../Contract\"\nimport type { Service } from \"../Contract\"\nimport { RemoteWithdrawn } from \"../Errors\"\nimport type { ChildFailure } from \"./childErrors\"\nimport { cleanupCause } from \"./cleanup\"\nimport type { prepare } from \"./contract\"\nimport * as Control from \"./control\"\nimport * as FailureGroup from \"./FailureGroup\"\nimport { Connection } from \"./runner/Connection\"\n\ntype ErrorSchema = Schema.Top & {\n\treadonly DecodingServices: never\n\treadonly EncodingServices: never\n}\ntype ControlGroup<E extends ErrorSchema> = ReturnType<\n\ttypeof prepare<Schema.Codec<unknown, Schema.Json>, E>\n>[\"control\"]\ninterface Contract<E extends ErrorSchema> {\n\treadonly control: ControlGroup<E>\n\treadonly inject: ReadonlyArray<Service>\n\treadonly decodeCause: (\n\t\tinput: unknown,\n\t) => Effect.Effect<\n\t\tCause.Cause<E[\"Type\"] | ContractModule.UndeclaredFailure | ChildFailure>,\n\t\tSchema.SchemaError\n\t>\n}\ntype Client<E extends ErrorSchema> = RpcClient.FromGroup<\n\tControlGroup<E>,\n\tRpcClientError.RpcClientError\n>\nconst race = <A, E, R>(\n\tconnection: Connection[\"Service\"],\n\teffect: Effect.Effect<A, E, R>,\n) => Effect.raceFirst(effect, connection.transport.failure)\n\nconst forwardEvents = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n\tclient: Client<E>,\n\tconnection: Connection[\"Service\"],\n) {\n\tconst stopped = yield* Deferred.make<void>()\n\tconst remoteFailure = yield* FailureGroup.make<\n\t\t| E[\"Type\"]\n\t\t| ContractModule.UndeclaredFailure\n\t\t| ChildFailure\n\t\t| RemoteWithdrawn\n\t>()\n\tconst events = yield* race(\n\t\tconnection,\n\t\tclient.Events().pipe(\n\t\t\tStream.runForEach((event) => {\n\t\t\t\tswitch (event._tag) {\n\t\t\t\t\tcase \"Stopped\":\n\t\t\t\t\t\treturn Deferred.succeed(stopped, undefined)\n\t\t\t\t\tcase \"Withdrawing\":\n\t\t\t\t\t\treturn remoteFailure.fail(RemoteWithdrawn.make({}))\n\t\t\t\t\tcase \"Failed\":\n\t\t\t\t\t\treturn contract\n\t\t\t\t\t\t\t.decodeCause(event.cause)\n\t\t\t\t\t\t\t.pipe(Effect.flatMap((cause) => remoteFailure.failCause(cause)))\n\t\t\t\t}\n\t\t\t}),\n\t\t),\n\t).pipe(\n\t\tEffect.tapCause(connection.transport.report),\n\t\tEffect.forkIn(connection.resources),\n\t)\n\treturn { stopped, remoteFailure, events }\n})\nconst forwardLogs = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n\tclient: Client<E>,\n\tconnection: Connection[\"Service\"],\n) {\n\tconst logsEnded = yield* Deferred.make<void>()\n\tconst reportedDrops = yield* Ref.make(0)\n\tyield* race(\n\t\tconnection,\n\t\tclient.Logs().pipe(\n\t\t\tStream.runForEach(\n\t\t\t\tEffect.fnUntraced(function* (event) {\n\t\t\t\t\tconst previous = yield* Ref.getAndSet(reportedDrops, event.dropped)\n\t\t\t\t\tif (event.dropped > previous)\n\t\t\t\t\t\tyield* Effect.logWarning(\"Remote logs were dropped\").pipe(\n\t\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t\t...(Option.isSome(connection.pid)\n\t\t\t\t\t\t\t\t\t? { \"remote.pid\": connection.pid.value }\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\"remote.logs.dropped\": event.dropped - previous,\n\t\t\t\t\t\t\t\t\"remote.logs.droppedTotal\": event.dropped,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\tif (event._tag === \"LogsEnded\") {\n\t\t\t\t\t\tyield* Deferred.succeed(logsEnded, undefined)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst entry = event.entry\n\t\t\t\t\tconst cause = yield* contract.decodeCause(entry.cause)\n\t\t\t\t\tyield* Effect.logWithLevel(\n\t\t\t\t\t\tentry.level === \"All\" || entry.level === \"None\"\n\t\t\t\t\t\t\t? \"Info\"\n\t\t\t\t\t\t\t: entry.level,\n\t\t\t\t\t)(\n\t\t\t\t\t\t...(Array.isArray(entry.message) ? entry.message : [entry.message]),\n\t\t\t\t\t\tcause,\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t...(Option.isSome(connection.pid)\n\t\t\t\t\t\t\t\t? { \"remote.pid\": connection.pid.value }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t...(connection.threadId === undefined\n\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t: { \"remote.threadId\": connection.threadId }),\n\t\t\t\t\t\t\t\"remote.annotations\": entry.annotations,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t).pipe(\n\t\tEffect.tapCause(connection.transport.report),\n\t\tEffect.forkIn(connection.resources),\n\t)\n\treturn logsEnded\n})\nexport const initialize = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tcontract: Contract<E>,\n) {\n\tconst connection = yield* Connection\n\tconst client = yield* RpcClient.make(contract.control).pipe(\n\t\tEffect.provideService(\n\t\t\tRpcClient.Protocol,\n\t\t\tconnection.transport.clientProtocol(Control.endpoint),\n\t\t),\n\t\tScope.provide(connection.resources),\n\t)\n\tfor (const service of contract.inject)\n\t\tyield* service\n\t\t\t.serve(connection.transport)\n\t\t\t.pipe(\n\t\t\t\tEffect.tapCause(connection.transport.report),\n\t\t\t\tEffect.forkIn(connection.resources),\n\t\t\t)\n\tconst events = yield* forwardEvents(contract, client, connection)\n\tconst logsEnded = yield* forwardLogs(contract, client, connection)\n\treturn { connection, client, ...events, logsEnded }\n})\ntype Active<E extends ErrorSchema> = Effect.Success<\n\tReturnType<typeof initialize<E>>\n>\nexport const load = <E extends ErrorSchema>(\n\tactive: Active<E>,\n\tinput: Schema.Json,\n) =>\n\trace(\n\t\tactive.connection,\n\t\tEffect.raceFirst(\n\t\t\tactive.client\n\t\t\t\t.Load({ input })\n\t\t\t\t.pipe(\n\t\t\t\t\tEffect.catchIf(\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t): cause is Cause.Cause<\n\t\t\t\t\t\t\tE[\"Type\"] | ContractModule.UndeclaredFailure | ChildFailure\n\t\t\t\t\t\t> => Cause.isCause(cause),\n\t\t\t\t\t\tEffect.failCause,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\tactive.remoteFailure.await,\n\t\t),\n\t)\nexport const dispose = Effect.fnUntraced(function* <E extends ErrorSchema>(\n\tactive: Active<E>,\n) {\n\tconst result = yield* race(\n\t\tactive.connection,\n\t\tactive.client.Dispose().pipe(Effect.catchIf(Cause.isCause, Effect.succeed)),\n\t)\n\tconst cause = Cause.isCause(result) ? result : Cause.empty\n\t// A remote cleanup failure still permits the bounded event and log tail to drain.\n\tyield* race(\n\t\tactive.connection,\n\t\tDeferred.await(active.stopped).pipe(\n\t\t\tEffect.andThen(Deferred.await(active.logsEnded)),\n\t\t),\n\t).pipe(Effect.onError(() => Effect.failCause(cleanupCause(cause))))\n\treturn cause\n})\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { SecureRandom } from "effect/crypto";
6
6
  const make = Effect.fnUntraced(function* (directory) {
7
7
  const path = yield* Path.Path;
8
8
  const base = yield* path.toFileUrl(path.join(directory, "graft.yml"));
9
- const prefix = `graft-remote-${yield* (yield* SecureRandom.SecureRandom).uuidV4()}:`;
9
+ const prefix = `graft-module-${yield* (yield* SecureRandom.SecureRandom).uuidV4()}:`;
10
10
  yield* Effect.acquireRelease(Effect.sync(() => registerHooks({ resolve: (specifier, context, next) => String.startsWith(prefix)(specifier) ? next(String.slice(prefix.length)(specifier), {
11
11
  ...context,
12
12
  parentURL: base.href
@@ -1 +1 @@
1
- {"version":3,"file":"importer.js","names":[],"sources":["../../src/internal/importer.ts"],"sourcesContent":["import { Effect, Path, String } from \"effect\"\nimport { SecureRandom } from \"effect/crypto\"\nimport { registerHooks } from \"node:module\"\n\n/** Bare names resolve from the application; imported dependencies keep their own parent URLs. */\nexport const make = Effect.fnUntraced(function* (directory: string) {\n\tconst path = yield* Path.Path\n\tconst base = yield* path.toFileUrl(path.join(directory, \"graft.yml\"))\n\tconst random = yield* SecureRandom.SecureRandom\n\tconst id = yield* random.uuidV4()\n\tconst prefix = `graft-remote-${id}:`\n\tyield* Effect.acquireRelease(\n\t\tEffect.sync(() =>\n\t\t\tregisterHooks({\n\t\t\t\tresolve: (specifier, context, next) =>\n\t\t\t\t\tString.startsWith(prefix)(specifier)\n\t\t\t\t\t\t? next(String.slice(prefix.length)(specifier), {\n\t\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\t\tparentURL: base.href,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: next(specifier, context),\n\t\t\t}),\n\t\t),\n\t\t(hooks) => Effect.sync(() => hooks.deregister()),\n\t)\n\treturn (specifier: string): Promise<unknown> => import(prefix + specifier)\n})\n"],"mappings":";;;;;AAKA,MAAa,OAAO,OAAO,WAAW,WAAW,WAAmB;CACnE,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,OAAO,OAAO,KAAK,UAAU,KAAK,KAAK,WAAW,WAAW,CAAC;CAGpE,MAAM,SAAS,gBAAgB,QADb,OADI,aAAa,aAAA,CACV,OAAO,EACE;CAClC,OAAO,OAAO,eACb,OAAO,WACN,cAAc,EACb,UAAU,WAAW,SAAS,SAC7B,OAAO,WAAW,MAAM,CAAC,CAAC,SAAS,IAChC,KAAK,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC,SAAS,GAAG;EAC7C,GAAG;EACH,WAAW,KAAK;CACjB,CAAC,IACA,KAAK,WAAW,OAAO,EAC5B,CAAC,CACF,IACC,UAAU,OAAO,WAAW,MAAM,WAAW,CAAC,CAChD;CACA,QAAQ,cAAwC,OAAO,SAAS;AACjE,CAAC"}
1
+ {"version":3,"file":"importer.js","names":[],"sources":["../../src/internal/importer.ts"],"sourcesContent":["import { registerHooks } from \"node:module\"\n\nimport { Effect, Path, String } from \"effect\"\nimport { SecureRandom } from \"effect/crypto\"\n\n/** Bare names resolve from the application; imported dependencies keep their own parent URLs. */\nexport const make = Effect.fnUntraced(function* (directory: string) {\n\tconst path = yield* Path.Path\n\tconst base = yield* path.toFileUrl(path.join(directory, \"graft.yml\"))\n\tconst random = yield* SecureRandom.SecureRandom\n\tconst id = yield* random.uuidV4()\n\tconst prefix = `graft-module-${id}:`\n\tyield* Effect.acquireRelease(\n\t\tEffect.sync(() =>\n\t\t\tregisterHooks({\n\t\t\t\tresolve: (specifier, context, next) =>\n\t\t\t\t\tString.startsWith(prefix)(specifier)\n\t\t\t\t\t\t? next(String.slice(prefix.length)(specifier), {\n\t\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\t\tparentURL: base.href,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: next(specifier, context),\n\t\t\t}),\n\t\t),\n\t\t(hooks) => Effect.sync(() => hooks.deregister()),\n\t)\n\treturn (specifier: string): Promise<unknown> => import(prefix + specifier)\n})\n"],"mappings":";;;;;AAMA,MAAa,OAAO,OAAO,WAAW,WAAW,WAAmB;CACnE,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,OAAO,OAAO,KAAK,UAAU,KAAK,KAAK,WAAW,WAAW,CAAC;CAGpE,MAAM,SAAS,gBAAgB,QADb,OADI,aAAa,aAAA,CACV,OAAO,EACE;CAClC,OAAO,OAAO,eACb,OAAO,WACN,cAAc,EACb,UAAU,WAAW,SAAS,SAC7B,OAAO,WAAW,MAAM,CAAC,CAAC,SAAS,IAChC,KAAK,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC,SAAS,GAAG;EAC7C,GAAG;EACH,WAAW,KAAK;CACjB,CAAC,IACA,KAAK,WAAW,OAAO,EAC5B,CAAC,CACF,IACC,UAAU,OAAO,WAAW,MAAM,WAAW,CAAC,CAChD;CACA,QAAQ,cAAwC,OAAO,SAAS;AACjE,CAAC"}
@@ -8,7 +8,7 @@ const signals = Effect.all({
8
8
  /** A startup signal races its assembly's failure; no runtime failure is promoted to the owner. */
9
9
  const wait = (fork, signal) => Deferred.await(signal).pipe(Effect.raceFirst(fork.state.pipe(Stream.runForEach((state) => state._tag === "Failed" ? Effect.fail(CapabilityFailed.make({ cause: state.cause })) : Effect.void), Effect.andThen(Effect.never))));
10
10
  const validate = (listeners) => {
11
- if (listeners.length !== 1 && Array.some(listeners, ({ properties }) => properties.protocol === "stdio")) return Effect.fail(CapabilityCombinationError.make({ detail: "A stdio listener must be the only listener in serve" }));
11
+ if (listeners.length !== 1 && Array.some(listeners, ({ properties }) => properties.protocol === "stdio")) return Effect.fail(CapabilityCombinationError.make({ detail: "A stdio listener must be the only listener in the runner" }));
12
12
  const issuers = HashSet.fromIterable(Array.getSomes(Array.map(listeners, ({ auth }) => auth._tag === "Header" ? Option.fromUndefinedOr(auth.issuer) : Option.none())));
13
13
  return HashSet.size(issuers) > 1 ? Effect.fail(CapabilityCombinationError.make({ detail: "A runner must use a single authentication issuer" })) : Effect.void;
14
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"listenerStartup.js","names":[],"sources":["../../src/internal/listenerStartup.ts"],"sourcesContent":["import type { Fork } from \"@graftland/graft\"\nimport { Array, Deferred, Effect, HashSet, Option, Stream } from \"effect\"\nimport type { AuthenticatorApi } from \"../Auth\"\nimport type { Properties } from \"../Transport\"\nimport { CapabilityCombinationError, CapabilityFailed } from \"./assembly\"\n\nexport interface Description {\n\treadonly properties: Properties\n\treadonly auth: AuthenticatorApi\n}\nexport const signals = Effect.all({\n\tdescription: Deferred.make<Description>(),\n\tready: Deferred.make<void>(),\n})\n/** A startup signal races its assembly's failure; no runtime failure is promoted to the owner. */\nexport const wait = <A>(fork: Fork.Fork, signal: Deferred.Deferred<A>) =>\n\tDeferred.await(signal).pipe(\n\t\tEffect.raceFirst(\n\t\t\tfork.state.pipe(\n\t\t\t\tStream.runForEach((state) =>\n\t\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t\t? Effect.fail(CapabilityFailed.make({ cause: state.cause }))\n\t\t\t\t\t\t: Effect.void,\n\t\t\t\t),\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\t),\n\t)\nexport const validate = (listeners: ReadonlyArray<Description>) => {\n\tif (\n\t\tlisteners.length !== 1 &&\n\t\tArray.some(listeners, ({ properties }) => properties.protocol === \"stdio\")\n\t)\n\t\treturn Effect.fail(\n\t\t\tCapabilityCombinationError.make({\n\t\t\t\tdetail: \"A stdio listener must be the only listener in serve\",\n\t\t\t}),\n\t\t)\n\tconst issuers = HashSet.fromIterable(\n\t\tArray.getSomes(\n\t\t\tArray.map(listeners, ({ auth }) =>\n\t\t\t\tauth._tag === \"Header\"\n\t\t\t\t\t? Option.fromUndefinedOr(auth.issuer)\n\t\t\t\t\t: Option.none(),\n\t\t\t),\n\t\t),\n\t)\n\treturn HashSet.size(issuers) > 1\n\t\t? Effect.fail(\n\t\t\t\tCapabilityCombinationError.make({\n\t\t\t\t\tdetail: \"A runner must use a single authentication issuer\",\n\t\t\t\t}),\n\t\t\t)\n\t\t: Effect.void\n}\n"],"mappings":";;;AAUA,MAAa,UAAU,OAAO,IAAI;CACjC,aAAa,SAAS,KAAkB;CACxC,OAAO,SAAS,KAAW;AAC5B,CAAC;;AAED,MAAa,QAAW,MAAiB,WACxC,SAAS,MAAM,MAAM,CAAC,CAAC,KACtB,OAAO,UACN,KAAK,MAAM,KACV,OAAO,YAAY,UAClB,MAAM,SAAS,WACZ,OAAO,KAAK,iBAAiB,KAAK,EAAE,OAAO,MAAM,MAAM,CAAC,CAAC,IACzD,OAAO,IACX,GACA,OAAO,QAAQ,OAAO,KAAK,CAC5B,CACD,CACD;AACD,MAAa,YAAY,cAA0C;CAClE,IACC,UAAU,WAAW,KACrB,MAAM,KAAK,YAAY,EAAE,iBAAiB,WAAW,aAAa,OAAO,GAEzE,OAAO,OAAO,KACb,2BAA2B,KAAK,EAC/B,QAAQ,sDACT,CAAC,CACF;CACD,MAAM,UAAU,QAAQ,aACvB,MAAM,SACL,MAAM,IAAI,YAAY,EAAE,WACvB,KAAK,SAAS,WACX,OAAO,gBAAgB,KAAK,MAAM,IAClC,OAAO,KAAK,CAChB,CACD,CACD;CACA,OAAO,QAAQ,KAAK,OAAO,IAAI,IAC5B,OAAO,KACP,2BAA2B,KAAK,EAC/B,QAAQ,mDACT,CAAC,CACF,IACC,OAAO;AACX"}
1
+ {"version":3,"file":"listenerStartup.js","names":[],"sources":["../../src/internal/listenerStartup.ts"],"sourcesContent":["import { Array, Deferred, Effect, HashSet, Option, Stream } from \"effect\"\n\nimport type { Fork } from \"@graftland/graft\"\n\nimport type { AuthenticatorApi } from \"../Auth\"\nimport type { Properties } from \"../Transport\"\nimport { CapabilityCombinationError, CapabilityFailed } from \"./assembly\"\n\nexport interface Description {\n\treadonly properties: Properties\n\treadonly auth: AuthenticatorApi\n}\nexport const signals = Effect.all({\n\tdescription: Deferred.make<Description>(),\n\tready: Deferred.make<void>(),\n})\n/** A startup signal races its assembly's failure; no runtime failure is promoted to the owner. */\nexport const wait = <A>(fork: Fork.Fork, signal: Deferred.Deferred<A>) =>\n\tDeferred.await(signal).pipe(\n\t\tEffect.raceFirst(\n\t\t\tfork.state.pipe(\n\t\t\t\tStream.runForEach((state) =>\n\t\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t\t? Effect.fail(CapabilityFailed.make({ cause: state.cause }))\n\t\t\t\t\t\t: Effect.void,\n\t\t\t\t),\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\t),\n\t)\nexport const validate = (listeners: ReadonlyArray<Description>) => {\n\tif (\n\t\tlisteners.length !== 1 &&\n\t\tArray.some(listeners, ({ properties }) => properties.protocol === \"stdio\")\n\t)\n\t\treturn Effect.fail(\n\t\t\tCapabilityCombinationError.make({\n\t\t\t\tdetail: \"A stdio listener must be the only listener in the runner\",\n\t\t\t}),\n\t\t)\n\tconst issuers = HashSet.fromIterable(\n\t\tArray.getSomes(\n\t\t\tArray.map(listeners, ({ auth }) =>\n\t\t\t\tauth._tag === \"Header\"\n\t\t\t\t\t? Option.fromUndefinedOr(auth.issuer)\n\t\t\t\t\t: Option.none(),\n\t\t\t),\n\t\t),\n\t)\n\treturn HashSet.size(issuers) > 1\n\t\t? Effect.fail(\n\t\t\t\tCapabilityCombinationError.make({\n\t\t\t\t\tdetail: \"A runner must use a single authentication issuer\",\n\t\t\t\t}),\n\t\t\t)\n\t\t: Effect.void\n}\n"],"mappings":";;;AAYA,MAAa,UAAU,OAAO,IAAI;CACjC,aAAa,SAAS,KAAkB;CACxC,OAAO,SAAS,KAAW;AAC5B,CAAC;;AAED,MAAa,QAAW,MAAiB,WACxC,SAAS,MAAM,MAAM,CAAC,CAAC,KACtB,OAAO,UACN,KAAK,MAAM,KACV,OAAO,YAAY,UAClB,MAAM,SAAS,WACZ,OAAO,KAAK,iBAAiB,KAAK,EAAE,OAAO,MAAM,MAAM,CAAC,CAAC,IACzD,OAAO,IACX,GACA,OAAO,QAAQ,OAAO,KAAK,CAC5B,CACD,CACD;AACD,MAAa,YAAY,cAA0C;CAClE,IACC,UAAU,WAAW,KACrB,MAAM,KAAK,YAAY,EAAE,iBAAiB,WAAW,aAAa,OAAO,GAEzE,OAAO,OAAO,KACb,2BAA2B,KAAK,EAC/B,QAAQ,2DACT,CAAC,CACF;CACD,MAAM,UAAU,QAAQ,aACvB,MAAM,SACL,MAAM,IAAI,YAAY,EAAE,WACvB,KAAK,SAAS,WACX,OAAO,gBAAgB,KAAK,MAAM,IAClC,OAAO,KAAK,CAChB,CACD,CACD;CACA,OAAO,QAAQ,KAAK,OAAO,IAAI,IAC5B,OAAO,KACP,2BAA2B,KAAK,EAC/B,QAAQ,mDACT,CAAC,CACF,IACC,OAAO;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"loadModule.js","names":[],"sources":["../../src/internal/loadModule.ts"],"sourcesContent":["import { Cause, Effect } from \"effect\"\nimport { ModuleImportFailed } from \"./childErrors\"\n\n/** Native imports cannot be cancelled; late rejection still belongs to the importing context. */\nexport const loadModule = Effect.fn(\"Remote.loadModule\")(function* (\n\tmodule: string,\n) {\n\tconst context = yield* Effect.context<never>()\n\treturn yield* Effect.tryPromise({\n\t\ttry: (signal) =>\n\t\t\timport(module).catch((cause) => {\n\t\t\t\tif (signal.aborted)\n\t\t\t\t\tEffect.runSyncWith(context)(\n\t\t\t\t\t\tEffect.logError(\n\t\t\t\t\t\t\t\"Module import failed after cancellation\",\n\t\t\t\t\t\t\tCause.die(cause),\n\t\t\t\t\t\t).pipe(Effect.annotateLogs({ module })),\n\t\t\t\t\t)\n\t\t\t\tthrow cause\n\t\t\t}),\n\t\tcatch: (cause) => ModuleImportFailed.make({ module, cause }),\n\t})\n})\n"],"mappings":";;;;AAIA,MAAa,aAAa,OAAO,GAAG,mBAAmB,CAAC,CAAC,WACxD,QACC;CACD,MAAM,UAAU,OAAO,OAAO,QAAe;CAC7C,OAAO,OAAO,OAAO,WAAW;EAC/B,MAAM,WACL,OAAO,OAAO,CAAC,OAAO,UAAU;GAC/B,IAAI,OAAO,SACV,OAAO,YAAY,OAAO,CAAC,CAC1B,OAAO,SACN,2CACA,MAAM,IAAI,KAAK,CAChB,CAAC,CAAC,KAAK,OAAO,aAAa,EAAE,OAAO,CAAC,CAAC,CACvC;GACD,MAAM;EACP,CAAC;EACF,QAAQ,UAAU,mBAAmB,KAAK;GAAE;GAAQ;EAAM,CAAC;CAC5D,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"loadModule.js","names":[],"sources":["../../src/internal/loadModule.ts"],"sourcesContent":["import { Cause, Effect } from \"effect\"\n\nimport { ModuleImportFailed } from \"./childErrors\"\n\n/** Native imports cannot be cancelled; late rejection still belongs to the importing context. */\nexport const loadModule = Effect.fn(\"Remote.loadModule\")(function* (\n\tmodule: string,\n) {\n\tconst context = yield* Effect.context<never>()\n\treturn yield* Effect.tryPromise({\n\t\ttry: (signal) =>\n\t\t\timport(module).catch((cause) => {\n\t\t\t\tif (signal.aborted)\n\t\t\t\t\tEffect.runSyncWith(context)(\n\t\t\t\t\t\tEffect.logError(\n\t\t\t\t\t\t\t\"Module import failed after cancellation\",\n\t\t\t\t\t\t\tCause.die(cause),\n\t\t\t\t\t\t).pipe(Effect.annotateLogs({ module })),\n\t\t\t\t\t)\n\t\t\t\tthrow cause\n\t\t\t}),\n\t\tcatch: (cause) => ModuleImportFailed.make({ module, cause }),\n\t})\n})\n"],"mappings":";;;;AAKA,MAAa,aAAa,OAAO,GAAG,mBAAmB,CAAC,CAAC,WACxD,QACC;CACD,MAAM,UAAU,OAAO,OAAO,QAAe;CAC7C,OAAO,OAAO,OAAO,WAAW;EAC/B,MAAM,WACL,OAAO,OAAO,CAAC,OAAO,UAAU;GAC/B,IAAI,OAAO,SACV,OAAO,YAAY,OAAO,CAAC,CAC1B,OAAO,SACN,2CACA,MAAM,IAAI,KAAK,CAChB,CAAC,CAAC,KAAK,OAAO,aAAa,EAAE,OAAO,CAAC,CAAC,CACvC;GACD,MAAM;EACP,CAAC;EACF,QAAQ,UAAU,mBAAmB,KAAK;GAAE;GAAQ;EAAM,CAAC;CAC5D,CAAC;AACF,CAAC"}
@@ -1,9 +1 @@
1
- import { Layer } from "effect";
2
- import { Digest, SecureRandom, Signature } from "effect/crypto";
3
- import { NodeServices } from "@effect/platform-node";
4
- import { FetchHttpClient } from "effect/http";
5
- // src/internal/platform.ts
6
- const platform = Layer.mergeAll(NodeServices.layer, FetchHttpClient.layer, Digest.layerWebCrypto, SecureRandom.layerWebCrypto, Signature.layerWebCrypto.pipe(Layer.provide(SecureRandom.layerWebCrypto)));
7
- export { platform };
8
-
9
- //# sourceMappingURL=platform.js.map
1
+ export { platform } from "@graftland/cli/Application";
@@ -1,5 +1,5 @@
1
- import { Channel } from "../Transport.js";
2
1
  import "../Errors.js";
2
+ import { Channel } from "../Transport.js";
3
3
  import "./Limits.js";
4
4
  import { Context, Effect, Scope } from "effect";
5
5
  import { Rpc, RpcClient, RpcGroup, RpcServer } from "effect/rpc";
@@ -1,7 +1,7 @@
1
- import { EndOfStream } from "./runner/Framing.js";
2
- import { make as make$1 } from "./FailureGroup.js";
3
1
  import { TransportError } from "../Errors.js";
2
+ import { make as make$1 } from "./FailureGroup.js";
4
3
  import { defaults } from "./Limits.js";
4
+ import { EndOfStream } from "./runner/Framing.js";
5
5
  import { Array, Cause, Context, Data, Deferred, Effect, Fiber, HashMap, Option, Queue, Record, Result, Schema, Stream, TxQueue, TxRef } from "effect";
6
6
  import { RpcClient, RpcClientError, RpcSerialization, RpcServer } from "effect/rpc";
7
7
  // src/internal/port.ts
@@ -1 +1 @@
1
- {"version":3,"file":"port.js","names":["FailureGroup.make"],"sources":["../../src/internal/port.ts"],"sourcesContent":["import { EndOfStream } from \"./runner/Framing\"\nexport type { Channel } from \"../Transport\"\nimport type { Channel } from \"../Transport\"\nimport {\n\tArray,\n\tCause,\n\tContext,\n\tData,\n\tDeferred,\n\tEffect,\n\tFiber,\n\tHashMap,\n\tOption,\n\tQueue,\n\tRecord,\n\tResult,\n\tSchema,\n\ttype Scope,\n\tStream,\n\tTxQueue,\n\tTxRef,\n} from \"effect\"\nimport {\n\tRpcClient,\n\tRpcClientError,\n\tRpcSerialization,\n\tRpcServer,\n} from \"effect/rpc\"\nimport type { Rpc, RpcGroup, RpcMessage } from \"effect/rpc\"\nimport * as FailureGroup from \"./FailureGroup\"\nimport { TransportError } from \"../Errors\"\nimport { defaults, type Limits } from \"./Limits\"\nexport type Priority = keyof Limits\n\nexport const Priority = Context.Reference<Priority>(\n\t\"@graftland/plugin-remote/internal/port/Priority\",\n\t{ defaultValue: () => \"data\" },\n)\ntype Endpoint = Pick<RpcGroup.RpcGroup<Rpc.Any>, \"requests\">\n\nexport interface Options {\n\treadonly session: string\n\treadonly serve: Readonly<Record<string, Endpoint>>\n\treadonly call: Readonly<Record<string, Endpoint>>\n\t/** Limits are shared across endpoints, separately for each direction.\n\t * Each peer's inbound limits must accommodate the other's outbound limits. */\n\treadonly limits?: Partial<Record<Priority, number>>\n}\nexport interface Port {\n\treadonly clientProtocol: (endpoint: string) => RpcClient.Protocol[\"Service\"]\n\treadonly serverProtocol: (endpoint: string) => RpcServer.Protocol[\"Service\"]\n\treadonly await: Effect.Effect<never, TransportError>\n\treadonly fail: (error: TransportError) => Effect.Effect<void>\n\treadonly end: Effect.Effect<void, TransportError>\n}\nclass RequestKey extends Data.Class<{\n\treadonly endpoint: string\n\treadonly id: string | number\n}> {}\ninterface RequestState<A> {\n\treadonly queue: Queue.Queue<A, Cause.Done>\n\treadonly priority: Priority\n\treadonly sent: boolean\n}\nconst Frame = Schema.Struct({\n\tsession: Schema.String,\n\tendpoint: Schema.String,\n\tdirection: Schema.Literals([\"request\", \"response\"]),\n\tpriority: Schema.Literals([\"control\", \"data\", \"log\"]),\n\tmessage: Schema.Unknown,\n})\ntype Frame = typeof Frame.Type\ninterface Pending {\n\treadonly frame: Frame\n\treadonly request: Option.Option<RequestKey>\n}\nconst Id = Schema.Union([Schema.String, Schema.Finite])\n// Only routing fields belong to this transport. The RPC serialization codec\n// validates payloads, chunks and exits before handlers or callers see them. These\n// protocol callbacks are an opaque handoff, not validation of a complete RpcMessage.\n// EncodedSchema requires binary payloads\n// in Effect 4.1.2 and cannot describe these JSON codec messages.\nconst isRequest = Schema.is(\n\tSchema.Union([\n\t\tSchema.TaggedStruct(\"Request\", { id: Id, tag: Schema.String }),\n\t\tSchema.TaggedStruct(\"Ack\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Interrupt\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Eof\", {}),\n\t]),\n)\nconst isResponse = Schema.is(\n\tSchema.Union([\n\t\tSchema.TaggedStruct(\"Exit\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Chunk\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Defect\", { defect: Schema.Unknown }),\n\t]),\n)\nconst Request = Schema.declare<\n\tExclude<RpcMessage.FromClientEncoded, RpcMessage.Ping>\n>((input): input is Exclude<RpcMessage.FromClientEncoded, RpcMessage.Ping> =>\n\tisRequest(input),\n)\nconst Response = Schema.declare<\n\tExclude<\n\t\tRpcMessage.FromServerEncoded,\n\t\tRpcMessage.Pong | RpcMessage.ClientProtocolError | RpcMessage.RequestEncoded\n\t>\n>(\n\t(\n\t\tinput,\n\t): input is Exclude<\n\t\tRpcMessage.FromServerEncoded,\n\t\tRpcMessage.Pong | RpcMessage.ClientProtocolError | RpcMessage.RequestEncoded\n\t> => isResponse(input),\n)\nconst error = (message: string) =>\n\tTransportError.make({ cause: Cause.die(new Error(message)) })\nconst rpcError = (cause: Cause.Cause<TransportError>) =>\n\tRpcClientError.RpcClientError.make({\n\t\treason: RpcClientError.RpcClientDefect.make({\n\t\t\tmessage: \"Remote connection failed\",\n\t\t\tcause,\n\t\t}),\n\t})\nconst priority = (group: Endpoint, tag: string): Priority => {\n\tconst rpc = group.requests.get(tag)\n\treturn rpc === undefined ? \"data\" : Context.get(rpc.annotations, Priority)\n}\nconst mailbox = <A>(priority: Priority) =>\n\tQueue.dropping<A, Cause.Done>(2).pipe(\n\t\tEffect.map((queue): RequestState<A> => ({ queue, priority, sent: false })),\n\t)\nconst deliver = Effect.fnUntraced(function* <A>(\n\trequestState: RequestState<A>,\n\tmessage: A,\n) {\n\t// One unacknowledged chunk and its terminal Exit may coexist.\n\tif (!(yield* Queue.offer(requestState.queue, message)))\n\t\treturn yield* error(\"RPC request mailbox overflow\")\n})\n\ntype ServerEndpoint = {\n\treadonly group: Endpoint\n\treadonly ready: Deferred.Deferred<\n\t\tParameters<RpcServer.Protocol[\"Service\"][\"run\"]>[0]\n\t>\n\treadonly disconnects: Queue.Queue<number>\n}\ntype ClientEndpoint = {\n\treadonly group: Endpoint\n\treadonly ready: Deferred.Deferred<\n\t\tParameters<RpcClient.Protocol[\"Service\"][\"run\"]>[1]\n\t>\n}\ninterface State {\n\treadonly bytes: Channel\n\treadonly options: Options\n\treadonly limits: Record<Priority, number>\n\treadonly workers: FailureGroup.FailureGroup<TransportError>\n\treadonly incoming: TxRef.TxRef<\n\t\tHashMap.HashMap<RequestKey, RequestState<RpcMessage.FromClientEncoded>>\n\t>\n\treadonly outgoing: TxRef.TxRef<\n\t\tHashMap.HashMap<RequestKey, RequestState<RpcMessage.FromServerEncoded>>\n\t>\n\treadonly queues: Record<Priority, TxQueue.TxQueue<Pending, Cause.Done>>\n\treadonly servers: HashMap.HashMap<string, ServerEndpoint>\n\treadonly clients: HashMap.HashMap<string, ClientEndpoint>\n}\nconst initialize = Effect.fnUntraced(function* (\n\tbytes: Channel,\n\toptions: Options,\n): Effect.fn.Return<State, never, Scope.Scope> {\n\tconst limits = { ...defaults, ...options.limits }\n\tconst workers = yield* FailureGroup.make<TransportError>()\n\tconst incoming = yield* TxRef.make(\n\t\tHashMap.empty<RequestKey, RequestState<RpcMessage.FromClientEncoded>>(),\n\t)\n\tconst outgoing = yield* TxRef.make(\n\t\tHashMap.empty<RequestKey, RequestState<RpcMessage.FromServerEncoded>>(),\n\t)\n\tconst queues = {\n\t\tcontrol: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t\tdata: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t\tlog: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t}\n\tconst servers = yield* Effect.forEach(\n\t\tRecord.toEntries(options.serve),\n\t\tEffect.fnUntraced(function* ([name, group]) {\n\t\t\treturn [\n\t\t\t\tname,\n\t\t\t\t{\n\t\t\t\t\tgroup,\n\t\t\t\t\tready:\n\t\t\t\t\t\tyield* Deferred.make<\n\t\t\t\t\t\t\tParameters<RpcServer.Protocol[\"Service\"][\"run\"]>[0]\n\t\t\t\t\t\t>(),\n\t\t\t\t\tdisconnects: yield* Queue.dropping<number>(1),\n\t\t\t\t},\n\t\t\t] satisfies readonly [string, unknown]\n\t\t}),\n\t).pipe(Effect.map(HashMap.fromIterable))\n\tconst clients = yield* Effect.forEach(\n\t\tRecord.toEntries(options.call),\n\t\tEffect.fnUntraced(function* ([name, group]) {\n\t\t\treturn [\n\t\t\t\tname,\n\t\t\t\t{\n\t\t\t\t\tgroup,\n\t\t\t\t\tready:\n\t\t\t\t\t\tyield* Deferred.make<\n\t\t\t\t\t\t\tParameters<RpcClient.Protocol[\"Service\"][\"run\"]>[1]\n\t\t\t\t\t\t>(),\n\t\t\t\t},\n\t\t\t] satisfies readonly [string, unknown]\n\t\t}),\n\t).pipe(Effect.map(HashMap.fromIterable))\n\treturn {\n\t\tbytes,\n\t\toptions,\n\t\tlimits,\n\t\tworkers,\n\t\tincoming,\n\t\toutgoing,\n\t\tqueues,\n\t\tservers,\n\t\tclients,\n\t}\n})\n\nconst admit = Effect.fnUntraced(function* <A>(\n\tstate: State,\n\ttable: TxRef.TxRef<HashMap.HashMap<RequestKey, RequestState<A>>>,\n\tkey: RequestKey,\n\trequestState: RequestState<A>,\n\tdirection: \"incoming\" | \"outgoing\",\n) {\n\tyield* Effect.tx(\n\t\tEffect.gen(function* () {\n\t\t\tyield* state.workers.check\n\t\t\tconst current = yield* TxRef.get(table)\n\t\t\tconst count = Array.filter(\n\t\t\t\tArray.fromIterable(HashMap.values(current)),\n\t\t\t\t(entry) => entry.priority === requestState.priority,\n\t\t\t).length\n\t\t\tif (count >= state.limits[requestState.priority]) {\n\t\t\t\tif (direction === \"outgoing\") return yield* Effect.txRetry\n\t\t\t\treturn yield* error(\n\t\t\t\t\t`RPC admission limit exceeded for ${requestState.priority}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tyield* TxRef.set(table, HashMap.set(current, key, requestState))\n\t\t}),\n\t)\n})\nconst remove = Effect.fnUntraced(function* <A>(\n\ttable: TxRef.TxRef<HashMap.HashMap<RequestKey, RequestState<A>>>,\n\tkey: RequestKey,\n\trequestState: RequestState<A>,\n) {\n\tyield* TxRef.update(table, HashMap.remove(key))\n\tyield* Queue.end(requestState.queue)\n})\nconst enqueue = (\n\tstate: State,\n\tframe: Frame,\n\trequest: Option.Option<RequestKey> = Option.none(),\n) =>\n\tEffect.tx(\n\t\tstate.workers.check.pipe(\n\t\t\tEffect.andThen(\n\t\t\t\tTxQueue.offer(state.queues[frame.priority], { frame, request }).pipe(\n\t\t\t\t\tEffect.flatMap((accepted) =>\n\t\t\t\t\t\taccepted ? Effect.void : error(\"Remote output has ended\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t\tEffect.asVoid,\n\t\t),\n\t)\nconst frame = (\n\tstate: State,\n\tendpoint: string,\n\tdirection: Frame[\"direction\"],\n\tp: Priority,\n\tmessage: unknown,\n): Frame => ({\n\tsession: state.options.session,\n\tendpoint,\n\tdirection,\n\tpriority: p,\n\tmessage,\n})\n// Protocol sends are owned too: interrupting a caller cancels admission or enqueue.\nconst send = Effect.fnUntraced(function* (\n\tstate: State,\n\teffect: Effect.Effect<void, TransportError>,\n) {\n\tconst fiber = yield* state.workers.run(\n\t\tstate.workers.check.pipe(Effect.andThen(effect)),\n\t)\n\tconst result = yield* Fiber.await(fiber).pipe(\n\t\tEffect.onInterrupt(() => Fiber.interrupt(fiber)),\n\t)\n\t// Group teardown interrupts this worker; callers still receive the connection cause.\n\tyield* state.workers.check\n\tyield* result\n})\nconst cancel = Effect.fnUntraced(function* (state: State, key: RequestKey) {\n\tconst canceled = yield* Effect.tx(\n\t\tEffect.gen(function* () {\n\t\t\tconst table = yield* TxRef.get(state.outgoing)\n\t\t\tconst requestState = HashMap.get(table, key)\n\t\t\tif (Option.isNone(requestState))\n\t\t\t\treturn Option.none<RequestState<RpcMessage.FromServerEncoded>>()\n\t\t\tif (requestState.value.sent) {\n\t\t\t\tyield* enqueue(\n\t\t\t\t\tstate,\n\t\t\t\t\tframe(state, key.endpoint, \"request\", \"control\", {\n\t\t\t\t\t\t_tag: \"Interrupt\",\n\t\t\t\t\t\trequestId: key.id,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\treturn Option.none<RequestState<RpcMessage.FromServerEncoded>>()\n\t\t\t}\n\t\t\tyield* TxRef.set(state.outgoing, HashMap.remove(table, key))\n\t\t\treturn requestState\n\t\t}),\n\t)\n\tif (Option.isSome(canceled)) yield* Queue.end(canceled.value.queue)\n})\nconst clientProtocol = (\n\tstate: State,\n\tendpoint: string,\n): RpcClient.Protocol[\"Service\"] => {\n\t// Accessors accept endpoints declared when the port was created.\n\tconst client = Option.getOrThrow(HashMap.get(state.clients, endpoint))\n\treturn RpcClient.Protocol.of({\n\t\tcodecFor: RpcSerialization.json.codecFor,\n\t\tsupportsAck: true,\n\t\tsupportsTransferables: false,\n\t\trun: (_id, receive) =>\n\t\t\tDeferred.succeed(client.ready, receive).pipe(\n\t\t\t\tEffect.andThen(state.workers.await),\n\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\treceive({ _tag: \"ClientProtocolError\", error: rpcError(cause) }),\n\t\t\t\t),\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\tsend: (_id, message) =>\n\t\t\tsend(\n\t\t\t\tstate,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tif (message._tag === \"Request\") {\n\t\t\t\t\t\tif (message.discard === true || message.isNotification === true)\n\t\t\t\t\t\t\treturn yield* error(\n\t\t\t\t\t\t\t\t\"Discard and notification requests are not supported\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\tconst key = new RequestKey({ endpoint, id: message.id })\n\t\t\t\t\t\tconst requestState = yield* mailbox<RpcMessage.FromServerEncoded>(\n\t\t\t\t\t\t\tpriority(client.group, message.tag),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tyield* admit(state, state.outgoing, key, requestState, \"outgoing\")\n\t\t\t\t\t\tyield* state.workers.run(\n\t\t\t\t\t\t\tStream.fromQueue(requestState.queue).pipe(\n\t\t\t\t\t\t\t\tStream.runForEach(\n\t\t\t\t\t\t\t\t\tEffect.fnUntraced(function* (response) {\n\t\t\t\t\t\t\t\t\t\tconst receive = yield* Deferred.await(client.ready)\n\t\t\t\t\t\t\t\t\t\tif (response._tag === \"Exit\")\n\t\t\t\t\t\t\t\t\t\t\tyield* remove(state.outgoing, key, requestState)\n\t\t\t\t\t\t\t\t\t\tyield* receive(response)\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"request\", requestState.priority, message),\n\t\t\t\t\t\t\tOption.some(key),\n\t\t\t\t\t\t)\n\t\t\t\t\t} else if (message._tag === \"Interrupt\") {\n\t\t\t\t\t\tyield* cancel(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tnew RequestKey({ endpoint, id: message.requestId }),\n\t\t\t\t\t\t)\n\t\t\t\t\t} else if (message._tag === \"Ack\") {\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"request\", \"control\", message),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t).pipe(Effect.mapError((failure) => rpcError(Cause.fail(failure)))),\n\t})\n}\nconst serverProtocol = (\n\tstate: State,\n\tendpoint: string,\n): RpcServer.Protocol[\"Service\"] => {\n\t// Accessors accept endpoints declared when the port was created.\n\tconst server = Option.getOrThrow(HashMap.get(state.servers, endpoint))\n\treturn RpcServer.Protocol.of({\n\t\tcodecFor: RpcSerialization.json.codecFor,\n\t\tsupportsAck: true,\n\t\tsupportsTransferables: false,\n\t\tsupportsSpanPropagation: false,\n\t\tsupportsNotifications: false,\n\t\tclientIds: Effect.succeed(new Set([0])),\n\t\tinitialMessage: Effect.succeedNone,\n\t\tdisconnects: server.disconnects,\n\t\tend: () => Effect.void,\n\t\trun: (receive) =>\n\t\t\tDeferred.succeed(server.ready, receive).pipe(\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\tsend: (_id, message) =>\n\t\t\tsend(\n\t\t\t\tstate,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tif (message._tag === \"Chunk\" || message._tag === \"Exit\") {\n\t\t\t\t\t\tconst key = new RequestKey({ endpoint, id: message.requestId })\n\t\t\t\t\t\tconst requestState = yield* TxRef.get(state.incoming).pipe(\n\t\t\t\t\t\t\tEffect.map(HashMap.get(key)),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (Option.isNone(requestState)) return\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(\n\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\tendpoint,\n\t\t\t\t\t\t\t\t\"response\",\n\t\t\t\t\t\t\t\tmessage._tag === \"Exit\"\n\t\t\t\t\t\t\t\t\t? \"control\"\n\t\t\t\t\t\t\t\t\t: requestState.value.priority,\n\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (message._tag === \"Exit\")\n\t\t\t\t\t\t\tyield* remove(state.incoming, key, requestState.value)\n\t\t\t\t\t} else\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"response\", \"control\", message),\n\t\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t).pipe(\n\t\t\t\t// Disconnect already carries this cause to the server; late sends need no second failure.\n\t\t\t\tEffect.catchTag(\"TransportError\", () => Effect.void),\n\t\t\t),\n\t})\n}\nconst next = Effect.fnUntraced(function* (state: State) {\n\tyield* state.workers.check\n\tfor (const p of [\n\t\t\"control\",\n\t\t\"data\",\n\t\t\"log\",\n\t] satisfies ReadonlyArray<Priority>) {\n\t\tconst pending = yield* TxQueue.poll(state.queues[p])\n\t\tif (Option.isNone(pending)) continue\n\t\tconst { frame, request } = pending.value\n\t\tif (Option.isSome(request)) {\n\t\t\tconst table = yield* TxRef.get(state.outgoing)\n\t\t\tconst requestState = HashMap.get(table, request.value)\n\t\t\tif (Option.isNone(requestState)) return Option.none<Frame>()\n\t\t\tyield* TxRef.set(\n\t\t\t\tstate.outgoing,\n\t\t\t\tHashMap.set(table, request.value, {\n\t\t\t\t\t...requestState.value,\n\t\t\t\t\tsent: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn Option.some(frame)\n\t}\n\tif (\n\t\t(yield* TxQueue.isDone(state.queues.control)) &&\n\t\t(yield* TxQueue.isDone(state.queues.data)) &&\n\t\t(yield* TxQueue.isDone(state.queues.log))\n\t)\n\t\treturn yield* Cause.done()\n\treturn yield* Effect.txRetry\n}, Effect.tx)\nconst writer = (state: State) =>\n\tStream.fromEffectRepeat(next(state)).pipe(\n\t\tStream.filterMap(Result.fromOption(() => undefined)),\n\t\tStream.mapEffect((frame) =>\n\t\t\tSchema.encodeEffect(Schema.fromJsonString(Frame))(frame).pipe(\n\t\t\t\tEffect.mapError((cause) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tStream.map((json) => new TextEncoder().encode(json + \"\\n\")),\n\t\tStream.run(state.bytes.output),\n\t)\nconst read = Effect.fnUntraced(function* (state: State, raw: unknown) {\n\tconst current = yield* Schema.decodeUnknownEffect(Frame)(raw).pipe(\n\t\tEffect.mapError((cause) =>\n\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t),\n\t)\n\tif (current.session !== state.options.session) return\n\tif (current.direction === \"request\") {\n\t\tconst server = HashMap.get(state.servers, current.endpoint)\n\t\tif (Option.isNone(server))\n\t\t\treturn yield* error(`Unknown RPC server endpoint: ${current.endpoint}`)\n\t\tconst message = yield* Schema.decodeUnknownEffect(Request)(\n\t\t\tcurrent.message,\n\t\t).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t),\n\t\t)\n\t\tif (message._tag === \"Eof\")\n\t\t\treturn yield* TransportError.make({\n\t\t\t\tcause: Cause.fail(EndOfStream.make({})),\n\t\t\t})\n\t\tconst key = new RequestKey({\n\t\t\tendpoint: current.endpoint,\n\t\t\tid: message._tag === \"Request\" ? message.id : message.requestId,\n\t\t})\n\t\tif (message._tag === \"Request\") {\n\t\t\tconst p = priority(server.value.group, message.tag)\n\t\t\tconst requestState = yield* mailbox<RpcMessage.FromClientEncoded>(p)\n\t\t\tyield* admit(state, state.incoming, key, requestState, \"incoming\")\n\t\t\tyield* state.workers.run(\n\t\t\t\tStream.fromQueue(requestState.queue).pipe(\n\t\t\t\t\tStream.runForEach(\n\t\t\t\t\t\tEffect.fnUntraced(function* (request) {\n\t\t\t\t\t\t\tconst receive = yield* Deferred.await(server.value.ready)\n\t\t\t\t\t\t\tyield* receive(0, request)\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\tyield* deliver(requestState, message)\n\t\t} else {\n\t\t\tconst requestState = yield* TxRef.get(state.incoming).pipe(\n\t\t\t\tEffect.map(HashMap.get(key)),\n\t\t\t)\n\t\t\tif (Option.isSome(requestState))\n\t\t\t\tyield* deliver(requestState.value, message)\n\t\t}\n\t} else {\n\t\tconst message = yield* Schema.decodeUnknownEffect(Response)(\n\t\t\tcurrent.message,\n\t\t).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t),\n\t\t)\n\t\tif (message._tag === \"Defect\")\n\t\t\treturn yield* TransportError.make({ cause: Cause.die(message.defect) })\n\t\tconst key = new RequestKey({\n\t\t\tendpoint: current.endpoint,\n\t\t\tid: message.requestId,\n\t\t})\n\t\tconst requestState = yield* TxRef.get(state.outgoing).pipe(\n\t\t\tEffect.map(HashMap.get(key)),\n\t\t)\n\t\tif (Option.isSome(requestState)) yield* deliver(requestState.value, message)\n\t}\n})\nconst reader = (state: State) =>\n\tstate.bytes.input.pipe(\n\t\tStream.decodeText(),\n\t\tStream.splitLines,\n\t\tStream.filter((line) => line.length > 0),\n\t\tStream.mapEffect((line) =>\n\t\t\tSchema.decodeEffect(Schema.fromJsonString(Schema.Unknown))(line).pipe(\n\t\t\t\tEffect.mapError((cause) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tStream.runForEach((raw) => read(state, raw)),\n\t\tEffect.andThen(\n\t\t\tEffect.fail(\n\t\t\t\tTransportError.make({ cause: Cause.fail(EndOfStream.make({})) }),\n\t\t\t),\n\t\t),\n\t)\n\n/** One RPC client/server per declared endpoint; servers may start after the port. */\nexport const make = Effect.fnUntraced(function* (\n\tbytes: Channel,\n\toptions: Options,\n): Effect.fn.Return<Port, never, import(\"effect\").Scope.Scope> {\n\tconst state = yield* initialize(bytes, options)\n\t// The same failure remains observable through Port.await and client requests.\n\t// This observer only publishes disconnects, even while the owner closes its scope.\n\tyield* state.workers.await.pipe(\n\t\tEffect.catchCause(\n\t\t\tEffect.fnUntraced(function* () {\n\t\t\t\tfor (const server of HashMap.values(state.servers))\n\t\t\t\t\tyield* Queue.offer(server.disconnects, 0)\n\t\t\t\tyield* Effect.tx(\n\t\t\t\t\tTxRef.set(state.incoming, HashMap.empty()).pipe(\n\t\t\t\t\t\tEffect.andThen(TxRef.set(state.outgoing, HashMap.empty())),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}, Effect.uninterruptible),\n\t\t),\n\t\tEffect.forkScoped,\n\t)\n\tconst writing = yield* state.workers.run(writer(state))\n\tyield* state.workers.run(reader(state))\n\treturn {\n\t\tclientProtocol: (endpoint) => clientProtocol(state, endpoint),\n\t\tserverProtocol: (endpoint) => serverProtocol(state, endpoint),\n\t\tawait: state.workers.await,\n\t\tfail: state.workers.fail,\n\t\tend: Effect.tx(\n\t\t\tEffect.forEach(Record.values(state.queues), TxQueue.end, {\n\t\t\t\tdiscard: true,\n\t\t\t}),\n\t\t).pipe(Effect.andThen(Fiber.join(writing))),\n\t}\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"port.js","names":["FailureGroup.make"],"sources":["../../src/internal/port.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tContext,\n\tData,\n\tDeferred,\n\tEffect,\n\tFiber,\n\tHashMap,\n\tOption,\n\tQueue,\n\tRecord,\n\tResult,\n\tSchema,\n\tStream,\n\tTxQueue,\n\tTxRef,\n\ttype Scope,\n} from \"effect\"\nimport {\n\tRpcClient,\n\tRpcClientError,\n\tRpcSerialization,\n\tRpcServer,\n\ttype Rpc,\n\ttype RpcGroup,\n\ttype RpcMessage,\n} from \"effect/rpc\"\n\nimport { TransportError } from \"../Errors\"\nimport type { Channel } from \"../Transport\"\nimport * as FailureGroup from \"./FailureGroup\"\nimport { defaults, type Limits } from \"./Limits\"\nimport { EndOfStream } from \"./runner/Framing\"\n\nexport type { Channel } from \"../Transport\"\n\nexport type Priority = keyof Limits\n\nexport const Priority = Context.Reference<Priority>(\n\t\"@graftland/plugin-remote/internal/port/Priority\",\n\t{ defaultValue: () => \"data\" },\n)\ntype Endpoint = Pick<RpcGroup.RpcGroup<Rpc.Any>, \"requests\">\n\nexport interface Options {\n\treadonly session: string\n\treadonly serve: Readonly<Record<string, Endpoint>>\n\treadonly call: Readonly<Record<string, Endpoint>>\n\t/** Limits are shared across endpoints, separately for each direction.\n\t * Each peer's inbound limits must accommodate the other's outbound limits. */\n\treadonly limits?: Partial<Record<Priority, number>>\n}\nexport interface Port {\n\treadonly clientProtocol: (endpoint: string) => RpcClient.Protocol[\"Service\"]\n\treadonly serverProtocol: (endpoint: string) => RpcServer.Protocol[\"Service\"]\n\treadonly await: Effect.Effect<never, TransportError>\n\treadonly fail: (error: TransportError) => Effect.Effect<void>\n\treadonly end: Effect.Effect<void, TransportError>\n}\nclass RequestKey extends Data.Class<{\n\treadonly endpoint: string\n\treadonly id: string | number\n}> {}\ninterface RequestState<A> {\n\treadonly queue: Queue.Queue<A, Cause.Done>\n\treadonly priority: Priority\n\treadonly sent: boolean\n}\nconst Frame = Schema.Struct({\n\tsession: Schema.String,\n\tendpoint: Schema.String,\n\tdirection: Schema.Literals([\"request\", \"response\"]),\n\tpriority: Schema.Literals([\"control\", \"data\", \"log\"]),\n\tmessage: Schema.Unknown,\n})\ntype Frame = typeof Frame.Type\ninterface Pending {\n\treadonly frame: Frame\n\treadonly request: Option.Option<RequestKey>\n}\nconst Id = Schema.Union([Schema.String, Schema.Finite])\n// Only routing fields belong to this transport. The RPC serialization codec\n// validates payloads, chunks and exits before handlers or callers see them. These\n// protocol callbacks are an opaque handoff, not validation of a complete RpcMessage.\n// EncodedSchema requires binary payloads\n// in Effect 4.1.2 and cannot describe these JSON codec messages.\nconst isRequest = Schema.is(\n\tSchema.Union([\n\t\tSchema.TaggedStruct(\"Request\", { id: Id, tag: Schema.String }),\n\t\tSchema.TaggedStruct(\"Ack\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Interrupt\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Eof\", {}),\n\t]),\n)\nconst isResponse = Schema.is(\n\tSchema.Union([\n\t\tSchema.TaggedStruct(\"Exit\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Chunk\", { requestId: Id }),\n\t\tSchema.TaggedStruct(\"Defect\", { defect: Schema.Unknown }),\n\t]),\n)\nconst Request = Schema.declare<\n\tExclude<RpcMessage.FromClientEncoded, RpcMessage.Ping>\n>((input): input is Exclude<RpcMessage.FromClientEncoded, RpcMessage.Ping> =>\n\tisRequest(input),\n)\nconst Response = Schema.declare<\n\tExclude<\n\t\tRpcMessage.FromServerEncoded,\n\t\tRpcMessage.Pong | RpcMessage.ClientProtocolError | RpcMessage.RequestEncoded\n\t>\n>(\n\t(\n\t\tinput,\n\t): input is Exclude<\n\t\tRpcMessage.FromServerEncoded,\n\t\tRpcMessage.Pong | RpcMessage.ClientProtocolError | RpcMessage.RequestEncoded\n\t> => isResponse(input),\n)\nconst error = (message: string) =>\n\tTransportError.make({ cause: Cause.die(new Error(message)) })\nconst rpcError = (cause: Cause.Cause<TransportError>) =>\n\tRpcClientError.RpcClientError.make({\n\t\treason: RpcClientError.RpcClientDefect.make({\n\t\t\tmessage: \"Remote connection failed\",\n\t\t\tcause,\n\t\t}),\n\t})\nconst priority = (group: Endpoint, tag: string): Priority => {\n\tconst rpc = group.requests.get(tag)\n\treturn rpc === undefined ? \"data\" : Context.get(rpc.annotations, Priority)\n}\nconst mailbox = <A>(priority: Priority) =>\n\tQueue.dropping<A, Cause.Done>(2).pipe(\n\t\tEffect.map((queue): RequestState<A> => ({ queue, priority, sent: false })),\n\t)\nconst deliver = Effect.fnUntraced(function* <A>(\n\trequestState: RequestState<A>,\n\tmessage: A,\n) {\n\t// One unacknowledged chunk and its terminal Exit may coexist.\n\tif (!(yield* Queue.offer(requestState.queue, message)))\n\t\treturn yield* error(\"RPC request mailbox overflow\")\n})\n\ntype ServerEndpoint = {\n\treadonly group: Endpoint\n\treadonly ready: Deferred.Deferred<\n\t\tParameters<RpcServer.Protocol[\"Service\"][\"run\"]>[0]\n\t>\n\treadonly disconnects: Queue.Queue<number>\n}\ntype ClientEndpoint = {\n\treadonly group: Endpoint\n\treadonly ready: Deferred.Deferred<\n\t\tParameters<RpcClient.Protocol[\"Service\"][\"run\"]>[1]\n\t>\n}\ninterface State {\n\treadonly bytes: Channel\n\treadonly options: Options\n\treadonly limits: Record<Priority, number>\n\treadonly workers: FailureGroup.FailureGroup<TransportError>\n\treadonly incoming: TxRef.TxRef<\n\t\tHashMap.HashMap<RequestKey, RequestState<RpcMessage.FromClientEncoded>>\n\t>\n\treadonly outgoing: TxRef.TxRef<\n\t\tHashMap.HashMap<RequestKey, RequestState<RpcMessage.FromServerEncoded>>\n\t>\n\treadonly queues: Record<Priority, TxQueue.TxQueue<Pending, Cause.Done>>\n\treadonly servers: HashMap.HashMap<string, ServerEndpoint>\n\treadonly clients: HashMap.HashMap<string, ClientEndpoint>\n}\nconst initialize = Effect.fnUntraced(function* (\n\tbytes: Channel,\n\toptions: Options,\n): Effect.fn.Return<State, never, Scope.Scope> {\n\tconst limits = { ...defaults, ...options.limits }\n\tconst workers = yield* FailureGroup.make<TransportError>()\n\tconst incoming = yield* TxRef.make(\n\t\tHashMap.empty<RequestKey, RequestState<RpcMessage.FromClientEncoded>>(),\n\t)\n\tconst outgoing = yield* TxRef.make(\n\t\tHashMap.empty<RequestKey, RequestState<RpcMessage.FromServerEncoded>>(),\n\t)\n\tconst queues = {\n\t\tcontrol: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t\tdata: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t\tlog: yield* TxQueue.unbounded<Pending, Cause.Done>(),\n\t}\n\tconst servers = yield* Effect.forEach(\n\t\tRecord.toEntries(options.serve),\n\t\tEffect.fnUntraced(function* ([name, group]) {\n\t\t\treturn [\n\t\t\t\tname,\n\t\t\t\t{\n\t\t\t\t\tgroup,\n\t\t\t\t\tready:\n\t\t\t\t\t\tyield* Deferred.make<\n\t\t\t\t\t\t\tParameters<RpcServer.Protocol[\"Service\"][\"run\"]>[0]\n\t\t\t\t\t\t>(),\n\t\t\t\t\tdisconnects: yield* Queue.dropping<number>(1),\n\t\t\t\t},\n\t\t\t] satisfies readonly [string, unknown]\n\t\t}),\n\t).pipe(Effect.map(HashMap.fromIterable))\n\tconst clients = yield* Effect.forEach(\n\t\tRecord.toEntries(options.call),\n\t\tEffect.fnUntraced(function* ([name, group]) {\n\t\t\treturn [\n\t\t\t\tname,\n\t\t\t\t{\n\t\t\t\t\tgroup,\n\t\t\t\t\tready:\n\t\t\t\t\t\tyield* Deferred.make<\n\t\t\t\t\t\t\tParameters<RpcClient.Protocol[\"Service\"][\"run\"]>[1]\n\t\t\t\t\t\t>(),\n\t\t\t\t},\n\t\t\t] satisfies readonly [string, unknown]\n\t\t}),\n\t).pipe(Effect.map(HashMap.fromIterable))\n\treturn {\n\t\tbytes,\n\t\toptions,\n\t\tlimits,\n\t\tworkers,\n\t\tincoming,\n\t\toutgoing,\n\t\tqueues,\n\t\tservers,\n\t\tclients,\n\t}\n})\n\nconst admit = Effect.fnUntraced(function* <A>(\n\tstate: State,\n\ttable: TxRef.TxRef<HashMap.HashMap<RequestKey, RequestState<A>>>,\n\tkey: RequestKey,\n\trequestState: RequestState<A>,\n\tdirection: \"incoming\" | \"outgoing\",\n) {\n\tyield* Effect.tx(\n\t\tEffect.gen(function* () {\n\t\t\tyield* state.workers.check\n\t\t\tconst current = yield* TxRef.get(table)\n\t\t\tconst count = Array.filter(\n\t\t\t\tArray.fromIterable(HashMap.values(current)),\n\t\t\t\t(entry) => entry.priority === requestState.priority,\n\t\t\t).length\n\t\t\tif (count >= state.limits[requestState.priority]) {\n\t\t\t\tif (direction === \"outgoing\") return yield* Effect.txRetry\n\t\t\t\treturn yield* error(\n\t\t\t\t\t`RPC admission limit exceeded for ${requestState.priority}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tyield* TxRef.set(table, HashMap.set(current, key, requestState))\n\t\t}),\n\t)\n})\nconst remove = Effect.fnUntraced(function* <A>(\n\ttable: TxRef.TxRef<HashMap.HashMap<RequestKey, RequestState<A>>>,\n\tkey: RequestKey,\n\trequestState: RequestState<A>,\n) {\n\tyield* TxRef.update(table, HashMap.remove(key))\n\tyield* Queue.end(requestState.queue)\n})\nconst enqueue = (\n\tstate: State,\n\tframe: Frame,\n\trequest: Option.Option<RequestKey> = Option.none(),\n) =>\n\tEffect.tx(\n\t\tstate.workers.check.pipe(\n\t\t\tEffect.andThen(\n\t\t\t\tTxQueue.offer(state.queues[frame.priority], { frame, request }).pipe(\n\t\t\t\t\tEffect.flatMap((accepted) =>\n\t\t\t\t\t\taccepted ? Effect.void : error(\"Remote output has ended\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t\tEffect.asVoid,\n\t\t),\n\t)\nconst frame = (\n\tstate: State,\n\tendpoint: string,\n\tdirection: Frame[\"direction\"],\n\tp: Priority,\n\tmessage: unknown,\n): Frame => ({\n\tsession: state.options.session,\n\tendpoint,\n\tdirection,\n\tpriority: p,\n\tmessage,\n})\n// Protocol sends are owned too: interrupting a caller cancels admission or enqueue.\nconst send = Effect.fnUntraced(function* (\n\tstate: State,\n\teffect: Effect.Effect<void, TransportError>,\n) {\n\tconst fiber = yield* state.workers.run(\n\t\tstate.workers.check.pipe(Effect.andThen(effect)),\n\t)\n\tconst result = yield* Fiber.await(fiber).pipe(\n\t\tEffect.onInterrupt(() => Fiber.interrupt(fiber)),\n\t)\n\t// Group teardown interrupts this worker; callers still receive the connection cause.\n\tyield* state.workers.check\n\tyield* result\n})\nconst cancel = Effect.fnUntraced(function* (state: State, key: RequestKey) {\n\tconst canceled = yield* Effect.tx(\n\t\tEffect.gen(function* () {\n\t\t\tconst table = yield* TxRef.get(state.outgoing)\n\t\t\tconst requestState = HashMap.get(table, key)\n\t\t\tif (Option.isNone(requestState))\n\t\t\t\treturn Option.none<RequestState<RpcMessage.FromServerEncoded>>()\n\t\t\tif (requestState.value.sent) {\n\t\t\t\tyield* enqueue(\n\t\t\t\t\tstate,\n\t\t\t\t\tframe(state, key.endpoint, \"request\", \"control\", {\n\t\t\t\t\t\t_tag: \"Interrupt\",\n\t\t\t\t\t\trequestId: key.id,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\treturn Option.none<RequestState<RpcMessage.FromServerEncoded>>()\n\t\t\t}\n\t\t\tyield* TxRef.set(state.outgoing, HashMap.remove(table, key))\n\t\t\treturn requestState\n\t\t}),\n\t)\n\tif (Option.isSome(canceled)) yield* Queue.end(canceled.value.queue)\n})\nconst clientProtocol = (\n\tstate: State,\n\tendpoint: string,\n): RpcClient.Protocol[\"Service\"] => {\n\t// Accessors accept endpoints declared when the port was created.\n\tconst client = Option.getOrThrow(HashMap.get(state.clients, endpoint))\n\treturn RpcClient.Protocol.of({\n\t\tcodecFor: RpcSerialization.json.codecFor,\n\t\tsupportsAck: true,\n\t\tsupportsTransferables: false,\n\t\trun: (_id, receive) =>\n\t\t\tDeferred.succeed(client.ready, receive).pipe(\n\t\t\t\tEffect.andThen(state.workers.await),\n\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\treceive({ _tag: \"ClientProtocolError\", error: rpcError(cause) }),\n\t\t\t\t),\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\tsend: (_id, message) =>\n\t\t\tsend(\n\t\t\t\tstate,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tif (message._tag === \"Request\") {\n\t\t\t\t\t\tif (message.discard === true || message.isNotification === true)\n\t\t\t\t\t\t\treturn yield* error(\n\t\t\t\t\t\t\t\t\"Discard and notification requests are not supported\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\tconst key = new RequestKey({ endpoint, id: message.id })\n\t\t\t\t\t\tconst requestState = yield* mailbox<RpcMessage.FromServerEncoded>(\n\t\t\t\t\t\t\tpriority(client.group, message.tag),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tyield* admit(state, state.outgoing, key, requestState, \"outgoing\")\n\t\t\t\t\t\tyield* state.workers.run(\n\t\t\t\t\t\t\tStream.fromQueue(requestState.queue).pipe(\n\t\t\t\t\t\t\t\tStream.runForEach(\n\t\t\t\t\t\t\t\t\tEffect.fnUntraced(function* (response) {\n\t\t\t\t\t\t\t\t\t\tconst receive = yield* Deferred.await(client.ready)\n\t\t\t\t\t\t\t\t\t\tif (response._tag === \"Exit\")\n\t\t\t\t\t\t\t\t\t\t\tyield* remove(state.outgoing, key, requestState)\n\t\t\t\t\t\t\t\t\t\tyield* receive(response)\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"request\", requestState.priority, message),\n\t\t\t\t\t\t\tOption.some(key),\n\t\t\t\t\t\t)\n\t\t\t\t\t} else if (message._tag === \"Interrupt\") {\n\t\t\t\t\t\tyield* cancel(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tnew RequestKey({ endpoint, id: message.requestId }),\n\t\t\t\t\t\t)\n\t\t\t\t\t} else if (message._tag === \"Ack\") {\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"request\", \"control\", message),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t).pipe(Effect.mapError((failure) => rpcError(Cause.fail(failure)))),\n\t})\n}\nconst serverProtocol = (\n\tstate: State,\n\tendpoint: string,\n): RpcServer.Protocol[\"Service\"] => {\n\t// Accessors accept endpoints declared when the port was created.\n\tconst server = Option.getOrThrow(HashMap.get(state.servers, endpoint))\n\treturn RpcServer.Protocol.of({\n\t\tcodecFor: RpcSerialization.json.codecFor,\n\t\tsupportsAck: true,\n\t\tsupportsTransferables: false,\n\t\tsupportsSpanPropagation: false,\n\t\tsupportsNotifications: false,\n\t\tclientIds: Effect.succeed(new Set([0])),\n\t\tinitialMessage: Effect.succeedNone,\n\t\tdisconnects: server.disconnects,\n\t\tend: () => Effect.void,\n\t\trun: (receive) =>\n\t\t\tDeferred.succeed(server.ready, receive).pipe(\n\t\t\t\tEffect.andThen(Effect.never),\n\t\t\t),\n\t\tsend: (_id, message) =>\n\t\t\tsend(\n\t\t\t\tstate,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tif (message._tag === \"Chunk\" || message._tag === \"Exit\") {\n\t\t\t\t\t\tconst key = new RequestKey({ endpoint, id: message.requestId })\n\t\t\t\t\t\tconst requestState = yield* TxRef.get(state.incoming).pipe(\n\t\t\t\t\t\t\tEffect.map(HashMap.get(key)),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (Option.isNone(requestState)) return\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(\n\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\tendpoint,\n\t\t\t\t\t\t\t\t\"response\",\n\t\t\t\t\t\t\t\tmessage._tag === \"Exit\"\n\t\t\t\t\t\t\t\t\t? \"control\"\n\t\t\t\t\t\t\t\t\t: requestState.value.priority,\n\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (message._tag === \"Exit\")\n\t\t\t\t\t\t\tyield* remove(state.incoming, key, requestState.value)\n\t\t\t\t\t} else\n\t\t\t\t\t\tyield* enqueue(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tframe(state, endpoint, \"response\", \"control\", message),\n\t\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t).pipe(\n\t\t\t\t// Disconnect already carries this cause to the server; late sends need no second failure.\n\t\t\t\tEffect.catchTag(\"TransportError\", () => Effect.void),\n\t\t\t),\n\t})\n}\nconst next = Effect.fnUntraced(function* (state: State) {\n\tyield* state.workers.check\n\tfor (const p of [\n\t\t\"control\",\n\t\t\"data\",\n\t\t\"log\",\n\t] satisfies ReadonlyArray<Priority>) {\n\t\tconst pending = yield* TxQueue.poll(state.queues[p])\n\t\tif (Option.isNone(pending)) continue\n\t\tconst { frame, request } = pending.value\n\t\tif (Option.isSome(request)) {\n\t\t\tconst table = yield* TxRef.get(state.outgoing)\n\t\t\tconst requestState = HashMap.get(table, request.value)\n\t\t\tif (Option.isNone(requestState)) return Option.none<Frame>()\n\t\t\tyield* TxRef.set(\n\t\t\t\tstate.outgoing,\n\t\t\t\tHashMap.set(table, request.value, {\n\t\t\t\t\t...requestState.value,\n\t\t\t\t\tsent: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn Option.some(frame)\n\t}\n\tif (\n\t\t(yield* TxQueue.isDone(state.queues.control)) &&\n\t\t(yield* TxQueue.isDone(state.queues.data)) &&\n\t\t(yield* TxQueue.isDone(state.queues.log))\n\t)\n\t\treturn yield* Cause.done()\n\treturn yield* Effect.txRetry\n}, Effect.tx)\nconst writer = (state: State) =>\n\tStream.fromEffectRepeat(next(state)).pipe(\n\t\tStream.filterMap(Result.fromOption(() => undefined)),\n\t\tStream.mapEffect((frame) =>\n\t\t\tSchema.encodeEffect(Schema.fromJsonString(Frame))(frame).pipe(\n\t\t\t\tEffect.mapError((cause) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tStream.map((json) => new TextEncoder().encode(json + \"\\n\")),\n\t\tStream.run(state.bytes.output),\n\t)\nconst read = Effect.fnUntraced(function* (state: State, raw: unknown) {\n\tconst current = yield* Schema.decodeUnknownEffect(Frame)(raw).pipe(\n\t\tEffect.mapError((cause) =>\n\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t),\n\t)\n\tif (current.session !== state.options.session) return\n\tif (current.direction === \"request\") {\n\t\tconst server = HashMap.get(state.servers, current.endpoint)\n\t\tif (Option.isNone(server))\n\t\t\treturn yield* error(`Unknown RPC server endpoint: ${current.endpoint}`)\n\t\tconst message = yield* Schema.decodeUnknownEffect(Request)(\n\t\t\tcurrent.message,\n\t\t).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t),\n\t\t)\n\t\tif (message._tag === \"Eof\")\n\t\t\treturn yield* TransportError.make({\n\t\t\t\tcause: Cause.fail(EndOfStream.make({})),\n\t\t\t})\n\t\tconst key = new RequestKey({\n\t\t\tendpoint: current.endpoint,\n\t\t\tid: message._tag === \"Request\" ? message.id : message.requestId,\n\t\t})\n\t\tif (message._tag === \"Request\") {\n\t\t\tconst p = priority(server.value.group, message.tag)\n\t\t\tconst requestState = yield* mailbox<RpcMessage.FromClientEncoded>(p)\n\t\t\tyield* admit(state, state.incoming, key, requestState, \"incoming\")\n\t\t\tyield* state.workers.run(\n\t\t\t\tStream.fromQueue(requestState.queue).pipe(\n\t\t\t\t\tStream.runForEach(\n\t\t\t\t\t\tEffect.fnUntraced(function* (request) {\n\t\t\t\t\t\t\tconst receive = yield* Deferred.await(server.value.ready)\n\t\t\t\t\t\t\tyield* receive(0, request)\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\tyield* deliver(requestState, message)\n\t\t} else {\n\t\t\tconst requestState = yield* TxRef.get(state.incoming).pipe(\n\t\t\t\tEffect.map(HashMap.get(key)),\n\t\t\t)\n\t\t\tif (Option.isSome(requestState))\n\t\t\t\tyield* deliver(requestState.value, message)\n\t\t}\n\t} else {\n\t\tconst message = yield* Schema.decodeUnknownEffect(Response)(\n\t\t\tcurrent.message,\n\t\t).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t),\n\t\t)\n\t\tif (message._tag === \"Defect\")\n\t\t\treturn yield* TransportError.make({ cause: Cause.die(message.defect) })\n\t\tconst key = new RequestKey({\n\t\t\tendpoint: current.endpoint,\n\t\t\tid: message.requestId,\n\t\t})\n\t\tconst requestState = yield* TxRef.get(state.outgoing).pipe(\n\t\t\tEffect.map(HashMap.get(key)),\n\t\t)\n\t\tif (Option.isSome(requestState)) yield* deliver(requestState.value, message)\n\t}\n})\nconst reader = (state: State) =>\n\tstate.bytes.input.pipe(\n\t\tStream.decodeText(),\n\t\tStream.splitLines,\n\t\tStream.filter((line) => line.length > 0),\n\t\tStream.mapEffect((line) =>\n\t\t\tSchema.decodeEffect(Schema.fromJsonString(Schema.Unknown))(line).pipe(\n\t\t\t\tEffect.mapError((cause) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(cause) }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tStream.runForEach((raw) => read(state, raw)),\n\t\tEffect.andThen(\n\t\t\tEffect.fail(\n\t\t\t\tTransportError.make({ cause: Cause.fail(EndOfStream.make({})) }),\n\t\t\t),\n\t\t),\n\t)\n\n/** One RPC client/server per declared endpoint; servers may start after the port. */\nexport const make = Effect.fnUntraced(function* (\n\tbytes: Channel,\n\toptions: Options,\n): Effect.fn.Return<Port, never, import(\"effect\").Scope.Scope> {\n\tconst state = yield* initialize(bytes, options)\n\t// The same failure remains observable through Port.await and client requests.\n\t// This observer only publishes disconnects, even while the owner closes its scope.\n\tyield* state.workers.await.pipe(\n\t\tEffect.catchCause(\n\t\t\tEffect.fnUntraced(function* () {\n\t\t\t\tfor (const server of HashMap.values(state.servers))\n\t\t\t\t\tyield* Queue.offer(server.disconnects, 0)\n\t\t\t\tyield* Effect.tx(\n\t\t\t\t\tTxRef.set(state.incoming, HashMap.empty()).pipe(\n\t\t\t\t\t\tEffect.andThen(TxRef.set(state.outgoing, HashMap.empty())),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}, Effect.uninterruptible),\n\t\t),\n\t\tEffect.forkScoped,\n\t)\n\tconst writing = yield* state.workers.run(writer(state))\n\tyield* state.workers.run(reader(state))\n\treturn {\n\t\tclientProtocol: (endpoint) => clientProtocol(state, endpoint),\n\t\tserverProtocol: (endpoint) => serverProtocol(state, endpoint),\n\t\tawait: state.workers.await,\n\t\tfail: state.workers.fail,\n\t\tend: Effect.tx(\n\t\t\tEffect.forEach(Record.values(state.queues), TxQueue.end, {\n\t\t\t\tdiscard: true,\n\t\t\t}),\n\t\t).pipe(Effect.andThen(Fiber.join(writing))),\n\t}\n})\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Bootstrap.js","names":[],"sources":["../../../src/internal/runner/Bootstrap.ts"],"sourcesContent":["import { Schema } from \"effect\"\nimport { Identity } from \"../../Instance\"\nimport { Limits } from \"./model\"\n\nexport const Bootstrap = Schema.Struct({\n\tidentity: Identity,\n\tlimits: Limits,\n})\nexport type Bootstrap = typeof Bootstrap.Type\n"],"mappings":";;;;AAIA,MAAa,YAAY,OAAO,OAAO;CACtC,UAAU;CACV,QAAQ;AACT,CAAC"}
1
+ {"version":3,"file":"Bootstrap.js","names":[],"sources":["../../../src/internal/runner/Bootstrap.ts"],"sourcesContent":["import { Schema } from \"effect\"\n\nimport { Identity } from \"../../Instance\"\nimport { Limits } from \"./model\"\n\nexport const Bootstrap = Schema.Struct({\n\tidentity: Identity,\n\tlimits: Limits,\n})\nexport type Bootstrap = typeof Bootstrap.Type\n"],"mappings":";;;;AAKA,MAAa,YAAY,OAAO,OAAO;CACtC,UAAU;CACV,QAAQ;AACT,CAAC"}
@@ -1,11 +1,12 @@
1
1
  import "../assembly.js";
2
- import "../../Errors.js";
2
+ import "../../index.js";
3
3
  import "./model.js";
4
4
  import "../../Transport.js";
5
5
  import "../../Auth.js";
6
+ import "../../Errors.js";
6
7
  import "../directTransport.js";
7
- import "./Packages.js";
8
8
  import "../port.js";
9
+ import "./Packages.js";
9
10
  import "./Wire.js";
10
11
  import { Cause, Context, Duration, Effect, Option, PlatformError, Schema, Scope } from "effect";
11
12
  import { RpcClientError } from "effect/rpc";
@@ -1,9 +1,9 @@
1
+ import { cleanupCause } from "../cleanup.js";
1
2
  import { LocalTransport, WorkerTransport } from "../directTransport.js";
2
3
  import { connect } from "../host/runner.js";
3
- import { close } from "../release.js";
4
- import { cleanupCause } from "../cleanup.js";
5
4
  import { connect as connect$1 } from "./Local.js";
6
5
  import { Array, Cause, Context, Effect, Exit, Scope } from "effect";
6
+ import * as Release from "@graftland/graft/Release";
7
7
  // src/internal/runner/Connection.ts
8
8
  var Connection = class extends Context.Service()("@graftland/plugin-remote/internal/runner/Connection") {};
9
9
  const connected = Connection.of;
@@ -25,8 +25,8 @@ const scopes = Effect.acquireRelease(Effect.all({
25
25
  resources: Scope.make(),
26
26
  process: Scope.make()
27
27
  }), Effect.fnUntraced(function* (scopes, exit) {
28
- const process = yield* Effect.exit(close(scopes.process, exit));
29
- const resources = yield* Effect.exit(close(scopes.resources, exit));
28
+ const process = yield* Effect.exit(Release.close(scopes.process, exit));
29
+ const resources = yield* Effect.exit(Release.close(scopes.resources, exit));
30
30
  yield* finish([reason(process), reason(resources)]);
31
31
  }));
32
32
  /** Setup supplies a concrete control lifecycle; release never reads a later-installed effect. */
@@ -35,9 +35,9 @@ const acquire = Effect.fnUntraced(function* (target, contractModule, options, se
35
35
  const connection = yield* Effect.acquireRelease(Effect.gen(function* () {
36
36
  return target._tag === "Local" || target._tag === "Worker" ? yield* Local(target, contractModule, options, owned.resources, owned.process).pipe(Effect.map(connected)) : yield* connect(target, contractModule, options, owned.resources, owned.process);
37
37
  }).pipe(Effect.interruptible), Effect.fnUntraced(function* (connection, exit) {
38
- const process = yield* Effect.exit(close(owned.process, exit));
38
+ const process = yield* Effect.exit(Release.close(owned.process, exit));
39
39
  yield* connection.diagnostics;
40
- const resources = yield* Effect.exit(close(owned.resources, exit));
40
+ const resources = yield* Effect.exit(Release.close(owned.resources, exit));
41
41
  const diagnostics = yield* connection.diagnostics;
42
42
  yield* finish([
43
43
  reason(process),
@@ -1 +1 @@
1
- {"version":3,"file":"Connection.js","names":["LocalProcess.connect","Release.close","RunnerConnection.connect"],"sources":["../../../src/internal/runner/Connection.ts"],"sourcesContent":["import {\n\tLocalTransport,\n\tWorkerTransport,\n\ttype Execution,\n} from \"../directTransport\"\nimport * as RunnerConnection from \"../host/runner\"\nimport {\n\tArray,\n\tCause,\n\tContext,\n\tEffect,\n\tDuration,\n\tExit,\n\tOption,\n\tScope,\n} from \"effect\"\nimport * as Release from \"../release\"\nimport type { RpcClientError } from \"effect/rpc\"\nimport type { Schema, PlatformError } from \"effect\"\nimport type { RemoteTerminationUnconfirmed } from \"./model\"\nimport type { Expected } from \"./Packages\"\n\nimport {\n\tLocalTerminationTimeout,\n\tProcessExited,\n\tTransportError,\n} from \"../../Errors\"\nimport { cleanupCause } from \"../cleanup\"\nimport * as Port from \"../port\"\nimport * as LocalProcess from \"./Local\"\nimport * as Wire from \"./Wire\"\n\nexport interface LocalTarget {\n\treadonly _tag: \"Local\"\n\treadonly command?: readonly [string, ...string[]]\n}\nexport interface WorkerTarget {\n\treadonly _tag: \"Worker\"\n\treadonly execArgv?: ReadonlyArray<string>\n}\n\nexport interface ConfiguredRunner {\n\treadonly instance: string\n\treadonly lease?: Duration.Input\n\treadonly margin?: Duration.Input\n\treadonly expect?: Expected\n\treadonly _tag: \"Connector\"\n\treadonly explicitAuth?: boolean\n}\nexport type Target = LocalTarget | WorkerTarget | ConfiguredRunner\n\ntype Peer = Port.Port\nexport interface Connected {\n\treadonly resources: Scope.Scope\n\treadonly pid: Option.Option<number>\n\treadonly threadId?: number\n\treadonly diagnostics: Effect.Effect<Cause.Cause<unknown>>\n\treadonly terminate: (\n\t\tgraceful: boolean,\n\t) => Effect.Effect<\n\t\tvoid,\n\t\t| ProcessExited\n\t\t| LocalTerminationTimeout\n\t\t| TransportError\n\t\t| Schema.SchemaError\n\t\t| Wire.SessionError\n\t\t| RemoteTerminationUnconfirmed\n\t\t| RpcClientError.RpcClientError\n\t>\n\treadonly transport: {\n\t\treadonly clientProtocol: Peer[\"clientProtocol\"]\n\t\treadonly serverProtocol: Peer[\"serverProtocol\"]\n\t\treadonly failure: Effect.Effect<never, ProcessExited | TransportError>\n\t\treadonly report: (cause: Cause.Cause<unknown>) => Effect.Effect<void>\n\t}\n}\nexport class Connection extends Context.Service<Connection, Connected>()(\n\t\"@graftland/plugin-remote/internal/runner/Connection\",\n) {}\nconst connected = Connection.of\n\nconst Local = Effect.fnUntraced(function* (\n\ttarget: LocalTarget | WorkerTarget,\n\tcontractModule: string,\n\toptions: Port.Options,\n\tresources: Scope.Scope,\n\tprocessScope: Scope.Scope,\n) {\n\tconst transport = yield* target._tag === \"Local\"\n\t\t? LocalTransport\n\t\t: WorkerTransport\n\tconst started: Effect.Effect<\n\t\tExecution,\n\t\tPlatformError.PlatformError | TransportError,\n\t\tScope.Scope\n\t> = transport.start({ ...target, contractModule, session: options.session })\n\tconst execution = yield* started.pipe(Scope.provide(processScope))\n\treturn yield* LocalProcess.connect(execution, options).pipe(\n\t\tScope.provide(resources),\n\t)\n})\n\nconst reason = <A, E>(exit: Exit.Exit<A, E>) =>\n\tExit.isFailure(exit) ? exit.cause : Cause.empty\nconst finish = (causes: ReadonlyArray<Cause.Cause<unknown>>) => {\n\tconst cause = Array.reduce(causes, Cause.empty, Cause.combine)\n\treturn cause.reasons.length === 0\n\t\t? Effect.void\n\t\t: Effect.failCause(cleanupCause(cause))\n}\n\n/** Close partially acquired resources too; the normal release observes exit before stopping readers. */\nconst scopes = Effect.acquireRelease(\n\tEffect.all({ resources: Scope.make(), process: Scope.make() }),\n\tEffect.fnUntraced(function* (scopes, exit) {\n\t\tconst process = yield* Effect.exit(Release.close(scopes.process, exit))\n\t\tconst resources = yield* Effect.exit(Release.close(scopes.resources, exit))\n\t\tyield* finish([reason(process), reason(resources)])\n\t}),\n)\n\n/** Setup supplies a concrete control lifecycle; release never reads a later-installed effect. */\nexport const acquire = Effect.fnUntraced(function* <A, E, R, D, DR>(\n\ttarget: Target,\n\tcontractModule: string,\n\toptions: Port.Options,\n\tsetup: Effect.Effect<A, E, R | Connection>,\n\tdispose: (value: A) => Effect.Effect<Cause.Cause<unknown>, D, DR>,\n\ttimeout: Duration.Input,\n) {\n\tconst owned = yield* scopes\n\tconst connection = yield* Effect.acquireRelease(\n\t\tEffect.gen(function* () {\n\t\t\treturn target._tag === \"Local\" || target._tag === \"Worker\"\n\t\t\t\t? yield* Local(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tcontractModule,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\towned.resources,\n\t\t\t\t\t\towned.process,\n\t\t\t\t\t).pipe(Effect.map(connected))\n\t\t\t\t: yield* RunnerConnection.connect(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tcontractModule,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\towned.resources,\n\t\t\t\t\t\towned.process,\n\t\t\t\t\t)\n\t\t}).pipe(Effect.interruptible),\n\t\tEffect.fnUntraced(function* (connection, exit) {\n\t\t\tconst process = yield* Effect.exit(Release.close(owned.process, exit))\n\t\t\t// Wait for exit while readers are alive; collect their final cause after resources close.\n\t\t\tyield* connection.diagnostics\n\t\t\tconst resources = yield* Effect.exit(Release.close(owned.resources, exit))\n\t\t\tconst diagnostics = yield* connection.diagnostics\n\t\t\tyield* finish([reason(process), reason(resources), diagnostics])\n\t\t}),\n\t)\n\treturn yield* Effect.acquireRelease(\n\t\tsetup.pipe(Effect.provideService(Connection, connection)),\n\t\tEffect.fnUntraced(function* (value) {\n\t\t\tconst graceful = yield* dispose(value).pipe(\n\t\t\t\tEffect.interruptible,\n\t\t\t\tEffect.timeout(timeout),\n\t\t\t\tEffect.exit,\n\t\t\t)\n\t\t\tconst terminated = yield* Effect.exit(\n\t\t\t\tconnection.terminate(Exit.isSuccess(graceful)),\n\t\t\t)\n\t\t\tyield* finish([\n\t\t\t\tExit.isSuccess(graceful) ? graceful.value : graceful.cause,\n\t\t\t\treason(terminated),\n\t\t\t])\n\t\t}),\n\t)\n})\n"],"mappings":";;;;;;;AA4EA,IAAa,aAAb,cAAgC,QAAQ,QAA+B,CAAC,CACvE,qDACD,CAAC,CAAC,CAAC;AACH,MAAM,YAAY,WAAW;AAE7B,MAAM,QAAQ,OAAO,WAAW,WAC/B,QACA,gBACA,SACA,WACA,cACC;CASD,MAAM,YAAY,QADd,OAPqB,OAAO,SAAS,UACtC,iBACA,gBAAA,CAKW,MAAM;EAAE,GAAG;EAAQ;EAAgB,SAAS,QAAQ;CAAQ,CAC3C,CAAC,CAAC,KAAK,MAAM,QAAQ,YAAY,CAAC;CACjE,OAAO,OAAOA,UAAqB,WAAW,OAAO,CAAC,CAAC,KACtD,MAAM,QAAQ,SAAS,CACxB;AACD,CAAC;AAED,MAAM,UAAgB,SACrB,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,MAAM;AAC3C,MAAM,UAAU,WAAgD;CAC/D,MAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,OAAO,MAAM,OAAO;CAC7D,OAAO,MAAM,QAAQ,WAAW,IAC7B,OAAO,OACP,OAAO,UAAU,aAAa,KAAK,CAAC;AACxC;;AAGA,MAAM,SAAS,OAAO,eACrB,OAAO,IAAI;CAAE,WAAW,MAAM,KAAK;CAAG,SAAS,MAAM,KAAK;AAAE,CAAC,GAC7D,OAAO,WAAW,WAAW,QAAQ,MAAM;CAC1C,MAAM,UAAU,OAAO,OAAO,KAAKC,MAAc,OAAO,SAAS,IAAI,CAAC;CACtE,MAAM,YAAY,OAAO,OAAO,KAAKA,MAAc,OAAO,WAAW,IAAI,CAAC;CAC1E,OAAO,OAAO,CAAC,OAAO,OAAO,GAAG,OAAO,SAAS,CAAC,CAAC;AACnD,CAAC,CACF;;AAGA,MAAa,UAAU,OAAO,WAAW,WACxC,QACA,gBACA,SACA,OACA,SACA,SACC;CACD,MAAM,QAAQ,OAAO;CACrB,MAAM,aAAa,OAAO,OAAO,eAChC,OAAO,IAAI,aAAa;EACvB,OAAO,OAAO,SAAS,WAAW,OAAO,SAAS,WAC/C,OAAO,MACP,QACA,gBACA,SACA,MAAM,WACN,MAAM,OACP,CAAC,CAAC,KAAK,OAAO,IAAI,SAAS,CAAC,IAC3B,OAAOC,QACP,QACA,gBACA,SACA,MAAM,WACN,MAAM,OACP;CACH,CAAC,CAAC,CAAC,KAAK,OAAO,aAAa,GAC5B,OAAO,WAAW,WAAW,YAAY,MAAM;EAC9C,MAAM,UAAU,OAAO,OAAO,KAAKD,MAAc,MAAM,SAAS,IAAI,CAAC;EAErE,OAAO,WAAW;EAClB,MAAM,YAAY,OAAO,OAAO,KAAKA,MAAc,MAAM,WAAW,IAAI,CAAC;EACzE,MAAM,cAAc,OAAO,WAAW;EACtC,OAAO,OAAO;GAAC,OAAO,OAAO;GAAG,OAAO,SAAS;GAAG;EAAW,CAAC;CAChE,CAAC,CACF;CACA,OAAO,OAAO,OAAO,eACpB,MAAM,KAAK,OAAO,eAAe,YAAY,UAAU,CAAC,GACxD,OAAO,WAAW,WAAW,OAAO;EACnC,MAAM,WAAW,OAAO,QAAQ,KAAK,CAAC,CAAC,KACtC,OAAO,eACP,OAAO,QAAQ,OAAO,GACtB,OAAO,IACR;EACA,MAAM,aAAa,OAAO,OAAO,KAChC,WAAW,UAAU,KAAK,UAAU,QAAQ,CAAC,CAC9C;EACA,OAAO,OAAO,CACb,KAAK,UAAU,QAAQ,IAAI,SAAS,QAAQ,SAAS,OACrD,OAAO,UAAU,CAClB,CAAC;CACF,CAAC,CACF;AACD,CAAC"}
1
+ {"version":3,"file":"Connection.js","names":["LocalProcess.connect","RunnerConnection.connect"],"sources":["../../../src/internal/runner/Connection.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tContext,\n\tDuration,\n\tEffect,\n\tExit,\n\tOption,\n\tScope,\n\ttype PlatformError,\n\ttype Schema,\n} from \"effect\"\nimport type { RpcClientError } from \"effect/rpc\"\n\nimport * as Release from \"@graftland/graft/Release\"\n\nimport {\n\tLocalTerminationTimeout,\n\tProcessExited,\n\tTransportError,\n} from \"../../Errors\"\nimport { cleanupCause } from \"../cleanup\"\nimport {\n\tLocalTransport,\n\tWorkerTransport,\n\ttype Execution,\n} from \"../directTransport\"\nimport * as RunnerConnection from \"../host/runner\"\nimport * as Port from \"../port\"\nimport * as LocalProcess from \"./Local\"\nimport type { RemoteTerminationUnconfirmed } from \"./model\"\nimport type { Expected } from \"./Packages\"\nimport * as Wire from \"./Wire\"\n\nexport interface LocalTarget {\n\treadonly _tag: \"Local\"\n\treadonly command?: readonly [string, ...string[]]\n}\nexport interface WorkerTarget {\n\treadonly _tag: \"Worker\"\n\treadonly execArgv?: ReadonlyArray<string>\n}\n\nexport interface ConfiguredRunner {\n\treadonly instance: string\n\treadonly lease?: Duration.Input\n\treadonly margin?: Duration.Input\n\treadonly expect?: Expected\n\treadonly _tag: \"Connector\"\n\treadonly explicitAuth?: boolean\n}\nexport type Target = LocalTarget | WorkerTarget | ConfiguredRunner\n\ntype Peer = Port.Port\nexport interface Connected {\n\treadonly resources: Scope.Scope\n\treadonly pid: Option.Option<number>\n\treadonly threadId?: number\n\treadonly diagnostics: Effect.Effect<Cause.Cause<unknown>>\n\treadonly terminate: (\n\t\tgraceful: boolean,\n\t) => Effect.Effect<\n\t\tvoid,\n\t\t| ProcessExited\n\t\t| LocalTerminationTimeout\n\t\t| TransportError\n\t\t| Schema.SchemaError\n\t\t| Wire.SessionError\n\t\t| RemoteTerminationUnconfirmed\n\t\t| RpcClientError.RpcClientError\n\t>\n\treadonly transport: {\n\t\treadonly clientProtocol: Peer[\"clientProtocol\"]\n\t\treadonly serverProtocol: Peer[\"serverProtocol\"]\n\t\treadonly failure: Effect.Effect<never, ProcessExited | TransportError>\n\t\treadonly report: (cause: Cause.Cause<unknown>) => Effect.Effect<void>\n\t}\n}\nexport class Connection extends Context.Service<Connection, Connected>()(\n\t\"@graftland/plugin-remote/internal/runner/Connection\",\n) {}\nconst connected = Connection.of\n\nconst Local = Effect.fnUntraced(function* (\n\ttarget: LocalTarget | WorkerTarget,\n\tcontractModule: string,\n\toptions: Port.Options,\n\tresources: Scope.Scope,\n\tprocessScope: Scope.Scope,\n) {\n\tconst transport = yield* target._tag === \"Local\"\n\t\t? LocalTransport\n\t\t: WorkerTransport\n\tconst started: Effect.Effect<\n\t\tExecution,\n\t\tPlatformError.PlatformError | TransportError,\n\t\tScope.Scope\n\t> = transport.start({ ...target, contractModule, session: options.session })\n\tconst execution = yield* started.pipe(Scope.provide(processScope))\n\treturn yield* LocalProcess.connect(execution, options).pipe(\n\t\tScope.provide(resources),\n\t)\n})\n\nconst reason = <A, E>(exit: Exit.Exit<A, E>) =>\n\tExit.isFailure(exit) ? exit.cause : Cause.empty\nconst finish = (causes: ReadonlyArray<Cause.Cause<unknown>>) => {\n\tconst cause = Array.reduce(causes, Cause.empty, Cause.combine)\n\treturn cause.reasons.length === 0\n\t\t? Effect.void\n\t\t: Effect.failCause(cleanupCause(cause))\n}\n\n/** Close partially acquired resources too; the normal release observes exit before stopping readers. */\nconst scopes = Effect.acquireRelease(\n\tEffect.all({ resources: Scope.make(), process: Scope.make() }),\n\tEffect.fnUntraced(function* (scopes, exit) {\n\t\tconst process = yield* Effect.exit(Release.close(scopes.process, exit))\n\t\tconst resources = yield* Effect.exit(Release.close(scopes.resources, exit))\n\t\tyield* finish([reason(process), reason(resources)])\n\t}),\n)\n\n/** Setup supplies a concrete control lifecycle; release never reads a later-installed effect. */\nexport const acquire = Effect.fnUntraced(function* <A, E, R, D, DR>(\n\ttarget: Target,\n\tcontractModule: string,\n\toptions: Port.Options,\n\tsetup: Effect.Effect<A, E, R | Connection>,\n\tdispose: (value: A) => Effect.Effect<Cause.Cause<unknown>, D, DR>,\n\ttimeout: Duration.Input,\n) {\n\tconst owned = yield* scopes\n\tconst connection = yield* Effect.acquireRelease(\n\t\tEffect.gen(function* () {\n\t\t\treturn target._tag === \"Local\" || target._tag === \"Worker\"\n\t\t\t\t? yield* Local(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tcontractModule,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\towned.resources,\n\t\t\t\t\t\towned.process,\n\t\t\t\t\t).pipe(Effect.map(connected))\n\t\t\t\t: yield* RunnerConnection.connect(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tcontractModule,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\towned.resources,\n\t\t\t\t\t\towned.process,\n\t\t\t\t\t)\n\t\t}).pipe(Effect.interruptible),\n\t\tEffect.fnUntraced(function* (connection, exit) {\n\t\t\tconst process = yield* Effect.exit(Release.close(owned.process, exit))\n\t\t\t// Wait for exit while readers are alive; collect their final cause after resources close.\n\t\t\tyield* connection.diagnostics\n\t\t\tconst resources = yield* Effect.exit(Release.close(owned.resources, exit))\n\t\t\tconst diagnostics = yield* connection.diagnostics\n\t\t\tyield* finish([reason(process), reason(resources), diagnostics])\n\t\t}),\n\t)\n\treturn yield* Effect.acquireRelease(\n\t\tsetup.pipe(Effect.provideService(Connection, connection)),\n\t\tEffect.fnUntraced(function* (value) {\n\t\t\tconst graceful = yield* dispose(value).pipe(\n\t\t\t\tEffect.interruptible,\n\t\t\t\tEffect.timeout(timeout),\n\t\t\t\tEffect.exit,\n\t\t\t)\n\t\t\tconst terminated = yield* Effect.exit(\n\t\t\t\tconnection.terminate(Exit.isSuccess(graceful)),\n\t\t\t)\n\t\t\tyield* finish([\n\t\t\t\tExit.isSuccess(graceful) ? graceful.value : graceful.cause,\n\t\t\t\treason(terminated),\n\t\t\t])\n\t\t}),\n\t)\n})\n"],"mappings":";;;;;;;AA8EA,IAAa,aAAb,cAAgC,QAAQ,QAA+B,CAAC,CACvE,qDACD,CAAC,CAAC,CAAC;AACH,MAAM,YAAY,WAAW;AAE7B,MAAM,QAAQ,OAAO,WAAW,WAC/B,QACA,gBACA,SACA,WACA,cACC;CASD,MAAM,YAAY,QADd,OAPqB,OAAO,SAAS,UACtC,iBACA,gBAAA,CAKW,MAAM;EAAE,GAAG;EAAQ;EAAgB,SAAS,QAAQ;CAAQ,CAC3C,CAAC,CAAC,KAAK,MAAM,QAAQ,YAAY,CAAC;CACjE,OAAO,OAAOA,UAAqB,WAAW,OAAO,CAAC,CAAC,KACtD,MAAM,QAAQ,SAAS,CACxB;AACD,CAAC;AAED,MAAM,UAAgB,SACrB,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,MAAM;AAC3C,MAAM,UAAU,WAAgD;CAC/D,MAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,OAAO,MAAM,OAAO;CAC7D,OAAO,MAAM,QAAQ,WAAW,IAC7B,OAAO,OACP,OAAO,UAAU,aAAa,KAAK,CAAC;AACxC;;AAGA,MAAM,SAAS,OAAO,eACrB,OAAO,IAAI;CAAE,WAAW,MAAM,KAAK;CAAG,SAAS,MAAM,KAAK;AAAE,CAAC,GAC7D,OAAO,WAAW,WAAW,QAAQ,MAAM;CAC1C,MAAM,UAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,SAAS,IAAI,CAAC;CACtE,MAAM,YAAY,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,WAAW,IAAI,CAAC;CAC1E,OAAO,OAAO,CAAC,OAAO,OAAO,GAAG,OAAO,SAAS,CAAC,CAAC;AACnD,CAAC,CACF;;AAGA,MAAa,UAAU,OAAO,WAAW,WACxC,QACA,gBACA,SACA,OACA,SACA,SACC;CACD,MAAM,QAAQ,OAAO;CACrB,MAAM,aAAa,OAAO,OAAO,eAChC,OAAO,IAAI,aAAa;EACvB,OAAO,OAAO,SAAS,WAAW,OAAO,SAAS,WAC/C,OAAO,MACP,QACA,gBACA,SACA,MAAM,WACN,MAAM,OACP,CAAC,CAAC,KAAK,OAAO,IAAI,SAAS,CAAC,IAC3B,OAAOC,QACP,QACA,gBACA,SACA,MAAM,WACN,MAAM,OACP;CACH,CAAC,CAAC,CAAC,KAAK,OAAO,aAAa,GAC5B,OAAO,WAAW,WAAW,YAAY,MAAM;EAC9C,MAAM,UAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,SAAS,IAAI,CAAC;EAErE,OAAO,WAAW;EAClB,MAAM,YAAY,OAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,WAAW,IAAI,CAAC;EACzE,MAAM,cAAc,OAAO,WAAW;EACtC,OAAO,OAAO;GAAC,OAAO,OAAO;GAAG,OAAO,SAAS;GAAG;EAAW,CAAC;CAChE,CAAC,CACF;CACA,OAAO,OAAO,OAAO,eACpB,MAAM,KAAK,OAAO,eAAe,YAAY,UAAU,CAAC,GACxD,OAAO,WAAW,WAAW,OAAO;EACnC,MAAM,WAAW,OAAO,QAAQ,KAAK,CAAC,CAAC,KACtC,OAAO,eACP,OAAO,QAAQ,OAAO,GACtB,OAAO,IACR;EACA,MAAM,aAAa,OAAO,OAAO,KAChC,WAAW,UAAU,KAAK,UAAU,QAAQ,CAAC,CAC9C;EACA,OAAO,OAAO,CACb,KAAK,UAAU,QAAQ,IAAI,SAAS,QAAQ,SAAS,OACrD,OAAO,UAAU,CAClB,CAAC;CACF,CAAC,CACF;AACD,CAAC"}
@@ -1,13 +1,13 @@
1
- import { observe } from "./ProcessObservation.js";
2
- import { make as make$1 } from "../FailureGroup.js";
3
- import { CommandJson } from "./WatchdogProtocol.js";
4
1
  import { TransportError } from "../../Errors.js";
2
+ import { make as make$1 } from "../FailureGroup.js";
3
+ import { Bootstrap } from "./Bootstrap.js";
4
+ import { command } from "./command.js";
5
+ import { Execution, ExecutionError, SessionConflict, SessionStopped } from "./model.js";
5
6
  import { make as make$2 } from "./Multiplex.js";
6
7
  import { resolve } from "./Packages.js";
7
8
  import { identity, recover } from "./Processes.js";
8
- import { Execution, ExecutionError, SessionConflict, SessionStopped } from "./model.js";
9
- import { Bootstrap } from "./Bootstrap.js";
10
- import { command } from "./command.js";
9
+ import { observe } from "./ProcessObservation.js";
10
+ import { CommandJson } from "./WatchdogProtocol.js";
11
11
  import { Array, Cause, Context, Effect, FileSystem, HashMap, HashSet, Layer, Path, Queue, Ref, Schema, Sink, Stream } from "effect";
12
12
  import { ChildProcess, ChildProcessSpawner } from "effect/process";
13
13
  // src/internal/runner/Execution.ts
@@ -1 +1 @@
1
- {"version":3,"file":"Execution.js","names":["Processes.recover","Packages.resolve","ProcessObservation.observe","FailureGroup.make","Multiplex.make","identity","Processes.identity"],"sources":["../../../src/internal/runner/Execution.ts"],"sourcesContent":["import * as ProcessObservation from \"./ProcessObservation\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport { Command, CommandJson } from \"./WatchdogProtocol\"\nimport {\n\tArray,\n\tCause,\n\tFileSystem,\n\tPath,\n\tSchema,\n\tContext,\n\tEffect,\n\tHashMap,\n\tHashSet,\n\tQueue,\n\tRef,\n\tSink,\n\tStream,\n\tLayer,\n\tScope,\n} from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\nimport { TransportError } from \"../../Errors\"\nimport * as Multiplex from \"./Multiplex\"\nimport * as Packages from \"./Packages\"\nimport * as Processes from \"./Processes\"\nimport {\n\tExecution,\n\tExecutionError,\n\tSessionConflict,\n\tSessionStopped,\n} from \"./model\"\nimport { Bootstrap } from \"./Bootstrap\"\nimport { command } from \"./command\"\n\nexport class Channels extends Context.Service<\n\tChannels,\n\t{\n\t\treadonly peer: (\n\t\t\ttoken: string,\n\t\t) => Effect.Effect<\n\t\t\tMultiplex.Peer,\n\t\t\tSessionStopped | SessionConflict,\n\t\t\tScope.Scope\n\t\t>\n\t}\n>()(\"@graftland/plugin-remote/internal/runner/Execution/Channels\") {}\n\nexport const make = Effect.fnUntraced(function* (root: string) {\n\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst platform = Context.make(\n\t\tChildProcessSpawner.ChildProcessSpawner,\n\t\tspawner,\n\t).pipe(Context.add(FileSystem.FileSystem, fs), Context.add(Path.Path, path))\n\n\tconst peers = yield* Ref.make(HashMap.empty<string, Multiplex.Peer>())\n\tconst claimed = yield* Ref.make(HashSet.empty<string>())\n\tconst driver = Execution.of({\n\t\trecover: (child) =>\n\t\t\tProcesses.recover(child).pipe(Effect.provideContext(platform)),\n\t\tspawn: Effect.fnUntraced(\n\t\t\tfunction* (handle, request, limits) {\n\t\t\t\tconst resolved = yield* Packages.resolve(\n\t\t\t\t\troot,\n\t\t\t\t\trequest.specifier,\n\t\t\t\t\trequest.digest,\n\t\t\t\t)\n\t\t\t\tconst argv = yield* command()\n\t\t\t\tconst child = yield* spawner.spawn(\n\t\t\t\t\tChildProcess.make(\n\t\t\t\t\t\targv[0],\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t...Array.drop(argv, 1),\n\t\t\t\t\t\t\t\"child\",\n\t\t\t\t\t\t\tresolved.entry,\n\t\t\t\t\t\t\thandle.token,\n\t\t\t\t\t\t\tyield* Schema.encodeEffect(Schema.fromJsonString(Bootstrap))({\n\t\t\t\t\t\t\t\tidentity: {\n\t\t\t\t\t\t\t\t\tid: handle.key.instance,\n\t\t\t\t\t\t\t\t\tgeneration: handle.generation,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tlimits,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstdin: \"pipe\",\n\t\t\t\t\t\t\tstdout: \"pipe\",\n\t\t\t\t\t\t\tstderr: \"pipe\",\n\t\t\t\t\t\t\tadditionalFds: {\n\t\t\t\t\t\t\t\tfd3: { type: \"output\" },\n\t\t\t\t\t\t\t\tfd4: { type: \"input\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tforceKillAfter: \"1 second\",\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst observation = yield* ProcessObservation.observe(child)\n\t\t\t\tconst exited = observation.exited.pipe(\n\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Observing child exit failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst failures = yield* FailureGroup.make<ExecutionError>()\n\t\t\t\tyield* failures.run(\n\t\t\t\t\tobservation.failure.pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Reading child output failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst controls = yield* Queue.bounded<string>(4)\n\n\t\t\t\tyield* failures.run(\n\t\t\t\t\tStream.fromQueue(controls).pipe(\n\t\t\t\t\t\tStream.map((line) => new TextEncoder().encode(line + \"\\n\")),\n\t\t\t\t\t\tStream.run(child.getInputFd(4)),\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Child supervision channel failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst send = (value: typeof Command.Type) =>\n\t\t\t\t\tEffect.raceFirst(\n\t\t\t\t\t\tSchema.encodeEffect(CommandJson)(value).pipe(\n\t\t\t\t\t\t\tEffect.flatMap((line) => Queue.offer(controls, line)),\n\t\t\t\t\t\t\tEffect.asVoid,\n\t\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Encoding watchdog command failed\",\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),\n\t\t\t\t\t\tfailures.await,\n\t\t\t\t\t)\n\t\t\t\tconst peer = yield* Multiplex.make({\n\t\t\t\t\tinput: child\n\t\t\t\t\t\t.getOutputFd(3)\n\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\tStream.mapError((error) =>\n\t\t\t\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\toutput: child.stdin.pipe(\n\t\t\t\t\t\tSink.mapError((error) =>\n\t\t\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t})\n\t\t\t\tconst identity = yield* Processes.identity(child.pid)\n\t\t\t\tyield* Ref.update(peers, HashMap.set(handle.token, peer))\n\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\tRef.update(peers, HashMap.remove(handle.token)),\n\t\t\t\t)\n\t\t\t\treturn {\n\t\t\t\t\tcode: resolved.identity,\n\t\t\t\t\tstart: send({ kind: \"start\" }),\n\t\t\t\t\tidentity,\n\t\t\t\t\texited,\n\t\t\t\t\tinterrupt: send({ kind: \"stop\" }),\n\t\t\t\t\tkill: child.kill({ killSignal: \"SIGKILL\" }).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Killing the child failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenew: (millis: number) => send({ kind: \"renew\", millis }),\n\t\t\t\t}\n\t\t\t},\n\t\t\tEffect.provideContext(platform),\n\t\t\tEffect.catchTags({\n\t\t\t\tPlatformError: (error) =>\n\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Starting the child failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\tSchemaError: (error) =>\n\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Encoding child bootstrap failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t}),\n\t\t),\n\t})\n\treturn {\n\t\tdriver,\n\t\tpeer: (token: string) =>\n\t\t\tEffect.acquireRelease(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst peer = yield* Ref.get(peers).pipe(\n\t\t\t\t\t\tEffect.flatMap((all) => {\n\t\t\t\t\t\t\tconst peer = HashMap.get(all, token)\n\t\t\t\t\t\t\treturn peer._tag === \"Some\"\n\t\t\t\t\t\t\t\t? Effect.succeed(peer.value)\n\t\t\t\t\t\t\t\t: Effect.fail(\n\t\t\t\t\t\t\t\t\t\tSessionStopped.make({\n\t\t\t\t\t\t\t\t\t\t\tdetail: \"The execution channel is no longer available\",\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\tconst occupied = yield* Ref.modify(\n\t\t\t\t\t\tclaimed,\n\t\t\t\t\t\t(all) =>\n\t\t\t\t\t\t\t[HashSet.has(all, token), HashSet.add(all, token)] as const,\n\t\t\t\t\t)\n\t\t\t\t\tif (occupied)\n\t\t\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\t\t\tdetail: \"The instance channel is already attached\",\n\t\t\t\t\t\t})\n\t\t\t\t\treturn peer\n\t\t\t\t}),\n\t\t\t\t() => Ref.update(claimed, HashSet.remove(token)),\n\t\t\t),\n\t}\n})\n\nexport const layer = (root: string) =>\n\tLayer.effectContext(\n\t\tmake(root).pipe(\n\t\t\tEffect.map((execution) =>\n\t\t\t\tContext.make(Execution, execution.driver).pipe(\n\t\t\t\t\tContext.add(Channels, { peer: execution.peer }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t)\n"],"mappings":"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"}
1
+ {"version":3,"file":"Execution.js","names":["Processes.recover","Packages.resolve","ProcessObservation.observe","FailureGroup.make","Multiplex.make","identity","Processes.identity"],"sources":["../../../src/internal/runner/Execution.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tContext,\n\tEffect,\n\tFileSystem,\n\tHashMap,\n\tHashSet,\n\tLayer,\n\tPath,\n\tQueue,\n\tRef,\n\tSchema,\n\tScope,\n\tSink,\n\tStream,\n} from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\n\nimport { TransportError } from \"../../Errors\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport { Bootstrap } from \"./Bootstrap\"\nimport { command } from \"./command\"\nimport {\n\tExecution,\n\tExecutionError,\n\tSessionConflict,\n\tSessionStopped,\n} from \"./model\"\nimport * as Multiplex from \"./Multiplex\"\nimport * as Packages from \"./Packages\"\nimport * as Processes from \"./Processes\"\nimport * as ProcessObservation from \"./ProcessObservation\"\nimport { Command, CommandJson } from \"./WatchdogProtocol\"\n\nexport class Channels extends Context.Service<\n\tChannels,\n\t{\n\t\treadonly peer: (\n\t\t\ttoken: string,\n\t\t) => Effect.Effect<\n\t\t\tMultiplex.Peer,\n\t\t\tSessionStopped | SessionConflict,\n\t\t\tScope.Scope\n\t\t>\n\t}\n>()(\"@graftland/plugin-remote/internal/runner/Execution/Channels\") {}\n\nexport const make = Effect.fnUntraced(function* (root: string) {\n\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst platform = Context.make(\n\t\tChildProcessSpawner.ChildProcessSpawner,\n\t\tspawner,\n\t).pipe(Context.add(FileSystem.FileSystem, fs), Context.add(Path.Path, path))\n\n\tconst peers = yield* Ref.make(HashMap.empty<string, Multiplex.Peer>())\n\tconst claimed = yield* Ref.make(HashSet.empty<string>())\n\tconst driver = Execution.of({\n\t\trecover: (child) =>\n\t\t\tProcesses.recover(child).pipe(Effect.provideContext(platform)),\n\t\tspawn: Effect.fnUntraced(\n\t\t\tfunction* (handle, request, limits) {\n\t\t\t\tconst resolved = yield* Packages.resolve(\n\t\t\t\t\troot,\n\t\t\t\t\trequest.specifier,\n\t\t\t\t\trequest.digest,\n\t\t\t\t)\n\t\t\t\tconst argv = yield* command()\n\t\t\t\tconst child = yield* spawner.spawn(\n\t\t\t\t\tChildProcess.make(\n\t\t\t\t\t\targv[0],\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t...Array.drop(argv, 1),\n\t\t\t\t\t\t\t\"child\",\n\t\t\t\t\t\t\tresolved.entry,\n\t\t\t\t\t\t\thandle.token,\n\t\t\t\t\t\t\tyield* Schema.encodeEffect(Schema.fromJsonString(Bootstrap))({\n\t\t\t\t\t\t\t\tidentity: {\n\t\t\t\t\t\t\t\t\tid: handle.key.instance,\n\t\t\t\t\t\t\t\t\tgeneration: handle.generation,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tlimits,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstdin: \"pipe\",\n\t\t\t\t\t\t\tstdout: \"pipe\",\n\t\t\t\t\t\t\tstderr: \"pipe\",\n\t\t\t\t\t\t\tadditionalFds: {\n\t\t\t\t\t\t\t\tfd3: { type: \"output\" },\n\t\t\t\t\t\t\t\tfd4: { type: \"input\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tforceKillAfter: \"1 second\",\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst observation = yield* ProcessObservation.observe(child)\n\t\t\t\tconst exited = observation.exited.pipe(\n\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Observing child exit failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst failures = yield* FailureGroup.make<ExecutionError>()\n\t\t\t\tyield* failures.run(\n\t\t\t\t\tobservation.failure.pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Reading child output failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst controls = yield* Queue.bounded<string>(4)\n\n\t\t\t\tyield* failures.run(\n\t\t\t\t\tStream.fromQueue(controls).pipe(\n\t\t\t\t\t\tStream.map((line) => new TextEncoder().encode(line + \"\\n\")),\n\t\t\t\t\t\tStream.run(child.getInputFd(4)),\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Child supervision channel failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst send = (value: typeof Command.Type) =>\n\t\t\t\t\tEffect.raceFirst(\n\t\t\t\t\t\tSchema.encodeEffect(CommandJson)(value).pipe(\n\t\t\t\t\t\t\tEffect.flatMap((line) => Queue.offer(controls, line)),\n\t\t\t\t\t\t\tEffect.asVoid,\n\t\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Encoding watchdog command failed\",\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),\n\t\t\t\t\t\tfailures.await,\n\t\t\t\t\t)\n\t\t\t\tconst peer = yield* Multiplex.make({\n\t\t\t\t\tinput: child\n\t\t\t\t\t\t.getOutputFd(3)\n\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\tStream.mapError((error) =>\n\t\t\t\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\toutput: child.stdin.pipe(\n\t\t\t\t\t\tSink.mapError((error) =>\n\t\t\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t})\n\t\t\t\tconst identity = yield* Processes.identity(child.pid)\n\t\t\t\tyield* Ref.update(peers, HashMap.set(handle.token, peer))\n\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\tRef.update(peers, HashMap.remove(handle.token)),\n\t\t\t\t)\n\t\t\t\treturn {\n\t\t\t\t\tcode: resolved.identity,\n\t\t\t\t\tstart: send({ kind: \"start\" }),\n\t\t\t\t\tidentity,\n\t\t\t\t\texited,\n\t\t\t\t\tinterrupt: send({ kind: \"stop\" }),\n\t\t\t\t\tkill: child.kill({ killSignal: \"SIGKILL\" }).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\t\tdetail: \"Killing the child failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenew: (millis: number) => send({ kind: \"renew\", millis }),\n\t\t\t\t}\n\t\t\t},\n\t\t\tEffect.provideContext(platform),\n\t\t\tEffect.catchTags({\n\t\t\t\tPlatformError: (error) =>\n\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Starting the child failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\tSchemaError: (error) =>\n\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Encoding child bootstrap failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t}),\n\t\t),\n\t})\n\treturn {\n\t\tdriver,\n\t\tpeer: (token: string) =>\n\t\t\tEffect.acquireRelease(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst peer = yield* Ref.get(peers).pipe(\n\t\t\t\t\t\tEffect.flatMap((all) => {\n\t\t\t\t\t\t\tconst peer = HashMap.get(all, token)\n\t\t\t\t\t\t\treturn peer._tag === \"Some\"\n\t\t\t\t\t\t\t\t? Effect.succeed(peer.value)\n\t\t\t\t\t\t\t\t: Effect.fail(\n\t\t\t\t\t\t\t\t\t\tSessionStopped.make({\n\t\t\t\t\t\t\t\t\t\t\tdetail: \"The execution channel is no longer available\",\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\tconst occupied = yield* Ref.modify(\n\t\t\t\t\t\tclaimed,\n\t\t\t\t\t\t(all) =>\n\t\t\t\t\t\t\t[HashSet.has(all, token), HashSet.add(all, token)] as const,\n\t\t\t\t\t)\n\t\t\t\t\tif (occupied)\n\t\t\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\t\t\tdetail: \"The instance channel is already attached\",\n\t\t\t\t\t\t})\n\t\t\t\t\treturn peer\n\t\t\t\t}),\n\t\t\t\t() => Ref.update(claimed, HashSet.remove(token)),\n\t\t\t),\n\t}\n})\n\nexport const layer = (root: string) =>\n\tLayer.effectContext(\n\t\tmake(root).pipe(\n\t\t\tEffect.map((execution) =>\n\t\t\t\tContext.make(Execution, execution.driver).pipe(\n\t\t\t\t\tContext.add(Channels, { peer: execution.peer }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t)\n"],"mappings":";;;;;;;;;;;;;AAmCA,IAAa,WAAb,cAA8B,QAAQ,QAWpC,CAAC,CAAC,6DAA6D,CAAC,CAAC,CAAC;AAEpE,MAAa,OAAO,OAAO,WAAW,WAAW,MAAc;CAC9D,MAAM,UAAU,OAAO,oBAAoB;CAC3C,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,WAAW,QAAQ,KACxB,oBAAoB,qBACpB,OACD,CAAC,CAAC,KAAK,QAAQ,IAAI,WAAW,YAAY,EAAE,GAAG,QAAQ,IAAI,KAAK,MAAM,IAAI,CAAC;CAE3E,MAAM,QAAQ,OAAO,IAAI,KAAK,QAAQ,MAA8B,CAAC;CACrE,MAAM,UAAU,OAAO,IAAI,KAAK,QAAQ,MAAc,CAAC;CA+IvD,OAAO;EACN,QA/Ic,UAAU,GAAG;GAC3B,UAAU,UACTA,QAAkB,KAAK,CAAC,CAAC,KAAK,OAAO,eAAe,QAAQ,CAAC;GAC9D,OAAO,OAAO,WACb,WAAW,QAAQ,SAAS,QAAQ;IACnC,MAAM,WAAW,OAAOC,QACvB,MACA,QAAQ,WACR,QAAQ,MACT;IACA,MAAM,OAAO,OAAO,QAAQ;IAC5B,MAAM,QAAQ,OAAO,QAAQ,MAC5B,aAAa,KACZ,KAAK,IACL;KACC,GAAG,MAAM,KAAK,MAAM,CAAC;KACrB;KACA,SAAS;KACT,OAAO;KACP,OAAO,OAAO,aAAa,OAAO,eAAe,SAAS,CAAC,CAAC,CAAC;MAC5D,UAAU;OACT,IAAI,OAAO,IAAI;OACf,YAAY,OAAO;MACpB;MACA;KACD,CAAC;IACF,GACA;KACC,OAAO;KACP,QAAQ;KACR,QAAQ;KACR,eAAe;MACd,KAAK,EAAE,MAAM,SAAS;MACtB,KAAK,EAAE,MAAM,QAAQ;KACtB;KACA,gBAAgB;IACjB,CACD,CACD;IACA,MAAM,cAAc,OAAOC,QAA2B,KAAK;IAC3D,MAAM,SAAS,YAAY,OAAO,KACjC,OAAO,UAAU,UAChB,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF,CACD;IACA,MAAM,WAAW,OAAOC,OAAkC;IAC1D,OAAO,SAAS,IACf,YAAY,QAAQ,KACnB,OAAO,UAAU,UAChB,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF,CACD,CACD;IACA,MAAM,WAAW,OAAO,MAAM,QAAgB,CAAC;IAE/C,OAAO,SAAS,IACf,OAAO,UAAU,QAAQ,CAAC,CAAC,KAC1B,OAAO,KAAK,SAAS,IAAI,YAAY,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC,GAC1D,OAAO,IAAI,MAAM,WAAW,CAAC,CAAC,GAC9B,OAAO,UAAU,UAChB,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF,CACD,CACD;IACA,MAAM,QAAQ,UACb,OAAO,UACN,OAAO,aAAa,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KACvC,OAAO,SAAS,SAAS,MAAM,MAAM,UAAU,IAAI,CAAC,GACpD,OAAO,QACP,OAAO,UAAU,UAChB,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF,CACD,GACA,SAAS,KACV;IACD,MAAM,OAAO,OAAOC,OAAe;KAClC,OAAO,MACL,YAAY,CAAC,CAAC,CACd,KACA,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;KACD,QAAQ,MAAM,MAAM,KACnB,KAAK,UAAU,UACd,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;IACD,CAAC;IACD,MAAMC,aAAW,OAAOC,SAAmB,MAAM,GAAG;IACpD,OAAO,IAAI,OAAO,OAAO,QAAQ,IAAI,OAAO,OAAO,IAAI,CAAC;IACxD,OAAO,OAAO,mBACb,IAAI,OAAO,OAAO,QAAQ,OAAO,OAAO,KAAK,CAAC,CAC/C;IACA,OAAO;KACN,MAAM,SAAS;KACf,OAAO,KAAK,EAAE,MAAM,QAAQ,CAAC;KAC7B,UAAA;KACA;KACA,WAAW,KAAK,EAAE,MAAM,OAAO,CAAC;KAChC,MAAM,MAAM,KAAK,EAAE,YAAY,UAAU,CAAC,CAAC,CAAC,KAC3C,OAAO,UAAU,UAChB,eAAe,KAAK;MACnB,QAAQ;MACR,OAAO,MAAM,KAAK,KAAK;KACxB,CAAC,CACF,CACD;KACA,QAAQ,WAAmB,KAAK;MAAE,MAAM;MAAS;KAAO,CAAC;IAC1D;GACD,GACA,OAAO,eAAe,QAAQ,GAC9B,OAAO,UAAU;IAChB,gBAAgB,UACf,OAAO,KACN,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF;IACD,cAAc,UACb,OAAO,KACN,eAAe,KAAK;KACnB,QAAQ;KACR,OAAO,MAAM,KAAK,KAAK;IACxB,CAAC,CACF;GACF,CAAC,CACF;EACD,CAEM;EACL,OAAO,UACN,OAAO,eACN,OAAO,IAAI,aAAa;GACvB,MAAM,OAAO,OAAO,IAAI,IAAI,KAAK,CAAC,CAAC,KAClC,OAAO,SAAS,QAAQ;IACvB,MAAM,OAAO,QAAQ,IAAI,KAAK,KAAK;IACnC,OAAO,KAAK,SAAS,SAClB,OAAO,QAAQ,KAAK,KAAK,IACzB,OAAO,KACP,eAAe,KAAK,EACnB,QAAQ,+CACT,CAAC,CACF;GACH,CAAC,CACF;GAMA,IAAI,OALoB,IAAI,OAC3B,UACC,QACA,CAAC,QAAQ,IAAI,KAAK,KAAK,GAAG,QAAQ,IAAI,KAAK,KAAK,CAAC,CACnD,GAEC,OAAO,OAAO,gBAAgB,KAAK,EAClC,QAAQ,2CACT,CAAC;GACF,OAAO;EACR,CAAC,SACK,IAAI,OAAO,SAAS,QAAQ,OAAO,KAAK,CAAC,CAChD;CACF;AACD,CAAC;AAED,MAAa,SAAS,SACrB,MAAM,cACL,KAAK,IAAI,CAAC,CAAC,KACV,OAAO,KAAK,cACX,QAAQ,KAAK,WAAW,UAAU,MAAM,CAAC,CAAC,KACzC,QAAQ,IAAI,UAAU,EAAE,MAAM,UAAU,KAAK,CAAC,CAC/C,CACD,CACD,CACD"}
@@ -1,5 +1,5 @@
1
- import { make } from "../FailureGroup.js";
2
1
  import { LocalTerminationTimeout, TransportError } from "../../Errors.js";
2
+ import { make } from "../FailureGroup.js";
3
3
  import { make as make$1 } from "../port.js";
4
4
  import { stdinExitTimeout } from "./ProcessObservation.js";
5
5
  import { Cause, Effect, Fiber, Option } from "effect";
@@ -1 +1 @@
1
- {"version":3,"file":"Local.js","names":["FailureGroup.make","Port.make"],"sources":["../../../src/internal/runner/Local.ts"],"sourcesContent":["import { Cause, Effect, Fiber, Option } from \"effect\"\nimport type { Execution } from \"../directTransport\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport {\n\tLocalTerminationTimeout,\n\tProcessExited,\n\tTransportError,\n} from \"../../Errors\"\nimport * as Port from \"../port\"\nimport { stdinExitTimeout } from \"./ProcessObservation\"\n\n/** Direct execution observers stay alive until exit, including forced cleanup. */\nexport const connect = Effect.fnUntraced(function* (\n\texecution: Execution,\n\toptions: Port.Options,\n) {\n\tconst failures = yield* FailureGroup.make<ProcessExited | TransportError>()\n\tconst exited = yield* execution.exited.pipe(Effect.forkScoped)\n\tconst peer = yield* Port.make(execution.channel, options)\n\tyield* failures.run(\n\t\tEffect.raceFirst(\n\t\t\tpeer.await,\n\t\t\tFiber.join(exited).pipe(Effect.flatMap(Effect.fail)),\n\t\t),\n\t)\n\tconst report = (cause: Cause.Cause<unknown>) =>\n\t\tCause.hasInterruptsOnly(cause)\n\t\t\t? Effect.void\n\t\t\t: failures\n\t\t\t\t\t.fail(TransportError.make({ cause }))\n\t\t\t\t\t.pipe(Effect.andThen(peer.fail(TransportError.make({ cause }))))\n\tyield* failures.run(execution.failure)\n\n\treturn {\n\t\t...peer,\n\t\tpid: execution.pid,\n\t\t...(execution.threadId === undefined\n\t\t\t? {}\n\t\t\t: { threadId: execution.threadId }),\n\t\texited,\n\t\tresources: yield* Effect.scope,\n\t\ttransport: { ...peer, failure: failures.await, report },\n\t\tdiagnostics: Fiber.await(exited).pipe(Effect.andThen(failures.cause)),\n\t\tterminate: Effect.fnUntraced(function* (graceful: boolean) {\n\t\t\t// Stop observation before intentionally ending stdin or killing the process.\n\t\t\tyield* failures.close\n\t\t\tif (!graceful) return\n\t\t\t// If this fails, the execution scope forces termination and waits for exit.\n\t\t\tconst status = yield* peer.end.pipe(\n\t\t\t\t// Peer EOF can interrupt the writer as its output ends. Still confirm the unit's exit.\n\t\t\t\tEffect.catchCauseIf(Cause.hasInterruptsOnly, () => Effect.void),\n\t\t\t\tEffect.andThen(Fiber.join(exited)),\n\t\t\t\tEffect.interruptible,\n\t\t\t\tEffect.timeoutOrElse({\n\t\t\t\t\tduration: stdinExitTimeout,\n\t\t\t\t\torElse: () =>\n\t\t\t\t\t\tLocalTerminationTimeout.make({\n\t\t\t\t\t\t\t...Option.match(execution.pid, {\n\t\t\t\t\t\t\t\tonNone: () => ({}),\n\t\t\t\t\t\t\t\tonSome: (pid) => ({ pid }),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t...(execution.threadId === undefined\n\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t: { threadId: execution.threadId }),\n\t\t\t\t\t\t}),\n\t\t\t\t}),\n\t\t\t)\n\t\t\tif (status.exitCode !== 0 || status.statusCause.reasons.length > 0)\n\t\t\t\treturn yield* status\n\t\t}),\n\t}\n})\n"],"mappings":";;;;;;;AAYA,MAAa,UAAU,OAAO,WAAW,WACxC,WACA,SACC;CACD,MAAM,WAAW,OAAOA,KAAkD;CAC1E,MAAM,SAAS,OAAO,UAAU,OAAO,KAAK,OAAO,UAAU;CAC7D,MAAM,OAAO,OAAOC,OAAU,UAAU,SAAS,OAAO;CACxD,OAAO,SAAS,IACf,OAAO,UACN,KAAK,OACL,MAAM,KAAK,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,IAAI,CAAC,CACpD,CACD;CACA,MAAM,UAAU,UACf,MAAM,kBAAkB,KAAK,IAC1B,OAAO,OACP,SACC,KAAK,eAAe,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CACpC,KAAK,OAAO,QAAQ,KAAK,KAAK,eAAe,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACnE,OAAO,SAAS,IAAI,UAAU,OAAO;CAErC,OAAO;EACN,GAAG;EACH,KAAK,UAAU;EACf,GAAI,UAAU,aAAa,KAAA,IACxB,CAAC,IACD,EAAE,UAAU,UAAU,SAAS;EAClC;EACA,WAAW,OAAO,OAAO;EACzB,WAAW;GAAE,GAAG;GAAM,SAAS,SAAS;GAAO;EAAO;EACtD,aAAa,MAAM,MAAM,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,SAAS,KAAK,CAAC;EACpE,WAAW,OAAO,WAAW,WAAW,UAAmB;GAE1D,OAAO,SAAS;GAChB,IAAI,CAAC,UAAU;GAEf,MAAM,SAAS,OAAO,KAAK,IAAI,KAE9B,OAAO,aAAa,MAAM,yBAAyB,OAAO,IAAI,GAC9D,OAAO,QAAQ,MAAM,KAAK,MAAM,CAAC,GACjC,OAAO,eACP,OAAO,cAAc;IACpB,UAAU;IACV,cACC,wBAAwB,KAAK;KAC5B,GAAG,OAAO,MAAM,UAAU,KAAK;MAC9B,eAAe,CAAC;MAChB,SAAS,SAAS,EAAE,IAAI;KACzB,CAAC;KACD,GAAI,UAAU,aAAa,KAAA,IACxB,CAAC,IACD,EAAE,UAAU,UAAU,SAAS;IACnC,CAAC;GACH,CAAC,CACF;GACA,IAAI,OAAO,aAAa,KAAK,OAAO,YAAY,QAAQ,SAAS,GAChE,OAAO,OAAO;EAChB,CAAC;CACF;AACD,CAAC"}
1
+ {"version":3,"file":"Local.js","names":["FailureGroup.make","Port.make"],"sources":["../../../src/internal/runner/Local.ts"],"sourcesContent":["import { Cause, Effect, Fiber, Option } from \"effect\"\n\nimport {\n\tLocalTerminationTimeout,\n\tProcessExited,\n\tTransportError,\n} from \"../../Errors\"\nimport type { Execution } from \"../directTransport\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport * as Port from \"../port\"\nimport { stdinExitTimeout } from \"./ProcessObservation\"\n\n/** Direct execution observers stay alive until exit, including forced cleanup. */\nexport const connect = Effect.fnUntraced(function* (\n\texecution: Execution,\n\toptions: Port.Options,\n) {\n\tconst failures = yield* FailureGroup.make<ProcessExited | TransportError>()\n\tconst exited = yield* execution.exited.pipe(Effect.forkScoped)\n\tconst peer = yield* Port.make(execution.channel, options)\n\tyield* failures.run(\n\t\tEffect.raceFirst(\n\t\t\tpeer.await,\n\t\t\tFiber.join(exited).pipe(Effect.flatMap(Effect.fail)),\n\t\t),\n\t)\n\tconst report = (cause: Cause.Cause<unknown>) =>\n\t\tCause.hasInterruptsOnly(cause)\n\t\t\t? Effect.void\n\t\t\t: failures\n\t\t\t\t\t.fail(TransportError.make({ cause }))\n\t\t\t\t\t.pipe(Effect.andThen(peer.fail(TransportError.make({ cause }))))\n\tyield* failures.run(execution.failure)\n\n\treturn {\n\t\t...peer,\n\t\tpid: execution.pid,\n\t\t...(execution.threadId === undefined\n\t\t\t? {}\n\t\t\t: { threadId: execution.threadId }),\n\t\texited,\n\t\tresources: yield* Effect.scope,\n\t\ttransport: { ...peer, failure: failures.await, report },\n\t\tdiagnostics: Fiber.await(exited).pipe(Effect.andThen(failures.cause)),\n\t\tterminate: Effect.fnUntraced(function* (graceful: boolean) {\n\t\t\t// Stop observation before intentionally ending stdin or killing the process.\n\t\t\tyield* failures.close\n\t\t\tif (!graceful) return\n\t\t\t// If this fails, the execution scope forces termination and waits for exit.\n\t\t\tconst status = yield* peer.end.pipe(\n\t\t\t\t// Peer EOF can interrupt the writer as its output ends. Still confirm the unit's exit.\n\t\t\t\tEffect.catchCauseIf(Cause.hasInterruptsOnly, () => Effect.void),\n\t\t\t\tEffect.andThen(Fiber.join(exited)),\n\t\t\t\tEffect.interruptible,\n\t\t\t\tEffect.timeoutOrElse({\n\t\t\t\t\tduration: stdinExitTimeout,\n\t\t\t\t\torElse: () =>\n\t\t\t\t\t\tLocalTerminationTimeout.make({\n\t\t\t\t\t\t\t...Option.match(execution.pid, {\n\t\t\t\t\t\t\t\tonNone: () => ({}),\n\t\t\t\t\t\t\t\tonSome: (pid) => ({ pid }),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t...(execution.threadId === undefined\n\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t: { threadId: execution.threadId }),\n\t\t\t\t\t\t}),\n\t\t\t\t}),\n\t\t\t)\n\t\t\tif (status.exitCode !== 0 || status.statusCause.reasons.length > 0)\n\t\t\t\treturn yield* status\n\t\t}),\n\t}\n})\n"],"mappings":";;;;;;;AAaA,MAAa,UAAU,OAAO,WAAW,WACxC,WACA,SACC;CACD,MAAM,WAAW,OAAOA,KAAkD;CAC1E,MAAM,SAAS,OAAO,UAAU,OAAO,KAAK,OAAO,UAAU;CAC7D,MAAM,OAAO,OAAOC,OAAU,UAAU,SAAS,OAAO;CACxD,OAAO,SAAS,IACf,OAAO,UACN,KAAK,OACL,MAAM,KAAK,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,IAAI,CAAC,CACpD,CACD;CACA,MAAM,UAAU,UACf,MAAM,kBAAkB,KAAK,IAC1B,OAAO,OACP,SACC,KAAK,eAAe,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CACpC,KAAK,OAAO,QAAQ,KAAK,KAAK,eAAe,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACnE,OAAO,SAAS,IAAI,UAAU,OAAO;CAErC,OAAO;EACN,GAAG;EACH,KAAK,UAAU;EACf,GAAI,UAAU,aAAa,KAAA,IACxB,CAAC,IACD,EAAE,UAAU,UAAU,SAAS;EAClC;EACA,WAAW,OAAO,OAAO;EACzB,WAAW;GAAE,GAAG;GAAM,SAAS,SAAS;GAAO;EAAO;EACtD,aAAa,MAAM,MAAM,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,SAAS,KAAK,CAAC;EACpE,WAAW,OAAO,WAAW,WAAW,UAAmB;GAE1D,OAAO,SAAS;GAChB,IAAI,CAAC,UAAU;GAEf,MAAM,SAAS,OAAO,KAAK,IAAI,KAE9B,OAAO,aAAa,MAAM,yBAAyB,OAAO,IAAI,GAC9D,OAAO,QAAQ,MAAM,KAAK,MAAM,CAAC,GACjC,OAAO,eACP,OAAO,cAAc;IACpB,UAAU;IACV,cACC,wBAAwB,KAAK;KAC5B,GAAG,OAAO,MAAM,UAAU,KAAK;MAC9B,eAAe,CAAC;MAChB,SAAS,SAAS,EAAE,IAAI;KACzB,CAAC;KACD,GAAI,UAAU,aAAa,KAAA,IACxB,CAAC,IACD,EAAE,UAAU,UAAU,SAAS;IACnC,CAAC;GACH,CAAC,CACF;GACA,IAAI,OAAO,aAAa,KAAK,OAAO,YAAY,QAAQ,SAAS,GAChE,OAAO,OAAO;EAChB,CAAC;CACF;AACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Lock.js","names":[],"sources":["../../../src/internal/runner/Lock.ts"],"sourcesContent":["import { Cause, Effect, FileSystem, Path } from \"effect\"\nimport { StateDirectoryLocked } from \"./model\"\n\n/** SQLite owns the local directory lock for the enclosing scope, including failed startup. */\nexport const acquire = Effect.fnUntraced(function* (directory: string) {\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tyield* fs\n\t\t.makeDirectory(directory, { recursive: true })\n\t\t.pipe(Effect.uninterruptible)\n\tconst { DatabaseSync } = yield* Effect.promise(\n\t\t() => import(\"node:sqlite\"),\n\t).pipe(Effect.uninterruptible)\n\tconst locked = (cause: unknown) =>\n\t\tStateDirectoryLocked.make({\n\t\t\tdetail: \"The runner state directory is already owned or cannot be locked\",\n\t\t\tcause: Cause.die(cause),\n\t\t})\n\tconst db = yield* Effect.acquireRelease(\n\t\tEffect.try({\n\t\t\ttry: () => new DatabaseSync(path.join(directory, \"owner.sqlite\")),\n\t\t\tcatch: locked,\n\t\t}),\n\t\t(db) => Effect.sync(() => db.close()),\n\t)\n\tyield* Effect.try({ try: () => db.exec(\"BEGIN EXCLUSIVE\"), catch: locked })\n})\n"],"mappings":";;;;AAIA,MAAa,UAAU,OAAO,WAAW,WAAW,WAAmB;CACtE,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,OAAO,OAAO,KAAK;CACzB,OAAO,GACL,cAAc,WAAW,EAAE,WAAW,KAAK,CAAC,CAAC,CAC7C,KAAK,OAAO,eAAe;CAC7B,MAAM,EAAE,iBAAiB,OAAO,OAAO,cAChC,OAAO,cACd,CAAC,CAAC,KAAK,OAAO,eAAe;CAC7B,MAAM,UAAU,UACf,qBAAqB,KAAK;EACzB,QAAQ;EACR,OAAO,MAAM,IAAI,KAAK;CACvB,CAAC;CACF,MAAM,KAAK,OAAO,OAAO,eACxB,OAAO,IAAI;EACV,WAAW,IAAI,aAAa,KAAK,KAAK,WAAW,cAAc,CAAC;EAChE,OAAO;CACR,CAAC,IACA,OAAO,OAAO,WAAW,GAAG,MAAM,CAAC,CACrC;CACA,OAAO,OAAO,IAAI;EAAE,WAAW,GAAG,KAAK,iBAAiB;EAAG,OAAO;CAAO,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"Lock.js","names":[],"sources":["../../../src/internal/runner/Lock.ts"],"sourcesContent":["import { Cause, Effect, FileSystem, Path } from \"effect\"\n\nimport { StateDirectoryLocked } from \"./model\"\n\n/** SQLite owns the local directory lock for the enclosing scope, including failed startup. */\nexport const acquire = Effect.fnUntraced(function* (directory: string) {\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tyield* fs\n\t\t.makeDirectory(directory, { recursive: true })\n\t\t.pipe(Effect.uninterruptible)\n\tconst { DatabaseSync } = yield* Effect.promise(\n\t\t() => import(\"node:sqlite\"),\n\t).pipe(Effect.uninterruptible)\n\tconst locked = (cause: unknown) =>\n\t\tStateDirectoryLocked.make({\n\t\t\tdetail: \"The runner state directory is already owned or cannot be locked\",\n\t\t\tcause: Cause.die(cause),\n\t\t})\n\tconst db = yield* Effect.acquireRelease(\n\t\tEffect.try({\n\t\t\ttry: () => new DatabaseSync(path.join(directory, \"owner.sqlite\")),\n\t\t\tcatch: locked,\n\t\t}),\n\t\t(db) => Effect.sync(() => db.close()),\n\t)\n\tyield* Effect.try({ try: () => db.exec(\"BEGIN EXCLUSIVE\"), catch: locked })\n})\n"],"mappings":";;;;AAKA,MAAa,UAAU,OAAO,WAAW,WAAW,WAAmB;CACtE,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,OAAO,OAAO,KAAK;CACzB,OAAO,GACL,cAAc,WAAW,EAAE,WAAW,KAAK,CAAC,CAAC,CAC7C,KAAK,OAAO,eAAe;CAC7B,MAAM,EAAE,iBAAiB,OAAO,OAAO,cAChC,OAAO,cACd,CAAC,CAAC,KAAK,OAAO,eAAe;CAC7B,MAAM,UAAU,UACf,qBAAqB,KAAK;EACzB,QAAQ;EACR,OAAO,MAAM,IAAI,KAAK;CACvB,CAAC;CACF,MAAM,KAAK,OAAO,OAAO,eACxB,OAAO,IAAI;EACV,WAAW,IAAI,aAAa,KAAK,KAAK,WAAW,cAAc,CAAC;EAChE,OAAO;CACR,CAAC,IACA,OAAO,OAAO,WAAW,GAAG,MAAM,CAAC,CACrC;CACA,OAAO,OAAO,IAAI;EAAE,WAAW,GAAG,KAAK,iBAAiB;EAAG,OAAO;CAAO,CAAC;AAC3E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Multiplex.js","names":["FailureGroup.make","decoder","Framing.decoder","Framing.encode"],"sources":["../../../src/internal/runner/Multiplex.ts"],"sourcesContent":["import {\n\tCause,\n\tEffect,\n\tFiber,\n\tOption,\n\tQueue,\n\tSink,\n\tStream,\n\tTxQueue,\n} from \"effect\"\nimport type { Socket } from \"effect/socket\"\nimport { TransportError } from \"../../Errors\"\nimport type { Channel as ByteChannel } from \"../port\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport * as Framing from \"./Framing\"\n\nexport interface Peer {\n\treadonly await: Effect.Effect<never, TransportError>\n\treadonly fail: (error: TransportError) => Effect.Effect<void>\n\treadonly end: Effect.Effect<void, TransportError>\n\treadonly send: (\n\t\tchannel: Framing.Channel,\n\t\tpayload: Uint8Array,\n\t) => Effect.Effect<void, TransportError | Framing.FrameError>\n\treadonly take: (\n\t\tchannel: Framing.Channel,\n\t) => Effect.Effect<Uint8Array, TransportError>\n}\n/** Ports own admission and ACK backpressure. This layer only frames and separates session/instance bytes. */\nexport const make = Effect.fnUntraced(function* (\n\tchannel: ByteChannel,\n): Effect.fn.Return<Peer, never, import(\"effect\").Scope.Scope> {\n\tconst group = yield* FailureGroup.make<TransportError>()\n\tconst incoming = {\n\t\t0: yield* Queue.unbounded<Uint8Array>(),\n\t\t1: yield* Queue.unbounded<Uint8Array>(),\n\t}\n\tconst outgoing = {\n\t\t0: yield* TxQueue.unbounded<Uint8Array, Cause.Done>(),\n\t\t1: yield* TxQueue.unbounded<Uint8Array, Cause.Done>(),\n\t}\n\tconst next = Effect.tx(\n\t\tEffect.gen(function* () {\n\t\t\tconst session = yield* TxQueue.poll(outgoing[0])\n\t\t\tif (Option.isSome(session)) return session.value\n\t\t\tconst instance = yield* TxQueue.poll(outgoing[1])\n\t\t\tif (Option.isSome(instance)) return instance.value\n\t\t\tif (\n\t\t\t\t(yield* TxQueue.isDone(outgoing[0])) &&\n\t\t\t\t(yield* TxQueue.isDone(outgoing[1]))\n\t\t\t)\n\t\t\t\treturn yield* Cause.done()\n\t\t\treturn yield* Effect.txRetry\n\t\t}),\n\t)\n\tconst writing = yield* group.run(\n\t\tStream.fromEffectRepeat(next).pipe(\n\t\t\tStream.run(channel.output),\n\t\t\tEffect.asVoid,\n\t\t),\n\t)\n\tconst decoder = Framing.decoder()\n\tyield* group.run(\n\t\tchannel.input.pipe(\n\t\t\tStream.runForEach((bytes) =>\n\t\t\t\tEffect.fromResult(decoder.decode(bytes)).pipe(\n\t\t\t\t\tEffect.flatMap((frames) =>\n\t\t\t\t\t\tEffect.forEach(\n\t\t\t\t\t\t\tframes,\n\t\t\t\t\t\t\t(frame) => Queue.offer(incoming[frame.channel], frame.payload),\n\t\t\t\t\t\t\t{ discard: true },\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t\tEffect.andThen(decoder.finish),\n\t\t\tEffect.andThen(Effect.fail(Framing.EndOfStream.make({}))),\n\t\t\tEffect.mapError((error) =>\n\t\t\t\terror._tag === \"TransportError\"\n\t\t\t\t\t? error\n\t\t\t\t\t: TransportError.make({ cause: Cause.fail(error) }),\n\t\t\t),\n\t\t),\n\t)\n\treturn {\n\t\tawait: group.await,\n\t\tfail: group.fail,\n\t\tend: Effect.tx(\n\t\t\tTxQueue.end(outgoing[0]).pipe(Effect.andThen(TxQueue.end(outgoing[1]))),\n\t\t).pipe(Effect.andThen(Fiber.join(writing))),\n\t\tsend: (id, payload) =>\n\t\t\tgroup.race(\n\t\t\t\tFraming.encode({ channel: id, payload }).pipe(\n\t\t\t\t\tEffect.flatMap((bytes) => TxQueue.offer(outgoing[id], bytes)),\n\t\t\t\t\tEffect.asVoid,\n\t\t\t\t),\n\t\t\t),\n\t\ttake: (id) => group.race(Queue.take(incoming[id])),\n\t}\n})\nexport const fromSocket = Effect.fnUntraced(function* (socket: Socket.Socket) {\n\tconst reader = yield* socket.reader\n\tconst writer = yield* socket.writer\n\treturn yield* make({\n\t\tinput: Stream.fromEffectRepeat(reader.pull).pipe(\n\t\t\tStream.flattenIterable,\n\t\t\tStream.map((bytes) =>\n\t\t\t\ttypeof bytes === \"string\" ? new TextEncoder().encode(bytes) : bytes,\n\t\t\t),\n\t\t\tStream.mapError((error) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t),\n\t\t),\n\t\toutput: Sink.forEach((bytes: Uint8Array) => writer.write(bytes)).pipe(\n\t\t\tSink.mapError((error) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t),\n\t\t),\n\t})\n})\n"],"mappings":";;;;;;AA6BA,MAAa,OAAO,OAAO,WAAW,WACrC,SAC8D;CAC9D,MAAM,QAAQ,OAAOA,OAAkC;CACvD,MAAM,WAAW;EAChB,GAAG,OAAO,MAAM,UAAsB;EACtC,GAAG,OAAO,MAAM,UAAsB;CACvC;CACA,MAAM,WAAW;EAChB,GAAG,OAAO,QAAQ,UAAkC;EACpD,GAAG,OAAO,QAAQ,UAAkC;CACrD;CACA,MAAM,OAAO,OAAO,GACnB,OAAO,IAAI,aAAa;EACvB,MAAM,UAAU,OAAO,QAAQ,KAAK,SAAS,EAAE;EAC/C,IAAI,OAAO,OAAO,OAAO,GAAG,OAAO,QAAQ;EAC3C,MAAM,WAAW,OAAO,QAAQ,KAAK,SAAS,EAAE;EAChD,IAAI,OAAO,OAAO,QAAQ,GAAG,OAAO,SAAS;EAC7C,KACE,OAAO,QAAQ,OAAO,SAAS,EAAE,OACjC,OAAO,QAAQ,OAAO,SAAS,EAAE,IAElC,OAAO,OAAO,MAAM,KAAK;EAC1B,OAAO,OAAO,OAAO;CACtB,CAAC,CACF;CACA,MAAM,UAAU,OAAO,MAAM,IAC5B,OAAO,iBAAiB,IAAI,CAAC,CAAC,KAC7B,OAAO,IAAI,QAAQ,MAAM,GACzB,OAAO,MACR,CACD;CACA,MAAMC,YAAUC,QAAgB;CAChC,OAAO,MAAM,IACZ,QAAQ,MAAM,KACb,OAAO,YAAY,UAClB,OAAO,WAAWD,UAAQ,OAAO,KAAK,CAAC,CAAC,CAAC,KACxC,OAAO,SAAS,WACf,OAAO,QACN,SACC,UAAU,MAAM,MAAM,SAAS,MAAM,UAAU,MAAM,OAAO,GAC7D,EAAE,SAAS,KAAK,CACjB,CACD,CACD,CACD,GACA,OAAO,QAAQA,UAAQ,MAAM,GAC7B,OAAO,QAAQ,OAAO,KAAA,YAAyB,KAAK,CAAC,CAAC,CAAC,CAAC,GACxD,OAAO,UAAU,UAChB,MAAM,SAAS,mBACZ,QACA,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACpD,CACD,CACD;CACA,OAAO;EACN,OAAO,MAAM;EACb,MAAM,MAAM;EACZ,KAAK,OAAO,GACX,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC,KAAK,OAAO,QAAQ,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC,CACvE,CAAC,CAAC,KAAK,OAAO,QAAQ,MAAM,KAAK,OAAO,CAAC,CAAC;EAC1C,OAAO,IAAI,YACV,MAAM,KACLE,OAAe;GAAE,SAAS;GAAI;EAAQ,CAAC,CAAC,CAAC,KACxC,OAAO,SAAS,UAAU,QAAQ,MAAM,SAAS,KAAK,KAAK,CAAC,GAC5D,OAAO,MACR,CACD;EACD,OAAO,OAAO,MAAM,KAAK,MAAM,KAAK,SAAS,GAAG,CAAC;CAClD;AACD,CAAC;AACyB,OAAO,WAAW,WAAW,QAAuB;CAC7E,MAAM,SAAS,OAAO,OAAO;CAC7B,MAAM,SAAS,OAAO,OAAO;CAC7B,OAAO,OAAO,KAAK;EAClB,OAAO,OAAO,iBAAiB,OAAO,IAAI,CAAC,CAAC,KAC3C,OAAO,iBACP,OAAO,KAAK,UACX,OAAO,UAAU,WAAW,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,IAAI,KAC/D,GACA,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;EACA,QAAQ,KAAK,SAAS,UAAsB,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,KAChE,KAAK,UAAU,UACd,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;CACD,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"Multiplex.js","names":["FailureGroup.make","decoder","Framing.decoder","Framing.encode"],"sources":["../../../src/internal/runner/Multiplex.ts"],"sourcesContent":["import {\n\tCause,\n\tEffect,\n\tFiber,\n\tOption,\n\tQueue,\n\tSink,\n\tStream,\n\tTxQueue,\n} from \"effect\"\nimport type { Socket } from \"effect/socket\"\n\nimport { TransportError } from \"../../Errors\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport type { Channel as ByteChannel } from \"../port\"\nimport * as Framing from \"./Framing\"\n\nexport interface Peer {\n\treadonly await: Effect.Effect<never, TransportError>\n\treadonly fail: (error: TransportError) => Effect.Effect<void>\n\treadonly end: Effect.Effect<void, TransportError>\n\treadonly send: (\n\t\tchannel: Framing.Channel,\n\t\tpayload: Uint8Array,\n\t) => Effect.Effect<void, TransportError | Framing.FrameError>\n\treadonly take: (\n\t\tchannel: Framing.Channel,\n\t) => Effect.Effect<Uint8Array, TransportError>\n}\n/** Ports own admission and ACK backpressure. This layer only frames and separates session/instance bytes. */\nexport const make = Effect.fnUntraced(function* (\n\tchannel: ByteChannel,\n): Effect.fn.Return<Peer, never, import(\"effect\").Scope.Scope> {\n\tconst group = yield* FailureGroup.make<TransportError>()\n\tconst incoming = {\n\t\t0: yield* Queue.unbounded<Uint8Array>(),\n\t\t1: yield* Queue.unbounded<Uint8Array>(),\n\t}\n\tconst outgoing = {\n\t\t0: yield* TxQueue.unbounded<Uint8Array, Cause.Done>(),\n\t\t1: yield* TxQueue.unbounded<Uint8Array, Cause.Done>(),\n\t}\n\tconst next = Effect.tx(\n\t\tEffect.gen(function* () {\n\t\t\tconst session = yield* TxQueue.poll(outgoing[0])\n\t\t\tif (Option.isSome(session)) return session.value\n\t\t\tconst instance = yield* TxQueue.poll(outgoing[1])\n\t\t\tif (Option.isSome(instance)) return instance.value\n\t\t\tif (\n\t\t\t\t(yield* TxQueue.isDone(outgoing[0])) &&\n\t\t\t\t(yield* TxQueue.isDone(outgoing[1]))\n\t\t\t)\n\t\t\t\treturn yield* Cause.done()\n\t\t\treturn yield* Effect.txRetry\n\t\t}),\n\t)\n\tconst writing = yield* group.run(\n\t\tStream.fromEffectRepeat(next).pipe(\n\t\t\tStream.run(channel.output),\n\t\t\tEffect.asVoid,\n\t\t),\n\t)\n\tconst decoder = Framing.decoder()\n\tyield* group.run(\n\t\tchannel.input.pipe(\n\t\t\tStream.runForEach((bytes) =>\n\t\t\t\tEffect.fromResult(decoder.decode(bytes)).pipe(\n\t\t\t\t\tEffect.flatMap((frames) =>\n\t\t\t\t\t\tEffect.forEach(\n\t\t\t\t\t\t\tframes,\n\t\t\t\t\t\t\t(frame) => Queue.offer(incoming[frame.channel], frame.payload),\n\t\t\t\t\t\t\t{ discard: true },\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t\tEffect.andThen(decoder.finish),\n\t\t\tEffect.andThen(Effect.fail(Framing.EndOfStream.make({}))),\n\t\t\tEffect.mapError((error) =>\n\t\t\t\terror._tag === \"TransportError\"\n\t\t\t\t\t? error\n\t\t\t\t\t: TransportError.make({ cause: Cause.fail(error) }),\n\t\t\t),\n\t\t),\n\t)\n\treturn {\n\t\tawait: group.await,\n\t\tfail: group.fail,\n\t\tend: Effect.tx(\n\t\t\tTxQueue.end(outgoing[0]).pipe(Effect.andThen(TxQueue.end(outgoing[1]))),\n\t\t).pipe(Effect.andThen(Fiber.join(writing))),\n\t\tsend: (id, payload) =>\n\t\t\tgroup.race(\n\t\t\t\tFraming.encode({ channel: id, payload }).pipe(\n\t\t\t\t\tEffect.flatMap((bytes) => TxQueue.offer(outgoing[id], bytes)),\n\t\t\t\t\tEffect.asVoid,\n\t\t\t\t),\n\t\t\t),\n\t\ttake: (id) => group.race(Queue.take(incoming[id])),\n\t}\n})\nexport const fromSocket = Effect.fnUntraced(function* (socket: Socket.Socket) {\n\tconst reader = yield* socket.reader\n\tconst writer = yield* socket.writer\n\treturn yield* make({\n\t\tinput: Stream.fromEffectRepeat(reader.pull).pipe(\n\t\t\tStream.flattenIterable,\n\t\t\tStream.map((bytes) =>\n\t\t\t\ttypeof bytes === \"string\" ? new TextEncoder().encode(bytes) : bytes,\n\t\t\t),\n\t\t\tStream.mapError((error) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t),\n\t\t),\n\t\toutput: Sink.forEach((bytes: Uint8Array) => writer.write(bytes)).pipe(\n\t\t\tSink.mapError((error) =>\n\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t),\n\t\t),\n\t})\n})\n"],"mappings":";;;;;;AA8BA,MAAa,OAAO,OAAO,WAAW,WACrC,SAC8D;CAC9D,MAAM,QAAQ,OAAOA,OAAkC;CACvD,MAAM,WAAW;EAChB,GAAG,OAAO,MAAM,UAAsB;EACtC,GAAG,OAAO,MAAM,UAAsB;CACvC;CACA,MAAM,WAAW;EAChB,GAAG,OAAO,QAAQ,UAAkC;EACpD,GAAG,OAAO,QAAQ,UAAkC;CACrD;CACA,MAAM,OAAO,OAAO,GACnB,OAAO,IAAI,aAAa;EACvB,MAAM,UAAU,OAAO,QAAQ,KAAK,SAAS,EAAE;EAC/C,IAAI,OAAO,OAAO,OAAO,GAAG,OAAO,QAAQ;EAC3C,MAAM,WAAW,OAAO,QAAQ,KAAK,SAAS,EAAE;EAChD,IAAI,OAAO,OAAO,QAAQ,GAAG,OAAO,SAAS;EAC7C,KACE,OAAO,QAAQ,OAAO,SAAS,EAAE,OACjC,OAAO,QAAQ,OAAO,SAAS,EAAE,IAElC,OAAO,OAAO,MAAM,KAAK;EAC1B,OAAO,OAAO,OAAO;CACtB,CAAC,CACF;CACA,MAAM,UAAU,OAAO,MAAM,IAC5B,OAAO,iBAAiB,IAAI,CAAC,CAAC,KAC7B,OAAO,IAAI,QAAQ,MAAM,GACzB,OAAO,MACR,CACD;CACA,MAAMC,YAAUC,QAAgB;CAChC,OAAO,MAAM,IACZ,QAAQ,MAAM,KACb,OAAO,YAAY,UAClB,OAAO,WAAWD,UAAQ,OAAO,KAAK,CAAC,CAAC,CAAC,KACxC,OAAO,SAAS,WACf,OAAO,QACN,SACC,UAAU,MAAM,MAAM,SAAS,MAAM,UAAU,MAAM,OAAO,GAC7D,EAAE,SAAS,KAAK,CACjB,CACD,CACD,CACD,GACA,OAAO,QAAQA,UAAQ,MAAM,GAC7B,OAAO,QAAQ,OAAO,KAAA,YAAyB,KAAK,CAAC,CAAC,CAAC,CAAC,GACxD,OAAO,UAAU,UAChB,MAAM,SAAS,mBACZ,QACA,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACpD,CACD,CACD;CACA,OAAO;EACN,OAAO,MAAM;EACb,MAAM,MAAM;EACZ,KAAK,OAAO,GACX,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC,KAAK,OAAO,QAAQ,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC,CACvE,CAAC,CAAC,KAAK,OAAO,QAAQ,MAAM,KAAK,OAAO,CAAC,CAAC;EAC1C,OAAO,IAAI,YACV,MAAM,KACLE,OAAe;GAAE,SAAS;GAAI;EAAQ,CAAC,CAAC,CAAC,KACxC,OAAO,SAAS,UAAU,QAAQ,MAAM,SAAS,KAAK,KAAK,CAAC,GAC5D,OAAO,MACR,CACD;EACD,OAAO,OAAO,MAAM,KAAK,MAAM,KAAK,SAAS,GAAG,CAAC;CAClD;AACD,CAAC;AACyB,OAAO,WAAW,WAAW,QAAuB;CAC7E,MAAM,SAAS,OAAO,OAAO;CAC7B,MAAM,SAAS,OAAO,OAAO;CAC7B,OAAO,OAAO,KAAK;EAClB,OAAO,OAAO,iBAAiB,OAAO,IAAI,CAAC,CAAC,KAC3C,OAAO,iBACP,OAAO,KAAK,UACX,OAAO,UAAU,WAAW,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,IAAI,KAC/D,GACA,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;EACA,QAAQ,KAAK,SAAS,UAAsB,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,KAChE,KAAK,UAAU,UACd,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD;CACD,CAAC;AACF,CAAC"}