@zlink-systems/framework 0.30.1 → 0.30.2

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 (340) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  3. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  4. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  5. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  6. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  7. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  8. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  9. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  10. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  11. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  12. package/dist/contracts/Locations/Rows.d.ts +2 -0
  13. package/dist/contracts/Spots/Contracts.d.ts +4 -0
  14. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  15. package/dist/runtime/abort.d.ts +5 -0
  16. package/dist/runtime/abort.js +10 -0
  17. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  18. package/dist/runtime/actors/actor-client.d.ts +0 -1
  19. package/dist/runtime/actors/actor-client.js +38 -45
  20. package/dist/runtime/actors/actor-context.d.ts +2 -0
  21. package/dist/runtime/actors/actor-context.js +46 -9
  22. package/dist/runtime/actors/actor-handoff.d.ts +7 -3
  23. package/dist/runtime/actors/actor-handoff.js +212 -88
  24. package/dist/runtime/actors/actor-join-relocation.d.ts +2 -0
  25. package/dist/runtime/actors/actor-local-native-join.js +4 -0
  26. package/dist/runtime/actors/actor-mailbox.js +27 -1
  27. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  28. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  29. package/dist/runtime/actors/actor-reply.js +29 -0
  30. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  31. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  32. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  33. package/dist/runtime/actors/index.d.ts +6 -2
  34. package/dist/runtime/actors/index.js +37 -21
  35. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  36. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  37. package/dist/runtime/admission.d.ts +9 -1
  38. package/dist/runtime/admission.js +55 -32
  39. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +13 -0
  40. package/dist/runtime/application-jobs/application-job-queue-scope.js +27 -1
  41. package/dist/runtime/application-jobs/contracts.d.ts +2 -0
  42. package/dist/runtime/backend/contracts/index.d.ts +19 -3
  43. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  44. package/dist/runtime/backend/mesh-completion-table.js +5 -0
  45. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +26 -2
  46. package/dist/runtime/backend/mesh-dispatch-pump.js +193 -107
  47. package/dist/runtime/backend/node/node-raw-binding-port.js +90 -58
  48. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +33 -8
  49. package/dist/runtime/backend/node/node-raw-mesh-backend.js +142 -143
  50. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  51. package/dist/runtime/backend/node/node-socket-backend-adapter.js +5 -5
  52. package/dist/runtime/channels/channel-clients.d.ts +1 -0
  53. package/dist/runtime/channels/channel-clients.js +20 -5
  54. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +22 -3
  55. package/dist/runtime/channels/channel-dispatch-pipeline.js +103 -57
  56. package/dist/runtime/channels/channel-dispatchers.d.ts +3 -2
  57. package/dist/runtime/channels/channel-dispatchers.js +44 -37
  58. package/dist/runtime/channels/channel-envelope.d.ts +1 -0
  59. package/dist/runtime/channels/channel-envelope.js +74 -31
  60. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  61. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  62. package/dist/runtime/channels/channel-runtime-manager.d.ts +3 -2
  63. package/dist/runtime/channels/channel-runtime-manager.js +4 -4
  64. package/dist/runtime/channels/channel-transports.d.ts +0 -1
  65. package/dist/runtime/channels/channel-transports.js +35 -33
  66. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  67. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  68. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  69. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  70. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  71. package/dist/runtime/diagnostics/flow-context.js +19 -7
  72. package/dist/runtime/diagnostics/index.js +4 -9
  73. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  74. package/dist/runtime/diagnostics/message-flow.js +35 -5
  75. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  76. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  77. package/dist/runtime/execution/index.d.ts +4 -2
  78. package/dist/runtime/execution/index.js +33 -10
  79. package/dist/runtime/execution/serial-execution-queue.d.ts +4 -0
  80. package/dist/runtime/execution/serial-execution-queue.js +21 -2
  81. package/dist/runtime/execution/state-lane.d.ts +2 -0
  82. package/dist/runtime/execution/state-lane.js +5 -0
  83. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  84. package/dist/runtime/foundation/operation-registry.js +86 -18
  85. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +39 -3
  86. package/dist/runtime/foundation/raw-service-mesh-runtime.js +151 -55
  87. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  88. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  89. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  90. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  91. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -3
  92. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -35
  93. package/dist/runtime/foundation/service-relocation-runtime.js +7 -3
  94. package/dist/runtime/foundation/service-runtime-contracts.d.ts +8 -1
  95. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  96. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  97. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  98. package/dist/runtime/foundation/service-stateful-runtime.d.ts +72 -6
  99. package/dist/runtime/foundation/service-stateful-runtime.js +444 -117
  100. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -1
  101. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  102. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  103. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  104. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  105. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  106. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +10 -0
  107. package/dist/runtime/foundation/service-wire-m6a-codec.js +166 -53
  108. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  109. package/dist/runtime/host/actor-packet-relay.js +59 -72
  110. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  111. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  112. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  113. package/dist/runtime/host/application-job-queue.d.ts +24 -3
  114. package/dist/runtime/host/application-job-queue.js +28 -41
  115. package/dist/runtime/host/index.d.ts +5 -1
  116. package/dist/runtime/host/index.js +171 -97
  117. package/dist/runtime/host/location-runtime-owner.js +2 -6
  118. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  119. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  120. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  121. package/dist/runtime/host/remote-bound-session-relay.js +71 -190
  122. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  123. package/dist/runtime/host/route-mesh-runtime.js +5 -3
  124. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  125. package/dist/runtime/host/runtime-shutdown.js +3 -2
  126. package/dist/runtime/host/service-relocation-host-runtime.d.ts +17 -7
  127. package/dist/runtime/host/service-relocation-host-runtime.js +550 -367
  128. package/dist/runtime/host/spot-runtime-options-factory.js +15 -7
  129. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  130. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  131. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  132. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  133. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  134. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  135. package/dist/runtime/locations/descriptor-publication.js +11 -0
  136. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  137. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  138. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  139. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  140. package/dist/runtime/locations/index.d.ts +1 -0
  141. package/dist/runtime/locations/index.js +1 -0
  142. package/dist/runtime/locations/lease-tracker.js +1 -6
  143. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  144. package/dist/runtime/locations/location-store-repository.js +363 -139
  145. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  146. package/dist/runtime/locations/relocation-blob.js +52 -1
  147. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  148. package/dist/runtime/locations/request-source-resolver.js +80 -0
  149. package/dist/runtime/locations/resolvers.js +1 -1
  150. package/dist/runtime/locations/runtime.d.ts +6 -2
  151. package/dist/runtime/locations/runtime.js +37 -30
  152. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  153. package/dist/runtime/messaging/payload-codec.js +7 -6
  154. package/dist/runtime/messaging/request-result.js +29 -26
  155. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +19 -1
  156. package/dist/runtime/protocol/service_wire_codec.generated.js +85 -0
  157. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +7 -1
  158. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +23 -7
  159. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +3 -2
  160. package/dist/runtime/spots/index.d.ts +18 -11
  161. package/dist/runtime/spots/index.js +234 -176
  162. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  163. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  164. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  165. package/dist/runtime/spots/spot-activation-state.js +7 -7
  166. package/dist/runtime/spots/spot-activation.d.ts +6 -3
  167. package/dist/runtime/spots/spot-activation.js +123 -44
  168. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  169. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  170. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  171. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  172. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  173. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  174. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  175. package/dist/runtime/spots/spot-entry-activation.js +14 -9
  176. package/dist/runtime/spots/spot-handler-registry.d.ts +4 -3
  177. package/dist/runtime/spots/spot-handler-registry.js +6 -2
  178. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  179. package/dist/runtime/spots/spot-manager-public.js +2 -2
  180. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  181. package/dist/runtime/spots/spot-node-autoconnect.js +18 -39
  182. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  183. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  184. package/dist/runtime/spots/spot-outbound.js +3 -3
  185. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  186. package/dist/runtime/spots/spot-runtime-ports.d.ts +0 -1
  187. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  188. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  189. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  190. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -1
  191. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  192. package/dist/runtime/spots/spot-timer.js +287 -103
  193. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  194. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  195. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  196. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  197. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  198. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  199. package/dist/runtime/streams/bound-session-service.js +6 -11
  200. package/dist/runtime/streams/index.d.ts +3 -2
  201. package/dist/runtime/streams/index.js +6 -4
  202. package/dist/runtime/streams/managed-stream.js +3 -2
  203. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  204. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  205. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  206. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  207. package/dist/runtime/streams/stream-session-runtime.js +1 -4
  208. package/dist/runtime/workers/index.js +1 -1
  209. package/package.json +3 -3
  210. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  211. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  212. package/src/contracts/Configuration/Builders.ts +4 -1
  213. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  214. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  215. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  216. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  217. package/src/contracts/Locations/Rows.ts +2 -0
  218. package/src/contracts/Spots/Contracts.ts +8 -0
  219. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  220. package/src/runtime/abort.ts +12 -0
  221. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  222. package/src/runtime/actors/actor-client.ts +61 -70
  223. package/src/runtime/actors/actor-context.ts +49 -9
  224. package/src/runtime/actors/actor-handoff.ts +282 -106
  225. package/src/runtime/actors/actor-join-relocation.ts +2 -0
  226. package/src/runtime/actors/actor-local-native-join.ts +4 -0
  227. package/src/runtime/actors/actor-mailbox.ts +40 -2
  228. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  229. package/src/runtime/actors/actor-reply.ts +42 -0
  230. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  231. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  232. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  233. package/src/runtime/actors/index.ts +41 -27
  234. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  235. package/src/runtime/admission.ts +69 -34
  236. package/src/runtime/application-jobs/application-job-queue-scope.ts +33 -1
  237. package/src/runtime/application-jobs/contracts.ts +2 -0
  238. package/src/runtime/backend/contracts/index.ts +39 -4
  239. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  240. package/src/runtime/backend/mesh-completion-table.ts +4 -0
  241. package/src/runtime/backend/mesh-dispatch-pump.ts +223 -124
  242. package/src/runtime/backend/node/node-raw-binding-port.ts +106 -70
  243. package/src/runtime/backend/node/node-raw-mesh-backend.ts +221 -170
  244. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -5
  245. package/src/runtime/channels/channel-clients.ts +49 -24
  246. package/src/runtime/channels/channel-dispatch-pipeline.ts +173 -124
  247. package/src/runtime/channels/channel-dispatchers.ts +116 -72
  248. package/src/runtime/channels/channel-envelope.ts +105 -36
  249. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  250. package/src/runtime/channels/channel-runtime-manager.ts +12 -5
  251. package/src/runtime/channels/channel-transports.ts +49 -58
  252. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  253. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  254. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  255. package/src/runtime/diagnostics/flow-context.ts +20 -7
  256. package/src/runtime/diagnostics/index.ts +1 -7
  257. package/src/runtime/diagnostics/message-flow.ts +47 -9
  258. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  259. package/src/runtime/execution/index.ts +40 -14
  260. package/src/runtime/execution/serial-execution-queue.ts +31 -4
  261. package/src/runtime/execution/state-lane.ts +7 -0
  262. package/src/runtime/foundation/operation-registry.ts +98 -20
  263. package/src/runtime/foundation/raw-service-mesh-runtime.ts +244 -67
  264. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  265. package/src/runtime/foundation/service-mailbox.ts +8 -0
  266. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  267. package/src/runtime/foundation/service-relocation-object-owner.ts +54 -37
  268. package/src/runtime/foundation/service-relocation-runtime.ts +7 -3
  269. package/src/runtime/foundation/service-runtime-contracts.ts +12 -1
  270. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  271. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  272. package/src/runtime/foundation/service-stateful-runtime.ts +667 -152
  273. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -11
  274. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  275. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  276. package/src/runtime/foundation/service-wire-m6a-codec.ts +187 -51
  277. package/src/runtime/host/actor-packet-relay.ts +113 -94
  278. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  279. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  280. package/src/runtime/host/application-job-queue.ts +29 -44
  281. package/src/runtime/host/index.ts +286 -129
  282. package/src/runtime/host/location-runtime-owner.ts +2 -6
  283. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  284. package/src/runtime/host/remote-bound-session-relay.ts +86 -248
  285. package/src/runtime/host/route-mesh-runtime.ts +11 -5
  286. package/src/runtime/host/runtime-shutdown.ts +15 -4
  287. package/src/runtime/host/service-relocation-host-runtime.ts +784 -475
  288. package/src/runtime/host/spot-runtime-options-factory.ts +18 -7
  289. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  290. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  291. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  292. package/src/runtime/locations/auto-connect-types.ts +0 -1
  293. package/src/runtime/locations/descriptor-publication.ts +7 -0
  294. package/src/runtime/locations/domain-store-contract.ts +5 -0
  295. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  296. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  297. package/src/runtime/locations/index.ts +1 -0
  298. package/src/runtime/locations/lease-tracker.ts +2 -9
  299. package/src/runtime/locations/location-store-repository.ts +628 -152
  300. package/src/runtime/locations/relocation-blob.ts +75 -1
  301. package/src/runtime/locations/request-source-resolver.ts +138 -0
  302. package/src/runtime/locations/resolvers.ts +2 -2
  303. package/src/runtime/locations/runtime.ts +70 -40
  304. package/src/runtime/messaging/payload-codec.ts +8 -11
  305. package/src/runtime/messaging/request-result.ts +33 -29
  306. package/src/runtime/protocol/service_wire_codec.generated.ts +87 -4
  307. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +13 -10
  308. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +3 -2
  309. package/src/runtime/spots/index.ts +375 -281
  310. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  311. package/src/runtime/spots/spot-activation-state.ts +12 -19
  312. package/src/runtime/spots/spot-activation.ts +170 -86
  313. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  314. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  315. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  316. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  317. package/src/runtime/spots/spot-entry-activation.ts +24 -19
  318. package/src/runtime/spots/spot-handler-registry.ts +15 -4
  319. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  320. package/src/runtime/spots/spot-manager-public.ts +2 -2
  321. package/src/runtime/spots/spot-node-autoconnect.ts +22 -45
  322. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  323. package/src/runtime/spots/spot-outbound.ts +3 -3
  324. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  325. package/src/runtime/spots/spot-runtime-ports.ts +0 -1
  326. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  327. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  328. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -1
  329. package/src/runtime/spots/spot-timer.ts +413 -157
  330. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  331. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  332. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  333. package/src/runtime/streams/bound-session-service.ts +7 -10
  334. package/src/runtime/streams/index.ts +12 -6
  335. package/src/runtime/streams/managed-stream.ts +4 -2
  336. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  337. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  338. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  339. package/src/runtime/streams/stream-session-runtime.ts +1 -5
  340. package/src/runtime/workers/index.ts +1 -1
