@zlink-systems/framework 0.30.3 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Actors/ZLinkActor.d.ts +2 -0
  3. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
  4. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
  5. package/dist/contracts/Actors/index.d.ts +1 -0
  6. package/dist/contracts/Actors/index.js +1 -0
  7. package/dist/contracts/Common/CoreTypes.d.ts +1 -0
  8. package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
  9. package/dist/contracts/Common/HandlerMessageType.js +41 -0
  10. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
  11. package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
  12. package/dist/contracts/Common/ZLinkMessage.js +11 -7
  13. package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
  14. package/dist/contracts/Common/encoded-payload-storage.js +4 -16
  15. package/dist/contracts/Common/index.d.ts +1 -1
  16. package/dist/contracts/Common/payload-slab.d.ts +4 -0
  17. package/dist/contracts/Common/payload-slab.js +30 -0
  18. package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
  19. package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
  20. package/dist/contracts/Handlers/Contexts.d.ts +1 -0
  21. package/dist/contracts/Locations/Authority.d.ts +2 -0
  22. package/dist/internal.d.ts +9 -0
  23. package/dist/internal.js +23 -1
  24. package/dist/nest-integration.d.ts +1 -0
  25. package/dist/nest-integration.js +3 -1
  26. package/dist/runtime/actors/actor-client.d.ts +6 -2
  27. package/dist/runtime/actors/actor-client.js +120 -82
  28. package/dist/runtime/actors/actor-context.js +16 -5
  29. package/dist/runtime/actors/actor-execution-context.js +2 -2
  30. package/dist/runtime/actors/actor-handoff.d.ts +12 -1
  31. package/dist/runtime/actors/actor-handoff.js +79 -34
  32. package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
  33. package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
  34. package/dist/runtime/actors/actor-local-native-join.js +19 -17
  35. package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
  36. package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
  37. package/dist/runtime/actors/actor-remote-joiner.js +4 -4
  38. package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
  39. package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
  40. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
  41. package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
  42. package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
  43. package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
  44. package/dist/runtime/admission.d.ts +6 -4
  45. package/dist/runtime/admission.js +21 -10
  46. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
  47. package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
  48. package/dist/runtime/backend/contracts/index.d.ts +26 -10
  49. package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
  50. package/dist/runtime/backend/mesh-completion-table.js +84 -20
  51. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
  52. package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
  53. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
  54. package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
  55. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
  56. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
  57. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  58. package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
  59. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
  60. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
  61. package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
  62. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
  63. package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
  64. package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
  65. package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
  66. package/dist/runtime/channels/channel-clients.js +3 -3
  67. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
  68. package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
  69. package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
  70. package/dist/runtime/channels/channel-dispatch-services.js +7 -6
  71. package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
  72. package/dist/runtime/channels/channel-dispatchers.js +57 -36
  73. package/dist/runtime/channels/channel-envelope.d.ts +2 -2
  74. package/dist/runtime/channels/channel-envelope.js +609 -83
  75. package/dist/runtime/channels/channel-multipart.d.ts +1 -0
  76. package/dist/runtime/channels/channel-multipart.js +10 -6
  77. package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
  78. package/dist/runtime/channels/channel-outbound-operations.js +107 -105
  79. package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
  80. package/dist/runtime/channels/channel-receive-loops.js +126 -90
  81. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
  82. package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
  83. package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
  84. package/dist/runtime/channels/channel-runtime-manager.js +32 -14
  85. package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
  86. package/dist/runtime/channels/channel-socket-registry.js +9 -1
  87. package/dist/runtime/channels/channel-transports.d.ts +23 -16
  88. package/dist/runtime/channels/channel-transports.js +139 -119
  89. package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
  90. package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
  91. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  92. package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
  93. package/dist/runtime/channels/local-spot-route-transport.js +15 -18
  94. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
  95. package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
  96. package/dist/runtime/channels/source-spot-router.d.ts +6 -3
  97. package/dist/runtime/channels/source-spot-router.js +34 -23
  98. package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
  99. package/dist/runtime/channels/spot-node-route-transport.js +23 -17
  100. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
  101. package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
  102. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
  103. package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
  104. package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
  105. package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
  106. package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
  107. package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
  108. package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
  109. package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
  110. package/dist/runtime/diagnostics/message-flow-record.js +228 -0
  111. package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
  112. package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
  113. package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
  114. package/dist/runtime/diagnostics/message-flow.js +42 -290
  115. package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
  116. package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
  117. package/dist/runtime/execution/index.d.ts +1 -0
  118. package/dist/runtime/execution/index.js +6 -3
  119. package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
  120. package/dist/runtime/execution/serial-execution-queue.js +75 -71
  121. package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
  122. package/dist/runtime/foundation/durable-service-request.js +158 -73
  123. package/dist/runtime/foundation/operation-registry.d.ts +33 -3
  124. package/dist/runtime/foundation/operation-registry.js +272 -33
  125. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
  126. package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
  127. package/dist/runtime/foundation/request-runtime.d.ts +17 -0
  128. package/dist/runtime/foundation/request-runtime.js +163 -0
  129. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  130. package/dist/runtime/foundation/service-discovery-registry.js +6 -0
  131. package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
  132. package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
  133. package/dist/runtime/foundation/service-mailbox.js +4 -1
  134. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
  135. package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
  136. package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
  137. package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
  138. package/dist/runtime/foundation/service-stateful-registry.js +38 -17
  139. package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
  140. package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
  141. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
  142. package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
  143. package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
  144. package/dist/runtime/foundation/service-topology-registry.js +13 -3
  145. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  146. package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
  147. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
  148. package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
  149. package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
  150. package/dist/runtime/host/actor-packet-relay.js +58 -57
  151. package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
  152. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  153. package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
  154. package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
  155. package/dist/runtime/host/application-job-queue.d.ts +7 -5
  156. package/dist/runtime/host/application-job-queue.js +33 -21
  157. package/dist/runtime/host/bound-session-relay.js +0 -1
  158. package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
  159. package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
  160. package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
  161. package/dist/runtime/host/entry-actor-runtime.js +2 -2
  162. package/dist/runtime/host/index.d.ts +106 -37
  163. package/dist/runtime/host/index.js +303 -151
  164. package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
  165. package/dist/runtime/host/location-runtime-owner.js +1 -1
  166. package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
  167. package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
  168. package/dist/runtime/host/spot-address-transport.d.ts +3 -0
  169. package/dist/runtime/host/spot-address-transport.js +73 -76
  170. package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
  171. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
  172. package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
  173. package/dist/runtime/internal-observation.d.ts +1 -0
  174. package/dist/runtime/internal-observation.js +5 -0
  175. package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
  176. package/dist/runtime/locations/actor-location-claims.js +15 -6
  177. package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
  178. package/dist/runtime/locations/auto-connect-loop.js +25 -19
  179. package/dist/runtime/locations/auto-connect-planner.js +2 -5
  180. package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
  181. package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
  182. package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
  183. package/dist/runtime/locations/in-memory-authority-store.js +15 -5
  184. package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
  185. package/dist/runtime/locations/in-memory-location-store.js +1 -38
  186. package/dist/runtime/locations/lifecycle.d.ts +1 -1
  187. package/dist/runtime/locations/lifecycle.js +2 -2
  188. package/dist/runtime/locations/location-store-repository.d.ts +0 -1
  189. package/dist/runtime/locations/location-store-repository.js +163 -246
  190. package/dist/runtime/locations/resolvers.d.ts +8 -1
  191. package/dist/runtime/locations/resolvers.js +16 -2
  192. package/dist/runtime/locations/runtime.d.ts +3 -3
  193. package/dist/runtime/locations/runtime.js +12 -16
  194. package/dist/runtime/messaging/creation-payload-codec.js +8 -7
  195. package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
  196. package/dist/runtime/messaging/framework-json-v1.js +6 -2
  197. package/dist/runtime/messaging/payload-codec.js +21 -35
  198. package/dist/runtime/messaging/request-deadline.d.ts +4 -2
  199. package/dist/runtime/messaging/request-deadline.js +40 -25
  200. package/dist/runtime/messaging/request-result.d.ts +14 -1
  201. package/dist/runtime/messaging/request-result.js +74 -13
  202. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
  203. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
  204. package/dist/runtime/spots/index.d.ts +28 -7
  205. package/dist/runtime/spots/index.js +31 -6
  206. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
  207. package/dist/runtime/spots/spot-activation-registry.js +13 -8
  208. package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
  209. package/dist/runtime/spots/spot-activation-state.js +1 -0
  210. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
  211. package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
  212. package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
  213. package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
  214. package/dist/runtime/spots/spot-actor-membership.js +3 -3
  215. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
  216. package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
  217. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
  218. package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
  219. package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
  220. package/dist/runtime/spots/spot-entry-activation.js +7 -12
  221. package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
  222. package/dist/runtime/spots/spot-handler-registry.js +31 -15
  223. package/dist/runtime/spots/spot-manager-public.js +3 -2
  224. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
  225. package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
  226. package/dist/runtime/spots/spot-outbound.d.ts +8 -2
  227. package/dist/runtime/spots/spot-outbound.js +5 -5
  228. package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
  229. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
  230. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
  231. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
  232. package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
  233. package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
  234. package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
  235. package/dist/runtime/spots/spot-timer.d.ts +1 -1
  236. package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
  237. package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
  238. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
  239. package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
  240. package/dist/runtime/streams/bound-session-service.js +6 -7
  241. package/dist/runtime/streams/index.d.ts +3 -3
  242. package/dist/runtime/streams/index.js +22 -2
  243. package/dist/runtime/streams/managed-stream.js +2 -1
  244. package/dist/runtime/streams/session-calls.d.ts +1 -1
  245. package/dist/runtime/streams/session-calls.js +3 -9
  246. package/dist/runtime/streams/session-context.d.ts +2 -2
  247. package/dist/runtime/streams/session-context.js +2 -2
  248. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
  249. package/dist/runtime/streams/stream-session-runtime.js +64 -33
  250. package/package.json +3 -3
  251. package/src/contracts/Actors/ZLinkActor.ts +6 -0
  252. package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
  253. package/src/contracts/Actors/index.ts +1 -0
  254. package/src/contracts/Common/CoreTypes.ts +1 -0
  255. package/src/contracts/Common/HandlerMessageType.ts +50 -0
  256. package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
  257. package/src/contracts/Common/ZLinkMessage.ts +11 -7
  258. package/src/contracts/Common/encoded-payload-storage.ts +4 -16
  259. package/src/contracts/Common/index.ts +1 -1
  260. package/src/contracts/Common/payload-slab.ts +29 -0
  261. package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
  262. package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
  263. package/src/contracts/Handlers/Contexts.ts +1 -0
  264. package/src/contracts/Locations/Authority.ts +7 -1
  265. package/src/internal.ts +17 -0
  266. package/src/nest-integration.ts +1 -0
  267. package/src/runtime/actors/actor-client.ts +257 -163
  268. package/src/runtime/actors/actor-context.ts +26 -14
  269. package/src/runtime/actors/actor-execution-context.ts +2 -2
  270. package/src/runtime/actors/actor-handoff.ts +86 -51
  271. package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
  272. package/src/runtime/actors/actor-local-native-join.ts +38 -17
  273. package/src/runtime/actors/actor-mailbox.ts +1 -1
  274. package/src/runtime/actors/actor-remote-joiner.ts +8 -4
  275. package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
  276. package/src/runtime/actors/actor-routed-json-request.ts +3 -0
  277. package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
  278. package/src/runtime/actors/actor-runtime-state.ts +1 -1
  279. package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
  280. package/src/runtime/admission.ts +42 -15
  281. package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
  282. package/src/runtime/backend/contracts/index.ts +77 -10
  283. package/src/runtime/backend/mesh-completion-table.ts +106 -15
  284. package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
  285. package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
  286. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
  287. package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
  288. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
  289. package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
  290. package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
  291. package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
  292. package/src/runtime/backend/raw-binding-port.ts +13 -5
  293. package/src/runtime/channels/channel-clients.ts +26 -11
  294. package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
  295. package/src/runtime/channels/channel-dispatch-services.ts +7 -12
  296. package/src/runtime/channels/channel-dispatchers.ts +93 -39
  297. package/src/runtime/channels/channel-envelope.ts +680 -144
  298. package/src/runtime/channels/channel-multipart.ts +17 -13
  299. package/src/runtime/channels/channel-outbound-operations.ts +204 -178
  300. package/src/runtime/channels/channel-receive-loops.ts +160 -107
  301. package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
  302. package/src/runtime/channels/channel-runtime-manager.ts +74 -27
  303. package/src/runtime/channels/channel-socket-registry.ts +20 -5
  304. package/src/runtime/channels/channel-transports.ts +414 -287
  305. package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
  306. package/src/runtime/channels/local-spot-route-transport.ts +27 -29
  307. package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
  308. package/src/runtime/channels/source-spot-router.ts +75 -38
  309. package/src/runtime/channels/spot-node-route-transport.ts +67 -37
  310. package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
  311. package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
  312. package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
  313. package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
  314. package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
  315. package/src/runtime/diagnostics/message-flow-record.ts +295 -0
  316. package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
  317. package/src/runtime/diagnostics/message-flow.ts +49 -362
  318. package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
  319. package/src/runtime/execution/index.ts +6 -0
  320. package/src/runtime/execution/serial-execution-queue.ts +94 -96
  321. package/src/runtime/foundation/durable-service-request.ts +212 -89
  322. package/src/runtime/foundation/operation-registry.ts +287 -38
  323. package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
  324. package/src/runtime/foundation/request-runtime.ts +227 -0
  325. package/src/runtime/foundation/service-discovery-registry.ts +7 -0
  326. package/src/runtime/foundation/service-liveness-registry.ts +1 -1
  327. package/src/runtime/foundation/service-mailbox.ts +7 -2
  328. package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
  329. package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
  330. package/src/runtime/foundation/service-stateful-registry.ts +52 -19
  331. package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
  332. package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
  333. package/src/runtime/foundation/service-topology-registry.ts +21 -3
  334. package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
  335. package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
  336. package/src/runtime/host/actor-packet-relay.ts +160 -156
  337. package/src/runtime/host/actor-placement-coordinator.ts +1 -1
  338. package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
  339. package/src/runtime/host/actor-transfer-runtime.ts +3 -3
  340. package/src/runtime/host/application-job-queue.ts +56 -27
  341. package/src/runtime/host/bound-session-relay.ts +0 -1
  342. package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
  343. package/src/runtime/host/entry-actor-runtime.ts +14 -6
  344. package/src/runtime/host/index.ts +388 -113
  345. package/src/runtime/host/location-runtime-owner.ts +3 -3
  346. package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
  347. package/src/runtime/host/spot-address-transport.ts +110 -95
  348. package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
  349. package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
  350. package/src/runtime/internal-observation.ts +2 -0
  351. package/src/runtime/locations/actor-location-claims.ts +42 -16
  352. package/src/runtime/locations/auto-connect-loop.ts +24 -16
  353. package/src/runtime/locations/auto-connect-planner.ts +2 -5
  354. package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
  355. package/src/runtime/locations/in-memory-authority-store.ts +27 -7
  356. package/src/runtime/locations/in-memory-location-store.ts +1 -74
  357. package/src/runtime/locations/lifecycle.ts +4 -2
  358. package/src/runtime/locations/location-store-repository.ts +228 -308
  359. package/src/runtime/locations/resolvers.ts +20 -8
  360. package/src/runtime/locations/runtime.ts +16 -28
  361. package/src/runtime/messaging/creation-payload-codec.ts +12 -10
  362. package/src/runtime/messaging/framework-json-v1.ts +10 -1
  363. package/src/runtime/messaging/payload-codec.ts +50 -75
  364. package/src/runtime/messaging/request-deadline.ts +47 -39
  365. package/src/runtime/messaging/request-result.ts +88 -17
  366. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  367. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  368. package/src/runtime/spots/index.ts +57 -10
  369. package/src/runtime/spots/spot-activation-registry.ts +12 -8
  370. package/src/runtime/spots/spot-activation-state.ts +2 -0
  371. package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
  372. package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
  373. package/src/runtime/spots/spot-actor-membership.ts +8 -5
  374. package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
  375. package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
  376. package/src/runtime/spots/spot-entry-activation.ts +25 -35
  377. package/src/runtime/spots/spot-handler-registry.ts +72 -15
  378. package/src/runtime/spots/spot-manager-public.ts +4 -2
  379. package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
  380. package/src/runtime/spots/spot-outbound.ts +26 -10
  381. package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
  382. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
  383. package/src/runtime/spots/spot-runtime-ports.ts +5 -2
  384. package/src/runtime/spots/spot-serial-executor.ts +1 -1
  385. package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
  386. package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
  387. package/src/runtime/spots/spot-timer.ts +1 -1
  388. package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
  389. package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
  390. package/src/runtime/streams/bound-session-service.ts +10 -7
  391. package/src/runtime/streams/index.ts +30 -4
  392. package/src/runtime/streams/managed-stream.ts +2 -1
  393. package/src/runtime/streams/session-calls.ts +9 -14
  394. package/src/runtime/streams/session-context.ts +6 -11
  395. package/src/runtime/streams/stream-session-runtime.ts +79 -40
  396. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
  397. package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
  398. package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
