@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":"Packages.js","names":[],"sources":["../../../src/internal/runner/Packages.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tEffect,\n\tFileSystem,\n\tOrder,\n\tPath,\n\tSchema,\n\tStream,\n\tString,\n} from \"effect\"\nimport type { PlatformError } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\n// @effect-diagnostics-next-line nodeBuiltinImport:off -- WebCrypto has no incremental digest API; package files are hashed as streams without buffering the directory.\nimport { createHash } from \"node:crypto\"\nimport process from \"node:process\"\nimport { fileURLToPath } from \"node:url\"\nimport { PackageError, type CodeIdentity } from \"./model\"\n\nconst Manifest = Schema.Struct({ name: Schema.String, version: Schema.String })\nexport interface Expected {\n\treadonly version?: string\n\treadonly digest?: string\n}\nexport const verify = (actual: CodeIdentity, expected: Expected = {}) =>\n\texpected.version !== undefined && actual.version !== expected.version\n\t\t? Effect.fail(\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: `Package version mismatch: expected ${expected.version}, received ${actual.version}`,\n\t\t\t\t}),\n\t\t\t)\n\t\t: expected.digest !== undefined && actual.digest !== expected.digest\n\t\t\t? Effect.fail(\n\t\t\t\t\tPackageError.make({\n\t\t\t\t\t\tdetail: `Package digest mismatch: expected ${expected.digest}, received ${actual.digest}`,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: Effect.void\n\n/** A path-sensitive SHA-256 of sorted entries and bytes, excluding every node_modules subtree. */\nexport const digest = Effect.fnUntraced(function* (directory: string) {\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst hash = yield* Effect.sync(() =>\n\t\tcreateHash(\"sha256\").update(\"graft-package-sha256-v1\\0\"),\n\t)\n\tconst visit = Effect.fnUntraced(function* (\n\t\trelative: string,\n\t): Effect.fn.Return<void, PackageError | PlatformError.PlatformError> {\n\t\tconst filename = path.join(directory, relative)\n\t\tconst info = yield* fs.stat(filename)\n\t\tif (info.type !== \"File\" && info.type !== \"Directory\")\n\t\t\treturn yield* PackageError.make({\n\t\t\t\tdetail: `Unsupported package entry: ${relative}`,\n\t\t\t})\n\t\tconst name = new TextEncoder().encode(relative)\n\t\tyield* Effect.sync(() => {\n\t\t\thash.update(\n\t\t\t\t`${info.type}:${name.byteLength}:${info.type === \"File\" ? info.size : 0}:`,\n\t\t\t)\n\t\t\thash.update(name)\n\t\t})\n\t\tif (info.type === \"File\") {\n\t\t\tyield* fs.stream(filename).pipe(\n\t\t\t\tStream.runForEach((bytes) =>\n\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\thash.update(bytes)\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\tconst entries = yield* fs.readDirectory(filename)\n\t\t\tfor (const entry of Array.sort(entries, Order.String)) {\n\t\t\t\tif (entry === \"node_modules\") continue\n\t\t\t\tyield* visit(relative === \"\" ? entry : `${relative}/${entry}`)\n\t\t\t}\n\t\t}\n\t})\n\tyield* visit(\"\")\n\treturn yield* Effect.sync(() => hash.digest(\"hex\"))\n})\n\n/**\n * Resolve using Node's import conditions without importing executable package code.\n * The helper's cwd is the installation root and it inherits no NODE_OPTIONS/loaders.\n * The installation directory and its package exports are trusted.\n */\nexport const resolve = Effect.fnUntraced(\n\tfunction* (root: string, specifier: string, includeDigest: boolean = false) {\n\t\tconst segments = String.split(specifier, \"/\")\n\t\tconst scoped = String.startsWith(\"@\")(specifier)\n\t\tconst name = Array.join(Array.take(segments, scoped ? 2 : 1), \"/\")\n\t\tconst fs = yield* FileSystem.FileSystem\n\t\tconst path = yield* Path.Path\n\t\tconst installation = yield* fs.realPath(root)\n\t\tconst directory = yield* fs.realPath(\n\t\t\tpath.join(installation, \"node_modules\", name),\n\t\t)\n\t\tconst manifest = yield* fs\n\t\t\t.readFileString(path.join(directory, \"package.json\"))\n\t\t\t.pipe(\n\t\t\t\tEffect.flatMap(Schema.decodeEffect(Schema.fromJsonString(Manifest))),\n\t\t\t)\n\t\tconst resolved = yield* resolveEntry(installation, specifier)\n\t\tconst filename = yield* Effect.try({\n\t\t\ttry: () => fileURLToPath(resolved),\n\t\t\tcatch: (error) =>\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: \"The package export is not a file URL\",\n\t\t\t\t\tcause: Cause.die(error),\n\t\t\t\t}),\n\t\t})\n\t\tconst entry = yield* fs.realPath(filename)\n\t\tconst identity: CodeIdentity = {\n\t\t\t...manifest,\n\t\t\t...(includeDigest ? { digest: yield* digest(directory) } : {}),\n\t\t}\n\t\treturn { directory, entry, identity }\n\t},\n\tEffect.catchTags({\n\t\tPlatformError: (error) =>\n\t\t\tEffect.fail(\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: \"Reading the installed package failed\",\n\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t}),\n\t\t\t),\n\t\tSchemaError: (error) =>\n\t\t\tEffect.fail(\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: \"Reading the package manifest failed\",\n\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t}),\n\t\t\t),\n\t}),\n)\n\nexport const resolveEntry = Effect.fnUntraced(function* (\n\tinstallation: string,\n\tspecifier: string,\n) {\n\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n\tconst child = yield* spawner.spawn(\n\t\tChildProcess.make(\n\t\t\tprocess.execPath,\n\t\t\t[\n\t\t\t\t\"--input-type=module\",\n\t\t\t\t\"--eval\",\n\t\t\t\t\"process.stdout.write(import.meta.resolve(process.argv[1]))\",\n\t\t\t\t\"--\",\n\t\t\t\tspecifier,\n\t\t\t],\n\t\t\t{\n\t\t\t\tcwd: installation,\n\t\t\t\tenv: {},\n\t\t\t\tstdin: \"ignore\",\n\t\t\t\tstdout: \"pipe\",\n\t\t\t\tstderr: \"pipe\",\n\t\t\t},\n\t\t),\n\t)\n\tconst [code, stdout, stderr] = yield* Effect.all(\n\t\t[\n\t\t\tchild.exitCode,\n\t\t\tchild.stdout.pipe(Stream.decodeText(), Stream.mkString),\n\t\t\tchild.stderr.pipe(Stream.decodeText(), Stream.mkString),\n\t\t],\n\t\t{ concurrency: \"unbounded\" },\n\t)\n\tif (code !== 0)\n\t\treturn yield* PackageError.make({\n\t\t\tdetail: `Package resolution failed: ${stderr}`,\n\t\t})\n\treturn stdout\n}, Effect.scoped)\n"],"mappings":"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"}
1
+ {"version":3,"file":"Packages.js","names":[],"sources":["../../../src/internal/runner/Packages.ts"],"sourcesContent":["// @effect-diagnostics-next-line nodeBuiltinImport:off -- WebCrypto has no incremental digest API; package files are hashed as streams without buffering the directory.\nimport { createHash } from \"node:crypto\"\nimport process from \"node:process\"\nimport { fileURLToPath } from \"node:url\"\n\nimport {\n\tArray,\n\tCause,\n\tEffect,\n\tFileSystem,\n\tOrder,\n\tPath,\n\tSchema,\n\tStream,\n\tString,\n\ttype PlatformError,\n} from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\n\nimport { PackageError, type CodeIdentity } from \"./model\"\n\nconst Manifest = Schema.Struct({ name: Schema.String, version: Schema.String })\nexport interface Expected {\n\treadonly version?: string\n\treadonly digest?: string\n}\nexport const verify = (actual: CodeIdentity, expected: Expected = {}) =>\n\texpected.version !== undefined && actual.version !== expected.version\n\t\t? Effect.fail(\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: `Package version mismatch: expected ${expected.version}, received ${actual.version}`,\n\t\t\t\t}),\n\t\t\t)\n\t\t: expected.digest !== undefined && actual.digest !== expected.digest\n\t\t\t? Effect.fail(\n\t\t\t\t\tPackageError.make({\n\t\t\t\t\t\tdetail: `Package digest mismatch: expected ${expected.digest}, received ${actual.digest}`,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: Effect.void\n\n/** A path-sensitive SHA-256 of sorted entries and bytes, excluding every node_modules subtree. */\nexport const digest = Effect.fnUntraced(function* (directory: string) {\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst hash = yield* Effect.sync(() =>\n\t\tcreateHash(\"sha256\").update(\"graft-package-sha256-v1\\0\"),\n\t)\n\tconst visit = Effect.fnUntraced(function* (\n\t\trelative: string,\n\t): Effect.fn.Return<void, PackageError | PlatformError.PlatformError> {\n\t\tconst filename = path.join(directory, relative)\n\t\tconst info = yield* fs.stat(filename)\n\t\tif (info.type !== \"File\" && info.type !== \"Directory\")\n\t\t\treturn yield* PackageError.make({\n\t\t\t\tdetail: `Unsupported package entry: ${relative}`,\n\t\t\t})\n\t\tconst name = new TextEncoder().encode(relative)\n\t\tyield* Effect.sync(() => {\n\t\t\thash.update(\n\t\t\t\t`${info.type}:${name.byteLength}:${info.type === \"File\" ? info.size : 0}:`,\n\t\t\t)\n\t\t\thash.update(name)\n\t\t})\n\t\tif (info.type === \"File\") {\n\t\t\tyield* fs.stream(filename).pipe(\n\t\t\t\tStream.runForEach((bytes) =>\n\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\thash.update(bytes)\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\tconst entries = yield* fs.readDirectory(filename)\n\t\t\tfor (const entry of Array.sort(entries, Order.String)) {\n\t\t\t\tif (entry === \"node_modules\") continue\n\t\t\t\tyield* visit(relative === \"\" ? entry : `${relative}/${entry}`)\n\t\t\t}\n\t\t}\n\t})\n\tyield* visit(\"\")\n\treturn yield* Effect.sync(() => hash.digest(\"hex\"))\n})\n\n/**\n * Resolve using Node's import conditions without importing executable package code.\n * The helper's cwd is the installation root and it inherits no NODE_OPTIONS/loaders.\n * The installation directory and its package exports are trusted.\n */\nexport const resolve = Effect.fnUntraced(\n\tfunction* (root: string, specifier: string, includeDigest: boolean = false) {\n\t\tconst segments = String.split(specifier, \"/\")\n\t\tconst scoped = String.startsWith(\"@\")(specifier)\n\t\tconst name = Array.join(Array.take(segments, scoped ? 2 : 1), \"/\")\n\t\tconst fs = yield* FileSystem.FileSystem\n\t\tconst path = yield* Path.Path\n\t\tconst installation = yield* fs.realPath(root)\n\t\tconst directory = yield* fs.realPath(\n\t\t\tpath.join(installation, \"node_modules\", name),\n\t\t)\n\t\tconst manifest = yield* fs\n\t\t\t.readFileString(path.join(directory, \"package.json\"))\n\t\t\t.pipe(\n\t\t\t\tEffect.flatMap(Schema.decodeEffect(Schema.fromJsonString(Manifest))),\n\t\t\t)\n\t\tconst resolved = yield* resolveEntry(installation, specifier)\n\t\tconst filename = yield* Effect.try({\n\t\t\ttry: () => fileURLToPath(resolved),\n\t\t\tcatch: (error) =>\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: \"The package export is not a file URL\",\n\t\t\t\t\tcause: Cause.die(error),\n\t\t\t\t}),\n\t\t})\n\t\tconst entry = yield* fs.realPath(filename)\n\t\tconst identity: CodeIdentity = {\n\t\t\t...manifest,\n\t\t\t...(includeDigest ? { digest: yield* digest(directory) } : {}),\n\t\t}\n\t\treturn { directory, entry, identity }\n\t},\n\tEffect.catchTags({\n\t\tPlatformError: (error) =>\n\t\t\tEffect.fail(\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: \"Reading the installed package failed\",\n\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t}),\n\t\t\t),\n\t\tSchemaError: (error) =>\n\t\t\tEffect.fail(\n\t\t\t\tPackageError.make({\n\t\t\t\t\tdetail: \"Reading the package manifest failed\",\n\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t}),\n\t\t\t),\n\t}),\n)\n\nexport const resolveEntry = Effect.fnUntraced(function* (\n\tinstallation: string,\n\tspecifier: string,\n) {\n\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n\tconst child = yield* spawner.spawn(\n\t\tChildProcess.make(\n\t\t\tprocess.execPath,\n\t\t\t[\n\t\t\t\t\"--input-type=module\",\n\t\t\t\t\"--eval\",\n\t\t\t\t\"process.stdout.write(import.meta.resolve(process.argv[1]))\",\n\t\t\t\t\"--\",\n\t\t\t\tspecifier,\n\t\t\t],\n\t\t\t{\n\t\t\t\tcwd: installation,\n\t\t\t\tenv: {},\n\t\t\t\tstdin: \"ignore\",\n\t\t\t\tstdout: \"pipe\",\n\t\t\t\tstderr: \"pipe\",\n\t\t\t},\n\t\t),\n\t)\n\tconst [code, stdout, stderr] = yield* Effect.all(\n\t\t[\n\t\t\tchild.exitCode,\n\t\t\tchild.stdout.pipe(Stream.decodeText(), Stream.mkString),\n\t\t\tchild.stderr.pipe(Stream.decodeText(), Stream.mkString),\n\t\t],\n\t\t{ concurrency: \"unbounded\" },\n\t)\n\tif (code !== 0)\n\t\treturn yield* PackageError.make({\n\t\t\tdetail: `Package resolution failed: ${stderr}`,\n\t\t})\n\treturn stdout\n}, Effect.scoped)\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProcessObservation.js","names":["FailureGroup.make"],"sources":["../../../src/internal/runner/ProcessObservation.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tEffect,\n\tExit,\n\tFiber,\n\tRef,\n\tSchedule,\n\tStream,\n\tString,\n} from \"effect\"\nimport type { PlatformError } from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/process\"\nimport * as FailureGroup from \"../FailureGroup\"\n\n/** Time allowed for a direct execution unit or launcher to exit after input EOF. */\nexport const stdinExitTimeout = \"1 second\"\n\n/** Readers outlive the failure monitor so forced termination still captures its diagnostic tail. */\nexport const observe = Effect.fnUntraced(function* (\n\tchild: ChildProcessSpawner.ChildProcessHandle,\n\toptions: { readonly drainStdout?: boolean } = {},\n) {\n\tconst failures = yield* FailureGroup.make<PlatformError.PlatformError>()\n\tconst tail = yield* Ref.make(\"\")\n\t// Command transports own stdout as a protocol stream.\n\tconst stdout = yield* (\n\t\toptions.drainStdout === false ? Effect.void : Stream.runDrain(child.stdout)\n\t).pipe(Effect.forkScoped)\n\tconst stderr = yield* child.stderr.pipe(\n\t\tStream.decodeText(),\n\t\tStream.runForEach((text) =>\n\t\t\tRef.update(tail, (old) => String.takeRight(old + text, 8192)),\n\t\t),\n\t\tEffect.forkScoped,\n\t)\n\tyield* failures.run(Fiber.join(stdout))\n\tyield* failures.run(Fiber.join(stderr))\n\tconst exited = yield* Effect.gen(function* () {\n\t\tconst result = yield* Effect.exit(child.exitCode)\n\t\t// exitCode can fail before exit on an input error; isRunning follows Node's exit event.\n\t\tyield* child.isRunning.pipe(\n\t\t\tEffect.repeat({\n\t\t\t\tschedule: Schedule.spaced(\"25 millis\"),\n\t\t\t\twhile: (running) => running,\n\t\t\t}),\n\t\t)\n\t\tconst err = yield* Fiber.await(stderr)\n\t\tconst out = yield* Fiber.await(stdout)\n\t\treturn {\n\t\t\tcode: Exit.isSuccess(result) ? result.value : null,\n\t\t\tsignal: null,\n\t\t\tstderr: yield* Ref.get(tail),\n\t\t\tcause: Array.reduce(\n\t\t\t\t[Exit.asVoid(result), err, out],\n\t\t\t\tCause.empty,\n\t\t\t\t(cause: Cause.Cause<PlatformError.PlatformError>, exit) =>\n\t\t\t\t\tExit.isFailure(exit) ? Cause.combine(cause, exit.cause) : cause,\n\t\t\t),\n\t\t}\n\t}).pipe(Effect.forkScoped)\n\treturn { exited: Fiber.join(exited), failure: failures.await }\n})\n"],"mappings":";;;;AAgBA,MAAa,mBAAmB;;AAGhC,MAAa,UAAU,OAAO,WAAW,WACxC,OACA,UAA8C,CAAC,GAC9C;CACD,MAAM,WAAW,OAAOA,KAA+C;CACvE,MAAM,OAAO,OAAO,IAAI,KAAK,EAAE;CAE/B,MAAM,SAAS,QACd,QAAQ,gBAAgB,QAAQ,OAAO,OAAO,OAAO,SAAS,MAAM,MAAM,EAAA,CACzE,KAAK,OAAO,UAAU;CACxB,MAAM,SAAS,OAAO,MAAM,OAAO,KAClC,OAAO,WAAW,GAClB,OAAO,YAAY,SAClB,IAAI,OAAO,OAAO,QAAQ,OAAO,UAAU,MAAM,MAAM,IAAI,CAAC,CAC7D,GACA,OAAO,UACR;CACA,OAAO,SAAS,IAAI,MAAM,KAAK,MAAM,CAAC;CACtC,OAAO,SAAS,IAAI,MAAM,KAAK,MAAM,CAAC;CACtC,MAAM,SAAS,OAAO,OAAO,IAAI,aAAa;EAC7C,MAAM,SAAS,OAAO,OAAO,KAAK,MAAM,QAAQ;EAEhD,OAAO,MAAM,UAAU,KACtB,OAAO,OAAO;GACb,UAAU,SAAS,OAAO,WAAW;GACrC,QAAQ,YAAY;EACrB,CAAC,CACF;EACA,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM;EACrC,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM;EACrC,OAAO;GACN,MAAM,KAAK,UAAU,MAAM,IAAI,OAAO,QAAQ;GAC9C,QAAQ;GACR,QAAQ,OAAO,IAAI,IAAI,IAAI;GAC3B,OAAO,MAAM,OACZ;IAAC,KAAK,OAAO,MAAM;IAAG;IAAK;GAAG,GAC9B,MAAM,QACL,OAAiD,SACjD,KAAK,UAAU,IAAI,IAAI,MAAM,QAAQ,OAAO,KAAK,KAAK,IAAI,KAC5D;EACD;CACD,CAAC,CAAC,CAAC,KAAK,OAAO,UAAU;CACzB,OAAO;EAAE,QAAQ,MAAM,KAAK,MAAM;EAAG,SAAS,SAAS;CAAM;AAC9D,CAAC"}
1
+ {"version":3,"file":"ProcessObservation.js","names":["FailureGroup.make"],"sources":["../../../src/internal/runner/ProcessObservation.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tEffect,\n\tExit,\n\tFiber,\n\tRef,\n\tSchedule,\n\tStream,\n\tString,\n\ttype PlatformError,\n} from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/process\"\n\nimport * as FailureGroup from \"../FailureGroup\"\n\n/** Time allowed for a direct execution unit or launcher to exit after input EOF. */\nexport const stdinExitTimeout = \"1 second\"\n\n/** Readers outlive the failure monitor so forced termination still captures its diagnostic tail. */\nexport const observe = Effect.fnUntraced(function* (\n\tchild: ChildProcessSpawner.ChildProcessHandle,\n\toptions: { readonly drainStdout?: boolean } = {},\n) {\n\tconst failures = yield* FailureGroup.make<PlatformError.PlatformError>()\n\tconst tail = yield* Ref.make(\"\")\n\t// Command transports own stdout as a protocol stream.\n\tconst stdout = yield* (\n\t\toptions.drainStdout === false ? Effect.void : Stream.runDrain(child.stdout)\n\t).pipe(Effect.forkScoped)\n\tconst stderr = yield* child.stderr.pipe(\n\t\tStream.decodeText(),\n\t\tStream.runForEach((text) =>\n\t\t\tRef.update(tail, (old) => String.takeRight(old + text, 8192)),\n\t\t),\n\t\tEffect.forkScoped,\n\t)\n\tyield* failures.run(Fiber.join(stdout))\n\tyield* failures.run(Fiber.join(stderr))\n\tconst exited = yield* Effect.gen(function* () {\n\t\tconst result = yield* Effect.exit(child.exitCode)\n\t\t// exitCode can fail before exit on an input error; isRunning follows Node's exit event.\n\t\tyield* child.isRunning.pipe(\n\t\t\tEffect.repeat({\n\t\t\t\tschedule: Schedule.spaced(\"25 millis\"),\n\t\t\t\twhile: (running) => running,\n\t\t\t}),\n\t\t)\n\t\tconst err = yield* Fiber.await(stderr)\n\t\tconst out = yield* Fiber.await(stdout)\n\t\treturn {\n\t\t\tcode: Exit.isSuccess(result) ? result.value : null,\n\t\t\tsignal: null,\n\t\t\tstderr: yield* Ref.get(tail),\n\t\t\tcause: Array.reduce(\n\t\t\t\t[Exit.asVoid(result), err, out],\n\t\t\t\tCause.empty,\n\t\t\t\t(cause: Cause.Cause<PlatformError.PlatformError>, exit) =>\n\t\t\t\t\tExit.isFailure(exit) ? Cause.combine(cause, exit.cause) : cause,\n\t\t\t),\n\t\t}\n\t}).pipe(Effect.forkScoped)\n\treturn { exited: Fiber.join(exited), failure: failures.await }\n})\n"],"mappings":";;;;AAiBA,MAAa,mBAAmB;;AAGhC,MAAa,UAAU,OAAO,WAAW,WACxC,OACA,UAA8C,CAAC,GAC9C;CACD,MAAM,WAAW,OAAOA,KAA+C;CACvE,MAAM,OAAO,OAAO,IAAI,KAAK,EAAE;CAE/B,MAAM,SAAS,QACd,QAAQ,gBAAgB,QAAQ,OAAO,OAAO,OAAO,SAAS,MAAM,MAAM,EAAA,CACzE,KAAK,OAAO,UAAU;CACxB,MAAM,SAAS,OAAO,MAAM,OAAO,KAClC,OAAO,WAAW,GAClB,OAAO,YAAY,SAClB,IAAI,OAAO,OAAO,QAAQ,OAAO,UAAU,MAAM,MAAM,IAAI,CAAC,CAC7D,GACA,OAAO,UACR;CACA,OAAO,SAAS,IAAI,MAAM,KAAK,MAAM,CAAC;CACtC,OAAO,SAAS,IAAI,MAAM,KAAK,MAAM,CAAC;CACtC,MAAM,SAAS,OAAO,OAAO,IAAI,aAAa;EAC7C,MAAM,SAAS,OAAO,OAAO,KAAK,MAAM,QAAQ;EAEhD,OAAO,MAAM,UAAU,KACtB,OAAO,OAAO;GACb,UAAU,SAAS,OAAO,WAAW;GACrC,QAAQ,YAAY;EACrB,CAAC,CACF;EACA,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM;EACrC,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM;EACrC,OAAO;GACN,MAAM,KAAK,UAAU,MAAM,IAAI,OAAO,QAAQ;GAC9C,QAAQ;GACR,QAAQ,OAAO,IAAI,IAAI,IAAI;GAC3B,OAAO,MAAM,OACZ;IAAC,KAAK,OAAO,MAAM;IAAG;IAAK;GAAG,GAC9B,MAAM,QACL,OAAiD,SACjD,KAAK,UAAU,IAAI,IAAI,MAAM,QAAQ,OAAO,KAAK,KAAK,IAAI,KAC5D;EACD;CACD,CAAC,CAAC,CAAC,KAAK,OAAO,UAAU;CACzB,OAAO;EAAE,QAAQ,MAAM,KAAK,MAAM;EAAG,SAAS,SAAS;CAAM;AAC9D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Processes.js","names":[],"sources":["../../../src/internal/runner/Processes.ts"],"sourcesContent":["import { Cause, Effect, Option, Schedule, Stream, String } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\nimport process from \"node:process\"\nimport {\n\tExecutionError,\n\tTerminationUnconfirmed,\n\ttype ProcessIdentity,\n\ttype Termination,\n} from \"./model\"\n\nconst inspect = Effect.fnUntraced(\n\tfunction* (pid: number) {\n\t\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n\t\tconst child = yield* spawner.spawn(\n\t\t\tChildProcess.make(\n\t\t\t\t\"ps\",\n\t\t\t\t[\"-p\", `${pid}`, \"-o\", \"lstart=\", \"-o\", \"stat=\"],\n\t\t\t\t{\n\t\t\t\t\tenv: { LC_ALL: \"C\" },\n\t\t\t\t\textendEnv: true,\n\t\t\t\t\tstdin: \"ignore\",\n\t\t\t\t},\n\t\t\t),\n\t\t)\n\t\tconst [code, output, stderr] = yield* Effect.all(\n\t\t\t[\n\t\t\t\tchild.exitCode,\n\t\t\t\tchild.stdout.pipe(Stream.decodeText(), Stream.mkString),\n\t\t\t\tchild.stderr.pipe(Stream.decodeText(), Stream.mkString),\n\t\t\t],\n\t\t\t{ concurrency: \"unbounded\" },\n\t\t)\n\t\tif (code === 1 && String.trim(output) === \"\") return Option.none()\n\t\tconst [, born, status] =\n\t\t\t/^(.{24})\\s+(\\S+)$/m.exec(String.trim(output)) ?? []\n\t\tif (code !== 0 || born === undefined || status === undefined)\n\t\t\treturn yield* ExecutionError.make({\n\t\t\t\tdetail: \"Cannot inspect process identity: \" + stderr,\n\t\t\t})\n\t\tif (String.startsWith(\"Z\")(status)) return Option.none()\n\t\treturn Option.some({ born })\n\t},\n\tEffect.scoped,\n\tEffect.mapError((error) =>\n\t\terror._tag === \"ExecutionError\"\n\t\t\t? error\n\t\t\t: ExecutionError.make({\n\t\t\t\t\tdetail: \"Inspecting process identity failed\",\n\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t}),\n\t),\n)\n\nexport const identity = Effect.fnUntraced(function* (pid: number) {\n\tconst current = yield* inspect(pid)\n\tif (Option.isNone(current))\n\t\treturn yield* ExecutionError.make({\n\t\t\tdetail: \"The child exited before its identity could be recorded\",\n\t\t})\n\treturn { pid, start: current.value }\n})\n\n// The OS may discard argv before reporting a zombie; PID and start time remain the identity.\nexport const matches = Effect.fnUntraced(function* (child: ProcessIdentity) {\n\tconst current = yield* inspect(child.pid)\n\tif (Option.isNone(current) || current.value.born !== child.start.born)\n\t\treturn false\n\treturn true\n})\n\nexport const recover = Effect.fnUntraced(function* (child: ProcessIdentity) {\n\tif (!(yield* matches(child)))\n\t\treturn {\n\t\t\tkind: \"Exited\",\n\t\t\texit: { code: null, signal: null },\n\t\t\tcause: Cause.empty,\n\t\t} satisfies Termination\n\t// The PID can still be reused between this final check and kill; an external supervisor covers descendants.\n\tconst sent = yield* Effect.exit(\n\t\tEffect.try({\n\t\t\ttry: () => process.kill(child.pid, \"SIGKILL\"),\n\t\t\tcatch: (cause) =>\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Signaling the orphan failed\",\n\t\t\t\t\tcause: Cause.die(cause),\n\t\t\t\t}),\n\t\t}),\n\t)\n\tconst confirmed = yield* matches(child).pipe(\n\t\tEffect.repeat({\n\t\t\tschedule: Schedule.spaced(\"50 millis\"),\n\t\t\twhile: (value) => value,\n\t\t}),\n\t\tEffect.timeoutOption(\"10 seconds\"),\n\t)\n\tif (Option.isNone(confirmed))\n\t\treturn yield* TerminationUnconfirmed.make({\n\t\t\tdetail: \"The orphan did not exit after recovery\",\n\t\t\tcause: sent._tag === \"Failure\" ? sent.cause : Cause.empty,\n\t\t})\n\treturn {\n\t\tkind: \"Killed\",\n\t\texit: { code: null, signal: \"SIGKILL\" },\n\t\tcause: sent._tag === \"Failure\" ? sent.cause : Cause.empty,\n\t} satisfies Termination\n})\n"],"mappings":";;;;;AAUA,MAAM,UAAU,OAAO,WACtB,WAAW,KAAa;CAEvB,MAAM,QAAQ,QAAO,OADE,oBAAoB,oBAAA,CACd,MAC5B,aAAa,KACZ,MACA;EAAC;EAAM,GAAG;EAAO;EAAM;EAAW;EAAM;CAAO,GAC/C;EACC,KAAK,EAAE,QAAQ,IAAI;EACnB,WAAW;EACX,OAAO;CACR,CACD,CACD;CACA,MAAM,CAAC,MAAM,QAAQ,UAAU,OAAO,OAAO,IAC5C;EACC,MAAM;EACN,MAAM,OAAO,KAAK,OAAO,WAAW,GAAG,OAAO,QAAQ;EACtD,MAAM,OAAO,KAAK,OAAO,WAAW,GAAG,OAAO,QAAQ;CACvD,GACA,EAAE,aAAa,YAAY,CAC5B;CACA,IAAI,SAAS,KAAK,OAAO,KAAK,MAAM,MAAM,IAAI,OAAO,OAAO,KAAK;CACjE,MAAM,GAAG,MAAM,UACd,qBAAqB,KAAK,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC;CACpD,IAAI,SAAS,KAAK,SAAS,KAAA,KAAa,WAAW,KAAA,GAClD,OAAO,OAAO,eAAe,KAAK,EACjC,QAAQ,sCAAsC,OAC/C,CAAC;CACF,IAAI,OAAO,WAAW,GAAG,CAAC,CAAC,MAAM,GAAG,OAAO,OAAO,KAAK;CACvD,OAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAC5B,GACA,OAAO,QACP,OAAO,UAAU,UAChB,MAAM,SAAS,mBACZ,QACA,eAAe,KAAK;CACpB,QAAQ;CACR,OAAO,MAAM,KAAK,KAAK;AACxB,CAAC,CACJ,CACD;AAEA,MAAa,WAAW,OAAO,WAAW,WAAW,KAAa;CACjE,MAAM,UAAU,OAAO,QAAQ,GAAG;CAClC,IAAI,OAAO,OAAO,OAAO,GACxB,OAAO,OAAO,eAAe,KAAK,EACjC,QAAQ,yDACT,CAAC;CACF,OAAO;EAAE;EAAK,OAAO,QAAQ;CAAM;AACpC,CAAC;AAGD,MAAa,UAAU,OAAO,WAAW,WAAW,OAAwB;CAC3E,MAAM,UAAU,OAAO,QAAQ,MAAM,GAAG;CACxC,IAAI,OAAO,OAAO,OAAO,KAAK,QAAQ,MAAM,SAAS,MAAM,MAAM,MAChE,OAAO;CACR,OAAO;AACR,CAAC;AAED,MAAa,UAAU,OAAO,WAAW,WAAW,OAAwB;CAC3E,IAAI,EAAE,OAAO,QAAQ,KAAK,IACzB,OAAO;EACN,MAAM;EACN,MAAM;GAAE,MAAM;GAAM,QAAQ;EAAK;EACjC,OAAO,MAAM;CACd;CAED,MAAM,OAAO,OAAO,OAAO,KAC1B,OAAO,IAAI;EACV,WAAW,QAAQ,KAAK,MAAM,KAAK,SAAS;EAC5C,QAAQ,UACP,eAAe,KAAK;GACnB,QAAQ;GACR,OAAO,MAAM,IAAI,KAAK;EACvB,CAAC;CACH,CAAC,CACF;CACA,MAAM,YAAY,OAAO,QAAQ,KAAK,CAAC,CAAC,KACvC,OAAO,OAAO;EACb,UAAU,SAAS,OAAO,WAAW;EACrC,QAAQ,UAAU;CACnB,CAAC,GACD,OAAO,cAAc,YAAY,CAClC;CACA,IAAI,OAAO,OAAO,SAAS,GAC1B,OAAO,OAAO,uBAAuB,KAAK;EACzC,QAAQ;EACR,OAAO,KAAK,SAAS,YAAY,KAAK,QAAQ,MAAM;CACrD,CAAC;CACF,OAAO;EACN,MAAM;EACN,MAAM;GAAE,MAAM;GAAM,QAAQ;EAAU;EACtC,OAAO,KAAK,SAAS,YAAY,KAAK,QAAQ,MAAM;CACrD;AACD,CAAC"}
1
+ {"version":3,"file":"Processes.js","names":[],"sources":["../../../src/internal/runner/Processes.ts"],"sourcesContent":["import process from \"node:process\"\n\nimport { Cause, Effect, Option, Schedule, Stream, String } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/process\"\n\nimport {\n\tExecutionError,\n\tTerminationUnconfirmed,\n\ttype ProcessIdentity,\n\ttype Termination,\n} from \"./model\"\n\nconst inspect = Effect.fnUntraced(\n\tfunction* (pid: number) {\n\t\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n\t\tconst child = yield* spawner.spawn(\n\t\t\tChildProcess.make(\n\t\t\t\t\"ps\",\n\t\t\t\t[\"-p\", `${pid}`, \"-o\", \"lstart=\", \"-o\", \"stat=\"],\n\t\t\t\t{\n\t\t\t\t\tenv: { LC_ALL: \"C\" },\n\t\t\t\t\textendEnv: true,\n\t\t\t\t\tstdin: \"ignore\",\n\t\t\t\t},\n\t\t\t),\n\t\t)\n\t\tconst [code, output, stderr] = yield* Effect.all(\n\t\t\t[\n\t\t\t\tchild.exitCode,\n\t\t\t\tchild.stdout.pipe(Stream.decodeText(), Stream.mkString),\n\t\t\t\tchild.stderr.pipe(Stream.decodeText(), Stream.mkString),\n\t\t\t],\n\t\t\t{ concurrency: \"unbounded\" },\n\t\t)\n\t\tif (code === 1 && String.trim(output) === \"\") return Option.none()\n\t\tconst [, born, status] =\n\t\t\t/^(.{24})\\s+(\\S+)$/m.exec(String.trim(output)) ?? []\n\t\tif (code !== 0 || born === undefined || status === undefined)\n\t\t\treturn yield* ExecutionError.make({\n\t\t\t\tdetail: \"Cannot inspect process identity: \" + stderr,\n\t\t\t})\n\t\tif (String.startsWith(\"Z\")(status)) return Option.none()\n\t\treturn Option.some({ born })\n\t},\n\tEffect.scoped,\n\tEffect.mapError((error) =>\n\t\terror._tag === \"ExecutionError\"\n\t\t\t? error\n\t\t\t: ExecutionError.make({\n\t\t\t\t\tdetail: \"Inspecting process identity failed\",\n\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t}),\n\t),\n)\n\nexport const identity = Effect.fnUntraced(function* (pid: number) {\n\tconst current = yield* inspect(pid)\n\tif (Option.isNone(current))\n\t\treturn yield* ExecutionError.make({\n\t\t\tdetail: \"The child exited before its identity could be recorded\",\n\t\t})\n\treturn { pid, start: current.value }\n})\n\n// The OS may discard argv before reporting a zombie; PID and start time remain the identity.\nexport const matches = Effect.fnUntraced(function* (child: ProcessIdentity) {\n\tconst current = yield* inspect(child.pid)\n\tif (Option.isNone(current) || current.value.born !== child.start.born)\n\t\treturn false\n\treturn true\n})\n\nexport const recover = Effect.fnUntraced(function* (child: ProcessIdentity) {\n\tif (!(yield* matches(child)))\n\t\treturn {\n\t\t\tkind: \"Exited\",\n\t\t\texit: { code: null, signal: null },\n\t\t\tcause: Cause.empty,\n\t\t} satisfies Termination\n\t// The PID can still be reused between this final check and kill; an external supervisor covers descendants.\n\tconst sent = yield* Effect.exit(\n\t\tEffect.try({\n\t\t\ttry: () => process.kill(child.pid, \"SIGKILL\"),\n\t\t\tcatch: (cause) =>\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Signaling the orphan failed\",\n\t\t\t\t\tcause: Cause.die(cause),\n\t\t\t\t}),\n\t\t}),\n\t)\n\tconst confirmed = yield* matches(child).pipe(\n\t\tEffect.repeat({\n\t\t\tschedule: Schedule.spaced(\"50 millis\"),\n\t\t\twhile: (value) => value,\n\t\t}),\n\t\tEffect.timeoutOption(\"10 seconds\"),\n\t)\n\tif (Option.isNone(confirmed))\n\t\treturn yield* TerminationUnconfirmed.make({\n\t\t\tdetail: \"The orphan did not exit after recovery\",\n\t\t\tcause: sent._tag === \"Failure\" ? sent.cause : Cause.empty,\n\t\t})\n\treturn {\n\t\tkind: \"Killed\",\n\t\texit: { code: null, signal: \"SIGKILL\" },\n\t\tcause: sent._tag === \"Failure\" ? sent.cause : Cause.empty,\n\t} satisfies Termination\n})\n"],"mappings":";;;;;AAYA,MAAM,UAAU,OAAO,WACtB,WAAW,KAAa;CAEvB,MAAM,QAAQ,QAAO,OADE,oBAAoB,oBAAA,CACd,MAC5B,aAAa,KACZ,MACA;EAAC;EAAM,GAAG;EAAO;EAAM;EAAW;EAAM;CAAO,GAC/C;EACC,KAAK,EAAE,QAAQ,IAAI;EACnB,WAAW;EACX,OAAO;CACR,CACD,CACD;CACA,MAAM,CAAC,MAAM,QAAQ,UAAU,OAAO,OAAO,IAC5C;EACC,MAAM;EACN,MAAM,OAAO,KAAK,OAAO,WAAW,GAAG,OAAO,QAAQ;EACtD,MAAM,OAAO,KAAK,OAAO,WAAW,GAAG,OAAO,QAAQ;CACvD,GACA,EAAE,aAAa,YAAY,CAC5B;CACA,IAAI,SAAS,KAAK,OAAO,KAAK,MAAM,MAAM,IAAI,OAAO,OAAO,KAAK;CACjE,MAAM,GAAG,MAAM,UACd,qBAAqB,KAAK,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC;CACpD,IAAI,SAAS,KAAK,SAAS,KAAA,KAAa,WAAW,KAAA,GAClD,OAAO,OAAO,eAAe,KAAK,EACjC,QAAQ,sCAAsC,OAC/C,CAAC;CACF,IAAI,OAAO,WAAW,GAAG,CAAC,CAAC,MAAM,GAAG,OAAO,OAAO,KAAK;CACvD,OAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAC5B,GACA,OAAO,QACP,OAAO,UAAU,UAChB,MAAM,SAAS,mBACZ,QACA,eAAe,KAAK;CACpB,QAAQ;CACR,OAAO,MAAM,KAAK,KAAK;AACxB,CAAC,CACJ,CACD;AAEA,MAAa,WAAW,OAAO,WAAW,WAAW,KAAa;CACjE,MAAM,UAAU,OAAO,QAAQ,GAAG;CAClC,IAAI,OAAO,OAAO,OAAO,GACxB,OAAO,OAAO,eAAe,KAAK,EACjC,QAAQ,yDACT,CAAC;CACF,OAAO;EAAE;EAAK,OAAO,QAAQ;CAAM;AACpC,CAAC;AAGD,MAAa,UAAU,OAAO,WAAW,WAAW,OAAwB;CAC3E,MAAM,UAAU,OAAO,QAAQ,MAAM,GAAG;CACxC,IAAI,OAAO,OAAO,OAAO,KAAK,QAAQ,MAAM,SAAS,MAAM,MAAM,MAChE,OAAO;CACR,OAAO;AACR,CAAC;AAED,MAAa,UAAU,OAAO,WAAW,WAAW,OAAwB;CAC3E,IAAI,EAAE,OAAO,QAAQ,KAAK,IACzB,OAAO;EACN,MAAM;EACN,MAAM;GAAE,MAAM;GAAM,QAAQ;EAAK;EACjC,OAAO,MAAM;CACd;CAED,MAAM,OAAO,OAAO,OAAO,KAC1B,OAAO,IAAI;EACV,WAAW,QAAQ,KAAK,MAAM,KAAK,SAAS;EAC5C,QAAQ,UACP,eAAe,KAAK;GACnB,QAAQ;GACR,OAAO,MAAM,IAAI,KAAK;EACvB,CAAC;CACH,CAAC,CACF;CACA,MAAM,YAAY,OAAO,QAAQ,KAAK,CAAC,CAAC,KACvC,OAAO,OAAO;EACb,UAAU,SAAS,OAAO,WAAW;EACrC,QAAQ,UAAU;CACnB,CAAC,GACD,OAAO,cAAc,YAAY,CAClC;CACA,IAAI,OAAO,OAAO,SAAS,GAC1B,OAAO,OAAO,uBAAuB,KAAK;EACzC,QAAQ;EACR,OAAO,KAAK,SAAS,YAAY,KAAK,QAAQ,MAAM;CACrD,CAAC;CACF,OAAO;EACN,MAAM;EACN,MAAM;GAAE,MAAM;GAAM,QAAQ;EAAU;EACtC,OAAO,KAAK,SAAS,YAAY,KAAK,QAAQ,MAAM;CACrD;AACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Retention.js","names":[],"sources":["../../../src/internal/runner/Retention.ts"],"sourcesContent":["import { Array, HashMap, Option } from \"effect\"\nimport { keyOf, type SessionKey, type SessionRecord } from \"./model\"\n\n/** A terminal high-water record fences every older Open, even after its request id is forgotten. */\nexport const retain = (\n\trecords: ReadonlyArray<SessionRecord>,\n): ReadonlyArray<SessionRecord> => {\n\tconst highWater = Array.reduce(\n\t\trecords,\n\t\tHashMap.empty<SessionKey, number>(),\n\t\t(water, record) =>\n\t\t\tHashMap.set(\n\t\t\t\twater,\n\t\t\t\tkeyOf(record.handle.key),\n\t\t\t\tMath.max(\n\t\t\t\t\tOption.getOrElse(\n\t\t\t\t\t\tHashMap.get(water, keyOf(record.handle.key)),\n\t\t\t\t\t\t() => 0,\n\t\t\t\t\t),\n\t\t\t\t\trecord.handle.generation,\n\t\t\t\t),\n\t\t\t),\n\t)\n\treturn Array.filter(\n\t\trecords,\n\t\t(record) =>\n\t\t\trecord.phase !== \"Stopped\" ||\n\t\t\trecord.handle.generation ===\n\t\t\t\tOption.getOrUndefined(HashMap.get(highWater, keyOf(record.handle.key))),\n\t)\n}\n/** Apply the same retention rule to both in-memory stores. */\nexport const save = (\n\trecords: HashMap.HashMap<string, SessionRecord>,\n\trecord: SessionRecord,\n) =>\n\tHashMap.fromIterable(\n\t\tArray.map(\n\t\t\tretain(\n\t\t\t\tArray.fromIterable(\n\t\t\t\t\tHashMap.values(HashMap.set(records, record.handle.token, record)),\n\t\t\t\t),\n\t\t\t),\n\t\t\t(record): readonly [string, SessionRecord] => [\n\t\t\t\trecord.handle.token,\n\t\t\t\trecord,\n\t\t\t],\n\t\t),\n\t)\n"],"mappings":";;;;AAIA,MAAa,UACZ,YACkC;CAClC,MAAM,YAAY,MAAM,OACvB,SACA,QAAQ,MAA0B,IACjC,OAAO,WACP,QAAQ,IACP,OACA,MAAM,OAAO,OAAO,GAAG,GACvB,KAAK,IACJ,OAAO,UACN,QAAQ,IAAI,OAAO,MAAM,OAAO,OAAO,GAAG,CAAC,SACrC,CACP,GACA,OAAO,OAAO,UACf,CACD,CACF;CACA,OAAO,MAAM,OACZ,UACC,WACA,OAAO,UAAU,aACjB,OAAO,OAAO,eACb,OAAO,eAAe,QAAQ,IAAI,WAAW,MAAM,OAAO,OAAO,GAAG,CAAC,CAAC,CACzE;AACD;;AAEA,MAAa,QACZ,SACA,WAEA,QAAQ,aACP,MAAM,IACL,OACC,MAAM,aACL,QAAQ,OAAO,QAAQ,IAAI,SAAS,OAAO,OAAO,OAAO,MAAM,CAAC,CACjE,CACD,IACC,WAA6C,CAC7C,OAAO,OAAO,OACd,MACD,CACD,CACD"}
1
+ {"version":3,"file":"Retention.js","names":[],"sources":["../../../src/internal/runner/Retention.ts"],"sourcesContent":["import { Array, HashMap, Option } from \"effect\"\n\nimport { keyOf, type SessionKey, type SessionRecord } from \"./model\"\n\n/** A terminal high-water record fences every older Open, even after its request id is forgotten. */\nexport const retain = (\n\trecords: ReadonlyArray<SessionRecord>,\n): ReadonlyArray<SessionRecord> => {\n\tconst highWater = Array.reduce(\n\t\trecords,\n\t\tHashMap.empty<SessionKey, number>(),\n\t\t(water, record) =>\n\t\t\tHashMap.set(\n\t\t\t\twater,\n\t\t\t\tkeyOf(record.handle.key),\n\t\t\t\tMath.max(\n\t\t\t\t\tOption.getOrElse(\n\t\t\t\t\t\tHashMap.get(water, keyOf(record.handle.key)),\n\t\t\t\t\t\t() => 0,\n\t\t\t\t\t),\n\t\t\t\t\trecord.handle.generation,\n\t\t\t\t),\n\t\t\t),\n\t)\n\treturn Array.filter(\n\t\trecords,\n\t\t(record) =>\n\t\t\trecord.phase !== \"Stopped\" ||\n\t\t\trecord.handle.generation ===\n\t\t\t\tOption.getOrUndefined(HashMap.get(highWater, keyOf(record.handle.key))),\n\t)\n}\n/** Apply the same retention rule to both in-memory stores. */\nexport const save = (\n\trecords: HashMap.HashMap<string, SessionRecord>,\n\trecord: SessionRecord,\n) =>\n\tHashMap.fromIterable(\n\t\tArray.map(\n\t\t\tretain(\n\t\t\t\tArray.fromIterable(\n\t\t\t\t\tHashMap.values(HashMap.set(records, record.handle.token, record)),\n\t\t\t\t),\n\t\t\t),\n\t\t\t(record): readonly [string, SessionRecord] => [\n\t\t\t\trecord.handle.token,\n\t\t\t\trecord,\n\t\t\t],\n\t\t),\n\t)\n"],"mappings":";;;;AAKA,MAAa,UACZ,YACkC;CAClC,MAAM,YAAY,MAAM,OACvB,SACA,QAAQ,MAA0B,IACjC,OAAO,WACP,QAAQ,IACP,OACA,MAAM,OAAO,OAAO,GAAG,GACvB,KAAK,IACJ,OAAO,UACN,QAAQ,IAAI,OAAO,MAAM,OAAO,OAAO,GAAG,CAAC,SACrC,CACP,GACA,OAAO,OAAO,UACf,CACD,CACF;CACA,OAAO,MAAM,OACZ,UACC,WACA,OAAO,UAAU,aACjB,OAAO,OAAO,eACb,OAAO,eAAe,QAAQ,IAAI,WAAW,MAAM,OAAO,OAAO,GAAG,CAAC,CAAC,CACzE;AACD;;AAEA,MAAa,QACZ,SACA,WAEA,QAAQ,aACP,MAAM,IACL,OACC,MAAM,aACL,QAAQ,OAAO,QAAQ,IAAI,SAAS,OAAO,OAAO,OAAO,MAAM,CAAC,CACjE,CACD,IACC,WAA6C,CAC7C,OAAO,OAAO,OACd,MACD,CACD,CACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"Store.js","names":["Retention.save","Retention.retain"],"sources":["../../../src/internal/runner/Store.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tLayer,\n\tEffect,\n\tFileSystem,\n\tHashMap,\n\tHashSet,\n\tPath,\n\tRef,\n\tSchema,\n\tSemaphore,\n\tString,\n\ttype PlatformError,\n} from \"effect\"\nimport { Digest, SecureRandom } from \"effect/crypto\"\nimport { Key, SessionRecord, Store, StateStorageError } from \"./model\"\nimport * as Retention from \"./Retention\"\n\n/** Injectable store used by deterministic supervisor tests. */\nexport const memory = Effect.gen(function* () {\n\tconst records = yield* Ref.make(HashMap.empty<string, SessionRecord>())\n\treturn Store.of({\n\t\tlist: Ref.get(records).pipe(\n\t\t\tEffect.map((records) => Array.fromIterable(HashMap.values(records))),\n\t\t),\n\t\tsave: (record) => Ref.update(records, (all) => Retention.save(all, record)),\n\t})\n})\n\n/**\n * Atomically replaced records retain unfinished sessions and each key's high-water mark.\n * Older terminal request ids expire; Open fences their retries with expectedGeneration.\n * Requires exclusive directory ownership; it is not a multi-writer database.\n */\nexport const directory = Effect.fnUntraced(function* (root: string) {\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst digest = yield* Digest.Digest\n\tconst json = Schema.fromJsonString(Schema.toCodecJson(SessionRecord))\n\tconst random = yield* SecureRandom.SecureRandom\n\tconst storage = <A, R>(\n\t\teffect: Effect.Effect<\n\t\t\tA,\n\t\t\tPlatformError.PlatformError | Schema.SchemaError | StateStorageError,\n\t\t\tR\n\t\t>,\n\t) =>\n\t\teffect.pipe(\n\t\t\tEffect.mapError((error) =>\n\t\t\t\terror._tag === \"StateStorageError\"\n\t\t\t\t\t? error\n\t\t\t\t\t: StateStorageError.make({\n\t\t\t\t\t\t\tdetail: \"Runner state storage failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t),\n\t\t)\n\tyield* storage(\n\t\tfs.makeDirectory(root, { recursive: true }).pipe(Effect.uninterruptible),\n\t)\n\tconst mutex = yield* Semaphore.make(1)\n\tconst read = Effect.gen(function* () {\n\t\tconst files = yield* fs.readDirectory(root)\n\t\tconst rows = yield* Effect.forEach(\n\t\t\tArray.filter(files, String.endsWith(\".json\")),\n\t\t\t(file) =>\n\t\t\t\tfs.readFileString(path.join(root, file)).pipe(\n\t\t\t\t\tEffect.flatMap(Schema.decodeEffect(json)),\n\t\t\t\t\tEffect.map((record) => ({ file, record })),\n\t\t\t\t),\n\t\t)\n\t\treturn rows\n\t})\n\tconst compact = Effect.scoped(\n\t\tEffect.gen(function* () {\n\t\t\tconst rows = yield* read\n\t\t\tconst retained = Retention.retain(Array.map(rows, (row) => row.record))\n\t\t\tconst tokens = HashSet.fromIterable(\n\t\t\t\tArray.map(retained, (record) => record.handle.token),\n\t\t\t)\n\t\t\tconst obsolete = Array.filter(\n\t\t\t\trows,\n\t\t\t\t(row) => !HashSet.has(tokens, row.record.handle.token),\n\t\t\t)\n\t\t\tyield* Effect.forEach(\n\t\t\t\tobsolete,\n\t\t\t\t(row) =>\n\t\t\t\t\tfs.remove(path.join(root, row.file)).pipe(Effect.uninterruptible),\n\t\t\t\t{ discard: true },\n\t\t\t)\n\t\t\tif (obsolete.length > 0) {\n\t\t\t\tconst directory = yield* fs.open(root, { flag: \"r\" })\n\t\t\t\tyield* directory.sync.pipe(Effect.uninterruptible)\n\t\t\t}\n\t\t}),\n\t)\n\tyield* storage(compact)\n\treturn Store.of({\n\t\tlist: storage(\n\t\t\tmutex.withPermit(\n\t\t\t\tread.pipe(Effect.map((rows) => Array.map(rows, (row) => row.record))),\n\t\t\t),\n\t\t),\n\t\tsave: Effect.fnUntraced(\n\t\t\tfunction* (record: SessionRecord) {\n\t\t\t\tconst encoded = yield* Schema.encodeEffect(json)(record)\n\t\t\t\tconst address = yield* Schema.encodeEffect(\n\t\t\t\t\tSchema.fromJsonString(\n\t\t\t\t\t\tSchema.Struct({ key: Key, generation: Schema.Int }),\n\t\t\t\t\t),\n\t\t\t\t)({\n\t\t\t\t\tkey: record.handle.key,\n\t\t\t\t\tgeneration: record.handle.generation,\n\t\t\t\t})\n\t\t\t\tconst name = yield* digest.digestHex(\n\t\t\t\t\tDigest.sha256,\n\t\t\t\t\tnew TextEncoder().encode(address),\n\t\t\t\t)\n\t\t\t\tconst nonce = yield* random.uuidV4()\n\t\t\t\tconst temporary = path.join(root, `.${name}.${nonce}.tmp`)\n\t\t\t\tconst destination = path.join(root, name + \".json\")\n\t\t\t\tyield* Effect.acquireRelease(\n\t\t\t\t\tfs.open(temporary, { flag: \"wx\", mode: 0o600 }),\n\t\t\t\t\t() => fs.remove(temporary, { force: true }).pipe(Effect.orDie),\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.flatMap((file) =>\n\t\t\t\t\t\tfile\n\t\t\t\t\t\t\t.writeAll(new TextEncoder().encode(encoded))\n\t\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\t\tEffect.uninterruptible,\n\t\t\t\t\t\t\t\tEffect.andThen(file.sync.pipe(Effect.uninterruptible)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t// Keep rename and directory synchronization together if the caller is canceled.\n\t\t\t\tyield* Effect.uninterruptible(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* fs.rename(temporary, destination)\n\t\t\t\t\t\tconst directory = yield* fs.open(root, { flag: \"r\" })\n\t\t\t\t\t\tyield* directory.sync.pipe(Effect.uninterruptible)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t// The new high-water file is durable before any old record is removed.\n\t\t\t\tyield* compact\n\t\t\t},\n\t\t\tEffect.scoped,\n\t\t\tmutex.withPermit,\n\t\t\tstorage,\n\t\t),\n\t})\n})\n\nexport const layerMemory = Layer.effect(Store, memory)\nexport const layerDirectory = (root: string) =>\n\tLayer.effect(Store, directory(root))\n"],"mappings":"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"}
1
+ {"version":3,"file":"Store.js","names":["Retention.save","Retention.retain"],"sources":["../../../src/internal/runner/Store.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tEffect,\n\tFileSystem,\n\tHashMap,\n\tHashSet,\n\tLayer,\n\tPath,\n\tRef,\n\tSchema,\n\tSemaphore,\n\tString,\n\ttype PlatformError,\n} from \"effect\"\nimport { Digest, SecureRandom } from \"effect/crypto\"\n\nimport { Key, SessionRecord, StateStorageError, Store } from \"./model\"\nimport * as Retention from \"./Retention\"\n\n/** Injectable store used by deterministic supervisor tests. */\nexport const memory = Effect.gen(function* () {\n\tconst records = yield* Ref.make(HashMap.empty<string, SessionRecord>())\n\treturn Store.of({\n\t\tlist: Ref.get(records).pipe(\n\t\t\tEffect.map((records) => Array.fromIterable(HashMap.values(records))),\n\t\t),\n\t\tsave: (record) => Ref.update(records, (all) => Retention.save(all, record)),\n\t})\n})\n\n/**\n * Atomically replaced records retain unfinished sessions and each key's high-water mark.\n * Older terminal request ids expire; Open fences their retries with expectedGeneration.\n * Requires exclusive directory ownership; it is not a multi-writer database.\n */\nexport const directory = Effect.fnUntraced(function* (root: string) {\n\tconst fs = yield* FileSystem.FileSystem\n\tconst path = yield* Path.Path\n\tconst digest = yield* Digest.Digest\n\tconst json = Schema.fromJsonString(Schema.toCodecJson(SessionRecord))\n\tconst random = yield* SecureRandom.SecureRandom\n\tconst storage = <A, R>(\n\t\teffect: Effect.Effect<\n\t\t\tA,\n\t\t\tPlatformError.PlatformError | Schema.SchemaError | StateStorageError,\n\t\t\tR\n\t\t>,\n\t) =>\n\t\teffect.pipe(\n\t\t\tEffect.mapError((error) =>\n\t\t\t\terror._tag === \"StateStorageError\"\n\t\t\t\t\t? error\n\t\t\t\t\t: StateStorageError.make({\n\t\t\t\t\t\t\tdetail: \"Runner state storage failed\",\n\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t}),\n\t\t\t),\n\t\t)\n\tyield* storage(\n\t\tfs.makeDirectory(root, { recursive: true }).pipe(Effect.uninterruptible),\n\t)\n\tconst mutex = yield* Semaphore.make(1)\n\tconst read = Effect.gen(function* () {\n\t\tconst files = yield* fs.readDirectory(root)\n\t\tconst rows = yield* Effect.forEach(\n\t\t\tArray.filter(files, String.endsWith(\".json\")),\n\t\t\t(file) =>\n\t\t\t\tfs.readFileString(path.join(root, file)).pipe(\n\t\t\t\t\tEffect.flatMap(Schema.decodeEffect(json)),\n\t\t\t\t\tEffect.map((record) => ({ file, record })),\n\t\t\t\t),\n\t\t)\n\t\treturn rows\n\t})\n\tconst compact = Effect.scoped(\n\t\tEffect.gen(function* () {\n\t\t\tconst rows = yield* read\n\t\t\tconst retained = Retention.retain(Array.map(rows, (row) => row.record))\n\t\t\tconst tokens = HashSet.fromIterable(\n\t\t\t\tArray.map(retained, (record) => record.handle.token),\n\t\t\t)\n\t\t\tconst obsolete = Array.filter(\n\t\t\t\trows,\n\t\t\t\t(row) => !HashSet.has(tokens, row.record.handle.token),\n\t\t\t)\n\t\t\tyield* Effect.forEach(\n\t\t\t\tobsolete,\n\t\t\t\t(row) =>\n\t\t\t\t\tfs.remove(path.join(root, row.file)).pipe(Effect.uninterruptible),\n\t\t\t\t{ discard: true },\n\t\t\t)\n\t\t\tif (obsolete.length > 0) {\n\t\t\t\tconst directory = yield* fs.open(root, { flag: \"r\" })\n\t\t\t\tyield* directory.sync.pipe(Effect.uninterruptible)\n\t\t\t}\n\t\t}),\n\t)\n\tyield* storage(compact)\n\treturn Store.of({\n\t\tlist: storage(\n\t\t\tmutex.withPermit(\n\t\t\t\tread.pipe(Effect.map((rows) => Array.map(rows, (row) => row.record))),\n\t\t\t),\n\t\t),\n\t\tsave: Effect.fnUntraced(\n\t\t\tfunction* (record: SessionRecord) {\n\t\t\t\tconst encoded = yield* Schema.encodeEffect(json)(record)\n\t\t\t\tconst address = yield* Schema.encodeEffect(\n\t\t\t\t\tSchema.fromJsonString(\n\t\t\t\t\t\tSchema.Struct({ key: Key, generation: Schema.Int }),\n\t\t\t\t\t),\n\t\t\t\t)({\n\t\t\t\t\tkey: record.handle.key,\n\t\t\t\t\tgeneration: record.handle.generation,\n\t\t\t\t})\n\t\t\t\tconst name = yield* digest.digestHex(\n\t\t\t\t\tDigest.sha256,\n\t\t\t\t\tnew TextEncoder().encode(address),\n\t\t\t\t)\n\t\t\t\tconst nonce = yield* random.uuidV4()\n\t\t\t\tconst temporary = path.join(root, `.${name}.${nonce}.tmp`)\n\t\t\t\tconst destination = path.join(root, name + \".json\")\n\t\t\t\tyield* Effect.acquireRelease(\n\t\t\t\t\tfs.open(temporary, { flag: \"wx\", mode: 0o600 }),\n\t\t\t\t\t() => fs.remove(temporary, { force: true }).pipe(Effect.orDie),\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.flatMap((file) =>\n\t\t\t\t\t\tfile\n\t\t\t\t\t\t\t.writeAll(new TextEncoder().encode(encoded))\n\t\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\t\tEffect.uninterruptible,\n\t\t\t\t\t\t\t\tEffect.andThen(file.sync.pipe(Effect.uninterruptible)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t// Keep rename and directory synchronization together if the caller is canceled.\n\t\t\t\tyield* Effect.uninterruptible(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* fs.rename(temporary, destination)\n\t\t\t\t\t\tconst directory = yield* fs.open(root, { flag: \"r\" })\n\t\t\t\t\t\tyield* directory.sync.pipe(Effect.uninterruptible)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t// The new high-water file is durable before any old record is removed.\n\t\t\t\tyield* compact\n\t\t\t},\n\t\t\tEffect.scoped,\n\t\t\tmutex.withPermit,\n\t\t\tstorage,\n\t\t),\n\t})\n})\n\nexport const layerMemory = Layer.effect(Store, memory)\nexport const layerDirectory = (root: string) =>\n\tLayer.effect(Store, directory(root))\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
+ import { cleanupCause } from "../cleanup.js";
1
2
  import { make as make$1 } from "../FailureGroup.js";
2
- import { close } from "../release.js";
3
- import { save } from "./Retention.js";
4
3
  import { defaults } from "../Limits.js";
5
- import { cleanupCause } from "../cleanup.js";
6
4
  import { Execution, ExecutionError, LeaseExpired, RunnerClosing, SessionConflict, SessionStopped, StaleSession, Store, TerminationUnconfirmed, childOf, keyOf, negotiate, stoppedRecord, stoppingRecord } from "./model.js";
5
+ import { save } from "./Retention.js";
7
6
  import { Array, Cause, Clock, Context, Data, Deferred, Duration, Effect, Equal, Exit, FiberHandle, FiberSet, HashMap, Layer, Option, RcMap, Ref, Result, Scope, Semaphore, SynchronizedRef } from "effect";
8
7
  import { SecureRandom } from "effect/crypto";
8
+ import * as Release from "@graftland/graft/Release";
9
9
  // src/internal/runner/Supervisor.ts
10
10
  var Supervisor = class extends Context.Service()("@graftland/plugin-remote/internal/runner/Supervisor") {};
11
11
  const Launch = Data.taggedEnum();
@@ -159,7 +159,7 @@ const operations = (runtime) => {
159
159
  const finishStop = Effect.fnUntraced(function* (entry, state, saved) {
160
160
  yield* FiberHandle.clear(entry.loading);
161
161
  const result = yield* terminate(state.execution, grace, confirmation);
162
- const closed = yield* Effect.exit(close(entry.unitScope, Exit.void));
162
+ const closed = yield* Effect.exit(Release.close(entry.unitScope, Exit.void));
163
163
  const termination = {
164
164
  ...result,
165
165
  cause: Cause.combine(result.cause, exitCause(closed))
@@ -314,7 +314,7 @@ const protocol = Effect.fnUntraced(function* (runtime, actions) {
314
314
  };
315
315
  const retained = yield* Ref.get(records);
316
316
  const old = yield* Ref.modify(entries, (all) => [Array.filter(Array.fromIterable(HashMap.entries(all)), ([key]) => !HashMap.has(retained, key)), HashMap.set(HashMap.filter(all, (_, key) => HashMap.has(retained, key)), token, entry)]);
317
- for (const [, retired] of old) yield* close(retired.scope, Exit.void);
317
+ for (const [, retired] of old) yield* Release.close(retired.scope, Exit.void);
318
318
  yield* scheduleLease(entry, deadline);
319
319
  return record;
320
320
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"Supervisor.js","names":["FailureGroup.make","Retention.save","Release.close"],"sources":["../../../src/internal/runner/Supervisor.ts"],"sourcesContent":["import * as FailureGroup from \"../FailureGroup\"\nimport {\n\tArray,\n\tCause,\n\tClock,\n\tContext,\n\tData,\n\tDeferred,\n\tDuration,\n\tEffect,\n\tEqual,\n\tExit,\n\tFiberHandle,\n\tFiberSet,\n\tHashMap,\n\tLayer,\n\tOption,\n\tRcMap,\n\tRef,\n\tResult,\n\tScope,\n\tSemaphore,\n\tSynchronizedRef,\n} from \"effect\"\nimport * as Release from \"../release\"\nimport { SecureRandom } from \"effect/crypto\"\nimport * as Retention from \"./Retention\"\nimport { cleanupCause } from \"../cleanup\"\nimport {\n\tExecution,\n\tStore,\n\tStaleSession,\n\tLeaseExpired,\n\tSessionStopped,\n\tSessionConflict,\n\tStateStorageError,\n\tExecutionError,\n\tPackageError,\n\tTerminationUnconfirmed,\n\tRunnerClosing,\n\tchildOf,\n\tdefaults,\n\tkeyOf,\n\tnegotiate,\n\tstoppingRecord,\n\tstoppedRecord,\n\ttype ActiveRecord,\n\ttype CodeIdentity,\n\ttype ExitStatus,\n\ttype Handle,\n\ttype Key,\n\ttype Limits,\n\ttype Load,\n\ttype SessionRecord,\n\ttype SessionKey,\n\ttype StopReason,\n\ttype Termination,\n\ttype Unit,\n\ttype OpenRecord,\n\ttype LoadedRecord,\n\ttype StoppingRecord,\n\ttype StoppedRecord,\n} from \"./model\"\n\nexport type SupervisorError =\n\t| StaleSession\n\t| LeaseExpired\n\t| SessionStopped\n\t| SessionConflict\n\t| StateStorageError\n\t| ExecutionError\n\t| PackageError\n\t| TerminationUnconfirmed\n\t| RunnerClosing\nexport interface Options {\n\treadonly lease?: Duration.Input\n\treadonly grace?: Duration.Input\n\treadonly confirmationTimeout?: Duration.Input\n\treadonly limits?: Limits\n}\nexport interface Open {\n\treadonly key: Key\n\treadonly requestId: string\n\treadonly expectedGeneration?: number | null\n\treadonly lease?: Duration.Input\n\treadonly limits?: Limits\n}\nexport class Supervisor extends Context.Service<\n\tSupervisor,\n\t{\n\t\treadonly await: Effect.Effect<never, SupervisorError>\n\t\treadonly status: (\n\t\t\thandle: Handle,\n\t\t) => Effect.Effect<SessionRecord, StaleSession>\n\t\treadonly highWater: (key: Key) => Effect.Effect<number | null>\n\t\treadonly open: (\n\t\t\trequest: Open,\n\t\t) => Effect.Effect<SessionRecord, SupervisorError>\n\t\treadonly renew: (handle: Handle) => Effect.Effect<number, SupervisorError>\n\t\treadonly load: (\n\t\t\thandle: Handle,\n\t\t\trequest: Load,\n\t\t) => Effect.Effect<CodeIdentity, SupervisorError>\n\t\treadonly dispose: (\n\t\t\thandle: Handle,\n\t\t) => Effect.Effect<Termination, SupervisorError>\n\t}\n>()(\"@graftland/plugin-remote/internal/runner/Supervisor\") {}\n\ntype Launch = Data.TaggedEnum<{\n\tStarting: {}\n\tRegistered: { readonly unit: Unit }\n}>\nconst Launch = Data.taggedEnum<Launch>()\ntype ExecutionState = Data.TaggedEnum<{\n\tAbsent: {}\n\tRunning: { readonly unit: Unit }\n\tExited: { readonly exit: ExitStatus }\n}>\nconst ExecutionState = Data.taggedEnum<ExecutionState>()\ntype LoadReply = Deferred.Deferred<CodeIdentity, SupervisorError>\ntype StopReply = Deferred.Deferred<Termination, SupervisorError>\ntype Session = Data.TaggedEnum<{\n\tOpen: { readonly record: typeof OpenRecord.Type; readonly deadline: bigint }\n\tLoading: {\n\t\treadonly record: typeof OpenRecord.Type\n\t\treadonly request: Load\n\t\treadonly launch: Launch\n\t\treadonly reply: LoadReply\n\t\treadonly deadline: bigint\n\t}\n\tLoaded: {\n\t\treadonly record: typeof LoadedRecord.Type\n\t\treadonly unit: Unit\n\t\treadonly deadline: bigint\n\t}\n\tStopping: {\n\t\treadonly record: typeof StoppingRecord.Type\n\t\treadonly execution: ExecutionState\n\t\treadonly reply: StopReply\n\t}\n\tStopped: {\n\t\treadonly record: typeof StoppedRecord.Type\n\t\treadonly reply: StopReply\n\t}\n}>\nconst Session = Data.taggedEnum<Session>()\ntype Live = Extract<Session, { readonly _tag: \"Open\" | \"Loading\" | \"Loaded\" }>\ntype Loading = Extract<Session, { readonly _tag: \"Loading\" }>\ntype Stopping = Extract<Session, { readonly _tag: \"Stopping\" }>\ninterface Entry {\n\treadonly state: SynchronizedRef.SynchronizedRef<Session>\n\treadonly timer: FiberHandle.FiberHandle<void, never>\n\treadonly loading: FiberHandle.FiberHandle<void, never>\n\treadonly scope: Scope.Closeable\n\treadonly unitScope: Scope.Closeable\n}\nfunction snapshot(state: Live): ActiveRecord\nfunction snapshot(state: Session): SessionRecord\nfunction snapshot(state: Session): SessionRecord {\n\treturn state._tag === \"Loading\"\n\t\t? {\n\t\t\t\t...state.record,\n\t\t\t\tphase: \"Loading\",\n\t\t\t\tload: state.request,\n\t\t\t\tlaunch:\n\t\t\t\t\tstate.launch._tag === \"Starting\"\n\t\t\t\t\t\t? { _tag: \"Starting\" }\n\t\t\t\t\t\t: { _tag: \"Registered\", child: state.launch.unit.identity },\n\t\t\t}\n\t\t: state.record\n}\nconst live = (\n\tstate: Session,\n\tnow: bigint,\n): Result.Result<Live, LeaseExpired | SessionStopped> => {\n\tif (state._tag === \"Stopping\" || state._tag === \"Stopped\")\n\t\treturn Result.fail(\n\t\t\tstate.record.reason._tag === \"Expired\"\n\t\t\t\t? LeaseExpired.make({\n\t\t\t\t\t\tdetail: \"The session lease has expired\",\n\t\t\t\t\t})\n\t\t\t\t: SessionStopped.make({\n\t\t\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t\t\t}),\n\t\t)\n\treturn now >= state.deadline\n\t\t? Result.fail(\n\t\t\t\tLeaseExpired.make({\n\t\t\t\t\tdetail: \"The session lease has expired\",\n\t\t\t\t}),\n\t\t\t)\n\t\t: Result.succeed(state)\n}\nconst executionOf = (state: Live): ExecutionState => {\n\tswitch (state._tag) {\n\t\tcase \"Open\":\n\t\t\treturn ExecutionState.Absent()\n\t\tcase \"Loading\":\n\t\t\treturn state.launch._tag === \"Registered\"\n\t\t\t\t? ExecutionState.Running({ unit: state.launch.unit })\n\t\t\t\t: ExecutionState.Absent()\n\t\tcase \"Loaded\":\n\t\t\treturn ExecutionState.Running({ unit: state.unit })\n\t}\n}\n/** All state transitions are pure; the caller serializes persistence and publication. */\nconst beginLoad = (\n\tstate: Extract<Session, { _tag: \"Open\" }>,\n\trequest: Load,\n\treply: LoadReply,\n): Loading =>\n\tSession.Loading({\n\t\trecord: state.record,\n\t\tdeadline: state.deadline,\n\t\trequest,\n\t\treply,\n\t\tlaunch: Launch.Starting(),\n\t})\nconst registerUnit = (\n\tstate: Session,\n\tunit: Unit,\n): Result.Result<Session, SessionStopped | ExecutionError> => {\n\tif (state._tag !== \"Loading\")\n\t\treturn Result.fail(\n\t\t\tSessionStopped.make({\n\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t}),\n\t\t)\n\tif (state.launch._tag === \"Registered\")\n\t\treturn Result.fail(\n\t\t\tExecutionError.make({\n\t\t\t\tdetail: \"An execution adapter registered more than one child\",\n\t\t\t}),\n\t\t)\n\treturn Result.succeed(\n\t\tSession.Loading({ ...state, launch: Launch.Registered({ unit }) }),\n\t)\n}\nconst loaded = (\n\tstate: Session,\n\tcode: CodeIdentity,\n): Result.Result<Session, SessionStopped | ExecutionError> => {\n\tif (state._tag !== \"Loading\")\n\t\treturn Result.fail(\n\t\t\tSessionStopped.make({\n\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t}),\n\t\t)\n\tif (state.launch._tag !== \"Registered\")\n\t\treturn Result.fail(\n\t\t\tExecutionError.make({\n\t\t\t\tdetail: \"Execution adapter returned without registering its child\",\n\t\t\t}),\n\t\t)\n\treturn Result.succeed(\n\t\tSession.Loaded({\n\t\t\tdeadline: state.deadline,\n\t\t\tunit: state.launch.unit,\n\t\t\trecord: {\n\t\t\t\t...state.record,\n\t\t\t\tphase: \"Loaded\",\n\t\t\t\tload: state.request,\n\t\t\t\tcode,\n\t\t\t\tchild: state.launch.unit.identity,\n\t\t\t},\n\t\t}),\n\t)\n}\nconst beginStop = (\n\tstate: Live,\n\treason: StopReason,\n\treply: StopReply,\n\texit: Option.Option<ExitStatus>,\n): Stopping =>\n\tSession.Stopping({\n\t\trecord: stoppingRecord(snapshot(state), reason),\n\t\treply,\n\t\texecution: Option.match(exit, {\n\t\t\tonNone: () => executionOf(state),\n\t\t\tonSome: (exit) => ExecutionState.Exited({ exit }),\n\t\t}),\n\t})\nconst nanos = (millis: number) => BigInt(Math.ceil(millis * 1_000_000))\nconst emptyTermination: Termination = {\n\tkind: \"Exited\",\n\texit: { code: 0, signal: null },\n\tcause: Cause.empty,\n}\nconst exitCause = <A, E>(exit: Exit.Exit<A, E>) =>\n\tExit.isFailure(exit) ? exit.cause : Cause.empty\n\n/** A signal is a request; only the exited effect confirms that the execution has stopped. */\nconst terminate = Effect.fnUntraced(function* (\n\texecution: ExecutionState,\n\tgrace: number,\n\tconfirmation: number,\n): Effect.fn.Return<Termination, TerminationUnconfirmed> {\n\tif (execution._tag === \"Absent\") return emptyTermination\n\tif (execution._tag === \"Exited\")\n\t\treturn { ...emptyTermination, exit: execution.exit }\n\tconst child = execution.unit\n\tconst graceful = yield* child.interrupt.pipe(\n\t\tEffect.andThen(child.exited),\n\t\tEffect.timeoutOption(grace),\n\t\tEffect.exit,\n\t)\n\tif (Exit.isSuccess(graceful) && Option.isSome(graceful.value))\n\t\treturn { ...emptyTermination, exit: graceful.value.value }\n\tconst killed = yield* Effect.exit(child.kill)\n\tconst forced = yield* child.exited.pipe(\n\t\tEffect.timeoutOption(confirmation),\n\t\tEffect.exit,\n\t)\n\tconst cause = Cause.combine(\n\t\tCause.combine(exitCause(graceful), exitCause(killed)),\n\t\texitCause(forced),\n\t)\n\tif (Exit.isFailure(forced) || Option.isNone(forced.value))\n\t\treturn yield* TerminationUnconfirmed.make({\n\t\t\tdetail: \"The child exit could not be confirmed\",\n\t\t\tcause,\n\t\t})\n\treturn {\n\t\tkind: \"Killed\",\n\t\texit: forced.value.value,\n\t\tcause,\n\t} satisfies Termination\n})\n\nconst initialize = Effect.fnUntraced(function* (options: Options = {}) {\n\tconst store = yield* Store\n\tconst execution = yield* Execution\n\tconst random = yield* SecureRandom.SecureRandom\n\tconst parent = yield* Effect.scope\n\tconst owner = yield* Scope.fork(parent)\n\t// Cleanup must continue after a health failure so every registered process is reaped.\n\tconst workers = yield* FiberSet.make<void, never>().pipe(Scope.provide(owner))\n\tconst locks = yield* RcMap.make({\n\t\tlookup: (_key: SessionKey) => Semaphore.make(1),\n\t}).pipe(Scope.provide(owner))\n\tconst lease = Duration.toMillis(options.lease ?? \"15 seconds\")\n\tconst grace = Duration.toMillis(options.grace ?? \"5 seconds\")\n\tconst confirmation = Duration.toMillis(\n\t\toptions.confirmationTimeout ?? \"5 seconds\",\n\t)\n\tconst limits = options.limits ?? defaults\n\tconst records = yield* Ref.make(HashMap.empty<string, SessionRecord>())\n\tconst entries = yield* Ref.make(HashMap.empty<string, Entry>())\n\tconst health = yield* FailureGroup.make<SupervisorError>().pipe(\n\t\tScope.provide(owner),\n\t)\n\tconst closing = yield* Ref.make(false)\n\treturn {\n\t\tstore,\n\t\texecution,\n\t\trandom,\n\t\towner,\n\t\tworkers,\n\t\tlocks,\n\t\tlease,\n\t\tgrace,\n\t\tconfirmation,\n\t\tlimits,\n\t\trecords,\n\t\tentries,\n\t\thealth,\n\t\tclosing,\n\t}\n})\ntype Runtime = Effect.Success<ReturnType<typeof initialize>>\nconst operations = (runtime: Runtime) => {\n\tconst {\n\t\tstore,\n\t\texecution,\n\t\tworkers,\n\t\tgrace,\n\t\tconfirmation,\n\t\trecords,\n\t\tentries,\n\t\thealth,\n\t\tclosing,\n\t} = runtime\n\n\tconst poison = health.failCause\n\tconst observe = <A>(effect: Effect.Effect<A, SupervisorError>) =>\n\t\teffect.pipe(Effect.asVoid, Effect.catchCause(poison))\n\tconst healthy = health.check.pipe(\n\t\tEffect.andThen(\n\t\t\tEffect.gen(function* () {\n\t\t\t\tif (yield* Ref.get(closing))\n\t\t\t\t\treturn yield* RunnerClosing.make({ detail: \"The runner is closing\" })\n\t\t\t}),\n\t\t),\n\t)\n\tconst persist = (record: SessionRecord) =>\n\t\tstore\n\t\t\t.save(record)\n\t\t\t.pipe(\n\t\t\t\tEffect.tapCause(poison),\n\t\t\t\tEffect.andThen(\n\t\t\t\t\tRef.update(records, (all) => Retention.save(all, record)),\n\t\t\t\t),\n\t\t\t)\n\tconst status = (handle: Handle) =>\n\t\tRef.get(records).pipe(\n\t\t\tEffect.flatMap((all) => {\n\t\t\t\tconst found = HashMap.get(all, handle.token)\n\t\t\t\treturn Option.isSome(found) &&\n\t\t\t\t\tEqual.equals(keyOf(found.value.handle.key), keyOf(handle.key)) &&\n\t\t\t\t\tfound.value.handle.generation === handle.generation\n\t\t\t\t\t? Effect.succeed(found.value)\n\t\t\t\t\t: Effect.fail(\n\t\t\t\t\t\t\tStaleSession.make({\n\t\t\t\t\t\t\t\tdetail: \"Unknown session or generation\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t}),\n\t\t)\n\tconst latest = (key: Key) =>\n\t\tRef.get(records).pipe(\n\t\t\tEffect.map((all) =>\n\t\t\t\tArray.reduce(\n\t\t\t\t\tArray.fromIterable(HashMap.values(all)),\n\t\t\t\t\t0,\n\t\t\t\t\t(value, record) =>\n\t\t\t\t\t\tEqual.equals(keyOf(record.handle.key), keyOf(key))\n\t\t\t\t\t\t\t? Math.max(value, record.handle.generation)\n\t\t\t\t\t\t\t: value,\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\tconst entryFor = Effect.fnUntraced(function* (handle: Handle) {\n\t\tyield* status(handle)\n\t\tconst all = yield* Ref.get(entries)\n\t\tconst found = HashMap.get(all, handle.token)\n\t\tif (Option.isNone(found))\n\t\t\treturn yield* SessionStopped.make({\n\t\t\t\tdetail: \"The session was retired during recovery\",\n\t\t\t})\n\t\treturn found.value\n\t})\n\tconst commit = (\n\t\tentry: Entry,\n\t\ttransition: (\n\t\t\tstate: Session,\n\t\t) => Result.Result<Session, ExecutionError | SessionStopped>,\n\t) =>\n\t\tSynchronizedRef.updateEffect(\n\t\t\tentry.state,\n\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\tconst next = yield* Effect.fromResult(transition(state))\n\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\treturn next\n\t\t\t}),\n\t\t)\n\tconst finishStop = Effect.fnUntraced(function* (\n\t\tentry: Entry,\n\t\tstate: Stopping,\n\t\tsaved: Exit.Exit<void, StateStorageError>,\n\t) {\n\t\tyield* FiberHandle.clear(entry.loading)\n\t\tconst result = yield* terminate(state.execution, grace, confirmation)\n\t\tconst closed = yield* Effect.exit(Release.close(entry.unitScope, Exit.void))\n\t\tconst termination: Termination = {\n\t\t\t...result,\n\t\t\tcause: Cause.combine(result.cause, exitCause(closed)),\n\t\t}\n\t\tconst record = stoppedRecord(\n\t\t\tstate.record.previous,\n\t\t\tstate.record.reason,\n\t\t\ttermination,\n\t\t)\n\t\tyield* SynchronizedRef.updateEffect(entry.state, () =>\n\t\t\tpersist(record).pipe(\n\t\t\t\tEffect.as(Session.Stopped({ record, reply: state.reply })),\n\t\t\t),\n\t\t)\n\t\tif (Exit.isFailure(saved)) return yield* Effect.failCause(saved.cause)\n\t\treturn termination\n\t})\n\t/** Called with the session ref locked; the worker starts after its transition is published. */\n\tconst stopLocked = Effect.fnUntraced(function* (\n\t\tentry: Entry,\n\t\tstate: Session,\n\t\treason: StopReason,\n\t\texit: Option.Option<ExitStatus>,\n\t): Effect.fn.Return<readonly [StopReply, Session]> {\n\t\tif (state._tag === \"Stopping\" || state._tag === \"Stopped\")\n\t\t\treturn [state.reply, state] as const\n\t\tconst reply = yield* Deferred.make<Termination, SupervisorError>()\n\t\tconst next = beginStop(state, reason, reply, exit)\n\t\t// Fence in memory even when the journal cannot acknowledge the transition.\n\t\tconst saved = yield* Effect.exit(persist(next.record))\n\t\tyield* FiberSet.run(\n\t\t\tworkers,\n\t\t\tfinishStop(entry, next, saved).pipe(\n\t\t\t\tEffect.onExit((result) => Deferred.done(reply, result)),\n\t\t\t\tobserve,\n\t\t\t),\n\t\t\t{ startImmediately: false },\n\t\t)\n\t\treturn [reply, next] as const\n\t})\n\tconst stop = (\n\t\tentry: Entry,\n\t\treason: StopReason,\n\t\texit: Option.Option<ExitStatus> = Option.none(),\n\t) =>\n\t\tSynchronizedRef.modifyEffect(entry.state, (state) =>\n\t\t\tstopLocked(entry, state, reason, exit),\n\t\t).pipe(Effect.uninterruptible)\n\tconst scheduleLease = (entry: Entry, deadline: bigint) =>\n\t\tFiberHandle.run(\n\t\t\tentry.timer,\n\t\t\tobserve(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\tyield* Effect.sleep(\n\t\t\t\t\t\tDuration.nanos(deadline > now ? deadline - now : 0n),\n\t\t\t\t\t)\n\t\t\t\t\tyield* SynchronizedRef.updateEffect(entry.state, (state) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate._tag === \"Stopping\" ||\n\t\t\t\t\t\t\tstate._tag === \"Stopped\" ||\n\t\t\t\t\t\t\tstate.deadline !== deadline\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn Effect.succeed(state)\n\t\t\t\t\t\treturn stopLocked(\n\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t{ _tag: \"Expired\" },\n\t\t\t\t\t\t\tOption.none(),\n\t\t\t\t\t\t).pipe(Effect.map(([, next]) => next))\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t),\n\t\t\t{ startImmediately: false },\n\t\t)\n\tconst register = (entry: Entry, unit: Unit) =>\n\t\tSynchronizedRef.updateEffect(\n\t\t\tentry.state,\n\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\tconst next = yield* Effect.fromResult(registerUnit(current, unit))\n\t\t\t\tyield* unit.renew(\n\t\t\t\t\tNumber(current.deadline - (yield* Clock.monotonicTimeNanos)) /\n\t\t\t\t\t\t1_000_000,\n\t\t\t\t)\n\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\tyield* FiberSet.run(\n\t\t\t\t\tworkers,\n\t\t\t\t\tobserve(\n\t\t\t\t\t\tunit.exited.pipe(\n\t\t\t\t\t\t\tEffect.flatMap((exit) =>\n\t\t\t\t\t\t\t\tstop(entry, { _tag: \"Exited\" }, Option.some(exit)),\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\treturn next\n\t\t\t}),\n\t\t).pipe(Effect.uninterruptible)\n\tconst runLoad = (entry: Entry, state: Loading) =>\n\t\texecution\n\t\t\t.spawn(state.record.handle, state.request, state.record.limits)\n\t\t\t.pipe(\n\t\t\t\tScope.provide(entry.unitScope),\n\t\t\t\tEffect.flatMap((unit) =>\n\t\t\t\t\tregister(entry, unit).pipe(\n\t\t\t\t\t\tEffect.andThen(unit.start),\n\t\t\t\t\t\tEffect.as(unit.code),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tEffect.tap((code) => commit(entry, (current) => loaded(current, code))),\n\t\t\t\tEffect.onExit(\n\t\t\t\t\tEffect.fnUntraced(function* (\n\t\t\t\t\t\tresult: Exit.Exit<CodeIdentity, SupervisorError>,\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (Exit.isSuccess(result)) {\n\t\t\t\t\t\t\tyield* Deferred.done(state.reply, result)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst current = yield* SynchronizedRef.get(entry.state)\n\t\t\t\t\t\tif (current._tag === \"Loading\")\n\t\t\t\t\t\t\tyield* stop(entry, { _tag: \"LoadFailed\", cause: result.cause })\n\t\t\t\t\t\tconst healthCause = yield* health.cause\n\t\t\t\t\t\tyield* Deferred.failCause(\n\t\t\t\t\t\t\tstate.reply,\n\t\t\t\t\t\t\tCause.combine(result.cause, healthCause),\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\t// Load's caller observes its complete exit through the reply, including cancellation.\n\t\t\t\tEffect.exit,\n\t\t\t\tEffect.asVoid,\n\t\t\t)\n\n\treturn {\n\t\tpersist,\n\t\tstatus,\n\t\tlatest,\n\t\tentryFor,\n\t\tstop,\n\t\tscheduleLease,\n\t\trunLoad,\n\t\thealthy,\n\t}\n}\ntype Operations = ReturnType<typeof operations>\nconst recover = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { store, execution, confirmation, records } = runtime\n\tconst { persist } = actions\n\t// Recover before the service is published. Construction does not resume old leases.\n\tconst stored = yield* store.list\n\tyield* Ref.set(\n\t\trecords,\n\t\tHashMap.fromIterable(\n\t\t\tArray.map(stored, (record) => [record.handle.token, record] as const),\n\t\t),\n\t)\n\tfor (const record of stored) {\n\t\tif (record.phase === \"Stopped\") continue\n\t\tconst child = childOf(record)\n\t\tconst termination = Option.isNone(child)\n\t\t\t? emptyTermination\n\t\t\t: yield* execution.recover(child.value).pipe(\n\t\t\t\t\tEffect.timeout(confirmation),\n\t\t\t\t\tEffect.catchTags({\n\t\t\t\t\t\tExecutionError: (error) =>\n\t\t\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\t\t\tTerminationUnconfirmed.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Orphan recovery did not confirm exit\",\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\tTimeoutError: (error) =>\n\t\t\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\t\t\tTerminationUnconfirmed.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Orphan recovery did not confirm exit\",\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}),\n\t\t\t\t)\n\t\tyield* persist(\n\t\t\tstoppedRecord(\n\t\t\t\trecord.phase === \"Stopping\" ? record.previous : record,\n\t\t\t\t{ _tag: \"Recovery\" },\n\t\t\t\ttermination,\n\t\t\t),\n\t\t)\n\t}\n})\nconst ownShutdown = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { entries, health, closing } = runtime\n\tconst { stop } = actions\n\tyield* Effect.addFinalizer(\n\t\tEffect.fnUntraced(function* () {\n\t\t\tyield* Ref.set(closing, true)\n\t\t\tconst all = yield* Ref.get(entries)\n\t\t\tconst exits = yield* Effect.forEach(HashMap.values(all), (entry) =>\n\t\t\t\tstop(entry, { _tag: \"Shutdown\" }).pipe(\n\t\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t\t\tEffect.exit,\n\t\t\t\t),\n\t\t\t)\n\t\t\tconst initial: Cause.Cause<unknown> = yield* health.cause\n\t\t\tconst cause = Array.reduce(exits, initial, (cause, exit) =>\n\t\t\t\tCause.combine(\n\t\t\t\t\tcause,\n\t\t\t\t\tExit.isFailure(exit) ? exit.cause : exit.value.cause,\n\t\t\t\t),\n\t\t\t)\n\t\t\tif (cause.reasons.length > 0)\n\t\t\t\treturn yield* Effect.failCause(cleanupCause(cause))\n\t\t}),\n\t)\n})\nconst protocol = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { random, owner, locks, lease, limits, records, entries, health } =\n\t\truntime\n\tconst {\n\t\tpersist,\n\t\tstatus,\n\t\tlatest,\n\t\tentryFor,\n\t\tstop,\n\t\tscheduleLease,\n\t\trunLoad,\n\t\thealthy,\n\t} = actions\n\treturn Supervisor.of({\n\t\tawait: health.await,\n\t\tstatus,\n\t\thighWater: (key) =>\n\t\t\tlatest(key).pipe(Effect.map((value) => (value === 0 ? null : value))),\n\t\topen: Effect.fnUntraced(function* (request: Open) {\n\t\t\tyield* healthy\n\t\t\tconst leaseMillis = Duration.toMillis(request.lease ?? lease)\n\t\t\tconst negotiated = negotiate(limits, request.limits ?? defaults)\n\t\t\tconst lock = yield* RcMap.get(locks, keyOf(request.key))\n\t\t\treturn yield* Effect.gen(function* () {\n\t\t\t\tyield* healthy\n\t\t\t\tconst allRecords = yield* Ref.get(records)\n\t\t\t\tconst same = Array.filter(\n\t\t\t\t\tArray.fromIterable(HashMap.values(allRecords)),\n\t\t\t\t\t(row) => Equal.equals(keyOf(row.handle.key), keyOf(request.key)),\n\t\t\t\t)\n\t\t\t\tconst prior = Array.findFirst(\n\t\t\t\t\tsame,\n\t\t\t\t\t(row) => row.requestId === request.requestId,\n\t\t\t\t)\n\t\t\t\tif (Option.isSome(prior)) return prior.value\n\t\t\t\tconst generation = yield* latest(request.key)\n\t\t\t\tif (generation !== (request.expectedGeneration ?? 0))\n\t\t\t\t\treturn yield* StaleSession.make({\n\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\t\"Open expectedGeneration does not match the generation high-water mark\",\n\t\t\t\t\t})\n\t\t\t\tfor (const record of same) {\n\t\t\t\t\tconst allEntries = yield* Ref.get(entries)\n\t\t\t\t\tconst entry = HashMap.get(allEntries, record.handle.token)\n\t\t\t\t\tif (Option.isSome(entry))\n\t\t\t\t\t\tyield* stop(entry.value, { _tag: \"Superseded\" }).pipe(\n\t\t\t\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t\t\t\t\tEffect.tap((result) =>\n\t\t\t\t\t\t\t\tresult.cause.reasons.length === 0\n\t\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t\t: Effect.logWarning(\n\t\t\t\t\t\t\t\t\t\t\t\"Superseded remote execution cleanup failed\",\n\t\t\t\t\t\t\t\t\t\t\tresult.cause,\n\t\t\t\t\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.identity\": record.handle.key.identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.instance\": record.handle.key.instance,\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.generation\": record.handle.generation,\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tyield* healthy\n\t\t\t\tconst token = yield* random.uuidV4()\n\t\t\t\tconst record: typeof OpenRecord.Type = {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tphase: \"Open\",\n\t\t\t\t\thandle: {\n\t\t\t\t\t\tkey: request.key,\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\tgeneration: generation + 1,\n\t\t\t\t\t},\n\t\t\t\t\trequestId: request.requestId,\n\t\t\t\t\tleaseMillis,\n\t\t\t\t\tlimits: negotiated,\n\t\t\t\t}\n\t\t\t\treturn yield* Effect.uninterruptible(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* persist(record)\n\t\t\t\t\t\tconst deadline =\n\t\t\t\t\t\t\t(yield* Clock.monotonicTimeNanos) + nanos(leaseMillis)\n\t\t\t\t\t\tconst scope = yield* Scope.fork(owner)\n\t\t\t\t\t\tconst entry: Entry = {\n\t\t\t\t\t\t\tstate: yield* SynchronizedRef.make<Session>(\n\t\t\t\t\t\t\t\tSession.Open({ record, deadline }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tscope,\n\t\t\t\t\t\t\tunitScope: yield* Scope.fork(scope),\n\t\t\t\t\t\t\ttimer: yield* FiberHandle.make<void, never>().pipe(\n\t\t\t\t\t\t\t\tScope.provide(scope),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tloading: yield* FiberHandle.make<void, never>().pipe(\n\t\t\t\t\t\t\t\tScope.provide(scope),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// The store's retention policy is also the in-memory eviction policy.\n\t\t\t\t\t\tconst retained = yield* Ref.get(records)\n\t\t\t\t\t\tconst old = yield* Ref.modify(\n\t\t\t\t\t\t\tentries,\n\t\t\t\t\t\t\t(all) =>\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\tArray.filter(\n\t\t\t\t\t\t\t\t\t\tArray.fromIterable(HashMap.entries(all)),\n\t\t\t\t\t\t\t\t\t\t([key]) => !HashMap.has(retained, key),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tHashMap.set(\n\t\t\t\t\t\t\t\t\t\tHashMap.filter(all, (_, key) => HashMap.has(retained, key)),\n\t\t\t\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t] as const,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tfor (const [, retired] of old)\n\t\t\t\t\t\t\tyield* Release.close(retired.scope, Exit.void)\n\t\t\t\t\t\tyield* scheduleLease(entry, deadline)\n\t\t\t\t\t\treturn record\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}).pipe(lock.withPermit)\n\t\t}, Effect.scoped),\n\t\trenew: Effect.fnUntraced(function* (handle: Handle) {\n\t\t\tyield* healthy\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\t// Arming the new timer interrupts the old one, so the new deadline must be stored too.\n\t\t\t// Telling the child may block on its control pipe, so that step stays interruptible:\n\t\t\t// if it is cut short, nothing is stored and the old timer keeps its deadline.\n\t\t\treturn yield* Effect.uninterruptibleMask((restore) =>\n\t\t\t\tSynchronizedRef.modifyEffect(\n\t\t\t\t\tentry.state,\n\t\t\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\t\t\tconst running = executionOf(current)\n\t\t\t\t\t\tif (running._tag === \"Running\")\n\t\t\t\t\t\t\tyield* restore(running.unit.renew(current.record.leaseMillis))\n\t\t\t\t\t\tconst deadline = now + nanos(current.record.leaseMillis)\n\t\t\t\t\t\tyield* scheduleLease(entry, deadline)\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tcurrent.record.leaseMillis,\n\t\t\t\t\t\t\t{ ...current, deadline },\n\t\t\t\t\t\t] as const\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t}),\n\t\tload: Effect.fnUntraced(function* (handle: Handle, request: Load) {\n\t\t\tyield* healthy\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\tconst reply = yield* SynchronizedRef.modifyEffect(\n\t\t\t\tentry.state,\n\t\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\t\tif (current._tag !== \"Open\") {\n\t\t\t\t\t\tconst before =\n\t\t\t\t\t\t\tcurrent._tag === \"Loading\" ? current.request : current.record.load\n\t\t\t\t\t\tif (before.specifier !== request.specifier)\n\t\t\t\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\t\t\t\tdetail: \"Load was already requested with a different specifier\",\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tcurrent._tag === \"Loading\"\n\t\t\t\t\t\t\t\t? Deferred.await(current.reply)\n\t\t\t\t\t\t\t\t: Effect.succeed(current.record.code),\n\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t] as const\n\t\t\t\t\t}\n\t\t\t\t\tconst done = yield* Deferred.make<CodeIdentity, SupervisorError>()\n\t\t\t\t\tconst next = beginLoad(current, request, done)\n\t\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\t\tif (next._tag === \"Loading\")\n\t\t\t\t\t\tyield* FiberHandle.run(entry.loading, runLoad(entry, next), {\n\t\t\t\t\t\t\tstartImmediately: false,\n\t\t\t\t\t\t})\n\t\t\t\t\treturn [Deferred.await(done), next] as const\n\t\t\t\t}),\n\t\t\t).pipe(Effect.uninterruptible)\n\t\t\treturn yield* reply\n\t\t}),\n\t\tdispose: Effect.fnUntraced(function* (handle: Handle) {\n\t\t\tconst record = yield* status(handle)\n\t\t\tif (record.phase === \"Stopped\") return record.termination\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\treturn yield* stop(entry, { _tag: \"Disposed\" }).pipe(\n\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t)\n\t\t}),\n\t})\n})\nexport const make = Effect.fnUntraced(function* (options: Options = {}) {\n\tconst runtime = yield* initialize(options)\n\tconst actions = operations(runtime)\n\tyield* recover(runtime, actions)\n\tyield* ownShutdown(runtime, actions)\n\treturn yield* protocol(runtime, actions)\n})\nexport const layer = (options: Options = {}) =>\n\tLayer.effect(Supervisor, make(options))\n"],"mappings":"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"}
1
+ {"version":3,"file":"Supervisor.js","names":["FailureGroup.make","Retention.save"],"sources":["../../../src/internal/runner/Supervisor.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tClock,\n\tContext,\n\tData,\n\tDeferred,\n\tDuration,\n\tEffect,\n\tEqual,\n\tExit,\n\tFiberHandle,\n\tFiberSet,\n\tHashMap,\n\tLayer,\n\tOption,\n\tRcMap,\n\tRef,\n\tResult,\n\tScope,\n\tSemaphore,\n\tSynchronizedRef,\n} from \"effect\"\nimport { SecureRandom } from \"effect/crypto\"\n\nimport * as Release from \"@graftland/graft/Release\"\n\nimport { cleanupCause } from \"../cleanup\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport {\n\tchildOf,\n\tdefaults,\n\tExecution,\n\tExecutionError,\n\tkeyOf,\n\tLeaseExpired,\n\tnegotiate,\n\tPackageError,\n\tRunnerClosing,\n\tSessionConflict,\n\tSessionStopped,\n\tStaleSession,\n\tStateStorageError,\n\tstoppedRecord,\n\tstoppingRecord,\n\tStore,\n\tTerminationUnconfirmed,\n\ttype ActiveRecord,\n\ttype CodeIdentity,\n\ttype ExitStatus,\n\ttype Handle,\n\ttype Key,\n\ttype Limits,\n\ttype Load,\n\ttype LoadedRecord,\n\ttype OpenRecord,\n\ttype SessionKey,\n\ttype SessionRecord,\n\ttype StoppedRecord,\n\ttype StoppingRecord,\n\ttype StopReason,\n\ttype Termination,\n\ttype Unit,\n} from \"./model\"\nimport * as Retention from \"./Retention\"\n\nexport type SupervisorError =\n\t| StaleSession\n\t| LeaseExpired\n\t| SessionStopped\n\t| SessionConflict\n\t| StateStorageError\n\t| ExecutionError\n\t| PackageError\n\t| TerminationUnconfirmed\n\t| RunnerClosing\nexport interface Options {\n\treadonly lease?: Duration.Input\n\treadonly grace?: Duration.Input\n\treadonly confirmationTimeout?: Duration.Input\n\treadonly limits?: Limits\n}\nexport interface Open {\n\treadonly key: Key\n\treadonly requestId: string\n\treadonly expectedGeneration?: number | null\n\treadonly lease?: Duration.Input\n\treadonly limits?: Limits\n}\nexport class Supervisor extends Context.Service<\n\tSupervisor,\n\t{\n\t\treadonly await: Effect.Effect<never, SupervisorError>\n\t\treadonly status: (\n\t\t\thandle: Handle,\n\t\t) => Effect.Effect<SessionRecord, StaleSession>\n\t\treadonly highWater: (key: Key) => Effect.Effect<number | null>\n\t\treadonly open: (\n\t\t\trequest: Open,\n\t\t) => Effect.Effect<SessionRecord, SupervisorError>\n\t\treadonly renew: (handle: Handle) => Effect.Effect<number, SupervisorError>\n\t\treadonly load: (\n\t\t\thandle: Handle,\n\t\t\trequest: Load,\n\t\t) => Effect.Effect<CodeIdentity, SupervisorError>\n\t\treadonly dispose: (\n\t\t\thandle: Handle,\n\t\t) => Effect.Effect<Termination, SupervisorError>\n\t}\n>()(\"@graftland/plugin-remote/internal/runner/Supervisor\") {}\n\ntype Launch = Data.TaggedEnum<{\n\tStarting: {}\n\tRegistered: { readonly unit: Unit }\n}>\nconst Launch = Data.taggedEnum<Launch>()\ntype ExecutionState = Data.TaggedEnum<{\n\tAbsent: {}\n\tRunning: { readonly unit: Unit }\n\tExited: { readonly exit: ExitStatus }\n}>\nconst ExecutionState = Data.taggedEnum<ExecutionState>()\ntype LoadReply = Deferred.Deferred<CodeIdentity, SupervisorError>\ntype StopReply = Deferred.Deferred<Termination, SupervisorError>\ntype Session = Data.TaggedEnum<{\n\tOpen: { readonly record: typeof OpenRecord.Type; readonly deadline: bigint }\n\tLoading: {\n\t\treadonly record: typeof OpenRecord.Type\n\t\treadonly request: Load\n\t\treadonly launch: Launch\n\t\treadonly reply: LoadReply\n\t\treadonly deadline: bigint\n\t}\n\tLoaded: {\n\t\treadonly record: typeof LoadedRecord.Type\n\t\treadonly unit: Unit\n\t\treadonly deadline: bigint\n\t}\n\tStopping: {\n\t\treadonly record: typeof StoppingRecord.Type\n\t\treadonly execution: ExecutionState\n\t\treadonly reply: StopReply\n\t}\n\tStopped: {\n\t\treadonly record: typeof StoppedRecord.Type\n\t\treadonly reply: StopReply\n\t}\n}>\nconst Session = Data.taggedEnum<Session>()\ntype Live = Extract<Session, { readonly _tag: \"Open\" | \"Loading\" | \"Loaded\" }>\ntype Loading = Extract<Session, { readonly _tag: \"Loading\" }>\ntype Stopping = Extract<Session, { readonly _tag: \"Stopping\" }>\ninterface Entry {\n\treadonly state: SynchronizedRef.SynchronizedRef<Session>\n\treadonly timer: FiberHandle.FiberHandle<void, never>\n\treadonly loading: FiberHandle.FiberHandle<void, never>\n\treadonly scope: Scope.Closeable\n\treadonly unitScope: Scope.Closeable\n}\nfunction snapshot(state: Live): ActiveRecord\nfunction snapshot(state: Session): SessionRecord\nfunction snapshot(state: Session): SessionRecord {\n\treturn state._tag === \"Loading\"\n\t\t? {\n\t\t\t\t...state.record,\n\t\t\t\tphase: \"Loading\",\n\t\t\t\tload: state.request,\n\t\t\t\tlaunch:\n\t\t\t\t\tstate.launch._tag === \"Starting\"\n\t\t\t\t\t\t? { _tag: \"Starting\" }\n\t\t\t\t\t\t: { _tag: \"Registered\", child: state.launch.unit.identity },\n\t\t\t}\n\t\t: state.record\n}\nconst live = (\n\tstate: Session,\n\tnow: bigint,\n): Result.Result<Live, LeaseExpired | SessionStopped> => {\n\tif (state._tag === \"Stopping\" || state._tag === \"Stopped\")\n\t\treturn Result.fail(\n\t\t\tstate.record.reason._tag === \"Expired\"\n\t\t\t\t? LeaseExpired.make({\n\t\t\t\t\t\tdetail: \"The session lease has expired\",\n\t\t\t\t\t})\n\t\t\t\t: SessionStopped.make({\n\t\t\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t\t\t}),\n\t\t)\n\treturn now >= state.deadline\n\t\t? Result.fail(\n\t\t\t\tLeaseExpired.make({\n\t\t\t\t\tdetail: \"The session lease has expired\",\n\t\t\t\t}),\n\t\t\t)\n\t\t: Result.succeed(state)\n}\nconst executionOf = (state: Live): ExecutionState => {\n\tswitch (state._tag) {\n\t\tcase \"Open\":\n\t\t\treturn ExecutionState.Absent()\n\t\tcase \"Loading\":\n\t\t\treturn state.launch._tag === \"Registered\"\n\t\t\t\t? ExecutionState.Running({ unit: state.launch.unit })\n\t\t\t\t: ExecutionState.Absent()\n\t\tcase \"Loaded\":\n\t\t\treturn ExecutionState.Running({ unit: state.unit })\n\t}\n}\n/** All state transitions are pure; the caller serializes persistence and publication. */\nconst beginLoad = (\n\tstate: Extract<Session, { _tag: \"Open\" }>,\n\trequest: Load,\n\treply: LoadReply,\n): Loading =>\n\tSession.Loading({\n\t\trecord: state.record,\n\t\tdeadline: state.deadline,\n\t\trequest,\n\t\treply,\n\t\tlaunch: Launch.Starting(),\n\t})\nconst registerUnit = (\n\tstate: Session,\n\tunit: Unit,\n): Result.Result<Session, SessionStopped | ExecutionError> => {\n\tif (state._tag !== \"Loading\")\n\t\treturn Result.fail(\n\t\t\tSessionStopped.make({\n\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t}),\n\t\t)\n\tif (state.launch._tag === \"Registered\")\n\t\treturn Result.fail(\n\t\t\tExecutionError.make({\n\t\t\t\tdetail: \"An execution adapter registered more than one child\",\n\t\t\t}),\n\t\t)\n\treturn Result.succeed(\n\t\tSession.Loading({ ...state, launch: Launch.Registered({ unit }) }),\n\t)\n}\nconst loaded = (\n\tstate: Session,\n\tcode: CodeIdentity,\n): Result.Result<Session, SessionStopped | ExecutionError> => {\n\tif (state._tag !== \"Loading\")\n\t\treturn Result.fail(\n\t\t\tSessionStopped.make({\n\t\t\t\tdetail: \"The session is stopping or stopped\",\n\t\t\t}),\n\t\t)\n\tif (state.launch._tag !== \"Registered\")\n\t\treturn Result.fail(\n\t\t\tExecutionError.make({\n\t\t\t\tdetail: \"Execution adapter returned without registering its child\",\n\t\t\t}),\n\t\t)\n\treturn Result.succeed(\n\t\tSession.Loaded({\n\t\t\tdeadline: state.deadline,\n\t\t\tunit: state.launch.unit,\n\t\t\trecord: {\n\t\t\t\t...state.record,\n\t\t\t\tphase: \"Loaded\",\n\t\t\t\tload: state.request,\n\t\t\t\tcode,\n\t\t\t\tchild: state.launch.unit.identity,\n\t\t\t},\n\t\t}),\n\t)\n}\nconst beginStop = (\n\tstate: Live,\n\treason: StopReason,\n\treply: StopReply,\n\texit: Option.Option<ExitStatus>,\n): Stopping =>\n\tSession.Stopping({\n\t\trecord: stoppingRecord(snapshot(state), reason),\n\t\treply,\n\t\texecution: Option.match(exit, {\n\t\t\tonNone: () => executionOf(state),\n\t\t\tonSome: (exit) => ExecutionState.Exited({ exit }),\n\t\t}),\n\t})\nconst nanos = (millis: number) => BigInt(Math.ceil(millis * 1_000_000))\nconst emptyTermination: Termination = {\n\tkind: \"Exited\",\n\texit: { code: 0, signal: null },\n\tcause: Cause.empty,\n}\nconst exitCause = <A, E>(exit: Exit.Exit<A, E>) =>\n\tExit.isFailure(exit) ? exit.cause : Cause.empty\n\n/** A signal is a request; only the exited effect confirms that the execution has stopped. */\nconst terminate = Effect.fnUntraced(function* (\n\texecution: ExecutionState,\n\tgrace: number,\n\tconfirmation: number,\n): Effect.fn.Return<Termination, TerminationUnconfirmed> {\n\tif (execution._tag === \"Absent\") return emptyTermination\n\tif (execution._tag === \"Exited\")\n\t\treturn { ...emptyTermination, exit: execution.exit }\n\tconst child = execution.unit\n\tconst graceful = yield* child.interrupt.pipe(\n\t\tEffect.andThen(child.exited),\n\t\tEffect.timeoutOption(grace),\n\t\tEffect.exit,\n\t)\n\tif (Exit.isSuccess(graceful) && Option.isSome(graceful.value))\n\t\treturn { ...emptyTermination, exit: graceful.value.value }\n\tconst killed = yield* Effect.exit(child.kill)\n\tconst forced = yield* child.exited.pipe(\n\t\tEffect.timeoutOption(confirmation),\n\t\tEffect.exit,\n\t)\n\tconst cause = Cause.combine(\n\t\tCause.combine(exitCause(graceful), exitCause(killed)),\n\t\texitCause(forced),\n\t)\n\tif (Exit.isFailure(forced) || Option.isNone(forced.value))\n\t\treturn yield* TerminationUnconfirmed.make({\n\t\t\tdetail: \"The child exit could not be confirmed\",\n\t\t\tcause,\n\t\t})\n\treturn {\n\t\tkind: \"Killed\",\n\t\texit: forced.value.value,\n\t\tcause,\n\t} satisfies Termination\n})\n\nconst initialize = Effect.fnUntraced(function* (options: Options = {}) {\n\tconst store = yield* Store\n\tconst execution = yield* Execution\n\tconst random = yield* SecureRandom.SecureRandom\n\tconst parent = yield* Effect.scope\n\tconst owner = yield* Scope.fork(parent)\n\t// Cleanup must continue after a health failure so every registered process is reaped.\n\tconst workers = yield* FiberSet.make<void, never>().pipe(Scope.provide(owner))\n\tconst locks = yield* RcMap.make({\n\t\tlookup: (_key: SessionKey) => Semaphore.make(1),\n\t}).pipe(Scope.provide(owner))\n\tconst lease = Duration.toMillis(options.lease ?? \"15 seconds\")\n\tconst grace = Duration.toMillis(options.grace ?? \"5 seconds\")\n\tconst confirmation = Duration.toMillis(\n\t\toptions.confirmationTimeout ?? \"5 seconds\",\n\t)\n\tconst limits = options.limits ?? defaults\n\tconst records = yield* Ref.make(HashMap.empty<string, SessionRecord>())\n\tconst entries = yield* Ref.make(HashMap.empty<string, Entry>())\n\tconst health = yield* FailureGroup.make<SupervisorError>().pipe(\n\t\tScope.provide(owner),\n\t)\n\tconst closing = yield* Ref.make(false)\n\treturn {\n\t\tstore,\n\t\texecution,\n\t\trandom,\n\t\towner,\n\t\tworkers,\n\t\tlocks,\n\t\tlease,\n\t\tgrace,\n\t\tconfirmation,\n\t\tlimits,\n\t\trecords,\n\t\tentries,\n\t\thealth,\n\t\tclosing,\n\t}\n})\ntype Runtime = Effect.Success<ReturnType<typeof initialize>>\nconst operations = (runtime: Runtime) => {\n\tconst {\n\t\tstore,\n\t\texecution,\n\t\tworkers,\n\t\tgrace,\n\t\tconfirmation,\n\t\trecords,\n\t\tentries,\n\t\thealth,\n\t\tclosing,\n\t} = runtime\n\n\tconst poison = health.failCause\n\tconst observe = <A>(effect: Effect.Effect<A, SupervisorError>) =>\n\t\teffect.pipe(Effect.asVoid, Effect.catchCause(poison))\n\tconst healthy = health.check.pipe(\n\t\tEffect.andThen(\n\t\t\tEffect.gen(function* () {\n\t\t\t\tif (yield* Ref.get(closing))\n\t\t\t\t\treturn yield* RunnerClosing.make({ detail: \"The runner is closing\" })\n\t\t\t}),\n\t\t),\n\t)\n\tconst persist = (record: SessionRecord) =>\n\t\tstore\n\t\t\t.save(record)\n\t\t\t.pipe(\n\t\t\t\tEffect.tapCause(poison),\n\t\t\t\tEffect.andThen(\n\t\t\t\t\tRef.update(records, (all) => Retention.save(all, record)),\n\t\t\t\t),\n\t\t\t)\n\tconst status = (handle: Handle) =>\n\t\tRef.get(records).pipe(\n\t\t\tEffect.flatMap((all) => {\n\t\t\t\tconst found = HashMap.get(all, handle.token)\n\t\t\t\treturn Option.isSome(found) &&\n\t\t\t\t\tEqual.equals(keyOf(found.value.handle.key), keyOf(handle.key)) &&\n\t\t\t\t\tfound.value.handle.generation === handle.generation\n\t\t\t\t\t? Effect.succeed(found.value)\n\t\t\t\t\t: Effect.fail(\n\t\t\t\t\t\t\tStaleSession.make({\n\t\t\t\t\t\t\t\tdetail: \"Unknown session or generation\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t}),\n\t\t)\n\tconst latest = (key: Key) =>\n\t\tRef.get(records).pipe(\n\t\t\tEffect.map((all) =>\n\t\t\t\tArray.reduce(\n\t\t\t\t\tArray.fromIterable(HashMap.values(all)),\n\t\t\t\t\t0,\n\t\t\t\t\t(value, record) =>\n\t\t\t\t\t\tEqual.equals(keyOf(record.handle.key), keyOf(key))\n\t\t\t\t\t\t\t? Math.max(value, record.handle.generation)\n\t\t\t\t\t\t\t: value,\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\tconst entryFor = Effect.fnUntraced(function* (handle: Handle) {\n\t\tyield* status(handle)\n\t\tconst all = yield* Ref.get(entries)\n\t\tconst found = HashMap.get(all, handle.token)\n\t\tif (Option.isNone(found))\n\t\t\treturn yield* SessionStopped.make({\n\t\t\t\tdetail: \"The session was retired during recovery\",\n\t\t\t})\n\t\treturn found.value\n\t})\n\tconst commit = (\n\t\tentry: Entry,\n\t\ttransition: (\n\t\t\tstate: Session,\n\t\t) => Result.Result<Session, ExecutionError | SessionStopped>,\n\t) =>\n\t\tSynchronizedRef.updateEffect(\n\t\t\tentry.state,\n\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\tconst next = yield* Effect.fromResult(transition(state))\n\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\treturn next\n\t\t\t}),\n\t\t)\n\tconst finishStop = Effect.fnUntraced(function* (\n\t\tentry: Entry,\n\t\tstate: Stopping,\n\t\tsaved: Exit.Exit<void, StateStorageError>,\n\t) {\n\t\tyield* FiberHandle.clear(entry.loading)\n\t\tconst result = yield* terminate(state.execution, grace, confirmation)\n\t\tconst closed = yield* Effect.exit(Release.close(entry.unitScope, Exit.void))\n\t\tconst termination: Termination = {\n\t\t\t...result,\n\t\t\tcause: Cause.combine(result.cause, exitCause(closed)),\n\t\t}\n\t\tconst record = stoppedRecord(\n\t\t\tstate.record.previous,\n\t\t\tstate.record.reason,\n\t\t\ttermination,\n\t\t)\n\t\tyield* SynchronizedRef.updateEffect(entry.state, () =>\n\t\t\tpersist(record).pipe(\n\t\t\t\tEffect.as(Session.Stopped({ record, reply: state.reply })),\n\t\t\t),\n\t\t)\n\t\tif (Exit.isFailure(saved)) return yield* Effect.failCause(saved.cause)\n\t\treturn termination\n\t})\n\t/** Called with the session ref locked; the worker starts after its transition is published. */\n\tconst stopLocked = Effect.fnUntraced(function* (\n\t\tentry: Entry,\n\t\tstate: Session,\n\t\treason: StopReason,\n\t\texit: Option.Option<ExitStatus>,\n\t): Effect.fn.Return<readonly [StopReply, Session]> {\n\t\tif (state._tag === \"Stopping\" || state._tag === \"Stopped\")\n\t\t\treturn [state.reply, state] as const\n\t\tconst reply = yield* Deferred.make<Termination, SupervisorError>()\n\t\tconst next = beginStop(state, reason, reply, exit)\n\t\t// Fence in memory even when the journal cannot acknowledge the transition.\n\t\tconst saved = yield* Effect.exit(persist(next.record))\n\t\tyield* FiberSet.run(\n\t\t\tworkers,\n\t\t\tfinishStop(entry, next, saved).pipe(\n\t\t\t\tEffect.onExit((result) => Deferred.done(reply, result)),\n\t\t\t\tobserve,\n\t\t\t),\n\t\t\t{ startImmediately: false },\n\t\t)\n\t\treturn [reply, next] as const\n\t})\n\tconst stop = (\n\t\tentry: Entry,\n\t\treason: StopReason,\n\t\texit: Option.Option<ExitStatus> = Option.none(),\n\t) =>\n\t\tSynchronizedRef.modifyEffect(entry.state, (state) =>\n\t\t\tstopLocked(entry, state, reason, exit),\n\t\t).pipe(Effect.uninterruptible)\n\tconst scheduleLease = (entry: Entry, deadline: bigint) =>\n\t\tFiberHandle.run(\n\t\t\tentry.timer,\n\t\t\tobserve(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\tyield* Effect.sleep(\n\t\t\t\t\t\tDuration.nanos(deadline > now ? deadline - now : 0n),\n\t\t\t\t\t)\n\t\t\t\t\tyield* SynchronizedRef.updateEffect(entry.state, (state) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate._tag === \"Stopping\" ||\n\t\t\t\t\t\t\tstate._tag === \"Stopped\" ||\n\t\t\t\t\t\t\tstate.deadline !== deadline\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn Effect.succeed(state)\n\t\t\t\t\t\treturn stopLocked(\n\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t{ _tag: \"Expired\" },\n\t\t\t\t\t\t\tOption.none(),\n\t\t\t\t\t\t).pipe(Effect.map(([, next]) => next))\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t),\n\t\t\t{ startImmediately: false },\n\t\t)\n\tconst register = (entry: Entry, unit: Unit) =>\n\t\tSynchronizedRef.updateEffect(\n\t\t\tentry.state,\n\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\tconst next = yield* Effect.fromResult(registerUnit(current, unit))\n\t\t\t\tyield* unit.renew(\n\t\t\t\t\tNumber(current.deadline - (yield* Clock.monotonicTimeNanos)) /\n\t\t\t\t\t\t1_000_000,\n\t\t\t\t)\n\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\tyield* FiberSet.run(\n\t\t\t\t\tworkers,\n\t\t\t\t\tobserve(\n\t\t\t\t\t\tunit.exited.pipe(\n\t\t\t\t\t\t\tEffect.flatMap((exit) =>\n\t\t\t\t\t\t\t\tstop(entry, { _tag: \"Exited\" }, Option.some(exit)),\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\treturn next\n\t\t\t}),\n\t\t).pipe(Effect.uninterruptible)\n\tconst runLoad = (entry: Entry, state: Loading) =>\n\t\texecution\n\t\t\t.spawn(state.record.handle, state.request, state.record.limits)\n\t\t\t.pipe(\n\t\t\t\tScope.provide(entry.unitScope),\n\t\t\t\tEffect.flatMap((unit) =>\n\t\t\t\t\tregister(entry, unit).pipe(\n\t\t\t\t\t\tEffect.andThen(unit.start),\n\t\t\t\t\t\tEffect.as(unit.code),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tEffect.tap((code) => commit(entry, (current) => loaded(current, code))),\n\t\t\t\tEffect.onExit(\n\t\t\t\t\tEffect.fnUntraced(function* (\n\t\t\t\t\t\tresult: Exit.Exit<CodeIdentity, SupervisorError>,\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (Exit.isSuccess(result)) {\n\t\t\t\t\t\t\tyield* Deferred.done(state.reply, result)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst current = yield* SynchronizedRef.get(entry.state)\n\t\t\t\t\t\tif (current._tag === \"Loading\")\n\t\t\t\t\t\t\tyield* stop(entry, { _tag: \"LoadFailed\", cause: result.cause })\n\t\t\t\t\t\tconst healthCause = yield* health.cause\n\t\t\t\t\t\tyield* Deferred.failCause(\n\t\t\t\t\t\t\tstate.reply,\n\t\t\t\t\t\t\tCause.combine(result.cause, healthCause),\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\t// Load's caller observes its complete exit through the reply, including cancellation.\n\t\t\t\tEffect.exit,\n\t\t\t\tEffect.asVoid,\n\t\t\t)\n\n\treturn {\n\t\tpersist,\n\t\tstatus,\n\t\tlatest,\n\t\tentryFor,\n\t\tstop,\n\t\tscheduleLease,\n\t\trunLoad,\n\t\thealthy,\n\t}\n}\ntype Operations = ReturnType<typeof operations>\nconst recover = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { store, execution, confirmation, records } = runtime\n\tconst { persist } = actions\n\t// Recover before the service is published. Construction does not resume old leases.\n\tconst stored = yield* store.list\n\tyield* Ref.set(\n\t\trecords,\n\t\tHashMap.fromIterable(\n\t\t\tArray.map(stored, (record) => [record.handle.token, record] as const),\n\t\t),\n\t)\n\tfor (const record of stored) {\n\t\tif (record.phase === \"Stopped\") continue\n\t\tconst child = childOf(record)\n\t\tconst termination = Option.isNone(child)\n\t\t\t? emptyTermination\n\t\t\t: yield* execution.recover(child.value).pipe(\n\t\t\t\t\tEffect.timeout(confirmation),\n\t\t\t\t\tEffect.catchTags({\n\t\t\t\t\t\tExecutionError: (error) =>\n\t\t\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\t\t\tTerminationUnconfirmed.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Orphan recovery did not confirm exit\",\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\tTimeoutError: (error) =>\n\t\t\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\t\t\tTerminationUnconfirmed.make({\n\t\t\t\t\t\t\t\t\tdetail: \"Orphan recovery did not confirm exit\",\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}),\n\t\t\t\t)\n\t\tyield* persist(\n\t\t\tstoppedRecord(\n\t\t\t\trecord.phase === \"Stopping\" ? record.previous : record,\n\t\t\t\t{ _tag: \"Recovery\" },\n\t\t\t\ttermination,\n\t\t\t),\n\t\t)\n\t}\n})\nconst ownShutdown = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { entries, health, closing } = runtime\n\tconst { stop } = actions\n\tyield* Effect.addFinalizer(\n\t\tEffect.fnUntraced(function* () {\n\t\t\tyield* Ref.set(closing, true)\n\t\t\tconst all = yield* Ref.get(entries)\n\t\t\tconst exits = yield* Effect.forEach(HashMap.values(all), (entry) =>\n\t\t\t\tstop(entry, { _tag: \"Shutdown\" }).pipe(\n\t\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t\t\tEffect.exit,\n\t\t\t\t),\n\t\t\t)\n\t\t\tconst initial: Cause.Cause<unknown> = yield* health.cause\n\t\t\tconst cause = Array.reduce(exits, initial, (cause, exit) =>\n\t\t\t\tCause.combine(\n\t\t\t\t\tcause,\n\t\t\t\t\tExit.isFailure(exit) ? exit.cause : exit.value.cause,\n\t\t\t\t),\n\t\t\t)\n\t\t\tif (cause.reasons.length > 0)\n\t\t\t\treturn yield* Effect.failCause(cleanupCause(cause))\n\t\t}),\n\t)\n})\nconst protocol = Effect.fnUntraced(function* (\n\truntime: Runtime,\n\tactions: Operations,\n) {\n\tconst { random, owner, locks, lease, limits, records, entries, health } =\n\t\truntime\n\tconst {\n\t\tpersist,\n\t\tstatus,\n\t\tlatest,\n\t\tentryFor,\n\t\tstop,\n\t\tscheduleLease,\n\t\trunLoad,\n\t\thealthy,\n\t} = actions\n\treturn Supervisor.of({\n\t\tawait: health.await,\n\t\tstatus,\n\t\thighWater: (key) =>\n\t\t\tlatest(key).pipe(Effect.map((value) => (value === 0 ? null : value))),\n\t\topen: Effect.fnUntraced(function* (request: Open) {\n\t\t\tyield* healthy\n\t\t\tconst leaseMillis = Duration.toMillis(request.lease ?? lease)\n\t\t\tconst negotiated = negotiate(limits, request.limits ?? defaults)\n\t\t\tconst lock = yield* RcMap.get(locks, keyOf(request.key))\n\t\t\treturn yield* Effect.gen(function* () {\n\t\t\t\tyield* healthy\n\t\t\t\tconst allRecords = yield* Ref.get(records)\n\t\t\t\tconst same = Array.filter(\n\t\t\t\t\tArray.fromIterable(HashMap.values(allRecords)),\n\t\t\t\t\t(row) => Equal.equals(keyOf(row.handle.key), keyOf(request.key)),\n\t\t\t\t)\n\t\t\t\tconst prior = Array.findFirst(\n\t\t\t\t\tsame,\n\t\t\t\t\t(row) => row.requestId === request.requestId,\n\t\t\t\t)\n\t\t\t\tif (Option.isSome(prior)) return prior.value\n\t\t\t\tconst generation = yield* latest(request.key)\n\t\t\t\tif (generation !== (request.expectedGeneration ?? 0))\n\t\t\t\t\treturn yield* StaleSession.make({\n\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\t\"Open expectedGeneration does not match the generation high-water mark\",\n\t\t\t\t\t})\n\t\t\t\tfor (const record of same) {\n\t\t\t\t\tconst allEntries = yield* Ref.get(entries)\n\t\t\t\t\tconst entry = HashMap.get(allEntries, record.handle.token)\n\t\t\t\t\tif (Option.isSome(entry))\n\t\t\t\t\t\tyield* stop(entry.value, { _tag: \"Superseded\" }).pipe(\n\t\t\t\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t\t\t\t\tEffect.tap((result) =>\n\t\t\t\t\t\t\t\tresult.cause.reasons.length === 0\n\t\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t\t: Effect.logWarning(\n\t\t\t\t\t\t\t\t\t\t\t\"Superseded remote execution cleanup failed\",\n\t\t\t\t\t\t\t\t\t\t\tresult.cause,\n\t\t\t\t\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\t\t\t\t\tEffect.annotateLogs({\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.identity\": record.handle.key.identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.instance\": record.handle.key.instance,\n\t\t\t\t\t\t\t\t\t\t\t\t\"remote.generation\": record.handle.generation,\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tyield* healthy\n\t\t\t\tconst token = yield* random.uuidV4()\n\t\t\t\tconst record: typeof OpenRecord.Type = {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tphase: \"Open\",\n\t\t\t\t\thandle: {\n\t\t\t\t\t\tkey: request.key,\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\tgeneration: generation + 1,\n\t\t\t\t\t},\n\t\t\t\t\trequestId: request.requestId,\n\t\t\t\t\tleaseMillis,\n\t\t\t\t\tlimits: negotiated,\n\t\t\t\t}\n\t\t\t\treturn yield* Effect.uninterruptible(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* persist(record)\n\t\t\t\t\t\tconst deadline =\n\t\t\t\t\t\t\t(yield* Clock.monotonicTimeNanos) + nanos(leaseMillis)\n\t\t\t\t\t\tconst scope = yield* Scope.fork(owner)\n\t\t\t\t\t\tconst entry: Entry = {\n\t\t\t\t\t\t\tstate: yield* SynchronizedRef.make<Session>(\n\t\t\t\t\t\t\t\tSession.Open({ record, deadline }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tscope,\n\t\t\t\t\t\t\tunitScope: yield* Scope.fork(scope),\n\t\t\t\t\t\t\ttimer: yield* FiberHandle.make<void, never>().pipe(\n\t\t\t\t\t\t\t\tScope.provide(scope),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tloading: yield* FiberHandle.make<void, never>().pipe(\n\t\t\t\t\t\t\t\tScope.provide(scope),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// The store's retention policy is also the in-memory eviction policy.\n\t\t\t\t\t\tconst retained = yield* Ref.get(records)\n\t\t\t\t\t\tconst old = yield* Ref.modify(\n\t\t\t\t\t\t\tentries,\n\t\t\t\t\t\t\t(all) =>\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\tArray.filter(\n\t\t\t\t\t\t\t\t\t\tArray.fromIterable(HashMap.entries(all)),\n\t\t\t\t\t\t\t\t\t\t([key]) => !HashMap.has(retained, key),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tHashMap.set(\n\t\t\t\t\t\t\t\t\t\tHashMap.filter(all, (_, key) => HashMap.has(retained, key)),\n\t\t\t\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t] as const,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tfor (const [, retired] of old)\n\t\t\t\t\t\t\tyield* Release.close(retired.scope, Exit.void)\n\t\t\t\t\t\tyield* scheduleLease(entry, deadline)\n\t\t\t\t\t\treturn record\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}).pipe(lock.withPermit)\n\t\t}, Effect.scoped),\n\t\trenew: Effect.fnUntraced(function* (handle: Handle) {\n\t\t\tyield* healthy\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\t// Arming the new timer interrupts the old one, so the new deadline must be stored too.\n\t\t\t// Telling the child may block on its control pipe, so that step stays interruptible:\n\t\t\t// if it is cut short, nothing is stored and the old timer keeps its deadline.\n\t\t\treturn yield* Effect.uninterruptibleMask((restore) =>\n\t\t\t\tSynchronizedRef.modifyEffect(\n\t\t\t\t\tentry.state,\n\t\t\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\t\t\tconst running = executionOf(current)\n\t\t\t\t\t\tif (running._tag === \"Running\")\n\t\t\t\t\t\t\tyield* restore(running.unit.renew(current.record.leaseMillis))\n\t\t\t\t\t\tconst deadline = now + nanos(current.record.leaseMillis)\n\t\t\t\t\t\tyield* scheduleLease(entry, deadline)\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tcurrent.record.leaseMillis,\n\t\t\t\t\t\t\t{ ...current, deadline },\n\t\t\t\t\t\t] as const\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t}),\n\t\tload: Effect.fnUntraced(function* (handle: Handle, request: Load) {\n\t\t\tyield* healthy\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\tconst reply = yield* SynchronizedRef.modifyEffect(\n\t\t\t\tentry.state,\n\t\t\t\tEffect.fnUntraced(function* (state: Session) {\n\t\t\t\t\tconst now = yield* Clock.monotonicTimeNanos\n\t\t\t\t\tconst current = yield* Effect.fromResult(live(state, now))\n\t\t\t\t\tif (current._tag !== \"Open\") {\n\t\t\t\t\t\tconst before =\n\t\t\t\t\t\t\tcurrent._tag === \"Loading\" ? current.request : current.record.load\n\t\t\t\t\t\tif (before.specifier !== request.specifier)\n\t\t\t\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\t\t\t\tdetail: \"Load was already requested with a different specifier\",\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tcurrent._tag === \"Loading\"\n\t\t\t\t\t\t\t\t? Deferred.await(current.reply)\n\t\t\t\t\t\t\t\t: Effect.succeed(current.record.code),\n\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t] as const\n\t\t\t\t\t}\n\t\t\t\t\tconst done = yield* Deferred.make<CodeIdentity, SupervisorError>()\n\t\t\t\t\tconst next = beginLoad(current, request, done)\n\t\t\t\t\tyield* persist(snapshot(next))\n\t\t\t\t\tif (next._tag === \"Loading\")\n\t\t\t\t\t\tyield* FiberHandle.run(entry.loading, runLoad(entry, next), {\n\t\t\t\t\t\t\tstartImmediately: false,\n\t\t\t\t\t\t})\n\t\t\t\t\treturn [Deferred.await(done), next] as const\n\t\t\t\t}),\n\t\t\t).pipe(Effect.uninterruptible)\n\t\t\treturn yield* reply\n\t\t}),\n\t\tdispose: Effect.fnUntraced(function* (handle: Handle) {\n\t\t\tconst record = yield* status(handle)\n\t\t\tif (record.phase === \"Stopped\") return record.termination\n\t\t\tconst entry = yield* entryFor(handle)\n\t\t\treturn yield* stop(entry, { _tag: \"Disposed\" }).pipe(\n\t\t\t\tEffect.flatMap(Deferred.await),\n\t\t\t)\n\t\t}),\n\t})\n})\nexport const make = Effect.fnUntraced(function* (options: Options = {}) {\n\tconst runtime = yield* initialize(options)\n\tconst actions = operations(runtime)\n\tyield* recover(runtime, actions)\n\tyield* ownShutdown(runtime, actions)\n\treturn yield* protocol(runtime, actions)\n})\nexport const layer = (options: Options = {}) =>\n\tLayer.effect(Supervisor, make(options))\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Watchdog.js","names":["FailureGroup.make"],"sources":["../../../src/internal/runner/Watchdog.ts"],"sourcesContent":["import { Cause, Deferred, Effect, Schema } from \"effect\"\nimport * as FailureGroup from \"../FailureGroup\"\nimport { Worker } from \"node:worker_threads\"\nimport { ExecutionError } from \"./model\"\nimport { Notice } from \"./WatchdogProtocol\"\n\nexport const start = Effect.gen(function* () {\n\tconst ready = yield* Deferred.make<void>()\n\tconst begin = yield* Deferred.make<void>()\n\tconst stop = yield* Deferred.make<void>()\n\tconst worker = yield* Effect.acquireRelease(\n\t\tEffect.try({\n\t\t\ttry: () =>\n\t\t\t\tnew Worker(\n\t\t\t\t\tnew URL(\n\t\t\t\t\t\timport.meta.resolve(\"@graftland/plugin-remote/internal/watchdog\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\tcatch: (cause) =>\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Starting the child watchdog failed\",\n\t\t\t\t\tcause: Cause.die(cause),\n\t\t\t\t}),\n\t\t}),\n\t\t(worker) => Effect.promise(() => worker.terminate()).pipe(Effect.asVoid),\n\t)\n\tconst listeners = yield* FailureGroup.make<ExecutionError>()\n\tconst run = yield* listeners.runtime<never>()\n\tconst message = (value: unknown) =>\n\t\trun(\n\t\t\tSchema.decodeUnknownEffect(Notice)(value).pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\tdetail: \"Invalid watchdog notice\",\n\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\tEffect.flatMap((notice) =>\n\t\t\t\t\tDeferred.succeed(\n\t\t\t\t\t\tnotice === \"ready\" ? ready : notice === \"start\" ? begin : stop,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tEffect.asVoid,\n\t\t\t),\n\t\t)\n\tconst error = (error: Error) =>\n\t\trun(\n\t\t\tEffect.fail(\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Child watchdog failed\",\n\t\t\t\t\tcause: Cause.die(error),\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\tconst exit = (code: number) =>\n\t\trun(\n\t\t\tEffect.fail(\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Child watchdog exited: \" + code,\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\tyield* Effect.acquireRelease(\n\t\tEffect.sync(() => {\n\t\t\tworker.on(\"message\", message)\n\t\t\tworker.on(\"error\", error)\n\t\t\tworker.on(\"exit\", exit)\n\t\t}),\n\t\t() =>\n\t\t\tEffect.sync(() => {\n\t\t\t\tworker.off(\"message\", message)\n\t\t\t\tworker.off(\"error\", error)\n\t\t\t\tworker.off(\"exit\", exit)\n\t\t\t}),\n\t)\n\tconst failure = listeners.await\n\tyield* Effect.raceFirst(Deferred.await(ready), failure)\n\treturn {\n\t\tbegin: Effect.raceFirst(Deferred.await(begin), failure),\n\t\tstop: Effect.raceFirst(Deferred.await(stop), failure),\n\t}\n})\n"],"mappings":";;;;;;AAMA,MAAa,QAAQ,OAAO,IAAI,aAAa;CAC5C,MAAM,QAAQ,OAAO,SAAS,KAAW;CACzC,MAAM,QAAQ,OAAO,SAAS,KAAW;CACzC,MAAM,OAAO,OAAO,SAAS,KAAW;CACxC,MAAM,SAAS,OAAO,OAAO,eAC5B,OAAO,IAAI;EACV,WACC,IAAI,OACH,IAAI,IACH,YAAY,QAAQ,4CAA4C,CACjE,CACD;EACD,QAAQ,UACP,eAAe,KAAK;GACnB,QAAQ;GACR,OAAO,MAAM,IAAI,KAAK;EACvB,CAAC;CACH,CAAC,IACA,WAAW,OAAO,cAAc,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,CACxE;CACA,MAAM,YAAY,OAAOA,KAAkC;CAC3D,MAAM,MAAM,OAAO,UAAU,QAAe;CAC5C,MAAM,WAAW,UAChB,IACC,OAAO,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KACzC,OAAO,UAAU,UAChB,eAAe,KAAK;EACnB,QAAQ;EACR,OAAO,MAAM,KAAK,KAAK;CACxB,CAAC,CACF,GACA,OAAO,SAAS,WACf,SAAS,QACR,WAAW,UAAU,QAAQ,WAAW,UAAU,QAAQ,MAC1D,KAAA,CACD,CACD,GACA,OAAO,MACR,CACD;CACD,MAAM,SAAS,UACd,IACC,OAAO,KACN,eAAe,KAAK;EACnB,QAAQ;EACR,OAAO,MAAM,IAAI,KAAK;CACvB,CAAC,CACF,CACD;CACD,MAAM,QAAQ,SACb,IACC,OAAO,KACN,eAAe,KAAK,EACnB,QAAQ,4BAA4B,KACrC,CAAC,CACF,CACD;CACD,OAAO,OAAO,eACb,OAAO,WAAW;EACjB,OAAO,GAAG,WAAW,OAAO;EAC5B,OAAO,GAAG,SAAS,KAAK;EACxB,OAAO,GAAG,QAAQ,IAAI;CACvB,CAAC,SAEA,OAAO,WAAW;EACjB,OAAO,IAAI,WAAW,OAAO;EAC7B,OAAO,IAAI,SAAS,KAAK;EACzB,OAAO,IAAI,QAAQ,IAAI;CACxB,CAAC,CACH;CACA,MAAM,UAAU,UAAU;CAC1B,OAAO,OAAO,UAAU,SAAS,MAAM,KAAK,GAAG,OAAO;CACtD,OAAO;EACN,OAAO,OAAO,UAAU,SAAS,MAAM,KAAK,GAAG,OAAO;EACtD,MAAM,OAAO,UAAU,SAAS,MAAM,IAAI,GAAG,OAAO;CACrD;AACD,CAAC"}
1
+ {"version":3,"file":"Watchdog.js","names":["FailureGroup.make"],"sources":["../../../src/internal/runner/Watchdog.ts"],"sourcesContent":["import { Worker } from \"node:worker_threads\"\n\nimport { Cause, Deferred, Effect, Schema } from \"effect\"\n\nimport * as FailureGroup from \"../FailureGroup\"\nimport { ExecutionError } from \"./model\"\nimport { Notice } from \"./WatchdogProtocol\"\n\nexport const start = Effect.gen(function* () {\n\tconst ready = yield* Deferred.make<void>()\n\tconst begin = yield* Deferred.make<void>()\n\tconst stop = yield* Deferred.make<void>()\n\tconst worker = yield* Effect.acquireRelease(\n\t\tEffect.try({\n\t\t\ttry: () =>\n\t\t\t\tnew Worker(\n\t\t\t\t\tnew URL(\n\t\t\t\t\t\timport.meta.resolve(\"@graftland/plugin-remote/internal/watchdog\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\tcatch: (cause) =>\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Starting the child watchdog failed\",\n\t\t\t\t\tcause: Cause.die(cause),\n\t\t\t\t}),\n\t\t}),\n\t\t(worker) => Effect.promise(() => worker.terminate()).pipe(Effect.asVoid),\n\t)\n\tconst listeners = yield* FailureGroup.make<ExecutionError>()\n\tconst run = yield* listeners.runtime<never>()\n\tconst message = (value: unknown) =>\n\t\trun(\n\t\t\tSchema.decodeUnknownEffect(Notice)(value).pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\tdetail: \"Invalid watchdog notice\",\n\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\tEffect.flatMap((notice) =>\n\t\t\t\t\tDeferred.succeed(\n\t\t\t\t\t\tnotice === \"ready\" ? ready : notice === \"start\" ? begin : stop,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tEffect.asVoid,\n\t\t\t),\n\t\t)\n\tconst error = (error: Error) =>\n\t\trun(\n\t\t\tEffect.fail(\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Child watchdog failed\",\n\t\t\t\t\tcause: Cause.die(error),\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\tconst exit = (code: number) =>\n\t\trun(\n\t\t\tEffect.fail(\n\t\t\t\tExecutionError.make({\n\t\t\t\t\tdetail: \"Child watchdog exited: \" + code,\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\tyield* Effect.acquireRelease(\n\t\tEffect.sync(() => {\n\t\t\tworker.on(\"message\", message)\n\t\t\tworker.on(\"error\", error)\n\t\t\tworker.on(\"exit\", exit)\n\t\t}),\n\t\t() =>\n\t\t\tEffect.sync(() => {\n\t\t\t\tworker.off(\"message\", message)\n\t\t\t\tworker.off(\"error\", error)\n\t\t\t\tworker.off(\"exit\", exit)\n\t\t\t}),\n\t)\n\tconst failure = listeners.await\n\tyield* Effect.raceFirst(Deferred.await(ready), failure)\n\treturn {\n\t\tbegin: Effect.raceFirst(Deferred.await(begin), failure),\n\t\tstop: Effect.raceFirst(Deferred.await(stop), failure),\n\t}\n})\n"],"mappings":";;;;;;AAQA,MAAa,QAAQ,OAAO,IAAI,aAAa;CAC5C,MAAM,QAAQ,OAAO,SAAS,KAAW;CACzC,MAAM,QAAQ,OAAO,SAAS,KAAW;CACzC,MAAM,OAAO,OAAO,SAAS,KAAW;CACxC,MAAM,SAAS,OAAO,OAAO,eAC5B,OAAO,IAAI;EACV,WACC,IAAI,OACH,IAAI,IACH,YAAY,QAAQ,4CAA4C,CACjE,CACD;EACD,QAAQ,UACP,eAAe,KAAK;GACnB,QAAQ;GACR,OAAO,MAAM,IAAI,KAAK;EACvB,CAAC;CACH,CAAC,IACA,WAAW,OAAO,cAAc,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,CACxE;CACA,MAAM,YAAY,OAAOA,KAAkC;CAC3D,MAAM,MAAM,OAAO,UAAU,QAAe;CAC5C,MAAM,WAAW,UAChB,IACC,OAAO,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KACzC,OAAO,UAAU,UAChB,eAAe,KAAK;EACnB,QAAQ;EACR,OAAO,MAAM,KAAK,KAAK;CACxB,CAAC,CACF,GACA,OAAO,SAAS,WACf,SAAS,QACR,WAAW,UAAU,QAAQ,WAAW,UAAU,QAAQ,MAC1D,KAAA,CACD,CACD,GACA,OAAO,MACR,CACD;CACD,MAAM,SAAS,UACd,IACC,OAAO,KACN,eAAe,KAAK;EACnB,QAAQ;EACR,OAAO,MAAM,IAAI,KAAK;CACvB,CAAC,CACF,CACD;CACD,MAAM,QAAQ,SACb,IACC,OAAO,KACN,eAAe,KAAK,EACnB,QAAQ,4BAA4B,KACrC,CAAC,CACF,CACD;CACD,OAAO,OAAO,eACb,OAAO,WAAW;EACjB,OAAO,GAAG,WAAW,OAAO;EAC5B,OAAO,GAAG,SAAS,KAAK;EACxB,OAAO,GAAG,QAAQ,IAAI;CACvB,CAAC,SAEA,OAAO,WAAW;EACjB,OAAO,IAAI,WAAW,OAAO;EAC7B,OAAO,IAAI,SAAS,KAAK;EACzB,OAAO,IAAI,QAAQ,IAAI;CACxB,CAAC,CACH;CACA,MAAM,UAAU,UAAU;CAC1B,OAAO,OAAO,UAAU,SAAS,MAAM,KAAK,GAAG,OAAO;CACtD,OAAO;EACN,OAAO,OAAO,UAAU,SAAS,MAAM,KAAK,GAAG,OAAO;EACtD,MAAM,OAAO,UAAU,SAAS,MAAM,IAAI,GAAG,OAAO;CACrD;AACD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import "../port.js";
2
- import "./Multiplex.js";
3
2
  import "./model.js";
3
+ import "./Multiplex.js";
4
4
  import { Schema } from "effect";
5
5
  import { Rpc, RpcGroup } from "effect/rpc";
@@ -1 +1 @@
1
- {"version":3,"file":"Wire.js","names":["Port.Priority"],"sources":["../../../src/internal/runner/Wire.ts"],"sourcesContent":["import { Cause, Effect, Sink, Stream, Schema } from \"effect\"\nimport { Rpc, RpcGroup } from \"effect/rpc\"\nimport { TransportError } from \"../../Errors\"\nimport * as Port from \"../port\"\nimport type * as Multiplex from \"./Multiplex\"\nimport {\n\tCodeIdentity,\n\tHandle,\n\tLimits,\n\tPositiveInt,\n\tPositiveFinite,\n\tSessionRecord,\n\tSessionAccessDenied,\n\tStaleSession,\n\tLeaseExpired,\n\tSessionStopped,\n\tSessionConflict,\n\tStateStorageError,\n\tExecutionError,\n\tPackageError,\n\tTerminationUnconfirmed,\n\tRunnerClosing,\n\tStateDirectoryLocked,\n\tTermination,\n} from \"./model\"\n\n/** The RPC boundary is the only place that assembles the runner's error schema. */\nexport const SessionError = Schema.Union([\n\tSessionAccessDenied,\n\tStaleSession,\n\tLeaseExpired,\n\tSessionStopped,\n\tSessionConflict,\n\tStateStorageError,\n\tExecutionError,\n\tPackageError,\n\tTerminationUnconfirmed,\n\tRunnerClosing,\n\tStateDirectoryLocked,\n])\nexport type SessionError = typeof SessionError.Type\n\nexport const Session = RpcGroup.make(\n\tRpc.make(\"HighWater\", {\n\t\tpayload: { instance: Schema.NonEmptyString },\n\t\tsuccess: Schema.NullOr(PositiveInt),\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Open\", {\n\t\tpayload: {\n\t\t\tinstance: Schema.NonEmptyString,\n\t\t\trequestId: Schema.NonEmptyString,\n\t\t\texpectedGeneration: Schema.NullOr(PositiveInt),\n\t\t\tleaseMillis: Schema.optionalKey(PositiveFinite),\n\t\t\tlimits: Limits,\n\t\t},\n\t\tsuccess: SessionRecord,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Load\", {\n\t\tpayload: {\n\t\t\thandle: Handle,\n\t\t\tspecifier: Schema.NonEmptyString,\n\t\t\tdigest: Schema.optionalKey(Schema.Boolean),\n\t\t},\n\t\tsuccess: CodeIdentity,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Renew\", {\n\t\tpayload: Handle,\n\t\tsuccess: Schema.Finite,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Dispose\", {\n\t\tpayload: Handle,\n\t\tsuccess: Termination,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Status\", {\n\t\tpayload: Handle,\n\t\tsuccess: SessionRecord,\n\t\terror: SessionError,\n\t}),\n).annotateRpcs(Port.Priority, \"control\")\n\nexport type Peer = Multiplex.Peer\n/** Preserve the port writer order within each byte channel. */\nexport const channel = (peer: Peer, id: 0 | 1): Port.Channel => ({\n\tinput: Stream.fromEffectRepeat(peer.take(id)),\n\toutput: Sink.forEach((bytes: Uint8Array) =>\n\t\tpeer\n\t\t\t.send(id, bytes)\n\t\t\t.pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t),\n\t\t\t),\n\t),\n})\n"],"mappings":";;;;;;;;AA2BA,MAAa,eAAe,OAAO,MAAM;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAGD,MAAa,UAAU,SAAS,KAC/B,IAAI,KAAK,aAAa;CACrB,SAAS,EAAE,UAAU,OAAO,eAAe;CAC3C,SAAS,OAAO,OAAO,WAAW;CAClC,OAAO;AACR,CAAC,GACD,IAAI,KAAK,QAAQ;CAChB,SAAS;EACR,UAAU,OAAO;EACjB,WAAW,OAAO;EAClB,oBAAoB,OAAO,OAAO,WAAW;EAC7C,aAAa,OAAO,YAAY,cAAc;EAC9C,QAAQ;CACT;CACA,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,QAAQ;CAChB,SAAS;EACR,QAAQ;EACR,WAAW,OAAO;EAClB,QAAQ,OAAO,YAAY,OAAO,OAAO;CAC1C;CACA,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,SAAS;CACjB,SAAS;CACT,SAAS,OAAO;CAChB,OAAO;AACR,CAAC,GACD,IAAI,KAAK,WAAW;CACnB,SAAS;CACT,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,UAAU;CAClB,SAAS;CACT,SAAS;CACT,OAAO;AACR,CAAC,CACF,CAAC,CAAC,aAAaA,UAAe,SAAS;;AAIvC,MAAa,WAAW,MAAY,QAA6B;CAChE,OAAO,OAAO,iBAAiB,KAAK,KAAK,EAAE,CAAC;CAC5C,QAAQ,KAAK,SAAS,UACrB,KACE,KAAK,IAAI,KAAK,CAAC,CACf,KACA,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD,CACF;AACD"}
1
+ {"version":3,"file":"Wire.js","names":["Port.Priority"],"sources":["../../../src/internal/runner/Wire.ts"],"sourcesContent":["import { Cause, Effect, Schema, Sink, Stream } from \"effect\"\nimport { Rpc, RpcGroup } from \"effect/rpc\"\n\nimport { TransportError } from \"../../Errors\"\nimport * as Port from \"../port\"\nimport {\n\tCodeIdentity,\n\tExecutionError,\n\tHandle,\n\tLeaseExpired,\n\tLimits,\n\tPackageError,\n\tPositiveFinite,\n\tPositiveInt,\n\tRunnerClosing,\n\tSessionAccessDenied,\n\tSessionConflict,\n\tSessionRecord,\n\tSessionStopped,\n\tStaleSession,\n\tStateDirectoryLocked,\n\tStateStorageError,\n\tTermination,\n\tTerminationUnconfirmed,\n} from \"./model\"\nimport type * as Multiplex from \"./Multiplex\"\n\n/** The RPC boundary is the only place that assembles the runner's error schema. */\nexport const SessionError = Schema.Union([\n\tSessionAccessDenied,\n\tStaleSession,\n\tLeaseExpired,\n\tSessionStopped,\n\tSessionConflict,\n\tStateStorageError,\n\tExecutionError,\n\tPackageError,\n\tTerminationUnconfirmed,\n\tRunnerClosing,\n\tStateDirectoryLocked,\n])\nexport type SessionError = typeof SessionError.Type\n\nexport const Session = RpcGroup.make(\n\tRpc.make(\"HighWater\", {\n\t\tpayload: { instance: Schema.NonEmptyString },\n\t\tsuccess: Schema.NullOr(PositiveInt),\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Open\", {\n\t\tpayload: {\n\t\t\tinstance: Schema.NonEmptyString,\n\t\t\trequestId: Schema.NonEmptyString,\n\t\t\texpectedGeneration: Schema.NullOr(PositiveInt),\n\t\t\tleaseMillis: Schema.optionalKey(PositiveFinite),\n\t\t\tlimits: Limits,\n\t\t},\n\t\tsuccess: SessionRecord,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Load\", {\n\t\tpayload: {\n\t\t\thandle: Handle,\n\t\t\tspecifier: Schema.NonEmptyString,\n\t\t\tdigest: Schema.optionalKey(Schema.Boolean),\n\t\t},\n\t\tsuccess: CodeIdentity,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Renew\", {\n\t\tpayload: Handle,\n\t\tsuccess: Schema.Finite,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Dispose\", {\n\t\tpayload: Handle,\n\t\tsuccess: Termination,\n\t\terror: SessionError,\n\t}),\n\tRpc.make(\"Status\", {\n\t\tpayload: Handle,\n\t\tsuccess: SessionRecord,\n\t\terror: SessionError,\n\t}),\n).annotateRpcs(Port.Priority, \"control\")\n\nexport type Peer = Multiplex.Peer\n/** Preserve the port writer order within each byte channel. */\nexport const channel = (peer: Peer, id: 0 | 1): Port.Channel => ({\n\tinput: Stream.fromEffectRepeat(peer.take(id)),\n\toutput: Sink.forEach((bytes: Uint8Array) =>\n\t\tpeer\n\t\t\t.send(id, bytes)\n\t\t\t.pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tTransportError.make({ cause: Cause.fail(error) }),\n\t\t\t\t),\n\t\t\t),\n\t),\n})\n"],"mappings":";;;;;;;;AA4BA,MAAa,eAAe,OAAO,MAAM;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAGD,MAAa,UAAU,SAAS,KAC/B,IAAI,KAAK,aAAa;CACrB,SAAS,EAAE,UAAU,OAAO,eAAe;CAC3C,SAAS,OAAO,OAAO,WAAW;CAClC,OAAO;AACR,CAAC,GACD,IAAI,KAAK,QAAQ;CAChB,SAAS;EACR,UAAU,OAAO;EACjB,WAAW,OAAO;EAClB,oBAAoB,OAAO,OAAO,WAAW;EAC7C,aAAa,OAAO,YAAY,cAAc;EAC9C,QAAQ;CACT;CACA,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,QAAQ;CAChB,SAAS;EACR,QAAQ;EACR,WAAW,OAAO;EAClB,QAAQ,OAAO,YAAY,OAAO,OAAO;CAC1C;CACA,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,SAAS;CACjB,SAAS;CACT,SAAS,OAAO;CAChB,OAAO;AACR,CAAC,GACD,IAAI,KAAK,WAAW;CACnB,SAAS;CACT,SAAS;CACT,OAAO;AACR,CAAC,GACD,IAAI,KAAK,UAAU;CAClB,SAAS;CACT,SAAS;CACT,OAAO;AACR,CAAC,CACF,CAAC,CAAC,aAAaA,UAAe,SAAS;;AAIvC,MAAa,WAAW,MAAY,QAA6B;CAChE,OAAO,OAAO,iBAAiB,KAAK,KAAK,EAAE,CAAC;CAC5C,QAAQ,KAAK,SAAS,UACrB,KACE,KAAK,IAAI,KAAK,CAAC,CACf,KACA,OAAO,UAAU,UAChB,eAAe,KAAK,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC,CACjD,CACD,CACF;AACD"}
@@ -1,9 +1,9 @@
1
- import { Peer } from "../Peer.js";
2
1
  import { TransportError } from "../../Errors.js";
2
+ import { Peer } from "../Peer.js";
3
3
  import { make } from "../port.js";
4
+ import { SessionAccessDenied, SessionConflict } from "./model.js";
4
5
  import { make as make$1 } from "./Multiplex.js";
5
6
  import { Session, channel } from "./Wire.js";
6
- import { SessionAccessDenied, SessionConflict } from "./model.js";
7
7
  import { Cause, Effect, Option, Ref, Scope, Semaphore } from "effect";
8
8
  import { RpcServer } from "effect/rpc";
9
9
  // src/internal/runner/accept.ts
@@ -1 +1 @@
1
- {"version":3,"file":"accept.js","names":["Multiplex.make","channel","Port.make","Wire.channel","Wire.Session"],"sources":["../../../src/internal/runner/accept.ts"],"sourcesContent":["import { Cause, Effect, Ref, Option, Scope, Semaphore } from \"effect\"\nimport { RpcServer } from \"effect/rpc\"\nimport { Peer } from \"../Peer\"\nimport { TransportError } from \"../../Errors\"\nimport type { Channel } from \"../../Transport\"\nimport type { Supervisor } from \"./Supervisor\"\nimport type { Channels } from \"./Execution\"\nimport * as Port from \"../port\"\nimport * as Multiplex from \"./Multiplex\"\nimport * as Wire from \"./Wire\"\nimport { SessionAccessDenied, SessionConflict, type Handle } from \"./model\"\n\nexport const accept = Effect.fnUntraced(function* (\n\tsupervisor: typeof Supervisor.Service,\n\texecution: typeof Channels.Service,\n\tchannel: Channel,\n) {\n\tconst identity = yield* Peer\n\tconst scope = yield* Effect.scope\n\tconst mux = yield* Multiplex.make(channel)\n\tconst peer = yield* Port.make(Wire.channel(mux, 0), {\n\t\tsession: \"session-v1\",\n\t\tserve: { session: Wire.Session },\n\t\tcall: {},\n\t})\n\tconst attached = yield* Ref.make(Option.none<string>())\n\tconst loading = yield* Semaphore.make(1)\n\tconst authorize = (handle: Handle) =>\n\t\thandle.key.identity === identity\n\t\t\t? Effect.void\n\t\t\t: Effect.fail(\n\t\t\t\t\tSessionAccessDenied.make({\n\t\t\t\t\t\tdetail: \"The session belongs to another authenticated identity\",\n\t\t\t\t\t}),\n\t\t\t\t)\n\tconst handlers = yield* Wire.Session.toHandlers({\n\t\tHighWater: ({ instance }) => supervisor.highWater({ identity, instance }),\n\t\tOpen: ({ instance, requestId, expectedGeneration, leaseMillis, limits }) =>\n\t\t\tsupervisor.open({\n\t\t\t\tkey: { identity, instance },\n\t\t\t\trequestId,\n\t\t\t\texpectedGeneration,\n\t\t\t\t...(leaseMillis === undefined ? {} : { lease: leaseMillis }),\n\t\t\t\tlimits,\n\t\t\t}),\n\t\tLoad: Effect.fnUntraced(function* ({ handle, ...request }) {\n\t\t\tyield* authorize(handle)\n\t\t\tconst attachment = yield* Ref.get(attached)\n\t\t\tif (Option.isSome(attachment) && attachment.value !== handle.token)\n\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\tdetail: \"A connection can attach only one execution\",\n\t\t\t\t})\n\t\t\tconst code = yield* supervisor.load(handle, request)\n\t\t\tif (Option.isNone(attachment)) {\n\t\t\t\tconst child = yield* execution\n\t\t\t\t\t.peer(handle.token)\n\t\t\t\t\t.pipe(Scope.provide(scope))\n\t\t\t\tyield* Ref.set(attached, Option.some(handle.token))\n\t\t\t\t// A child EOF must not destroy the session channel before Dispose can acknowledge exit.\n\t\t\t\tyield* Effect.all(\n\t\t\t\t\t[\n\t\t\t\t\t\tEffect.forever(\n\t\t\t\t\t\t\tEffect.flatMap(mux.take(1), (bytes) => child.send(1, bytes)),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tEffect.forever(\n\t\t\t\t\t\t\tEffect.flatMap(child.take(1), (bytes) => mux.send(1, bytes)),\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t\t{ concurrency: \"unbounded\" },\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t: child.fail(TransportError.make({ cause })),\n\t\t\t\t\t),\n\t\t\t\t\tEffect.forkIn(scope),\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn code\n\t\t}, loading.withPermit),\n\t\tRenew: (handle) =>\n\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.renew(handle))),\n\t\tDispose: (handle) =>\n\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.dispose(handle))),\n\t\tStatus: (handle) =>\n\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.status(handle))),\n\t})\n\treturn yield* RpcServer.make(Wire.Session, {\n\t\tdisableFatalDefects: true,\n\t}).pipe(\n\t\tEffect.provideContext(handlers),\n\t\tEffect.provideService(RpcServer.Protocol, peer.serverProtocol(\"session\")),\n\t\tEffect.raceFirst(mux.await),\n\t)\n})\n"],"mappings":";;;;;;;;;AAYA,MAAa,SAAS,OAAO,WAAW,WACvC,YACA,WACA,WACC;CACD,MAAM,WAAW,OAAO;CACxB,MAAM,QAAQ,OAAO,OAAO;CAC5B,MAAM,MAAM,OAAOA,OAAeC,SAAO;CACzC,MAAM,OAAO,OAAOC,KAAUC,QAAa,KAAK,CAAC,GAAG;EACnD,SAAS;EACT,OAAO,EAAE,SAASC,QAAa;EAC/B,MAAM,CAAC;CACR,CAAC;CACD,MAAM,WAAW,OAAO,IAAI,KAAK,OAAO,KAAa,CAAC;CACtD,MAAM,UAAU,OAAO,UAAU,KAAK,CAAC;CACvC,MAAM,aAAa,WAClB,OAAO,IAAI,aAAa,WACrB,OAAO,OACP,OAAO,KACP,oBAAoB,KAAK,EACxB,QAAQ,wDACT,CAAC,CACF;CACH,MAAM,WAAW,OAAA,QAAoB,WAAW;EAC/C,YAAY,EAAE,eAAe,WAAW,UAAU;GAAE;GAAU;EAAS,CAAC;EACxE,OAAO,EAAE,UAAU,WAAW,oBAAoB,aAAa,aAC9D,WAAW,KAAK;GACf,KAAK;IAAE;IAAU;GAAS;GAC1B;GACA;GACA,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,YAAY;GAC1D;EACD,CAAC;EACF,MAAM,OAAO,WAAW,WAAW,EAAE,QAAQ,GAAG,WAAW;GAC1D,OAAO,UAAU,MAAM;GACvB,MAAM,aAAa,OAAO,IAAI,IAAI,QAAQ;GAC1C,IAAI,OAAO,OAAO,UAAU,KAAK,WAAW,UAAU,OAAO,OAC5D,OAAO,OAAO,gBAAgB,KAAK,EAClC,QAAQ,6CACT,CAAC;GACF,MAAM,OAAO,OAAO,WAAW,KAAK,QAAQ,OAAO;GACnD,IAAI,OAAO,OAAO,UAAU,GAAG;IAC9B,MAAM,QAAQ,OAAO,UACnB,KAAK,OAAO,KAAK,CAAC,CAClB,KAAK,MAAM,QAAQ,KAAK,CAAC;IAC3B,OAAO,IAAI,IAAI,UAAU,OAAO,KAAK,OAAO,KAAK,CAAC;IAElD,OAAO,OAAO,IACb,CACC,OAAO,QACN,OAAO,QAAQ,IAAI,KAAK,CAAC,IAAI,UAAU,MAAM,KAAK,GAAG,KAAK,CAAC,CAC5D,GACA,OAAO,QACN,OAAO,QAAQ,MAAM,KAAK,CAAC,IAAI,UAAU,IAAI,KAAK,GAAG,KAAK,CAAC,CAC5D,CACD,GACA,EAAE,aAAa,YAAY,CAC5B,CAAC,CAAC,KACD,OAAO,YAAY,UAClB,MAAM,kBAAkB,KAAK,IAC1B,OAAO,OACP,MAAM,KAAK,eAAe,KAAK,EAAE,MAAM,CAAC,CAAC,CAC7C,GACA,OAAO,OAAO,KAAK,CACpB;GACD;GACA,OAAO;EACR,GAAG,QAAQ,UAAU;EACrB,QAAQ,WACP,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,MAAM,MAAM,CAAC,CAAC;EAChE,UAAU,WACT,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,QAAQ,MAAM,CAAC,CAAC;EAClE,SAAS,WACR,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,OAAO,MAAM,CAAC,CAAC;CAClE,CAAC;CACD,OAAO,OAAO,UAAU,KAAKA,SAAc,EAC1C,qBAAqB,KACtB,CAAC,CAAC,CAAC,KACF,OAAO,eAAe,QAAQ,GAC9B,OAAO,eAAe,UAAU,UAAU,KAAK,eAAe,SAAS,CAAC,GACxE,OAAO,UAAU,IAAI,KAAK,CAC3B;AACD,CAAC"}
1
+ {"version":3,"file":"accept.js","names":["Multiplex.make","channel","Port.make","Wire.channel","Wire.Session"],"sources":["../../../src/internal/runner/accept.ts"],"sourcesContent":["import { Cause, Effect, Option, Ref, Scope, Semaphore } from \"effect\"\nimport { RpcServer } from \"effect/rpc\"\n\nimport { TransportError } from \"../../Errors\"\nimport type { Channel } from \"../../Transport\"\nimport { Peer } from \"../Peer\"\nimport * as Port from \"../port\"\nimport type { Channels } from \"./Execution\"\nimport { SessionAccessDenied, SessionConflict, type Handle } from \"./model\"\nimport * as Multiplex from \"./Multiplex\"\nimport type { Supervisor } from \"./Supervisor\"\nimport * as Wire from \"./Wire\"\n\nexport const accept = Effect.fnUntraced(function* (\n\tsupervisor: typeof Supervisor.Service,\n\texecution: typeof Channels.Service,\n\tchannel: Channel,\n) {\n\tconst identity = yield* Peer\n\tconst scope = yield* Effect.scope\n\tconst mux = yield* Multiplex.make(channel)\n\tconst peer = yield* Port.make(Wire.channel(mux, 0), {\n\t\tsession: \"session-v1\",\n\t\tserve: { session: Wire.Session },\n\t\tcall: {},\n\t})\n\tconst attached = yield* Ref.make(Option.none<string>())\n\tconst loading = yield* Semaphore.make(1)\n\tconst authorize = (handle: Handle) =>\n\t\thandle.key.identity === identity\n\t\t\t? Effect.void\n\t\t\t: Effect.fail(\n\t\t\t\t\tSessionAccessDenied.make({\n\t\t\t\t\t\tdetail: \"The session belongs to another authenticated identity\",\n\t\t\t\t\t}),\n\t\t\t\t)\n\tconst handlers = yield* Wire.Session.toHandlers({\n\t\tHighWater: ({ instance }) => supervisor.highWater({ identity, instance }),\n\t\tOpen: ({ instance, requestId, expectedGeneration, leaseMillis, limits }) =>\n\t\t\tsupervisor.open({\n\t\t\t\tkey: { identity, instance },\n\t\t\t\trequestId,\n\t\t\t\texpectedGeneration,\n\t\t\t\t...(leaseMillis === undefined ? {} : { lease: leaseMillis }),\n\t\t\t\tlimits,\n\t\t\t}),\n\t\tLoad: Effect.fnUntraced(function* ({ handle, ...request }) {\n\t\t\tyield* authorize(handle)\n\t\t\tconst attachment = yield* Ref.get(attached)\n\t\t\tif (Option.isSome(attachment) && attachment.value !== handle.token)\n\t\t\t\treturn yield* SessionConflict.make({\n\t\t\t\t\tdetail: \"A connection can attach only one execution\",\n\t\t\t\t})\n\t\t\tconst code = yield* supervisor.load(handle, request)\n\t\t\tif (Option.isNone(attachment)) {\n\t\t\t\tconst child = yield* execution\n\t\t\t\t\t.peer(handle.token)\n\t\t\t\t\t.pipe(Scope.provide(scope))\n\t\t\t\tyield* Ref.set(attached, Option.some(handle.token))\n\t\t\t\t// A child EOF must not destroy the session channel before Dispose can acknowledge exit.\n\t\t\t\tyield* Effect.all(\n\t\t\t\t\t[\n\t\t\t\t\t\tEffect.forever(\n\t\t\t\t\t\t\tEffect.flatMap(mux.take(1), (bytes) => child.send(1, bytes)),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tEffect.forever(\n\t\t\t\t\t\t\tEffect.flatMap(child.take(1), (bytes) => mux.send(1, bytes)),\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t\t{ concurrency: \"unbounded\" },\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t: child.fail(TransportError.make({ cause })),\n\t\t\t\t\t),\n\t\t\t\t\tEffect.forkIn(scope),\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn code\n\t\t}, loading.withPermit),\n\t\tRenew: (handle) =>\n\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.renew(handle))),\n\t\tDispose: (handle) =>\n\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.dispose(handle))),\n\t\tStatus: (handle) =>\n\t\t\tauthorize(handle).pipe(Effect.andThen(supervisor.status(handle))),\n\t})\n\treturn yield* RpcServer.make(Wire.Session, {\n\t\tdisableFatalDefects: true,\n\t}).pipe(\n\t\tEffect.provideContext(handlers),\n\t\tEffect.provideService(RpcServer.Protocol, peer.serverProtocol(\"session\")),\n\t\tEffect.raceFirst(mux.await),\n\t)\n})\n"],"mappings":";;;;;;;;;AAaA,MAAa,SAAS,OAAO,WAAW,WACvC,YACA,WACA,WACC;CACD,MAAM,WAAW,OAAO;CACxB,MAAM,QAAQ,OAAO,OAAO;CAC5B,MAAM,MAAM,OAAOA,OAAeC,SAAO;CACzC,MAAM,OAAO,OAAOC,KAAUC,QAAa,KAAK,CAAC,GAAG;EACnD,SAAS;EACT,OAAO,EAAE,SAASC,QAAa;EAC/B,MAAM,CAAC;CACR,CAAC;CACD,MAAM,WAAW,OAAO,IAAI,KAAK,OAAO,KAAa,CAAC;CACtD,MAAM,UAAU,OAAO,UAAU,KAAK,CAAC;CACvC,MAAM,aAAa,WAClB,OAAO,IAAI,aAAa,WACrB,OAAO,OACP,OAAO,KACP,oBAAoB,KAAK,EACxB,QAAQ,wDACT,CAAC,CACF;CACH,MAAM,WAAW,OAAA,QAAoB,WAAW;EAC/C,YAAY,EAAE,eAAe,WAAW,UAAU;GAAE;GAAU;EAAS,CAAC;EACxE,OAAO,EAAE,UAAU,WAAW,oBAAoB,aAAa,aAC9D,WAAW,KAAK;GACf,KAAK;IAAE;IAAU;GAAS;GAC1B;GACA;GACA,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,YAAY;GAC1D;EACD,CAAC;EACF,MAAM,OAAO,WAAW,WAAW,EAAE,QAAQ,GAAG,WAAW;GAC1D,OAAO,UAAU,MAAM;GACvB,MAAM,aAAa,OAAO,IAAI,IAAI,QAAQ;GAC1C,IAAI,OAAO,OAAO,UAAU,KAAK,WAAW,UAAU,OAAO,OAC5D,OAAO,OAAO,gBAAgB,KAAK,EAClC,QAAQ,6CACT,CAAC;GACF,MAAM,OAAO,OAAO,WAAW,KAAK,QAAQ,OAAO;GACnD,IAAI,OAAO,OAAO,UAAU,GAAG;IAC9B,MAAM,QAAQ,OAAO,UACnB,KAAK,OAAO,KAAK,CAAC,CAClB,KAAK,MAAM,QAAQ,KAAK,CAAC;IAC3B,OAAO,IAAI,IAAI,UAAU,OAAO,KAAK,OAAO,KAAK,CAAC;IAElD,OAAO,OAAO,IACb,CACC,OAAO,QACN,OAAO,QAAQ,IAAI,KAAK,CAAC,IAAI,UAAU,MAAM,KAAK,GAAG,KAAK,CAAC,CAC5D,GACA,OAAO,QACN,OAAO,QAAQ,MAAM,KAAK,CAAC,IAAI,UAAU,IAAI,KAAK,GAAG,KAAK,CAAC,CAC5D,CACD,GACA,EAAE,aAAa,YAAY,CAC5B,CAAC,CAAC,KACD,OAAO,YAAY,UAClB,MAAM,kBAAkB,KAAK,IAC1B,OAAO,OACP,MAAM,KAAK,eAAe,KAAK,EAAE,MAAM,CAAC,CAAC,CAC7C,GACA,OAAO,OAAO,KAAK,CACpB;GACD;GACA,OAAO;EACR,GAAG,QAAQ,UAAU;EACrB,QAAQ,WACP,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,MAAM,MAAM,CAAC,CAAC;EAChE,UAAU,WACT,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,QAAQ,MAAM,CAAC,CAAC;EAClE,SAAS,WACR,UAAU,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,OAAO,MAAM,CAAC,CAAC;CAClE,CAAC;CACD,OAAO,OAAO,UAAU,KAAKA,SAAc,EAC1C,qBAAqB,KACtB,CAAC,CAAC,CAAC,KACF,OAAO,eAAe,QAAQ,GAC9B,OAAO,eAAe,UAAU,UAAU,KAAK,eAAe,SAAS,CAAC,GACxE,OAAO,UAAU,IAAI,KAAK,CAC3B;AACD,CAAC"}
@@ -3,7 +3,7 @@ import process from "node:process";
3
3
  import { fileURLToPath } from "node:url";
4
4
  // src/internal/runner/command.ts
5
5
  /** Resolve the executable through the installed package export, never a relative dist path. */
6
- const command = (override) => Effect.sync(() => override ?? [process.execPath, fileURLToPath(import.meta.resolve("@graftland/plugin-remote/internal/bin"))]);
6
+ const command = (override) => Effect.sync(() => override ?? [process.execPath, fileURLToPath(import.meta.resolve("@graftland/plugin-remote/internal/child"))]);
7
7
  export { command };
8
8
 
9
9
  //# sourceMappingURL=command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","names":[],"sources":["../../../src/internal/runner/command.ts"],"sourcesContent":["import { Effect } from \"effect\"\nimport process from \"node:process\"\nimport { fileURLToPath } from \"node:url\"\n\n/** Resolve the executable through the installed package export, never a relative dist path. */\nexport const command = (override?: readonly [string, ...string[]]) =>\n\tEffect.sync(\n\t\t(): readonly [string, ...string[]] =>\n\t\t\toverride ?? [\n\t\t\t\tprocess.execPath,\n\t\t\t\tfileURLToPath(\n\t\t\t\t\timport.meta.resolve(\"@graftland/plugin-remote/internal/bin\"),\n\t\t\t\t),\n\t\t\t],\n\t)\n"],"mappings":";;;;;AAKA,MAAa,WAAW,aACvB,OAAO,WAEL,YAAY,CACX,QAAQ,UACR,cACC,YAAY,QAAQ,uCAAuC,CAC5D,CACD,CACF"}
1
+ {"version":3,"file":"command.js","names":[],"sources":["../../../src/internal/runner/command.ts"],"sourcesContent":["import process from \"node:process\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { Effect } from \"effect\"\n\n/** Resolve the executable through the installed package export, never a relative dist path. */\nexport const command = (override?: readonly [string, ...string[]]) =>\n\tEffect.sync(\n\t\t(): readonly [string, ...string[]] =>\n\t\t\toverride ?? [\n\t\t\t\tprocess.execPath,\n\t\t\t\tfileURLToPath(\n\t\t\t\t\timport.meta.resolve(\"@graftland/plugin-remote/internal/child\"),\n\t\t\t\t),\n\t\t\t],\n\t)\n"],"mappings":";;;;;AAMA,MAAa,WAAW,aACvB,OAAO,WAEL,YAAY,CACX,QAAQ,UACR,cACC,YAAY,QAAQ,yCAAyC,CAC9D,CACD,CACF"}
@@ -1,6 +1,6 @@
1
1
  import { TransportError } from "../../Errors.js";
2
- import { EndOfStream } from "./Framing.js";
3
2
  import { Peer } from "../Peer.js";
3
+ import { EndOfStream } from "./Framing.js";
4
4
  import { Array, Cause, Effect, Schema } from "effect";
5
5
  import { Socket } from "effect/socket";
6
6
  // src/internal/runner/connectionEnded.ts
@@ -1 +1 @@
1
- {"version":3,"file":"connectionEnded.js","names":[],"sources":["../../../src/internal/runner/connectionEnded.ts"],"sourcesContent":["import { Array, Cause, Effect, Schema } from \"effect\"\nimport { Socket } from \"effect/socket\"\nimport { TransportError } from \"../../Errors\"\nimport { EndOfStream } from \"./Framing\"\nimport { Peer } from \"../Peer\"\n\n// Multiplex preserves the socket reason inside TransportError; only an entirely normal close is silent.\nexport const closedNormally = (cause: Cause.Cause<unknown>): boolean =>\n\tcause.reasons.length > 0 &&\n\tArray.every(\n\t\tcause.reasons,\n\t\t(reason) =>\n\t\t\treason._tag === \"Fail\" &&\n\t\t\t(Schema.is(TransportError)(reason.error)\n\t\t\t\t? closedNormally(reason.error.cause)\n\t\t\t\t: Schema.is(EndOfStream)(reason.error) ||\n\t\t\t\t\t(Socket.isSocketError(reason.error) &&\n\t\t\t\t\t\treason.error.reason._tag === \"SocketCloseError\" &&\n\t\t\t\t\t\treason.error.reason.code === 1000)),\n\t)\nexport const connectionEnded = (cause: Cause.Cause<unknown>) =>\n\tCause.hasInterruptsOnly(cause) || closedNormally(cause)\n\t\t? Effect.void\n\t\t: Effect.flatMap(Peer, (identity) =>\n\t\t\t\tEffect.logWarning(\"Remote host connection failed\", cause).pipe(\n\t\t\t\t\tEffect.annotateLogs({ \"remote.peer\": identity }),\n\t\t\t\t),\n\t\t\t)\n"],"mappings":";;;;;;AAOA,MAAa,kBAAkB,UAC9B,MAAM,QAAQ,SAAS,KACvB,MAAM,MACL,MAAM,UACL,WACA,OAAO,SAAS,WACf,OAAO,GAAG,cAAc,CAAC,CAAC,OAAO,KAAK,IACpC,eAAe,OAAO,MAAM,KAAK,IACjC,OAAO,GAAG,WAAW,CAAC,CAAC,OAAO,KAAK,KACnC,OAAO,cAAc,OAAO,KAAK,KACjC,OAAO,MAAM,OAAO,SAAS,sBAC7B,OAAO,MAAM,OAAO,SAAS,IAClC;AACD,MAAa,mBAAmB,UAC/B,MAAM,kBAAkB,KAAK,KAAK,eAAe,KAAK,IACnD,OAAO,OACP,OAAO,QAAQ,OAAO,aACtB,OAAO,WAAW,iCAAiC,KAAK,CAAC,CAAC,KACzD,OAAO,aAAa,EAAE,eAAe,SAAS,CAAC,CAChD,CACD"}
1
+ {"version":3,"file":"connectionEnded.js","names":[],"sources":["../../../src/internal/runner/connectionEnded.ts"],"sourcesContent":["import { Array, Cause, Effect, Schema } from \"effect\"\nimport { Socket } from \"effect/socket\"\n\nimport { TransportError } from \"../../Errors\"\nimport { Peer } from \"../Peer\"\nimport { EndOfStream } from \"./Framing\"\n\n// Multiplex preserves the socket reason inside TransportError; only an entirely normal close is silent.\nexport const closedNormally = (cause: Cause.Cause<unknown>): boolean =>\n\tcause.reasons.length > 0 &&\n\tArray.every(\n\t\tcause.reasons,\n\t\t(reason) =>\n\t\t\treason._tag === \"Fail\" &&\n\t\t\t(Schema.is(TransportError)(reason.error)\n\t\t\t\t? closedNormally(reason.error.cause)\n\t\t\t\t: Schema.is(EndOfStream)(reason.error) ||\n\t\t\t\t\t(Socket.isSocketError(reason.error) &&\n\t\t\t\t\t\treason.error.reason._tag === \"SocketCloseError\" &&\n\t\t\t\t\t\treason.error.reason.code === 1000)),\n\t)\nexport const connectionEnded = (cause: Cause.Cause<unknown>) =>\n\tCause.hasInterruptsOnly(cause) || closedNormally(cause)\n\t\t? Effect.void\n\t\t: Effect.flatMap(Peer, (identity) =>\n\t\t\t\tEffect.logWarning(\"Remote host connection failed\", cause).pipe(\n\t\t\t\t\tEffect.annotateLogs({ \"remote.peer\": identity }),\n\t\t\t\t),\n\t\t\t)\n"],"mappings":";;;;;;AAQA,MAAa,kBAAkB,UAC9B,MAAM,QAAQ,SAAS,KACvB,MAAM,MACL,MAAM,UACL,WACA,OAAO,SAAS,WACf,OAAO,GAAG,cAAc,CAAC,CAAC,OAAO,KAAK,IACpC,eAAe,OAAO,MAAM,KAAK,IACjC,OAAO,GAAG,WAAW,CAAC,CAAC,OAAO,KAAK,KACnC,OAAO,cAAc,OAAO,KAAK,KACjC,OAAO,MAAM,OAAO,SAAS,sBAC7B,OAAO,MAAM,OAAO,SAAS,IAClC;AACD,MAAa,mBAAmB,UAC/B,MAAM,kBAAkB,KAAK,KAAK,eAAe,KAAK,IACnD,OAAO,OACP,OAAO,QAAQ,OAAO,aACtB,OAAO,WAAW,iCAAiC,KAAK,CAAC,CAAC,KACzD,OAAO,aAAa,EAAE,eAAe,SAAS,CAAC,CAChD,CACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","names":[],"sources":["../../../src/internal/runner/model.ts"],"mappings":";;;;;;;;;;;;WAgVmB;;qBAFN,qCAAqC"}
1
+ {"version":3,"file":"model.d.ts","names":[],"sources":["../../../src/internal/runner/model.ts"],"mappings":";;;;;;;;;;;;WAkVmB;;qBAFN,qCAAqC"}