@zlink-systems/framework 0.26.0 → 0.27.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 (521) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  3. package/dist/contracts/Common/CoreTypes.js +7 -0
  4. package/dist/contracts/Common/index.d.ts +1 -1
  5. package/dist/contracts/Common/index.js +0 -1
  6. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  7. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  8. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  9. package/dist/contracts/Configuration/Registration.js +58 -36
  10. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  12. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  16. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  17. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  18. package/dist/contracts/Handlers/JsonContract.js +10 -4
  19. package/dist/contracts/Locations/Authority.d.ts +1 -1
  20. package/dist/contracts/Locations/Authority.js +3 -2
  21. package/dist/contracts/Locations/Options.js +1 -1
  22. package/dist/contracts/Locations/Stores.d.ts +12 -0
  23. package/dist/contracts/Locations/Stores.js +9 -0
  24. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  25. package/dist/internal.d.ts +4 -0
  26. package/dist/internal.js +15 -1
  27. package/dist/nest-integration.d.ts +4 -2
  28. package/dist/nest-integration.js +14 -4
  29. package/dist/runtime/abort.d.ts +1 -0
  30. package/dist/runtime/abort.js +8 -5
  31. package/dist/runtime/activation-admission.d.ts +1 -2
  32. package/dist/runtime/activation-admission.js +2 -6
  33. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  34. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  35. package/dist/runtime/actors/actor-client.d.ts +2 -2
  36. package/dist/runtime/actors/actor-client.js +42 -143
  37. package/dist/runtime/actors/actor-context.d.ts +3 -5
  38. package/dist/runtime/actors/actor-context.js +13 -11
  39. package/dist/runtime/actors/actor-handoff.d.ts +4 -4
  40. package/dist/runtime/actors/actor-handoff.js +8 -8
  41. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  42. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  43. package/dist/runtime/actors/actor-local-native-join.js +83 -105
  44. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  45. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  46. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  47. package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
  48. package/dist/runtime/actors/actor-remote-joiner.js +5 -9
  49. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  50. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  51. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  52. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  53. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  54. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  55. package/dist/runtime/actors/bound-session-wire.js +2 -7
  56. package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
  57. package/dist/runtime/actors/deferred-join-completion.js +1 -0
  58. package/dist/runtime/actors/index.d.ts +9 -7
  59. package/dist/runtime/actors/index.js +87 -69
  60. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  61. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  62. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  63. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  64. package/dist/runtime/admission.d.ts +2 -0
  65. package/dist/runtime/admission.js +7 -1
  66. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  67. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  68. package/dist/runtime/backend/contracts/index.d.ts +6 -23
  69. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
  70. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  71. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  72. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
  73. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
  74. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  75. package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
  76. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  77. package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
  78. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
  79. package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
  80. package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
  81. package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
  82. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  83. package/dist/runtime/backend/runtime-values.js +2 -0
  84. package/dist/runtime/channels/channel-clients.d.ts +20 -8
  85. package/dist/runtime/channels/channel-clients.js +68 -52
  86. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  87. package/dist/runtime/channels/channel-envelope.js +47 -29
  88. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  89. package/dist/runtime/channels/channel-outbound-operations.js +9 -10
  90. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  91. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  94. package/dist/runtime/channels/channel-runtime-manager.js +5 -2
  95. package/dist/runtime/channels/channel-socket-options.js +3 -2
  96. package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
  97. package/dist/runtime/channels/channel-socket-registry.js +248 -174
  98. package/dist/runtime/channels/channel-transports.d.ts +11 -17
  99. package/dist/runtime/channels/channel-transports.js +68 -47
  100. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  101. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  102. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  103. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  104. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  105. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  106. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  107. package/dist/runtime/channels/fanout-location-runtime.js +130 -72
  108. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  109. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  110. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  111. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  112. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  113. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  114. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  115. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  116. package/dist/runtime/diagnostics/flow-context.js +16 -2
  117. package/dist/runtime/diagnostics/index.d.ts +4 -2
  118. package/dist/runtime/diagnostics/index.js +14 -4
  119. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  120. package/dist/runtime/diagnostics/message-flow.js +10 -19
  121. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  122. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  123. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  124. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  125. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  126. package/dist/runtime/disposal.d.ts +5 -0
  127. package/dist/runtime/disposal.js +22 -0
  128. package/dist/runtime/execution/index.d.ts +12 -9
  129. package/dist/runtime/execution/index.js +58 -14
  130. package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
  131. package/dist/runtime/execution/serial-execution-queue.js +54 -15
  132. package/dist/runtime/execution/state-lane.d.ts +8 -1
  133. package/dist/runtime/execution/state-lane.js +118 -3
  134. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  135. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  136. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  137. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  138. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  139. package/dist/runtime/foundation/operation-identity.js +9 -5
  140. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  141. package/dist/runtime/foundation/operation-registry.js +34 -44
  142. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
  143. package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
  144. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  145. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  146. package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
  147. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  148. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  149. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  150. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  151. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  152. package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
  153. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  154. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  155. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  156. package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
  157. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  158. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  159. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  160. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
  161. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  162. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  163. package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
  164. package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
  165. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
  166. package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
  167. package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
  168. package/dist/runtime/foundation/service-topology-registry.js +17 -32
  169. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  170. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  171. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  172. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  173. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  174. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  175. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  176. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  177. package/dist/runtime/framework-errors-internal.js +343 -122
  178. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  179. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  180. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  181. package/dist/runtime/host/actor-packet-relay.js +48 -91
  182. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  183. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  184. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  185. package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
  186. package/dist/runtime/host/actor-transfer-runtime.js +143 -176
  187. package/dist/runtime/host/application-job-queue.js +16 -33
  188. package/dist/runtime/host/bound-session-relay.js +1 -1
  189. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  190. package/dist/runtime/host/index.d.ts +14 -13
  191. package/dist/runtime/host/index.js +190 -157
  192. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  193. package/dist/runtime/host/instance-activation-authority.js +17 -45
  194. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  195. package/dist/runtime/host/location-runtime-owner.js +2 -2
  196. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  197. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  198. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  199. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  200. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  201. package/dist/runtime/host/remote-bound-session-relay.js +7 -20
  202. package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
  203. package/dist/runtime/host/route-mesh-runtime.js +171 -252
  204. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  205. package/dist/runtime/host/runtime-shutdown.js +18 -21
  206. package/dist/runtime/host/service-relocation-control.js +6 -1
  207. package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
  208. package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
  209. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  210. package/dist/runtime/host/spot-address-transport.js +34 -136
  211. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  212. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  213. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
  214. package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
  215. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
  216. package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
  217. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  218. package/dist/runtime/locations/authority-key-codec.js +4 -3
  219. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  220. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  221. package/dist/runtime/locations/creation-operation-id.js +6 -4
  222. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  223. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  224. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  225. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  226. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  227. package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
  228. package/dist/runtime/locations/key-codec.js +3 -2
  229. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  230. package/dist/runtime/locations/lease-tracker.js +7 -11
  231. package/dist/runtime/locations/lifecycle.d.ts +4 -9
  232. package/dist/runtime/locations/lifecycle.js +2 -31
  233. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  234. package/dist/runtime/locations/location-store-failure.js +7 -0
  235. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  236. package/dist/runtime/locations/location-store-pages.js +13 -0
  237. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  238. package/dist/runtime/locations/location-store-repository.js +303 -332
  239. package/dist/runtime/locations/relocation-blob.js +18 -5
  240. package/dist/runtime/locations/resolvers.d.ts +5 -5
  241. package/dist/runtime/locations/resolvers.js +37 -28
  242. package/dist/runtime/locations/runtime.d.ts +5 -4
  243. package/dist/runtime/locations/runtime.js +123 -92
  244. package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
  245. package/dist/runtime/locations/spot-location-claims.js +42 -1
  246. package/dist/runtime/messaging/payload-codec.js +26 -20
  247. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  248. package/dist/runtime/messaging/submission-result.js +48 -0
  249. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
  250. package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
  251. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
  252. package/dist/runtime/spots/index.d.ts +14 -20
  253. package/dist/runtime/spots/index.js +302 -176
  254. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
  255. package/dist/runtime/spots/spot-activation-registry.js +14 -50
  256. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  257. package/dist/runtime/spots/spot-activation-state.js +2 -2
  258. package/dist/runtime/spots/spot-activation.d.ts +3 -4
  259. package/dist/runtime/spots/spot-activation.js +49 -32
  260. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  261. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  262. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  263. package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
  264. package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
  265. package/dist/runtime/spots/spot-actor-membership.js +22 -45
  266. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  267. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  268. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  269. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  270. package/dist/runtime/spots/spot-context.d.ts +2 -2
  271. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
  272. package/dist/runtime/spots/spot-entry-activation.js +9 -20
  273. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  274. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  275. package/dist/runtime/spots/spot-manager-public.js +5 -4
  276. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  277. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
  278. package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
  279. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  280. package/dist/runtime/spots/spot-outbound.js +9 -8
  281. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  282. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  283. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  284. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  285. package/dist/runtime/spots/spot-route-replies.js +3 -1
  286. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
  287. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
  288. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
  289. package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
  290. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  291. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  292. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
  293. package/dist/runtime/spots/spot-serial-executor.js +2 -2
  294. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
  295. package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
  296. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  297. package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
  298. package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
  299. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
  300. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  301. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  302. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  303. package/dist/runtime/streams/bound-session-service.js +11 -1
  304. package/dist/runtime/streams/index.d.ts +14 -15
  305. package/dist/runtime/streams/index.js +20 -21
  306. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  307. package/dist/runtime/streams/managed-stream.js +17 -8
  308. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  309. package/dist/runtime/streams/protocol.d.ts +6 -33
  310. package/dist/runtime/streams/protocol.js +38 -110
  311. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  312. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  313. package/dist/runtime/streams/session-calls.d.ts +1 -1
  314. package/dist/runtime/streams/session-calls.js +5 -4
  315. package/dist/runtime/streams/session-context.d.ts +6 -6
  316. package/dist/runtime/streams/session-context.js +22 -4
  317. package/dist/runtime/streams/session-requests.js +2 -1
  318. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  319. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  320. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  321. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  322. package/dist/runtime/workers/index.d.ts +2 -2
  323. package/dist/runtime/workers/index.js +5 -4
  324. package/package.json +3 -3
  325. package/src/contracts/Common/CoreTypes.ts +7 -0
  326. package/src/contracts/Common/index.ts +1 -1
  327. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  328. package/src/contracts/Configuration/Registration.ts +92 -48
  329. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  330. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  331. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  332. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  333. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  334. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  335. package/src/contracts/Handlers/JsonContract.ts +14 -4
  336. package/src/contracts/Locations/Authority.ts +7 -3
  337. package/src/contracts/Locations/Options.ts +1 -1
  338. package/src/contracts/Locations/Stores.ts +14 -0
  339. package/src/contracts/Spots/Contracts.ts +1 -1
  340. package/src/internal.ts +14 -0
  341. package/src/nest-integration.ts +28 -10
  342. package/src/runtime/abort.ts +6 -5
  343. package/src/runtime/activation-admission.ts +2 -8
  344. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  345. package/src/runtime/actors/actor-client.ts +77 -204
  346. package/src/runtime/actors/actor-context.ts +39 -33
  347. package/src/runtime/actors/actor-handoff.ts +24 -22
  348. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  349. package/src/runtime/actors/actor-local-native-join.ts +172 -174
  350. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  351. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  352. package/src/runtime/actors/actor-remote-joiner.ts +9 -11
  353. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  354. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  355. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  356. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  357. package/src/runtime/actors/bound-session-wire.ts +2 -8
  358. package/src/runtime/actors/deferred-join-completion.ts +10 -6
  359. package/src/runtime/actors/index.ts +100 -79
  360. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  361. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  362. package/src/runtime/admission.ts +8 -1
  363. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  364. package/src/runtime/backend/contracts/index.ts +13 -29
  365. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
  366. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  367. package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
  368. package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
  369. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  370. package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
  371. package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
  372. package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
  373. package/src/runtime/backend/raw-binding-port.ts +1 -1
  374. package/src/runtime/backend/runtime-values.ts +4 -1
  375. package/src/runtime/channels/channel-clients.ts +132 -85
  376. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  377. package/src/runtime/channels/channel-envelope.ts +58 -29
  378. package/src/runtime/channels/channel-outbound-operations.ts +10 -23
  379. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  380. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  381. package/src/runtime/channels/channel-runtime-manager.ts +6 -2
  382. package/src/runtime/channels/channel-socket-options.ts +8 -2
  383. package/src/runtime/channels/channel-socket-registry.ts +301 -192
  384. package/src/runtime/channels/channel-transports.ts +161 -112
  385. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  386. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  387. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  388. package/src/runtime/channels/fanout-location-runtime.ts +172 -91
  389. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  390. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  391. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  392. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  393. package/src/runtime/diagnostics/flow-context.ts +16 -2
  394. package/src/runtime/diagnostics/index.ts +27 -17
  395. package/src/runtime/diagnostics/message-flow.ts +15 -25
  396. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  397. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  398. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  399. package/src/runtime/disposal.ts +19 -0
  400. package/src/runtime/execution/index.ts +60 -20
  401. package/src/runtime/execution/serial-execution-queue.ts +131 -18
  402. package/src/runtime/execution/state-lane.ts +142 -4
  403. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  404. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  405. package/src/runtime/foundation/operation-identity.ts +11 -5
  406. package/src/runtime/foundation/operation-registry.ts +33 -50
  407. package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
  408. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  409. package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
  410. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  411. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  412. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  413. package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
  414. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  415. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  416. package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
  417. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  418. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  419. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
  420. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  421. package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
  422. package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
  423. package/src/runtime/foundation/service-topology-registry.ts +23 -32
  424. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  425. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  426. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  427. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  428. package/src/runtime/framework-errors-internal.ts +380 -134
  429. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  430. package/src/runtime/host/actor-packet-relay.ts +57 -147
  431. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  432. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  433. package/src/runtime/host/actor-transfer-runtime.ts +180 -260
  434. package/src/runtime/host/application-job-queue.ts +28 -34
  435. package/src/runtime/host/bound-session-relay.ts +1 -2
  436. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  437. package/src/runtime/host/index.ts +327 -296
  438. package/src/runtime/host/instance-activation-authority.ts +89 -109
  439. package/src/runtime/host/location-runtime-owner.ts +4 -2
  440. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  441. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  442. package/src/runtime/host/remote-bound-session-relay.ts +8 -41
  443. package/src/runtime/host/route-mesh-runtime.ts +228 -271
  444. package/src/runtime/host/runtime-shutdown.ts +17 -21
  445. package/src/runtime/host/service-relocation-control.ts +14 -1
  446. package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
  447. package/src/runtime/host/spot-address-transport.ts +73 -195
  448. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  449. package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
  450. package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
  451. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  452. package/src/runtime/locations/authority-key-codec.ts +7 -3
  453. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  454. package/src/runtime/locations/creation-operation-id.ts +6 -3
  455. package/src/runtime/locations/domain-store-contract.ts +12 -3
  456. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  457. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  458. package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
  459. package/src/runtime/locations/key-codec.ts +3 -2
  460. package/src/runtime/locations/lease-tracker.ts +8 -14
  461. package/src/runtime/locations/lifecycle.ts +13 -43
  462. package/src/runtime/locations/location-store-failure.ts +4 -0
  463. package/src/runtime/locations/location-store-pages.ts +18 -0
  464. package/src/runtime/locations/location-store-repository.ts +450 -478
  465. package/src/runtime/locations/relocation-blob.ts +17 -6
  466. package/src/runtime/locations/resolvers.ts +75 -49
  467. package/src/runtime/locations/runtime.ts +220 -110
  468. package/src/runtime/locations/spot-location-claims.ts +58 -1
  469. package/src/runtime/messaging/payload-codec.ts +35 -24
  470. package/src/runtime/messaging/submission-result.ts +57 -1
  471. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  472. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  473. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
  474. package/src/runtime/spots/index.ts +433 -229
  475. package/src/runtime/spots/spot-activation-registry.ts +30 -69
  476. package/src/runtime/spots/spot-activation-state.ts +2 -2
  477. package/src/runtime/spots/spot-activation.ts +67 -37
  478. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  479. package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
  480. package/src/runtime/spots/spot-actor-membership.ts +40 -72
  481. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  482. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  483. package/src/runtime/spots/spot-context.ts +3 -3
  484. package/src/runtime/spots/spot-entry-activation.ts +13 -30
  485. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  486. package/src/runtime/spots/spot-manager-public.ts +21 -17
  487. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  488. package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
  489. package/src/runtime/spots/spot-outbound.ts +45 -23
  490. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  491. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  492. package/src/runtime/spots/spot-route-replies.ts +6 -4
  493. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
  494. package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
  495. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  496. package/src/runtime/spots/spot-runtime-ports.ts +5 -27
  497. package/src/runtime/spots/spot-serial-executor.ts +2 -2
  498. package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
  499. package/src/runtime/spots/spot-timer.ts +3 -2
  500. package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
  501. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
  502. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  503. package/src/runtime/streams/bound-session-service.ts +21 -1
  504. package/src/runtime/streams/index.ts +76 -64
  505. package/src/runtime/streams/managed-stream.ts +29 -10
  506. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  507. package/src/runtime/streams/protocol.ts +34 -88
  508. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  509. package/src/runtime/streams/session-calls.ts +6 -5
  510. package/src/runtime/streams/session-context.ts +54 -10
  511. package/src/runtime/streams/session-requests.ts +2 -1
  512. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  513. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  514. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  515. package/src/runtime/workers/index.ts +13 -12
  516. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  517. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  518. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  519. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  520. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  521. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,3 +1,11 @@
