@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
@@ -1,10 +1,13 @@
1
+ import { awaitWithAbort } from '../abort';
2
+ import type { PendingOperation } from '../foundation/operation-registry';
3
+ import { inspectRuntime } from '../internal-observation';
1
4
  import { listAllMeshNodeDescriptors } from './location-store-pages';
2
5
  import type { ActorRef, RoutingId, SpotId } from '../../contracts/Common';
3
6
  import { ZLinkFrameworkErrorKind, ZLinkFrameworkException } from '../../contracts/Errors';
4
7
  import { zlinkDefaultLocationOptions } from '../../contracts/Locations/Options';
5
8
  import { ZLinkSpotKind } from '../../contracts/Spots';
6
9
  import { decodeActorAuthorityIdentity } from '../actors/actor-authority-publication';
7
- import { waitActorReply } from '../actors/actor-request-deadline';
10
+ import { remainingActorRequestTimeout } from '../actors/actor-request-deadline';
8
11
  import { emitActorOwnerLeaseObservation, isRelocationDebugEnabled } from '../diagnostics';
9
12
  import { ZLinkStateLane } from '../execution/state-lane';
10
13
  import {
@@ -177,6 +180,14 @@ export interface ZLinkSpotRouteInvalidationFence {
177
180
  export class ZLinkStoreLocationResolvers
178
181
  implements ZLinkPeerLocationResolver, ZLinkSpotHandleResolver, ZLinkActorSpotHandleResolver
179
182
  {
183
+ [inspectRuntime]() {
184
+ return Object.freeze({
185
+ spotRouteKeys: Object.freeze([...this.spotRoutes.keys()]),
186
+ actorRouteKeys: Object.freeze([...this.actorRoutes.keys()]),
187
+ directActorRouteKeys: Object.freeze([...this.directActorRoutes.keys()])
188
+ });
189
+ }
190
+
180
191
  private readonly lane = new ZLinkStateLane();
181
192
  private readonly liveRows: ZLinkLiveRowFilter;
182
193
  private readonly monotonicNowMs: () => number;
@@ -416,16 +427,17 @@ export class ZLinkStoreLocationResolvers
416
427
  async resolveDirectActorRoute(
417
428
  actorId: string,
418
429
  signal?: AbortSignal,
419
- deadlineMs?: number
430
+ deadlineMs?: number,
431
+ requestOperation?: PendingOperation<unknown>
420
432
  ): Promise<ZLinkDirectActorRouteResolution> {
421
433
  const cached = await this.lane.run(() => this.getCachedCore(this.directActorRoutes, actorId));
422
434
  if (cached !== undefined) return { kind: 'ready', route: cached };
423
- return await waitActorReply(
424
- this.resolveUncachedDirectActorRoute(actorId, signal),
425
- actorId,
426
- deadlineMs,
427
- signal
428
- );
435
+ const resolving = this.resolveUncachedDirectActorRoute(actorId, signal);
436
+ if (requestOperation === undefined) {
437
+ remainingActorRequestTimeout(actorId, deadlineMs);
438
+ return await awaitWithAbort(resolving, signal);
439
+ }
440
+ return await resolving;
429
441
  }
430
442
 
431
443
  private async resolveUncachedDirectActorRoute(
@@ -220,7 +220,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
220
220
  return this.ownerToken;
221
221
  }
222
222
 
223
- /** Location runtime §5: a startup Store request ends within the renew timeout. */
223
+ /** Location runtime §5: a descriptor publication ends within the renew timeout. */
224
224
  async writeDescriptor<T>(
225
225
  action: (signal?: AbortSignal) => Promise<T>,
226
226
  signal?: AbortSignal
@@ -386,7 +386,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
386
386
  async cleanupOwner(signal?: AbortSignal): Promise<void> {
387
387
  const pending = this.heartbeatRenewal;
388
388
  try {
389
- await withTimeout(() => pending ?? Promise.resolve(), undefined, signal);
389
+ await (pending ?? Promise.resolve());
390
390
  } catch (error) {
391
391
  if (!isAbortError(error)) throw error;
392
392
  } finally {
@@ -396,25 +396,14 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
396
396
  return;
397
397
  }
398
398
  try {
399
- const owner = this.ownerToken ??
400
- this.lastOwnerToken ?? {
401
- ownerId: this.ownerId,
402
- leaseGeneration: 0n
403
- };
404
- await withTimeout(
405
- async (cleanupSignal) => {
406
- await this.stores.locationStore.removeAllByOwner(owner, cleanupSignal);
407
- const currentLease = await this.stores.ownerLeaseStore.readOwnerLease(
408
- this.ownerId,
409
- cleanupSignal
410
- );
411
- if (currentLease.kind === 'found') {
412
- await this.stores.ownerLeaseStore.releaseOwnerLease(currentLease.token, cleanupSignal);
413
- }
414
- },
415
- undefined,
416
- signal
417
- );
399
+ const owner = this.ownerToken ?? this.lastOwnerToken;
400
+ signal?.throwIfAborted();
401
+ if (owner !== undefined) {
402
+ await this.stores.locationStore.removeAllByOwner(owner, signal);
403
+ signal?.throwIfAborted();
404
+ await this.stores.ownerLeaseStore.releaseOwnerLease(owner, signal);
405
+ signal?.throwIfAborted();
406
+ }
418
407
  this.ownerToken = undefined;
419
408
  this.lastOwnerToken = undefined;
420
409
  this.ownerCleanupComplete = true;
@@ -516,7 +505,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
516
505
  }
517
506
  try {
518
507
  if (!this.started) {
519
- // stop owns confirmation and release under the host shutdown signal.
508
+ this.lastOwnerToken = claim.token;
520
509
  return false;
521
510
  }
522
511
  this.lastOwnerToken = this.ownerToken;
@@ -765,7 +754,10 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
765
754
  const normalizedEndpoint = normalizeEndpoint(peer.endpoint);
766
755
  const stamped = { ...peer, endpoint: normalizedEndpoint, ownerId: this.ownerId };
767
756
  const result = await this.guardWrite(() =>
768
- this.stores.peerStore.updatePeer(stamped, intent, signal)
757
+ this.writeDescriptor(
758
+ (writeSignal) => this.stores.peerStore.updatePeer(stamped, intent, writeSignal),
759
+ signal
760
+ )
769
761
  );
770
762
  const key: ZLinkPeerLocationKey = {
771
763
  autoConnectType: peer.autoConnectType,
@@ -1353,11 +1345,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
1353
1345
  }
1354
1346
  }
1355
1347
 
1356
- private notifyIfStale(
1357
- result: ZLinkLocationWriteResult,
1358
- kind: ZLinkLocationKind,
1359
- key: string
1360
- ): void {
1348
+ notifyIfStale(result: ZLinkLocationWriteResult, kind: ZLinkLocationKind, key: string): void {
1361
1349
  if (result.status !== ZLinkLocationWriteStatus.IgnoredStale) {
1362
1350
  return;
1363
1351
  }
@@ -5,12 +5,13 @@ import {
5
5
  import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
6
6
  import type { ZLinkMessageSerializer } from '../../contracts';
7
7
  import {
8
- decodeApplicationPayload,
9
- encodeApplicationPayload
8
+ decodeApplicationPayloadView,
9
+ encodeOwnedApplicationPayload
10
10
  } from '../foundation/service-wire-m6a-codec';
11
11
  import {
12
12
  decodeFrameworkPayloadMessage,
13
- encodeFrameworkPayload,
13
+ encodeFrameworkPayloadMessage,
14
+ frameworkPayloadContentType,
14
15
  type ZLinkSerializerRegistryLike
15
16
  } from './payload-codec';
16
17
 
@@ -20,15 +21,15 @@ export function encodeFrameworkCreationPayload(
20
21
  payload: unknown,
21
22
  registry?: ZLinkSerializerRegistryLike | ReadonlyMap<string, ZLinkMessageSerializer>
22
23
  ): Buffer {
23
- const encoded = encodeFrameworkPayload(payload ?? null, registry);
24
+ const message = encodeFrameworkPayloadMessage(payload ?? null, registry);
24
25
  try {
25
- return encodeApplicationPayload({
26
+ return encodeOwnedApplicationPayload({
26
27
  packetName: CREATION_PACKET_NAME,
27
- contentType: encoded.contentType,
28
- payload: encoded.message.data()
28
+ contentType: frameworkPayloadContentType(message),
29
+ payload: message.data()
29
30
  });
30
31
  } finally {
31
- encoded.message.close();
32
+ message.close();
32
33
  }
33
34
  }
34
35
 
@@ -37,11 +38,12 @@ export function decodeFrameworkCreationPayload<T>(
37
38
  registry?: ZLinkSerializerRegistryLike | ReadonlyMap<string, ZLinkMessageSerializer>
38
39
  ): T {
39
40
  try {
40
- const application = decodeApplicationPayload(payload);
41
+ const application = decodeApplicationPayloadView(payload);
41
42
  if (application.packetName !== CREATION_PACKET_NAME) {
42
43
  throw new RangeError('Creation payload has an unexpected packet name.');
43
44
  }
44
- const message = RuntimeMessage.from(application.payload);
45
+ // Creation frames use owned storage and stay alive through synchronous decode.
46
+ const message = RuntimeMessage.fromOwned(application.payload as Buffer);
45
47
  try {
46
48
  return decodeFrameworkPayloadMessage<T>(
47
49
  message,
@@ -2,5 +2,14 @@ import * as profile from '@zlink-systems/stream-wire/internal/json';
2
2
 
3
3
  export const FRAMEWORK_JSON_V1_PROFILE = profile.FRAMEWORK_JSON_V1_PROFILE;
4
4
  export const stringifyFrameworkJsonV1 = profile.stringifyFrameworkJsonV1;
5
- export const parseFrameworkJsonV1 = profile.parseFrameworkJsonV1;
5
+ const DEFAULT_PARSE_OPTIONS = Object.freeze({});
6
+
7
+ export function parseFrameworkJsonV1(
8
+ text: string,
9
+ options: profile.FrameworkJsonParseOptions = DEFAULT_PARSE_OPTIONS,
10
+ schema?: Parameters<typeof profile.parseFrameworkJsonV1>[2],
11
+ reviver?: Parameters<typeof profile.parseFrameworkJsonV1>[3]
12
+ ): unknown {
13
+ return profile.parseFrameworkJsonV1(text, options, schema, reviver);
14
+ }
6
15
  export type { FrameworkJsonParseOptions } from '@zlink-systems/stream-wire/internal/json';
@@ -74,25 +74,13 @@ export function encodeFrameworkPayloadMessage(
74
74
  packetName?: string,
75
75
  contractPart: 'payload' | 'reply' = 'payload'
76
76
  ): Message {
77
- return encodeFrameworkPayload(payload, registry, packetName, contractPart).message;
78
- }
79
-
80
- export function encodeFrameworkPayload(
81
- payload: unknown,
82
- registry?: ZLinkSerializerRegistryLike | ReadonlyMap<string, ZLinkMessageSerializer>,
83
- packetName?: string,
84
- contractPart: 'payload' | 'reply' = 'payload'
85
- ): ZLinkEncodedFrameworkPayload {
86
77
  let declaredType: Type | undefined;
87
78
  if (isZLinkMessage(payload)) {
88
79
  if (payload.isEncoded()) {
89
- return {
90
- message: rememberContentType(
91
- toRuntimeMessage(payload.toEncodedPayload()),
92
- ZlinkStreamContentType.Raw
93
- ),
94
- contentType: ZlinkStreamContentType.Raw
95
- };
80
+ return rememberContentType(
81
+ toRuntimeMessage(payload.toEncodedPayload()),
82
+ ZlinkStreamContentType.Raw
83
+ );
96
84
  }
97
85
  declaredType = readZLinkMessageDeclaredType(payload);
98
86
  payload = payload.decode();
@@ -110,32 +98,36 @@ export function encodeFrameworkPayload(
110
98
 
111
99
  const selected = selectSerializerWithContentType(payload, registry, declaredType);
112
100
  if (selected !== undefined) {
113
- return {
114
- message: rememberContentType(
115
- toRuntimeMessage(selected.serializer.serialize(payload)),
116
- selected.contentType
117
- ),
118
- contentType: selected.contentType
119
- };
101
+ return rememberContentType(
102
+ toRuntimeMessage(selected.serializer.serialize(payload)),
103
+ selected.contentType
104
+ );
120
105
  }
121
106
 
122
- return {
123
- message: rememberContentType(
124
- RuntimeMessage.fromOwned(
125
- Buffer.from(
126
- stringifyFrameworkJsonV1(
127
- payload,
128
- (resolveFrameworkPacketJsonContract(payload, packetName) ??
129
- (packetName === undefined ? undefined : readZLinkPacketJsonContract(packetName)))?.[
130
- contractPart
131
- ]
132
- )
107
+ return rememberContentType(
108
+ RuntimeMessage.fromOwned(
109
+ Buffer.from(
110
+ stringifyFrameworkJsonV1(
111
+ payload,
112
+ (resolveFrameworkPacketJsonContract(payload, packetName) ??
113
+ (packetName === undefined ? undefined : readZLinkPacketJsonContract(packetName)))?.[
114
+ contractPart
115
+ ]
133
116
  )
134
- ),
135
- JSON_CONTENT_TYPE
117
+ )
136
118
  ),
137
- contentType: JSON_CONTENT_TYPE
138
- };
119
+ JSON_CONTENT_TYPE
120
+ );
121
+ }
122
+
123
+ export function encodeFrameworkPayload(
124
+ payload: unknown,
125
+ registry?: ZLinkSerializerRegistryLike | ReadonlyMap<string, ZLinkMessageSerializer>,
126
+ packetName?: string,
127
+ contractPart: 'payload' | 'reply' = 'payload'
128
+ ): ZLinkEncodedFrameworkPayload {
129
+ const message = encodeFrameworkPayloadMessage(payload, registry, packetName, contractPart);
130
+ return { message, contentType: frameworkPayloadContentType(message) };
139
131
  }
140
132
 
141
133
  export function frameworkPayloadContentType(message: Message): string {
@@ -180,16 +172,19 @@ function decodeFrameworkPayload<T>(
180
172
 
181
173
  if (message.isEmpty()) return undefined as T;
182
174
 
183
- const parsedPayload = parseJsonPayload(message, schemaForDecode(type, packetName, contractPart));
184
- if (parsedPayload.valid) {
185
- return materializeZLinkMessageValue(parsedPayload.value as T, type);
175
+ const schema = schemaForDecode(type, packetName, contractPart);
176
+ let value: unknown;
177
+ try {
178
+ value = parseFrameworkJsonV1(message.getString('utf8'), undefined, schema);
179
+ } catch (error) {
180
+ throw createInternalFrameworkException(
181
+ ZLinkFrameworkInternalErrorKind.PayloadDecodeFailed,
182
+ 'PayloadDecodeFailed: framework payload is not valid JSON.',
183
+ false,
184
+ error
185
+ );
186
186
  }
187
- throw createInternalFrameworkException(
188
- ZLinkFrameworkInternalErrorKind.PayloadDecodeFailed,
189
- 'PayloadDecodeFailed: framework payload is not valid JSON.',
190
- false,
191
- parsedPayload.error
192
- );
187
+ return materializeZLinkMessageValue(value as T, type);
193
188
  }
194
189
 
195
190
  export function wrapFrameworkPayloadMessage(
@@ -222,7 +217,7 @@ function decodeFrameworkEncodedPayload<T>(
222
217
  const text = payload.getString('utf8');
223
218
  try {
224
219
  return materializeZLinkMessageValue(
225
- parseFrameworkJsonV1(text, {}, schemaForDecode(type, packetName, contractPart)) as T,
220
+ parseFrameworkJsonV1(text, undefined, schemaForDecode(type, packetName, contractPart)) as T,
226
221
  type
227
222
  );
228
223
  } catch (error) {
@@ -291,11 +286,12 @@ function serializerSelectionPlanOf(
291
286
  if (serializers === undefined || serializers.size === 0) {
292
287
  return undefined;
293
288
  }
294
- const key = serializers as object;
295
- const cached = serializerSelectionPlans.get(key);
296
- if (cached !== undefined) {
297
- return cached;
298
- }
289
+ return serializerSelectionPlans.get(serializers) ?? prepareSerializerSelectionPlan(serializers);
290
+ }
291
+
292
+ function prepareSerializerSelectionPlan(
293
+ serializers: ReadonlyMap<string, ZLinkMessageSerializer>
294
+ ): ZLinkSerializerSelectionPlan {
299
295
  const entries: ZLinkSerializerSelectionEntry[] = [];
300
296
  const registeredSelections = codecSerializerSelectionsOf(serializers);
301
297
  for (const [contentType, serializer] of serializers) {
@@ -331,7 +327,7 @@ function serializerSelectionPlanOf(
331
327
  return selected;
332
328
  }
333
329
  };
334
- serializerSelectionPlans.set(key, plan);
330
+ serializerSelectionPlans.set(serializers, plan);
335
331
  return plan;
336
332
  }
337
333
 
@@ -386,27 +382,6 @@ function unsupportedContentType(contentType: string): Error {
386
382
  );
387
383
  }
388
384
 
389
- function parseJsonPayload(
390
- message: Message,
391
- schema?: ZLinkJsonSchema
392
- ):
393
- | {
394
- readonly valid: true;
395
- readonly value: unknown;
396
- readonly error?: undefined;
397
- }
398
- | {
399
- readonly valid: false;
400
- readonly value?: undefined;
401
- readonly error: unknown;
402
- } {
403
- try {
404
- return { valid: true, value: parseFrameworkJsonV1(message.getString('utf8'), {}, schema) };
405
- } catch (error) {
406
- return { valid: false, error };
407
- }
408
- }
409
-
410
385
  function serializerMapOf(
411
386
  registry: ZLinkSerializerRegistryLike | ReadonlyMap<string, ZLinkMessageSerializer> | undefined
412
387
  ): ReadonlyMap<string, ZLinkMessageSerializer> | undefined {
@@ -1,4 +1,6 @@
1
- import { awaitWithAbort } from '../abort';
1
+ import { isZLinkBackendResultError, RequestResult } from '../backend/runtime-values';
2
+ import { createAbortError, isAbortError } from '../abort';
3
+ import { OperationTimeoutError, type PendingOperation } from '../foundation/operation-registry';
2
4
  import {
3
5
  createInternalFrameworkException,
4
6
  ZLinkFrameworkInternalErrorKind
@@ -10,49 +12,55 @@ export function remainingRequestTimeout(
10
12
  ): number | undefined {
11
13
  if (deadlineMs === undefined) return undefined;
12
14
  const remaining = deadlineMs - performance.now();
13
- if (remaining <= 0) {
14
- throw createInternalFrameworkException(
15
- ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
16
- `${operation} exceeded its deadline.`
17
- );
18
- }
15
+ if (remaining <= 0) throw requestTimeout(operation);
19
16
  return Math.max(1, Math.ceil(remaining));
20
17
  }
21
18
 
22
- /** Bounds caller waiting across outbound admission and reply; late completions stay observed. */
23
- export async function waitRequestReply<T>(
24
- reply: Promise<T>,
19
+ export function requestTerminalError(operation: string, error: unknown): unknown {
20
+ return error instanceof OperationTimeoutError ||
21
+ (isZLinkBackendResultError(error) &&
22
+ error.operation === 'request' &&
23
+ error.result === RequestResult.TimedOut)
24
+ ? requestTimeout(operation)
25
+ : error;
26
+ }
27
+
28
+ function requestTimeout(operation: string): Error {
29
+ return createInternalFrameworkException(
30
+ ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
31
+ `${operation} exceeded its deadline.`
32
+ );
33
+ }
34
+
35
+ /** Observes a stage without registering or completing the logical request. */
36
+ export function waitRequestReply<T>(
37
+ stage: Promise<T>,
25
38
  operation: string,
26
- deadlineMs: number | undefined,
27
- signal?: AbortSignal,
39
+ pending: PendingOperation<unknown>,
28
40
  endWait?: () => void,
29
41
  discardLateReply?: (reply: T) => void
30
42
  ): Promise<T> {
31
- let timer: ReturnType<typeof setTimeout> | undefined;
32
- let waiting = reply;
33
- if (deadlineMs !== undefined) {
34
- const timeout = new Promise<never>((_resolve, reject) => {
35
- const remaining = remainingRequestTimeout(operation, deadlineMs);
36
- timer = setTimeout(
37
- () =>
38
- reject(
39
- createInternalFrameworkException(
40
- ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
41
- `${operation} exceeded its deadline.`
42
- )
43
- ),
44
- remaining
45
- );
46
- });
47
- waiting = Promise.race([reply, timeout]);
48
- }
49
- try {
50
- return await awaitWithAbort(waiting, signal);
51
- } catch (error) {
52
- endWait?.();
53
- if (discardLateReply !== undefined) void reply.then(discardLateReply, () => undefined);
54
- throw error;
55
- } finally {
56
- clearTimeout(timer);
57
- }
43
+ return new Promise<T>((resolve, reject) => {
44
+ const fail = (error: unknown): void => {
45
+ endWait?.();
46
+ if (discardLateReply !== undefined) void stage.then(discardLateReply, () => undefined);
47
+ reject(isAbortError(error) ? createAbortError() : requestTerminalError(operation, error));
48
+ };
49
+ pending.setFailureDispatcher(fail);
50
+ void stage.then(
51
+ (value) => {
52
+ pending.clearFailureDispatcher(fail);
53
+ resolve(value);
54
+ },
55
+ (error) => {
56
+ const terminal = requestTerminalError(operation, error);
57
+ if (terminal !== error) {
58
+ if (!pending.fail(terminal)) void pending.promise.then(() => fail(terminal), fail);
59
+ } else {
60
+ pending.clearFailureDispatcher(fail);
61
+ fail(error);
62
+ }
63
+ }
64
+ );
65
+ });
58
66
  }
@@ -1,7 +1,47 @@
1
+ import type { PendingOperation } from '../foundation/operation-registry';
2
+ import { currentFlowContext, runWithFlow } from '../diagnostics/flow-context';
1
3
  import type { ZLinkRequest } from '../../contracts/Handlers/Attributes';
2
4
 
3
5
  const completedAdmission = Promise.resolve();
4
6
  const ignoreAdmissionFailure = (): void => {};
7
+ const REQUEST_ADMISSION = Symbol('zlink.requestAdmission');
8
+ // Every public request shares this getter. A getter closure per request gives
9
+ // each reply Promise its own hidden class, and V8 then keeps its properties in
10
+ // a per-request dictionary.
11
+ const ADMITTED_PROPERTY: PropertyDescriptor = {
12
+ get(this: { readonly [REQUEST_ADMISSION]: RequestAdmission }): Promise<void> {
13
+ return this[REQUEST_ADMISSION].observe();
14
+ }
15
+ };
16
+
17
+ /** Transport preparation is separate from typed result delivery. */
18
+ export interface ZLinkRequestResult<TReply> {
19
+ readonly operation?: PendingOperation<TReply>;
20
+ readonly pending: Promise<unknown>;
21
+ decode(value: unknown): TReply;
22
+ readonly mapFailure: (error: unknown) => unknown;
23
+ }
24
+
25
+ export const identityRequestReply = <TReply>(value: TReply): TReply => value;
26
+
27
+ export function prepareZLinkRequestReply<TSource, TReply>(
28
+ pending: Promise<TSource>,
29
+ decode: (value: TSource) => TReply,
30
+ mapFailure: (error: unknown) => unknown = identityRequestReply
31
+ ): ZLinkRequestResult<TReply> {
32
+ const flow = currentFlowContext();
33
+ if (flow === undefined) return { pending, decode, mapFailure };
34
+ // The completion reaction is registered after the outbound flow scope returns.
35
+ return {
36
+ pending,
37
+ decode: (value: TSource) => runWithFlow(flow, () => decode(value)),
38
+ mapFailure: (error: unknown) => runWithFlow(flow, () => mapFailure(error))
39
+ };
40
+ }
41
+
42
+ export function rejectZLinkRequestReply<TReply>(error: unknown): ZLinkRequestResult<TReply> {
43
+ return prepareZLinkRequestReply(Promise.reject<TReply>(error), identityRequestReply);
44
+ }
5
45
 
6
46
  class RequestAdmission {
7
47
  private admitted: Promise<void> | undefined;
@@ -33,30 +73,61 @@ class RequestAdmission {
33
73
  }
34
74
  }
35
75
 
76
+ function requestFailure<TReply>(result: ZLinkRequestResult<TReply>, error: unknown): unknown {
77
+ try {
78
+ return result.mapFailure(error);
79
+ } catch (mappedError) {
80
+ return mappedError;
81
+ }
82
+ }
83
+
84
+ /** Yield applies the same transport decoding without public admission. */
85
+ export function mapZLinkRequestReply<TReply>(result: ZLinkRequestResult<TReply>): Promise<TReply> {
86
+ if (
87
+ result.operation !== undefined &&
88
+ result.operation.mapCaller(result.decode, (error) => requestFailure(result, error))
89
+ )
90
+ return result.operation.promise;
91
+ return result.pending.then(
92
+ (value) => result.decode(value),
93
+ (error: unknown) => {
94
+ throw requestFailure(result, error);
95
+ }
96
+ );
97
+ }
98
+
36
99
  export function createZLinkRequest<TReply>(
37
- start: (onAdmitted: () => void) => Promise<TReply>,
100
+ start: (onAdmitted: () => void) => ZLinkRequestResult<TReply>,
38
101
  deliverReply?: (reply: Promise<TReply>) => Promise<TReply>
39
102
  ): ZLinkRequest<TReply> {
40
103
  const admission = new RequestAdmission();
104
+ const confirm = (): void => admission.confirm();
41
105
  let pending: Promise<TReply>;
42
106
  try {
43
- pending = start(() => admission.confirm());
107
+ const result = start(confirm);
108
+ const onValue = (value: unknown): TReply => {
109
+ try {
110
+ const reply = result.decode(value);
111
+ admission.confirm();
112
+ return reply;
113
+ } catch (error) {
114
+ admission.fail(error);
115
+ throw error;
116
+ }
117
+ };
118
+ const onFailure = (error: unknown): never => {
119
+ const failure = requestFailure(result, error);
120
+ admission.fail(failure);
121
+ throw failure;
122
+ };
123
+ if (result.operation !== undefined && result.operation.mapCaller(onValue, onFailure)) {
124
+ pending = result.operation.promise;
125
+ } else pending = result.pending.then(onValue, onFailure);
44
126
  } catch (error) {
127
+ admission.fail(error);
45
128
  pending = Promise.reject(error);
46
129
  }
47
- const observed = pending.then(
48
- (value) => {
49
- // A successful reply proves admission even without an observation callback.
50
- admission.confirm();
51
- return value;
52
- },
53
- (error: unknown) => {
54
- admission.fail(error);
55
- throw error;
56
- }
57
- );
58
- const reply = deliverReply?.(observed) ?? observed;
59
- return Object.defineProperty(reply, 'admitted', {
60
- get: () => admission.observe()
61
- }) as ZLinkRequest<TReply>;
130
+ const reply = deliverReply?.(pending) ?? pending;
131
+ Object.defineProperty(reply, REQUEST_ADMISSION, { value: admission });
132
+ return Object.defineProperty(reply, 'admitted', ADMITTED_PROPERTY) as ZLinkRequest<TReply>;
62
133
  }