@@ -1,23 +1,22 @@
1
- import { trace as openTelemetryTrace, SpanStatusCode, type Attributes } from '@opentelemetry/api';
2
- import { logs as openTelemetryLogs, SeverityNumber } from '@opentelemetry/api-logs';
1
+ import type { ZLinkFlowOrigin } from '../../contracts/Dispatch/ZLinkFlowOrigin';
3
2
  import {
4
3
  MESSAGE_FLOW_MODE_RANK,
5
4
  type ZLinkDiagnosticsOptions,
6
- type ZLinkFlowOrigin,
7
- type ZLinkMessageFlowLogMode
8
- } from '../../contracts';
9
- import {
5
+ type ZLinkMessageFlowLogMode,
10
6
  ZLinkDispatchErrorSurface,
11
7
  ZLinkDispatchMessageKind,
12
8
  ZLinkRuntimeMessageFlowOutcome as ZLinkMessageFlowOutcome,
13
- type ZLinkRuntimeMessageFlowEvent,
14
9
  type ZLinkRuntimeMessageFlowResult
15
10
  } from '../../contracts/Dispatch/ZLinkDispatchOptions';
16
- import { ERROR_MESSAGE_MAX_LENGTH, dispatchErrorDetails } from './dispatch-error-details';
17
- import type { ZLinkDispatchErrorSink } from './dispatch-error-port';
18
- import { currentFlowContext, FLOW_ORIGIN_VALUES } from './flow-context';
19
- const MESSAGE_FLOW_EVENT_ID = 'zlink.message_flow';
20
- const DISPATCH_ERROR_EVENT_ID = 'zlink.dispatch_error';
11
+ import { dispatchErrorDetails } from './dispatch-error-details';
12
+ import { currentFlowContext } from './flow-context';
13
+ import { toTelemetryRecord, type MessageFlowInput } from './message-flow-record';
14
+ import {
15
+ messageFlowDelivery,
16
+ openTelemetryLease,
17
+ telemetryProviderFailureCount,
18
+ type ZLinkTelemetryLease
19
+ } from './message-flow-delivery';
21
20
 
22
21
  export interface ZLinkMessageFlowModeCell {
23
22
  mode: ZLinkMessageFlowLogMode;
@@ -27,6 +26,7 @@ export interface ZLinkDiagnosticsContext {
27
26
  readonly diagnostics: ZLinkDiagnosticsOptions;
28
27
  readonly liveMode: ZLinkMessageFlowModeCell;
29
28
  readonly sourceMeshGeneration: bigint;
29
+ readonly telemetryLease?: ZLinkTelemetryLease;
30
30
  }
31
31
 
32
32
  export const DEFAULT_ZLINK_DIAGNOSTICS: ZLinkDiagnosticsOptions = {
@@ -35,54 +35,8 @@ export const DEFAULT_ZLINK_DIAGNOSTICS: ZLinkDiagnosticsOptions = {
35
35
  includeMessageSizes: false
36
36
  };
37
37
 
38
- export const telemetryLogger = openTelemetryLogs.getLogger('@zlink-systems/framework');
39
- const telemetryTracer = openTelemetryTrace.getTracer('@zlink-systems/framework');
40
-
41
38
  let diagnosticsGeneration = 0n;
42
39
 
43
- interface ZLinkTelemetryRecord {
44
- readonly severity?: 'warning';
45
- readonly eventId: typeof MESSAGE_FLOW_EVENT_ID | typeof DISPATCH_ERROR_EVENT_ID;
46
- readonly timestamp: Date;
47
- readonly phase?: string;
48
- readonly outcome: ZLinkRuntimeMessageFlowResult;
49
- readonly surface:
50
- | 'node'
51
- | 'channel'
52
- | 'spot'
53
- | 'instance_spot'
54
- | 'actor'
55
- | 'stream'
56
- | 'actor_relocation'
57
- | 'classic_fanout';
58
- readonly messageKind: 'request' | 'send' | 'response' | 'error' | 'control';
59
- readonly reason?: string;
60
- readonly action?: string;
61
- readonly packetName?: string;
62
- readonly channelName?: string;
63
- readonly channelRouteKind?: 'route_mesh' | 'client_server';
64
- readonly meshName?: string;
65
- readonly topic?: string;
66
- readonly correlationId?: string;
67
- readonly sourceRid?: string;
68
- readonly targetRid?: string;
69
- readonly serverRid?: string;
70
- readonly flowId?: string;
71
- readonly flowOrigin?: string;
72
- readonly spotId?: string;
73
- readonly instanceSpotType?: string;
74
- readonly activationState?: string;
75
- readonly actorId?: string;
76
- readonly streamSessionId?: string;
77
- readonly commandId?: number;
78
- readonly messageSizeBytes?: number;
79
- readonly durationSeconds?: number;
80
- readonly errorType?: string;
81
- readonly errorMessage?: string;
82
- readonly errorCauseType?: string;
83
- readonly errorCauseMessage?: string;
84
- }
85
-
86
40
  export function effectiveMessageFlow(ctx: ZLinkDiagnosticsContext): ZLinkMessageFlowLogMode {
87
41
  return ctx.liveMode.mode;
88
42
  }
@@ -105,12 +59,14 @@ export function createMessageFlowModeCell(
105
59
  export function createDiagnosticsContext(
106
60
  dispatch: { diagnostics?: ZLinkDiagnosticsOptions } | undefined,
107
61
  _providerResolver: unknown,
108
- liveMode: ZLinkMessageFlowModeCell
62
+ liveMode: ZLinkMessageFlowModeCell,
63
+ telemetryLease: ZLinkTelemetryLease = openTelemetryLease()
109
64
  ): ZLinkDiagnosticsContext {
110
65
  return {
111
66
  diagnostics: dispatch?.diagnostics ?? DEFAULT_ZLINK_DIAGNOSTICS,
112
67
  liveMode,
113
- sourceMeshGeneration: ++diagnosticsGeneration
68
+ sourceMeshGeneration: ++diagnosticsGeneration,
69
+ telemetryLease
114
70
  };
115
71
  }
116
72
 
@@ -169,32 +125,24 @@ export function traceSessionBindingControlDrop(
169
125
  });
170
126
  }
171
127
 
172
- type MessageFlowInput = Omit<
173
- ZLinkRuntimeMessageFlowEvent,
174
- 'effectiveMode' | 'flowId' | 'flowOrigin'
175
- > & {
176
- readonly severity?: 'warning';
177
- readonly effectiveMode?: ZLinkMessageFlowLogMode;
178
- readonly flowId?: string;
179
- readonly flowOrigin?: import('../../contracts').ZLinkFlowOrigin;
180
- };
181
-
182
128
  export class ZLinkMessageFlowTracer {
183
129
  private tracedEvents = 0;
184
- private providerFailures = 0;
130
+ private readonly telemetryLease: ZLinkTelemetryLease;
185
131
  private localSamplingSequence = 0n;
186
132
  private errorsTracePoint?: ZLinkMessageFlowTracePoint;
187
133
  private normalTracePoint?: ZLinkMessageFlowTracePoint;
188
134
  private detailedTracePoint?: ZLinkMessageFlowTracePoint;
189
135
 
190
- constructor(
191
- private readonly ctx: ZLinkDiagnosticsContext,
192
- private readonly errorSink: ZLinkDispatchErrorSink
193
- ) {}
136
+ constructor(private readonly ctx: ZLinkDiagnosticsContext) {
137
+ this.telemetryLease = ctx.telemetryLease ?? openTelemetryLease();
138
+ }
194
139
 
195
140
  enabled(outcome: ZLinkMessageFlowOutcome): boolean {
196
141
  const mode = effectiveMessageFlow(this.ctx);
197
- return MESSAGE_FLOW_MODE_RANK[mode] >= MESSAGE_FLOW_MODE_RANK[requiredMode(outcome)];
142
+ return (
143
+ MESSAGE_FLOW_MODE_RANK[mode] >= MESSAGE_FLOW_MODE_RANK[requiredMode(outcome)] &&
144
+ messageFlowDelivery().accepts(this.telemetryLease)
145
+ );
198
146
  }
199
147
 
200
148
  accepts(outcome: ZLinkMessageFlowOutcome): boolean {
@@ -211,7 +159,10 @@ export class ZLinkMessageFlowTracer {
211
159
  if (MESSAGE_FLOW_MODE_RANK[mode] < MESSAGE_FLOW_MODE_RANK[requiredMode(outcome, result)]) {
212
160
  return undefined;
213
161
  }
214
- const samplingFlowId = flowId ?? currentFlowContext()?.flowId;
162
+ if (!messageFlowDelivery().accepts(this.telemetryLease)) return undefined;
163
+ const samplingFlowId = messageFlowTracingEnabled(mode)
164
+ ? (flowId ?? currentFlowContext()?.flowId)
165
+ : undefined;
215
166
  if (!this.acceptsSample(outcome, result, samplingFlowId, sourceMeshGeneration)) {
216
167
  return undefined;
217
168
  }
@@ -244,8 +195,10 @@ export class ZLinkMessageFlowTracer {
244
195
  MESSAGE_FLOW_MODE_RANK[requiredMode(flowInput.outcome, flowInput.result)]
245
196
  )
246
197
  return;
247
- const ambient = currentFlowContext();
248
- const flowId = flowInput.flowId ?? ambient?.flowId;
198
+ if (!messageFlowDelivery().accepts(this.telemetryLease)) return;
199
+ const tracingEnabled = messageFlowTracingEnabled(effectiveMode);
200
+ const ambient = tracingEnabled ? currentFlowContext() : undefined;
201
+ const flowId = tracingEnabled ? (flowInput.flowId ?? ambient?.flowId) : undefined;
249
202
  if (
250
203
  !this.acceptsSample(
251
204
  flowInput.outcome,
@@ -264,17 +217,28 @@ export class ZLinkMessageFlowTracer {
264
217
  acceptedFlowId?: string,
265
218
  acceptedFlowOrigin?: ZLinkFlowOrigin
266
219
  ): void {
267
- const ambient = currentFlowContext();
268
- const flowId = flowInput.flowId ?? acceptedFlowId ?? ambient?.flowId;
269
- const flowOrigin = flowInput.flowOrigin ?? acceptedFlowOrigin ?? ambient?.flowOrigin;
220
+ if (!messageFlowDelivery().accepts(this.telemetryLease)) return;
221
+ const tracingEnabled = messageFlowTracingEnabled(effectiveMode);
222
+ const ambient = tracingEnabled ? currentFlowContext() : undefined;
223
+ const flowId = tracingEnabled
224
+ ? (flowInput.flowId ?? acceptedFlowId ?? ambient?.flowId)
225
+ : undefined;
226
+ const flowOrigin = tracingEnabled
227
+ ? (flowInput.flowOrigin ?? acceptedFlowOrigin ?? ambient?.flowOrigin)
228
+ : undefined;
270
229
  const flow: MessageFlowInput = {
271
230
  ...flowInput,
272
- ...(flowId === undefined ? {} : { flowId, flowOrigin }),
231
+ ...(tracingEnabled
232
+ ? flowId === undefined
233
+ ? {}
234
+ : { flowId, flowOrigin }
235
+ : { flowId: undefined, flowOrigin: undefined }),
273
236
  streamSessionId: flowInput.streamSessionId ?? ambient?.streamSessionId,
274
237
  effectiveMode
275
238
  };
276
239
  this.tracedEvents += 1;
277
- this.publish(
240
+ messageFlowDelivery().submit(
241
+ this.telemetryLease,
278
242
  toTelemetryRecord(
279
243
  flow,
280
244
  effectiveMode === 'detailed' && this.ctx.diagnostics.includeMessageSizes
@@ -307,7 +271,7 @@ export class ZLinkMessageFlowTracer {
307
271
  }
308
272
 
309
273
  get providerFailureCount(): number {
310
- return this.providerFailures;
274
+ return telemetryProviderFailureCount();
311
275
  }
312
276
 
313
277
  private sample(
@@ -327,275 +291,6 @@ export class ZLinkMessageFlowTracer {
327
291
  this.localSamplingSequence += 1n;
328
292
  return this.localSamplingSequence;
329
293
  }
330
-
331
- private publish(record: ZLinkTelemetryRecord): void {
332
- this.publishToLogger(record);
333
- this.publishToTrace(record);
334
- }
335
-
336
- private publishToLogger(record: ZLinkTelemetryRecord): void {
337
- try {
338
- const severity =
339
- record.severity === 'warning'
340
- ? 'WARN'
341
- : record.eventId === DISPATCH_ERROR_EVENT_ID
342
- ? 'ERROR'
343
- : 'INFO';
344
- telemetryLogger.emit({
345
- eventName: record.eventId,
346
- timestamp: record.timestamp,
347
- severityNumber: SeverityNumber[severity],
348
- severityText: severity,
349
- body: structuredLogBody(record),
350
- attributes: structuredLogAttributes(record)
351
- });
352
- } catch (error) {
353
- this.reportProviderFailure('logger-provider', error);
354
- }
355
- }
356
-
357
- private publishToTrace(record: ZLinkTelemetryRecord): void {
358
- try {
359
- const span = telemetryTracer.startSpan(record.eventId, {
360
- attributes: traceAttributes(record)
361
- });
362
- if (record.eventId === DISPATCH_ERROR_EVENT_ID) {
363
- span.setStatus({ code: SpanStatusCode.ERROR, message: record.reason });
364
- }
365
- span.end();
366
- } catch (error) {
367
- this.reportProviderFailure('trace-provider', error);
368
- }
369
- }
370
-
371
- private reportProviderFailure(source: string, error: unknown): void {
372
- this.providerFailures += 1;
373
- try {
374
- this.errorSink.reportRuntimeTaskException(source, error);
375
- } catch {
376
- // The fallback diagnostics path is isolated for the same reason.
377
- }
378
- }
379
- }
380
-
381
- function toTelemetryRecord(
382
- flow: MessageFlowInput,
383
- messageSizeBytes: number | undefined,
384
- durationSeconds: number | undefined
385
- ): ZLinkTelemetryRecord {
386
- return {
387
- severity: flow.severity,
388
- eventId:
389
- flow.outcome === ZLinkMessageFlowOutcome.Error
390
- ? DISPATCH_ERROR_EVENT_ID
391
- : MESSAGE_FLOW_EVENT_ID,
392
- timestamp: new Date(),
393
- phase: messageFlowPhase(flow.outcome),
394
- outcome: flow.result ?? messageFlowOutcome(flow.outcome),
395
- surface: messageFlowSurface(flow.surface),
396
- messageKind: messageFlowKind(flow.messageKind),
397
- reason: flow.errorReason,
398
- action: flow.errorAction,
399
- packetName: flow.packetName,
400
- channelName: flow.channelName,
401
- channelRouteKind: flow.channelRouteKind ?? channelRouteKind(flow.surface),
402
- meshName: flow.meshName,
403
- topic: flow.topic,
404
- correlationId: flow.correlationId,
405
- sourceRid: flow.sourceRid,
406
- targetRid: flow.targetRid,
407
- serverRid: flow.serverRid,
408
- flowId: flow.flowId,
409
- flowOrigin: flow.flowOrigin === undefined ? undefined : FLOW_ORIGIN_VALUES[flow.flowOrigin],
410
- spotId: flow.spotId,
411
- instanceSpotType: flow.instanceSpotType,
412
- activationState: flow.activationState,
413
- actorId: flow.actorId,
414
- streamSessionId: flow.streamSessionId,
415
- commandId: flow.commandId,
416
- messageSizeBytes,
417
- durationSeconds,
418
- errorType: flow.errorType,
419
- errorMessage: flow.errorMessage,
420
- errorCauseType: flow.errorCauseType,
421
- errorCauseMessage: boundedText(flow.errorCauseMessage)
422
- };
423
- }
424
-
425
- function traceAttributes(record: ZLinkTelemetryRecord): Attributes {
426
- const attributes: Attributes = {};
427
- for (const [name, value] of Object.entries(record)) {
428
- if (value === undefined || name === 'timestamp' || name === 'severity') continue;
429
- attributes[toSnakeCase(name)] = value instanceof Date ? value.toISOString() : value;
430
- }
431
- return attributes;
432
- }
433
-
434
- function structuredLogAttributes(record: ZLinkTelemetryRecord): Attributes {
435
- // 기록의 attribute 이름은 Message flow tracing 3.2가 고정한다. 로그 본문의
436
- // `zlink flow:` 축약 key(`kind`, `mesh` …)와 다른 집합이다 —
437
- // structuredLogBodyAttributes를 참고.
438
- return compactAttributes({
439
- event_id: record.eventId,
440
- timestamp: record.timestamp.toISOString(),
441
- phase: record.phase,
442
- surface: record.surface,
443
- message_kind: record.messageKind,
444
- mesh_name: record.meshName,
445
- channel_name: record.channelName,
446
- channel_route_kind: record.channelRouteKind,
447
- source_rid: record.sourceRid,
448
- target_rid: record.targetRid,
449
- server_rid: record.serverRid,
450
- packet_name: record.packetName,
451
- topic: record.topic,
452
- spot_id: record.spotId,
453
- instance_spot_type: record.instanceSpotType,
454
- activation_state: record.activationState,
455
- actor_id: record.actorId,
456
- stream_session_id: record.streamSessionId,
457
- correlation_id: record.correlationId,
458
- flow_id: record.flowId,
459
- flow_origin: record.flowOrigin,
460
- outcome: record.outcome,
461
- reason: record.reason,
462
- action: record.action,
463
- command_id: record.commandId,
464
- error_type: record.errorType,
465
- error_message: record.errorMessage,
466
- error_cause_type: record.errorCauseType,
467
- error_cause_message: record.errorCauseMessage,
468
- message_size_bytes: record.messageSizeBytes,
469
- duration_seconds: record.durationSeconds
470
- });
471
- }
472
-
473
- function structuredLogBodyAttributes(record: ZLinkTelemetryRecord): Attributes {
474
- // `zlink flow:` 본문 전용 축약 key — Message flow tracing "Structured log 대체 표기".
475
- return compactAttributes({
476
- event: record.eventId,
477
- phase: record.phase,
478
- surface: record.surface,
479
- kind: record.messageKind,
480
- mesh: record.meshName,
481
- channel: record.channelName,
482
- channel_route: record.channelRouteKind,
483
- source_rid: record.sourceRid,
484
- target_rid: record.targetRid,
485
- server_rid: record.serverRid,
486
- packet: record.packetName,
487
- topic: record.topic,
488
- spot: record.spotId,
489
- instance_type: record.instanceSpotType,
490
- activation_state: record.activationState,
491
- actor: record.actorId,
492
- session: record.streamSessionId,
493
- corr: record.correlationId,
494
- flow: record.flowId,
495
- origin: record.flowOrigin,
496
- outcome: record.outcome,
497
- reason: record.reason,
498
- action: record.action,
499
- error_type: record.errorType,
500
- error_message: record.errorMessage,
501
- size: record.messageSizeBytes
502
- });
503
- }
504
-
505
- function structuredLogBody(record: ZLinkTelemetryRecord): string {
506
- return `zlink flow: ${Object.entries(structuredLogBodyAttributes(record))
507
- .map(([key, value]) => `${key}=${String(value)}`)
508
- .join(' ')}`;
509
- }
510
-
511
- function compactAttributes(values: Record<string, string | number | undefined>): Attributes {
512
- const attributes: Attributes = {};
513
- for (const [key, value] of Object.entries(values)) {
514
- if (value !== undefined) attributes[key] = value;
515
- }
516
- return attributes;
517
- }
518
-
519
- function messageFlowPhase(outcome: ZLinkMessageFlowOutcome): string | undefined {
520
- switch (outcome) {
521
- case ZLinkMessageFlowOutcome.Received:
522
- return 'received';
523
- case ZLinkMessageFlowOutcome.Admitted:
524
- return 'admitted';
525
- case ZLinkMessageFlowOutcome.Dispatched:
526
- return 'dispatched';
527
- case ZLinkMessageFlowOutcome.Completed:
528
- return 'completed';
529
- case ZLinkMessageFlowOutcome.Replied:
530
- return 'replied';
531
- case ZLinkMessageFlowOutcome.Dropped:
532
- return 'dropped';
533
- case ZLinkMessageFlowOutcome.Sent:
534
- return 'sent';
535
- case ZLinkMessageFlowOutcome.ReplyReceived:
536
- return 'reply_received';
537
- case ZLinkMessageFlowOutcome.Backpressured:
538
- return 'backpressured';
539
- case ZLinkMessageFlowOutcome.Error:
540
- return undefined;
541
- }
542
- }
543
-
544
- function messageFlowOutcome(outcome: ZLinkMessageFlowOutcome): ZLinkTelemetryRecord['outcome'] {
545
- if (outcome === ZLinkMessageFlowOutcome.Error) return 'failed';
546
- if (outcome === ZLinkMessageFlowOutcome.Backpressured) return 'backpressured';
547
- if (outcome === ZLinkMessageFlowOutcome.Dropped) return 'dropped';
548
- return 'succeeded';
549
- }
550
-
551
- function messageFlowSurface(surface: ZLinkDispatchErrorSurface): ZLinkTelemetryRecord['surface'] {
552
- switch (surface) {
553
- case ZLinkDispatchErrorSurface.Node:
554
- return 'node';
555
- case ZLinkDispatchErrorSurface.Channel:
556
- case ZLinkDispatchErrorSurface.RouteMeshChannel:
557
- return 'channel';
558
- case ZLinkDispatchErrorSurface.SpotRoute:
559
- case ZLinkDispatchErrorSurface.SpotSubscription:
560
- return 'spot';
561
- case ZLinkDispatchErrorSurface.InstanceSpot:
562
- return 'instance_spot';
563
- case ZLinkDispatchErrorSurface.SpotActor:
564
- return 'actor';
565
- case ZLinkDispatchErrorSurface.StreamSession:
566
- return 'stream';
567
- case ZLinkDispatchErrorSurface.ActorRelocation:
568
- return 'actor_relocation';
569
- case ZLinkDispatchErrorSurface.ClassicFanout:
570
- return 'classic_fanout';
571
- }
572
- }
573
-
574
- function messageFlowKind(kind: ZLinkDispatchMessageKind): ZLinkTelemetryRecord['messageKind'] {
575
- switch (kind) {
576
- case ZLinkDispatchMessageKind.Request:
577
- case ZLinkDispatchMessageKind.ActorRequest:
578
- return 'request';
579
- case ZLinkDispatchMessageKind.Send:
580
- case ZLinkDispatchMessageKind.ActorSend:
581
- return 'send';
582
- case ZLinkDispatchMessageKind.Response:
583
- return 'response';
584
- case ZLinkDispatchMessageKind.Error:
585
- return 'error';
586
- case ZLinkDispatchMessageKind.Control:
587
- return 'control';
588
- case ZLinkDispatchMessageKind.Publish:
589
- throw new Error('Classic fanout publish must not create a normal message-flow record.');
590
- }
591
- }
592
-
593
- function channelRouteKind(
594
- surface: ZLinkDispatchErrorSurface
595
- ): ZLinkTelemetryRecord['channelRouteKind'] {
596
- if (surface === ZLinkDispatchErrorSurface.RouteMeshChannel) return 'route_mesh';
597
- if (surface === ZLinkDispatchErrorSurface.Channel) return 'client_server';
598
- return undefined;
599
294
  }
600
295
 
601
296
  function hashFlowId(flowId: string): number {
@@ -606,11 +301,3 @@ function hashFlowId(flowId: string): number {
606
301
  }
607
302
  return hash >>> 0;
608
303
  }
609
-
610
- function boundedText(value: string | undefined): string | undefined {
611
- return value === undefined ? undefined : value.slice(0, ERROR_MESSAGE_MAX_LENGTH);
612
- }
613
-
614
- function toSnakeCase(value: string): string {
615
- return value.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
616
- }
@@ -148,7 +148,7 @@ export const METRIC_NAMES = Object.freeze({
148
148
  'zlink.host.application_job_queue.flow_state_config_failures'
149
149
  } as const);
150
150
 
151
- const COUNTERS = Object.freeze({
151
+ export const COUNTER_UNITS = Object.freeze({
152
152
  [METRIC_NAMES.StreamConnectionsOpened]: '{connection}',
153
153
  [METRIC_NAMES.StreamConnectionsClosed]: '{connection}',
154
154
  [METRIC_NAMES.MeshNodeChannelSelectionFailures]: '{failure}',
@@ -222,7 +222,7 @@ const OBSERVABLE_COUNTERS = Object.freeze({
222
222
  [METRIC_NAMES.HostApplicationJobQueueFlowStateConfigFailures]: '{failure}'
223
223
  } as const);
224
224
 
225
- type CounterName = keyof typeof COUNTERS;
225
+ type CounterName = keyof typeof COUNTER_UNITS;
226
226
  type UpDownName = keyof typeof UP_DOWN_COUNTERS;
227
227
  type HistogramName = keyof typeof HISTOGRAMS;
228
228
 
@@ -238,7 +238,7 @@ class MetricRegistry {
238
238
  >();
239
239
 
240
240
  constructor(meter: ZLinkObservableMeter) {
241
- for (const [name, unit] of Object.entries(COUNTERS)) {
241
+ for (const [name, unit] of Object.entries(COUNTER_UNITS)) {
242
242
  this.counters.set(name, meter.createCounter(name, { unit }));
243
243
  }
244
244
  for (const [name, unit] of Object.entries(UP_DOWN_COUNTERS)) {
@@ -450,6 +450,10 @@ export class ZLinkRuntimeMetrics {
450
450
  safe(() => this.registry.upDown.get(name)?.add(value, attributes));
451
451
  }
452
452
 
453
+ recordSpotCount(meshName: string, kind: 'entry' | 'user' | 'instance', delta: number): void {
454
+ this.change(METRIC_NAMES.SpotCount, delta, { mesh_name: meshName, spot_kind: kind });
455
+ }
456
+
453
457
  duration(
454
458
  name: HistogramName | string,
455
459
  seconds: number,
@@ -570,7 +574,8 @@ export class ZLinkRuntimeMetrics {
570
574
  startRelocation(
571
575
  meshName: string,
572
576
  objectKind: 'actor' | 'user_spot' | 'instance_spot',
573
- policy: 'recreate' | 'snapshot'
577
+ policy: 'recreate' | 'snapshot',
578
+ onComplete?: (outcome: string) => void
574
579
  ): ZLinkRelocationMetricOperation {
575
580
  const started = process.hrtime.bigint();
576
581
  const startAttributes = { mesh_name: meshName, object_kind: objectKind, policy };
@@ -591,6 +596,7 @@ export class ZLinkRuntimeMetrics {
591
596
  Number(process.hrtime.bigint() - started) / NANOSECONDS_PER_SECOND,
592
597
  terminal
593
598
  );
599
+ onComplete?.(outcome);
594
600
  }
595
601
  };
596
602
  }
@@ -1,4 +1,5 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { startOutsideStateLane } from './state-lane';
2
3
  import { isAbortError } from '../abort';
3
4
  import {
4
5
  ZLinkFrameworkInternalErrorKind,
@@ -31,6 +32,11 @@ export type ZLinkExecutionArea = 'application' | 'infrastructure';
31
32
 
32
33
  const executionAreaStorage = new AsyncLocalStorage<ZLinkExecutionArea>();
33
34
 
35
+ // Capture once through the execution owners, independently of module load scope.
36
+ export const detachedMeshDispatchScope = startOutsideStateLane(() =>
37
+ executionAreaStorage.exit(() => spotSerialTurnStorage.exit(() => AsyncLocalStorage.snapshot()))
38
+ );
39
+
34
40
  export function runZLinkExecutionArea<T>(area: ZLinkExecutionArea, operation: () => T): T {
35
41
  return executionAreaStorage.run(area, operation);
36
42
  }