1
+ import { macrotaskBoundary } from '../abort';
2
+ import {
3
+ diagnosticWorkName,
4
+ guardStateLaneCompletion,
5
+ isStructuralGuardEnabled,
6
+ trackDiagnosticCompletion
7
+ } from './state-lane';
8
+
1
9
  export type ZLinkSerialWorkLane = 'application' | 'lifecycle';
2
10
 
3
11
  export interface ZLinkSerialWorkOptions {
@@ -21,7 +29,7 @@ export const ZLINK_DEFAULT_SERIAL_SCHEDULER_OPTIONS: Required<ZLinkSerialSchedul
21
29
  export interface ZLinkSerialWorkRecord<T> {
22
30
  readonly acceptedSequence: bigint;
23
31
  readonly lane: ZLinkSerialWorkLane;
24
- readonly operation: () => Promise<T> | T;
32
+ operation: () => Promise<T> | T;
25
33
  readonly context?: unknown;
26
34
  resolve(value: T): void;
27
35
  reject(reason: unknown): void;
@@ -30,6 +38,11 @@ export interface ZLinkSerialWorkRecord<T> {
30
38
  fail(reason: unknown): void;
31
39
  }
32
40
 
41
+ /** The active lifecycle owner decides which existing application records can run. */
42
+ export interface ZLinkSerialLifecycleContext {
43
+ canExecuteApplication(record: ZLinkSerialWorkRecord<unknown>): boolean;
44
+ }
45
+
33
46
  /** Readiness work that must complete without claiming the serial owner. */
34
47
  export interface ZLinkSerialWorkPreparation {
35
48
  prepare(signal: AbortSignal): Promise<void>;
@@ -141,8 +154,15 @@ export class ZLinkSerialExecutionQueue {
141
154
  }
142
155
 
143
156
  /** Holds lifecycle FIFO through an operation result while its application turns can run. */
144
- submitLifecycleOperation<T>(operation: () => Promise<T> | T): Promise<T> {
145
- return this.admit(operation, { lane: 'lifecycle' }, undefined, undefined, true);
157
+ submitLifecycleOperation<T>(
158
+ operation: () => Promise<T> | T,
159
+ context?: ZLinkSerialLifecycleContext
160
+ ): Promise<T> {
161
+ return this.admit(operation, { lane: 'lifecycle' }, context, undefined, true);
162
+ }
163
+
164
+ visitPendingApplication(visitor: (record: ZLinkSerialWorkRecord<unknown>) => void): void {
165
+ for (const record of this.application.records) visitor(record);
146
166
  }
147
167
 
148
168
  get hasPendingWork(): boolean {
@@ -170,6 +190,10 @@ export class ZLinkSerialExecutionQueue {
170
190
  this.closed = true;
171
191
  }
172
192
 
193
+ get admissionClosed(): boolean {
194
+ return this.closed;
195
+ }
196
+
173
197
  private admit<T>(
174
198
  operation: () => Promise<T> | T,
175
199
  options: ZLinkSerialWorkOptions,
@@ -318,11 +342,7 @@ export class ZLinkSerialExecutionQueue {
318
342
  } finally {
319
343
  this.draining = false;
320
344
  this.claimStartedAt = undefined;
321
- if (
322
- !waitingForPreparation &&
323
- (this.application.records.length > 0 ||
324
- (this.activeLifecycle === undefined && this.lifecycle.records.length > 0))
325
- ) {
345
+ if (!waitingForPreparation && this.selectNext() !== undefined) {
326
346
  this.scheduleDrain();
327
347
  } else {
328
348
  if (!this.hasPendingWork) {
@@ -338,26 +358,34 @@ export class ZLinkSerialExecutionQueue {
338
358
  readonly record: SerialWorkRecord<unknown>;
339
359
  }
340
360
  | undefined {
341
- const applicationReady = this.application.records.length > 0;
361
+ const lifecycleOwner = this.activeLifecycle?.context as ZLinkSerialLifecycleContext | undefined;
362
+ const applicationRecord =
363
+ lifecycleOwner === undefined
364
+ ? this.application.records[0]
365
+ : this.application.records.find((record) => lifecycleOwner.canExecuteApplication(record));
366
+ const applicationReady = applicationRecord !== undefined;
342
367
  const lifecycleReady = this.activeLifecycle === undefined && this.lifecycle.records.length > 0;
343
368
  if (!applicationReady && !lifecycleReady) return undefined;
344
369
  if (!applicationReady) {
345
370
  return { lane: 'lifecycle', record: this.lifecycle.records[0]! };
346
371
  }
347
372
  if (!lifecycleReady) {
348
- return { lane: 'application', record: this.application.records[0]! };
373
+ return { lane: 'application', record: applicationRecord! };
349
374
  }
350
375
  if (!this.lifecycleDebt && this.lifecycleStreak < this.lifecycleBurstLimit) {
351
376
  return { lane: 'lifecycle', record: this.lifecycle.records[0]! };
352
377
  }
353
- return { lane: 'application', record: this.application.records[0]! };
378
+ return { lane: 'application', record: applicationRecord! };
354
379
  }
355
380
 
356
381
  private takeSelected(selection: {
357
382
  readonly lane: ZLinkSerialWorkLane;
358
383
  readonly record: SerialWorkRecord<unknown>;
359
384
  }): ZLinkSerialWorkRecord<unknown> {
360
- const record = selection.lane === 'lifecycle' ? this.takeLifecycle() : this.takeApplication();
385
+ const record =
386
+ selection.lane === 'lifecycle'
387
+ ? this.takeLifecycle()
388
+ : this.takeApplication(selection.record);
361
389
  if (record !== selection.record) {
362
390
  throw new Error('The selected serial work record changed before owner claim.');
363
391
  }
@@ -374,10 +402,12 @@ export class ZLinkSerialExecutionQueue {
374
402
  return record;
375
403
  }
376
404
 
377
- private takeApplication(): ZLinkSerialWorkRecord<unknown> {
405
+ private takeApplication(selected: SerialWorkRecord<unknown>): ZLinkSerialWorkRecord<unknown> {
378
406
  this.lifecycleStreak = 0;
379
407
  this.lifecycleDebt = false;
380
- return this.application.records.shift()!;
408
+ if (this.application.records[0] === selected) return this.application.records.shift()!;
409
+ const index = this.application.records.indexOf(selected);
410
+ return this.application.records.splice(index, 1)[0]!;
381
411
  }
382
412
 
383
413
  private startPreparation(record: SerialWorkRecord<unknown>): void {
@@ -442,6 +472,93 @@ export class ZLinkSerialExecutionQueue {
442
472
  }
443
473
  }
444
474
 
475
+ if (isStructuralGuardEnabled()) {
476
+ const submit = ZLinkSerialExecutionQueue.prototype.submit;
477
+ ZLinkSerialExecutionQueue.prototype.submit = function <T>(
478
+ this: ZLinkSerialExecutionQueue,
479
+ operation: () => Promise<T> | T,
480
+ options: ZLinkSerialWorkOptions = {},
481
+ context?: unknown
482
+ ): Promise<T> {
483
+ return guardStateLaneCompletion(
484
+ trackDiagnosticCompletion(
485
+ submit.call(this, operation, options, context) as Promise<T>,
486
+ `serial ${options.lane ?? 'application'} ${diagnosticWorkName(operation)}`
487
+ ),
488
+ 'serial completion'
489
+ );
490
+ };
491
+
492
+ const submitPreAdmitted = ZLinkSerialExecutionQueue.prototype.submitPreAdmitted;
493
+ ZLinkSerialExecutionQueue.prototype.submitPreAdmitted = function <T>(
494
+ this: ZLinkSerialExecutionQueue,
495
+ operation: () => Promise<T> | T,
496
+ options: ZLinkSerialWorkOptions = {},
497
+ context?: unknown
498
+ ): Promise<T> {
499
+ return guardStateLaneCompletion(
500
+ trackDiagnosticCompletion(
501
+ submitPreAdmitted.call(this, operation, options, context) as Promise<T>,
502
+ `serial ${options.lane ?? 'application'} ${diagnosticWorkName(operation)}`
503
+ ),
504
+ 'serial completion'
505
+ );
506
+ };
507
+
508
+ const submitContinuation = ZLinkSerialExecutionQueue.prototype.submitContinuation;
509
+ ZLinkSerialExecutionQueue.prototype.submitContinuation = function <T>(
510
+ this: ZLinkSerialExecutionQueue,
511
+ operation: () => Promise<T> | T,
512
+ context?: unknown
513
+ ): Promise<T> {
514
+ return guardStateLaneCompletion(
515
+ trackDiagnosticCompletion(
516
+ submitContinuation.call(this, operation, context) as Promise<T>,
517
+ `serial continuation ${diagnosticWorkName(operation)}`
518
+ ),
519
+ 'serial completion'
520
+ );
521
+ };
522
+
523
+ const admitDurablePrefix = ZLinkSerialExecutionQueue.prototype.admitDurablePrefix;
524
+ ZLinkSerialExecutionQueue.prototype.admitDurablePrefix = function <T>(
525
+ this: ZLinkSerialExecutionQueue,
526
+ operation: () => Promise<T> | T,
527
+ options: ZLinkSerialWorkOptions = {},
528
+ context?: unknown,
529
+ preparation?: ZLinkSerialWorkPreparation
530
+ ): Promise<T> {
531
+ return guardStateLaneCompletion(
532
+ trackDiagnosticCompletion(
533
+ admitDurablePrefix.call(this, operation, options, context, preparation) as Promise<T>,
534
+ `serial durable ${diagnosticWorkName(operation)}`
535
+ ),
536
+ 'serial completion'
537
+ );
538
+ };
539
+
540
+ const submitLifecycleOperation = ZLinkSerialExecutionQueue.prototype.submitLifecycleOperation;
541
+ ZLinkSerialExecutionQueue.prototype.submitLifecycleOperation = function <T>(
542
+ this: ZLinkSerialExecutionQueue,
543
+ operation: () => Promise<T> | T
544
+ ): Promise<T> {
545
+ return guardStateLaneCompletion(
546
+ trackDiagnosticCompletion(
547
+ submitLifecycleOperation.call(this, operation) as Promise<T>,
548
+ `serial lifecycle ${diagnosticWorkName(operation)}`
549
+ ),
550
+ 'serial completion'
551
+ );
552
+ };
553
+
554
+ const whenIdle = ZLinkSerialExecutionQueue.prototype.whenIdle;
555
+ ZLinkSerialExecutionQueue.prototype.whenIdle = function (
556
+ this: ZLinkSerialExecutionQueue
557
+ ): Promise<void> {
558
+ return guardStateLaneCompletion(whenIdle.call(this), 'serial completion');
559
+ };
560
+ }
561
+
445
562
  function createLane(): ZLinkSerialAdmissionLane {
446
563
  return {
447
564
  records: []
@@ -459,7 +576,3 @@ function validateNonNegative(value: number, field: string): void {
459
576
  throw new RangeError(`${field} must be a non-negative safe integer.`);
460
577
  }
461
578
  }
462
-
463
- function macrotaskBoundary(): Promise<void> {
464
- return new Promise((resolve) => setImmediate(resolve));
465
- }
@@ -1,7 +1,23 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
+ const UNKNOWN_DIAGNOSTIC_CALLER = '<unknown caller>';
2
3
 
3
4
  type ZLinkStateLaneWork<T> = () => Promise<T> | T;
4
5
 
6
+ interface ZLinkStateLaneTurn {
7
+ readonly lane: ZLinkStateLane;
8
+ active: boolean;
9
+ }
10
+
11
+ export function isStructuralGuardEnabled(): boolean {
12
+ return process.env.ZLINK_NODE_STRUCTURAL_GUARD === '1' || process.env.NODE_ENV === 'test';
13
+ }
14
+
15
+ const currentLaneStorage = new AsyncLocalStorage<ZLinkStateLane>();
16
+ const diagnosticPending = isStructuralGuardEnabled() ? new Map<number, string>() : undefined;
17
+ let nextDiagnosticWork = 0;
18
+ const diagnosticTurnStorage =
19
+ diagnosticPending === undefined ? undefined : new AsyncLocalStorage<ZLinkStateLaneTurn>();
20
+
5
21
  /**
6
22
  * Single-owner execution lane for a component's mutable state.
7
23
  *
@@ -10,15 +26,13 @@ type ZLinkStateLaneWork<T> = () => Promise<T> | T;
10
26
  * Actor serial executors, which also own lifecycle and relocation concerns.
11
27
  */
12
28
  export class ZLinkStateLane {
13
- private static readonly currentLaneStorage = new AsyncLocalStorage<ZLinkStateLane>();
14
-
15
29
  private readonly mailbox: Array<() => Promise<void>> = [];
16
30
  private draining = false;
17
31
  private drainPromise: Promise<void> | undefined;
18
32
  private closed = false;
19
33
 
20
34
  static get current(): ZLinkStateLane | undefined {
21
- return ZLinkStateLane.currentLaneStorage.getStore();
35
+ return currentLaneStorage.getStore();
22
36
  }
23
37
 
24
38
  get isOnLane(): boolean {
@@ -100,7 +114,7 @@ export class ZLinkStateLane {
100
114
  return;
101
115
  }
102
116
  try {
103
- await ZLinkStateLane.currentLaneStorage.run(this, work);
117
+ await currentLaneStorage.run(this, work);
104
118
  } catch {
105
119
  // Posted callbacks own their errors. One failure must not strand later work.
106
120
  }
@@ -114,3 +128,127 @@ export class ZLinkStateLane {
114
128
  }
115
129
  }
116
130
  }
131
+
132
+ // Install the structural check only in diagnostic processes. The release run()
133
+ // method and its returned Promise are left untouched.
134
+ if (isStructuralGuardEnabled()) {
135
+ Object.defineProperty(ZLinkStateLane, 'current', {
136
+ configurable: true,
137
+ get: () => {
138
+ const turn = diagnosticTurnStorage?.getStore();
139
+ return turn?.active === true ? turn.lane : undefined;
140
+ }
141
+ });
142
+
143
+ const run = ZLinkStateLane.prototype.run;
144
+ ZLinkStateLane.prototype.run = function <T>(
145
+ this: ZLinkStateLane,
146
+ work: ZLinkStateLaneWork<T>
147
+ ): Promise<T> {
148
+ const completion = run.call(this, () => runDiagnosticTurn(this, work)) as Promise<T>;
149
+ return guardStateLaneCompletion(
150
+ trackDiagnosticCompletion(completion, `state lane ${diagnosticWorkName(work)}`),
151
+ 'another state lane completion',
152
+ this
153
+ );
154
+ };
155
+
156
+ const tryPost = ZLinkStateLane.prototype.tryPost;
157
+ ZLinkStateLane.prototype.tryPost = function (
158
+ this: ZLinkStateLane,
159
+ work: ZLinkStateLaneWork<void>
160
+ ): boolean {
161
+ const release = registerDiagnosticWork(`state lane post ${diagnosticWorkName(work)}`);
162
+ const accepted = tryPost.call(this, () => {
163
+ try {
164
+ const result = runDiagnosticTurn(this, work);
165
+ if (result instanceof Promise) return result.finally(release);
166
+ release();
167
+ return result;
168
+ } catch (error) {
169
+ release();
170
+ throw error;
171
+ }
172
+ });
173
+ if (!accepted) release();
174
+ return accepted;
175
+ };
176
+ }
177
+
178
+ function runDiagnosticTurn<T>(lane: ZLinkStateLane, work: ZLinkStateLaneWork<T>): Promise<T> | T {
179
+ const turn: ZLinkStateLaneTurn = { lane, active: true };
180
+ return diagnosticTurnStorage!.run(turn, () => {
181
+ try {
182
+ const result = work();
183
+ if (result instanceof Promise) {
184
+ return result.finally(() => {
185
+ turn.active = false;
186
+ });
187
+ }
188
+ turn.active = false;
189
+ return result;
190
+ } catch (error) {
191
+ turn.active = false;
192
+ throw error;
193
+ }
194
+ });
195
+ }
196
+
197
+ /** Applied only by debug-installed wrappers; release completions keep their original identity. */
198
+ export function guardStateLaneCompletion<T>(
199
+ completion: Promise<T>,
200
+ label: string,
201
+ owner?: ZLinkStateLane
202
+ ): Promise<T> {
203
+ return new Proxy(completion, {
204
+ get(target, property) {
205
+ if (property === 'then') {
206
+ return (onFulfilled: (value: T) => unknown, onRejected: (error: unknown) => unknown) => {
207
+ const current = ZLinkStateLane.current;
208
+ if (current !== undefined && current !== owner) {
209
+ throw new Error(`A state lane turn cannot wait for ${label}.`);
210
+ }
211
+ return target.then(onFulfilled, onRejected);
212
+ };
213
+ }
214
+ if (property === 'catch') {
215
+ return (onRejected: (error: unknown) => unknown) =>
216
+ guardStateLaneCompletion(target.catch(onRejected), label, owner);
217
+ }
218
+ if (property === 'finally') {
219
+ return (onFinally: () => void) =>
220
+ guardStateLaneCompletion(target.finally(onFinally), label, owner);
221
+ }
222
+ const value = Reflect.get(target, property, target) as unknown;
223
+ return typeof value === 'function' ? value.bind(target) : value;
224
+ }
225
+ });
226
+ }
227
+
228
+ export function trackDiagnosticCompletion<T>(completion: Promise<T>, name: string): Promise<T> {
229
+ const release = registerDiagnosticWork(name);
230
+ void completion.then(release, release);
231
+ return completion;
232
+ }
233
+
234
+ export function debugPendingWorkNames(): string[] {
235
+ return [...(diagnosticPending?.values() ?? [])];
236
+ }
237
+
238
+ export function diagnosticWorkName(work: { readonly name: string }): string {
239
+ return work.name.length > 0 ? work.name : '<anonymous>';
240
+ }
241
+
242
+ function registerDiagnosticWork(name: string): () => void {
243
+ if (diagnosticPending === undefined) return () => undefined;
244
+ const id = ++nextDiagnosticWork;
245
+ const frames = new Error().stack?.split('\n').slice(2) ?? [];
246
+ const caller =
247
+ frames
248
+ .find((frame) => !frame.includes('state-lane.') && !frame.includes('serial-execution-queue.'))
249
+ ?.trim() ?? UNKNOWN_DIAGNOSTIC_CALLER;
250
+ diagnosticPending.set(id, `${name} ${caller}`);
251
+ return () => {
252
+ diagnosticPending.delete(id);
253
+ };
254
+ }
@@ -1,11 +1,15 @@
1
+ import { UINT64_MAX } from '@zlink-systems/stream-wire';
1
2
  import { createHash } from 'node:crypto';
2
3
  import type { RoutingId, ZLinkActorJoinOperationId } from '../../contracts';
3
- import { decodeRoutingId, encodeRoutingIdStorageHex } from '../routing-id';
4
4
  import {
5
5
  decodeZljrRecordV1 as decodeGeneratedZljrRecordV1,
6
6
  encodeZljrRecordV1 as encodeGeneratedZljrRecordV1
7
7
  } from '../protocol/service_wire_pilot_codec.generated';
8
+ import { decodeRoutingId, encodeRoutingIdStorageHex } from '../routing-id';
8
9
  import { decodeServiceWireFrozenRecord } from './service-stateful-wire-codec';
10
+ const ACTOR_ID_DIGEST_MAX_BYTES = 0xffff;
11
+
12
+ export const SHA256_DIGEST_BYTES = 32;
9
13
 
10
14
  const RECOVERY_PACKET_NAME = '__zlink.actor.routed_join.recovery';
11
15
  const RECOVERY_CONTENT_TYPE = 'application/x-zlink-actor-routed-join-recovery-v1';
@@ -13,8 +17,8 @@ const MAXIMUM_METADATA_BYTES = 256 * 1024;
13
17
  const FRAMEWORK_METADATA_UPPER_BOUND_BYTES = 64 * 1024;
14
18
  const ACCEPTED_JOURNAL_UPPER_BOUND_BYTES = 16 * 1024 * 1024;
15
19
  const SNAPSHOT_APPLICATION_STATE_RESERVATION_BYTES = 64 * 1024 * 1024;
16
- const RECREATE_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.recreate';
17
- const SNAPSHOT_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.snapshot';
20
+ export const RECREATE_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.recreate';
21
+ export const SNAPSHOT_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.snapshot';
18
22
 
19
23
  export interface CanonicalActorJoinRecoveryRequest {
20
24
  readonly actorId: string;
@@ -87,7 +91,8 @@ export function canonicalActorJoinHandoffId(input: {
87
91
  readonly correlation: bigint;
88
92
  }): string {
89
93
  const actor = textBytes(input.actorId, 'actorId');
90
- if (actor.byteLength > 0xffff) throw new RangeError('Actor id exceeds u16 bytes.');
94
+ if (actor.byteLength > ACTOR_ID_DIGEST_MAX_BYTES)
95
+ throw new RangeError('Actor id exceeds u16 bytes.');
91
96
  const digest = createHash('sha256')
92
97
  .update(
93
98
  Buffer.concat([
@@ -139,7 +144,7 @@ export function encodeCanonicalActorJoinRecoverySavedWork(
139
144
  RelocationChecksumCrc32c: 0,
140
145
  RelocationAggregateId: canonicalUuid(input.relocationId),
141
146
  RelocationAggregateGeneration: 1n,
142
- RelocationInventoryDigest: Buffer.alloc(32).toString('base64'),
147
+ RelocationInventoryDigest: Buffer.alloc(SHA256_DIGEST_BYTES).toString('base64'),
143
148
  RequestContentType: requireText(input.requestContentType, 'Actor Join request content type'),
144
149
  Request: '',
145
150
  HandoffFrames: [],
@@ -423,7 +428,7 @@ function requireText(value: string | undefined, name: string): string {
423
428
  }
424
429
 
425
430
  function nonZeroU64(value: bigint, name: string): bigint {
426
- if (value < 1n || value > 0xffff_ffff_ffff_ffffn) throw new RangeError(`${name} is invalid.`);
431
+ if (value < 1n || value > UINT64_MAX) throw new RangeError(`${name} is invalid.`);
427
432
  return value;
428
433
  }
429
434
 
@@ -435,7 +440,7 @@ function u16(value: number): Buffer {
435
440
  }
436
441
 
437
442
  function u64(value: bigint): Buffer {
438
- if (value < 0n || value > 0xffff_ffff_ffff_ffffn) throw new RangeError('u64');
443
+ if (value < 0n || value > UINT64_MAX) throw new RangeError('u64');
439
444
  const result = Buffer.alloc(8);
440
445
  result.writeBigUInt64BE(value);
441
446
  return result;
@@ -461,7 +466,7 @@ function integer(value: unknown, name: string): bigint {
461
466
  if (typeof value !== 'string' || !/^\d+$/u.test(value))
462
467
  throw new TypeError(`${name} is invalid.`);
463
468
  const parsed = BigInt(value);
464
- if (parsed > 0xffff_ffff_ffff_ffffn) throw new TypeError(`${name} exceeds u64.`);
469
+ if (parsed > UINT64_MAX) throw new TypeError(`${name} exceeds u64.`);
465
470
  return parsed;
466
471
  }
467
472
 
@@ -1,5 +1,3 @@
1
- import { runZLinkExecutionArea } from '../execution';
2
-
3
1
  export interface CloseableResource {
4
2
  close(): void | Promise<void>;
5
3
  }
@@ -23,7 +21,7 @@ export class EventLoopResourceStack {
23
21
  }
24
22
  }
25
23
 
26
- async function closeResources(resources: readonly CloseableResource[]): Promise<void> {
24
+ export async function closeResources(resources: readonly CloseableResource[]): Promise<void> {
27
25
  const failures: unknown[] = [];
28
26
  for (const resource of resources) {
29
27
  try {
@@ -32,126 +30,11 @@ async function closeResources(resources: readonly CloseableResource[]): Promise<
32
30
  failures.push(error);
33
31
  }
34
32
  }
35
- if (failures.length > 0) {
36
- throw new AggregateError(failures, 'Event-loop resource cleanup failed.');
37
- }
33
+ finishResourceCleanup(failures);
38
34
  }
39
35
 
40
- export type EventLoopTask = () => void | Promise<void>;
41
-
42
- /** Keeps infrastructure progress independent from awaiting application handlers. */
43
- export class EventLoopWorkQueues {
44
- private readonly infrastructure: Array<EventLoopTask | undefined> = [];
45
- private infrastructureHead = 0;
46
- private infrastructureCount = 0;
47
- private readonly application: Array<EventLoopTask | undefined> = [];
48
- private applicationHead = 0;
49
- private applicationCount = 0;
50
- private infrastructureScheduled = false;
51
- private applicationScheduled = false;
52
- private accepting = true;
53
-
54
- submitInfrastructure(task: EventLoopTask): boolean {
55
- if (!this.accepting) return false;
56
- this.infrastructure.push(task);
57
- this.infrastructureCount += 1;
58
- this.scheduleInfrastructure();
59
- return true;
60
- }
61
-
62
- submitApplication(task: EventLoopTask): boolean {
63
- if (!this.accepting) return false;
64
- this.application.push(task);
65
- this.applicationCount += 1;
66
- this.scheduleApplication();
67
- return true;
68
- }
69
-
70
- stopAdmission(): void {
71
- this.accepting = false;
72
- }
73
-
74
- private scheduleInfrastructure(): void {
75
- if (this.infrastructureScheduled) return;
76
- this.infrastructureScheduled = true;
77
- queueMicrotask(() => this.drainInfrastructure());
78
- }
79
-
80
- private drainInfrastructure(): void {
81
- this.infrastructureScheduled = false;
82
- const task = this.takeInfrastructure();
83
- if (task === undefined) return;
84
- try {
85
- const result = runZLinkExecutionArea('infrastructure', task);
86
- if (result instanceof Promise) void result.catch(() => undefined);
87
- } finally {
88
- if (this.infrastructureCount > 0) this.scheduleInfrastructure();
89
- }
90
- }
91
-
92
- private scheduleApplication(): void {
93
- if (this.applicationScheduled) return;
94
- this.applicationScheduled = true;
95
- queueMicrotask(() => void this.drainApplication());
96
- }
97
-
98
- private async drainApplication(): Promise<void> {
99
- try {
100
- const task = this.takeApplication();
101
- if (task !== undefined) {
102
- await runZLinkExecutionArea('application', task);
103
- }
104
- } catch {
105
- // Handler failure is reported by the dispatch owner; it does not stop this queue.
106
- } finally {
107
- this.applicationScheduled = false;
108
- if (this.applicationCount > 0) this.scheduleApplication();
109
- }
110
- }
111
-
112
- private takeInfrastructure(): EventLoopTask | undefined {
113
- const task = this.infrastructure[this.infrastructureHead];
114
- if (task === undefined) return undefined;
115
- this.infrastructure[this.infrastructureHead] = undefined;
116
- this.infrastructureHead += 1;
117
- this.infrastructureCount -= 1;
118
- this.compactInfrastructure();
119
- return task;
120
- }
121
-
122
- private takeApplication(): EventLoopTask | undefined {
123
- const task = this.application[this.applicationHead];
124
- if (task === undefined) return undefined;
125
- this.application[this.applicationHead] = undefined;
126
- this.applicationHead += 1;
127
- this.applicationCount -= 1;
128
- this.compactApplication();
129
- return task;
130
- }
131
-
132
- private compactInfrastructure(): void {
133
- if (this.infrastructureCount === 0) {
134
- this.infrastructure.length = 0;
135
- this.infrastructureHead = 0;
136
- } else if (
137
- this.infrastructureHead >= 1024 &&
138
- this.infrastructureHead * 2 >= this.infrastructure.length
139
- ) {
140
- this.infrastructure.splice(0, this.infrastructureHead);
141
- this.infrastructureHead = 0;
142
- }
143
- }
144
-
145
- private compactApplication(): void {
146
- if (this.applicationCount === 0) {
147
- this.application.length = 0;
148
- this.applicationHead = 0;
149
- } else if (
150
- this.applicationHead >= 1024 &&
151
- this.applicationHead * 2 >= this.application.length
152
- ) {
153
- this.application.splice(0, this.applicationHead);
154
- this.applicationHead = 0;
155
- }
36
+ export function finishResourceCleanup(failures: readonly unknown[]): void {
37
+ if (failures.length > 0) {
38
+ throw new AggregateError(failures, 'Event-loop resource cleanup failed.');
156
39
  }
157
40
  }
@@ -1,4 +1,8 @@
1
+ import { UINT64_BYTES, UINT64_MAX } from '@zlink-systems/stream-wire';
1
2
  import { randomBytes } from 'node:crypto';
3
+ export const OPERATION_IDENTITY_BYTES = 16;
4
+
5
+ export const ZLINK_NATIVE_CORRELATION_OPERATION_NAMESPACE = 2n;
2
6
 
3
7
  export interface ZLinkOperationIdentity128 {
4
8
  readonly high: bigint;
@@ -27,13 +31,15 @@ export function createRandomOperationIdentity(
27
31
  source: (size: number) => Buffer = randomBytes
28
32
  ): ZLinkOperationIdentity128 {
29
33
  for (;;) {
30
- const bytes = source(16);
31
- if (bytes.length !== 16) {
32
- throw new RangeError('Operation identity entropy source must return exactly 16 bytes.');
34
+ const bytes = source(OPERATION_IDENTITY_BYTES);
35
+ if (bytes.length !== OPERATION_IDENTITY_BYTES) {
36
+ throw new RangeError(
37
+ `Operation identity entropy source must return exactly ${OPERATION_IDENTITY_BYTES} bytes.`
38
+ );
33
39
  }
34
40
  const operationId = {
35
41
  high: bytes.readBigUInt64BE(0),
36
- low: bytes.readBigUInt64BE(8)
42
+ low: bytes.readBigUInt64BE(UINT64_BYTES)
37
43
  };
38
44
  if (operationId.high !== 0n || operationId.low !== 0n) {
39
45
  return operationId;
@@ -42,7 +48,7 @@ export function createRandomOperationIdentity(
42
48
  }
43
49
 
44
50
  function requireUnsigned64(value: bigint, name: string): void {
45
- if (typeof value !== 'bigint' || value < 0n || value > 0xffff_ffff_ffff_ffffn) {
51
+ if (typeof value !== 'bigint' || value < 0n || value > UINT64_MAX) {
46
52
  throw new RangeError(`${name} must be an unsigned 64-bit integer.`);
47
53
  }
48
54
  }