@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
@@ -14,6 +14,9 @@ exports.encodeApplicationPayload = encodeApplicationPayload;
14
14
  exports.encodeMultipartApplicationPayload = encodeMultipartApplicationPayload;
15
15
  exports.decodeApplicationPayload = decodeApplicationPayload;
16
16
  exports.decodeApplicationPayloadView = decodeApplicationPayloadView;
17
+ exports.decodeMultipartApplicationPayloadView = decodeMultipartApplicationPayloadView;
18
+ exports.decodeMultipartApplicationParts = decodeMultipartApplicationParts;
19
+ exports.decodeMultipartParts = decodeMultipartParts;
17
20
  exports.validateApplicationPayloadFrame = validateApplicationPayloadFrame;
18
21
  exports.encodeRouteMeshAdmission = encodeRouteMeshAdmission;
19
22
  exports.decodeRouteMeshAdmission = decodeRouteMeshAdmission;
@@ -37,6 +40,10 @@ exports.APPLICATION_PAYLOAD_MINIMUM_FIELD_BYTES = 1 +
37
40
  APPLICATION_PAYLOAD_LENGTH_FIELD_BYTES;
38
41
  const MAX_U32 = stream_wire_1.UINT32_MAX;
39
42
  const MAX_U64 = stream_wire_1.UINT64_MAX;
43
+ // The framework multipart frame always carries these two schema constants;
44
+ // decoding compares their bytes in place instead of decoding text.
45
+ const MULTIPART_PACKET_NAME_BYTES = Buffer.from(service_wire_constants_generated_1.SERVICE_FRAMEWORK_MULTIPART_PACKET_NAME);
46
+ const MULTIPART_CONTENT_TYPE_BYTES = Buffer.from(service_wire_constants_generated_1.SERVICE_FRAMEWORK_MULTIPART_CONTENT_TYPE);
40
47
  exports.M6A_SERVICE_WIRE_MAGIC = service_wire_constants_generated_1.SERVICE_WIRE_MAGIC;
41
48
  exports.M6A_SERVICE_WIRE_MAJOR = service_wire_constants_generated_1.SERVICE_WIRE_MAJOR;
42
49
  exports.M6A_SERVICE_WIRE_REQUIRED_CAPABILITY = service_wire_constants_generated_1.SERVICE_WIRE_REQUIRED_CAPABILITY;
@@ -52,10 +59,9 @@ function encodeNodeSendHeader() {
52
59
  return prefix(exports.M6aServiceWireCommand.nodeSend);
53
60
  }
54
61
  function encodeNodeRequestHeader(correlation) {
55
- return withU64(prefix(exports.M6aServiceWireCommand.nodeRequest), correlation, 'correlation');
62
+ return withU64(exports.M6aServiceWireCommand.nodeRequest, correlation, 0);
56
63
  }
57
- function decodeNodeRequestHeader(frame) {
58
- const header = decodeHeader(frame);
64
+ function decodeNodeRequestHeader(frame, header = decodeHeader(frame)) {
59
65
  if (header.command !== exports.M6aServiceWireCommand.nodeRequest ||
60
66
  header.flags !== 0 ||
61
67
  frame.byteLength !== 13) {
@@ -64,10 +70,12 @@ function decodeNodeRequestHeader(frame) {
64
70
  return readNonZeroU64(asBuffer(frame), PREFIX_SIZE, 'correlation');
65
71
  }
66
72
  function encodeChannelSendHeader(channelName) {
67
- return concat(prefix(exports.M6aServiceWireCommand.channelSend), encodeText8(channelName, 'channelName'));
73
+ const length = channelNameLength(channelName);
74
+ const result = frame(exports.M6aServiceWireCommand.channelSend, 1 + length);
75
+ writeText8(result, PREFIX_SIZE, channelName, length);
76
+ return result;
68
77
  }
69
- function decodeChannelSendHeader(frame) {
70
- const header = decodeHeader(frame);
78
+ function decodeChannelSendHeader(frame, header = decodeHeader(frame)) {
71
79
  if (header.command !== exports.M6aServiceWireCommand.channelSend || header.flags !== 0) {
72
80
  fail('Invalid channelSend header.');
73
81
  }
@@ -77,10 +85,15 @@ function decodeChannelSendHeader(frame) {
77
85
  return channelName;
78
86
  }
79
87
  function encodeChannelRequestHeader(correlation, channelName) {
80
- return concat(withU64(prefix(exports.M6aServiceWireCommand.channelRequest), correlation, 'correlation'), encodeText8(channelName, 'channelName'));
88
+ const length = channelNameLength(channelName);
89
+ const result = withU64(exports.M6aServiceWireCommand.channelRequest, correlation, 1 + length);
90
+ writeText8(result, PREFIX_SIZE + 8, channelName, length);
91
+ return result;
81
92
  }
82
- function decodeChannelRequestHeader(frame) {
83
- const header = decodeHeader(frame);
93
+ function channelNameLength(channelName) {
94
+ return (0, service_wire_binary_primitives_1.canonicalServiceWireTextLength)(channelName, 'channelName', service_wire_binary_primitives_1.SERVICE_WIRE_TEXT8_MAX_BYTES, fail);
95
+ }
96
+ function decodeChannelRequestHeader(frame, header = decodeHeader(frame)) {
84
97
  if (header.command !== exports.M6aServiceWireCommand.channelRequest || header.flags !== 0) {
85
98
  fail('Invalid channelRequest header.');
86
99
  }
@@ -90,7 +103,7 @@ function decodeChannelRequestHeader(frame) {
90
103
  reader.end();
91
104
  return { correlation, channelName };
92
105
  }
93
- function encodeReplyHeader(correlation, terminalResult = 0, failureCode = 0, tail = Buffer.alloc(0)) {
106
+ function encodeReplyHeader(correlation, terminalResult = 0, failureCode = 0, tail) {
94
107
  validateReplyFields(correlation, terminalResult, failureCode);
95
108
  // service-wire-v1.schema.json: reply(20).tail -> `request-specific-tail`,
96
109
  // a conditional-union with NO `bodyLengthType`, so the selected case's
@@ -98,12 +111,12 @@ function encodeReplyHeader(correlation, terminalResult = 0, failureCode = 0, tai
98
111
  // length on the wire; an empty tail yields exactly 21 bytes. (Contrast
99
112
  // `actor-join-reply-tail`, which does declare `bodyLengthType: u16` and
100
113
  // therefore carries its own inner length prefix.)
101
- const result = Buffer.alloc(PREFIX_SIZE + 16 + tail.byteLength);
102
- prefix(exports.M6aServiceWireCommand.reply).copy(result);
114
+ const result = frame(exports.M6aServiceWireCommand.reply, 16 + (tail?.byteLength ?? 0));
103
115
  result.writeBigUInt64BE(correlation, PREFIX_SIZE);
104
116
  result.writeUInt32BE(terminalResult, PREFIX_SIZE + 8);
105
117
  result.writeUInt32BE(failureCode, PREFIX_SIZE + 12);
106
- Buffer.from(tail).copy(result, PREFIX_SIZE + 16);
118
+ if (tail !== undefined)
119
+ result.set(tail, PREFIX_SIZE + 16);
107
120
  return result;
108
121
  }
109
122
  function decodeReplyHeader(frame) {
@@ -121,28 +134,15 @@ function decodeReplyHeader(frame) {
121
134
  correlation: bytes.readBigUInt64BE(PREFIX_SIZE),
122
135
  terminalResult: bytes.readUInt32BE(PREFIX_SIZE + 8),
123
136
  failureCode: bytes.readUInt32BE(PREFIX_SIZE + 12),
124
- tail: Buffer.from(bytes.subarray(PREFIX_SIZE + 16))
137
+ // A view of the frame: the caller validates the tail before the frame is released.
138
+ tail: bytes.subarray(PREFIX_SIZE + 16)
125
139
  };
126
140
  validateReplyFields(result.correlation, result.terminalResult, result.failureCode);
127
141
  return result;
128
142
  }
129
143
  function encodeApplicationPayload(payload) {
130
- const packetName = encodeText8(payload.packetName, 'packetName');
131
- const contentType = encodeText8(payload.contentType, 'contentType');
132
- if (payload.payload.byteLength > MAX_U32)
133
- fail('Application payload exceeds u32.');
134
- const bodyLength = packetName.byteLength + contentType.byteLength + 4 + payload.payload.byteLength;
135
- if (bodyLength > MAX_U32)
136
- fail('Application payload body exceeds u32.');
137
- const result = Buffer.alloc(5 + bodyLength);
138
- result[0] = exports.APPLICATION_PAYLOAD_VERSION;
139
- result.writeUInt32BE(bodyLength, 1);
140
- let offset = 5;
141
- offset += packetName.copy(result, offset);
142
- offset += contentType.copy(result, offset);
143
- result.writeUInt32BE(payload.payload.byteLength, offset);
144
- offset += 4;
145
- Buffer.from(payload.payload.buffer, payload.payload.byteOffset, payload.payload.byteLength).copy(result, offset);
144
+ const result = allocateApplicationPayload(payload.packetName, payload.contentType, payload.payload.byteLength);
145
+ result.set(payload.payload, result.byteLength - payload.payload.byteLength);
146
146
  return result;
147
147
  }
148
148
  /**
@@ -155,8 +155,6 @@ function encodeMultipartApplicationPayload(parts, packetName, contentType) {
155
155
  fail('Multipart payload must contain at least one part.');
156
156
  if (parts.length > MAX_U32)
157
157
  fail('Multipart part count exceeds u32.');
158
- const packetNameBytes = encodeText8(packetName, 'packetName');
159
- const contentTypeBytes = encodeText8(contentType, 'contentType');
160
158
  let multipartLength = 4;
161
159
  for (const part of parts) {
162
160
  if (part.byteLength > MAX_U32)
@@ -165,27 +163,36 @@ function encodeMultipartApplicationPayload(parts, packetName, contentType) {
165
163
  if (multipartLength > MAX_U32)
166
164
  fail('Multipart payload exceeds u32.');
167
165
  }
168
- const bodyLength = packetNameBytes.byteLength + contentTypeBytes.byteLength + 4 + multipartLength;
169
- if (bodyLength > MAX_U32)
170
- fail('Application payload body exceeds u32.');
171
- const result = Buffer.alloc(5 + bodyLength);
172
- result[0] = exports.APPLICATION_PAYLOAD_VERSION;
173
- result.writeUInt32BE(bodyLength, 1);
174
- let offset = 5;
175
- offset += packetNameBytes.copy(result, offset);
176
- offset += contentTypeBytes.copy(result, offset);
177
- result.writeUInt32BE(multipartLength, offset);
178
- offset += 4;
166
+ const result = allocateApplicationPayload(packetName, contentType, multipartLength);
167
+ let offset = result.byteLength - multipartLength;
179
168
  result.writeUInt32BE(parts.length, offset);
180
169
  offset += 4;
181
170
  for (const part of parts) {
182
171
  result.writeUInt32BE(part.byteLength, offset);
183
172
  offset += 4;
184
- Buffer.from(part.buffer, part.byteOffset, part.byteLength).copy(result, offset);
173
+ result.set(part, offset);
185
174
  offset += part.byteLength;
186
175
  }
187
176
  return result;
188
177
  }
178
+ function allocateApplicationPayload(packetName, contentType, payloadLength) {
179
+ const packetNameLength = (0, service_wire_binary_primitives_1.canonicalServiceWireTextLength)(packetName, 'packetName', service_wire_binary_primitives_1.SERVICE_WIRE_TEXT8_MAX_BYTES, fail);
180
+ const contentTypeLength = (0, service_wire_binary_primitives_1.canonicalServiceWireTextLength)(contentType, 'contentType', service_wire_binary_primitives_1.SERVICE_WIRE_TEXT8_MAX_BYTES, fail);
181
+ if (payloadLength > MAX_U32)
182
+ fail('Application payload exceeds u32.');
183
+ const frameLength = exports.APPLICATION_PAYLOAD_MINIMUM_FIELD_BYTES + packetNameLength + contentTypeLength + payloadLength;
184
+ const prefixLength = 1 + APPLICATION_PAYLOAD_LENGTH_FIELD_BYTES;
185
+ const bodyLength = frameLength - prefixLength;
186
+ if (bodyLength > MAX_U32)
187
+ fail('Application payload body exceeds u32.');
188
+ const result = Buffer.alloc(frameLength);
189
+ result[0] = exports.APPLICATION_PAYLOAD_VERSION;
190
+ result.writeUInt32BE(bodyLength, 1);
191
+ let offset = writeText8(result, prefixLength, packetName, packetNameLength);
192
+ offset = writeText8(result, offset, contentType, contentTypeLength);
193
+ result.writeUInt32BE(payloadLength, offset);
194
+ return result;
195
+ }
189
196
  function decodeApplicationPayload(frame) {
190
197
  const decoded = decodeApplicationPayloadView(frame);
191
198
  return {
@@ -199,20 +206,111 @@ function decodeApplicationPayload(frame) {
199
206
  * they must hand the multipart bytes to another runtime-owned queue.
200
207
  */
201
208
  function decodeApplicationPayloadView(frame) {
202
- const reader = new Reader(frame);
203
- if (reader.u8('version') !== exports.APPLICATION_PAYLOAD_VERSION)
204
- fail('Invalid application payload version.');
205
- const bodyLength = reader.u32('bodyLength');
206
- if (bodyLength !== reader.remaining)
207
- fail('Application payload body length mismatch.');
209
+ const reader = applicationPayloadReader(frame);
208
210
  const packetName = reader.text8('packetName');
209
211
  const contentType = reader.text8('contentType');
210
- const payloadLength = reader.u32('payloadLength');
211
- if (payloadLength !== reader.remaining)
212
+ return { packetName, contentType, payload: applicationPayloadView(reader) };
213
+ }
214
+ /**
215
+ * Decodes the framework multipart application frame, whose packet name and
216
+ * content type are the schema's multipart constants, and returns a view of its
217
+ * multipart payload without decoding either text field.
218
+ */
219
+ function decodeMultipartApplicationPayloadView(frame) {
220
+ const bytes = asBuffer(frame);
221
+ const offset = multipartApplicationPayloadOffset(bytes);
222
+ return {
223
+ packetName: service_wire_constants_generated_1.SERVICE_FRAMEWORK_MULTIPART_PACKET_NAME,
224
+ contentType: service_wire_constants_generated_1.SERVICE_FRAMEWORK_MULTIPART_CONTENT_TYPE,
225
+ payload: bytes.subarray(offset)
226
+ };
227
+ }
228
+ /** Materializes final message parts directly over the retained application frame. */
229
+ function decodeMultipartApplicationParts(frame, materialize, release) {
230
+ const bytes = asBuffer(frame);
231
+ return decodeMultipartParts(bytes, materialize, release, multipartApplicationPayloadOffset(bytes));
232
+ }
233
+ function multipartApplicationPayloadOffset(bytes) {
234
+ let offset = applicationPayloadBodyOffset(bytes);
235
+ offset = expectText8At(bytes, offset, MULTIPART_PACKET_NAME_BYTES, 'packetName');
236
+ offset = expectText8At(bytes, offset, MULTIPART_CONTENT_TYPE_BYTES, 'contentType');
237
+ return applicationPayloadDataOffset(bytes, offset);
238
+ }
239
+ function expectText8At(bytes, offset, expected, field) {
240
+ if (bytes.length <= offset)
241
+ fail(`Truncated ${field}.length.`);
242
+ const length = bytes[offset++];
243
+ if (bytes.length - offset < length)
244
+ fail(`Truncated ${field}.`);
245
+ if (length !== expected.length || expected.compare(bytes, offset, offset + length) !== 0) {
246
+ fail(`Unexpected ${field}.`);
247
+ }
248
+ return offset + length;
249
+ }
250
+ function applicationPayloadBodyOffset(bytes) {
251
+ if (bytes.length === 0)
252
+ fail('Truncated version.');
253
+ if (bytes[0] !== exports.APPLICATION_PAYLOAD_VERSION)
254
+ fail('Invalid application payload version.');
255
+ const offset = 1 + APPLICATION_PAYLOAD_LENGTH_FIELD_BYTES;
256
+ if (bytes.length < offset)
257
+ fail('Truncated bodyLength.');
258
+ if (bytes.readUInt32BE(1) !== bytes.length - offset)
259
+ fail('Application payload body length mismatch.');
260
+ return offset;
261
+ }
262
+ function applicationPayloadDataOffset(bytes, offset) {
263
+ if (bytes.length - offset < APPLICATION_PAYLOAD_LENGTH_FIELD_BYTES)
264
+ fail('Truncated payloadLength.');
265
+ const length = bytes.readUInt32BE(offset);
266
+ offset += APPLICATION_PAYLOAD_LENGTH_FIELD_BYTES;
267
+ if (length !== bytes.length - offset)
212
268
  fail('Application payload length mismatch.');
213
- const payload = reader.view(payloadLength, 'payload');
214
- reader.end();
215
- return { packetName, contentType, payload };
269
+ return offset;
270
+ }
271
+ function applicationPayloadReader(frame) {
272
+ const bytes = asBuffer(frame);
273
+ return new Reader(bytes, applicationPayloadBodyOffset(bytes));
274
+ }
275
+ function applicationPayloadView(reader) {
276
+ return reader.buffer.subarray(applicationPayloadDataOffset(reader.buffer, reader.offset));
277
+ }
278
+ function decodeMultipartParts(payload, materialize, release, offset = 0) {
279
+ const bytes = asBuffer(payload);
280
+ if (bytes.length - offset < 4)
281
+ throw new ServiceWireProtocolError('Truncated multipart payload.');
282
+ const count = bytes.readUInt32BE(offset);
283
+ if (count === 0 || count > Math.floor((bytes.length - offset - 4) / 4)) {
284
+ throw new ServiceWireProtocolError('Invalid multipart part count.');
285
+ }
286
+ const result = new Array(count);
287
+ offset += 4;
288
+ let index = 0;
289
+ try {
290
+ for (; index < count; index++) {
291
+ if (bytes.length - offset < 4) {
292
+ throw new ServiceWireProtocolError('Truncated multipart part length.');
293
+ }
294
+ const length = bytes.readUInt32BE(offset);
295
+ offset += 4;
296
+ if (bytes.length - offset < length) {
297
+ throw new ServiceWireProtocolError('Truncated multipart part.');
298
+ }
299
+ result[index] = materialize(bytes.subarray(offset, offset + length));
300
+ offset += length;
301
+ }
302
+ if (offset !== bytes.length) {
303
+ throw new ServiceWireProtocolError('Multipart payload has trailing bytes.');
304
+ }
305
+ return result;
306
+ }
307
+ catch (error) {
308
+ if (release !== undefined) {
309
+ for (let retained = 0; retained < index; retained++)
310
+ release(result[retained]);
311
+ }
312
+ throw error;
313
+ }
216
314
  }
217
315
  /**
218
316
  * Validates the M6A envelope without retaining a second payload buffer. The
@@ -221,12 +319,7 @@ function decodeApplicationPayloadView(frame) {
221
319
  * message is admitted to an execution queue.
222
320
  */
223
321
  function validateApplicationPayloadFrame(frame) {
224
- const reader = new Reader(frame);
225
- if (reader.u8('version') !== exports.APPLICATION_PAYLOAD_VERSION)
226
- fail('Invalid application payload version.');
227
- const bodyLength = reader.u32('bodyLength');
228
- if (bodyLength !== reader.remaining)
229
- fail('Application payload body length mismatch.');
322
+ const reader = applicationPayloadReader(frame);
230
323
  reader.text8('packetName');
231
324
  reader.text8('contentType');
232
325
  const payloadLength = reader.u32('payloadLength');
@@ -383,19 +476,35 @@ function decodeHeader(frame) {
383
476
  fail('Unsupported service wire major.');
384
477
  return { command: frame[3], flags: frame[4] };
385
478
  }
479
+ /** Allocates a whole service wire record once and writes its prefix; the caller fills the body. */
480
+ function frame(command, bodyLength) {
481
+ const result = Buffer.allocUnsafe(PREFIX_SIZE + bodyLength);
482
+ result[0] = exports.M6A_SERVICE_WIRE_MAGIC[0];
483
+ result[1] = exports.M6A_SERVICE_WIRE_MAGIC[1];
484
+ result[2] = exports.M6A_SERVICE_WIRE_MAJOR;
485
+ result[3] = command;
486
+ result[4] = 0;
487
+ return result;
488
+ }
386
489
  function prefix(command) {
387
- return Buffer.from([
388
- exports.M6A_SERVICE_WIRE_MAGIC[0],
389
- exports.M6A_SERVICE_WIRE_MAGIC[1],
390
- exports.M6A_SERVICE_WIRE_MAJOR,
391
- command,
392
- 0
393
- ]);
394
- }
395
- function withU64(head, value, field) {
396
- if (value <= 0n || value > MAX_U64)
397
- fail(`${field} must be a non-zero u64.`);
398
- return concat(head, encodeU64(value));
490
+ return frame(command, 0);
491
+ }
492
+ /** A record whose body starts with the non-zero u64 correlation, followed by `restLength` bytes. */
493
+ function withU64(command, correlation, restLength) {
494
+ if (correlation <= 0n || correlation > MAX_U64)
495
+ fail('correlation must be a non-zero u64.');
496
+ const result = frame(command, 8 + restLength);
497
+ result.writeBigUInt64BE(correlation, PREFIX_SIZE);
498
+ return result;
499
+ }
500
+ /**
501
+ * Writes a validated text8 field — the byte length from
502
+ * canonicalServiceWireTextLength, then the UTF-8 text — and returns the next offset.
503
+ */
504
+ function writeText8(target, offset, value, length) {
505
+ target[offset] = length;
506
+ target.write(value, offset + 1, length, 'utf8');
507
+ return offset + 1 + length;
399
508
  }
400
509
  function encodeU16(value) {
401
510
  if (!Number.isInteger(value) || value < 0 || value > 0xffff)
@@ -419,7 +528,7 @@ function encodeU64(value) {
419
528
  return result;
420
529
  }
421
530
  function encodeText8(value, field) {
422
- const bytes = (0, service_wire_binary_primitives_1.encodeCanonicalServiceWireText)(value, field, 0xff, fail);
531
+ const bytes = (0, service_wire_binary_primitives_1.encodeCanonicalServiceWireText)(value, field, service_wire_binary_primitives_1.SERVICE_WIRE_TEXT8_MAX_BYTES, fail);
423
532
  return concat(Buffer.of(bytes.byteLength), bytes);
424
533
  }
425
534
  function encodeText16(value, field) {
@@ -430,7 +539,7 @@ function tlv(id, value) {
430
539
  return concat(Buffer.of(id), encodeU32(value.byteLength), value);
431
540
  }
432
541
  function concat(...parts) {
433
- return Buffer.concat(parts.map((part) => Buffer.from(part)));
542
+ return Buffer.concat(parts);
434
543
  }
435
544
  function readNonZeroU64(bytes, offset, field) {
436
545
  const result = bytes.readBigUInt64BE(offset);
@@ -439,7 +548,9 @@ function readNonZeroU64(bytes, offset, field) {
439
548
  return result;
440
549
  }
441
550
  function asBuffer(value) {
442
- return Buffer.from(value.buffer, value.byteOffset, value.byteLength);
551
+ return Buffer.isBuffer(value)
552
+ ? value
553
+ : Buffer.from(value.buffer, value.byteOffset, value.byteLength);
443
554
  }
444
555
  function validateAdmissionCommand(command) {
445
556
  if (command !== exports.M6aServiceWireCommand.hello &&
@@ -545,13 +656,13 @@ class Reader {
545
656
  const length = this.u8(`${field}.length`);
546
657
  if (length === 0)
547
658
  fail(`${field} must be non-empty.`);
548
- return decodeText(this.bytes(length, field), field);
659
+ return decodeText(this.view(length, field), field);
549
660
  }
550
661
  text16(field) {
551
662
  const length = this.u16(`${field}.length`);
552
663
  if (length === 0 || length > SERVICE_ROUTE_TEXT_MAX_BYTES)
553
664
  fail(`${field} has invalid length.`);
554
- return decodeText(this.bytes(length, field), field);
665
+ return decodeText(this.view(length, field), field);
555
666
  }
556
667
  bytes(length, field) {
557
668
  this.require(length, field);
@@ -5,9 +5,17 @@ export interface ZLinkHandlerInstanceScope {
5
5
  resolve<T>(type: Type<T>): Promise<T>;
6
6
  dispose(): Promise<void>;
7
7
  }
8
+ interface ZLinkHandlerInstanceScopeFactory {
9
+ prepare?(type: Type): void | (() => unknown);
10
+ create(context?: ZLinkMessageContext): ZLinkHandlerInstanceScope;
11
+ }
12
+ export declare function registerHandlerInstanceScopeFactory(providerResolver: ZLinkProviderResolver, factory: ZLinkHandlerInstanceScopeFactory): void;
13
+ export declare function prepareHandlerInstance<T>(providerResolver: ZLinkProviderResolver | undefined, type: Type<T>): (() => T) | undefined;
8
14
  export declare function runInHandlerInstanceScope<T>(providerResolver: ZLinkProviderResolver | undefined, context: ZLinkMessageContext | undefined, callback: (scope: ZLinkHandlerInstanceScope) => Promise<T>): Promise<T>;
9
15
  export declare function resolveLifecycleHandler<T>(owner: object, type: Type<T>, providerResolver?: ZLinkProviderResolver): Promise<T>;
10
16
  export declare function runWithLifecycleHandler<THandler, TResult>(owner: object, type: Type<THandler>, providerResolver: ZLinkProviderResolver | undefined, callback: (handler: THandler) => Promise<TResult>): Promise<TResult>;
11
17
  export declare function disposeLifecycleHandlers(owner: object, detachedTaskRunner: ZLinkDetachedTaskRunner): Promise<void>;
12
18
  export declare function disposeOwnedInstance(instance: unknown): Promise<void>;
19
+ export declare function handlerInstanceCleanup(instance: unknown): (() => unknown) | undefined;
13
20
  export declare function disposeOwnedInstances(instances: readonly unknown[]): Promise<void>;
21
+ export {};
@@ -1,10 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerHandlerInstanceScopeFactory = registerHandlerInstanceScopeFactory;
4
+ exports.prepareHandlerInstance = prepareHandlerInstance;
3
5
  exports.runInHandlerInstanceScope = runInHandlerInstanceScope;
4
6
  exports.resolveLifecycleHandler = resolveLifecycleHandler;
5
7
  exports.runWithLifecycleHandler = runWithLifecycleHandler;
6
8
  exports.disposeLifecycleHandlers = disposeLifecycleHandlers;
7
9
  exports.disposeOwnedInstance = disposeOwnedInstance;
10
+ exports.handlerInstanceCleanup = handlerInstanceCleanup;
8
11
  exports.disposeOwnedInstances = disposeOwnedInstances;
9
12
  const node_async_hooks_1 = require("node:async_hooks");
10
13
  const HANDLER_SCOPE_FACTORY = Symbol.for('@zlink-systems/framework.handler-instance-scope-factory');
@@ -13,10 +16,27 @@ const activeLifecycleScope = new node_async_hooks_1.AsyncLocalStorage();
13
16
  const detachedLifecycleResource = new node_async_hooks_1.AsyncResource('zlink:handler-instance-scope');
14
17
  const dispatchScopes = new WeakMap();
15
18
  const lifecycleScopes = new WeakMap();
19
+ function registerHandlerInstanceScopeFactory(providerResolver, factory) {
20
+ Object.defineProperty(providerResolver, HANDLER_SCOPE_FACTORY, {
21
+ value: factory,
22
+ enumerable: false
23
+ });
24
+ }
25
+ function prepareHandlerInstance(providerResolver, type) {
26
+ if (providerResolver === undefined)
27
+ return () => new type();
28
+ const factory = providerResolver[HANDLER_SCOPE_FACTORY];
29
+ if (isHandlerInstanceScopeFactory(factory)) {
30
+ const activate = factory.prepare?.(type);
31
+ if (activate !== undefined)
32
+ return activate;
33
+ }
34
+ return undefined;
35
+ }
16
36
  async function runInHandlerInstanceScope(providerResolver, context, callback) {
17
37
  const active = activeHandlerScope.getStore();
18
38
  if (active !== undefined) {
19
- return callback(active.scope);
39
+ return callback(active);
20
40
  }
21
41
  if (context !== undefined) {
22
42
  const existing = dispatchScopes.get(context);
@@ -29,7 +49,7 @@ async function runInHandlerInstanceScope(providerResolver, context, callback) {
29
49
  dispatchScopes.set(context, scope);
30
50
  }
31
51
  try {
32
- return await activeHandlerScope.run({ scope }, () => callback(scope));
52
+ return await activeHandlerScope.run(scope, () => callback(scope));
33
53
  }
34
54
  finally {
35
55
  if (context !== undefined && dispatchScopes.get(context) === scope) {
@@ -94,14 +114,15 @@ class DefaultHandlerInstanceScope {
94
114
  return existing;
95
115
  const activation = createDeferred();
96
116
  this.instances.set(type, activation.promise);
97
- void this.activate(type, activation);
117
+ this.activate(type, activation);
98
118
  return activation.promise;
99
119
  }
100
120
  async dispose() {
101
121
  if (this.disposed)
102
122
  return;
103
123
  this.disposed = true;
104
- await Promise.allSettled(this.instances.values());
124
+ if (this.owned.length !== this.instances.size)
125
+ await Promise.allSettled(this.instances.values());
105
126
  try {
106
127
  await disposeOwnedInstances(this.owned);
107
128
  }
@@ -110,21 +131,37 @@ class DefaultHandlerInstanceScope {
110
131
  this.instances.clear();
111
132
  }
112
133
  }
113
- async activate(type, activation) {
114
- let instance;
134
+ activate(type, activation) {
115
135
  try {
116
136
  const created = this.providerResolver?.create?.(type);
117
- instance = created === undefined ? new type() : await created;
137
+ if (created === undefined) {
138
+ this.completeActivation(new type(), activation);
139
+ }
140
+ else {
141
+ void this.activatePending(created, activation);
142
+ }
118
143
  }
119
144
  catch (error) {
120
145
  activation.reject(error);
121
- return;
122
146
  }
147
+ }
148
+ async activatePending(created, activation) {
149
+ try {
150
+ this.completeActivation(await created, activation);
151
+ }
152
+ catch (error) {
153
+ activation.reject(error);
154
+ }
155
+ }
156
+ completeActivation(instance, activation) {
123
157
  if (!this.disposed) {
124
158
  this.owned.push(instance);
125
159
  activation.resolve(instance);
126
160
  return;
127
161
  }
162
+ void this.disposeLateActivation(instance, activation);
163
+ }
164
+ async disposeLateActivation(instance, activation) {
128
165
  try {
129
166
  await disposeOwnedInstance(instance);
130
167
  activation.reject(new Error('Handler instance scope was disposed during activation.'));
@@ -240,18 +277,24 @@ function startOutsideLifecycleInvocation(work) {
240
277
  return detachedLifecycleResource.runInAsyncScope(work);
241
278
  }
242
279
  async function disposeOwnedInstance(instance) {
280
+ const cleanup = handlerInstanceCleanup(instance);
281
+ if (cleanup !== undefined)
282
+ await cleanup.call(instance);
283
+ }
284
+ function handlerInstanceCleanup(instance) {
243
285
  if (instance === null || instance === undefined)
244
286
  return;
245
287
  const value = instance;
246
288
  if (typeof value.dispose === 'function') {
247
- await value.dispose();
289
+ return value.dispose;
248
290
  }
249
291
  else if (typeof value.close === 'function') {
250
- await value.close();
292
+ return value.close;
251
293
  }
252
294
  else if (typeof value.onModuleDestroy === 'function') {
253
- await value.onModuleDestroy();
295
+ return value.onModuleDestroy;
254
296
  }
297
+ return undefined;
255
298
  }
256
299
  async function disposeOwnedInstances(instances) {
257
300
  const failures = [];
@@ -6,6 +6,7 @@ import type { DefaultZLinkActorManager } from '../actors';
6
6
  import type { DefaultZLinkSpotManager, ZLinkSpotNodeRuntimeManager } from '../spots';
7
7
  import type { ZLinkDetachedTaskRunner } from '../spots/spot-actor-join-dispatch';
8
8
  import type { ZLinkBoundSessionResponsePort, ZLinkSessionBindingConfirmationOptions, ZLinkStreamActorLookupPort } from '../streams/stream-binding-runtime-ports';
9
+ import type { ServiceStreamSessionBinding } from '../foundation/service-runtime-contracts';
9
10
  import { type ZLinkStreamFrameHeader } from '../streams/protocol';
10
11
  import type { MeshRouterResolver } from './mesh-router-resolver';
11
12
  import type { ZLinkStoreLocationResolvers } from '../locations';
@@ -29,12 +30,11 @@ export declare class ZLinkActorPacketRelay {
29
30
  private readonly options;
30
31
  private readonly targets;
31
32
  constructor(options: ZLinkActorPacketRelayOptions);
32
- notifyBoundActorDisconnected(actor: ZLinkSessionActor, signal?: AbortSignal): Promise<void>;
33
+ notifyBoundActorDisconnected(actor: ZLinkSessionActor, signal?: AbortSignal, binding?: ServiceStreamSessionBinding): Promise<void>;
33
34
  clearRemoteActorPacketTarget(actorId: string): void;
34
35
  updateRemoteActorPacketTarget(actorId: string, value: unknown): Promise<void>;
35
36
  actorPacketTargetForState(actorId: string): ZLinkRemoteActorPacketTarget | undefined;
36
- notifyActorDisconnectedById(actorId: string, signal?: AbortSignal): Promise<void>;
37
- notifyLocalActorDisconnectedById(actorId: string, signal?: AbortSignal): Promise<void>;
37
+ notifyLocalActorDisconnectedById(actorId: string, signal?: AbortSignal, binding?: ServiceStreamSessionBinding, bindingActorRef?: ActorRef): Promise<void>;
38
38
  receiveRemoteActorPacketRelay(payload: unknown, _routeContext: ZLinkRouteMessageContext): Promise<{
39
39
  readonly ok: boolean;
40
40
  readonly error?: unknown;
@@ -52,8 +52,10 @@ export declare class ZLinkActorPacketRelay {
52
52
  */
53
53
  private installSameNodeSessionBinding;
54
54
  relayRemoteActorPacket(actor: ZLinkSessionActor, frameHeader: ZLinkStreamFrameHeader, payload: Message): Promise<boolean>;
55
- notifyRemoteActorDisconnected(actorId: string, remoteTarget: ZLinkRemoteBoundSessionTarget | ZLinkRemoteActorPacketTarget, signal?: AbortSignal, bindingActorRef?: ActorRef): Promise<void>;
55
+ notifyRemoteActorDisconnected(actorId: string, remoteTarget: ZLinkRemoteBoundSessionTarget | ZLinkRemoteActorPacketTarget, signal?: AbortSignal, bindingActorRef?: ActorRef, binding?: ServiceStreamSessionBinding): Promise<void>;
56
+ private disconnectedFrame;
56
57
  private requireCurrentRemoteBinding;
58
+ private matchesCurrentRemoteBinding;
57
59
  private requestRemoteTarget;
58
60
  private relayLocalActorPacket;
59
61
  private sendCapturedOrCurrentBoundSessionResponse;