@zlink-systems/framework 0.30.0 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -208,22 +208,34 @@ export function wrapSocket<T extends { close(): void }>(
208
208
  },
209
209
  request(...args: unknown[]): unknown {
210
210
  if (hasRoutedPeer) {
211
- const [routingId, payload, timeoutMs] = args as [unknown, unknown, number | undefined];
211
+ const [routingId, payload, timeoutMs, onAdmitted] = args as [
212
+ unknown,
213
+ unknown,
214
+ number | undefined,
215
+ (() => void) | undefined
216
+ ];
212
217
  return submitBindingRequest(
213
218
  (
214
219
  nativeInstance as T & { request(routingId: unknown): ZLinkBindingRequestOperation }
215
220
  ).request(toNativeRoutingId(routingId)),
216
221
  payload,
217
- timeoutMs
222
+ timeoutMs,
223
+ undefined,
224
+ onAdmitted
218
225
  );
219
226
  }
220
227
  if (hasRequest) {
221
- const [payload, timeoutMs] = args as [unknown, number | undefined];
228
+ const [payload, timeoutMs, onAdmitted] = args as [
229
+ unknown,
230
+ number | undefined,
231
+ (() => void) | undefined
232
+ ];
222
233
  return submitBindingRequest(
223
234
  (nativeInstance as T & { request(): ZLinkBindingRequestOperation }).request(),
224
235
  payload,
225
236
  timeoutMs,
226
- adapter.receiveAdmission?.recordReceived
237
+ adapter.receiveAdmission?.recordReceived,
238
+ onAdmitted
227
239
  );
228
240
  }
229
241
  throw new TypeError('Backend request requires a DEALER or ROUTER socket.');
@@ -302,7 +314,8 @@ export function wrapSocket<T extends { close(): void }>(
302
314
  targetRid: unknown,
303
315
  targetSpot: unknown,
304
316
  payload: unknown,
305
- timeoutMs?: number
317
+ timeoutMs?: number,
318
+ onAdmitted?: () => void
306
319
  ): Promise<readonly unknown[]> {
307
320
  return submitBindingRequest(
308
321
  (
@@ -311,13 +324,15 @@ export function wrapSocket<T extends { close(): void }>(
311
324
  }
312
325
  ).requestToSpot(toNativeRoutingId(targetRid), toNativeRoutingId(targetSpot)),
313
326
  payload,
314
- timeoutMs
327
+ timeoutMs,
328
+ undefined,
329
+ onAdmitted
315
330
  );
316
331
  },
317
332
  disconnectPeer(routingId: unknown): void {
318
- disconnectStreamPeer(
333
+ disconnectSocketPeer(
319
334
  nativeInstance as T & { disconnectRid(value: unknown): void },
320
- routingId
335
+ toNativeRoutingId(routingId)
321
336
  );
322
337
  },
323
338
  async bindActor(
@@ -361,15 +376,15 @@ export function nodeEventLoopPollerOf(socket: object): ZLinkNodeEventLoopPoller
361
376
  return poller;
362
377
  }
363
378
 
364
- export function disconnectStreamPeer(
379
+ export function disconnectSocketPeer(
365
380
  socket: { disconnectRid(routingId: unknown): void },
366
381
  routingId: unknown
367
382
  ): void {
368
383
  try {
369
- socket.disconnectRid(toNativeRoutingId(routingId));
384
+ socket.disconnectRid(routingId);
370
385
  } catch (error) {
371
386
  // An absent RID has already completed the physical close. The existing
372
- // session lifecycle still owns local cleanup and unbind.
387
+ // logical lifecycle still owns local cleanup and unbind.
373
388
  if (!isBindingNotFound(error)) throw error;
374
389
  }
375
390
  }
@@ -67,7 +67,8 @@ export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
67
67
  targetRid: string,
68
68
  parts: readonly Uint8Array[],
69
69
  timeoutMs: number,
70
- recordReceived?: () => void
70
+ recordReceived?: () => void,
71
+ onAdmitted?: () => void
71
72
  ): Promise<readonly Buffer[]>;
72
73
  receive(dontWait?: boolean): ZLinkRawReceivedRecord | undefined;
73
74
  /** The selected route of every RID. The socket's one route observer calls it. */
@@ -77,7 +78,11 @@ export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
77
78
  export interface ZLinkRawDealerPort extends ZLinkRawSocketPort {
78
79
  setRoutingId(routingId: string): void;
79
80
  send(parts: readonly Uint8Array[]): Promise<void>;
80
- request(parts: readonly Uint8Array[], timeoutMs: number): Promise<readonly Buffer[]>;
81
+ request(
82
+ parts: readonly Uint8Array[],
83
+ timeoutMs: number,
84
+ onAdmitted?: () => void
85
+ ): Promise<readonly Buffer[]>;
81
86
  receive(dontWait?: boolean): ZLinkRawReceivedRecord | undefined;
82
87
  }
83
88
 
@@ -17,6 +17,12 @@ export class ZLinkBufferMessage implements Message {
17
17
  return new ZLinkBufferMessage(bytes);
18
18
  }
19
19
 
20
+ static retainPayload(message: Message): Buffer {
21
+ // Binding data() Buffers retain their storage after the message handle closes.
22
+ // Preserve that ownership at runtime boundaries without copying the payload.
23
+ return message.data();
24
+ }
25
+
20
26
  data(): Buffer {
21
27
  return this.bytes;
22
28
  }
@@ -39,6 +39,7 @@ export type SubmitResult = (typeof SubmitResult)[keyof typeof SubmitResult];
39
39
  export type ZLinkBackendSendFlags = number;
40
40
  export type ZLinkBackendRecvFlags = number;
41
41
  export const ZLINK_BACKEND_SEND_NONE: ZLinkBackendSendFlags = 0;
42
+ export const ZLINK_BACKEND_SEND_DONT_WAIT: ZLinkBackendSendFlags = 1;
42
43
  export const ZLINK_BACKEND_RECV_DONT_WAIT: ZLinkBackendRecvFlags = 1;
43
44
 
44
45
  export class ZLinkBackendResultError extends Error {
@@ -1,4 +1,6 @@
1
1
  import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
2
+ import { createZLinkRequest } from '../messaging/request-result';
3
+ import type { ZLinkRequest } from '../../contracts/Handlers/Attributes';
2
4
  import type {
3
5
  ZLinkChannelClient,
4
6
  ZLinkChannelRequestCall,
@@ -23,6 +25,7 @@ import {
23
25
  requireClassicFanoutCompletion,
24
26
  throwAlreadySubmitted,
25
27
  ZLinkSubmitStatus,
28
+ submittedResult,
26
29
  type ZLinkSubmitResult
27
30
  } from '../messaging/submission-result';
28
31
  import type {
@@ -165,7 +168,23 @@ export class DefaultZLinkFanoutClient implements ZLinkFanoutClient {
165
168
  }
166
169
  }
167
170
 
171
+ interface PreparedNodeSend {
172
+ readonly validate: () => void;
173
+ readonly submit: (
174
+ packetName: string | undefined,
175
+ metadata: ReadonlyMap<string, string>,
176
+ message?: unknown
177
+ ) => ZLinkSubmitResult | Promise<ZLinkSubmitResult>;
178
+ }
179
+
180
+ interface PreparedNodeRequest {
181
+ readonly validate: () => void;
182
+ readonly submit: ZLinkRequestSubmitter;
183
+ }
184
+
168
185
  export class DefaultZLinkRouteClient implements ZLinkRouteClient {
186
+ private readonly nodeSends = new Map<string, Map<string, PreparedNodeSend>>();
187
+ private readonly nodeRequests = new Map<string, Map<string, PreparedNodeRequest>>();
169
188
  constructor(
170
189
  private readonly registration: ZLinkFrameworkRegistration,
171
190
  private readonly transport?: ZLinkRouteClientTransport,
@@ -175,35 +194,50 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
175
194
  ) {}
176
195
 
177
196
  sendToNode(meshName: string, targetNodeRid: string, message: unknown): ZLinkSendCall {
178
- return new DefaultZLinkSendCall(
179
- () => this.requireMesh(meshName),
180
- async (packetName, metadata) =>
181
- normalizeSubmitResult(
182
- await this.requireTransport().submit(
197
+ let targets = this.nodeSends.get(meshName);
198
+ if (targets === undefined) this.nodeSends.set(meshName, (targets = new Map()));
199
+ let prepared = targets.get(targetNodeRid);
200
+ if (prepared === undefined) {
201
+ prepared = {
202
+ validate: () => {
203
+ this.requireMesh(meshName);
204
+ },
205
+ submit: (packetName, metadata, payload) =>
206
+ normalizeSubmitResult(
207
+ this.requireTransport().submit(meshName, targetNodeRid, packetName, payload, metadata)
208
+ )
209
+ };
210
+ targets.set(targetNodeRid, prepared);
211
+ }
212
+ return new DefaultZLinkSendCall(prepared.validate, prepared.submit, message);
213
+ }
214
+
215
+ requestToNode(meshName: string, targetNodeRid: string, request: unknown): ZLinkRequestCall {
216
+ let targets = this.nodeRequests.get(meshName);
217
+ if (targets === undefined) this.nodeRequests.set(meshName, (targets = new Map()));
218
+ let prepared = targets.get(targetNodeRid);
219
+ if (prepared === undefined) {
220
+ prepared = {
221
+ validate: () => this.requireMesh(meshName),
222
+ submit: (packetName, timeoutMs, metadata, signal, onAdmitted, message) =>
223
+ this.requireTransport().request(
183
224
  meshName,
184
225
  targetNodeRid,
185
226
  packetName,
186
227
  message,
187
- metadata
228
+ timeoutMs,
229
+ signal,
230
+ metadata,
231
+ onAdmitted
188
232
  )
189
- )
190
- );
191
- }
192
-
193
- requestToNode(meshName: string, targetNodeRid: string, request: unknown): ZLinkRequestCall {
233
+ };
234
+ targets.set(targetNodeRid, prepared);
235
+ }
194
236
  return new DefaultZLinkRequestCall(
195
- () => this.requireMesh(meshName),
196
- (packetName, timeoutMs, metadata, signal) =>
197
- this.requireTransport().request(
198
- meshName,
199
- targetNodeRid,
200
- packetName,
201
- request,
202
- timeoutMs,
203
- signal,
204
- metadata
205
- ),
206
- this.defaultRequestTimeout(meshName)
237
+ prepared.validate,
238
+ prepared.submit,
239
+ this.defaultRequestTimeout(meshName),
240
+ request
207
241
  );
208
242
  }
209
243
 
@@ -233,7 +267,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
233
267
  requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
234
268
  return new DefaultZLinkRequestCall(
235
269
  () => this.requireChannelRoute(channelName),
236
- (packetName, timeoutMs, metadata, signal) => {
270
+ (packetName, timeoutMs, metadata, signal, onAdmitted) => {
237
271
  const route = this.requireChannelRoute(channelName);
238
272
  if (route.kind === 'route-mesh') {
239
273
  return this.requireTransport().requestToChannel(
@@ -243,7 +277,8 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
243
277
  request,
244
278
  timeoutMs,
245
279
  signal,
246
- metadata
280
+ metadata,
281
+ onAdmitted
247
282
  );
248
283
  }
249
284
  return this.requireChannelTransport().request(
@@ -252,7 +287,8 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
252
287
  request,
253
288
  timeoutMs,
254
289
  signal,
255
- metadata
290
+ metadata,
291
+ onAdmitted
256
292
  );
257
293
  },
258
294
  this.defaultRequestTimeoutForChannel(channelName)
@@ -279,11 +315,12 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
279
315
  () => {
280
316
  this.requireSpotTransport();
281
317
  },
282
- (_packetName, timeoutMs, metadata, signal) =>
318
+ (_packetName, timeoutMs, metadata, signal, onAdmitted) =>
283
319
  requestToSpotHandle(this.requireSpotTransport(), spot, request, {
284
320
  timeoutMs,
285
321
  signal,
286
322
  metadata,
323
+ onAdmitted,
287
324
  spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
288
325
  }),
289
326
  this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS
@@ -416,21 +453,24 @@ export class DefaultZLinkSpotPublisherClient implements ZLinkSpotPublisherClient
416
453
  }
417
454
 
418
455
  class DefaultZLinkSendCall implements ZLinkSendCall {
419
- private readonly selectedMetadata = new Map<string, string>();
456
+ private selectedMetadata?: Map<string, string>;
420
457
  private executed = false;
421
458
 
422
459
  constructor(
423
460
  private readonly validate: () => void,
424
461
  private readonly submitter: (
425
462
  packetName: string | undefined,
426
- metadata: ReadonlyMap<string, string>
427
- ) => Promise<ZLinkSubmitResult>
463
+ metadata: ReadonlyMap<string, string>,
464
+ message?: unknown
465
+ ) => ZLinkSubmitResult | Promise<ZLinkSubmitResult>,
466
+ private readonly message?: unknown
428
467
  ) {}
429
468
 
430
469
  metadata(key: string, value: string): this;
431
470
  metadata(metadata: ZLinkMessageMetadata): this;
432
471
  metadata(keyOrMetadata: string | ZLinkMessageMetadata, value?: string): this {
433
472
  ensureNotExecuted(this.executed);
473
+ this.selectedMetadata ??= new Map<string, string>();
434
474
  if (typeof keyOrMetadata === 'string') {
435
475
  this.selectedMetadata.set(keyOrMetadata, value!);
436
476
  } else {
@@ -441,12 +481,22 @@ class DefaultZLinkSendCall implements ZLinkSendCall {
441
481
  return this;
442
482
  }
443
483
 
444
- async submit(): Promise<void> {
445
- ensureNotExecuted(this.executed);
446
- this.validate();
447
- this.executed = true;
448
- const result = await this.submitter(undefined, new Map(this.selectedMetadata));
449
- requireOneWayCompletion(result, 'One-way send');
484
+ submit(): Promise<void> {
485
+ try {
486
+ ensureNotExecuted(this.executed);
487
+ this.validate();
488
+ this.executed = true;
489
+ const result = this.submitter(
490
+ undefined,
491
+ this.selectedMetadata ?? EMPTY_CALL_METADATA,
492
+ this.message
493
+ );
494
+ if (result instanceof Promise) return result.then(completeOneWaySend);
495
+ completeOneWaySend(result);
496
+ return completedOneWaySend;
497
+ } catch (error) {
498
+ return Promise.reject(error);
499
+ }
450
500
  }
451
501
  }
452
502
 
@@ -456,29 +506,47 @@ function ensureNotExecuted(executed: boolean): void {
456
506
  }
457
507
  }
458
508
 
459
- function normalizeSubmitResult(result: void | ZLinkSubmitResult): ZLinkSubmitResult {
460
- return result ?? { status: ZLinkSubmitStatus.Submitted };
509
+ const EMPTY_CALL_METADATA: ReadonlyMap<string, string> = new Map();
510
+ const completedOneWaySend = Promise.resolve();
511
+
512
+ function completeOneWaySend(result: ZLinkSubmitResult): void {
513
+ requireOneWayCompletion(result, 'One-way send');
514
+ }
515
+
516
+ function normalizeSubmitResult(
517
+ result: void | ZLinkSubmitResult | Promise<void | ZLinkSubmitResult>
518
+ ): ZLinkSubmitResult | Promise<ZLinkSubmitResult> {
519
+ return result instanceof Promise
520
+ ? result.then((value) => value ?? submittedResult)
521
+ : (result ?? submittedResult);
461
522
  }
462
523
 
524
+ type ZLinkRequestSubmitter = <TReply>(
525
+ packetName: string | undefined,
526
+ timeoutMs: number | undefined,
527
+ metadata: ReadonlyMap<string, string>,
528
+ signal?: AbortSignal,
529
+ onAdmitted?: () => void,
530
+ message?: unknown
531
+ ) => Promise<TReply>;
532
+
463
533
  class DefaultZLinkRequestCall implements ZLinkChannelRequestCall {
464
534
  private timeoutMs?: number;
465
- private readonly selectedMetadata = new Map<string, string>();
535
+ private selectedMetadata?: Map<string, string>;
466
536
  private readonly turn: ZLinkSpotSerialTurn | undefined = captureZLinkSpotSerialTurn();
467
537
 
538
+ /** `message` is the request payload a prepared submitter receives per call. */
468
539
  constructor(
469
540
  private readonly validate: () => void,
470
- private readonly submitter: <TReply>(
471
- packetName: string | undefined,
472
- timeoutMs: number | undefined,
473
- metadata: ReadonlyMap<string, string>,
474
- signal?: AbortSignal
475
- ) => Promise<TReply>,
476
- private readonly defaultRequestTimeoutMs?: number
541
+ private readonly submitter: ZLinkRequestSubmitter,
542
+ private readonly defaultRequestTimeoutMs?: number,
543
+ private readonly message?: unknown
477
544
  ) {}
478
545
 
479
546
  metadata(key: string, value: string): this;
480
547
  metadata(metadata: ZLinkMessageMetadata): this;
481
548
  metadata(keyOrMetadata: string | ZLinkMessageMetadata, value?: string): this {
549
+ this.selectedMetadata ??= new Map<string, string>();
482
550
  if (typeof keyOrMetadata === 'string') {
483
551
  this.selectedMetadata.set(keyOrMetadata, value!);
484
552
  } else {
@@ -494,15 +562,19 @@ class DefaultZLinkRequestCall implements ZLinkChannelRequestCall {
494
562
  return this;
495
563
  }
496
564
 
497
- async submit<TReply>(signal?: AbortSignal): Promise<TReply> {
498
- throwIfAborted(signal);
499
- this.validate();
500
- return this.submitter<TReply>(
501
- undefined,
502
- this.timeoutMs ?? this.defaultRequestTimeoutMs,
503
- new Map(this.selectedMetadata),
504
- signal
505
- );
565
+ submit<TReply>(signal?: AbortSignal): ZLinkRequest<TReply> {
566
+ return createZLinkRequest((onAdmitted) => {
567
+ throwIfAborted(signal);
568
+ this.validate();
569
+ return this.submitter<TReply>(
570
+ undefined,
571
+ this.timeoutMs ?? this.defaultRequestTimeoutMs,
572
+ this.selectedMetadata === undefined ? EMPTY_CALL_METADATA : new Map(this.selectedMetadata),
573
+ signal,
574
+ onAdmitted,
575
+ this.message
576
+ );
577
+ });
506
578
  }
507
579
 
508
580
  async yield<TReply>(signal?: AbortSignal): Promise<TReply> {
@@ -512,10 +584,12 @@ class DefaultZLinkRequestCall implements ZLinkChannelRequestCall {
512
584
  const pending = this.submitter<TReply>(
513
585
  undefined,
514
586
  this.timeoutMs ?? this.defaultRequestTimeoutMs,
515
- new Map(this.selectedMetadata),
516
- signal
587
+ this.selectedMetadata === undefined ? EMPTY_CALL_METADATA : new Map(this.selectedMetadata),
588
+ signal,
589
+ undefined,
590
+ this.message
517
591
  );
518
- return turn.yieldPromise(pending);
592
+ return turn.yieldFrameworkPromise(pending);
519
593
  }
520
594
  }
521
595