@@ -1,6 +1,7 @@
1
1
  import { macrotaskBoundary } from '../abort';
2
2
  import {
3
3
  diagnosticWorkName,
4
+ startOutsideStateLane,
4
5
  guardStateLaneCompletion,
5
6
  isStructuralGuardEnabled,
6
7
  trackDiagnosticCompletion
@@ -10,6 +11,8 @@ export type ZLinkSerialWorkLane = 'application' | 'lifecycle';
10
11
 
11
12
  export interface ZLinkSerialWorkOptions {
12
13
  readonly onAdmitted?: () => void;
14
+ /** Transfers an unstarted durable record out of this FIFO in the owner turn. */
15
+ readonly onWithdrawable?: (withdraw: () => boolean) => void;
13
16
  readonly lane?: ZLinkSerialWorkLane;
14
17
  readonly payloadBytes?: number;
15
18
  readonly metadataBytes?: number;
@@ -167,12 +170,22 @@ export class ZLinkSerialExecutionQueue {
167
170
  return this.admit(operation, { lane: 'lifecycle' }, context, undefined, true);
168
171
  }
169
172
 
173
+ get retainsApplicationForLifecycle(): boolean {
174
+ return this.activeLifecycle?.context !== undefined;
175
+ }
176
+
170
177
  visitPendingApplication(visitor: (record: ZLinkSerialWorkRecord<unknown>) => void): void {
171
178
  for (const record of this.application.records) {
172
179
  if (record.mailbox === undefined) visitor(record);
173
180
  }
174
181
  }
175
182
 
183
+ get hasPendingDurableApplication(): boolean {
184
+ // Every application record accepted behind durable work inherits durable
185
+ // ownership, so the tail answers this without scanning the FIFO.
186
+ return this.application.records.at(-1)?.preparation !== undefined;
187
+ }
188
+
176
189
  get hasPendingWork(): boolean {
177
190
  return (
178
191
  this.consumer?.running === true ||
@@ -271,6 +284,18 @@ export class ZLinkSerialExecutionQueue {
271
284
  throw error;
272
285
  }
273
286
  options.onAdmitted?.();
287
+ options.onWithdrawable?.(() => {
288
+ const index = target.records.indexOf(record as SerialWorkRecord<unknown>);
289
+ if (index < 0) return false;
290
+ target.records.splice(index, 1);
291
+ record.preparationController?.abort(
292
+ new Error('Durable record transferred to another handoff.')
293
+ );
294
+ record.preparation?.cancel();
295
+ resolve(undefined as T);
296
+ release();
297
+ return true;
298
+ });
274
299
  this.scheduleDrain();
275
300
  return result;
276
301
  }
@@ -286,10 +311,12 @@ export class ZLinkSerialExecutionQueue {
286
311
  const consumer = this.consumer!;
287
312
  if (consumer.scheduled || consumer.running) return;
288
313
  consumer.scheduled = true;
289
- queueMicrotask(() => {
290
- consumer.scheduled = false;
291
- void this.drain();
292
- });
314
+ startOutsideStateLane(() =>
315
+ queueMicrotask(() => {
316
+ consumer.scheduled = false;
317
+ void this.drain();
318
+ })
319
+ );
293
320
  }
294
321
 
295
322
  /** Notifications carry no payload, admission sequence, result Promise, or host permit. */
@@ -12,6 +12,13 @@ export function isStructuralGuardEnabled(): boolean {
12
12
  return process.env.ZLINK_NODE_STRUCTURAL_GUARD === '1' || process.env.NODE_ENV === 'test';
13
13
  }
14
14
 
15
+ /** Detaches lane ownership while preserving the caller's other execution contexts. */
16
+ export function startOutsideStateLane<T>(work: () => T): T {
17
+ return currentLaneStorage.exit(() =>
18
+ diagnosticTurnStorage === undefined ? work() : diagnosticTurnStorage.exit(work)
19
+ );
20
+ }
21
+
15
22
  const currentLaneStorage = new AsyncLocalStorage<ZLinkStateLane>();
16
23
  const diagnosticPending = isStructuralGuardEnabled() ? new Map<number, string>() : undefined;
17
24
  let nextDiagnosticWork = 0;
@@ -24,11 +24,22 @@ export interface PendingOperation<T> {
24
24
  readonly promise: Promise<T>;
25
25
  }
26
26
 
27
+ /**
28
+ * Receives an operation's terminal at the place it is taken from the
29
+ * registry. One long-lived observer serves every observed operation, so an
30
+ * observed registration creates no Promise or per-operation callback.
31
+ */
32
+ export interface OperationObserver<T, Context> {
33
+ operationCompleted(id: bigint, value: T, context: Context | undefined): void;
34
+ operationFailed(id: bigint, reason: unknown, context: Context | undefined): void;
35
+ }
36
+
27
37
  interface Entry<T, Context> {
28
38
  readonly context: Context | undefined;
29
- readonly deadlineMs?: number;
30
- readonly resolve: (value: T | PromiseLike<T>) => void;
31
- readonly reject: (reason: unknown) => void;
39
+ deadlineMs?: number;
40
+ resolve?: (value: T | PromiseLike<T>) => void;
41
+ reject?: (reason: unknown) => void;
42
+ observer?: OperationObserver<T, Context>;
32
43
  }
33
44
 
34
45
  const systemClock: OperationClock = {
@@ -40,7 +51,14 @@ export class OperationRegistry<T, Context = unknown> {
40
51
  private readonly entries = new Map<bigint, Entry<T, Context>>();
41
52
  private nextId = 1n;
42
53
  private deadlineCursor?: MapIterator<[bigint, Entry<T, Context>]>;
54
+ /**
55
+ * A lower bound of the earliest pending deadline. Completed entries only
56
+ * leave it early; a full expiry pass replaces it with the exact value.
57
+ */
58
+ private earliestDeadlineMs = Number.POSITIVE_INFINITY;
59
+ private scanEarliestDeadlineMs = Number.POSITIVE_INFINITY;
43
60
  private closed = false;
61
+ private pendingCount = 0;
44
62
 
45
63
  constructor(
46
64
  private readonly clock: OperationClock = systemClock,
@@ -63,28 +81,56 @@ export class OperationRegistry<T, Context = unknown> {
63
81
  resolve = onResolve;
64
82
  reject = onReject;
65
83
  });
66
- const entry: Entry<T, Context> = {
67
- context,
68
- deadlineMs: timeoutOwner === 'registry' ? this.clock.now() + timeoutMs : undefined,
69
- resolve,
70
- reject
71
- };
84
+ const deadlineMs = timeoutOwner === 'registry' ? this.clock.now() + timeoutMs : undefined;
85
+ const entry: Entry<T, Context> = { context, deadlineMs, resolve, reject };
72
86
  this.entries.set(id, entry);
73
- if (this.entries.size === 1) this.onPendingChanged?.();
87
+ this.notePending(deadlineMs);
74
88
  return { id, promise };
75
89
  }
76
90
 
77
- complete(id: bigint, value: T): boolean {
91
+ /** Registers an operation whose terminal goes to `observer` instead of a Promise. */
92
+ registerObserved(
93
+ timeoutMs: number,
94
+ observer: OperationObserver<T, Context>,
95
+ context?: Context
96
+ ): bigint {
97
+ if (this.closed) throw new Error('Operation registry is closed.');
98
+ if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {
99
+ throw new RangeError('timeoutMs must be a non-negative finite number.');
100
+ }
101
+ const id = this.nextId++;
102
+ const deadlineMs = this.clock.now() + timeoutMs;
103
+ this.entries.set(id, { context, deadlineMs, observer });
104
+ this.notePending(deadlineMs);
105
+ return id;
106
+ }
107
+
108
+ /** The time the next expiry pass has work, as a lower bound (spec 08 §4.2). */
109
+ nextDeadlineMs(): number {
110
+ return this.earliestDeadlineMs;
111
+ }
112
+
113
+ private notePending(deadlineMs: number | undefined): void {
114
+ this.pendingCount++;
115
+ const earlier = deadlineMs !== undefined && deadlineMs < this.earliestDeadlineMs;
116
+ if (earlier) this.earliestDeadlineMs = deadlineMs;
117
+ if (earlier || this.pendingCount === 1) this.onPendingChanged?.();
118
+ }
119
+
120
+ complete(id: bigint, value: T, terminalContextRetentionMs = 0): boolean {
78
121
  const entry = this.take(id);
79
122
  if (entry === undefined) return false;
80
- entry.resolve(value);
123
+ if (entry.observer !== undefined) entry.observer.operationCompleted(id, value, entry.context);
124
+ else entry.resolve!(value);
125
+ this.retainTerminal(id, entry, terminalContextRetentionMs);
81
126
  return true;
82
127
  }
83
128
 
84
129
  fail(id: bigint, reason: unknown): boolean {
85
130
  const entry = this.take(id);
86
131
  if (entry === undefined) return false;
87
- entry.reject(reason);
132
+ if (entry.observer !== undefined) entry.observer.operationFailed(id, reason, entry.context);
133
+ else entry.reject!(reason);
88
134
  return true;
89
135
  }
90
136
 
@@ -93,7 +139,7 @@ export class OperationRegistry<T, Context = unknown> {
93
139
  }
94
140
 
95
141
  isPending(id: bigint): boolean {
96
- return this.entries.has(id);
142
+ return this.pendingEntry(id) !== undefined;
97
143
  }
98
144
 
99
145
  context(id: bigint): Context | undefined {
@@ -104,35 +150,67 @@ export class OperationRegistry<T, Context = unknown> {
104
150
  if (this.closed) return;
105
151
  this.closed = true;
106
152
  for (const id of this.entries.keys()) this.cancel(id, reason);
153
+ this.entries.clear();
107
154
  this.deadlineCursor = undefined;
108
155
  }
109
156
 
157
+ failAll(reason: unknown): void {
158
+ for (const id of this.entries.keys()) this.fail(id, reason);
159
+ }
160
+
110
161
  get size(): number {
111
- return this.entries.size;
162
+ return this.pendingCount;
112
163
  }
113
164
 
114
165
  expire(nowMs: number, turnDeadlineMs: number): number {
115
166
  let expired = 0;
116
167
  while (this.clock.now() < turnDeadlineMs) {
117
- this.deadlineCursor ??= this.entries.entries();
168
+ if (this.deadlineCursor === undefined) {
169
+ this.deadlineCursor = this.entries.entries();
170
+ this.scanEarliestDeadlineMs = Number.POSITIVE_INFINITY;
171
+ }
118
172
  const current = this.deadlineCursor.next();
119
173
  if (current.done === true) {
120
174
  this.deadlineCursor = undefined;
175
+ // Entries registered during the pass are appended and were scanned.
176
+ this.earliestDeadlineMs = this.scanEarliestDeadlineMs;
121
177
  break;
122
178
  }
123
179
  const [id, entry] = current.value;
124
- if (entry.deadlineMs !== undefined && entry.deadlineMs <= nowMs) {
125
- if (this.fail(id, new OperationTimeoutError(id))) expired++;
180
+ if (entry.deadlineMs === undefined) continue;
181
+ if (entry.deadlineMs <= nowMs) {
182
+ if (!this.isPending(id)) this.entries.delete(id);
183
+ else if (this.fail(id, new OperationTimeoutError(id))) expired++;
184
+ } else if (entry.deadlineMs < this.scanEarliestDeadlineMs) {
185
+ this.scanEarliestDeadlineMs = entry.deadlineMs;
126
186
  }
127
187
  }
128
188
  return expired;
129
189
  }
130
190
 
131
191
  private take(id: bigint): Entry<T, Context> | undefined {
132
- const entry = this.entries.get(id);
192
+ const entry = this.pendingEntry(id);
133
193
  if (entry === undefined) return undefined;
134
194
  this.entries.delete(id);
135
- if (this.entries.size === 0) this.onPendingChanged?.();
195
+ this.pendingCount--;
196
+ if (this.pendingCount === 0) this.onPendingChanged?.();
136
197
  return entry;
137
198
  }
199
+
200
+ private pendingEntry(id: bigint): Entry<T, Context> | undefined {
201
+ const entry = this.entries.get(id);
202
+ return entry !== undefined && (entry.resolve !== undefined || entry.observer !== undefined)
203
+ ? entry
204
+ : undefined;
205
+ }
206
+
207
+ private retainTerminal(id: bigint, entry: Entry<T, Context>, retentionMs: number): void {
208
+ if (this.closed || entry.context === undefined || retentionMs === 0) return;
209
+ entry.resolve = undefined;
210
+ entry.reject = undefined;
211
+ entry.observer = undefined;
212
+ entry.deadlineMs = this.clock.now() + retentionMs;
213
+ this.entries.set(id, entry);
214
+ this.earliestDeadlineMs = Math.min(this.earliestDeadlineMs, entry.deadlineMs);
215
+ }
138
216
  }