@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
@@ -1,326 +1,6 @@
1
- import type { ZLinkJsonSchema } from '../../contracts/Handlers/JsonContract';
1
+ import * as profile from '@zlink-systems/stream-wire/internal/json';
2
2
 
3
- export const FRAMEWORK_JSON_V1_PROFILE = 'framework-json-v1';
4
-
5
- const SIGNED_64_MIN = -(1n << 63n);
6
- const UNSIGNED_64_MAX = (1n << 64n) - 1n;
7
-
8
- export interface FrameworkJsonParseOptions {
9
- readonly rejectPropertyName?: (name: string) => boolean;
10
- }
11
-
12
- export function stringifyFrameworkJsonV1(value: unknown, schema?: ZLinkJsonSchema): string {
13
- if (value === undefined || typeof value === 'function' || typeof value === 'symbol') {
14
- throw new TypeError('framework-json-v1 payload is not a JSON value.');
15
- }
16
- const encoded = JSON.stringify(value, frameworkJsonV1Replacer);
17
- if (schema !== undefined) {
18
- validateFrameworkJsonV1Value(JSON.parse(encoded), schema, '$', false);
19
- }
20
- return encoded;
21
- }
22
-
23
- // Module-level so JSON.stringify does not allocate a fresh closure per
24
- // encoded message. On the root call `this` is the {'': value} wrapper, so
25
- // this[key] resolves the raw (pre-toJSON) source for every key including ''.
26
- function frameworkJsonV1Replacer(
27
- this: Record<string, unknown>,
28
- key: string,
29
- item: unknown
30
- ): unknown {
31
- const source = this[key];
32
- if (typeof source === 'number' && !Number.isFinite(source)) {
33
- throw new TypeError('framework-json-v1 only accepts finite JSON numbers.');
34
- }
35
- if (typeof source === 'bigint') {
36
- if (source < SIGNED_64_MIN || source > UNSIGNED_64_MAX) {
37
- throw new RangeError('framework-json-v1 64-bit integer is outside the supported range.');
38
- }
39
- return source.toString(10);
40
- }
41
- if (source instanceof Uint8Array) {
42
- return Buffer.from(source.buffer, source.byteOffset, source.byteLength).toString('base64');
43
- }
44
- if (source instanceof Date) {
45
- throw new TypeError('framework-json-v1 does not implicitly encode Date values.');
46
- }
47
- if (
48
- typeof source === 'object' &&
49
- source !== null &&
50
- typeof (source as { readonly toJSON?: unknown }).toJSON === 'function'
51
- ) {
52
- throw new TypeError('framework-json-v1 does not implicitly invoke custom toJSON methods.');
53
- }
54
- return item;
55
- }
56
-
57
- export function parseFrameworkJsonV1(
58
- text: string,
59
- options: FrameworkJsonParseOptions = {},
60
- schema?: ZLinkJsonSchema
61
- ): unknown {
62
- if (text.charCodeAt(0) === 0xfeff) {
63
- throw new SyntaxError('framework-json-v1 does not allow a UTF-8 BOM.');
64
- }
65
- new JsonPropertyScanner(text, options).scan();
66
- const parsed = JSON.parse(text);
67
- return schema === undefined ? parsed : validateFrameworkJsonV1Value(parsed, schema, '$', true);
68
- }
69
-
70
- // Sticky pattern shared across scans; matching happens synchronously so the
71
- // mutable lastIndex never crosses calls.
72
- const NUMBER_TOKEN_PATTERN = /-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?/uy;
73
-
74
- const BASE64_PATTERN = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u;
75
- const INT32_MIN = -2_147_483_648;
76
- const INT32_MAX = 2_147_483_647;
77
- const UINT32_MAX = 4_294_967_295;
78
-
79
- function validateFrameworkJsonV1Value(
80
- value: unknown,
81
- schema: ZLinkJsonSchema,
82
- path: string,
83
- decode: boolean
84
- ): unknown {
85
- switch (schema.type) {
86
- case 'boolean':
87
- if (typeof value !== 'boolean') schemaFailure(path, 'a boolean');
88
- return value;
89
- case 'string':
90
- if (typeof value !== 'string') schemaFailure(path, 'a string');
91
- return value;
92
- case 'number':
93
- if (typeof value !== 'number' || !Number.isFinite(value))
94
- schemaFailure(path, 'a finite number');
95
- return value;
96
- case 'int32':
97
- if (
98
- !Number.isInteger(value) ||
99
- (value as number) < INT32_MIN ||
100
- (value as number) > INT32_MAX
101
- ) {
102
- schemaFailure(path, 'an int32 JSON number');
103
- }
104
- return value;
105
- case 'uint32':
106
- if (!Number.isInteger(value) || (value as number) < 0 || (value as number) > UINT32_MAX) {
107
- schemaFailure(path, 'a uint32 JSON number');
108
- }
109
- return value;
110
- case 'int64':
111
- return validateDecimalInteger(value, path, true, decode);
112
- case 'uint64':
113
- return validateDecimalInteger(value, path, false, decode);
114
- case 'bytes': {
115
- if (typeof value !== 'string' || !BASE64_PATTERN.test(value)) {
116
- schemaFailure(path, 'padded RFC 4648 base64');
117
- }
118
- const bytes = Buffer.from(value as string, 'base64');
119
- if (bytes.toString('base64') !== value)
120
- schemaFailure(path, 'canonical padded RFC 4648 base64');
121
- return decode ? Uint8Array.from(bytes) : value;
122
- }
123
- case 'enum':
124
- if (typeof value !== 'string' || !schema.names.includes(value)) {
125
- schemaFailure(path, `one of ${schema.names.join(', ')}`);
126
- }
127
- return value;
128
- case 'nullable':
129
- return value === null
130
- ? null
131
- : validateFrameworkJsonV1Value(value, schema.value, path, decode);
132
- case 'array':
133
- if (!Array.isArray(value)) schemaFailure(path, 'an array');
134
- return (value as unknown[]).map((item, index) =>
135
- validateFrameworkJsonV1Value(item, schema.items, `${path}[${index}]`, decode)
136
- );
137
- case 'record': {
138
- if (!isJsonObject(value)) schemaFailure(path, 'an object');
139
- const result: Record<string, unknown> = {};
140
- for (const [name, item] of Object.entries(value as Record<string, unknown>)) {
141
- result[name] = validateFrameworkJsonV1Value(item, schema.values, `${path}.${name}`, decode);
142
- }
143
- return decode ? result : value;
144
- }
145
- case 'object': {
146
- if (!isJsonObject(value)) schemaFailure(path, 'an object');
147
- const input = value as Record<string, unknown>;
148
- for (const name of schema.required) {
149
- if (!Object.prototype.hasOwnProperty.call(input, name)) {
150
- throw new TypeError(`framework-json-v1 required property '${path}.${name}' is missing.`);
151
- }
152
- }
153
- const result: Record<string, unknown> = {};
154
- for (const [name, item] of Object.entries(input)) {
155
- const propertySchema: unknown = schema.properties[name];
156
- if (propertySchema === undefined) {
157
- if (schema.additionalProperties === false) {
158
- throw new TypeError(`framework-json-v1 property '${path}.${name}' is not allowed.`);
159
- }
160
- continue;
161
- }
162
- result[name] = validateFrameworkJsonV1Value(
163
- item,
164
- propertySchema as ZLinkJsonSchema,
165
- `${path}.${name}`,
166
- decode
167
- );
168
- }
169
- return decode ? result : value;
170
- }
171
- }
172
- }
173
-
174
- function validateDecimalInteger(
175
- value: unknown,
176
- path: string,
177
- signed: boolean,
178
- decode: boolean
179
- ): unknown {
180
- if (typeof value !== 'string' || !/^(?:0|[1-9][0-9]*|-[1-9][0-9]*)$/u.test(value)) {
181
- schemaFailure(
182
- path,
183
- signed ? 'a canonical int64 decimal string' : 'a canonical uint64 decimal string'
184
- );
185
- }
186
- const parsed = BigInt(value as string);
187
- const minimum = signed ? SIGNED_64_MIN : 0n;
188
- const maximum = signed ? (1n << 63n) - 1n : UNSIGNED_64_MAX;
189
- if (parsed < minimum || parsed > maximum)
190
- schemaFailure(path, signed ? 'an int64 value' : 'a uint64 value');
191
- return decode ? parsed : value;
192
- }
193
-
194
- function isJsonObject(value: unknown): value is Record<string, unknown> {
195
- return typeof value === 'object' && value !== null && !Array.isArray(value);
196
- }
197
-
198
- function schemaFailure(path: string, expected: string): never {
199
- throw new TypeError(`framework-json-v1 value '${path}' must be ${expected}.`);
200
- }
201
-
202
- class JsonPropertyScanner {
203
- private index = 0;
204
-
205
- constructor(
206
- private readonly text: string,
207
- private readonly options: FrameworkJsonParseOptions
208
- ) {}
209
-
210
- scan(): void {
211
- this.skipWhitespace();
212
- this.scanValue();
213
- this.skipWhitespace();
214
- if (this.index !== this.text.length) this.fail('trailing data');
215
- }
216
-
217
- private scanValue(): void {
218
- this.skipWhitespace();
219
- const token = this.text[this.index];
220
- if (token === '{') return this.scanObject();
221
- if (token === '[') return this.scanArray();
222
- if (token === '"') {
223
- this.scanString();
224
- return;
225
- }
226
- if (token === 't') return this.scanLiteral('true');
227
- if (token === 'f') return this.scanLiteral('false');
228
- if (token === 'n') return this.scanLiteral('null');
229
- this.scanNumber();
230
- }
231
-
232
- private scanObject(): void {
233
- this.index++;
234
- this.skipWhitespace();
235
- if (this.text[this.index] === '}') {
236
- this.index++;
237
- return;
238
- }
239
- const properties = new Set<string>();
240
- for (;;) {
241
- this.skipWhitespace();
242
- if (this.text[this.index] !== '"') this.fail('object property name');
243
- const property = this.scanString();
244
- if (properties.has(property)) {
245
- throw new SyntaxError(`framework-json-v1 duplicate property '${property}'.`);
246
- }
247
- properties.add(property);
248
- if (this.options.rejectPropertyName?.(property) === true) {
249
- throw new SyntaxError(`framework-json-v1 property '${property}' is not allowed.`);
250
- }
251
- this.skipWhitespace();
252
- if (this.text[this.index] !== ':') this.fail("':' after object property");
253
- this.index++;
254
- this.scanValue();
255
- this.skipWhitespace();
256
- const delimiter = this.text[this.index++];
257
- if (delimiter === '}') return;
258
- if (delimiter !== ',') this.fail("',' or '}' after object property");
259
- }
260
- }
261
-
262
- private scanArray(): void {
263
- this.index++;
264
- this.skipWhitespace();
265
- if (this.text[this.index] === ']') {
266
- this.index++;
267
- return;
268
- }
269
- for (;;) {
270
- this.scanValue();
271
- this.skipWhitespace();
272
- const delimiter = this.text[this.index++];
273
- if (delimiter === ']') return;
274
- if (delimiter !== ',') this.fail("',' or ']' after array item");
275
- }
276
- }
277
-
278
- private scanString(): string {
279
- const start = this.index++;
280
- let sawEscape = false;
281
- for (;;) {
282
- if (this.index >= this.text.length) this.fail('unterminated string');
283
- const character = this.text[this.index++]!;
284
- if (character === '"') {
285
- // Without escapes the token content is verbatim; the outer
286
- // JSON.parse pass still rejects any raw control characters.
287
- return sawEscape
288
- ? (JSON.parse(this.text.slice(start, this.index)) as string)
289
- : this.text.slice(start + 1, this.index - 1);
290
- }
291
- if (character === '\\') {
292
- sawEscape = true;
293
- if (this.index >= this.text.length) this.fail('unterminated escape');
294
- const escaped = this.text[this.index++]!;
295
- if (escaped === 'u') this.index += 4;
296
- }
297
- }
298
- }
299
-
300
- private scanLiteral(value: 'true' | 'false' | 'null'): void {
301
- if (!this.text.startsWith(value, this.index)) this.fail(value);
302
- this.index += value.length;
303
- }
304
-
305
- private scanNumber(): void {
306
- NUMBER_TOKEN_PATTERN.lastIndex = this.index;
307
- const match = NUMBER_TOKEN_PATTERN.exec(this.text);
308
- if (match === null) this.fail('JSON value');
309
- this.index += match[0].length;
310
- }
311
-
312
- private skipWhitespace(): void {
313
- for (;;) {
314
- const code = this.text.charCodeAt(this.index);
315
- if (code === 0x20 || code === 0x09 || code === 0x0a || code === 0x0d) {
316
- this.index += 1;
317
- continue;
318
- }
319
- return;
320
- }
321
- }
322
-
323
- private fail(expected: string): never {
324
- throw new SyntaxError(`framework-json-v1 expected ${expected} at offset ${this.index}.`);
325
- }
326
- }
3
+ export const FRAMEWORK_JSON_V1_PROFILE = profile.FRAMEWORK_JSON_V1_PROFILE;
4
+ export const stringifyFrameworkJsonV1 = profile.stringifyFrameworkJsonV1;
5
+ export const parseFrameworkJsonV1 = profile.parseFrameworkJsonV1;
6
+ export type { FrameworkJsonParseOptions } from '@zlink-systems/stream-wire/internal/json';
@@ -1,3 +1,7 @@
1
+ import {
2
+ readFrameworkPacketJsonContract,
3
+ normalizePacketName
4
+ } from '@zlink-systems/stream-wire/internal/json';
1
5
  import { readZLinkDecoratorMetadata } from '../../contracts/Handlers/Attributes';
