@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
@@ -36,10 +36,6 @@ const UNSTARTED_DIAGNOSTIC_ENDPOINT = 'inproc://not-started';
36
36
  const MULTIPART_PACKET_NAME = service_wire_constants_generated_1.SERVICE_FRAMEWORK_MULTIPART_PACKET_NAME;
37
37
  const MULTIPART_CONTENT_TYPE = service_wire_constants_generated_1.SERVICE_FRAMEWORK_MULTIPART_CONTENT_TYPE;
38
38
  const MAX_DRAIN_RECORDS = 64;
39
- // The maintenance timer runs at the nearest management deadline and never
40
- // sooner than this. Only the binding readable handler admits receive work;
41
- // this timer never probes the socket.
42
- const MESH_BACKEND_MAINTENANCE_INTERVAL_MS = 1;
43
39
  /** The longest single timer delay Node accepts. */
44
40
  const MESH_BACKEND_MAINTENANCE_MAX_DELAY_MS = 2 ** 31 - 1;
45
41
  // Spec 08 §4.2 bounds the combined turn. Raw gets one equal share; stateful
@@ -78,11 +74,13 @@ class ZLinkNodeRawMeshBackend {
78
74
  maintenanceDueMs = Number.POSITIVE_INFINITY;
79
75
  pumpTask;
80
76
  readable = 0;
81
- onReadable = (receiveReady, routeReady) => {
77
+ onReadable = (receiveReady, routeReady, connectReady) => {
82
78
  if (receiveReady)
83
79
  this.readable |= 1;
84
80
  if (routeReady)
85
81
  this.readable |= 2;
82
+ if (connectReady)
83
+ this.readable |= 4;
86
84
  this.pump();
87
85
  };
88
86
  onMaintenance = () => {
@@ -110,10 +108,10 @@ class ZLinkNodeRawMeshBackend {
110
108
  protocolError;
111
109
  messageFollowHandler;
112
110
  dispatchErrors;
113
- sessionOwnerDescriptors;
114
111
  requestSourceAcceptance;
112
+ sessionOwnerDescriptors;
115
113
  peerDisconnectedHandlers = new Set();
116
- constructor(meshName, routingId, bindingPort, applicationJobQueue, applicationJobReceiveFlowFailureSink, peerAdmissionSealed, infrastructureTaskRunner) {
114
+ constructor(meshName, routingId, bindingPort, applicationJobQueue, applicationJobReceiveFlowFailureSink, peerAdmissionSealed, infrastructureTaskRunner, runtimeDependencies) {
117
115
  this.meshName = meshName;
118
116
  this.bindingPort = bindingPort;
119
117
  this.applicationJobQueue = applicationJobQueue;
@@ -127,6 +125,8 @@ class ZLinkNodeRawMeshBackend {
127
125
  }
128
126
  this.routingId = routingId;
129
127
  this.lifecycleGeneration = createLifecycleGeneration();
128
+ this.runtime = runtimeDependencies?.raw;
129
+ this.stateful = runtimeDependencies?.stateful;
130
130
  }
131
131
  configureObjectPlacement(options) {
132
132
  this.requireNotStarted();
@@ -180,8 +180,8 @@ class ZLinkNodeRawMeshBackend {
180
180
  const result = await this.requireStateful().sendToMissingInstanceSpotFrame(target, encodeMultipartApplicationFrame(parts), deadlineUnixMs, sourceSpotId, metadata === undefined ? undefined : (0, service_metadata_codec_1.encodeServiceMetadataFrame)(metadata));
181
181
  return result;
182
182
  }
183
- requestToMissingInstanceSpot(target, parts, deadlineUnixMs, sourceSpotId, metadata, onAdmitted) {
184
- return this.observeStateful(service_runtime_contracts_1.OperationKind.InstanceSpotRequest, this.requireStateful().requestToMissingInstanceSpotFrame(target, encodeMultipartApplicationFrame(parts), deadlineUnixMs, sourceSpotId, metadata === undefined ? undefined : (0, service_metadata_codec_1.encodeServiceMetadataFrame)(metadata), onAdmitted));
183
+ requestToMissingInstanceSpot(target, parts, deadlineUnixMs, sourceSpotId, metadata, onAdmitted, requestOperation) {
184
+ return this.observeStatefulRequest(service_runtime_contracts_1.OperationKind.InstanceSpotRequest, requestOperation, () => this.requireStateful().requestToMissingInstanceSpotFrame(target, encodeMultipartApplicationFrame(parts), deadlineUnixMs, sourceSpotId, metadata === undefined ? undefined : (0, service_metadata_codec_1.encodeServiceMetadataFrame)(metadata), onAdmitted, requestOperation));
185
185
  }
186
186
  setRoutingId(routingId) {
187
187
  if (!(0, routing_id_1.routingIdsEqual)((0, routing_id_2.toBackendRoutingId)(routingId), this.routingId)) {
@@ -200,6 +200,11 @@ class ZLinkNodeRawMeshBackend {
200
200
  throw new TypeError('MeshNode advertise host must be non-empty.');
201
201
  this.advertiseHost = host;
202
202
  }
203
+ requests;
204
+ setRequestRuntime(requests) {
205
+ this.requireNotStarted();
206
+ this.requests = requests;
207
+ }
203
208
  start() {
204
209
  if (this.runtime !== undefined)
205
210
  return;
@@ -209,12 +214,13 @@ class ZLinkNodeRawMeshBackend {
209
214
  throw new Error('MeshNode bind endpoint is not configured.');
210
215
  const descriptor = this.createDescriptor();
211
216
  const runtime = new raw_service_mesh_runtime_1.RawServiceMeshRuntime({
217
+ requests: this.requests,
212
218
  onPendingOperationsChanged: this.onPendingOperationsChanged,
213
219
  descriptor,
214
220
  resolveAdvertisedEndpoint: (boundEndpoint) => this.resolveAdvertisedEndpoint(boundEndpoint),
215
221
  bindingPort: this.bindingPort,
216
222
  applicationJobQueue: this.requireApplicationJobQueue(),
217
- onReceiveReady: () => this.onReadable(true, false),
223
+ onReceiveReady: () => this.onReadable(true, false, false),
218
224
  infrastructureTaskRunner: this.infrastructureTaskRunner,
219
225
  peerAdmissionSealed: this.peerAdmissionSealed,
220
226
  onReceiveFlowConfigFailure: this.applicationJobReceiveFlowFailureSink,
@@ -239,7 +245,7 @@ class ZLinkNodeRawMeshBackend {
239
245
  }
240
246
  });
241
247
  runtime.start();
242
- this.stateful = new service_stateful_runtime_1.ServiceStatefulRuntime(runtime, descriptor.nodeRoutingId, descriptor.lifecycleGeneration, this.onPendingOperationsChanged);
248
+ this.stateful = new service_stateful_runtime_1.ServiceStatefulRuntime(runtime, descriptor.nodeRoutingId, descriptor.lifecycleGeneration, this.onPendingOperationsChanged, this.requests);
243
249
  if (this.dispatchErrors !== undefined) {
244
250
  this.stateful.setDispatchErrorReporter(this.dispatchErrors, this.meshName);
245
251
  }
@@ -326,15 +332,28 @@ class ZLinkNodeRawMeshBackend {
326
332
  async connectPeer(options) {
327
333
  const runtime = this.requireRuntime();
328
334
  const nodeRoutingId = options.expectedRid === undefined ? undefined : String(options.expectedRid);
335
+ const securityIdentity = options.expectedSecurityIdentity ?? runtime.topology.localDescriptor().securityIdentity;
336
+ for (const [id, existing] of this.peerIntents) {
337
+ if (existing.endpoint !== options.endpoint)
338
+ continue;
339
+ if (existing.nodeRoutingId === nodeRoutingId &&
340
+ existing.securityIdentity === securityIdentity &&
341
+ existing.lifecycleGeneration === options.expectedLifecycleGeneration) {
342
+ return id;
343
+ }
344
+ runtime.disconnectPeerEndpoint(existing.endpoint);
345
+ this.peerIntents.delete(id);
346
+ }
329
347
  if (nodeRoutingId === undefined) {
330
348
  runtime.connectPeerEndpoint(options.endpoint);
331
349
  }
332
350
  else {
333
- runtime.connectPeerByRoutingId(options.endpoint, nodeRoutingId, options.expectedSecurityIdentity ?? runtime.topology.localDescriptor().securityIdentity, options.expectedLifecycleGeneration);
351
+ runtime.connectPeerByRoutingId(options.endpoint, nodeRoutingId, securityIdentity, options.expectedLifecycleGeneration);
334
352
  }
335
353
  const intent = this.nextPeerIntent++;
336
354
  this.peerIntents.set(intent, {
337
355
  endpoint: options.endpoint,
356
+ securityIdentity,
338
357
  ...(nodeRoutingId === undefined
339
358
  ? {}
340
359
  : {
@@ -350,6 +369,7 @@ class ZLinkNodeRawMeshBackend {
350
369
  }
351
370
  expectPeer(peer) {
352
371
  this.requireRuntime().expectPeerByRoutingId(peer.endpoint, peer.nodeRoutingId, peer.securityIdentity, peer.lifecycleGeneration);
372
+ this.scheduleMaintenance();
353
373
  }
354
374
  removePeerConnection(intentId) {
355
375
  const intent = this.peerIntents.get(intentId);
@@ -436,22 +456,40 @@ class ZLinkNodeRawMeshBackend {
436
456
  : zlink_1.SubmitResult.NotConnected;
437
457
  }
438
458
  async requestInfrastructureControlFrames(targetRid, frames, options) {
439
- return (0, durable_service_request_1.requestDurableService)(this.requireRuntime(), String(targetRid), frames, performance.now() + (options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS), 'relocation control', options?.signal, options?.onSubmitted);
459
+ const runtime = this.requireRuntime();
460
+ const timeoutMs = options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS;
461
+ const pending = options?.requestOperation ?? runtime.beginInfrastructureRequest(timeoutMs, options?.signal);
462
+ if (options?.requestOperation !== undefined) {
463
+ return (0, durable_service_request_1.requestDurableService)(runtime, String(targetRid), frames, pending, 'relocation control', options.signal, options.onSubmitted);
464
+ }
465
+ const completed = (reply) => {
466
+ pending.complete(reply);
467
+ };
468
+ const failed = (error) => {
469
+ pending.fail(error);
470
+ };
471
+ void (0, durable_service_request_1.requestDurableService)(runtime, String(targetRid), frames, pending, 'relocation control', options?.signal, options?.onSubmitted).then(completed, failed);
472
+ return pending.promise;
440
473
  }
441
- requestToNode(targetRid, parts, options) {
442
- const pending = this.requireRuntime().requestToNode(String(targetRid), encodeMultipartApplicationFrame(parts), options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, options?.onAdmitted, this.requestObserver, service_runtime_contracts_1.OperationKind.NodeRequest);
474
+ requestToNode(targetRid, parts, options, completion) {
475
+ const pending = this.requireRuntime().requestToNode(String(targetRid), encodeMultipartApplicationFrame(parts), options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, options?.onAdmitted, this.requestObserverFor(completion), service_runtime_contracts_1.OperationKind.NodeRequest, options?.requestOperation);
443
476
  return this.observedOperation(pending, service_runtime_contracts_1.OperationKind.NodeRequest);
444
477
  }
445
- async sendToChannel(channelName, parts) {
446
- return this.requireRuntime().sendToChannel(channelName, encodeMultipartApplicationFrame(parts));
478
+ sendToChannel(channelName, parts) {
479
+ try {
480
+ return Promise.resolve(this.requireRuntime().sendToChannel(channelName, encodeMultipartApplicationFrame(parts)));
481
+ }
482
+ catch (error) {
483
+ return Promise.reject(error);
484
+ }
447
485
  }
448
- requestToChannel(channelName, parts, options) {
449
- const pending = this.requireRuntime().requestToChannel(channelName, encodeMultipartApplicationFrame(parts), options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, options?.onAdmitted, this.requestObserver, service_runtime_contracts_1.OperationKind.ChannelRequest);
486
+ requestToChannel(channelName, parts, options, completion) {
487
+ const pending = this.requireRuntime().requestToChannel(channelName, encodeMultipartApplicationFrame(parts), options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, options?.onAdmitted, this.requestObserverFor(completion), service_runtime_contracts_1.OperationKind.ChannelRequest, options?.requestOperation);
450
488
  return this.observedOperation(pending, service_runtime_contracts_1.OperationKind.ChannelRequest);
451
489
  }
452
490
  status() {
453
491
  const descriptor = this.runtime?.topology.localDescriptor() ?? this.createDescriptor();
454
- const peers = this.runtime?.topology.peers() ?? [];
492
+ const peers = (this.runtime?.topology.peers() ?? []).filter((peer) => this.runtime?.isPeerRouteReady(peer.descriptor.nodeRoutingId) === true);
455
493
  return {
456
494
  state: stateCode(descriptor.state),
457
495
  routingId: descriptor.nodeRoutingId,
@@ -705,8 +743,8 @@ class ZLinkNodeRawMeshBackend {
705
743
  const result = await this.requireStateful().sendToInstanceSpot(route, encodeMultipart(parts), sourceSpotId, metadata === undefined ? undefined : (0, service_metadata_codec_1.encodeServiceMetadataFrame)(metadata), instanceIntent);
706
744
  return result;
707
745
  }
708
- requestInstanceSpot(route, parts, timeoutMs = Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, sourceSpotId, metadata, instanceIntent = false, onAdmitted) {
709
- return this.observeStateful(service_runtime_contracts_1.OperationKind.InstanceSpotRequest, this.requireStateful().requestToInstanceSpot(route, encodeMultipart(parts), timeoutMs, sourceSpotId, metadata === undefined ? undefined : (0, service_metadata_codec_1.encodeServiceMetadataFrame)(metadata), instanceIntent, onAdmitted));
746
+ requestInstanceSpot(route, parts, timeoutMs = Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, sourceSpotId, metadata, instanceIntent = false, onAdmitted, requestOperation, completion) {
747
+ return this.observeStatefulRequest(service_runtime_contracts_1.OperationKind.InstanceSpotRequest, requestOperation, (receiver) => this.requireStateful().requestToInstanceSpot(route, encodeMultipart(parts), timeoutMs, sourceSpotId, metadata === undefined ? undefined : (0, service_metadata_codec_1.encodeServiceMetadataFrame)(metadata), instanceIntent, onAdmitted, requestOperation, receiver), completion);
710
748
  }
711
749
  actorLookup(actorId) {
712
750
  const actor = this.requireStateful().actor(actorId);
@@ -745,8 +783,8 @@ class ZLinkNodeRawMeshBackend {
745
783
  async sendToActor(actor, parts, options) {
746
784
  return this.requireStateful().sendToActor(actor, encodeMultipart(parts), undefined, undefined, options?.routeFence);
747
785
  }
748
- requestToActor(actor, parts, options) {
749
- return this.observeStateful(service_runtime_contracts_1.OperationKind.ActorRequest, this.requireStateful().requestToActor(actor, encodeMultipart(parts), options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, undefined, undefined, options?.onAdmitted, options?.routeFence));
786
+ requestToActor(actor, parts, options, completion) {
787
+ return this.observeStatefulRequest(service_runtime_contracts_1.OperationKind.ActorRequest, options?.requestOperation, (receiver) => this.requireStateful().requestToActor(actor, encodeMultipart(parts), options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, undefined, undefined, options?.onAdmitted, options?.routeFence, options?.requestOperation, receiver), completion);
750
788
  }
751
789
  acceptRelocatedActorTerminal(operation, replyRouteId, result) {
752
790
  return this.requireStateful().acceptRelocatedActorTerminal(operation, replyRouteId, result);
@@ -755,7 +793,7 @@ class ZLinkNodeRawMeshBackend {
755
793
  return (await this.requireStateful().sendToActor(target, encodeMultipart(parts), source));
756
794
  }
757
795
  actorRequestToActor(source, target, parts, options) {
758
- return this.observeStateful(service_runtime_contracts_1.OperationKind.ActorRequest, this.requireStateful().requestToActor(target, encodeMultipart(parts), options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, source, undefined, options?.onAdmitted));
796
+ return this.observeStatefulRequest(service_runtime_contracts_1.OperationKind.ActorRequest, options?.requestOperation, () => this.requireStateful().requestToActor(target, encodeMultipart(parts), options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, source, undefined, options?.onAdmitted, undefined, options?.requestOperation));
759
797
  }
760
798
  async sendActorBoundSession(actor, expectedBindingGeneration, parts, _flags) {
761
799
  return (await this.requireStateful().sendBoundSession(actor, expectedBindingGeneration, encodeMultipart(parts)));
@@ -772,8 +810,8 @@ class ZLinkNodeRawMeshBackend {
772
810
  async sendFromSpot(source, target, parts) {
773
811
  return (await this.requireStateful().sendToSpot(source.ref.spotId, target, encodeMultipart(parts)));
774
812
  }
775
- requestFromSpot(source, target, parts, timeoutMs, onAdmitted) {
776
- return this.observeStateful(service_runtime_contracts_1.OperationKind.SpotRequest, this.requireStateful().requestToSpot(source.ref.spotId, target, encodeMultipart(parts), timeoutMs, onAdmitted));
813
+ requestFromSpot(source, target, parts, timeoutMs, onAdmitted, requestOperation, completion) {
814
+ return this.observeStatefulRequest(service_runtime_contracts_1.OperationKind.SpotRequest, requestOperation, (receiver) => this.requireStateful().requestToSpot(source.ref.spotId, target, encodeMultipart(parts), timeoutMs, onAdmitted, requestOperation, receiver), completion);
777
815
  }
778
816
  closeSpot(state) {
779
817
  return this.requireStateful().registry.closeSpot(state.ref);
@@ -827,18 +865,15 @@ class ZLinkNodeRawMeshBackend {
827
865
  /**
828
866
  * Arms the one maintenance timer for the nearest management deadline
829
867
  * (spec 08 §4.2): request expiry, liveness, or a pending peer handshake.
830
- * An earlier deadline re-arms it; a later one keeps the armed time.
868
+ * The timer follows changes to the index visit or the other management deadlines.
831
869
  */
832
870
  scheduleMaintenance() {
833
871
  if (this.closed)
834
872
  return;
835
873
  const nowMs = performance.now();
836
- const dueMs = Math.max(nowMs + MESH_BACKEND_MAINTENANCE_INTERVAL_MS, Math.min(this.runtime?.nextMaintenanceDeadlineMs(nowMs) ?? Number.POSITIVE_INFINITY, this.stateful?.nextMaintenanceDeadlineMs() ?? Number.POSITIVE_INFINITY));
874
+ const dueMs = Math.min(this.runtime?.nextMaintenanceDeadlineMs(nowMs) ?? Number.POSITIVE_INFINITY, this.stateful?.nextMaintenanceDeadlineMs() ?? Number.POSITIVE_INFINITY);
837
875
  if (dueMs === Number.POSITIVE_INFINITY) {
838
- if (this.maintenanceTimer !== undefined)
839
- clearTimeout(this.maintenanceTimer);
840
- this.maintenanceTimer = undefined;
841
- this.maintenanceDueMs = dueMs;
876
+ this.maintenanceTimer?.unref();
842
877
  return;
843
878
  }
844
879
  if (this.maintenanceTimer === undefined || dueMs < this.maintenanceDueMs) {
@@ -860,30 +895,79 @@ class ZLinkNodeRawMeshBackend {
860
895
  pump() {
861
896
  if (this.closed || this.pumpTask !== undefined)
862
897
  return;
863
- this.pumpTask = this.runPump(this.requireRuntime());
898
+ const runtime = this.requireRuntime();
899
+ let complete;
900
+ let fail;
901
+ // Publish the join owner before receive can signal readiness or start close.
902
+ // The receive turn itself needs no startup Promise continuation.
903
+ this.pumpTask = new Promise((resolve, reject) => {
904
+ complete = resolve;
905
+ fail = reject;
906
+ });
907
+ this.runPump(runtime, complete, fail);
864
908
  }
865
- async runPump(runtime) {
866
- // Publish pumpTask before any callback can signal readiness or begin close.
867
- await Promise.resolve();
909
+ runPump(runtime, complete, fail) {
868
910
  try {
869
911
  do {
870
- const ready = this.readable;
871
- this.readable = 0;
872
- const more = await runtime.pumpBatch((ready & 1) !== 0, (ready & 2) !== 0);
912
+ const batch = this.pumpReceiveBatch(runtime);
913
+ if (batch !== false) {
914
+ // Only suspended work needs an async continuation. A completed receive
915
+ // rotation uses the published join without allocating another Promise.
916
+ void this.resumePump(runtime, batch, complete, fail);
917
+ return;
918
+ }
919
+ } while (this.hasPumpReadiness());
920
+ }
921
+ catch (error) {
922
+ this.finishPump(complete, fail, runtime, error);
923
+ return;
924
+ }
925
+ this.finishPump(complete, fail);
926
+ }
927
+ async resumePump(runtime, batch, complete, fail) {
928
+ try {
929
+ for (;;) {
930
+ const more = batch instanceof Promise ? await batch : batch;
873
931
  if (more) {
874
932
  // Yield only after actual progress, retaining readiness across the
875
933
  // existing batch limits until receive reports no data.
876
934
  this.readable |= 1;
877
935
  await (0, promises_1.setImmediate)();
878
936
  }
879
- } while (!this.closed && this.readable !== 0);
937
+ if (!this.hasPumpReadiness())
938
+ break;
939
+ batch = this.pumpReceiveBatch(runtime);
940
+ }
880
941
  }
881
942
  catch (error) {
882
- runtime.reportInfrastructureFailure(error);
943
+ this.finishPump(complete, fail, runtime, error);
944
+ return;
945
+ }
946
+ this.finishPump(complete, fail);
947
+ }
948
+ pumpReceiveBatch(runtime) {
949
+ const ready = this.readable;
950
+ this.readable = 0;
951
+ return runtime.pumpBatch((ready & 1) !== 0, (ready & 2) !== 0, (ready & 4) !== 0);
952
+ }
953
+ hasPumpReadiness() {
954
+ return !this.closed && this.readable !== 0;
955
+ }
956
+ finishPump(complete, fail, failedRuntime, error) {
957
+ try {
958
+ try {
959
+ if (failedRuntime !== undefined)
960
+ failedRuntime.reportInfrastructureFailure(error);
961
+ }
962
+ finally {
963
+ this.pumpTask = undefined;
964
+ this.scheduleMaintenance();
965
+ }
966
+ complete();
883
967
  }
884
- finally {
885
- this.pumpTask = undefined;
886
- this.scheduleMaintenance();
968
+ catch (error) {
969
+ // Forward reporting and maintenance failures to the published join owner.
970
+ fail(error);
887
971
  }
888
972
  }
889
973
  notifyReady() {
@@ -899,31 +983,59 @@ class ZLinkNodeRawMeshBackend {
899
983
  this.readyHandler?.(domains);
900
984
  }
901
985
  /**
902
- * The raw registry takes a remote request's terminal and hands it here,
903
- * where the Framework completion owner receives it in the same turn.
986
+ * Publishes native results after submission returns and the completion slot has its id.
987
+ * A caller-owned entry is completed after the result is mapped.
904
988
  */
905
989
  requestObserver = {
906
- operationCompleted: (id, result, operationKind) => this.deliverCompletion({ high: 1n, low: id }, operationKind ?? 0, result),
907
- operationFailed: (id, error, operationKind) => this.deliverCompletion({ high: 1n, low: id }, operationKind ?? 0, requestFailureResult(error))
990
+ operationCompleted: (id, result, operationKind) => queueMicrotask(() => this.deliverCompletion({ high: 1n, low: id }, operationKind ?? 0, result)),
991
+ operationFailed: (id, error, operationKind) => queueMicrotask(() => this.deliverCompletion({ high: 1n, low: id }, operationKind ?? 0, requestFailureResult(error)))
908
992
  };
909
- observedOperation(pending, operationKind) {
910
- return pending.promise === undefined
911
- ? { high: 1n, low: pending.id }
912
- : this.observeCompletion(pending.id, operationKind, pending.promise);
993
+ requestObserverFor(completion) {
994
+ if (completion === undefined)
995
+ return this.requestObserver;
996
+ return {
997
+ operationCompleted: (id, result, operationKind) => queueMicrotask(() => this.deliverCompletion({ high: 1n, low: id }, operationKind ?? 0, result, completion)),
998
+ operationFailed: (id, error, operationKind) => queueMicrotask(() => this.deliverCompletion({ high: 1n, low: id }, operationKind ?? 0, requestFailureResult(error), completion))
999
+ };
913
1000
  }
914
- observeCompletion(low, operationKind, promise) {
915
- const id = { high: 1n, low };
916
- void promise.then((result) => this.deliverCompletion(id, operationKind, result), (error) => this.deliverCompletion(id, operationKind, requestFailureResult(error)));
917
- return id;
1001
+ observedOperation(pending, operationKind) {
1002
+ const id = { high: 1n, low: pending.id };
1003
+ if (pending.promise !== undefined && !pending.hasObserver()) {
1004
+ void pending.promise.then((result) => this.deliverCompletion(id, operationKind, result), (error) => this.deliverCompletion(id, operationKind, requestFailureResult(error)));
1005
+ }
1006
+ return this.requestSubmission(id, pending);
1007
+ }
1008
+ observeStatefulRequest(kind, entry, submit, completion) {
1009
+ if (entry === undefined)
1010
+ return this.observeStateful(kind, submit(), completion);
1011
+ const id = { high: operation_identity_1.ZLINK_NATIVE_CORRELATION_OPERATION_NAMESPACE, low: entry.id };
1012
+ const receiver = {
1013
+ operationCompleted: (_operationId, value) => queueMicrotask(() => this.deliverCompletion(id, kind, value, completion)),
1014
+ operationFailed: (_operationId, error) => queueMicrotask(() => this.deliverCompletion(id, kind, requestFailureResult(error), completion))
1015
+ };
1016
+ if (completion === undefined) {
1017
+ entry.setObserver(receiver);
1018
+ submit();
1019
+ }
1020
+ else
1021
+ submit(receiver);
1022
+ return this.requestSubmission(id, entry);
918
1023
  }
919
- observeStateful(operationKind, pending) {
1024
+ observeStateful(operationKind, pending, completion) {
920
1025
  const id = { high: operation_identity_1.ZLINK_NATIVE_CORRELATION_OPERATION_NAMESPACE, low: pending.id };
921
- void pending.promise.then((result) => this.deliverCompletion(id, operationKind, result), (error) => this.deliverCompletion(id, operationKind, requestFailureResult(error)));
922
- return id;
1026
+ void pending.promise.then((result) => this.deliverCompletion(id, operationKind, result, completion), (error) => this.deliverCompletion(id, operationKind, requestFailureResult(error), completion));
1027
+ return this.requestSubmission(id, pending);
923
1028
  }
924
- deliverCompletion(operationId, operationKind, result) {
925
- if (this.completionHandler !== undefined) {
926
- this.completionHandler({ operationId, terminalResult: result.terminalResult }, () => completionRecord(operationId, operationKind, result));
1029
+ requestSubmission(id, requestOperation) {
1030
+ return Object.defineProperty({ ...id }, 'requestOperation', {
1031
+ value: requestOperation,
1032
+ configurable: true
1033
+ });
1034
+ }
1035
+ deliverCompletion(operationId, operationKind, result, completion = this
1036
+ .completionHandler) {
1037
+ if (completion !== undefined) {
1038
+ completion({ operationId, terminalResult: result.terminalResult }, () => completionRecord(operationId, operationKind, result));
927
1039
  return;
928
1040
  }
929
1041
  // The raw pull contract uses the existing infrastructure mailbox. A
@@ -1004,10 +1116,15 @@ class RawServiceSpot {
1004
1116
  lifecycleGeneration: this.lifecycleGeneration
1005
1117
  };
1006
1118
  }
1007
- async sendToChannel(channelName, parts, options) {
1008
- this.requireOpen();
1009
- void options;
1010
- return this.backend.sendToChannel(channelName, parts);
1119
+ sendToChannel(channelName, parts, options) {
1120
+ try {
1121
+ this.requireOpen();
1122
+ void options;
1123
+ return this.backend.sendToChannel(channelName, parts);
1124
+ }
1125
+ catch (error) {
1126
+ return Promise.reject(error);
1127
+ }
1011
1128
  }
1012
1129
  requestToChannel(channelName, parts, options) {
1013
1130
  this.requireOpen();
@@ -1020,12 +1137,12 @@ class RawServiceSpot {
1020
1137
  : undefined);
1021
1138
  return this.backend.sendFromSpot(this.state, routeFence, parts);
1022
1139
  }
1023
- requestToSpot(targetNodeRid, targetSpotId, targetSpotGeneration, parts, options) {
1140
+ requestToSpot(targetNodeRid, targetSpotId, targetSpotGeneration, parts, options, completion) {
1024
1141
  this.requireOpen();
1025
1142
  const routeFence = requireDirectSpotRouteFence(options?.routeFence, String(targetNodeRid), String(targetSpotId), targetSpotGeneration, options?.entrySpot === true
1026
1143
  ? this.backend.entrySpotRouteFence(String(targetNodeRid), String(targetSpotId))
1027
1144
  : undefined);
1028
- return this.backend.requestFromSpot(this.state, routeFence, parts, options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, options?.onAdmitted);
1145
+ return this.backend.requestFromSpot(this.state, routeFence, parts, options?.timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, options?.onAdmitted, options?.requestOperation, completion);
1029
1146
  }
1030
1147
  async publish(channelName, topic, parts, options) {
1031
1148
  this.requireOpen();
@@ -1331,13 +1448,16 @@ function completionRecord(operationId, operationKind, result) {
1331
1448
  kindData: 'kindData' in result ? (result.kindData ?? null) : null,
1332
1449
  terminalResult: result.terminalResult,
1333
1450
  failureErrno: result.failureCode,
1451
+ ...('failureMessage' in result && result.failureMessage !== undefined
1452
+ ? { failureMessage: result.failureMessage }
1453
+ : {}),
1334
1454
  parts: payload === undefined
1335
1455
  ? []
1336
1456
  : payload.contentType === MULTIPART_CONTENT_TYPE
1337
1457
  ? decodeMultipart(payload.payload)
1338
1458
  : [runtime_message_1.ZLinkBufferMessage.from(payload.payload)],
1339
- reply: () => zlink_1.SubmitResult.InvalidState,
1340
- replyActorJoin: () => zlink_1.SubmitResult.NotSupported
1459
+ reply: replyInvalidState,
1460
+ replyActorJoin: replyActorJoinNotSupported
1341
1461
  };
1342
1462
  }
1343
1463
  function decodeMultipartRecord(runtime, record) {
@@ -1386,15 +1506,10 @@ function decodeMultipartRecord(runtime, record) {
1386
1506
  const values = Array.isArray(parts) ? parts : [parts];
1387
1507
  if (values.length === 0)
1388
1508
  return zlink_1.SubmitResult.InvalidState;
1389
- runtime.replyService({
1390
- sourceRoutingId: record.sourceRoutingId,
1391
- ...(record.sourceRoute === undefined ? {} : { sourceRoute: record.sourceRoute }),
1392
- requestSequence: record.requestSequence,
1393
- ...(record.reply === undefined ? {} : { reply: record.reply })
1394
- }, values.map((value) => Buffer.from(messageBytesView(value))));
1509
+ runtime.replyService(record, values.map(messagePayloadView));
1395
1510
  return zlink_1.SubmitResult.Ok;
1396
1511
  },
1397
- replyActorJoin: () => zlink_1.SubmitResult.NotSupported
1512
+ replyActorJoin: replyActorJoinNotSupported
1398
1513
  };
1399
1514
  }
1400
1515
  const header = record.parts[0];
@@ -1453,6 +1568,9 @@ function decodeMultipartRecord(runtime, record) {
1453
1568
  function releaseRecordApplicationJob() {
1454
1569
  this.applicationJobPermit?.close();
1455
1570
  }
1571
+ function replyInvalidState() {
1572
+ return zlink_1.SubmitResult.InvalidState;
1573
+ }
1456
1574
  function replyActorJoinNotSupported() {
1457
1575
  return zlink_1.SubmitResult.NotSupported;
1458
1576
  }
@@ -1553,10 +1671,10 @@ function decodeStatefulRecord(record, stateful) {
1553
1671
  });
1554
1672
  return accepted ? zlink_1.SubmitResult.Ok : zlink_1.SubmitResult.InvalidState;
1555
1673
  },
1556
- replyFailure(terminalResult, failureCode) {
1674
+ replyFailure(terminalResult, failureCode, tail) {
1557
1675
  if (stateful.reply === undefined)
1558
1676
  return zlink_1.SubmitResult.InvalidState;
1559
- return stateful.reply(terminalResult, failureCode)
1677
+ return stateful.reply(terminalResult, failureCode, undefined, tail)
1560
1678
  ? zlink_1.SubmitResult.Ok
1561
1679
  : zlink_1.SubmitResult.InvalidState;
1562
1680
  }
@@ -1564,12 +1682,15 @@ function decodeStatefulRecord(record, stateful) {
1564
1682
  }
1565
1683
  function receiveIngressLifecycle(record) {
1566
1684
  const applicationJob = record.applicationJob;
1567
- return applicationJob === undefined
1568
- ? {}
1569
- : {
1570
- applicationJobPermit: applicationJob,
1571
- releaseRetainedIngress: () => applicationJob.close()
1572
- };
1685
+ return {
1686
+ ...(record.receivedAt === undefined ? {} : { receivedAt: record.receivedAt }),
1687
+ ...(applicationJob === undefined
1688
+ ? {}
1689
+ : {
1690
+ applicationJobPermit: applicationJob,
1691
+ releaseRetainedIngress: () => applicationJob.close()
1692
+ })
1693
+ };
1573
1694
  }
1574
1695
  function prepareStatefulMailboxDispatch(signal) {
1575
1696
  const mailboxRecord = this.statefulMailboxRecord;
@@ -1660,32 +1781,17 @@ function encodeMultipart(parts) {
1660
1781
  const values = Array.isArray(parts) ? parts : [parts];
1661
1782
  if (values.length === 0)
1662
1783
  throw new TypeError('Multipart payload must contain at least one part.');
1663
- // messageBytesView aliases the caller's buffer; the parts are consumed
1664
- // synchronously by the copy loop below and never retained.
1665
- const bytes = values.map(messageBytesView);
1666
- let size = 4;
1667
- for (const part of bytes)
1668
- size += 4 + part.byteLength;
1669
- const payload = Buffer.alloc(size);
1670
- payload.writeUInt32BE(bytes.length, 0);
1671
- let offset = 4;
1672
- for (const part of bytes) {
1673
- payload.writeUInt32BE(part.byteLength, offset);
1674
- offset += 4;
1675
- payload.set(part, offset);
1676
- offset += part.byteLength;
1677
- }
1678
1784
  return {
1679
1785
  packetName: MULTIPART_PACKET_NAME,
1680
1786
  contentType: MULTIPART_CONTENT_TYPE,
1681
- payload
1787
+ payload: (0, service_wire_m6a_codec_1.encodeMultipartPayload)(values.map(messagePayloadView))
1682
1788
  };
1683
1789
  }
1684
1790
  function encodeMultipartApplicationFrame(parts) {
1685
1791
  const values = Array.isArray(parts) ? parts : [parts];
1686
1792
  if (values.length === 0)
1687
1793
  throw new TypeError('Multipart payload must contain at least one part.');
1688
- return (0, service_wire_m6a_codec_1.encodeMultipartApplicationPayload)(values.map(messageBytesView), MULTIPART_PACKET_NAME, MULTIPART_CONTENT_TYPE);
1794
+ return (0, service_wire_m6a_codec_1.encodeMultipartApplicationPayload)(values.map(messagePayloadView), MULTIPART_PACKET_NAME, MULTIPART_CONTENT_TYPE);
1689
1795
  }
1690
1796
  function decodeMultipart(payload) {
1691
1797
  return (0, service_wire_m6a_codec_1.decodeMultipartParts)(payload, runtime_message_1.ZLinkBufferMessage.fromOwned, closeMultipartMessage);
@@ -1696,12 +1802,10 @@ function closeMultipartMessage(part) {
1696
1802
  function borrowMultipartPart(part) {
1697
1803
  return part;
1698
1804
  }
1699
- function messageBytesView(value) {
1805
+ function messagePayloadView(value) {
1700
1806
  if (typeof value === 'object' && 'data' in value) {
1701
1807
  return value.data();
1702
1808
  }
1703
- if (typeof value === 'string')
1704
- return Buffer.from(value);
1705
1809
  return value;
1706
1810
  }
1707
1811
  function requireRawReadyBatch(batch) {
@@ -4,6 +4,7 @@ exports.wrapSocket = wrapSocket;
4
4
  exports.nodeEventLoopPollerOf = nodeEventLoopPollerOf;
5
5
  exports.disconnectSocketPeer = disconnectSocketPeer;
6
6
  exports.isEndpointCloseIgnorableError = isEndpointCloseIgnorableError;
7
+ const request_runtime_1 = require("../../foundation/request-runtime");
7
8
  const RegistrationBuilderPolicy_1 = require("../../../contracts/Configuration/RegistrationBuilderPolicy");
8
9
  const node_backend_adapter_support_1 = require("./node-backend-adapter-support");
9
10
  const node_event_loop_poller_1 = require("./node-event-loop-poller");
@@ -18,10 +19,23 @@ function wrapSocket(nativeInstance, pollCompletion) {
18
19
  const eventLoopPoller = pollCompletion === undefined
19
20
  ? undefined
20
21
  : new node_event_loop_poller_1.ZLinkNodeEventLoopPoller(nativeInstance, pollCompletion, () => { });
22
+ const requests = new request_runtime_1.RequestRuntime();
23
+ const submitSocketRequest = (operation, payload, timeoutMs, recordReceived, onAdmitted, requestOperation, receiver) => {
24
+ const pending = requests.begin(timeoutMs, undefined, requestOperation);
25
+ (0, node_backend_adapter_support_1.submitBindingRequest)(operation, payload, timeoutMs, recordReceived, onAdmitted, pending, receiver ?? {
26
+ operationCompleted: (_id, parts) => {
27
+ if (!pending.reply(parts))
28
+ (0, node_backend_adapter_support_1.closeBindingReply)(parts);
29
+ },
30
+ operationFailed: (_id, error) => pending.replyFailure(error)
31
+ });
32
+ return pending.promise;
33
+ };
21
34
  const adapter = {
22
35
  nativeInstance,
23
36
  receiveAdmission: undefined,
24
37
  async dispose() {
38
+ requests.close();
25
39
  eventLoopPoller?.dispose();
26
40
  (0, node_backend_adapter_support_1.closeBindingHandle)(nativeInstance);
27
41
  },
@@ -144,12 +158,12 @@ function wrapSocket(nativeInstance, pollCompletion) {
144
158
  },
145
159
  request(...args) {
146
160
  if (hasRoutedPeer) {
147
- const [routingId, payload, timeoutMs, onAdmitted] = args;
148
- return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.request((0, node_backend_adapter_support_1.toNativeRoutingId)(routingId)), payload, timeoutMs, undefined, onAdmitted);
161
+ const [routingId, payload, timeoutMs, onAdmitted, requestOperation, receiver] = args;
162
+ return submitSocketRequest(nativeInstance.request((0, node_backend_adapter_support_1.toNativeRoutingId)(routingId)), payload, timeoutMs, undefined, onAdmitted, requestOperation, receiver);
149
163
  }
150
164
  if (hasRequest) {
151
- const [payload, timeoutMs, onAdmitted] = args;
152
- return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.request(), payload, timeoutMs, adapter.receiveAdmission?.recordReceived, onAdmitted);
165
+ const [payload, timeoutMs, onAdmitted, requestOperation, receiver] = args;
166
+ return submitSocketRequest(nativeInstance.request(), payload, timeoutMs, adapter.receiveAdmission?.recordReceived, onAdmitted, requestOperation, receiver);
153
167
  }
154
168
  throw new TypeError('Backend request requires a DEALER or ROUTER socket.');
155
169
  },
@@ -201,8 +215,8 @@ function wrapSocket(nativeInstance, pollCompletion) {
201
215
  const operation = nativeInstance.sendToSpot((0, node_backend_adapter_support_1.toNativeRoutingId)(targetRid), (0, node_backend_adapter_support_1.toNativeRoutingId)(targetSpot));
202
216
  await (0, node_backend_adapter_support_1.submitBindingAsyncSend)(operation, payload);
203
217
  },
204
- requestToSpot(targetRid, targetSpot, payload, timeoutMs, onAdmitted) {
205
- return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.requestToSpot((0, node_backend_adapter_support_1.toNativeRoutingId)(targetRid), (0, node_backend_adapter_support_1.toNativeRoutingId)(targetSpot)), payload, timeoutMs, undefined, onAdmitted);
218
+ requestToSpot(targetRid, targetSpot, payload, timeoutMs, onAdmitted, requestOperation, receiver) {
219
+ return submitSocketRequest(nativeInstance.requestToSpot((0, node_backend_adapter_support_1.toNativeRoutingId)(targetRid), (0, node_backend_adapter_support_1.toNativeRoutingId)(targetSpot)), payload, timeoutMs, undefined, onAdmitted, requestOperation, receiver);
206
220
  },
207
221
  disconnectPeer(routingId) {
208
222
  disconnectSocketPeer(nativeInstance, (0, node_backend_adapter_support_1.toNativeRoutingId)(routingId));