@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
@@ -42,7 +42,7 @@ class ZLinkSerialExecutionQueue {
42
42
  if (sharedOwner === undefined)
43
43
  this.consumer = { running: false, scheduled: false };
44
44
  }
45
- submit(operation, options = {}, context) {
45
+ submit(operation, options, context) {
46
46
  try {
47
47
  return this.admit(operation, options, context);
48
48
  }
@@ -50,7 +50,7 @@ class ZLinkSerialExecutionQueue {
50
50
  return Promise.reject(error);
51
51
  }
52
52
  }
53
- submitDetached(operation, onError, options = {}, context) {
53
+ submitDetached(operation, onError, options, context) {
54
54
  void this.submit(operation, options, context).catch(onError);
55
55
  }
56
56
  /**
@@ -58,7 +58,7 @@ class ZLinkSerialExecutionQueue {
58
58
  */
59
59
  submitContinuation(operation, context) {
60
60
  try {
61
- return this.admit(operation, { lane: 'application' }, context);
61
+ return this.admit(operation, undefined, context);
62
62
  }
63
63
  catch (error) {
64
64
  return Promise.reject(error);
@@ -70,14 +70,14 @@ class ZLinkSerialExecutionQueue {
70
70
  *
71
71
  * @internal
72
72
  */
73
- admitDurablePrefix(operation, options = {}, context, preparation) {
73
+ admitDurablePrefix(operation, options, context, preparation) {
74
74
  return this.admit(operation, { ...options, lane: 'application' }, context, preparation);
75
75
  }
76
76
  /**
77
77
  * Enqueues work that already owns the host-wide application job permit.
78
78
  * It remains held through handler terminal completion.
79
79
  */
80
- submitPreAdmitted(operation, options = {}, context) {
80
+ submitPreAdmitted(operation, options, context) {
81
81
  return this.admit(operation, options, context);
82
82
  }
83
83
  /** Holds lifecycle FIFO through an operation result while its application turns can run. */
@@ -88,7 +88,8 @@ class ZLinkSerialExecutionQueue {
88
88
  return this.activeLifecycle?.context !== undefined;
89
89
  }
90
90
  visitPendingApplication(visitor) {
91
- for (const record of this.application.records) {
91
+ for (let index = 0; index < this.application.records.length; index++) {
92
+ const record = this.application.records[index];
92
93
  if (record.mailbox === undefined)
93
94
  visitor(record);
94
95
  }
@@ -125,9 +126,8 @@ class ZLinkSerialExecutionQueue {
125
126
  admit(operation, options, context, preparation, operationEnvelope = false) {
126
127
  if (this.closed)
127
128
  throw new Error('The serial execution queue is closed.');
128
- const lane = options.lane ?? 'application';
129
+ const lane = options?.lane ?? 'application';
129
130
  const target = lane === 'application' ? this.application : this.lifecycle;
130
- let settled = false;
131
131
  let released = false;
132
132
  let resolveResult;
133
133
  let rejectResult;
@@ -149,18 +149,6 @@ class ZLinkSerialExecutionQueue {
149
149
  }
150
150
  }
151
151
  };
152
- const resolve = (value) => {
153
- if (settled)
154
- return;
155
- settled = true;
156
- resolveResult(value);
157
- };
158
- const reject = (reason) => {
159
- if (settled)
160
- return;
161
- settled = true;
162
- rejectResult(reason);
163
- };
164
152
  const record = {
165
153
  acceptedSequence: 0n,
166
154
  lane,
@@ -169,11 +157,11 @@ class ZLinkSerialExecutionQueue {
169
157
  context,
170
158
  preparation,
171
159
  preparationState: preparation === undefined ? 'ready' : 'idle',
172
- resolve,
173
- reject,
160
+ resolve: resolveResult,
161
+ reject: rejectResult,
174
162
  release,
175
163
  fail: (reason) => {
176
- reject(reason);
164
+ rejectResult(reason);
177
165
  release();
178
166
  }
179
167
  };
@@ -189,15 +177,16 @@ class ZLinkSerialExecutionQueue {
189
177
  release();
190
178
  throw error;
191
179
  }
192
- options.onAdmitted?.();
193
- options.onWithdrawable?.(() => {
180
+ options?.onAdmitted?.();
181
+ options?.onWithdrawable?.(() => {
194
182
  const index = target.records.indexOf(record);
195
183
  if (index < 0)
196
184
  return false;
197
- target.records.splice(index, 1);
185
+ target.records.copyWithin(index, index + 1);
186
+ target.records.length -= 1;
198
187
  record.preparationController?.abort(new Error('Durable record transferred to another handoff.'));
199
188
  record.preparation?.cancel();
200
- resolve(undefined);
189
+ resolveResult(undefined);
201
190
  release();
202
191
  return true;
203
192
  });
@@ -211,17 +200,26 @@ class ZLinkSerialExecutionQueue {
211
200
  // Ready membership in the existing owner queue is the only notification state.
212
201
  if (this.ownerMembership !== undefined)
213
202
  return;
214
- this.enqueueMailboxTurn(() => this.consumeMailbox());
203
+ {
204
+ // Block-scoped captures keep early returns free of a V8 function context.
205
+ const mailbox = this;
206
+ mailbox.enqueueMailboxTurn(() => mailbox.consumeMailbox());
207
+ }
215
208
  return;
216
209
  }
217
210
  const consumer = this.consumer;
218
211
  if (consumer.scheduled || consumer.running)
219
212
  return;
220
- consumer.scheduled = true;
221
- (0, state_lane_1.startOutsideStateLane)(() => queueMicrotask(() => {
222
- consumer.scheduled = false;
223
- void this.drain();
224
- }));
213
+ {
214
+ // Same block-scoped capture as the mailbox branch above.
215
+ const queue = this;
216
+ const scheduledConsumer = consumer;
217
+ scheduledConsumer.scheduled = true;
218
+ (0, state_lane_1.startOutsideStateLane)(() => queueMicrotask(() => {
219
+ scheduledConsumer.scheduled = false;
220
+ void queue.drain();
221
+ }));
222
+ }
225
223
  }
226
224
  /** Notifications carry no payload, admission sequence, result Promise, or host permit. */
227
225
  enqueueMailboxTurn(operation) {
@@ -244,16 +242,15 @@ class ZLinkSerialExecutionQueue {
244
242
  }
245
243
  /** Called only by the shared scheduler's consumer, never by a producer. */
246
244
  consumeMailbox() {
247
- const selection = this.selectNext();
248
- if (selection === undefined) {
245
+ const record = this.selectNext();
246
+ if (record === undefined) {
249
247
  if (!this.hasPendingWork)
250
248
  this.resolveIdleWaiters();
251
249
  return;
252
250
  }
253
- const record = selection.record;
254
- if (!this.prepareSelected(selection))
251
+ if (!this.prepareSelected(record))
255
252
  return;
256
- this.takeSelected(selection);
253
+ this.takeSelected(record);
257
254
  if (record.preparationState === 'failed') {
258
255
  record.preparation?.cancel();
259
256
  record.fail(record.preparationError);
@@ -270,11 +267,11 @@ class ZLinkSerialExecutionQueue {
270
267
  catch (error) {
271
268
  terminal = Promise.reject(error);
272
269
  }
273
- void terminal.then((value) => this.finishMailbox(record, () => record.resolve(value)), (error) => this.finishMailbox(record, () => record.reject(error)));
270
+ void terminal.then((value) => this.finishMailbox(record, record.resolve, value), (error) => this.finishMailbox(record, record.reject, error));
274
271
  }
275
- finishMailbox(record, settle) {
272
+ finishMailbox(record, settle, value) {
276
273
  this.enqueueMailboxTurn(() => {
277
- settle();
274
+ settle(value);
278
275
  record.release();
279
276
  record.preparation?.cancel();
280
277
  this.activeRecord = undefined;
@@ -292,15 +289,14 @@ class ZLinkSerialExecutionQueue {
292
289
  let waitingForPreparation = false;
293
290
  try {
294
291
  for (;;) {
295
- const selection = this.selectNext();
296
- if (selection === undefined)
292
+ const record = this.selectNext();
293
+ if (record === undefined)
297
294
  break;
298
- const record = selection.record;
299
- if (!this.prepareSelected(selection)) {
295
+ if (!this.prepareSelected(record)) {
300
296
  waitingForPreparation = true;
301
297
  break;
302
298
  }
303
- this.takeSelected(selection);
299
+ this.takeSelected(record);
304
300
  if (record.preparationState === 'failed') {
305
301
  record.preparation?.cancel();
306
302
  record.fail(record.preparationError);
@@ -357,45 +353,48 @@ class ZLinkSerialExecutionQueue {
357
353
  }
358
354
  }
359
355
  }
360
- prepareSelected(selection) {
361
- if (selection.lane === 'lifecycle' &&
356
+ prepareSelected(record) {
357
+ if (record.lane === 'lifecycle' &&
362
358
  this.application.records.length > 0 &&
363
359
  !this.cancelPreparationForRearbitration(this.application.records[0]))
364
360
  return false;
365
- const record = selection.record;
366
361
  if (record.preparationState === 'idle')
367
362
  this.startPreparation(record);
368
363
  return record.preparationState !== 'pending' && record.preparationState !== 'canceling';
369
364
  }
370
365
  selectNext() {
371
366
  const lifecycleOwner = this.activeLifecycle?.context;
372
- const applicationRecord = lifecycleOwner === undefined
373
- ? this.application.records[0]
374
- : this.application.records.find((record) => lifecycleOwner.canExecuteApplication(record));
367
+ let applicationRecord;
368
+ if (lifecycleOwner === undefined) {
369
+ applicationRecord = this.application.records[0];
370
+ }
371
+ else {
372
+ // Capture only inside the lifecycle branch; the common path allocates no context.
373
+ const owner = lifecycleOwner;
374
+ applicationRecord = this.application.records.find((record) => owner.canExecuteApplication(record));
375
+ }
375
376
  const applicationReady = applicationRecord !== undefined;
376
377
  const lifecycleReady = this.activeLifecycle === undefined && this.lifecycle.records.length > 0;
377
378
  if (!applicationReady && !lifecycleReady)
378
379
  return undefined;
379
380
  if (!applicationReady) {
380
- return { lane: 'lifecycle', record: this.lifecycle.records[0] };
381
+ return this.lifecycle.records[0];
381
382
  }
382
383
  if (!lifecycleReady) {
383
- return { lane: 'application', record: applicationRecord };
384
+ return applicationRecord;
384
385
  }
385
386
  if (!this.lifecycleDebt && this.lifecycleStreak < this.lifecycleBurstLimit) {
386
- return { lane: 'lifecycle', record: this.lifecycle.records[0] };
387
+ return this.lifecycle.records[0];
387
388
  }
388
- return { lane: 'application', record: applicationRecord };
389
+ return applicationRecord;
389
390
  }
390
- takeSelected(selection) {
391
- const record = selection.lane === 'lifecycle'
392
- ? this.takeLifecycle()
393
- : this.takeApplication(selection.record);
394
- if (record !== selection.record) {
391
+ takeSelected(selected) {
392
+ const record = selected.lane === 'lifecycle' ? this.takeLifecycle() : this.takeApplication(selected);
393
+ if (record !== selected) {
395
394
  throw new Error('The selected serial work record changed before owner claim.');
396
395
  }
397
- if (selection.record.mailbox !== undefined)
398
- selection.record.mailbox.ownerMembership = undefined;
396
+ if (selected.mailbox !== undefined)
397
+ selected.mailbox.ownerMembership = undefined;
399
398
  return record;
400
399
  }
401
400
  takeLifecycle() {
@@ -413,7 +412,11 @@ class ZLinkSerialExecutionQueue {
413
412
  if (this.application.records[0] === selected)
414
413
  return this.application.records.shift();
415
414
  const index = this.application.records.indexOf(selected);
416
- return this.application.records.splice(index, 1)[0];
415
+ // A missing record (index -1) still reaches the owner-claim fence in takeSelected.
416
+ const record = this.application.records.at(index);
417
+ this.application.records.copyWithin(index, index + 1);
418
+ this.application.records.length = Math.max(0, this.application.records.length - 1);
419
+ return record;
417
420
  }
418
421
  startPreparation(record) {
419
422
  const preparation = record.preparation;
@@ -471,26 +474,27 @@ class ZLinkSerialExecutionQueue {
471
474
  return performance.now() - (this.claimStartedAt ?? performance.now()) >= this.ownerTimeBudget;
472
475
  }
473
476
  resolveIdleWaiters() {
474
- for (const resolve of this.idleWaiters.splice(0))
475
- resolve();
477
+ for (let index = 0; index < this.idleWaiters.length; index++)
478
+ this.idleWaiters[index]();
479
+ this.idleWaiters.length = 0;
476
480
  }
477
481
  }
478
482
  exports.ZLinkSerialExecutionQueue = ZLinkSerialExecutionQueue;
479
483
  if ((0, state_lane_1.isStructuralGuardEnabled)()) {
480
484
  const submit = ZLinkSerialExecutionQueue.prototype.submit;
481
- ZLinkSerialExecutionQueue.prototype.submit = function (operation, options = {}, context) {
482
- return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(submit.call(this, operation, options, context), `serial ${options.lane ?? 'application'} ${(0, state_lane_1.diagnosticWorkName)(operation)}`), 'serial completion');
485
+ ZLinkSerialExecutionQueue.prototype.submit = function (operation, options, context) {
486
+ return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(submit.call(this, operation, options, context), `serial ${options?.lane ?? 'application'} ${(0, state_lane_1.diagnosticWorkName)(operation)}`), 'serial completion');
483
487
  };
484
488
  const submitPreAdmitted = ZLinkSerialExecutionQueue.prototype.submitPreAdmitted;
485
- ZLinkSerialExecutionQueue.prototype.submitPreAdmitted = function (operation, options = {}, context) {
486
- return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(submitPreAdmitted.call(this, operation, options, context), `serial ${options.lane ?? 'application'} ${(0, state_lane_1.diagnosticWorkName)(operation)}`), 'serial completion');
489
+ ZLinkSerialExecutionQueue.prototype.submitPreAdmitted = function (operation, options, context) {
490
+ return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(submitPreAdmitted.call(this, operation, options, context), `serial ${options?.lane ?? 'application'} ${(0, state_lane_1.diagnosticWorkName)(operation)}`), 'serial completion');
487
491
  };
488
492
  const submitContinuation = ZLinkSerialExecutionQueue.prototype.submitContinuation;
489
493
  ZLinkSerialExecutionQueue.prototype.submitContinuation = function (operation, context) {
490
494
  return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(submitContinuation.call(this, operation, context), `serial continuation ${(0, state_lane_1.diagnosticWorkName)(operation)}`), 'serial completion');
491
495
  };
492
496
  const admitDurablePrefix = ZLinkSerialExecutionQueue.prototype.admitDurablePrefix;
493
- ZLinkSerialExecutionQueue.prototype.admitDurablePrefix = function (operation, options = {}, context, preparation) {
497
+ ZLinkSerialExecutionQueue.prototype.admitDurablePrefix = function (operation, options, context, preparation) {
494
498
  return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(admitDurablePrefix.call(this, operation, options, context, preparation), `serial durable ${(0, state_lane_1.diagnosticWorkName)(operation)}`), 'serial completion');
495
499
  };
496
500
  const submitLifecycleOperation = ZLinkSerialExecutionQueue.prototype.submitLifecycleOperation;
@@ -1,14 +1,23 @@
1
+ import { type ConnectionAttempt } from '@zlink-systems/zlink';
2
+ import type { OperationHandle, PendingOperation } from './operation-registry';
1
3
  export interface PeerRouteObservation {
2
4
  readonly generation?: bigint;
3
5
  readonly ready: boolean;
6
+ readonly selected?: boolean;
7
+ readonly lifecycleGeneration?: bigint;
8
+ readonly endpoint?: string;
9
+ /** Immutable socket snapshot; admission selects this target endpoint only while waiting. */
10
+ readonly connectionAttempts?: readonly ConnectionAttempt[];
4
11
  }
5
12
  export interface DurableServiceRequestPort {
6
13
  readonly requestStopSignal?: AbortSignal;
7
14
  observePeerRoute(target: string): PeerRouteObservation;
8
15
  observePeerRouteChanged(listener: (target: string) => void): () => void;
9
16
  observePeerConnectionIntentRemoved(listener: (target: string) => void): () => void;
10
- requestService(target: string, parts: readonly Uint8Array[], timeoutMs: number, onAdmitted?: () => void): Promise<readonly Buffer[]>;
17
+ requestService(target: string, parts: readonly Uint8Array[], timeoutMs: number, onAdmitted?: () => void, existing?: Pick<PendingOperation<unknown>, 'id' | 'deadlineMs'>, receiver?: undefined, onSubmitted?: () => void): Promise<readonly Buffer[]>;
11
18
  }
12
- /** Actor model §8.1: a ready edge or a typed transport failure owns replay. */
13
- export declare function requestDurableService(port: DurableServiceRequestPort, target: string, parts: readonly Uint8Array[], deadlineMs: number, operationKind: string, signal?: AbortSignal, onSubmitted?: (signal: AbortSignal) => Promise<void>): Promise<readonly Buffer[]>;
19
+ /** Submit §5: one admission decision for application and lifecycle requests. */
20
+ export declare function admitServiceRequest(port: Pick<DurableServiceRequestPort, 'requestStopSignal' | 'observePeerRoute' | 'observePeerRouteChanged' | 'observePeerConnectionIntentRemoved'>, target: string, pending: OperationHandle<unknown>, start: (remainingMs: number, finished: () => void) => void, failed: (error: unknown) => void, operationKind?: string): void;
21
+ /** The lifecycle adapter preserves its physical reply decoder and sender operation. */
22
+ export declare function requestDurableService(port: DurableServiceRequestPort, target: string, parts: readonly Uint8Array[], pending: PendingOperation<unknown>, operationKind: string, signal?: AbortSignal, onSubmitted?: (signal: AbortSignal) => Promise<void>, onAdmitted?: () => void): Promise<readonly Buffer[]>;
14
23
  export declare function durableRequestCanReplay(error: unknown): boolean;
@@ -1,90 +1,175 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.admitServiceRequest = admitServiceRequest;
3
4
  exports.requestDurableService = requestDurableService;
4
5
  exports.durableRequestCanReplay = durableRequestCanReplay;
5
- const abort_1 = require("../abort");
6
+ const zlink_1 = require("@zlink-systems/zlink");
7
+ const request_deadline_1 = require("../messaging/request-deadline");
6
8
  const runtime_values_1 = require("../backend/runtime-values");
7
9
  const framework_errors_internal_1 = require("../framework-errors-internal");
8
- /** Actor model §8.1: a ready edge or a typed transport failure owns replay. */
9
- async function requestDurableService(port, target, parts, deadlineMs, operationKind, signal, onSubmitted) {
10
- let wasAdmitted = false;
11
- const stop = new AbortController();
12
- const exhausted = (cause) => (0, framework_errors_internal_1.createInternalFrameworkException)(wasAdmitted
13
- ? framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded
14
- : framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, `${operationKind} exhausted its end-to-end deadline.`, true, cause);
15
- const timer = setTimeout(() => stop.abort(exhausted()), Math.max(0, Math.ceil(deadlineMs - performance.now())));
16
- const unobserveIntent = port.observePeerConnectionIntentRemoved((rid) => {
10
+ /** Submit §5: one admission decision for application and lifecycle requests. */
11
+ function admitServiceRequest(port, target, pending, start, failed, operationKind = 'Request') {
12
+ let baseline;
13
+ let submitted = false;
14
+ let disposed = false;
15
+ let unobserveRoute = () => { };
16
+ let unobserveIntent = () => { };
17
+ const cleanup = () => {
18
+ if (disposed)
19
+ return;
20
+ disposed = true;
21
+ unobserveRoute();
22
+ unobserveIntent();
23
+ port.requestStopSignal?.removeEventListener('abort', stopped);
24
+ if (pending.promise === undefined)
25
+ pending.clearFailureDispatcher(cleanup);
26
+ };
27
+ const fail = (error) => {
28
+ if (disposed)
29
+ return;
30
+ cleanup();
31
+ failed(error);
32
+ };
33
+ const lifecycleFailure = (error) => {
34
+ if (!submitted)
35
+ fail(error);
36
+ else {
37
+ cleanup();
38
+ pending.fail(error);
39
+ }
40
+ };
41
+ const unavailable = (message) => lifecycleFailure((0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, message, true));
42
+ const stopped = () => {
43
+ const error = port.requestStopSignal?.reason;
44
+ lifecycleFailure(error);
45
+ pending.fail(error);
46
+ };
47
+ const check = () => {
48
+ if (disposed || submitted)
49
+ return true;
50
+ if (port.requestStopSignal?.aborted === true) {
51
+ stopped();
52
+ return true;
53
+ }
54
+ if (!pending.isPending()) {
55
+ cleanup();
56
+ return true;
57
+ }
58
+ try {
59
+ const remaining = (0, request_deadline_1.remainingRequestTimeout)(operationKind, pending.deadlineMs);
60
+ const observation = port.observePeerRoute(target);
61
+ const attempts = baseline !== undefined || !observation.ready
62
+ ? observation.connectionAttempts?.filter((attempt) => attempt.endpoint === observation.endpoint)
63
+ : undefined;
64
+ if (baseline !== undefined &&
65
+ ((baseline.lifecycleGeneration !== undefined &&
66
+ baseline.lifecycleGeneration !== observation.lifecycleGeneration) ||
67
+ (baseline.endpoint !== undefined && baseline.endpoint !== observation.endpoint))) {
68
+ unavailable('Request target descriptor changed.');
69
+ return true;
70
+ }
71
+ // Compare the waiting request's tokens before accepting a recovered route.
72
+ if (baseline !== undefined &&
73
+ (baseline.connectionAttempts ?? []).some((previous) => attempts?.some((current) => current.intentId === previous.intentId &&
74
+ current.lastFailureId === previous.lastFailureId) !== true)) {
75
+ unavailable('Request connection intent ended, changed, or failed.');
76
+ return true;
77
+ }
78
+ if (baseline !== undefined &&
79
+ (baseline.connectionAttempts ?? []).length === 0 &&
80
+ attempts?.some((attempt) => attempt.lastFailureId !== 0n) === true) {
81
+ unavailable('Request first connection observation contains a failure.');
82
+ return true;
83
+ }
84
+ if (observation.ready) {
85
+ submitted = true;
86
+ unobserveRoute();
87
+ start(remaining, cleanup);
88
+ return true;
89
+ }
90
+ if (observation.selected !== true &&
91
+ attempts?.some((attempt) => attempt.state === zlink_1.ConnectionAttemptState.AttemptFailed) === true) {
92
+ unavailable('Request connection attempt failed.');
93
+ return true;
94
+ }
95
+ if (baseline === undefined || (baseline.connectionAttempts ?? []).length === 0)
96
+ baseline = { ...observation, connectionAttempts: attempts };
97
+ }
98
+ catch (error) {
99
+ fail(error);
100
+ return true;
101
+ }
102
+ return false;
103
+ };
104
+ if (check())
105
+ return;
106
+ unobserveRoute = port.observePeerRouteChanged((rid) => {
17
107
  if (rid === target)
18
- stop.abort((0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, `${operationKind} target node lifecycle ended.`, true));
108
+ check();
19
109
  });
110
+ unobserveIntent = port.observePeerConnectionIntentRemoved((rid) => {
111
+ if (rid === target)
112
+ unavailable('Request target node lifecycle ended.');
113
+ });
114
+ if (pending.promise === undefined)
115
+ pending.setFailureDispatcher(cleanup);
116
+ else
117
+ void pending.promise.then(cleanup, (error) => {
118
+ if (!submitted)
119
+ fail(error);
120
+ else
121
+ cleanup();
122
+ });
123
+ port.requestStopSignal?.addEventListener('abort', stopped, { once: true });
124
+ if (port.requestStopSignal?.aborted === true)
125
+ stopped();
126
+ else
127
+ check();
128
+ }
129
+ /** The lifecycle adapter preserves its physical reply decoder and sender operation. */
130
+ function requestDurableService(port, target, parts, pending, operationKind, signal, onSubmitted, onAdmitted) {
131
+ const stop = new AbortController();
20
132
  const cancellation = AbortSignal.any([
21
133
  stop.signal,
22
134
  ...(signal === undefined ? [] : [signal]),
23
135
  ...(port.requestStopSignal === undefined ? [] : [port.requestStopSignal])
24
136
  ]);
25
- try {
26
- for (;;) {
27
- cancellation.throwIfAborted();
28
- const remainingMs = Math.ceil(deadlineMs - performance.now());
29
- if (remainingMs <= 0)
30
- throw exhausted();
31
- let changed;
32
- const transition = new Promise((resolve) => {
33
- changed = resolve;
34
- });
35
- let submittedGeneration;
36
- const attemptStop = new AbortController();
37
- const attemptSignal = AbortSignal.any([cancellation, attemptStop.signal]);
38
- const unobserveRoute = port.observePeerRouteChanged((rid) => {
39
- if (rid !== target)
40
- return;
41
- const route = port.observePeerRoute(target);
42
- if (submittedGeneration === undefined
43
- ? route.ready
44
- : route.generation !== undefined && route.generation !== submittedGeneration) {
45
- changed();
46
- attemptStop.abort();
47
- }
48
- });
49
- try {
50
- const route = port.observePeerRoute(target);
51
- if (!route.ready) {
52
- await (0, abort_1.awaitWithAbort)(transition, cancellation);
53
- continue;
54
- }
55
- submittedGeneration = route.generation;
56
- const reply = port.requestService(target, parts, remainingMs, () => {
57
- wasAdmitted = true;
58
- });
59
- const request = onSubmitted === undefined
60
- ? reply
61
- : Promise.race([
62
- reply,
63
- Promise.resolve()
64
- .then(() => onSubmitted(attemptSignal))
65
- .then(() => reply)
66
- ]);
67
- const result = await (0, abort_1.awaitWithAbort)(Promise.race([request.then((parts) => ({ parts })), transition.then(() => undefined)]), cancellation);
68
- if (result !== undefined)
69
- return result.parts;
70
- }
71
- catch (error) {
72
- cancellation.throwIfAborted();
73
- if (!durableRequestCanReplay(error))
74
- throw error;
75
- if ((0, runtime_values_1.isZLinkBackendResultError)(error) && error.operation === 'request')
76
- wasAdmitted = true;
77
- }
78
- finally {
79
- attemptStop.abort();
80
- unobserveRoute();
81
- }
137
+ const cancelled = () => pending.fail(cancellation.reason);
138
+ cancellation.addEventListener('abort', cancelled, { once: true });
139
+ const complete = () => {
140
+ cancellation.removeEventListener('abort', cancelled);
141
+ stop.abort();
142
+ };
143
+ void pending.promise.then(complete, complete);
144
+ return new Promise((resolve, reject) => {
145
+ if (cancellation.aborted) {
146
+ cancelled();
147
+ reject(cancellation.reason);
148
+ return;
82
149
  }
83
- }
84
- finally {
85
- clearTimeout(timer);
86
- unobserveIntent();
87
- }
150
+ admitServiceRequest(port, target, pending, (remaining, finished) => {
151
+ const reply = port.requestService(target, parts, remaining, onAdmitted, pending, undefined, onSubmitted === undefined
152
+ ? undefined
153
+ : () => {
154
+ try {
155
+ void onSubmitted(cancellation).catch((error) => pending.fail(error));
156
+ }
157
+ catch (error) {
158
+ pending.fail(error);
159
+ }
160
+ });
161
+ void reply.then((value) => {
162
+ finished();
163
+ resolve(value);
164
+ }, (error) => {
165
+ finished();
166
+ reject(error);
167
+ });
168
+ }, (error) => {
169
+ pending.fail(error);
170
+ reject(error);
171
+ }, operationKind);
172
+ });
88
173
  }
89
174
  function durableRequestCanReplay(error) {
90
175
  if (!(0, runtime_values_1.isZLinkBackendResultError)(error))