@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
@@ -22,14 +22,25 @@ export declare class ServiceLivenessConnection {
22
22
  tryGetProbe(nowMs: number, allocateProbeId: () => bigint): bigint | undefined;
23
23
  acknowledge(probeId: bigint, nowMs: number): boolean;
24
24
  }
25
- /** Uses monotonic milliseconds and never treats application traffic as a probe ACK. */
26
25
  export declare class ServiceLivenessRegistry {
27
26
  private readonly probeIntervalMs;
28
27
  private readonly peerTimeoutMs;
29
28
  private readonly peers;
30
29
  private nextProbeId;
30
+ /**
31
+ * The earliest probe or timeout among admitted peers. Received traffic only
32
+ * extends a peer's deadline, so this stays a lower bound between ticks.
33
+ */
34
+ private nextDueMs;
35
+ private admissionActivityMs?;
31
36
  constructor(probeIntervalMs?: number, peerTimeoutMs?: number);
32
37
  admit(nodeRoutingId: string, connectionId: string | bigint, nowMs: number): ServiceLivenessConnection;
38
+ /** When the next tick has probe or timeout work (spec 08 §4.2 management deadline). */
39
+ nextDeadlineMs(): number;
40
+ /** Pending admission shares the existing liveness management cadence (MeshNode §7.1). */
41
+ setAdmissionPending(pending: boolean, nowMs: number): void;
42
+ private nextAdmissionDeadlineMs;
43
+ tickAdmission(nowMs: number): boolean;
33
44
  recordReceived(connection: ServiceLivenessConnection, nowMs: number): void;
34
45
  disconnect(nodeRoutingId: string, connectionId: string | bigint): boolean;
35
46
  acknowledge(nodeRoutingId: string, connectionId: string | bigint, probeId: bigint, nowMs: number): boolean;
@@ -43,11 +43,21 @@ class ServiceLivenessConnection {
43
43
  }
44
44
  exports.ServiceLivenessConnection = ServiceLivenessConnection;
45
45
  /** Uses monotonic milliseconds and never treats application traffic as a probe ACK. */
46
+ const NO_LIVENESS_WORK = Object.freeze({
47
+ probes: Object.freeze([]),
48
+ timedOutNodes: Object.freeze([])
49
+ });
46
50
  class ServiceLivenessRegistry {
47
51
  probeIntervalMs;
48
52
  peerTimeoutMs;
49
53
  peers = new Map();
50
54
  nextProbeId = 1n;
55
+ /**
56
+ * The earliest probe or timeout among admitted peers. Received traffic only
57
+ * extends a peer's deadline, so this stays a lower bound between ticks.
58
+ */
59
+ nextDueMs = Number.POSITIVE_INFINITY;
60
+ admissionActivityMs;
51
61
  constructor(probeIntervalMs = exports.DEFAULT_SERVICE_PROBE_INTERVAL_MS, peerTimeoutMs = exports.DEFAULT_SERVICE_PEER_TIMEOUT_MS) {
52
62
  this.probeIntervalMs = probeIntervalMs;
53
63
  this.peerTimeoutMs = peerTimeoutMs;
@@ -69,8 +79,31 @@ class ServiceLivenessRegistry {
69
79
  return current;
70
80
  const admitted = new ServiceLivenessConnection(connectionId, nowMs, this.probeIntervalMs, this.peerTimeoutMs);
71
81
  this.peers.set(nodeRoutingId, admitted);
82
+ this.nextDueMs = Math.min(this.nextDueMs, admitted.nextProbeMs, admitted.deadlineMs);
72
83
  return admitted;
73
84
  }
85
+ /** When the next tick has probe or timeout work (spec 08 §4.2 management deadline). */
86
+ nextDeadlineMs() {
87
+ return Math.min(this.nextDueMs, this.nextAdmissionDeadlineMs());
88
+ }
89
+ /** Pending admission shares the existing liveness management cadence (MeshNode §7.1). */
90
+ setAdmissionPending(pending, nowMs) {
91
+ if (pending)
92
+ this.admissionActivityMs ??= nowMs;
93
+ else
94
+ this.admissionActivityMs = undefined;
95
+ }
96
+ nextAdmissionDeadlineMs() {
97
+ return this.admissionActivityMs === undefined
98
+ ? Number.POSITIVE_INFINITY
99
+ : this.admissionActivityMs + this.probeIntervalMs;
100
+ }
101
+ tickAdmission(nowMs) {
102
+ if (nowMs < this.nextAdmissionDeadlineMs())
103
+ return false;
104
+ this.admissionActivityMs = nowMs;
105
+ return true;
106
+ }
74
107
  recordReceived(connection, nowMs) {
75
108
  connection.recordReceived(nowMs);
76
109
  }
@@ -95,8 +128,11 @@ class ServiceLivenessRegistry {
95
128
  return { nodeRoutingId, connectionId, probeId };
96
129
  }
97
130
  tick(nowMs) {
131
+ if (nowMs < this.nextDeadlineMs())
132
+ return NO_LIVENESS_WORK;
98
133
  const probes = [];
99
134
  const timedOutNodes = [];
135
+ let nextDueMs = Number.POSITIVE_INFINITY;
100
136
  for (const [nodeRoutingId, peer] of this.peers) {
101
137
  if (peer.isExpired(nowMs)) {
102
138
  timedOutNodes.push(nodeRoutingId);
@@ -106,7 +142,9 @@ class ServiceLivenessRegistry {
106
142
  const probeId = peer.tryGetProbe(nowMs, this.allocateProbeId);
107
143
  if (probeId !== undefined)
108
144
  probes.push({ nodeRoutingId, connectionId: peer.connectionId, probeId });
145
+ nextDueMs = Math.min(nextDueMs, peer.nextProbeMs, peer.deadlineMs);
109
146
  }
147
+ this.nextDueMs = nextDueMs;
110
148
  timedOutNodes.sort();
111
149
  return { probes, timedOutNodes };
112
150
  }
@@ -1,11 +1,18 @@
1
1
  import type { ApplicationJobRecordLease } from '../application-jobs/application-ingress-record-owner';
2
2
  import type { ReceiveRecord } from './service-runtime-contracts';
3
+ import type { RawServiceIngressRecord } from './raw-service-mesh-runtime';
3
4
  export type ServiceMailboxDomain = 'application' | 'infrastructure';
5
+ export interface ServiceMailboxDispatchOwner {
6
+ prepareDispatch(record: ServiceMailboxRecord, signal: AbortSignal): boolean | Promise<boolean>;
7
+ }
4
8
  export interface ServiceMailboxRecord {
9
+ readonly sourcePreparationOwner?: ServiceMailboxDispatchOwner;
10
+ readonly ingress?: RawServiceIngressRecord;
5
11
  readonly owner: string;
6
12
  readonly domain: ServiceMailboxDomain;
7
13
  parts: readonly Uint8Array[];
8
14
  readonly sourceRoutingId?: string;
15
+ readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
9
16
  readonly sourceRoute?: Uint8Array;
10
17
  readonly requestSequence?: bigint;
11
18
  readonly reply?: (parts: readonly Uint8Array[]) => void;
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ServiceMaintenanceRuntime = void 0;
4
- const node_async_hooks_1 = require("node:async_hooks");
5
4
  const state_lane_1 = require("../execution/state-lane");
6
- const detachedStateLaneResource = new node_async_hooks_1.AsyncResource('zlink:service-maintenance-runtime');
7
5
  /** Owns first-intent-wins maintenance admission and terminal observation. */
8
6
  class ServiceMaintenanceRuntime {
9
7
  options;
@@ -156,7 +154,7 @@ class ServiceMaintenanceRuntime {
156
154
  continue;
157
155
  admitted = true;
158
156
  let running;
159
- running = startOutsideStateLane(() => unit
157
+ running = (0, state_lane_1.startOutsideStateLane)(() => unit
160
158
  .relocate(signal)
161
159
  .catch((error) => {
162
160
  failures.push(error);
@@ -206,6 +204,3 @@ class ServiceMaintenanceRuntime {
206
204
  }
207
205
  }
208
206
  exports.ServiceMaintenanceRuntime = ServiceMaintenanceRuntime;
209
- function startOutsideStateLane(work) {
210
- return detachedStateLaneResource.runInAsyncScope(work);
211
- }
@@ -3,6 +3,7 @@ import type { ServiceRelocationRestoreOwner, ServiceRelocationStaging } from './
3
3
  import type { ServiceRelocationEnvelope, ServiceRelocationMembership, ServiceRelocationParticipant, ServiceRelocationQueuedMessage, ServiceRelocationTimer } from './service-relocation-runtime';
4
4
  export interface ServiceRelocationSealedWork {
5
5
  readonly boundSessionState: Uint8Array;
6
+ readonly sessionBinding?: ServiceRelocationParticipant['sessionBinding'];
6
7
  readonly queuedMessages: readonly ServiceRelocationQueuedMessage[];
7
8
  readonly timers: readonly ServiceRelocationTimer[];
8
9
  }
@@ -14,7 +15,7 @@ export interface ServiceRelocationCaptureUnit {
14
15
  readonly authorityOwnerGeneration: bigint;
15
16
  seal(signal?: AbortSignal): Promise<ServiceRelocationSealedWork>;
16
17
  captureApplicationState(signal?: AbortSignal): Promise<Uint8Array>;
17
- commitSeal(): Promise<void> | void;
18
+ commitSeal(followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>): Promise<void> | void;
18
19
  abortSeal(): Promise<void> | void;
19
20
  /** Expired-owner terminal: pending requests fail once and dispatch stays closed. */
20
21
  discardSeal?(reason: unknown): Promise<void> | void;
@@ -24,7 +25,7 @@ export declare class ServiceCapturedObjectRelocation {
24
25
  private readonly units;
25
26
  private terminal;
26
27
  constructor(envelope: ServiceRelocationEnvelope, units: readonly ServiceRelocationCaptureUnit[]);
27
- commitSource(): Promise<void>;
28
+ commitSource(followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>): Promise<void>;
28
29
  abortSource(): Promise<void>;
29
30
  /**
30
31
  * The source owner lease ended before the authority settled (spec 28 §4.4):
@@ -52,7 +53,6 @@ export interface ServiceRelocationTargetObjectPort<THidden extends ServiceReloca
52
53
  publish(hidden: THidden, authority: ZLinkAuthoritySnapshot, signal?: AbortSignal): Promise<void>;
53
54
  restoreBoundSession(hidden: THidden, payload: Uint8Array, signal?: AbortSignal): Promise<void>;
54
55
  replayQueuedMessage(hidden: THidden, message: ServiceRelocationQueuedMessage, signal?: AbortSignal): Promise<void>;
55
- restoreTimer(hidden: THidden, timer: ServiceRelocationTimer, signal?: AbortSignal): Promise<void>;
56
56
  normalize(hidden: THidden, authority: ZLinkAuthoritySnapshot, signal?: AbortSignal): Promise<void>;
57
57
  openAdmission(hidden: THidden, signal?: AbortSignal): Promise<void>;
58
58
  abort(hidden: THidden): Promise<void> | void;
@@ -10,14 +10,14 @@ class ServiceCapturedObjectRelocation {
10
10
  this.envelope = envelope;
11
11
  this.units = units;
12
12
  }
13
- async commitSource() {
13
+ async commitSource(followAuthorities) {
14
14
  if (this.terminal === 'committed')
15
15
  return;
16
16
  if (this.terminal !== 'open') {
17
17
  throw new Error(`Relocation source capture was already ${this.terminal}.`);
18
18
  }
19
19
  for (const unit of this.units)
20
- await unit.commitSeal();
20
+ await unit.commitSeal(followAuthorities);
21
21
  this.terminal = 'committed';
22
22
  }
23
23
  async abortSource() {
@@ -26,18 +26,11 @@ class ServiceCapturedObjectRelocation {
26
26
  if (this.terminal !== 'open') {
27
27
  throw new Error(`A ${this.terminal} relocation source capture cannot be aborted.`);
28
28
  }
29
- const failures = [];
30
- for (const unit of [...this.units].reverse()) {
31
- try {
32
- await unit.abortSeal();
33
- }
34
- catch (error) {
35
- failures.push(error);
36
- }
29
+ try {
30
+ await abortSourceSeals(this.units);
37
31
  }
38
- this.terminal = 'aborted';
39
- if (failures.length !== 0) {
40
- throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
32
+ finally {
33
+ this.terminal = 'aborted';
41
34
  }
42
35
  }
43
36
  /**
@@ -91,23 +84,29 @@ class ServiceRelocationObjectCaptureOwner {
91
84
  try {
92
85
  for (const unit of units) {
93
86
  signal?.throwIfAborted();
94
- const work = await unit.seal(signal);
95
- captured.push({ unit, work });
87
+ const capture = { unit };
88
+ captured.push(capture);
89
+ capture.work = await unit.seal(signal);
96
90
  }
97
- const participants = await mapConcurrentOrdered(captured, this.maxConcurrentCallbacks, async ({ unit, work }) => ({
98
- key: unit.authorityKey,
99
- objectKind: unit.objectKind,
100
- stableType: unit.stableType,
101
- objectGeneration: unit.objectGeneration,
102
- authorityOwnerGeneration: unit.authorityOwnerGeneration,
103
- applicationState: Buffer.from(await unit.captureApplicationState(signal)),
104
- boundSessionState: Buffer.from(work.boundSessionState),
105
- queuedMessages: work.queuedMessages.map((message) => ({
106
- sequence: message.sequence,
107
- payload: Buffer.from(message.payload)
108
- })),
109
- timers: work.timers.map((timer) => ({ ...timer }))
110
- }), signal);
91
+ const participants = await mapConcurrentOrdered(captured, this.maxConcurrentCallbacks, async ({ unit, work: sealedWork }) => {
92
+ // Application capture starts only after every seal completed.
93
+ const work = sealedWork;
94
+ return {
95
+ key: unit.authorityKey,
96
+ objectKind: unit.objectKind,
97
+ stableType: unit.stableType,
98
+ objectGeneration: unit.objectGeneration,
99
+ authorityOwnerGeneration: unit.authorityOwnerGeneration,
100
+ applicationState: Buffer.from(await unit.captureApplicationState(signal)),
101
+ boundSessionState: Buffer.from(work.boundSessionState),
102
+ ...(work.sessionBinding === undefined ? {} : { sessionBinding: work.sessionBinding }),
103
+ queuedMessages: work.queuedMessages.map((message) => ({
104
+ sequence: message.sequence,
105
+ payload: Buffer.from(message.payload)
106
+ })),
107
+ timers: work.timers.map((timer) => ({ ...timer }))
108
+ };
109
+ }, signal);
111
110
  return new ServiceCapturedObjectRelocation({
112
111
  aggregateId,
113
112
  aggregateGeneration,
@@ -116,13 +115,31 @@ class ServiceRelocationObjectCaptureOwner {
116
115
  }, units);
117
116
  }
118
117
  catch (error) {
119
- for (const { unit } of captured.reverse())
120
- await unit.abortSeal();
118
+ try {
119
+ await abortSourceSeals(captured.map(({ unit }) => unit));
120
+ }
121
+ catch (rollbackError) {
122
+ throw new AggregateError([error, rollbackError], 'Relocation capture failed and source rollback was incomplete.');
123
+ }
121
124
  throw error;
122
125
  }
123
126
  }
124
127
  }
125
128
  exports.ServiceRelocationObjectCaptureOwner = ServiceRelocationObjectCaptureOwner;
129
+ async function abortSourceSeals(units) {
130
+ const failures = [];
131
+ for (const unit of [...units].reverse()) {
132
+ try {
133
+ await unit.abortSeal();
134
+ }
135
+ catch (error) {
136
+ failures.push(error);
137
+ }
138
+ }
139
+ if (failures.length !== 0) {
140
+ throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
141
+ }
142
+ }
126
143
  /** Restores an exact User Spot aggregate or standalone Actor into hidden objects. */
127
144
  class ServiceRelocationObjectRestoreOwner {
128
145
  target;
@@ -182,9 +199,6 @@ class ServiceRelocationObjectRestoreOwner {
182
199
  for (const message of participant.queuedMessages) {
183
200
  await this.target.replayQueuedMessage(hidden, message, signal);
184
201
  }
185
- for (const timer of participant.timers) {
186
- await this.target.restoreTimer(hidden, timer, signal);
187
- }
188
202
  }
189
203
  }
190
204
  /** Appends one post-capture relay to the already restored temporary queue. */
@@ -1,4 +1,5 @@
1
1
  import type { ZLinkPlacementObjectKind } from '../locations/internal-location-contracts';
2
+ import { type RelocationEnvelopeV1 as GeneratedRelocationEnvelopeV1 } from '../protocol/service_wire_pilot_codec.generated';
2
3
  export interface ServiceRelocationParticipant {
3
4
  /** Wire-local participant ordinal; identity is projected from Location Store. */
4
5
  readonly participantId?: bigint;
@@ -17,6 +18,7 @@ export interface ServiceRelocationParticipant {
17
18
  readonly applicationStatePresent?: boolean;
18
19
  readonly applicationState: Uint8Array;
19
20
  readonly boundSessionState: Uint8Array;
21
+ readonly sessionBinding?: GeneratedRelocationEnvelopeV1['sessionBindings'][number];
20
22
  readonly queuedMessages: readonly ServiceRelocationQueuedMessage[];
21
23
  readonly timers: readonly ServiceRelocationTimer[];
22
24
  }
@@ -480,6 +480,9 @@ function encodeServiceRelocationEnvelope(envelope, applicationVersion) {
480
480
  lastCompletedScheduledIndex: nonNegativeBigInt(timer.lastScheduledIndex, 'timer scheduled index'),
481
481
  nextScheduledAtUnixMilliseconds: nonNegativeUnixMilliseconds(timer.dueAtUnixMs, 'timer due time')
482
482
  })),
483
+ sessionBindings: participants.flatMap((participant, index) => participant.sessionBinding === undefined
484
+ ? []
485
+ : [{ ...participant.sessionBinding, participantId: BigInt(index + 1) }]),
483
486
  pendingTimerTicks: pending.map((value) => ({
484
487
  participantId: value.participantId,
485
488
  order: value.order,
@@ -510,11 +513,20 @@ function decodeServiceRelocationEnvelope(payload, aggregateGeneration) {
510
513
  if (aggregateId === undefined)
511
514
  throw new TypeError('Invalid relocation identity.');
512
515
  positiveBigInt(aggregateGeneration, 'aggregate generation');
516
+ const bindings = new Map(generated.sessionBindings.map((binding) => [binding.participantId, binding]));
517
+ for (const id of bindings.keys()) {
518
+ if (id > BigInt(generated.applicationStates.length))
519
+ throw new TypeError('Session binding participant is outside its inventory.');
520
+ }
513
521
  const participants = generated.applicationStates.map((state, index) => {
514
522
  if (state.participantId !== BigInt(index + 1)) {
515
523
  throw new TypeError('Application state participant order is invalid.');
516
524
  }
517
- return wireParticipant(state.participantId, state.hasState, Buffer.from(state.payload));
525
+ const binding = bindings.get(state.participantId);
526
+ return {
527
+ ...wireParticipant(state.participantId, state.hasState, Buffer.from(state.payload)),
528
+ ...(binding === undefined ? {} : { sessionBinding: binding })
529
+ };
518
530
  });
519
531
  const byId = new Map(participants.map((value) => [value.participantId, value]));
520
532
  for (const work of generated.savedWork) {
@@ -524,12 +536,16 @@ function decodeServiceRelocationEnvelope(payload, aggregateGeneration) {
524
536
  });
525
537
  }
526
538
  for (const timer of generated.timerRegistrations) {
539
+ const dueAtUnixMs = unixMilliseconds(timer.nextScheduledAtUnixMilliseconds);
540
+ const intervalMs = unixMilliseconds(timer.periodMilliseconds);
527
541
  byId.get(timer.participantId).timers.push({
528
542
  timerId: timer.name,
529
543
  handlerType: timer.handlerType,
530
- startedAtUnixMs: 0,
531
- dueAtUnixMs: unixMilliseconds(timer.nextScheduledAtUnixMilliseconds),
532
- intervalMs: unixMilliseconds(timer.periodMilliseconds),
544
+ // The wire anchors the nominal schedule by its next due time: the next
545
+ // nominal tick after the completed ScheduledIndex (Spot timer §1).
546
+ startedAtUnixMs: dueAtUnixMs - Number(timer.lastCompletedScheduledIndex + 1n) * intervalMs,
547
+ dueAtUnixMs,
548
+ intervalMs,
533
549
  overrunPolicy: timerPolicyName(timer.overrunPolicy),
534
550
  maxCatchUpTicks: unixMilliseconds(timer.maxCatchUpTicks),
535
551
  stopOnUnhandledException: timer.stopOnUnhandledException,
@@ -205,11 +205,18 @@ export interface ReceiveRequirements {
205
205
  readonly byteCount: number;
206
206
  }
207
207
  export interface ZLinkMessageFollowOrigin {
208
+ readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
208
209
  readonly sourceNodeRid: RoutingId;
209
210
  readonly originalOperation: MeshOperationId;
210
211
  readonly originalReplyRouteId: bigint;
212
+ /** The canonical target accepted with the original native Actor frame. */
213
+ readonly target?: import('./service-stateful-wire-codec').ServiceActorRouteFence;
211
214
  }
212
215
  export interface ReceiveRecord {
216
+ /** Resolve record prerequisites in owner order, outside an application handler turn. */
217
+ readonly prepareDispatch?: (this: ReceiveRecord, signal: AbortSignal) => boolean | Promise<boolean>;
218
+ readonly statefulMailboxRecord?: import('./service-mailbox').ServiceMailboxRecord;
219
+ readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
213
220
  readonly kind: number;
214
221
  readonly domain: number;
215
222
  readonly sourceNodeRid: RoutingId | null;
@@ -314,7 +321,7 @@ export interface StreamSessionService {
314
321
  close(): void;
315
322
  status(): StreamSessionStatus;
316
323
  lookupActor(targetNodeRid: RoutingId, actorId: string, timeoutMs?: number): MeshOperationId;
317
- bindActor(sessionRid: RoutingId, actor: ServiceActorRef, timeoutMs?: number, onBindingReplaced?: (actorId: string, retiredSession: ServiceRetiredBoundSessionRouteFence, actor: ServiceActorRef) => void, actorAuthority?: StreamSessionActorAuthorityFence): MeshOperationId;
324
+ bindActor(sessionRid: RoutingId, actor: ServiceActorRef, timeoutMs?: number, onBindingReplaced?: (actorId: string, retiredSession: ServiceRetiredBoundSessionRouteFence, actor: ServiceActorRef) => void, actorAuthority?: StreamSessionActorAuthorityFence, close?: () => Promise<void>): MeshOperationId;
318
325
  unbindActor(sessionRid: RoutingId, actor: ServiceActorRef, expectedBindingGeneration: bigint, timeoutMs?: number): MeshOperationId;
319
326
  bindings(sessionRid: RoutingId): ReadonlyArray<ServiceStreamSessionBinding>;
320
327
  sendToActor(sessionRid: RoutingId, actor: ServiceActorRef, parts: MessageLike | readonly MessageLike[], options?: {
@@ -343,6 +350,7 @@ export interface ServiceSpot {
343
350
  flags?: number;
344
351
  timeoutMs?: number;
345
352
  applicationMetadata?: Buffer;
353
+ onAdmitted?: () => void;
346
354
  }): MeshOperationId;
347
355
  sendToSpot(targetNodeRid: unknown, targetSpotId: unknown, targetSpotGeneration: bigint, parts: MessageLike | readonly MessageLike[], options?: {
348
356
  flags?: number;
@@ -354,6 +362,7 @@ export interface ServiceSpot {
354
362
  timeoutMs?: number;
355
363
  applicationMetadata?: Buffer;
356
364
  routeFence?: ServiceDirectSpotRouteFence;
365
+ onAdmitted?: () => void;
357
366
  entrySpot?: boolean;
358
367
  }): MeshOperationId;
359
368
  publish(channelName: string, topic: string, parts: MessageLike | readonly MessageLike[], options?: {
@@ -1,5 +1,6 @@
1
+ import type { RoutingId } from '../../contracts';
1
2
  export interface ServiceSessionBindingIngressPort {
2
- actorSlot(actorId: string, sessionRid: string): Promise<number | undefined>;
3
+ actorSlot(actorId: string, sessionRid: RoutingId): Promise<number | undefined>;
3
4
  }
4
5
  export declare function registerServiceSessionBindingIngressPort(service: object, port: ServiceSessionBindingIngressPort): void;
5
6
  export declare function serviceSessionBindingIngressPortIfRegistered(service: object): ServiceSessionBindingIngressPort | undefined;
@@ -95,7 +95,6 @@ export declare class ServiceStatefulRegistry {
95
95
  private readonly reservationAttempts;
96
96
  private readonly turns;
97
97
  private nextReservationId;
98
- private nextBindingGeneration;
99
98
  constructor(nodeRid: string, nodeGeneration: bigint);
100
99
  createEntrySpot(spotId?: string): ServiceSpotState;
101
100
  private createEntrySpotCore;
@@ -117,8 +116,7 @@ export declare class ServiceStatefulRegistry {
117
116
  private joinActorCore;
118
117
  leaveActor(actor: ServiceActorRef, expectedMembershipEpoch: bigint): ServiceMembershipTransition;
119
118
  destroyActor(actor: ServiceActorRef): ServiceActorState;
120
- bindSession(actor: ServiceActorRef, sessionRid: string, sessionOwnerNodeRid: string, sessionOwnerNodeGeneration?: bigint, sessionOwnerId?: string, sessionOwnerLeaseGeneration?: bigint): ServiceSessionBinding;
121
- installSessionBinding(binding: ServiceSessionBinding): void;
119
+ installSessionBinding(binding: ServiceSessionBinding): ServiceSessionBinding;
122
120
  binding(actor: ServiceActorRef): ServiceSessionBinding | undefined;
123
121
  private bindingCore;
124
122
  unbindSession(actor: ServiceActorRef, expectedBindingGeneration: bigint, expectedSessionRid?: string, expectedSessionOwnerNodeRid?: string): boolean;
@@ -129,17 +127,20 @@ export declare class ServiceStatefulRegistry {
129
127
  runTurn<T>(owner: string, work: () => T | Promise<T>): Promise<T>;
130
128
  private updateBindingMembership;
131
129
  }
130
+ export declare const RELOCATION_REPLY_RETENTION_MS: number;
132
131
  export declare class ServiceTerminalOperationRegistry<T, Context = unknown> {
133
132
  private readonly operations;
134
133
  constructor(operations?: OperationRegistry<T, Context>);
135
134
  register(timeoutMs: number, timeoutOwner?: 'registry' | 'sender', context?: Context): PendingOperation<T>;
136
- reply(id: bigint, value: T): boolean;
135
+ reply(id: bigint, value: T, terminalContextRetentionMs?: number): boolean;
137
136
  fail(id: bigint, error: unknown): boolean;
138
137
  cancel(id: bigint): boolean;
139
138
  isPending(id: bigint): boolean;
140
139
  context(id: bigint): Context | undefined;
141
140
  get size(): number;
141
+ nextDeadlineMs(): number;
142
142
  expire(nowMs: number, turnDeadlineMs: number): number;
143
143
  close(): void;
144
+ failAll(reason: unknown): void;
144
145
  }
145
146
  export {};
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ServiceTerminalOperationRegistry = exports.ServiceStatefulRegistry = exports.ServiceStaleGenerationError = void 0;
3
+ exports.ServiceTerminalOperationRegistry = exports.RELOCATION_REPLY_RETENTION_MS = exports.ServiceStatefulRegistry = exports.ServiceStaleGenerationError = void 0;
4
4
  const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
5
+ const routing_id_1 = require("../routing-id");
6
+ const service_wire_binary_primitives_1 = require("./service-wire-binary-primitives");
5
7
  const operation_registry_1 = require("./operation-registry");
6
8
  class ServiceStaleGenerationError extends Error {
7
9
  objectKind;
@@ -33,7 +35,6 @@ class ServiceStatefulRegistry {
33
35
  reservationAttempts = new Map();
34
36
  turns = new Map();
35
37
  nextReservationId = 1n;
36
- nextBindingGeneration = 1n;
37
38
  constructor(nodeRid, nodeGeneration) {
38
39
  this.nodeRid = nodeRid;
39
40
  this.nodeGeneration = nodeGeneration;
@@ -238,37 +239,26 @@ class ServiceStatefulRegistry {
238
239
  this.bindings.delete(actorKey(actor));
239
240
  return current;
240
241
  }
241
- bindSession(actor, sessionRid, sessionOwnerNodeRid, sessionOwnerNodeGeneration, sessionOwnerId, sessionOwnerLeaseGeneration) {
242
- const current = this.requireActorCore(actor);
243
- requireText(sessionRid, 'sessionRid');
244
- requireText(sessionOwnerNodeRid, 'sessionOwnerNodeRid');
245
- const binding = Object.freeze({
246
- actor: Object.freeze({ ...current.ref }),
247
- sessionRid,
248
- sessionOwnerNodeRid,
249
- ...(sessionOwnerNodeGeneration === undefined ? {} : { sessionOwnerNodeGeneration }),
250
- ...(sessionOwnerId === undefined ? {} : { sessionOwnerId }),
251
- ...(sessionOwnerLeaseGeneration === undefined ? {} : { sessionOwnerLeaseGeneration }),
252
- bindingGeneration: this.nextBindingGeneration++,
253
- membershipEpoch: current.membershipEpoch
254
- });
255
- this.bindings.set(actorKey(actor), binding);
256
- return binding;
257
- }
258
242
  installSessionBinding(binding) {
259
243
  this.requireActorCore(binding.actor);
244
+ (0, service_wire_binary_primitives_1.encodeServiceWireRoutingId)(binding.sessionRid, 'sessionRid', CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES, (message) => {
245
+ throw new RangeError(message);
246
+ });
247
+ requireText(binding.sessionOwnerNodeRid, 'sessionOwnerNodeRid');
260
248
  requirePositive(binding.bindingGeneration, 'bindingGeneration');
261
249
  const current = this.bindings.get(actorKey(binding.actor));
262
250
  if (current !== undefined &&
263
251
  current.sessionOwnerNodeRid === binding.sessionOwnerNodeRid &&
264
252
  current.sessionOwnerNodeGeneration === binding.sessionOwnerNodeGeneration &&
265
- current.sessionOwnerId === binding.sessionOwnerId &&
266
- current.sessionOwnerLeaseGeneration === binding.sessionOwnerLeaseGeneration &&
267
253
  current.bindingGeneration >= binding.bindingGeneration) {
254
+ if (current.bindingGeneration === binding.bindingGeneration &&
255
+ current.sessionRid === binding.sessionRid)
256
+ return current;
268
257
  throw new ServiceStaleGenerationError('binding', binding.actor.actorId);
269
258
  }
270
- this.nextBindingGeneration = max(this.nextBindingGeneration, binding.bindingGeneration + 1n);
271
- this.bindings.set(actorKey(binding.actor), Object.freeze({ ...binding }));
259
+ const accepted = Object.freeze({ ...binding });
260
+ this.bindings.set(actorKey(binding.actor), accepted);
261
+ return accepted;
272
262
  }
273
263
  binding(actor) {
274
264
  return this.bindingCore(actor);
@@ -283,7 +273,8 @@ class ServiceStatefulRegistry {
283
273
  if (binding === undefined)
284
274
  return false;
285
275
  if (binding.bindingGeneration !== expectedBindingGeneration ||
286
- (expectedSessionRid !== undefined && binding.sessionRid !== expectedSessionRid) ||
276
+ (expectedSessionRid !== undefined &&
277
+ !(0, routing_id_1.routingIdsEqual)(binding.sessionRid, expectedSessionRid)) ||
287
278
  (expectedSessionOwnerNodeRid !== undefined &&
288
279
  binding.sessionOwnerNodeRid !== expectedSessionOwnerNodeRid)) {
289
280
  throw new ServiceStaleGenerationError('binding', actor.actorId);
@@ -425,6 +416,7 @@ function createSpotState(ref, kind, stableType, authorityOwnerGeneration) {
425
416
  return Object.freeze({ ...base, kind, stableType });
426
417
  }
427
418
  }
419
+ exports.RELOCATION_REPLY_RETENTION_MS = 24 * 60 * 60 * 1_000;
428
420
  class ServiceTerminalOperationRegistry {
429
421
  operations;
430
422
  constructor(operations = new operation_registry_1.OperationRegistry()) {
@@ -433,8 +425,8 @@ class ServiceTerminalOperationRegistry {
433
425
  register(timeoutMs, timeoutOwner = 'registry', context) {
434
426
  return this.operations.register(timeoutMs, timeoutOwner, context);
435
427
  }
436
- reply(id, value) {
437
- return this.operations.complete(id, value);
428
+ reply(id, value, terminalContextRetentionMs = 0) {
429
+ return this.operations.complete(id, value, terminalContextRetentionMs);
438
430
  }
439
431
  fail(id, error) {
440
432
  return this.operations.fail(id, error);
@@ -451,12 +443,18 @@ class ServiceTerminalOperationRegistry {
451
443
  get size() {
452
444
  return this.operations.size;
453
445
  }
446
+ nextDeadlineMs() {
447
+ return this.operations.nextDeadlineMs();
448
+ }
454
449
  expire(nowMs, turnDeadlineMs) {
455
450
  return this.operations.expire(nowMs, turnDeadlineMs);
456
451
  }
457
452
  close() {
458
453
  this.operations.close('Stateful runtime closed.');
459
454
  }
455
+ failAll(reason) {
456
+ this.operations.failAll(reason);
457
+ }
460
458
  }
461
459
  exports.ServiceTerminalOperationRegistry = ServiceTerminalOperationRegistry;
462
460
  function actorKey(actor) {