@zlink-systems/framework 0.30.0 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -49,7 +49,8 @@ export class ZLinkSpotActorHandlerRegistryRuntime implements ZLinkActorHandlerRe
49
49
  );
50
50
  const resolvedPacketName = packetName ?? metadata?.packetName;
51
51
  if (metadata === undefined || resolvedPacketName === undefined) {
52
- throw new ZLinkConfigurationException(
52
+ throw createInternalFrameworkException(
53
+ ZLinkFrameworkInternalErrorKind.InvalidOperation,
53
54
  `Actor packet handler '${handlerType.name}' must declare a packet name.`
54
55
  );
55
56
  }
@@ -68,7 +69,8 @@ export class ZLinkSpotActorHandlerRegistryRuntime implements ZLinkActorHandlerRe
68
69
  addPacket(descriptor: ZLinkActorPacketDescriptor): this {
69
70
  const key = packetKey(descriptor.kind, descriptor.actorType, descriptor.packetName);
70
71
  if (this.packets.has(key)) {
71
- throw new ZLinkConfigurationException(
72
+ throw createInternalFrameworkException(
73
+ ZLinkFrameworkInternalErrorKind.InvalidOperation,
72
74
  `Actor packet '${descriptor.packetName}' for '${descriptor.actorType.name}' is already registered.`
73
75
  );
74
76
  }
@@ -2,8 +2,15 @@ import {
2
2
  ZLinkFrameworkInternalErrorKind,
3
3
  createInternalFrameworkException
4
4
  } from './framework-errors-internal';
5
+ import { isPromiseLike } from './abort';
5
6
  const BACKING_ARRAY_COMPACTION_MIN_HEAD = 1024;
6
7
 
8
+ /** Runs host admission inside the domain's request completion boundary. */
9
+ export type ZLinkMeshDispatchAdmission = (
10
+ dispatch: () => void | Promise<void>,
11
+ onRejected?: (error: unknown) => void | Promise<void>
12
+ ) => void | Promise<void>;
13
+
7
14
  /** 소비한 배열 prefix가 정리 조건에 도달했는지 판정합니다. */
8
15
  export function shouldCompactBackingArray(head: number, length: number): boolean {
9
16
  return head >= BACKING_ARRAY_COMPACTION_MIN_HEAD && head * 2 >= length;
@@ -64,21 +71,63 @@ export class ZLinkRuntimeAdmissionGate {
64
71
  }
65
72
 
66
73
  claim(meshName: string, operation: string): ZLinkApplicationWorkClaim {
74
+ const state = this.enter(meshName, operation);
75
+ let closed = false;
76
+ return {
77
+ close: () => {
78
+ if (closed) return;
79
+ closed = true;
80
+ exitAdmission(state);
81
+ }
82
+ };
83
+ }
84
+
85
+ /**
86
+ * Runs one admitted unit of work. Work that completes synchronously leaves
87
+ * admission in the same turn; asynchronous work leaves it from the single
88
+ * continuation on its result.
89
+ */
90
+ run<T>(
91
+ meshName: string,
92
+ operation: string,
93
+ work: () => T | Promise<T>,
94
+ onRejected?: (error: unknown) => T | Promise<T>
95
+ ): T | Promise<T> {
96
+ let state: ZLinkMeshAdmissionState;
97
+ let result: T | Promise<T>;
98
+ try {
99
+ state = this.enter(meshName, operation);
100
+ } catch (error) {
101
+ // The domain owns admission rejection completion, just as it owns handler failure.
102
+ return onRejected === undefined ? Promise.reject(error) : onRejected(error);
103
+ }
104
+ try {
105
+ result = work();
106
+ } catch (error) {
107
+ exitAdmission(state);
108
+ return Promise.reject(error);
109
+ }
110
+ if (!isPromiseLike(result)) {
111
+ exitAdmission(state);
112
+ return result;
113
+ }
114
+ return Promise.resolve(result).then(
115
+ (value) => {
116
+ exitAdmission(state);
117
+ return value;
118
+ },
119
+ (error: unknown) => {
120
+ exitAdmission(state);
121
+ throw error;
122
+ }
123
+ );
124
+ }
125
+
126
+ private enter(meshName: string, operation: string): ZLinkMeshAdmissionState {
67
127
  const state = this.requireState(meshName);
68
128
  if (this.ownerAdmissionOpen() && !state.sealed) {
69
129
  state.active += 1;
70
- let closed = false;
71
- return {
72
- close: () => {
73
- if (closed) return;
74
- closed = true;
75
- state.active -= 1;
76
- if (state.active === 0) {
77
- let resolve: (() => void) | undefined;
78
- while ((resolve = takeWaiter(state)) !== undefined) resolve();
79
- }
80
- }
81
- };
130
+ return state;
82
131
  }
83
132
  throw createInternalFrameworkException(
84
133
  state.sealedReason,
@@ -86,15 +135,6 @@ export class ZLinkRuntimeAdmissionGate {
86
135
  );
87
136
  }
88
137
 
89
- async run<T>(meshName: string, operation: string, work: () => Promise<T>): Promise<T> {
90
- const claim = this.claim(meshName, operation);
91
- try {
92
- return await work();
93
- } finally {
94
- claim.close();
95
- }
96
- }
97
-
98
138
  awaitZero(meshName: string, signal?: AbortSignal): Promise<void> {
99
139
  const state = this.requireState(meshName);
100
140
  if (state.active === 0) return Promise.resolve();
@@ -178,6 +218,14 @@ interface ZLinkMeshAdmissionState {
178
218
  waiterCount: number;
179
219
  }
180
220
 
221
+ function exitAdmission(state: ZLinkMeshAdmissionState): void {
222
+ state.active -= 1;
223
+ if (state.active === 0) {
224
+ let resolve: (() => void) | undefined;
225
+ while ((resolve = takeWaiter(state)) !== undefined) resolve();
226
+ }
227
+ }
228
+
181
229
  function takeWaiter(state: ZLinkMeshAdmissionState): (() => void) | undefined {
182
230
  advanceWaiterHead(state);
183
231
  const waiter = state.waiters[state.waiterHead];
@@ -16,7 +16,7 @@ export interface IngressRecordPort {
16
16
  * ordinary Framework-owned ingress record closes after the last child terminal.
17
17
  */
18
18
  export class ApplicationIngressRecordOwner {
19
- private readonly stop = new AbortController();
19
+ private stop?: AbortController;
20
20
  private closed = false;
21
21
 
22
22
  private constructor(private readonly shared: SharedIngressRecordState) {}
@@ -46,17 +46,34 @@ export class ApplicationIngressRecordOwner {
46
46
  return job;
47
47
  }
48
48
 
49
- async acquire(
49
+ acquire(
50
50
  domain: ApplicationJobRecordDomain,
51
51
  signal?: AbortSignal
52
- ): Promise<ApplicationJobRecordLease> {
53
- this.requireOpen();
54
- const initial = this.shared.takeInitialPermit(domain);
55
- if (initial !== undefined) return initial;
52
+ ): ApplicationJobRecordLease | Promise<ApplicationJobRecordLease> {
53
+ try {
54
+ this.requireOpen();
55
+ const initial = this.shared.takeInitialPermit(domain);
56
+ if (initial !== undefined) return initial;
57
+ } catch (error) {
58
+ return Promise.reject(error);
59
+ }
56
60
 
57
- const waitSignal =
58
- signal === undefined ? this.stop.signal : AbortSignal.any([this.stop.signal, signal]);
59
- const permit = await this.shared.acquirePermit(waitSignal);
61
+ return this.acquireAdditional(domain, signal);
62
+ }
63
+
64
+ private async acquireAdditional(
65
+ domain: ApplicationJobRecordDomain,
66
+ signal?: AbortSignal
67
+ ): Promise<ApplicationJobRecordLease> {
68
+ const stop = (this.stop ??= new AbortController());
69
+ const waitSignal = signal === undefined ? stop.signal : AbortSignal.any([stop.signal, signal]);
70
+ let permit: ApplicationJobPermitPort;
71
+ try {
72
+ permit = await this.shared.acquirePermit(waitSignal);
73
+ } catch (error) {
74
+ if (error === ownerClosedError) throw ownerClosedError();
75
+ throw error;
76
+ }
60
77
  if (this.closed) {
61
78
  permit.releaseAfterInternalProcessing();
62
79
  throw ownerClosedError();
@@ -67,7 +84,8 @@ export class ApplicationIngressRecordOwner {
67
84
  close(): void {
68
85
  if (this.closed) return;
69
86
  this.closed = true;
70
- this.stop.abort(ownerClosedError());
87
+ // The queue forwards this reason; only a rejected acquisition constructs the error.
88
+ this.stop?.abort(ownerClosedError);
71
89
  this.shared.releaseOwner();
72
90
  }
73
91
 
@@ -79,14 +97,12 @@ export class ApplicationIngressRecordOwner {
79
97
  /** Queue-permit child of one shared raw ingress record. */
80
98
  export class ApplicationJobRecordLease implements ApplicationJobPermitPort {
81
99
  private ingressClosed = false;
82
- private permitReleased = false;
83
100
  private processingTerminal = false;
84
- private detachedForHandlerTurn = false;
85
- private jobReleased = false;
101
+ detachedForHandlerTurn = false;
86
102
 
87
103
  constructor(
88
104
  private readonly shared: SharedIngressRecordState,
89
- private readonly permit: ApplicationJobPermitPort
105
+ private permit: ApplicationJobPermitPort | undefined
90
106
  ) {}
91
107
 
92
108
  get origin(): ApplicationJobOrigin {
@@ -103,12 +119,12 @@ export class ApplicationJobRecordLease implements ApplicationJobPermitPort {
103
119
  }
104
120
 
105
121
  releaseBeforeHandler(): void {
106
- this.releasePermit(() => this.permit.releaseBeforeHandler());
122
+ this.permit?.releaseBeforeHandler();
107
123
  }
108
124
 
109
125
  releaseAfterInternalProcessing(): void {
110
126
  this.processingTerminal = true;
111
- this.releasePermit(() => this.permit.releaseAfterInternalProcessing());
127
+ this.permit?.releaseAfterInternalProcessing();
112
128
  this.releaseJobIfTerminal();
113
129
  }
114
130
 
@@ -122,16 +138,15 @@ export class ApplicationJobRecordLease implements ApplicationJobPermitPort {
122
138
  this.releaseJobIfTerminal();
123
139
  }
124
140
 
125
- private releasePermit(release: () => void): void {
126
- if (this.permitReleased) return;
127
- this.permitReleased = true;
128
- release();
129
- }
130
-
131
141
  private releaseJobIfTerminal(): void {
132
- if (this.jobReleased || !this.ingressClosed || !this.processingTerminal) return;
133
- this.jobReleased = true;
134
- this.shared.releaseJob();
142
+ const permit = this.permit;
143
+ if (permit === undefined || !this.ingressClosed || !this.processingTerminal) return;
144
+ this.permit = undefined;
145
+ try {
146
+ this.shared.releaseJob();
147
+ } finally {
148
+ permit.releaseStorage?.();
149
+ }
135
150
  }
136
151
  }
137
152
 
@@ -203,6 +218,7 @@ class SharedIngressRecordState {
203
218
  try {
204
219
  this.initialPermit?.releaseAfterInternalProcessing();
205
220
  } finally {
221
+ this.initialPermit?.releaseStorage?.();
206
222
  this.initialPermit = undefined;
207
223
  this.record.close();
208
224
  }
@@ -2,39 +2,96 @@ import { AsyncLocalStorage } from 'node:async_hooks';
2
2
 
3
3
  import type { ApplicationJobOrigin, ApplicationJobPermitPort } from './contracts';
4
4
 
5
- interface ApplicationJobPermitScope {
6
- readonly permit: ApplicationJobPermitPort;
7
- detached: boolean;
5
+ const applicationJobPermitScope = new AsyncLocalStorage<ApplicationJobPermitPort | undefined>();
6
+
7
+ function releasePermitTurn(): void {
8
+ releaseApplicationJobPermitTurn(applicationJobPermitScope.getStore());
8
9
  }
9
10
 
10
- const applicationJobPermitScope = new AsyncLocalStorage<ApplicationJobPermitScope>();
11
+ /** Ends the internal processing of one record turn unless its handler detached the permit. */
12
+ export function releaseApplicationJobPermitTurn(
13
+ permit: ApplicationJobPermitPort | undefined
14
+ ): void {
15
+ if (permit !== undefined && !permit.detachedForHandlerTurn)
16
+ permit.releaseAfterInternalProcessing();
17
+ }
18
+
19
+ /**
20
+ * Makes `permit` the current record's permit for the synchronous part of a
21
+ * dispatch. The caller restores the returned previous scope with
22
+ * {@link leaveApplicationJobPermitScope} and releases the turn itself, so a
23
+ * dispatcher that already continues on the handler result needs no second
24
+ * continuation here.
25
+ */
26
+ export function enterApplicationJobPermitScope(
27
+ permit: ApplicationJobPermitPort
28
+ ): ApplicationJobPermitPort | undefined {
29
+ const previous = applicationJobPermitScope.getStore();
30
+ applicationJobPermitScope.enterWith(permit);
31
+ return previous;
32
+ }
33
+
34
+ export function leaveApplicationJobPermitScope(
35
+ previous: ApplicationJobPermitPort | undefined
36
+ ): void {
37
+ applicationJobPermitScope.enterWith(previous);
38
+ }
39
+
40
+ function releasePermitSuccess<TResult>(value: TResult): TResult {
41
+ releasePermitTurn();
42
+ return value;
43
+ }
44
+
45
+ function releasePermitFailure(error: unknown): never {
46
+ releasePermitTurn();
47
+ throw error;
48
+ }
11
49
 
12
50
  /**
13
51
  * Carries the host-owned queue permit through internal async dispatch without
14
52
  * leaking capacity ownership into public handler contracts.
15
53
  */
16
- export async function runWithApplicationJobPermit<TResult>(
54
+ export function runWithApplicationJobPermit<TResult>(
55
+ permit: ApplicationJobPermitPort,
56
+ callback: () => Promise<TResult>
57
+ ): Promise<TResult>;
58
+ export function runWithApplicationJobPermit<TResult, TFirst = undefined, TSecond = undefined>(
17
59
  permit: ApplicationJobPermitPort,
18
- callback: () => Promise<TResult> | TResult
19
- ): Promise<TResult> {
20
- const scope: ApplicationJobPermitScope = { permit, detached: false };
21
- return applicationJobPermitScope.run(scope, async () => {
22
- try {
23
- return await callback();
24
- } finally {
25
- if (!scope.detached) permit.releaseAfterInternalProcessing();
60
+ callback: (first: TFirst, second: TSecond) => Promise<TResult> | TResult,
61
+ first?: TFirst,
62
+ second?: TSecond
63
+ ): TResult | Promise<TResult>;
64
+ export function runWithApplicationJobPermit<TResult, TFirst, TSecond>(
65
+ permit: ApplicationJobPermitPort,
66
+ callback: (first: TFirst, second: TSecond) => Promise<TResult> | TResult,
67
+ first?: TFirst,
68
+ second?: TSecond
69
+ ): TResult | Promise<TResult> {
70
+ const previous = applicationJobPermitScope.getStore();
71
+ applicationJobPermitScope.enterWith(permit);
72
+ try {
73
+ const result = callback(first as TFirst, second as TSecond);
74
+ if (result !== null && (typeof result === 'object' || typeof result === 'function')) {
75
+ return Promise.resolve(result).then(releasePermitSuccess, releasePermitFailure);
26
76
  }
27
- });
77
+ releasePermitTurn();
78
+ return result;
79
+ } catch (error) {
80
+ releasePermitTurn();
81
+ return Promise.reject(error);
82
+ } finally {
83
+ applicationJobPermitScope.enterWith(previous);
84
+ }
28
85
  }
29
86
 
30
87
  /** Releases the current job permit immediately before the first user callback. */
31
88
  export function releaseApplicationJobPermitBeforeHandler(): void {
32
- applicationJobPermitScope.getStore()?.permit.releaseBeforeHandler();
89
+ applicationJobPermitScope.getStore()?.releaseBeforeHandler();
33
90
  }
34
91
 
35
92
  /** @internal Returns an ingress permit after a durable queue takes record ownership. */
36
93
  export function releaseApplicationJobPermitForDurableHandoff(): void {
37
- applicationJobPermitScope.getStore()?.permit.releaseAfterInternalProcessing();
94
+ applicationJobPermitScope.getStore()?.releaseAfterInternalProcessing();
38
95
  }
39
96
 
40
97
  /** True while dispatch already owns the host-wide application job permit. */
@@ -42,9 +99,14 @@ export function hasApplicationJobPermit(): boolean {
42
99
  return applicationJobPermitScope.getStore() !== undefined;
43
100
  }
44
101
 
102
+ /** The current ingress reservation; capacity remains owned by its host queue. */
103
+ export function currentApplicationJobPermit(): ApplicationJobPermitPort | undefined {
104
+ return applicationJobPermitScope.getStore();
105
+ }
106
+
45
107
  /** Keeps the ingress origin when a durable record later reacquires its permit. */
46
108
  export function currentApplicationJobOrigin(): ApplicationJobOrigin {
47
- return applicationJobPermitScope.getStore()!.permit.origin;
109
+ return applicationJobPermitScope.getStore()!.origin;
48
110
  }
49
111
 
50
112
  /** Re-enters the captured permit scope when a serial executor runs later. */
@@ -61,9 +123,8 @@ export function bindApplicationJobPermit<TResult, TArgument>(
61
123
  * detached owner must release it at handler entry or at a pre-start terminal.
62
124
  */
63
125
  export function detachApplicationJobPermit(): ApplicationJobPermitPort | undefined {
64
- const scope = applicationJobPermitScope.getStore();
65
- if (scope === undefined) return undefined;
66
- scope.permit.detachForHandlerTurn?.();
67
- scope.detached = true;
68
- return scope.permit;
126
+ const permit = applicationJobPermitScope.getStore();
127
+ if (permit === undefined) return undefined;
128
+ permit.detachForHandlerTurn();
129
+ return permit;
69
130
  }
@@ -1,15 +1,30 @@
1
1
  export type ApplicationJobOrigin = 'local' | 'remote';
2
2
 
3
3
  export interface ApplicationJobPermitPort {
4
+ /** Reacquires this record's host supply after durable FIFO ownership. */
5
+ reacquire?(signal: AbortSignal): Promise<ApplicationJobPermitPort>;
4
6
  readonly origin: ApplicationJobOrigin;
7
+ readonly detachedForHandlerTurn: boolean;
5
8
  markApplicationQueued(): void;
6
9
  /** Transfers ingress-record cleanup to a detached exact-target handler turn. */
7
- detachForHandlerTurn?(): void;
10
+ detachForHandlerTurn(): void;
8
11
  releaseBeforeHandler(): void;
9
12
  releaseAfterInternalProcessing(): void;
13
+ /** Returns reusable reservation storage only after its ingress lifetime ends. */
14
+ releaseStorage?(): void;
15
+ }
16
+
17
+ export interface ApplicationJobReceiveRotationPort {
18
+ reserve(): void;
19
+ take(): ApplicationJobPermitPort | undefined;
20
+ releaseUnused(): void;
10
21
  }
11
22
 
12
23
  export interface ApplicationJobQueuePort {
24
+ createReceiveRotation(
25
+ capacity: number,
26
+ origin: ApplicationJobOrigin
27
+ ): ApplicationJobReceiveRotationPort;
13
28
  acquire(
14
29
  signal: AbortSignal | undefined,
15
30
  origin: ApplicationJobOrigin
@@ -61,12 +61,32 @@ export type ZLinkBackendObjectPlacement =
61
61
  | { readonly kind: 'capacity' }
62
62
  | { readonly kind: 'unavailable' };
63
63
 
64
+ export type ZLinkBackendRequestSourceAcceptance = (
65
+ nodeRid: string,
66
+ nodeGeneration: bigint,
67
+ nodeRidStorageHex: string,
68
+ signal?: AbortSignal
69
+ ) =>
70
+ | import('../../locations/request-source-resolver').ZLinkRequestSourceFence
71
+ | undefined
72
+ | Promise<import('../../locations/request-source-resolver').ZLinkRequestSourceFence | undefined>;
73
+
64
74
  export interface ZLinkBackendMeshNode {
75
+ acceptRelocatedActorTerminal?(
76
+ operation: { readonly high: bigint; readonly low: bigint },
77
+ replyRouteId: bigint,
78
+ result: import('../../foundation/service-stateful-runtime').ServiceStatefulResult
79
+ ): 'terminalReceived' | 'alreadyTerminal' | undefined;
80
+ readonly routingId?: RoutingId;
81
+ cancelPendingOperations?(reason: unknown): void;
65
82
  completeClosedInstance?(spotId: string, objectGeneration: bigint): void;
66
83
  setDispatchErrorReporter?(
67
84
  reporter: import('../../channels/dispatch-error-reporter').ZLinkDispatchErrorReporter,
68
85
  meshName: string
69
86
  ): void;
87
+ setSessionOwnerDescriptors?(
88
+ source: import('../../foundation/service-stateful-runtime').ServiceSessionOwnerDescriptors
89
+ ): void;
70
90
  setRoutingId(routingId: unknown): void;
71
91
  setBind(endpoint: string): void;
72
92
  setAdvertiseHost(host: string): void;
@@ -97,9 +117,9 @@ export interface ZLinkBackendMeshNode {
97
117
  'kind'
98
118
  >
99
119
  ): Promise<boolean>;
100
- shutdown(timeoutMs: number): RequestResult;
120
+ shutdown(timeoutMs: number): Promise<RequestResult>;
101
121
  publishDraining?(): Promise<void>;
102
- close(): void;
122
+ close(): Promise<void>;
103
123
  addChannelName(name: string): void;
104
124
  setChannelWeight(name: string, weight: number): Promise<void>;
105
125
  setPlacementWeight(weight: number): Promise<void>;
@@ -125,7 +145,8 @@ export interface ZLinkBackendMeshNode {
125
145
  parts: ZLinkBackendMessageLike | readonly ZLinkBackendMessageLike[],
126
146
  deadlineUnixMs: bigint,
127
147
  sourceSpotId?: string,
128
- metadata?: ReadonlyMap<string, string>
148
+ metadata?: ReadonlyMap<string, string>,
149
+ onAdmitted?: () => void
129
150
  ): MeshOperationId;
130
151
  sendToInstanceSpot(
131
152
  route: ServiceInstanceRouteFence,
@@ -140,7 +161,8 @@ export interface ZLinkBackendMeshNode {
140
161
  timeoutMs?: number,
141
162
  sourceSpotId?: string,
142
163
  metadata?: ReadonlyMap<string, string>,
143
- instanceIntent?: boolean
164
+ instanceIntent?: boolean,
165
+ onAdmitted?: () => void
144
166
  ): MeshOperationId;
145
167
  registerUserSpotOperationHandler(handler: ServiceUserSpotOperationHandler): void;
146
168
  requestUserSpotCreate(
@@ -181,13 +203,28 @@ export interface ZLinkBackendMeshNode {
181
203
  readonly securityIdentity?: string;
182
204
  readonly lifecycleGeneration: bigint;
183
205
  }): void;
206
+ /**
207
+ * Installs the source request owner check the first accepting owner runs on Actor and Spot
208
+ * ingress (Location runtime §9.3). Undefined from the check ends the request Unavailable.
209
+ */
210
+ setRequestSourceAcceptance?(acceptance: ZLinkBackendRequestSourceAcceptance): void;
184
211
  isObjectClientNodeDirectTarget?(targetRid: unknown): boolean;
212
+ observePeerRoute?(
213
+ targetRid: unknown
214
+ ): import('../../foundation/durable-service-request').PeerRouteObservation;
215
+ hasPeerRouteOrConnectionIntent?(targetRid: unknown, endpoint: string): boolean;
185
216
  isPeerRouteReady?(targetRid: unknown, lifecycleGeneration?: bigint): boolean;
217
+ waitForPeerRoute?(
218
+ targetRid: unknown,
219
+ lifecycleGeneration: bigint,
220
+ deadlineUnixMs: bigint,
221
+ signal?: AbortSignal
222
+ ): Promise<void>;
186
223
  sendToNode(
187
224
  targetRid: unknown,
188
225
  parts: MessageLike | readonly MessageLike[],
189
226
  options?: { flags?: number }
190
- ): Promise<SubmitResult>;
227
+ ): SubmitResult | Promise<SubmitResult>;
191
228
  /**
192
229
  * Sends service-wire infrastructure frames directly to a peer. Relocation
193
230
  * Prepare may add NODE-INTERNAL sideband frames after its canonical frame.
@@ -208,12 +245,21 @@ export interface ZLinkBackendMeshNode {
208
245
  requestInfrastructureControlFrames?(
209
246
  targetRid: unknown,
210
247
  frames: readonly Uint8Array[],
211
- options?: { readonly timeoutMs?: number }
248
+ options?: {
249
+ readonly timeoutMs?: number;
250
+ readonly signal?: AbortSignal;
251
+ readonly onSubmitted?: (signal: AbortSignal) => Promise<void>;
252
+ }
212
253
  ): Promise<readonly Uint8Array[]>;
213
254
  requestToNode(
214
255
  targetRid: unknown,
215
256
  parts: MessageLike | readonly MessageLike[],
216
- options?: { flags?: number; timeoutMs?: number; applicationMetadata?: Buffer }
257
+ options?: {
258
+ flags?: number;
259
+ timeoutMs?: number;
260
+ applicationMetadata?: Buffer;
261
+ onAdmitted?: () => void;
262
+ }
217
263
  ): MeshOperationId;
218
264
  sendToChannel(
219
265
  channelName: string,
@@ -223,7 +269,12 @@ export interface ZLinkBackendMeshNode {
223
269
  requestToChannel(
224
270
  channelName: string,
225
271
  parts: MessageLike | readonly MessageLike[],
226
- options?: { flags?: number; timeoutMs?: number; applicationMetadata?: Buffer }
272
+ options?: {
273
+ flags?: number;
274
+ timeoutMs?: number;
275
+ applicationMetadata?: Buffer;
276
+ onAdmitted?: () => void;
277
+ }
227
278
  ): MeshOperationId;
228
279
  status(): MeshNodeStatus;
229
280
  peers(): MeshPeerEntry[];
@@ -296,9 +347,10 @@ export interface ZLinkBackendMeshNode {
296
347
  source: ServiceDirectSpotRouteFence
297
348
  ): ServiceSpotMessageFollowSeal | undefined;
298
349
  abortSpotMessageFollowIngress?(seal: ServiceSpotMessageFollowSeal): boolean;
350
+ /** A null target consumes the committed seal without installing a Follow route. */
299
351
  commitSpotMessageFollowIngress?(
300
352
  seal: ServiceSpotMessageFollowSeal,
301
- target: ServiceDirectSpotRouteFence,
353
+ target: ServiceDirectSpotRouteFence | null,
302
354
  durationMs: number
303
355
  ): Promise<boolean>;
304
356
  joinActorSpot(
@@ -344,12 +396,21 @@ export interface ZLinkBackendMeshNode {
344
396
  sendToActor(
345
397
  actor: ZLinkBackendActorRef,
346
398
  parts: MessageLike | readonly MessageLike[],
347
- options?: { flags?: number }
399
+ options?: {
400
+ flags?: number;
401
+ routeFence?: import('../../foundation/service-stateful-wire-codec').ServiceActorRouteFence;
402
+ }
348
403
  ): Promise<SubmitResult>;
349
404
  requestToActor(
350
405
  actor: ZLinkBackendActorRef,
351
406
  parts: MessageLike | readonly MessageLike[],
352
- options?: { flags?: number; timeoutMs?: number; applicationMetadata?: Buffer }
407
+ options?: {
408
+ flags?: number;
409
+ timeoutMs?: number;
410
+ applicationMetadata?: Buffer;
411
+ onAdmitted?: () => void;
412
+ routeFence?: import('../../foundation/service-stateful-wire-codec').ServiceActorRouteFence;
413
+ }
353
414
  ): MeshOperationId;
354
415
  actorSendToActor(
355
416
  source: ZLinkBackendActorRef,
@@ -361,7 +422,12 @@ export interface ZLinkBackendMeshNode {
361
422
  source: ZLinkBackendActorRef,
362
423
  target: ZLinkBackendActorRef,
363
424
  parts: MessageLike | readonly MessageLike[],
364
- options?: { flags?: number; timeoutMs?: number; applicationMetadata?: Buffer }
425
+ options?: {
426
+ flags?: number;
427
+ timeoutMs?: number;
428
+ applicationMetadata?: Buffer;
429
+ onAdmitted?: () => void;
430
+ }
365
431
  ): MeshOperationId;
366
432
  sendActorBoundSession(
367
433
  actor: ZLinkBackendActorRef,
@@ -484,7 +550,11 @@ export interface ZLinkBackendDealerSocket extends ZLinkBackendConnectableSocket
484
550
  receiveTimeoutMs: number;
485
551
  maxMessageSize: number;
486
552
  send(message: Message | readonly Message[]): Promise<void>;
487
- request(message: Message | readonly Message[], timeoutMs?: number): Promise<readonly Message[]>;
553
+ request(
554
+ message: Message | readonly Message[],
555
+ timeoutMs?: number,
556
+ onAdmitted?: () => void
557
+ ): Promise<readonly Message[]>;
488
558
  recv(flags?: ZLinkBackendRecvFlags): Received | undefined;
489
559
  }
490
560
 
@@ -501,7 +571,7 @@ export interface ZLinkBackendSendOperation {
501
571
  export interface ZLinkBackendRequestOperation {
502
572
  message(message: MessageLike): ZLinkBackendRequestOperation;
503
573
  timeout(timeoutMs: number): ZLinkBackendRequestOperation;
504
- submit(): Promise<readonly Message[]>;
574
+ submit(onAdmitted?: () => void): Promise<readonly Message[]>;
505
575
  }
506
576
 
507
577
  export interface ZLinkBackendRouterSocket extends ZLinkBackendConnectableSocket {
@@ -519,7 +589,8 @@ export interface ZLinkBackendRouterSocket extends ZLinkBackendConnectableSocket
519
589
  request(
520
590
  routingId: RoutingId,
521
591
  message: Message | readonly Message[],
522
- timeoutMs?: number
592
+ timeoutMs?: number,
593
+ onAdmitted?: () => void
523
594
  ): Promise<readonly Message[]>;
524
595
  sendToSpot(
525
596
  targetNodeRid: RoutingId,
@@ -531,7 +602,8 @@ export interface ZLinkBackendRouterSocket extends ZLinkBackendConnectableSocket
531
602
  targetNodeRid: RoutingId,
532
603
  targetSpotId: RoutingId,
533
604
  parts: readonly Message[],
534
- timeoutMs?: number
605
+ timeoutMs?: number,
606
+ onAdmitted?: () => void
535
607
  ): Promise<readonly Message[]>;
536
608
  disconnectPeer(routingId: RoutingId): void;
537
609
  reply(routingId: RoutingId, replyToken: unknown): ZLinkBackendReplyOperation;
@@ -688,7 +760,8 @@ export interface ZLinkBackendSpot extends ZLinkBackendObject {
688
760
  requestToChannel(
689
761
  channelName: string,
690
762
  payload: Message | readonly Message[],
691
- timeoutMs?: number
763
+ timeoutMs?: number,
764
+ onAdmitted?: () => void
692
765
  ): Promise<readonly Message[]>;
693
766
  sendToChannel(channelName: string, payload: Message | readonly Message[]): Promise<void>;
694
767
  publish(
@@ -705,7 +778,8 @@ export interface ZLinkBackendSpot extends ZLinkBackendObject {
705
778
  targetRid: RoutingId,
706
779
  spotId: RoutingId,
707
780
  payload: Message | readonly Message[],
708
- timeoutMs?: number
781
+ timeoutMs?: number,
782
+ onAdmitted?: () => void
709
783
  ): Promise<readonly Message[]>;
710
784
  dispose(): Promise<void>;
711
785
  }