@zlink-systems/framework 0.30.0 → 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 (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -8,11 +8,10 @@ const internal_event_contracts_1 = require("../diagnostics/internal-event-contra
8
8
  const contracts_1 = require("../../contracts");
9
9
  const TimerRegistrationValidator_1 = require("../../contracts/Configuration/TimerRegistrationValidator");
10
10
  const abort_1 = require("../abort");
11
+ const framework_errors_internal_1 = require("../framework-errors-internal");
11
12
  const handler_instance_scope_1 = require("../handlers/handler-instance-scope");
12
13
  const flow_context_1 = require("../diagnostics/flow-context");
13
14
  const state_lane_1 = require("../execution/state-lane");
14
- const node_async_hooks_1 = require("node:async_hooks");
15
- const detachedTimerStateLaneResource = new node_async_hooks_1.AsyncResource('zlink:spot-timer');
16
15
  const systemTimerClock = {
17
16
  now: () => performance.now(),
18
17
  utcNow: () => Date.now(),
@@ -30,6 +29,22 @@ class ZLinkSpotTimerRegistry {
30
29
  timers = new Map();
31
30
  generations = new Map();
32
31
  executionBarrier;
32
+ /** Frozen from the source capture or the target restore until abort or Ready. */
33
+ frozen = false;
34
+ /**
35
+ * The lifecycle owner opens this window around the target's Configure and
36
+ * pre-Ready OnInitialize only (Spot timer §1). A registration captures it at
37
+ * the call, so a registration started inside the window reattaches a
38
+ * restored key even when its asynchronous part finishes after the window.
39
+ */
40
+ initializing = false;
41
+ /**
42
+ * Handler constructors the target Spot announced with `addTimer(...)` during
43
+ * Configure. Together with `handlers.addTimerHandler(...)` they form the
44
+ * table that resolves a restored timer's handler by name.
45
+ */
46
+ configureTimerHandlers = new Set();
47
+ relocationHandlersResolved = false;
33
48
  constructor(_metrics, flowCreationEnabled = () => true, executionSerialForTimer, executionAllowed = () => true, executeTimer, isTimerExecuting, clock) {
34
49
  this.flowCreationEnabled = flowCreationEnabled;
35
50
  this.executionSerialForTimer = executionSerialForTimer;
@@ -49,43 +64,135 @@ class ZLinkSpotTimerRegistry {
49
64
  }
50
65
  async add(name, periodMs, options, handlerType, serial, spot, providerResolver, signal, reportFailure) {
51
66
  (0, TimerRegistrationValidator_1.validateTimerRegistration)(name, periodMs, options);
67
+ const initializing = this.initializing;
68
+ if (initializing && !this.relocationHandlersResolved) {
69
+ this.configureTimerHandlers.add(handlerType);
70
+ }
52
71
  (0, abort_1.throwIfAborted)(signal);
72
+ (0, handler_instance_scope_1.prepareHandlerInstance)(providerResolver, handlerType);
53
73
  const handler = await (0, handler_instance_scope_1.resolveLifecycleHandler)(spot, handlerType, providerResolver);
54
- const prepared = await this.lane.run(() => this.prepareAddCore(name));
55
- if (prepared.previous !== undefined)
56
- await prepared.previous.timer.cancel(signal);
57
74
  const executionSerial = this.executeTimer === undefined
58
75
  ? (this.executionSerialForTimer?.(name, serial) ?? serial)
59
76
  : undefined;
60
77
  if (this.executionBarrier !== undefined)
61
78
  executionSerial?.setExecutionBarrier(this.executionBarrier);
62
- let callbackStarted = false;
63
- const timer = startOutsideStateLane(() => new ZLinkManagedTimer(name, periodMs, normalizeTimerOptions(options), async (tick) => {
64
- callbackStarted = false;
65
- const timerFlow = (0, flow_context_1.createInboundFlow)(undefined, 'Timer', this.flowCreationEnabled(), undefined);
66
- const operation = () => {
67
- const current = this.timers.get(name);
68
- if (current === undefined ||
69
- current.generation !== prepared.generation ||
70
- current.timer !== timer) {
71
- return undefined;
72
- }
73
- if (!this.executionAllowed())
74
- return undefined;
75
- callbackStarted = true;
76
- return (0, flow_context_1.runWithFlow)(timerFlow, () => handler.handle(spot, tick));
79
+ const binding = {
80
+ handler: handler,
81
+ spot,
82
+ executionSerial,
83
+ reportFailure
84
+ };
85
+ const prepared = await this.lane.run(() => this.prepareAddCore(name, handlerType.name, initializing, binding));
86
+ if (prepared.kind === 'reattached')
87
+ return prepared.handle;
88
+ if (prepared.previous !== undefined)
89
+ await prepared.previous.timer.cancel(signal);
90
+ const slot = { binding };
91
+ const timer = this.createTimer(name, prepared.generation, periodMs, options, slot);
92
+ const handle = new ZLinkRegisteredTimer(this, name, prepared.generation, timer);
93
+ const registered = await this.lane.run(() => this.completeAddCore(name, {
94
+ generation: prepared.generation,
95
+ handlerType: handlerType.name,
96
+ timer,
97
+ handle,
98
+ restored: false,
99
+ slot
100
+ }));
101
+ if (!registered)
102
+ await timer.cancel(signal);
103
+ return handle;
104
+ }
105
+ /**
106
+ * Stages the source payload on a fresh relocation target before Configure.
107
+ * The restored registrations keep their schedule and stay frozen until Ready.
108
+ */
109
+ stageRelocation(states) {
110
+ if (this.frozen || this.timers.size !== 0) {
111
+ throw new Error('Timer relocation can only be restored into a fresh registry.');
112
+ }
113
+ const restored = states.map((state) => {
114
+ if (states.some((other) => other !== state && other.name === state.name)) {
115
+ throw new Error(`Timer '${state.name}' appears twice in relocation state.`);
116
+ }
117
+ const options = {
118
+ overrunPolicy: state.overrunPolicy,
119
+ maxCatchUpTicks: state.maxCatchUpTicks,
120
+ stopOnUnhandledException: state.stopOnUnhandledException
77
121
  };
78
- if (this.executeTimer !== undefined) {
79
- await this.executeTimer(name, operation);
122
+ (0, TimerRegistrationValidator_1.validateTimerRegistration)(state.name, state.periodMs, options);
123
+ const slot = { binding: undefined };
124
+ const timer = this.createTimer(state.name, 1n, state.periodMs, options, slot, state);
125
+ return [
126
+ state.name,
127
+ {
128
+ generation: 1n,
129
+ handlerType: state.handlerType,
130
+ timer,
131
+ handle: new ZLinkRegisteredTimer(this, state.name, 1n, timer),
132
+ restored: true,
133
+ slot
134
+ }
135
+ ];
136
+ });
137
+ this.frozen = true;
138
+ for (const [name, entry] of restored) {
139
+ this.generations.set(name, entry.generation);
140
+ this.timers.set(name, entry);
141
+ }
142
+ }
143
+ /** Runs one relocation-target initialization callback inside the reattach window. */
144
+ async runRelocationInitialization(operation) {
145
+ if (!this.frozen || this.initializing) {
146
+ throw new Error('Timer relocation initialization is not active.');
147
+ }
148
+ this.initializing = true;
149
+ try {
150
+ return await operation();
151
+ }
152
+ finally {
153
+ this.initializing = false;
154
+ }
155
+ }
156
+ /**
157
+ * After Configure, resolves every restored timer's handler constructor by
158
+ * name among the constructors the Spot announced in Configure: `addTimer(...)`
159
+ * there or `handlers.addTimerHandler(...)`. A restored key that Configure did
160
+ * not reattach is registered with the resolved constructor so it survives
161
+ * Ready without re-registration. No match or more than one match fails the
162
+ * target restore.
163
+ */
164
+ async resolveRelocationHandlers(declared, register) {
165
+ if (!this.frozen || !this.initializing || this.relocationHandlersResolved) {
166
+ throw new Error('Timer relocation handler resolution is not active.');
167
+ }
168
+ this.relocationHandlersResolved = true;
169
+ const constructors = [...new Set([...declared, ...this.configureTimerHandlers])];
170
+ const restored = await this.lane.run(() => [...this.timers.entries()].filter(([, entry]) => entry.restored));
171
+ for (const [name, entry] of restored) {
172
+ const matches = constructors.filter((type) => type.name === entry.handlerType);
173
+ if (matches.length !== 1) {
174
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RelocationFailed, matches.length === 0
175
+ ? `Timer '${name}' handler '${entry.handlerType}' is not declared. Register its timer with context.addTimer(...) in configure(), or declare it with context.handlers.addTimerHandler(Handler) in configure().`
176
+ : `Timer '${name}' handler '${entry.handlerType}' is ambiguous: ${matches.length} declared constructors share the name.`);
80
177
  }
81
- else {
82
- await executionSerial.execute(operation);
178
+ if (entry.slot.binding === undefined) {
179
+ await register(name, entry.timer.periodMs, matches[0]);
83
180
  }
84
- }, reportFailure, () => callbackStarted, this.clock));
85
- const registered = await this.lane.run(() => this.completeAddCore(name, prepared.generation, handlerType.name, timer));
86
- if (!registered)
87
- await timer.cancel(signal);
88
- return new ZLinkRegisteredTimer(this, name, prepared.generation, timer);
181
+ }
182
+ }
183
+ /** Ready: starts the restored and newly registered timers. */
184
+ async publishRelocation() {
185
+ await this.lane.run(() => {
186
+ for (const [name, entry] of this.timers) {
187
+ if (entry.slot.binding === undefined) {
188
+ throw new Error(`Restored timer '${name}' has no resolved handler at Ready.`);
189
+ }
190
+ }
191
+ this.frozen = false;
192
+ for (const entry of this.timers.values()) {
193
+ (0, state_lane_1.startOutsideStateLane)(() => entry.timer.resume());
194
+ }
195
+ });
89
196
  }
90
197
  async dispose() {
91
198
  const timers = await this.lane.run(() => {
@@ -101,7 +208,10 @@ class ZLinkSpotTimerRegistry {
101
208
  await Promise.all(finalizations.filter((_, index) => timers[index].wait));
102
209
  }
103
210
  async captureRelocation() {
104
- const timers = await this.lane.run(() => [...this.timers.entries()].sort(([left], [right]) => left.localeCompare(right)));
211
+ const timers = await this.lane.run(() => {
212
+ this.frozen = true;
213
+ return [...this.timers.entries()].sort(([left], [right]) => left.localeCompare(right));
214
+ });
105
215
  const states = [];
106
216
  for (const [name, entry] of timers) {
107
217
  const state = await entry.timer.captureRelocation(entry.handlerType);
@@ -111,21 +221,12 @@ class ZLinkSpotTimerRegistry {
111
221
  }
112
222
  return states;
113
223
  }
114
- restoreRelocation(states) {
115
- const byName = new Map(states.map((state) => [state.name, state]));
116
- if (byName.size !== states.length || byName.size !== this.timers.size) {
117
- throw new Error('Timer relocation inventory does not match registered handlers.');
224
+ /** Source abort: the captured timers continue from their own unchanged cursor. */
225
+ abortRelocation() {
226
+ this.frozen = false;
227
+ for (const entry of this.timers.values()) {
228
+ (0, state_lane_1.startOutsideStateLane)(() => entry.timer.resume());
118
229
  }
119
- for (const [name, entry] of this.timers) {
120
- const state = byName.get(name);
121
- if (state === undefined) {
122
- throw new Error(`Timer '${name}' is missing from relocation state.`);
123
- }
124
- entry.timer.restoreRelocation(state, entry.handlerType);
125
- }
126
- }
127
- abortRelocation(states) {
128
- this.restoreRelocation(states);
129
230
  }
130
231
  async commitRelocation() {
131
232
  await this.dispose();
@@ -135,17 +236,58 @@ class ZLinkSpotTimerRegistry {
135
236
  await this.lane.run(() => this.cancelCore(name, generation, timer));
136
237
  await timer.cancel(signal);
137
238
  }
138
- prepareAddCore(name) {
239
+ createTimer(name, generation, periodMs, options, slot, cursor) {
240
+ let callbackStarted = false;
241
+ const timer = (0, state_lane_1.startOutsideStateLane)(() => new ZLinkManagedTimer(name, periodMs, normalizeTimerOptions(options), async (tick) => {
242
+ callbackStarted = false;
243
+ const binding = slot.binding;
244
+ if (binding === undefined)
245
+ return;
246
+ const timerFlow = (0, flow_context_1.createInboundFlow)(undefined, 'Timer', this.flowCreationEnabled(), undefined);
247
+ const operation = () => {
248
+ const current = this.timers.get(name);
249
+ if (current === undefined ||
250
+ current.generation !== generation ||
251
+ current.timer !== timer) {
252
+ return undefined;
253
+ }
254
+ if (!this.executionAllowed())
255
+ return undefined;
256
+ callbackStarted = true;
257
+ return (0, flow_context_1.runWithFlow)(timerFlow, () => binding.handler.handle(binding.spot, tick));
258
+ };
259
+ if (this.executeTimer !== undefined) {
260
+ await this.executeTimer(name, operation);
261
+ }
262
+ else {
263
+ await binding.executionSerial.execute(operation);
264
+ }
265
+ }, (tick, cause, event) => slot.binding?.reportFailure?.(tick, cause, event), () => callbackStarted, this.clock, { paused: true, cursor }));
266
+ return timer;
267
+ }
268
+ prepareAddCore(name, handlerType, initializing, binding) {
269
+ if (this.frozen && !initializing) {
270
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidOperation, `Timer '${name}' registration is sealed for relocation.`);
271
+ }
139
272
  const previous = this.timers.get(name);
273
+ if (initializing && previous?.restored === true) {
274
+ if (previous.handlerType !== handlerType) {
275
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidOperation, `Timer '${name}' was restored with handler '${previous.handlerType}', not '${handlerType}'.`);
276
+ }
277
+ previous.slot.binding = binding;
278
+ return { kind: 'reattached', handle: previous.handle };
279
+ }
140
280
  this.timers.delete(name);
141
281
  const generation = (this.generations.get(name) ?? 0n) + 1n;
142
282
  this.generations.set(name, generation);
143
- return { previous, generation };
283
+ return { kind: 'registered', previous, generation };
144
284
  }
145
- completeAddCore(name, generation, handlerType, timer) {
146
- if (this.generations.get(name) !== generation)
285
+ completeAddCore(name, entry) {
286
+ if (this.generations.get(name) !== entry.generation)
147
287
  return false;
148
- this.timers.set(name, { generation, handlerType, timer });
288
+ this.timers.set(name, entry);
289
+ if (!this.frozen)
290
+ (0, state_lane_1.startOutsideStateLane)(() => entry.timer.resume());
149
291
  return true;
150
292
  }
151
293
  cancelCore(name, generation, timer) {
@@ -200,13 +342,21 @@ class ZLinkManagedTimer {
200
342
  pausedForRelocation = false;
201
343
  startedAtMs;
202
344
  startedAtUnixMs;
345
+ /** DeliveryIndex and ScheduledIndex of the last completed tick. */
203
346
  deliveryIndex = 0n;
204
347
  lastScheduledIndex = 0n;
348
+ /**
349
+ * The selected tick whose callback has not completed (Spot timer §1). It is
350
+ * the only pending tick a relocation captures, and a restored timer delivers
351
+ * it before it selects another tick.
352
+ */
353
+ pendingScheduledIndex;
205
354
  timeout;
206
- running = Promise.resolve();
355
+ /** The dispatch in flight, from its timer callback until `completeFireCore`. */
356
+ running;
207
357
  dispatchFailure;
208
358
  finalization;
209
- constructor(name, periodMs, options, onTick, onFailure, shouldWaitForRunningOnCancel = () => true, clock = systemTimerClock) {
359
+ constructor(name, periodMs, options, onTick, onFailure, shouldWaitForRunningOnCancel = () => true, clock = systemTimerClock, start = {}) {
210
360
  this.name = name;
211
361
  this.periodMs = periodMs;
212
362
  this.options = options;
@@ -214,8 +364,20 @@ class ZLinkManagedTimer {
214
364
  this.onFailure = onFailure;
215
365
  this.shouldWaitForRunningOnCancel = shouldWaitForRunningOnCancel;
216
366
  this.clock = clock;
217
- this.startedAtMs = clock.now();
218
- this.startedAtUnixMs = clock.utcNow();
367
+ const cursor = start.cursor;
368
+ if (cursor === undefined) {
369
+ this.startedAtMs = clock.now();
370
+ this.startedAtUnixMs = clock.utcNow();
371
+ }
372
+ else {
373
+ validateRelocationCursor(name, periodMs, cursor);
374
+ this.startedAtUnixMs = cursor.startedAtUnixMs;
375
+ this.startedAtMs = clock.now() - Math.max(0, clock.utcNow() - cursor.startedAtUnixMs);
376
+ this.deliveryIndex = cursor.deliveryIndex;
377
+ this.lastScheduledIndex = cursor.lastScheduledIndex;
378
+ this.pendingScheduledIndex = cursor.pendingTicks[0]?.scheduledIndex;
379
+ }
380
+ this.pausedForRelocation = start.paused === true;
219
381
  this.scheduleNext();
220
382
  }
221
383
  get isDisposed() {
@@ -260,51 +422,34 @@ class ZLinkManagedTimer {
260
422
  deliveryIndex: this.deliveryIndex,
261
423
  lastScheduledIndex: this.lastScheduledIndex,
262
424
  nextDueAtUnixMs: this.startedAtUnixMs + Number(this.lastScheduledIndex + 1n) * this.periodMs,
263
- pendingTicks: []
425
+ pendingTicks: this.pendingScheduledIndex === undefined
426
+ ? []
427
+ : [this.pendingTick(this.pendingScheduledIndex)]
264
428
  }));
265
429
  }
266
- restoreRelocation(state, handlerType = '') {
267
- if (this.disposed)
268
- throw new Error(`Timer '${this.name}' is disposed.`);
269
- if (state.name !== this.name ||
270
- state.handlerType !== handlerType ||
271
- state.periodMs !== this.periodMs ||
272
- state.overrunPolicy !== this.options.overrunPolicy ||
273
- state.maxCatchUpTicks !== this.options.maxCatchUpTicks ||
274
- state.stopOnUnhandledException !== this.options.stopOnUnhandledException ||
275
- !Number.isSafeInteger(state.startedAtUnixMs) ||
276
- state.deliveryIndex < 0n ||
277
- state.lastScheduledIndex < 0n ||
278
- !Number.isSafeInteger(state.nextDueAtUnixMs) ||
279
- state.nextDueAtUnixMs !==
280
- state.startedAtUnixMs + Number(state.lastScheduledIndex + 1n) * state.periodMs ||
281
- state.pendingTicks.length !== 0) {
282
- throw new Error(`Timer '${this.name}' relocation contract does not match its registration.`);
283
- }
284
- if (this.timeout !== undefined)
285
- this.clock.clearTimeout(this.timeout);
286
- this.timeout = undefined;
287
- this.startedAtUnixMs = state.startedAtUnixMs;
288
- this.startedAtMs = this.clock.now() - Math.max(0, this.clock.utcNow() - state.startedAtUnixMs);
289
- this.deliveryIndex = state.deliveryIndex;
290
- this.lastScheduledIndex = state.lastScheduledIndex;
430
+ /** Starts a timer created paused, or continues one paused by a relocation capture. */
431
+ resume() {
432
+ if (this.disposed || !this.pausedForRelocation)
433
+ return;
291
434
  this.pausedForRelocation = false;
292
435
  this.scheduleNext();
293
436
  }
294
437
  scheduleNext() {
295
- if (this.disposed || this.pausedForRelocation) {
438
+ // The dispatch in flight schedules the next tick when it completes.
439
+ if (this.disposed || this.pausedForRelocation || this.running !== undefined) {
296
440
  return;
297
441
  }
298
- const delayMs = this.options.overrunPolicy === contracts_1.ZLinkTimerOverrunPolicy.DelayNextTick
299
- ? this.periodMs
300
- : Math.max(0, Number(this.lastScheduledIndex + 1n) * this.periodMs - this.elapsedMs());
301
- this.timeout = this.clock.setTimeout(() => {
442
+ const delayMs = this.pendingScheduledIndex !== undefined
443
+ ? 0
444
+ : this.options.overrunPolicy === contracts_1.ZLinkTimerOverrunPolicy.DelayNextTick
445
+ ? this.periodMs
446
+ : Math.max(0, Number(this.lastScheduledIndex + 1n) * this.periodMs - this.elapsedMs());
447
+ this.timeout = (0, state_lane_1.startOutsideStateLane)(() => this.clock.setTimeout(() => {
302
448
  this.timeout = undefined;
303
- const execution = startOutsideStateLane(() => this.fire());
304
- this.running = execution.then(() => undefined, (cause) => this.lane.run(() => {
449
+ this.running = this.fire().then(() => undefined, (cause) => this.lane.run(() => {
305
450
  this.dispatchFailure ??= { cause };
306
451
  }));
307
- }, delayMs);
452
+ }, delayMs));
308
453
  }
309
454
  async fire() {
310
455
  const prepared = await this.lane.run(() => this.prepareFireCore());
@@ -315,12 +460,18 @@ class ZLinkManagedTimer {
315
460
  await this.onTick(prepared.tick);
316
461
  }
317
462
  catch (cause) {
463
+ // A tick whose callback had not started when a relocation captured it
464
+ // belongs to the capture: the target delivers it, so the source neither
465
+ // reports nor completes it.
466
+ const started = this.shouldWaitForRunningOnCancel();
467
+ if (!started && (await this.lane.run(() => this.pausedForRelocation)))
468
+ return;
318
469
  shouldContinue = !this.options.stopOnUnhandledException;
319
470
  await this.onFailure?.(prepared.tick, cause, shouldContinue
320
471
  ? internal_event_contracts_1.ZLinkSpotEventKind.TimerHandlerFailed
321
472
  : internal_event_contracts_1.ZLinkSpotEventKind.TimerStoppedAfterUnhandledException);
322
473
  }
323
- await this.lane.run(() => this.completeFireCore(prepared.scheduledIndex, shouldContinue));
474
+ await this.lane.run(() => this.completeFireCore(shouldContinue));
324
475
  }
325
476
  cancelCore() {
326
477
  this.disposed = true;
@@ -328,7 +479,7 @@ class ZLinkManagedTimer {
328
479
  this.timeout = undefined;
329
480
  return {
330
481
  timeout,
331
- running: this.shouldWaitForRunningOnCancel() ? this.running : Promise.resolve()
482
+ running: this.shouldWaitForRunningOnCancel() ? this.running : undefined
332
483
  };
333
484
  }
334
485
  async completeFinalization(start, finalization) {
@@ -368,34 +519,39 @@ class ZLinkManagedTimer {
368
519
  this.clock.clearTimeout(this.timeout);
369
520
  this.timeout = undefined;
370
521
  }
371
- return { running: this.shouldWaitForRunningOnCancel() ? this.running : Promise.resolve() };
522
+ return { running: this.shouldWaitForRunningOnCancel() ? this.running : undefined };
372
523
  }
373
524
  prepareFireCore() {
374
525
  if (this.disposed)
375
526
  return undefined;
376
- const scheduledIndex = this.selectScheduledIndex();
377
- const skippedTicks = scheduledIndex - this.lastScheduledIndex - 1n;
527
+ this.pendingScheduledIndex ??= this.selectScheduledIndex();
528
+ const pending = this.pendingTick(this.pendingScheduledIndex);
378
529
  const startedElapsedMs = this.elapsedMs();
379
- const scheduledElapsedMs = Number(scheduledIndex) * this.periodMs;
380
- this.deliveryIndex += 1n;
530
+ const scheduledElapsedMs = Number(pending.scheduledIndex) * this.periodMs;
381
531
  return {
382
- scheduledIndex,
383
532
  tick: {
384
533
  name: this.name,
385
- deliveryIndex: this.deliveryIndex,
386
- scheduledIndex,
534
+ deliveryIndex: pending.deliveryIndex,
535
+ scheduledIndex: pending.scheduledIndex,
387
536
  periodMs: this.periodMs,
388
- scheduledAt: new Date(this.startedAtUnixMs + scheduledElapsedMs),
537
+ scheduledAt: new Date(pending.scheduledAtUnixMs),
389
538
  startedAt: new Date(this.clock.utcNow()),
390
539
  scheduledElapsedMs,
391
540
  startedElapsedMs,
392
541
  delayMs: startedElapsedMs - scheduledElapsedMs,
393
- skippedTicks
542
+ skippedTicks: pending.skippedTicks
394
543
  }
395
544
  };
396
545
  }
397
- completeFireCore(scheduledIndex, shouldContinue) {
398
- this.lastScheduledIndex = scheduledIndex;
546
+ /** The tick info of the pending tick at `scheduledIndex` after the completed cursor. */
547
+ pendingTick(scheduledIndex) {
548
+ return relocationPendingTick(this.startedAtUnixMs, this.periodMs, this.deliveryIndex, this.lastScheduledIndex, scheduledIndex);
549
+ }
550
+ completeFireCore(shouldContinue) {
551
+ this.deliveryIndex += 1n;
552
+ this.lastScheduledIndex = this.pendingScheduledIndex;
553
+ this.pendingScheduledIndex = undefined;
554
+ this.running = undefined;
399
555
  if (!shouldContinue) {
400
556
  this.disposed = true;
401
557
  return;
@@ -427,8 +583,37 @@ class ZLinkManagedTimer {
427
583
  }
428
584
  }
429
585
  exports.ZLinkManagedTimer = ZLinkManagedTimer;
430
- function startOutsideStateLane(work) {
431
- return detachedTimerStateLaneResource.runInAsyncScope(work);
586
+ function validateRelocationCursor(name, periodMs, state) {
587
+ if (state.name !== name ||
588
+ state.periodMs !== periodMs ||
589
+ !Number.isSafeInteger(state.startedAtUnixMs) ||
590
+ state.deliveryIndex < 0n ||
591
+ state.lastScheduledIndex < 0n ||
592
+ !Number.isSafeInteger(state.nextDueAtUnixMs) ||
593
+ state.nextDueAtUnixMs !==
594
+ state.startedAtUnixMs + Number(state.lastScheduledIndex + 1n) * state.periodMs ||
595
+ state.pendingTicks.length > 1 ||
596
+ state.pendingTicks.some((pending) => {
597
+ const expected = relocationPendingTick(state.startedAtUnixMs, state.periodMs, state.deliveryIndex, state.lastScheduledIndex, pending.scheduledIndex);
598
+ return (pending.scheduledIndex <= state.lastScheduledIndex ||
599
+ pending.deliveryIndex !== expected.deliveryIndex ||
600
+ pending.scheduledAtUnixMs !== expected.scheduledAtUnixMs ||
601
+ pending.skippedTicks !== expected.skippedTicks);
602
+ })) {
603
+ throw new Error(`Timer '${name}' relocation state is invalid.`);
604
+ }
605
+ }
606
+ /**
607
+ * Spot timer §1: the tick info that follows the completed cursor. A timer holds
608
+ * at most one pending tick, so its DeliveryIndex is the next one.
609
+ */
610
+ function relocationPendingTick(startedAtUnixMs, periodMs, deliveryIndex, lastScheduledIndex, scheduledIndex) {
611
+ return {
612
+ deliveryIndex: deliveryIndex + 1n,
613
+ scheduledIndex,
614
+ scheduledAtUnixMs: startedAtUnixMs + Number(scheduledIndex) * periodMs,
615
+ skippedTicks: scheduledIndex - lastScheduledIndex - 1n
616
+ };
432
617
  }
433
618
  function createTimerDiagnostics(sourceName, spotId, isEntrySpot, timerName, handlerType, publisher) {
434
619
  if (publisher === undefined) {
@@ -1,3 +1,14 @@
1
+ import type { RoutingId } from '../../contracts';
2
+ import { type ServiceSessionRelocationRoute, type ServiceSessionRelocationSeal, type ServiceSessionRelocationSealed } from '../foundation/service-stateful-wire-codec';
3
+ export interface ZLinkPreparedSessionRelocationSeal {
4
+ readonly response: ServiceSessionRelocationSealed;
5
+ readonly ready: Promise<void>;
6
+ }
7
+ interface SessionRelocationResult extends ZLinkPreparedSessionRelocationSeal {
8
+ readonly key: string;
9
+ readonly fingerprint: string;
10
+ readonly seal?: ZLinkActorSessionRelocationState;
11
+ }
1
12
  export declare const DEFAULT_TERMINAL_RELOCATION_CAPACITY = 4096;
2
13
  export interface ZLinkActorSessionBindingActor {
3
14
  readonly actorId: string;
@@ -7,7 +18,7 @@ export interface ZLinkActorSessionBindingActor {
7
18
  };
8
19
  }
9
20
  export interface ZLinkActorSessionBindingContext<TActor extends ZLinkActorSessionBindingActor> {
10
- readonly routingId?: unknown;
21
+ readonly routingId?: RoutingId;
11
22
  readonly actorSlotControls?: {
12
23
  enqueueBound(actorSlot: number, actorId: string): Promise<void>;
13
24
  enqueueUnbound(actorSlot: number): Promise<void>;
@@ -20,17 +31,18 @@ export interface ZLinkActorSessionRoute<TContext extends ZLinkActorSessionBindin
20
31
  readonly actor: TActor;
21
32
  readonly bindingToken: string;
22
33
  readonly actorSlot?: number;
23
- readonly sessionIdentity?: string;
34
+ readonly sessionIdentity?: RoutingId;
24
35
  readonly activeFrames: ZLinkActorSessionActiveFrames;
25
36
  sealId?: string;
37
+ sessionRelocationResult?: SessionRelocationResult;
26
38
  authorityFence?: ZLinkActorSessionAuthorityFence;
27
39
  }
28
40
  export interface ZLinkActorSessionRelocationClaim {
29
41
  readonly actorId: string;
30
42
  readonly actorGeneration: bigint;
31
43
  readonly bindingGeneration: bigint;
32
- readonly sessionIdentity?: string;
33
- readonly actorNodeRid?: string;
44
+ readonly sessionIdentity?: RoutingId;
45
+ readonly actorNodeRid?: RoutingId;
34
46
  readonly actorNodeGeneration?: bigint;
35
47
  readonly sealId: string;
36
48
  }
@@ -57,6 +69,21 @@ interface ZLinkActorSessionActiveFrames {
57
69
  captureBySeal(): void;
58
70
  }>;
59
71
  }
72
+ interface ZLinkActorSessionRelocationState {
73
+ readonly actorId: string;
74
+ readonly actorGeneration: bigint;
75
+ readonly bindingGeneration: bigint;
76
+ readonly sessionIdentity?: RoutingId;
77
+ readonly actorNodeRid?: RoutingId;
78
+ readonly actorNodeGeneration?: bigint;
79
+ readonly sealId: string;
80
+ phase: 'sealed' | 'applying' | 'applied' | 'terminal';
81
+ applyFingerprint?: string;
82
+ applyPromise?: Promise<void>;
83
+ readonly ready: Promise<void>;
84
+ readonly terminal: Promise<void>;
85
+ readonly resolveTerminal: () => void;
86
+ }
60
87
  export interface ZLinkActorSessionAuthorityFence {
61
88
  readonly authorityOwnerGeneration: bigint;
62
89
  readonly ownerLeaseGeneration: bigint;
@@ -79,21 +106,22 @@ export declare class ZLinkActorSessionBindingRegistry<TContext extends ZLinkActo
79
106
  private readonly sealWaiters;
80
107
  private readonly activeFrameWaiters;
81
108
  private readonly relocations;
109
+ private readonly absentSessionRelocationResults;
82
110
  private readonly terminalRelocations;
83
111
  constructor(terminalRelocationCapacity?: number, sealWaitTimeoutMs?: number, errorSink?: (() => {
84
112
  reportRuntimeTaskException(taskName: string, error: unknown): void;
85
113
  } | undefined) | undefined);
86
- bind(context: TContext, actor: TActor, bindingToken: string, authorityFence?: ZLinkActorSessionAuthorityFence, sessionIdentity?: string, commitActor?: () => void): Promise<void>;
114
+ bind(context: TContext, actor: TActor, bindingToken: string, authorityFence?: ZLinkActorSessionAuthorityFence, sessionIdentity?: RoutingId, commitActor?: () => void): Promise<void>;
87
115
  private commitCore;
88
116
  private issueActorSlot;
89
- replace(previous: ZLinkActorSessionRoute<TContext, TActor>, context: TContext, actor: TActor, bindingToken: string, authorityFence?: ZLinkActorSessionAuthorityFence, sessionIdentity?: string, commitActor?: () => void): Promise<void>;
90
- replaceAndReleaseSeal(previous: ZLinkActorSessionRoute<TContext, TActor>, context: TContext, actor: TActor, bindingToken: string, sealId: string, authorityFence?: ZLinkActorSessionAuthorityFence, sessionIdentity?: string, commitActor?: () => void): Promise<void>;
117
+ replace(previous: ZLinkActorSessionRoute<TContext, TActor>, context: TContext, actor: TActor, bindingToken: string, authorityFence?: ZLinkActorSessionAuthorityFence, sessionIdentity?: RoutingId, commitActor?: () => void): Promise<void>;
118
+ replaceAndReleaseSeal(previous: ZLinkActorSessionRoute<TContext, TActor>, context: TContext, actor: TActor, bindingToken: string, sealId: string, authorityFence?: ZLinkActorSessionAuthorityFence, sessionIdentity?: RoutingId, commitActor?: () => void): Promise<void>;
91
119
  private replaceAndReleaseSealCore;
92
120
  find(actorId: string): Promise<TActor | undefined>;
93
121
  private findCore;
94
122
  route(actorId: string): Promise<ZLinkActorSessionRoute<TContext, TActor> | undefined>;
95
123
  /** Selects the route only when it is the exact Session binding (§8.1 validation values). */
96
- routeForSessionBinding(actorId: string, sessionRid: string, bindingGeneration?: bigint): Promise<ZLinkActorSessionRoute<TContext, TActor> | undefined>;
124
+ routeForSessionBinding(actorId: string, sessionRid: RoutingId, bindingGeneration?: bigint): Promise<ZLinkActorSessionRoute<TContext, TActor> | undefined>;
97
125
  private routeCore;
98
126
  capturePendingReplyClaim(actorId: string, actor: ZLinkActorSessionBindingActor, bindingToken: string): Promise<{
99
127
  readonly context: TContext;
@@ -131,11 +159,16 @@ export declare class ZLinkActorSessionBindingRegistry<TContext extends ZLinkActo
131
159
  seal(actorId: string, sealId: string, expected: ZLinkActorSessionRouteFence): Promise<void>;
132
160
  private sealCore;
133
161
  sealAndWait(actorId: string, sealId: string, expected: ZLinkActorSessionRouteFence, signal?: AbortSignal): Promise<void>;
162
+ prepareSessionRelocationSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal): Promise<ZLinkPreparedSessionRelocationSeal | undefined>;
163
+ private prepareSessionRelocationSealCore;
164
+ acceptSessionRelocationRoute(value: ServiceSessionRelocationRoute, apply: () => Promise<void>): Promise<boolean>;
165
+ clearSessionRelocationResults(): Promise<void>;
134
166
  sealRelocation(claim: ZLinkActorSessionRelocationClaim, expected: ZLinkActorSessionRouteFence, signal?: AbortSignal): Promise<void>;
135
167
  private prepareRelocationSeal;
136
168
  relocationSnapshot(actorId: string, sealId: string): Promise<ZLinkActorSessionRelocationSnapshot | undefined>;
137
169
  private relocationSnapshotCore;
138
170
  applyRelocation(actorId: string, sealId: string, applyFingerprint: string, commitOwnerTransition: () => Promise<void>): Promise<void>;
171
+ private runRelocationApply;
139
172
  private prepareRelocationApply;
140
173
  private completeRelocationApply;
141
174
  private failRelocationApply;
@@ -149,7 +182,7 @@ export declare class ZLinkActorSessionBindingRegistry<TContext extends ZLinkActo
149
182
  * single physical route's disconnect, which must not disturb a relocation
150
183
  * seal it does not own (see `clearRouteRelocation`).
151
184
  */
152
- clearRelocation(actorId: string, error: unknown): Promise<void>;
185
+ clearRelocation(actorId: string, error: unknown, sealId?: string): Promise<void>;
153
186
  private clearRelocationCore;
154
187
  /**
155
188
  * Spec 48 §137: a relocation seal's lifecycle is independent of any single
@@ -165,8 +198,6 @@ export declare class ZLinkActorSessionBindingRegistry<TContext extends ZLinkActo
165
198
  private clearRouteRelocation;
166
199
  abortSeal(actorId: string, sealId: string): Promise<boolean>;
167
200
  private abortSealCore;
168
- updateAuthorityFence(actorId: string, authorityFence: ZLinkActorSessionAuthorityFence): Promise<void>;
169
- private updateAuthorityFenceCore;
170
201
  validateSeal(actorId: string, sealId: string): Promise<boolean>;
171
202
  private validateSealCore;
172
203
  /** True while a relocation seal currently holds this actor's ingress. */