2
6
  import type { ZLinkPacketJsonContract } from '../../contracts/Handlers/JsonContract';
3
7
  import { ZLinkConfigurationException } from '../configuration';
@@ -42,23 +46,7 @@ export function resolveFrameworkPacketJsonContract(
42
46
  return readFrameworkPacketJsonContract(constructor, explicitPacketName);
43
47
  }
44
48
 
45
- export function readFrameworkPacketJsonContract(
46
- type: object,
47
- explicitPacketName?: string
48
- ): ZLinkPacketJsonContract | undefined {
49
- const expectedPacketName = normalizePacketName(explicitPacketName);
50
- for (const metadata of readZLinkDecoratorMetadata(type)) {
51
- if (
52
- metadata.kind === 'packet' &&
53
- metadata.jsonContract !== undefined &&
54
- (expectedPacketName === undefined ||
55
- normalizePacketName(metadata.packetName) === expectedPacketName)
56
- ) {
57
- return metadata.jsonContract;
58
- }
59
- }
60
- return undefined;
61
- }
49
+ export { readFrameworkPacketJsonContract } from '@zlink-systems/stream-wire/internal/json';
62
50
 
63
51
  function tryDecoratorPacketName(payload: unknown): string | undefined {
64
52
  if (typeof payload !== 'object' || payload === null) {
@@ -86,11 +74,3 @@ function tryConstructorPacketName(payload: unknown): string | undefined {
86
74
  }
87
75
  return normalizePacketName(name);
88
76
  }
89
-
90
- function normalizePacketName(value: unknown): string | undefined {
91
- if (typeof value !== 'string') {
92
- return undefined;
93
- }
94
- const trimmed = value.trim();
95
- return trimmed.length > 0 ? trimmed : undefined;
96
- }
@@ -17,10 +17,7 @@ import {
17
17
  materializeZLinkMessageValue,
18
18
  readZLinkMessageDeclaredType
19
19
  } from '../../contracts/Common/ZLinkMessage';
20
- import {
21
- adoptEncodedPayload,
22
- borrowEncodedPayload
23
- } from '../../contracts/Common/encoded-payload-storage';
20
+ import { borrowEncodedPayload } from '../../contracts/Common/encoded-payload-storage';
24
21
  import { ZLinkConfigurationException } from '../configuration';
25
22
  import { parseFrameworkJsonV1, stringifyFrameworkJsonV1 } from './framework-json-v1';
26
23
  import type { ZLinkJsonSchema } from '../../contracts/Handlers/JsonContract';
@@ -434,13 +431,13 @@ function toRuntimeMessage(payload: ZLinkEncodedPayload): Message {
434
431
  : RuntimeMessage.fromOwned(owned);
435
432
  }
436
433
 
437
- function encodedPayloadFromOwned(bytes: Uint8Array): ZLinkEncodedPayload {
438
- if (!Buffer.isBuffer(bytes)) {
439
- return ZLinkEncodedPayload.from(bytes);
440
- }
441
- const payload = ZLinkEncodedPayload.from(Buffer.alloc(0));
442
- adoptEncodedPayload(payload, bytes);
443
- return payload;
434
+ /**
435
+ * Wraps received bytes for a serializer without copying them. Binding receive
436
+ * Buffers keep their storage after the message closes and nothing writes to
437
+ * them, so the payload may adopt them; the public from() and data() still copy.
438
+ */
439
+ export function encodedPayloadFromOwned(bytes: Uint8Array): ZLinkEncodedPayload {
440
+ return ZLinkEncodedPayload.fromOwned(bytes);
444
441
  }
445
442
 
446
443
  function rememberContentType(message: Message, contentType: string): Message {
@@ -0,0 +1,62 @@
1
+ import type { ZLinkRequest } from '../../contracts/Handlers/Attributes';
2
+
3
+ const completedAdmission = Promise.resolve();
4
+ const ignoreAdmissionFailure = (): void => {};
5
+
6
+ class RequestAdmission {
7
+ private admitted: Promise<void> | undefined;
8
+ private resolveAdmission: (() => void) | undefined;
9
+ private rejectAdmission: ((error: unknown) => void) | undefined;
10
+ confirm(): void {
11
+ this.admitted ??= completedAdmission;
12
+ this.resolveAdmission?.();
13
+ }
14
+ fail(error: unknown): void {
15
+ if (this.admitted === undefined) {
16
+ this.admitted = Promise.reject(error);
17
+ // Existing callers may observe only the reply Promise. Observing the
18
+ // rejection here leaves the public admission Promise rejected.
19
+ void this.admitted.catch(ignoreAdmissionFailure);
20
+ } else {
21
+ this.rejectAdmission?.(error);
22
+ }
23
+ }
24
+ observe(): Promise<void> {
25
+ if (this.admitted === undefined) {
26
+ this.admitted = new Promise<void>((resolve, reject) => {
27
+ this.resolveAdmission = resolve;
28
+ this.rejectAdmission = reject;
29
+ });
30
+ void this.admitted.catch(ignoreAdmissionFailure);
31
+ }
32
+ return this.admitted;
33
+ }
34
+ }
35
+
36
+ export function createZLinkRequest<TReply>(
37
+ start: (onAdmitted: () => void) => Promise<TReply>,
38
+ deliverReply?: (reply: Promise<TReply>) => Promise<TReply>
39
+ ): ZLinkRequest<TReply> {
40
+ const admission = new RequestAdmission();
41
+ let pending: Promise<TReply>;
42
+ try {
43
+ pending = start(() => admission.confirm());
44
+ } catch (error) {
45
+ pending = Promise.reject(error);
46
+ }
47
+ const observed = pending.then(
48
+ (value) => {
49
+ // A successful reply proves admission even without an observation callback.
50
+ admission.confirm();
51
+ return value;
52
+ },
53
+ (error: unknown) => {
54
+ admission.fail(error);
55
+ throw error;
56
+ }
57
+ );
58
+ const reply = deliverReply?.(observed) ?? observed;
59
+ return Object.defineProperty(reply, 'admitted', {
60
+ get: () => admission.observe()
61
+ }) as ZLinkRequest<TReply>;
62
+ }
@@ -18,6 +18,10 @@ export interface ZLinkSubmitResult {
18
18
  readonly status: ZLinkSubmitStatus;
19
19
  }
20
20
 
21
+ export const submittedResult: ZLinkSubmitResult = Object.freeze({
22
+ status: ZLinkSubmitStatus.Submitted
23
+ });
24
+
21
25
  /** Projects typed submit failure; capacity refusal has no admission wait token. */
22
26
  export function submitToRequestResult(result: number, phase: 'submit' | 'completion'): number {
23
27
  switch (result) {
@@ -54,7 +58,7 @@ export function classifySubmitResult(
54
58
  const terminal = submitToRequestResult(result, phase);
55
59
  switch (terminal) {
56
60
  case RequestResult.Ok:
57
- return { status: ZLinkSubmitStatus.Submitted };
61
+ return submittedResult;
58
62
  case RequestResult.TimedOut:
59
63
  return { status: ZLinkSubmitStatus.TimedOut };
60
64
  case RequestResult.NotFound: