@zlink-systems/framework 0.30.3 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Actors/ZLinkActor.d.ts +2 -0
  3. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
  4. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
  5. package/dist/contracts/Actors/index.d.ts +1 -0
  6. package/dist/contracts/Actors/index.js +1 -0
  7. package/dist/contracts/Common/CoreTypes.d.ts +1 -0
  8. package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
  9. package/dist/contracts/Common/HandlerMessageType.js +41 -0
  10. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
  11. package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
  12. package/dist/contracts/Common/ZLinkMessage.js +11 -7
  13. package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
  14. package/dist/contracts/Common/encoded-payload-storage.js +4 -16
  15. package/dist/contracts/Common/index.d.ts +1 -1
  16. package/dist/contracts/Common/payload-slab.d.ts +4 -0
  17. package/dist/contracts/Common/payload-slab.js +30 -0
  18. package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
  19. package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
  20. package/dist/contracts/Handlers/Contexts.d.ts +1 -0
  21. package/dist/contracts/Locations/Authority.d.ts +2 -0
  22. package/dist/internal.d.ts +9 -0
  23. package/dist/internal.js +23 -1
  24. package/dist/nest-integration.d.ts +1 -0
  25. package/dist/nest-integration.js +3 -1
  26. package/dist/runtime/actors/actor-client.d.ts +6 -2
  27. package/dist/runtime/actors/actor-client.js +120 -82
  28. package/dist/runtime/actors/actor-context.js +16 -5
  29. package/dist/runtime/actors/actor-execution-context.js +2 -2
  30. package/dist/runtime/actors/actor-handoff.d.ts +12 -1
  31. package/dist/runtime/actors/actor-handoff.js +79 -34
  32. package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
  33. package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
  34. package/dist/runtime/actors/actor-local-native-join.js +19 -17
  35. package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
  36. package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
  37. package/dist/runtime/actors/actor-remote-joiner.js +4 -4
  38. package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
  39. package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
  40. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
  41. package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
  42. package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
  43. package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
  44. package/dist/runtime/admission.d.ts +6 -4
  45. package/dist/runtime/admission.js +21 -10
  46. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
  47. package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
  48. package/dist/runtime/backend/contracts/index.d.ts +26 -10
  49. package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
  50. package/dist/runtime/backend/mesh-completion-table.js +84 -20
  51. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
  52. package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
  53. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
  54. package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
  55. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
  56. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
  57. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  58. package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
  59. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
  60. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
  61. package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
  62. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
  63. package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
  64. package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
  65. package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
  66. package/dist/runtime/channels/channel-clients.js +3 -3
  67. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
  68. package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
  69. package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
  70. package/dist/runtime/channels/channel-dispatch-services.js +7 -6
  71. package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
  72. package/dist/runtime/channels/channel-dispatchers.js +57 -36
  73. package/dist/runtime/channels/channel-envelope.d.ts +2 -2
  74. package/dist/runtime/channels/channel-envelope.js +609 -83
  75. package/dist/runtime/channels/channel-multipart.d.ts +1 -0
  76. package/dist/runtime/channels/channel-multipart.js +10 -6
  77. package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
  78. package/dist/runtime/channels/channel-outbound-operations.js +107 -105
  79. package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
  80. package/dist/runtime/channels/channel-receive-loops.js +126 -90
  81. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
  82. package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
  83. package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
  84. package/dist/runtime/channels/channel-runtime-manager.js +32 -14
  85. package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
  86. package/dist/runtime/channels/channel-socket-registry.js +9 -1
  87. package/dist/runtime/channels/channel-transports.d.ts +23 -16
  88. package/dist/runtime/channels/channel-transports.js +139 -119
  89. package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
  90. package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
  91. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  92. package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
  93. package/dist/runtime/channels/local-spot-route-transport.js +15 -18
  94. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
  95. package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
  96. package/dist/runtime/channels/source-spot-router.d.ts +6 -3
  97. package/dist/runtime/channels/source-spot-router.js +34 -23
  98. package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
  99. package/dist/runtime/channels/spot-node-route-transport.js +23 -17
  100. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
  101. package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
  102. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
  103. package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
  104. package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
  105. package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
  106. package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
  107. package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
  108. package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
  109. package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
  110. package/dist/runtime/diagnostics/message-flow-record.js +228 -0
  111. package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
  112. package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
  113. package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
  114. package/dist/runtime/diagnostics/message-flow.js +42 -290
  115. package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
  116. package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
  117. package/dist/runtime/execution/index.d.ts +1 -0
  118. package/dist/runtime/execution/index.js +6 -3
  119. package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
  120. package/dist/runtime/execution/serial-execution-queue.js +75 -71
  121. package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
  122. package/dist/runtime/foundation/durable-service-request.js +158 -73
  123. package/dist/runtime/foundation/operation-registry.d.ts +33 -3
  124. package/dist/runtime/foundation/operation-registry.js +272 -33
  125. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
  126. package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
  127. package/dist/runtime/foundation/request-runtime.d.ts +17 -0
  128. package/dist/runtime/foundation/request-runtime.js +163 -0
  129. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  130. package/dist/runtime/foundation/service-discovery-registry.js +6 -0
  131. package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
  132. package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
  133. package/dist/runtime/foundation/service-mailbox.js +4 -1
  134. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
  135. package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
  136. package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
  137. package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
  138. package/dist/runtime/foundation/service-stateful-registry.js +38 -17
  139. package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
  140. package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
  141. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
  142. package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
  143. package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
  144. package/dist/runtime/foundation/service-topology-registry.js +13 -3
  145. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  146. package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
  147. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
  148. package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
  149. package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
  150. package/dist/runtime/host/actor-packet-relay.js +58 -57
  151. package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
  152. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  153. package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
  154. package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
  155. package/dist/runtime/host/application-job-queue.d.ts +7 -5
  156. package/dist/runtime/host/application-job-queue.js +33 -21
  157. package/dist/runtime/host/bound-session-relay.js +0 -1
  158. package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
  159. package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
  160. package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
  161. package/dist/runtime/host/entry-actor-runtime.js +2 -2
  162. package/dist/runtime/host/index.d.ts +106 -37
  163. package/dist/runtime/host/index.js +303 -151
  164. package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
  165. package/dist/runtime/host/location-runtime-owner.js +1 -1
  166. package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
  167. package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
  168. package/dist/runtime/host/spot-address-transport.d.ts +3 -0
  169. package/dist/runtime/host/spot-address-transport.js +73 -76
  170. package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
  171. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
  172. package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
  173. package/dist/runtime/internal-observation.d.ts +1 -0
  174. package/dist/runtime/internal-observation.js +5 -0
  175. package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
  176. package/dist/runtime/locations/actor-location-claims.js +15 -6
  177. package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
  178. package/dist/runtime/locations/auto-connect-loop.js +25 -19
  179. package/dist/runtime/locations/auto-connect-planner.js +2 -5
  180. package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
  181. package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
  182. package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
  183. package/dist/runtime/locations/in-memory-authority-store.js +15 -5
  184. package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
  185. package/dist/runtime/locations/in-memory-location-store.js +1 -38
  186. package/dist/runtime/locations/lifecycle.d.ts +1 -1
  187. package/dist/runtime/locations/lifecycle.js +2 -2
  188. package/dist/runtime/locations/location-store-repository.d.ts +0 -1
  189. package/dist/runtime/locations/location-store-repository.js +163 -246
  190. package/dist/runtime/locations/resolvers.d.ts +8 -1
  191. package/dist/runtime/locations/resolvers.js +16 -2
  192. package/dist/runtime/locations/runtime.d.ts +3 -3
  193. package/dist/runtime/locations/runtime.js +12 -16
  194. package/dist/runtime/messaging/creation-payload-codec.js +8 -7
  195. package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
  196. package/dist/runtime/messaging/framework-json-v1.js +6 -2
  197. package/dist/runtime/messaging/payload-codec.js +21 -35
  198. package/dist/runtime/messaging/request-deadline.d.ts +4 -2
  199. package/dist/runtime/messaging/request-deadline.js +40 -25
  200. package/dist/runtime/messaging/request-result.d.ts +14 -1
  201. package/dist/runtime/messaging/request-result.js +74 -13
  202. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
  203. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
  204. package/dist/runtime/spots/index.d.ts +28 -7
  205. package/dist/runtime/spots/index.js +31 -6
  206. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
  207. package/dist/runtime/spots/spot-activation-registry.js +13 -8
  208. package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
  209. package/dist/runtime/spots/spot-activation-state.js +1 -0
  210. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
  211. package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
  212. package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
  213. package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
  214. package/dist/runtime/spots/spot-actor-membership.js +3 -3
  215. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
  216. package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
  217. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
  218. package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
  219. package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
  220. package/dist/runtime/spots/spot-entry-activation.js +7 -12
  221. package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
  222. package/dist/runtime/spots/spot-handler-registry.js +31 -15
  223. package/dist/runtime/spots/spot-manager-public.js +3 -2
  224. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
  225. package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
  226. package/dist/runtime/spots/spot-outbound.d.ts +8 -2
  227. package/dist/runtime/spots/spot-outbound.js +5 -5
  228. package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
  229. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
  230. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
  231. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
  232. package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
  233. package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
  234. package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
  235. package/dist/runtime/spots/spot-timer.d.ts +1 -1
  236. package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
  237. package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
  238. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
  239. package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
  240. package/dist/runtime/streams/bound-session-service.js +6 -7
  241. package/dist/runtime/streams/index.d.ts +3 -3
  242. package/dist/runtime/streams/index.js +22 -2
  243. package/dist/runtime/streams/managed-stream.js +2 -1
  244. package/dist/runtime/streams/session-calls.d.ts +1 -1
  245. package/dist/runtime/streams/session-calls.js +3 -9
  246. package/dist/runtime/streams/session-context.d.ts +2 -2
  247. package/dist/runtime/streams/session-context.js +2 -2
  248. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
  249. package/dist/runtime/streams/stream-session-runtime.js +64 -33
  250. package/package.json +3 -3
  251. package/src/contracts/Actors/ZLinkActor.ts +6 -0
  252. package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
  253. package/src/contracts/Actors/index.ts +1 -0
  254. package/src/contracts/Common/CoreTypes.ts +1 -0
  255. package/src/contracts/Common/HandlerMessageType.ts +50 -0
  256. package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
  257. package/src/contracts/Common/ZLinkMessage.ts +11 -7
  258. package/src/contracts/Common/encoded-payload-storage.ts +4 -16
  259. package/src/contracts/Common/index.ts +1 -1
  260. package/src/contracts/Common/payload-slab.ts +29 -0
  261. package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
  262. package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
  263. package/src/contracts/Handlers/Contexts.ts +1 -0
  264. package/src/contracts/Locations/Authority.ts +7 -1
  265. package/src/internal.ts +17 -0
  266. package/src/nest-integration.ts +1 -0
  267. package/src/runtime/actors/actor-client.ts +257 -163
  268. package/src/runtime/actors/actor-context.ts +26 -14
  269. package/src/runtime/actors/actor-execution-context.ts +2 -2
  270. package/src/runtime/actors/actor-handoff.ts +86 -51
  271. package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
  272. package/src/runtime/actors/actor-local-native-join.ts +38 -17
  273. package/src/runtime/actors/actor-mailbox.ts +1 -1
  274. package/src/runtime/actors/actor-remote-joiner.ts +8 -4
  275. package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
  276. package/src/runtime/actors/actor-routed-json-request.ts +3 -0
  277. package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
  278. package/src/runtime/actors/actor-runtime-state.ts +1 -1
  279. package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
  280. package/src/runtime/admission.ts +42 -15
  281. package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
  282. package/src/runtime/backend/contracts/index.ts +77 -10
  283. package/src/runtime/backend/mesh-completion-table.ts +106 -15
  284. package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
  285. package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
  286. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
  287. package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
  288. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
  289. package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
  290. package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
  291. package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
  292. package/src/runtime/backend/raw-binding-port.ts +13 -5
  293. package/src/runtime/channels/channel-clients.ts +26 -11
  294. package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
  295. package/src/runtime/channels/channel-dispatch-services.ts +7 -12
  296. package/src/runtime/channels/channel-dispatchers.ts +93 -39
  297. package/src/runtime/channels/channel-envelope.ts +680 -144
  298. package/src/runtime/channels/channel-multipart.ts +17 -13
  299. package/src/runtime/channels/channel-outbound-operations.ts +204 -178
  300. package/src/runtime/channels/channel-receive-loops.ts +160 -107
  301. package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
  302. package/src/runtime/channels/channel-runtime-manager.ts +74 -27
  303. package/src/runtime/channels/channel-socket-registry.ts +20 -5
  304. package/src/runtime/channels/channel-transports.ts +414 -287
  305. package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
  306. package/src/runtime/channels/local-spot-route-transport.ts +27 -29
  307. package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
  308. package/src/runtime/channels/source-spot-router.ts +75 -38
  309. package/src/runtime/channels/spot-node-route-transport.ts +67 -37
  310. package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
  311. package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
  312. package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
  313. package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
  314. package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
  315. package/src/runtime/diagnostics/message-flow-record.ts +295 -0
  316. package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
  317. package/src/runtime/diagnostics/message-flow.ts +49 -362
  318. package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
  319. package/src/runtime/execution/index.ts +6 -0
  320. package/src/runtime/execution/serial-execution-queue.ts +94 -96
  321. package/src/runtime/foundation/durable-service-request.ts +212 -89
  322. package/src/runtime/foundation/operation-registry.ts +287 -38
  323. package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
  324. package/src/runtime/foundation/request-runtime.ts +227 -0
  325. package/src/runtime/foundation/service-discovery-registry.ts +7 -0
  326. package/src/runtime/foundation/service-liveness-registry.ts +1 -1
  327. package/src/runtime/foundation/service-mailbox.ts +7 -2
  328. package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
  329. package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
  330. package/src/runtime/foundation/service-stateful-registry.ts +52 -19
  331. package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
  332. package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
  333. package/src/runtime/foundation/service-topology-registry.ts +21 -3
  334. package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
  335. package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
  336. package/src/runtime/host/actor-packet-relay.ts +160 -156
  337. package/src/runtime/host/actor-placement-coordinator.ts +1 -1
  338. package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
  339. package/src/runtime/host/actor-transfer-runtime.ts +3 -3
  340. package/src/runtime/host/application-job-queue.ts +56 -27
  341. package/src/runtime/host/bound-session-relay.ts +0 -1
  342. package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
  343. package/src/runtime/host/entry-actor-runtime.ts +14 -6
  344. package/src/runtime/host/index.ts +388 -113
  345. package/src/runtime/host/location-runtime-owner.ts +3 -3
  346. package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
  347. package/src/runtime/host/spot-address-transport.ts +110 -95
  348. package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
  349. package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
  350. package/src/runtime/internal-observation.ts +2 -0
  351. package/src/runtime/locations/actor-location-claims.ts +42 -16
  352. package/src/runtime/locations/auto-connect-loop.ts +24 -16
  353. package/src/runtime/locations/auto-connect-planner.ts +2 -5
  354. package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
  355. package/src/runtime/locations/in-memory-authority-store.ts +27 -7
  356. package/src/runtime/locations/in-memory-location-store.ts +1 -74
  357. package/src/runtime/locations/lifecycle.ts +4 -2
  358. package/src/runtime/locations/location-store-repository.ts +228 -308
  359. package/src/runtime/locations/resolvers.ts +20 -8
  360. package/src/runtime/locations/runtime.ts +16 -28
  361. package/src/runtime/messaging/creation-payload-codec.ts +12 -10
  362. package/src/runtime/messaging/framework-json-v1.ts +10 -1
  363. package/src/runtime/messaging/payload-codec.ts +50 -75
  364. package/src/runtime/messaging/request-deadline.ts +47 -39
  365. package/src/runtime/messaging/request-result.ts +88 -17
  366. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  367. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  368. package/src/runtime/spots/index.ts +57 -10
  369. package/src/runtime/spots/spot-activation-registry.ts +12 -8
  370. package/src/runtime/spots/spot-activation-state.ts +2 -0
  371. package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
  372. package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
  373. package/src/runtime/spots/spot-actor-membership.ts +8 -5
  374. package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
  375. package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
  376. package/src/runtime/spots/spot-entry-activation.ts +25 -35
  377. package/src/runtime/spots/spot-handler-registry.ts +72 -15
  378. package/src/runtime/spots/spot-manager-public.ts +4 -2
  379. package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
  380. package/src/runtime/spots/spot-outbound.ts +26 -10
  381. package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
  382. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
  383. package/src/runtime/spots/spot-runtime-ports.ts +5 -2
  384. package/src/runtime/spots/spot-serial-executor.ts +1 -1
  385. package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
  386. package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
  387. package/src/runtime/spots/spot-timer.ts +1 -1
  388. package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
  389. package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
  390. package/src/runtime/streams/bound-session-service.ts +10 -7
  391. package/src/runtime/streams/index.ts +30 -4
  392. package/src/runtime/streams/managed-stream.ts +2 -1
  393. package/src/runtime/streams/session-calls.ts +9 -14
  394. package/src/runtime/streams/session-context.ts +6 -11
  395. package/src/runtime/streams/stream-session-runtime.ts +79 -40
  396. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
  397. package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
  398. package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
@@ -6,6 +6,7 @@ const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOp
6
6
  const channel_envelope_1 = require("../channels/channel-envelope");
7
7
  const flow_context_1 = require("../diagnostics/flow-context");
8
8
  const handler_instance_scope_1 = require("../handlers/handler-instance-scope");
9
+ const HandlerMessageType_1 = require("../../contracts/Common/HandlerMessageType");
9
10
  const spot_native_flags_1 = require("./spot-native-flags");
10
11
  const serial_work_size_1 = require("../execution/serial-work-size");
11
12
  const framework_errors_internal_1 = require("../framework-errors-internal");
@@ -85,6 +86,7 @@ class ZLinkSpotSubscriptionDispatch {
85
86
  }
86
87
  }
87
88
  async dispatch(message) {
89
+ const receivedAt = new Date();
88
90
  if (message.parts.length === 0) {
89
91
  this.options.dispatchErrors?.report({
90
92
  surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.SpotSubscription,
@@ -133,8 +135,8 @@ class ZLinkSpotSubscriptionDispatch {
133
135
  await this.options.serial.post(() => (0, flow_context_1.runWithFlow)(inboundFlow, async () => {
134
136
  // Payload deserialization belongs to the Spot serial turn. Queue
135
137
  // admission and execution authority therefore precede this work.
136
- const event = (0, channel_envelope_1.decodeChannelPayload)(envelope, this.channelCodecs());
137
138
  for (const registration of registrations) {
139
+ const event = (0, channel_envelope_1.decodeChannelPayload)(envelope, this.channelCodecs(), (0, HandlerMessageType_1.resolveMessageTypeForDecode)(registration.messageType));
138
140
  const handler = await (0, handler_instance_scope_1.resolveLifecycleHandler)(spot, registration.handlerType, this.options.providerResolver);
139
141
  try {
140
142
  await handler.handle(spot, event, {
@@ -144,7 +146,8 @@ class ZLinkSpotSubscriptionDispatch {
144
146
  topic: message.topic,
145
147
  source: subSource,
146
148
  metadata: (0, contracts_1.zlinkMessageMetadata)(envelope.header.metadata),
147
- correlationId: envelope.header.correlationId ?? undefined
149
+ correlationId: envelope.header.correlationId ?? undefined,
150
+ receivedAt
148
151
  });
149
152
  }
150
153
  catch (error) {
@@ -123,7 +123,7 @@ export declare class ZLinkManagedTimer implements ZLinkTimer {
123
123
  private pendingScheduledIndex;
124
124
  private timeout;
125
125
  /** The dispatch in flight, from its timer callback until `completeFireCore`. */
126
- private running;
126
+ running: Promise<void> | undefined;
127
127
  private dispatchFailure;
128
128
  private finalization;
129
129
  constructor(name: string, periodMs: number, options: Required<ZLinkTimerOptions>, onTick: (tick: ZLinkTimerTick) => Promise<void>, onFailure?: ZLinkTimerFailureReporter | undefined, shouldWaitForRunningOnCancel?: () => boolean, clock?: ZLinkTimerClock, start?: ZLinkManagedTimerStart);
@@ -1,3 +1,5 @@
1
+ import { type ZLinkStreamFrameHeader } from './protocol';
2
+ import { ZLinkStateLane } from '../execution/state-lane';
1
3
  import type { RoutingId } from '../../contracts';
2
4
  import { type ServiceSessionRelocationRoute, type ServiceSessionRelocationSeal, type ServiceSessionRelocationSealed } from '../foundation/service-stateful-wire-codec';
3
5
  export interface ZLinkPreparedSessionRelocationSeal {
@@ -100,13 +102,16 @@ export declare class ZLinkActorSessionBindingRegistry<TContext extends ZLinkActo
100
102
  private readonly terminalRelocationCapacity;
101
103
  private readonly sealWaitTimeoutMs;
102
104
  private readonly errorSink?;
103
- private readonly lane;
105
+ readonly lane: ZLinkStateLane;
104
106
  private readonly routes;
105
- private readonly nextActorSlots;
107
+ readonly nextActorSlots: WeakMap<TContext, number>;
106
108
  private readonly sealWaiters;
107
109
  private readonly activeFrameWaiters;
108
110
  private readonly relocations;
109
- private readonly absentSessionRelocationResults;
111
+ readonly absentSessionRelocationResults: Map<string, {
112
+ readonly result: SessionRelocationResult;
113
+ readonly expiry: ReturnType<typeof setTimeout>;
114
+ }>;
110
115
  private readonly terminalRelocations;
111
116
  constructor(terminalRelocationCapacity?: number, sealWaitTimeoutMs?: number, errorSink?: (() => {
112
117
  reportRuntimeTaskException(taskName: string, error: unknown): void;
@@ -120,6 +125,9 @@ export declare class ZLinkActorSessionBindingRegistry<TContext extends ZLinkActo
120
125
  find(actorId: string): Promise<TActor | undefined>;
121
126
  private findCore;
122
127
  route(actorId: string): Promise<ZLinkActorSessionRoute<TContext, TActor> | undefined>;
128
+ submitReply<T>(context: TContext, header: ZLinkStreamFrameHeader, submit: (header: ZLinkStreamFrameHeader) => Promise<T>): Promise<T>;
129
+ /** Registers a current binding's frame in the same turn that can retire its slot. */
130
+ submitCurrent<T>(actorId: string, bindingToken: string, submit: (route: ZLinkActorSessionRoute<TContext, TActor>) => Promise<T>): Promise<T | undefined>;
123
131
  /** Selects the route only when it is the exact Session binding (§8.1 validation values). */
124
132
  routeForSessionBinding(actorId: string, sessionRid: RoutingId, bindingGeneration?: bigint): Promise<ZLinkActorSessionRoute<TContext, TActor> | undefined>;
125
133
  private routeCore;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkActorSessionBindingRegistry = exports.ZLinkActorSessionBindingTermination = exports.DEFAULT_TERMINAL_RELOCATION_CAPACITY = void 0;
4
+ const protocol_1 = require("./protocol");
4
5
  const ZLinkFrameworkException_1 = require("../../contracts/Errors/ZLinkFrameworkException");
5
6
  const Options_1 = require("../../contracts/Locations/Options");
6
7
  const abort_1 = require("../abort");
@@ -139,6 +140,33 @@ class ZLinkActorSessionBindingRegistry {
139
140
  async route(actorId) {
140
141
  return await this.lane.run(() => this.routeCore(actorId));
141
142
  }
143
+ async submitReply(context, header, submit) {
144
+ const { submission } = await this.lane.run(() => {
145
+ const current = header.actorSlot === undefined ||
146
+ [...this.routes.values()].some((route) => route.context === context && route.actorSlot === header.actorSlot);
147
+ return {
148
+ submission: submit(current
149
+ ? header
150
+ : {
151
+ ...header,
152
+ actorSlot: undefined,
153
+ flags: header.flags & ~protocol_1.ZLinkStreamHeaderFlags.HasActorSlot
154
+ })
155
+ };
156
+ });
157
+ return await submission;
158
+ }
159
+ /** Registers a current binding's frame in the same turn that can retire its slot. */
160
+ async submitCurrent(actorId, bindingToken, submit) {
161
+ const { submission } = await this.lane.run(() => {
162
+ const route = this.routeCore(actorId);
163
+ return {
164
+ submission: route?.bindingToken === bindingToken ? submit(route) : undefined
165
+ };
166
+ });
167
+ // Transport completion must not hold the registry lane.
168
+ return await submission;
169
+ }
142
170
  /** Selects the route only when it is the exact Session binding (§8.1 validation values). */
143
171
  async routeForSessionBinding(actorId, sessionRid, bindingGeneration) {
144
172
  return await this.lane.run(() => {
@@ -2,7 +2,7 @@ import type { ZLinkMessage, ZLinkMessageSerializer, ZLinkSessionActor } from '..
2
2
  import type { Message } from '../../contracts/Common/Message';
3
3
  import type { ZLinkDispatchErrorReporter } from '../channels';
4
4
  import { type ZLinkSubmitResult } from '../messaging/submission-result';
5
- import { ZLinkActorSessionBindingRegistry } from './actor-session-binding-registry';
5
+ import { type ZLinkActorSessionAuthorityFence, ZLinkActorSessionBindingRegistry } from './actor-session-binding-registry';
6
6
  import { ZLinkActorSessionLifecycleCoordinator } from './actor-session-lifecycle-coordinator';
7
7
  import { type ZLinkStreamFrameHeader } from './protocol';
8
8
  import { DefaultZLinkSessionActor, DefaultZLinkSessionContext } from './session-context';
@@ -14,7 +14,7 @@ export interface ZLinkBoundActorRelaySenderOptions {
14
14
  readonly actorBindTimeoutMs?: number;
15
15
  readonly messageSerializers?: ReadonlyMap<string, ZLinkMessageSerializer>;
16
16
  readonly relay?: (actor: ZLinkSessionActor, header: ZLinkStreamFrameHeader, payload: Message) => Promise<boolean>;
17
- readonly notifyDisconnected?: (actor: ZLinkSessionActor, signal?: AbortSignal, binding?: ServiceStreamSessionBinding) => Promise<void>;
17
+ readonly notifyDisconnected?: (actor: ZLinkSessionActor, signal?: AbortSignal, binding?: ServiceStreamSessionBinding, authorityFence?: ZLinkActorSessionAuthorityFence) => Promise<void>;
18
18
  }
19
19
  export declare class ZLinkBoundActorRelaySender {
20
20
  private readonly routes;
@@ -170,7 +170,7 @@ class ZLinkBoundActorRelaySender {
170
170
  detached.route.context.stream instanceof managed_stream_1.ZLinkManagedStream) {
171
171
  await detached.route.context.stream.unbindActor(actor.actorId, this.options.actorBindTimeoutMs ?? exports.DEFAULT_RELAY_ACTOR_BIND_TIMEOUT_MS, signal);
172
172
  }
173
- await this.options.notifyDisconnected?.(actor, signal, detached.binding);
173
+ await this.options.notifyDisconnected?.(actor, signal, detached.binding, detached.route.authorityFence);
174
174
  }
175
175
  async notifyPhysicalDisconnect(context) {
176
176
  const snapshot = [...context.boundActors];
@@ -191,7 +191,7 @@ class ZLinkBoundActorRelaySender {
191
191
  ? context.stream.actorBinding(actor.actorId)
192
192
  : undefined;
193
193
  await this.routes.unbind(actor.actorId, context, actor.bindingToken, actor_session_binding_registry_1.ZLinkActorSessionBindingTermination.PhysicalDisconnect);
194
- return { binding };
194
+ return { binding, authorityFence: route.authorityFence };
195
195
  });
196
196
  if (detached === false)
197
197
  return;
@@ -199,8 +199,7 @@ class ZLinkBoundActorRelaySender {
199
199
  const timer = setTimeout(() => controller.abort(), timeoutMs);
200
200
  try {
201
201
  await Promise.race([
202
- this.options.notifyDisconnected?.(actor, controller.signal, detached.binding) ??
203
- Promise.resolve(),
202
+ this.options.notifyDisconnected?.(actor, controller.signal, detached.binding, detached.authorityFence) ?? Promise.resolve(),
204
203
  new Promise((_, reject) => {
205
204
  controller.signal.addEventListener('abort', () => reject(new Error(`Actor '${actor.actorId}' disconnect notification exceeded ${timeoutMs} ms.`)), { once: true });
206
205
  })
@@ -43,11 +43,10 @@ class ZLinkBoundSessionService {
43
43
  }
44
44
  const frame = this.frameMessages.createJsonFrameMessage(protocol_1.ZLinkStreamMessageKind.Send, (0, protocol_1.resolvePacketName)(message, packetName), metadata, false, undefined, message, undefined, this.actorSlot(route));
45
45
  try {
46
- (0, abort_1.throwIfAborted)(signal);
47
- if ((await this.routes.route(actorId))?.bindingToken !== route.bindingToken) {
48
- return { status: submission_result_1.ZLinkSubmitStatus.TargetNotFound };
49
- }
50
- return await route.context.stream.submitRaw(frame);
46
+ return ((await this.routes.submitCurrent(actorId, route.bindingToken, (current) => {
47
+ (0, abort_1.throwIfAborted)(signal);
48
+ return current.context.stream.submitRaw(frame);
49
+ })) ?? { status: submission_result_1.ZLinkSubmitStatus.TargetNotFound });
51
50
  }
52
51
  finally {
53
52
  frame.close();
@@ -131,10 +130,10 @@ class ZLinkBoundSessionService {
131
130
  async writeLocalBoundSessionFrame(actorId, route, kind, packetName, metadata, compressPayload, requestSeq, payload, operationName) {
132
131
  const frame = this.frameMessages.createJsonFrameMessage(kind, packetName, metadata, compressPayload, requestSeq, payload, undefined, this.actorSlot(route));
133
132
  try {
134
- if ((await this.routes.route(actorId))?.bindingToken !== route.bindingToken) {
133
+ const result = await this.routes.submitCurrent(actorId, route.bindingToken, (current) => current.context.stream.submitRaw(frame));
134
+ if (result === undefined) {
135
135
  return false;
136
136
  }
137
- const result = await route.context.stream.submitRaw(frame);
138
137
  if (result.status !== submission_result_1.ZLinkSubmitStatus.Submitted) {
139
138
  throw new Error(`Actor '${actorId}' local bound session ${operationName} failed.`);
140
139
  }
@@ -8,7 +8,7 @@ import { type ZLinkFrameworkRegistration } from '../configuration';
8
8
  import type { ZLinkListenerRecords } from '../foundation/listener-records';
9
9
  import { ApplicationJobQueue } from '../host/application-job-queue';
10
10
  import type { ZLinkSubmitResult } from '../messaging/submission-result';
11
- import { type ZLinkActorSessionAuthorityFence } from './actor-session-binding-registry';
11
+ import { ZLinkActorSessionBindingRegistry, type ZLinkActorSessionAuthorityFence } from './actor-session-binding-registry';
12
12
  import { type ZLinkBoundActorRelaySenderOptions } from './bound-actor-relay-sender';
13
13
  import { type ZLinkBoundSessionResponseTarget } from './bound-session-response-target';
14
14
  import { type ZLinkBoundSessionTransport } from './bound-session-service';
@@ -100,7 +100,7 @@ export declare class ZLinkStreamSessionNodeRuntime extends ZLinkStreamSessionNod
100
100
  constructor(options: ZLinkStreamSessionNodeRuntimeOptions);
101
101
  }
102
102
  export declare class ZLinkStreamBindingRuntime {
103
- private readonly routes;
103
+ readonly routes: ZLinkActorSessionBindingRegistry<DefaultZLinkSessionContext, DefaultZLinkSessionActor>;
104
104
  private readonly frameMessages;
105
105
  private readonly compressionCodec;
106
106
  private readonly boundSessions;
@@ -149,5 +149,5 @@ export declare class ZLinkStreamBindingRuntime {
149
149
  createBinaryMessage(payload: Uint8Array): Message;
150
150
  decompressPayload(payload: Message): Message;
151
151
  createJsonFrameMessage(kind: ZLinkStreamMessageKind, packetName: string, metadata: ReadonlyMap<string, string>, compressed: boolean, requestSeq: bigint | undefined, payload: unknown, correlationId?: string): Message;
152
- createJsonReplyFrameMessage(requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Message;
152
+ submitReply(context: DefaultZLinkSessionContext, requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Promise<ZLinkSubmitResult>;
153
153
  }
@@ -348,8 +348,28 @@ class ZLinkStreamBindingRuntime {
348
348
  createJsonFrameMessage(kind, packetName, metadata, compressed, requestSeq, payload, correlationId) {
349
349
  return this.frameMessages.createJsonFrameMessage(kind, packetName, metadata, compressed, requestSeq, payload, correlationId);
350
350
  }
351
- createJsonReplyFrameMessage(requestHeader, kind, metadata, compressed, payload) {
352
- return this.frameMessages.createJsonReplyFrameMessage(requestHeader, kind, metadata, compressed, payload);
351
+ async submitReply(context, requestHeader, kind, metadata, compressed, payload) {
352
+ const frame = this.frameMessages.createJsonReplyFrameMessage(requestHeader, kind, metadata, compressed, payload);
353
+ try {
354
+ return await this.routes.submitReply(context, requestHeader, async (header) => {
355
+ if (header === requestHeader)
356
+ return await context.stream.submitRaw(frame);
357
+ const encoded = (0, protocol_1.decodeStreamFrame)((0, protocol_1.messageToBytes)(frame));
358
+ const normalized = this.createBinaryMessage((0, protocol_1.encodeStreamFrame)({
359
+ ...(0, protocol_1.decodeStreamHeader)(encoded.header),
360
+ actorSlot: header.actorSlot
361
+ }, encoded.payload));
362
+ try {
363
+ return await context.stream.submitRaw(normalized);
364
+ }
365
+ finally {
366
+ normalized.close();
367
+ }
368
+ });
369
+ }
370
+ finally {
371
+ frame.close();
372
+ }
353
373
  }
354
374
  }
355
375
  exports.ZLinkStreamBindingRuntime = ZLinkStreamBindingRuntime;
@@ -297,7 +297,8 @@ class ZLinkManagedStream {
297
297
  try {
298
298
  if (completion.terminalResult !== 0 &&
299
299
  !acceptedTerminalResults.has(completion.terminalResult)) {
300
- throw (0, framework_errors_internal_1.wireReplyFailureException)(completion.terminalResult, completion.failureErrno, `${operationName} failed with result ${completion.terminalResult} (errno ${completion.failureErrno}).`);
300
+ throw (0, framework_errors_internal_1.wireReplyFailureException)(completion.terminalResult, completion.failureErrno, completion.failureMessage ??
301
+ `${operationName} failed with result ${completion.terminalResult} (errno ${completion.failureErrno}).`);
301
302
  }
302
303
  }
303
304
  finally {
@@ -12,7 +12,7 @@ export interface ZLinkSessionCallContext {
12
12
  };
13
13
  readonly dispatchHeader: ZLinkStreamFrameHeader | undefined;
14
14
  createJsonFrameMessage(kind: ZLinkStreamMessageKind, packetName: string, metadata: ReadonlyMap<string, string>, compressed: boolean, requestSeq: bigint | undefined, payload: unknown, correlationId?: string): Message;
15
- createJsonReplyFrameMessage(requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Message;
15
+ submitReply(requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Promise<ZLinkSubmitResult>;
16
16
  claimReply(requestHeader: ZLinkStreamFrameHeader): void;
17
17
  /**
18
18
  * Spec 26 §2.2: the STREAM surface records session-connected sends and the
@@ -93,15 +93,9 @@ class DefaultZLinkSessionReplyCall {
93
93
  throw new Error('Reply is only available while handling a request packet.');
94
94
  }
95
95
  this.context.claimReply(requestHeader);
96
- const message = this.context.createJsonReplyFrameMessage(requestHeader, protocol_1.ZLinkStreamMessageKind.Response, new Map(), this.compressionEnabled, this.message);
97
- try {
98
- const result = await this.context.stream.submitRaw(message);
99
- (0, submission_result_1.requireOneWayCompletion)(result, 'STREAM session reply');
100
- this.context.traceFrameWritten?.(protocol_1.ZLinkStreamMessageKind.Response, requestHeader.name, requestHeader.correlationId);
101
- }
102
- finally {
103
- message.close();
104
- }
96
+ const result = await this.context.submitReply(requestHeader, protocol_1.ZLinkStreamMessageKind.Response, new Map(), this.compressionEnabled, this.message);
97
+ (0, submission_result_1.requireOneWayCompletion)(result, 'STREAM session reply');
98
+ this.context.traceFrameWritten?.(protocol_1.ZLinkStreamMessageKind.Response, requestHeader.name, requestHeader.correlationId);
105
99
  }
106
100
  }
107
101
  exports.DefaultZLinkSessionReplyCall = DefaultZLinkSessionReplyCall;
@@ -17,7 +17,7 @@ interface ZLinkSessionContextRuntime {
17
17
  createTextMessage(payload: string): Message;
18
18
  createBinaryMessage(payload: Uint8Array): Message;
19
19
  createJsonFrameMessage(kind: ZLinkStreamMessageKind, packetName: string, metadata: ReadonlyMap<string, string>, compressed: boolean, requestSeq: bigint | undefined, payload: unknown, correlationId?: string): Message;
20
- createJsonReplyFrameMessage(requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Message;
20
+ submitReply(context: DefaultZLinkSessionContext, requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Promise<ZLinkSubmitResult>;
21
21
  decompressPayload(payload: Message): Message;
22
22
  bind(context: DefaultZLinkSessionContext, actor: ZLinkActor | ActorRef, signal?: AbortSignal): Promise<DefaultZLinkSessionActor>;
23
23
  bindOrGet(context: DefaultZLinkSessionContext, actorRef: ActorRef, signal?: AbortSignal): Promise<DefaultZLinkSessionActor>;
@@ -64,7 +64,7 @@ export declare class DefaultZLinkSessionContext implements ZLinkSessionContext {
64
64
  createTextMessage(payload: string): Message;
65
65
  createBinaryMessage(payload: Uint8Array): Message;
66
66
  createJsonFrameMessage(kind: ZLinkStreamMessageKind, packetName: string, metadata: ReadonlyMap<string, string>, compressed: boolean, requestSeq: bigint | undefined, payload: unknown, correlationId?: string): Message;
67
- createJsonReplyFrameMessage(requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Message;
67
+ submitReply(requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Promise<ZLinkSubmitResult>;
68
68
  enterDispatch(header: ZLinkStreamFrameHeader): void;
69
69
  exitDispatch(): void;
70
70
  get dispatchHeader(): ZLinkStreamFrameHeader | undefined;
@@ -105,8 +105,8 @@ class DefaultZLinkSessionContext {
105
105
  createJsonFrameMessage(kind, packetName, metadata, compressed, requestSeq, payload, correlationId) {
106
106
  return this.runtime.createJsonFrameMessage(kind, packetName, metadata, compressed, requestSeq, payload, correlationId);
107
107
  }
108
- createJsonReplyFrameMessage(requestHeader, kind, metadata, compressed, payload) {
109
- return this.runtime.createJsonReplyFrameMessage(requestHeader, kind, metadata, compressed, payload);
108
+ submitReply(requestHeader, kind, metadata, compressed, payload) {
109
+ return this.runtime.submitReply(this, requestHeader, kind, metadata, compressed, payload);
110
110
  }
111
111
  enterDispatch(header) {
112
112
  if (this.closingForActorReplacement) {
@@ -93,6 +93,7 @@ export declare class ZLinkStreamSessionRuntime {
93
93
  private markConnected;
94
94
  private dispatchPacket;
95
95
  private handleControl;
96
+ private logIgnoredControl;
96
97
  private scheduleLivenessCheck;
97
98
  private runLivenessCheck;
98
99
  private closeForLiveness;
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkStreamSessionNodeRuntime = exports.ZLinkStreamSessionRuntime = void 0;
4
+ const submission_result_1 = require("../messaging/submission-result");
5
+ const api_logs_1 = require("@opentelemetry/api-logs");
6
+ const stream_wire_1 = require("@zlink-systems/stream-wire");
4
7
  const Registration_1 = require("../../contracts/Configuration/Registration");
5
8
  const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
6
9
  const abort_1 = require("../abort");
@@ -8,6 +11,7 @@ const admission_1 = require("../admission");
8
11
  const application_job_queue_scope_1 = require("../application-jobs/application-job-queue-scope");
9
12
  const channels_1 = require("../channels");
10
13
  const diagnostics_1 = require("../diagnostics");
14
+ const message_flow_record_1 = require("../diagnostics/message-flow-record");
11
15
  const flow_context_1 = require("../diagnostics/flow-context");
12
16
  const internal_event_contracts_1 = require("../diagnostics/internal-event-contracts");
13
17
  const runtime_metrics_1 = require("../diagnostics/runtime-metrics");
@@ -20,7 +24,6 @@ const session_context_1 = require("./session-context");
20
24
  const session_serial_executor_1 = require("./session-serial-executor");
21
25
  const stream_message_utils_1 = require("./stream-message-utils");
22
26
  const RegistrationNormalizers_1 = require("../../contracts/Configuration/RegistrationNormalizers");
23
- const ZLINK_SEND_DONT_WAIT = 1;
24
27
  const ZLINK_RECV_DONT_WAIT = 1;
25
28
  const ZLINK_STREAM_RECEIVE_FRAME_BATCH_LIMIT = 64;
26
29
  const ZLINK_STREAM_ACTOR_BINDING_REPLACEMENT_CLOSE_DELAY_MS = 100;
@@ -28,6 +31,7 @@ const ZLINK_STREAM_MONITOR_IDLE_MIN_DELAY_MS = 1;
28
31
  const ZLINK_STREAM_MONITOR_IDLE_MAX_DELAY_MS = 20;
29
32
  const ZLINK_STREAM_MONITOR_IDLE_MAX_STEPS = 7;
30
33
  const MAX_TIMER_DELAY_MS = 2_147_483_647;
34
+ const STREAM_RUNTIME_LOGGER = api_logs_1.logs.getLogger(message_flow_record_1.TELEMETRY_INSTRUMENTATION_NAME);
31
35
  const systemLivenessClock = {
32
36
  now: () => performance.now(),
33
37
  setTimer: (callback, delayMs) => setTimeout(callback, Math.min(delayMs, MAX_TIMER_DELAY_MS)),
@@ -324,7 +328,6 @@ class ZLinkStreamSessionRuntime {
324
328
  correlationId: streamCorr,
325
329
  sourceRid: this.context.routingId === undefined ? undefined : String(this.context.routingId)
326
330
  });
327
- (0, application_job_queue_scope_1.releaseApplicationJobPermitBeforeHandler)();
328
331
  (0, diagnostics_1.flowIfEnabled)(this.options.dispatchErrors?.flow, ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched)?.trace({
329
332
  outcome: ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched,
330
333
  surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.StreamSession,
@@ -333,7 +336,12 @@ class ZLinkStreamSessionRuntime {
333
336
  correlationId: streamCorr,
334
337
  sourceRid: this.context.routingId === undefined ? undefined : String(this.context.routingId)
335
338
  });
336
- await session.onDispatch?.((0, session_context_1.createSessionDispatchContext)(inboundHeader, dispatchActor), (0, payload_codec_1.wrapFrameworkPayloadMessage)(dispatchPayload, this.options.messageSerializers, (0, protocol_1.streamCodecContentType)(inboundHeader.codec), inboundHeader.name));
339
+ if (session.onDispatch !== undefined) {
340
+ const sessionDispatchContext = (0, session_context_1.createSessionDispatchContext)(inboundHeader, dispatchActor);
341
+ const frameworkPayload = (0, payload_codec_1.wrapFrameworkPayloadMessage)(dispatchPayload, this.options.messageSerializers, (0, protocol_1.streamCodecContentType)(inboundHeader.codec), inboundHeader.name);
342
+ (0, application_job_queue_scope_1.releaseApplicationJobPermitBeforeHandler)();
343
+ await session.onDispatch(sessionDispatchContext, frameworkPayload);
344
+ }
337
345
  if (streamKind === ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Send) {
338
346
  (0, diagnostics_1.flowIfEnabled)(this.options.dispatchErrors?.flow, ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed)?.trace({
339
347
  outcome: ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed,
@@ -380,19 +388,45 @@ class ZLinkStreamSessionRuntime {
380
388
  }
381
389
  }
382
390
  async handleControl(header, payload) {
383
- if ((0, protocol_1.messageToBytes)(payload).length !== 0) {
384
- await this.closeForLiveness(protocol_1.ZLinkStreamCloseReasonCode.ProtocolError, 'protocol_error', 'Control heartbeat payload must be empty.');
391
+ const payloadBytes = (0, protocol_1.messageToBytes)(payload);
392
+ if (header.name === protocol_1.ZLINK_STREAM_HEARTBEAT_PING) {
393
+ if (payloadBytes.length !== 0) {
394
+ this.logIgnoredControl(header.name, payloadBytes.length);
395
+ }
396
+ await this.stream.writeControl(protocol_1.ZLINK_STREAM_HEARTBEAT_PONG);
385
397
  return;
386
398
  }
387
399
  if (header.name === protocol_1.ZLINK_STREAM_HEARTBEAT_PONG) {
400
+ if (payloadBytes.length !== 0) {
401
+ this.logIgnoredControl(header.name, payloadBytes.length);
402
+ }
388
403
  return;
389
404
  }
390
- if (header.name === protocol_1.ZLINK_STREAM_HEARTBEAT_PING) {
391
- await this.stream.writeControl(protocol_1.ZLINK_STREAM_HEARTBEAT_PONG);
405
+ if (header.name === stream_wire_1.ZlinkStreamControlPacket.ActorBound ||
406
+ header.name === stream_wire_1.ZlinkStreamControlPacket.ActorUnbound) {
407
+ await this.closeForLiveness(protocol_1.ZLinkStreamCloseReasonCode.ProtocolError, 'protocol_error', `Unexpected stream actor control frame: ${header.name}`);
408
+ return;
409
+ }
410
+ if (header.name.startsWith('$zlink.')) {
411
+ this.logIgnoredControl(header.name, payloadBytes.length);
392
412
  return;
393
413
  }
394
414
  await this.closeForLiveness(protocol_1.ZLinkStreamCloseReasonCode.ProtocolError, 'protocol_error', `Unknown stream control frame: ${header.name}`);
395
415
  }
416
+ logIgnoredControl(name, payloadLength) {
417
+ STREAM_RUNTIME_LOGGER.emit({
418
+ eventName: 'zlink.stream.control_ignored',
419
+ timestamp: new Date(),
420
+ severityNumber: api_logs_1.SeverityNumber.DEBUG,
421
+ severityText: 'DEBUG',
422
+ body: `Ignored STREAM control name=${name} payloadBytes=${payloadLength} peerSessionRid=${this.stream.sessionId}`,
423
+ attributes: {
424
+ control_name: name,
425
+ payload_bytes: payloadLength,
426
+ peer_session_rid: this.stream.sessionId
427
+ }
428
+ });
429
+ }
396
430
  scheduleLivenessCheck() {
397
431
  if (this.disposed || this.disconnected || this.livenessTimer !== undefined) {
398
432
  return;
@@ -435,9 +469,11 @@ class ZLinkStreamSessionRuntime {
435
469
  this.closeReason = closeReason;
436
470
  this.stopLivenessChecks();
437
471
  await this.stream.closeForReason(reason, diagnostic);
438
- void this.serial
439
- .executeFinal(async () => this.complete(undefined, true))
440
- .catch((error) => this.options.onError?.(error));
472
+ const bindingsCleanup = this.context.cleanupBindings();
473
+ void Promise.all([
474
+ bindingsCleanup,
475
+ this.serial.executeFinal(async () => this.complete(undefined, true, bindingsCleanup))
476
+ ]).catch((error) => this.options.onError?.(error));
441
477
  }
442
478
  stopLivenessChecks() {
443
479
  if (this.livenessTimer !== undefined) {
@@ -455,19 +491,14 @@ class ZLinkStreamSessionRuntime {
455
491
  // record (spec 26 §2.2) and confuse the peer's reply matching.
456
492
  return;
457
493
  }
458
- const message = this.context.createJsonReplyFrameMessage(header, protocol_1.ZLinkStreamMessageKind.Error, new Map(), false, (0, bound_session_response_target_1.boundSessionErrorPayload)(error));
459
494
  try {
460
- if (!this.context.stream.writeRaw(message, ZLINK_SEND_DONT_WAIT)) {
461
- throw new Error('Client stream error reply send failed.');
462
- }
495
+ const result = await this.context.submitReply(header, protocol_1.ZLinkStreamMessageKind.Error, new Map(), false, (0, bound_session_response_target_1.boundSessionErrorPayload)(error));
496
+ (0, submission_result_1.requireOneWayCompletion)(result, 'Client stream error reply');
463
497
  this.traceFrameWritten(protocol_1.ZLinkStreamMessageKind.Error, header.name, header.correlationId);
464
498
  }
465
499
  catch (replyError) {
466
500
  this.options.onError?.(replyError);
467
501
  }
468
- finally {
469
- message.close();
470
- }
471
502
  }
472
503
  /**
473
504
  * Spec 26 §2.1/§2.2: a successful session write is the surface's terminal
@@ -492,7 +523,7 @@ class ZLinkStreamSessionRuntime {
492
523
  streamSessionId: this.stream.sessionId
493
524
  });
494
525
  }
495
- async complete(error, notifyDisconnected) {
526
+ async complete(error, notifyDisconnected, bindingsCleanup) {
496
527
  try {
497
528
  if (error !== undefined && this.closeReason !== 'server_drain') {
498
529
  this.closeReason = 'transport_error';
@@ -510,7 +541,7 @@ class ZLinkStreamSessionRuntime {
510
541
  }
511
542
  }
512
543
  finally {
513
- await this.cleanup();
544
+ await this.cleanup(bindingsCleanup);
514
545
  }
515
546
  }
516
547
  queueDisconnect(error) {
@@ -518,20 +549,20 @@ class ZLinkStreamSessionRuntime {
518
549
  return;
519
550
  this.disconnectQueued = true;
520
551
  this.stopLivenessChecks();
521
- void this.serial
522
- .executeFinal(async () => {
523
- this.disconnectQueued = false;
524
- if (this.disconnected)
525
- return;
526
- this.stream.markTransportClosed();
527
- this.disconnected = true;
528
- await this.complete(error, true);
529
- })
530
- .catch(() => {
531
- this.disconnectQueued = false;
532
- });
552
+ this.stream.markTransportClosed();
553
+ const bindingsCleanup = this.context.cleanupBindings();
554
+ void Promise.all([
555
+ bindingsCleanup,
556
+ this.serial.executeFinal(async () => {
557
+ this.disconnectQueued = false;
558
+ if (this.disconnected)
559
+ return;
560
+ this.disconnected = true;
561
+ await this.complete(error, true, bindingsCleanup);
562
+ })
563
+ ]).catch((failure) => this.options.onError?.(failure));
533
564
  }
534
- async cleanup() {
565
+ async cleanup(bindingsCleanup) {
535
566
  if (this.connected && !this.metricsClosed) {
536
567
  this.metricsClosed = true;
537
568
  this.options.metrics?.change(runtime_metrics_1.METRIC_NAMES.StreamConnectionsActive, -1, { transport: 'tcp' });
@@ -540,7 +571,7 @@ class ZLinkStreamSessionRuntime {
540
571
  close_reason: normalizeStreamCloseReason(this.closeReason)
541
572
  });
542
573
  }
543
- await this.context.cleanupBindings();
574
+ await (bindingsCleanup ?? this.context.cleanupBindings());
544
575
  this.removeSession(this.stream.sessionId, this);
545
576
  }
546
577
  enqueueControl(work, onRejected, onShutdownRejected) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zlink-systems/framework",
3
- "version": "0.30.3",
3
+ "version": "0.32.0",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "repository": {
6
6
  "type": "git",
@@ -19,7 +19,7 @@
19
19
  "dependencies": {
20
20
  "@opentelemetry/api": "^1.9.1",
21
21
  "@opentelemetry/api-logs": "^0.221.0",
22
- "@zlink-systems/stream-wire": "0.30.3",
23
- "@zlink-systems/zlink": "1.20.0"
22
+ "@zlink-systems/stream-wire": "0.32.0",
23
+ "@zlink-systems/zlink": "1.23.0"
24
24
  }
25
25
  }
@@ -1,8 +1,14 @@
1
1
  import type { ZLinkActorContext } from './ZLinkActorContext';
2
2
  import type { ZLinkActorJoinCompletion } from './ZLinkActorFactory';
3
+ import type { ZLinkSessionBindingIdentity } from './ZLinkSessionBindingIdentity';
3
4
 
4
5
  export interface ZLinkActor {
5
6
  readonly context: ZLinkActorContext;
6
7
  configure?(): void;
7
8
  onJoinCompleted?(completion: ZLinkActorJoinCompletion): Promise<void>;
9
+ onDuplicateBind?(
10
+ current: ZLinkSessionBindingIdentity,
11
+ incoming: ZLinkSessionBindingIdentity,
12
+ signal: AbortSignal
13
+ ): Promise<string | undefined>;
8
14
  }
@@ -0,0 +1,7 @@
1
+ import type { RoutingId } from '../Common';
2
+
3
+ export interface ZLinkSessionBindingIdentity {
4
+ readonly sessionOwnerNodeRid: RoutingId;
5
+ readonly sessionOwnerNodeGeneration: bigint;
6
+ readonly bindingGeneration: bigint;
7
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './ZLinkActor';
2
+ export * from './ZLinkSessionBindingIdentity';
2
3
  export * from './ZLinkActorContext';
3
4
  export * from './ZLinkActorClient';
4
5
  export * from './ZLinkActorFactory';
@@ -1,4 +1,5 @@
1
1
  export type Type<T = unknown> = new (...args: never[]) => T;
2
+ export type ZLinkMessageTypeResolver<T = unknown> = Type<T> | (() => Type<T>);
2
3
  export type RoutingId = string;
3
4
  /** Global logical Actor identity. It does not encode a Mesh or owner route. */
4
5
  export type ActorId = string;