@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,3 +1,4 @@
1
+ import { createAbortError } from '../abort';
1
2
  export interface OperationClock {
2
3
  now(): number;
3
4
  }
@@ -19,8 +20,28 @@ export class OperationCancelledError extends Error {
19
20
  }
20
21
  }
21
22
 
22
- export interface PendingOperation<T> {
23
+ export interface OperationHandle<T> {
23
24
  readonly id: bigint;
25
+ readonly deadlineMs: number | undefined;
26
+ readonly promise?: Promise<T>;
27
+ complete(value: T, retentionMs?: number): boolean;
28
+ fail(reason: unknown): boolean;
29
+ takeFailure(reason: unknown): boolean;
30
+ resolveCaller(value: T): boolean;
31
+ rejectCaller(reason: unknown): boolean;
32
+ isPending(): boolean;
33
+ hasObserver(): boolean;
34
+ setFailureDispatcher(dispatcher: (reason: unknown) => void): void;
35
+ clearFailureDispatcher(dispatcher: (reason: unknown) => void): void;
36
+ setObserver(observer: OperationObserver<T, unknown>, context?: unknown): void;
37
+ deferCompletion(): void;
38
+ reply(value: T, retentionMs?: number): boolean;
39
+ replyFailure(reason: unknown): boolean;
40
+ setSignal(signal: AbortSignal | undefined): void;
41
+ mapCaller(onValue: (value: unknown) => unknown, onFailure: (error: unknown) => unknown): boolean;
42
+ }
43
+
44
+ export interface PendingOperation<T> extends OperationHandle<T> {
24
45
  readonly promise: Promise<T>;
25
46
  }
26
47
 
@@ -34,13 +55,160 @@ export interface OperationObserver<T, Context> {
34
55
  operationFailed(id: bigint, reason: unknown, context: Context | undefined): void;
35
56
  }
36
57
 
37
- interface Entry<T, Context> {
38
- readonly context: Context | undefined;
39
- deadlineMs?: number;
58
+ class RegistryOperation<T, Context> implements OperationHandle<T>, OperationObserver<T, Context> {
59
+ promise?: Promise<T>;
40
60
  resolve?: (value: T | PromiseLike<T>) => void;
41
61
  reject?: (reason: unknown) => void;
42
62
  observer?: OperationObserver<T, Context>;
63
+ failureDispatcher?: (reason: unknown) => void;
64
+ private terminalRetentionMs = 0;
65
+ private signal?: AbortSignal;
66
+ private callerValue?: (value: unknown) => unknown;
67
+ private callerFailure?: (error: unknown) => unknown;
68
+ constructor(
69
+ private readonly registry: OperationRegistry<T, Context>,
70
+ readonly id: bigint,
71
+ public deadlineMs: number | undefined,
72
+ public context: Context | undefined
73
+ ) {}
74
+ complete(value: T, retentionMs = this.terminalRetentionMs): boolean {
75
+ if (this.promise !== undefined) this.observer = undefined;
76
+ return this.registry.complete(this.id, value, retentionMs);
77
+ }
78
+ reply(value: T, retentionMs = 0): boolean {
79
+ if (!this.isPending()) return false;
80
+ if (this.promise === undefined || this.observer === undefined)
81
+ return this.registry.complete(this.id, value, retentionMs);
82
+ const observer = this.observer;
83
+ this.observer = this;
84
+ if (observer !== this) this.terminalRetentionMs = retentionMs;
85
+ observer.operationCompleted(this.id, value, this.context);
86
+ return true;
87
+ }
88
+
89
+ replyFailure(reason: unknown): boolean {
90
+ if (!this.isPending()) return false;
91
+ if (this.promise === undefined || this.observer === undefined) return this.fail(reason);
92
+ const observer = this.observer;
93
+ this.observer = this;
94
+ observer.operationFailed(this.id, reason, this.context);
95
+ return true;
96
+ }
97
+ setSignal(signal: AbortSignal | undefined): void {
98
+ this.signal = signal;
99
+ if (signal?.aborted === true) this.handleEvent();
100
+ else signal?.addEventListener('abort', this, { once: true });
101
+ }
102
+ handleEvent(): void {
103
+ this.fail(this.signal?.reason ?? createAbortError());
104
+ }
105
+ private detachSignal(): void {
106
+ this.signal?.removeEventListener('abort', this);
107
+ this.signal = undefined;
108
+ }
109
+ mapCaller(onValue: (value: unknown) => unknown, onFailure: (error: unknown) => unknown): boolean {
110
+ if (this.resolve === undefined || this.reject === undefined) return false;
111
+ const value = this.callerValue;
112
+ const failure = this.callerFailure;
113
+ this.callerValue =
114
+ value === undefined
115
+ ? onValue
116
+ : (reply) => {
117
+ let mapped;
118
+ try {
119
+ mapped = value(reply);
120
+ } catch (error) {
121
+ throw onFailure(error);
122
+ }
123
+ return onValue(mapped);
124
+ };
125
+ this.callerFailure =
126
+ failure === undefined
127
+ ? onFailure
128
+ : (error) => {
129
+ let mapped = error;
130
+ try {
131
+ mapped = failure(error);
132
+ } catch (reason) {
133
+ mapped = reason;
134
+ }
135
+ return onFailure(mapped);
136
+ };
137
+ return true;
138
+ }
139
+
140
+ fail(reason: unknown): boolean {
141
+ return this.registry.fail(this.id, reason);
142
+ }
143
+ takeFailure(reason: unknown): boolean {
144
+ return this.registry.takeFailure(this.id, reason);
145
+ }
146
+ isPending(): boolean {
147
+ return this.registry.isPending(this.id);
148
+ }
149
+ setFailureDispatcher(dispatcher: (reason: unknown) => void): void {
150
+ if (!this.registry.setFailureDispatcher(this.id, dispatcher) && this.promise !== undefined)
151
+ void this.promise.then(undefined, dispatcher);
152
+ }
153
+ clearFailureDispatcher(dispatcher: (reason: unknown) => void): void {
154
+ this.registry.clearFailureDispatcher(this.id, dispatcher);
155
+ }
156
+ hasObserver(): boolean {
157
+ return this.observer !== undefined;
158
+ }
159
+ setObserver(observer: OperationObserver<T, Context>, context?: Context): void {
160
+ if (context !== undefined) this.context = context;
161
+ this.observer = observer;
162
+ }
163
+ deferCompletion(): void {
164
+ this.observer = this;
165
+ }
166
+ operationCompleted(): void {}
167
+ operationFailed(): void {}
168
+ resolveCaller(value: T): boolean {
169
+ this.detachSignal();
170
+ const resolve = this.resolve,
171
+ reject = this.reject,
172
+ map = this.callerValue;
173
+ this.resolve = undefined;
174
+ this.reject = undefined;
175
+ this.callerValue = undefined;
176
+ this.callerFailure = undefined;
177
+ if (resolve === undefined) return false;
178
+ try {
179
+ resolve(map === undefined ? value : (map(value) as T));
180
+ } catch (error) {
181
+ reject?.(error);
182
+ }
183
+ return true;
184
+ }
185
+ rejectCaller(reason: unknown): boolean {
186
+ this.detachSignal();
187
+ const reject = this.reject,
188
+ map = this.callerFailure;
189
+ this.resolve = undefined;
190
+ this.reject = undefined;
191
+ this.callerValue = undefined;
192
+ this.callerFailure = undefined;
193
+ if (reject === undefined) return false;
194
+ let failure = reason;
195
+ try {
196
+ if (map !== undefined) failure = map(reason);
197
+ } catch (error) {
198
+ failure = error;
199
+ }
200
+ reject(failure);
201
+ return true;
202
+ }
203
+ }
204
+ type Entry<T, Context> = RegistryOperation<T, Context>;
205
+ interface RetainedContext<Context> {
206
+ context: Context;
207
+ deadlineMs: number;
43
208
  }
209
+ type IndexedOperation<T, Context> = Entry<T, Context> | RetainedContext<Context>;
210
+
211
+ const DEADLINE_ROTATION_MS = 256;
44
212
 
45
213
  const systemClock: OperationClock = {
46
214
  now: () => performance.now()
@@ -48,9 +216,10 @@ const systemClock: OperationClock = {
48
216
 
49
217
  /** Owns request completion so reply, timeout, cancellation, and shutdown race safely. */
50
218
  export class OperationRegistry<T, Context = unknown> {
51
- private readonly entries = new Map<bigint, Entry<T, Context>>();
219
+ private readonly entries = new Map<bigint, IndexedOperation<T, Context>>();
52
220
  private nextId = 1n;
53
- private deadlineCursor?: MapIterator<[bigint, Entry<T, Context>]>;
221
+ private lastVisitMs: number;
222
+ private deadlineCursor?: MapIterator<[bigint, IndexedOperation<T, Context>]>;
54
223
  /**
55
224
  * A lower bound of the earliest pending deadline. Completed entries only
56
225
  * leave it early; a full expiry pass replaces it with the exact value.
@@ -62,30 +231,42 @@ export class OperationRegistry<T, Context = unknown> {
62
231
 
63
232
  constructor(
64
233
  private readonly clock: OperationClock = systemClock,
65
- private readonly onPendingChanged?: () => void
66
- ) {}
234
+ private readonly onPendingChanged?: () => void,
235
+ private readonly terminalError: (reason: unknown) => unknown = (reason) => reason
236
+ ) {
237
+ this.lastVisitMs = this.clock.now();
238
+ }
67
239
 
68
240
  register(
69
241
  timeoutMs: number,
70
242
  timeoutOwner: 'registry' | 'sender' = 'registry',
71
- context?: Context
243
+ context?: Context,
244
+ absoluteDeadlineMs?: number
72
245
  ): PendingOperation<T> {
73
246
  if (this.closed) throw new Error('Operation registry is closed.');
74
247
  if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {
75
248
  throw new RangeError('timeoutMs must be a non-negative finite number.');
76
249
  }
77
250
  const id = this.nextId++;
78
- let resolve!: Entry<T, Context>['resolve'];
79
- let reject!: Entry<T, Context>['reject'];
80
- const promise = new Promise<T>((onResolve, onReject) => {
81
- resolve = onResolve;
82
- reject = onReject;
251
+ const deadlineMs =
252
+ timeoutOwner === 'registry'
253
+ ? (absoluteDeadlineMs ?? this.clock.now() + timeoutMs)
254
+ : undefined;
255
+ const entry = new RegistryOperation(this, id, deadlineMs, context);
256
+ entry.promise = new Promise<T>((resolve, reject) => {
257
+ entry.resolve = resolve;
258
+ entry.reject = reject;
83
259
  });
84
- const deadlineMs = timeoutOwner === 'registry' ? this.clock.now() + timeoutMs : undefined;
85
- const entry: Entry<T, Context> = { context, deadlineMs, resolve, reject };
86
260
  this.entries.set(id, entry);
87
261
  this.notePending(deadlineMs);
88
- return { id, promise };
262
+ return entry as PendingOperation<T>;
263
+ }
264
+
265
+ handle(id: bigint): OperationHandle<T> {
266
+ const entry = this.entries.get(id);
267
+ if (!(entry instanceof RegistryOperation))
268
+ throw new Error(`Operation ${id} has no active registry entry.`);
269
+ return entry;
89
270
  }
90
271
 
91
272
  /** Registers an operation whose terminal goes to `observer` instead of a Promise. */
@@ -100,14 +281,45 @@ export class OperationRegistry<T, Context = unknown> {
100
281
  }
101
282
  const id = this.nextId++;
102
283
  const deadlineMs = this.clock.now() + timeoutMs;
103
- this.entries.set(id, { context, deadlineMs, observer });
284
+ const entry = new RegistryOperation(this, id, deadlineMs, context);
285
+ entry.observer = observer;
286
+ this.entries.set(id, entry);
104
287
  this.notePending(deadlineMs);
105
288
  return id;
106
289
  }
107
290
 
291
+ deadline(id: bigint): number | undefined {
292
+ return this.entries.get(id)?.deadlineMs;
293
+ }
294
+
295
+ setFailureDispatcher(id: bigint, dispatcher: (reason: unknown) => void): boolean {
296
+ const entry = this.pendingEntry(id);
297
+ if (entry === undefined) return false;
298
+ entry.failureDispatcher = dispatcher;
299
+ return true;
300
+ }
301
+
302
+ clearFailureDispatcher(id: bigint, dispatcher: (reason: unknown) => void): void {
303
+ const entry = this.pendingEntry(id);
304
+ if (entry?.failureDispatcher === dispatcher) entry.failureDispatcher = undefined;
305
+ }
306
+
307
+ takeFailure(id: bigint, reason: unknown): boolean {
308
+ const entry = this.take(id);
309
+ if (entry === undefined) return false;
310
+ entry.failureDispatcher = undefined;
311
+ entry.observer = undefined;
312
+ entry.context = undefined;
313
+ entry.rejectCaller(this.terminalError(reason));
314
+ return true;
315
+ }
316
+
108
317
  /** The time the next expiry pass has work, as a lower bound (spec 08 §4.2). */
109
318
  nextDeadlineMs(): number {
110
- return this.earliestDeadlineMs;
319
+ if (this.entries.size === 0) return Number.POSITIVE_INFINITY;
320
+ if (this.deadlineCursor !== undefined)
321
+ return Math.min(this.lastVisitMs, this.earliestDeadlineMs);
322
+ return Math.min(this.earliestDeadlineMs, this.lastVisitMs + DEADLINE_ROTATION_MS);
111
323
  }
112
324
 
113
325
  private notePending(deadlineMs: number | undefined): void {
@@ -120,17 +332,32 @@ export class OperationRegistry<T, Context = unknown> {
120
332
  complete(id: bigint, value: T, terminalContextRetentionMs = 0): boolean {
121
333
  const entry = this.take(id);
122
334
  if (entry === undefined) return false;
123
- if (entry.observer !== undefined) entry.observer.operationCompleted(id, value, entry.context);
124
- else entry.resolve!(value);
335
+ entry.failureDispatcher = undefined;
336
+ const observer = entry.observer;
337
+ entry.observer = undefined;
338
+ if (observer !== undefined) observer.operationCompleted(id, value, entry.context);
339
+ else entry.resolveCaller(value);
125
340
  this.retainTerminal(id, entry, terminalContextRetentionMs);
341
+ entry.context = undefined;
126
342
  return true;
127
343
  }
128
344
 
345
+ reply(id: bigint, value: T, terminalContextRetentionMs = 0): boolean {
346
+ return this.pendingEntry(id)?.reply(value, terminalContextRetentionMs) ?? false;
347
+ }
348
+
129
349
  fail(id: bigint, reason: unknown): boolean {
130
350
  const entry = this.take(id);
131
351
  if (entry === undefined) return false;
132
- if (entry.observer !== undefined) entry.observer.operationFailed(id, reason, entry.context);
133
- else entry.reject!(reason);
352
+ reason = this.terminalError(reason);
353
+ const dispatch = entry.failureDispatcher;
354
+ entry.failureDispatcher = undefined;
355
+ dispatch?.(reason);
356
+ const observer = entry.observer;
357
+ entry.observer = undefined;
358
+ observer?.operationFailed(id, reason, entry.context);
359
+ entry.context = undefined;
360
+ entry.rejectCaller(reason);
134
361
  return true;
135
362
  }
136
363
 
@@ -142,16 +369,27 @@ export class OperationRegistry<T, Context = unknown> {
142
369
  return this.pendingEntry(id) !== undefined;
143
370
  }
144
371
 
372
+ setContext(id: bigint, context: Context): void {
373
+ const entry = this.pendingEntry(id);
374
+ if (entry !== undefined) entry.context = context;
375
+ }
376
+
145
377
  context(id: bigint): Context | undefined {
146
378
  return this.entries.get(id)?.context;
147
379
  }
148
380
 
381
+ clear(reason: unknown): void {
382
+ this.failAll(reason);
383
+ this.entries.clear();
384
+ this.resetEmptyIndex();
385
+ }
386
+
149
387
  close(reason = 'Operation registry closed.'): void {
150
388
  if (this.closed) return;
151
389
  this.closed = true;
152
390
  for (const id of this.entries.keys()) this.cancel(id, reason);
153
391
  this.entries.clear();
154
- this.deadlineCursor = undefined;
392
+ this.resetEmptyIndex();
155
393
  }
156
394
 
157
395
  failAll(reason: unknown): void {
@@ -163,13 +401,16 @@ export class OperationRegistry<T, Context = unknown> {
163
401
  }
164
402
 
165
403
  expire(nowMs: number, turnDeadlineMs: number): number {
404
+ if (this.entries.size === 0) return 0;
166
405
  let expired = 0;
406
+ if (this.deadlineCursor === undefined) {
407
+ this.lastVisitMs = nowMs;
408
+ this.deadlineCursor = this.entries.entries();
409
+ this.scanEarliestDeadlineMs = Number.POSITIVE_INFINITY;
410
+ }
411
+ const cursor = this.deadlineCursor;
167
412
  while (this.clock.now() < turnDeadlineMs) {
168
- if (this.deadlineCursor === undefined) {
169
- this.deadlineCursor = this.entries.entries();
170
- this.scanEarliestDeadlineMs = Number.POSITIVE_INFINITY;
171
- }
172
- const current = this.deadlineCursor.next();
413
+ const current = cursor.next();
173
414
  if (current.done === true) {
174
415
  this.deadlineCursor = undefined;
175
416
  // Entries registered during the pass are appended and were scanned.
@@ -179,8 +420,10 @@ export class OperationRegistry<T, Context = unknown> {
179
420
  const [id, entry] = current.value;
180
421
  if (entry.deadlineMs === undefined) continue;
181
422
  if (entry.deadlineMs <= nowMs) {
182
- if (!this.isPending(id)) this.entries.delete(id);
183
- else if (this.fail(id, new OperationTimeoutError(id))) expired++;
423
+ if (!this.isPending(id)) {
424
+ this.entries.delete(id);
425
+ if (this.entries.size === 0) this.resetEmptyIndex();
426
+ } else if (this.fail(id, new OperationTimeoutError(id))) expired++;
184
427
  } else if (entry.deadlineMs < this.scanEarliestDeadlineMs) {
185
428
  this.scanEarliestDeadlineMs = entry.deadlineMs;
186
429
  }
@@ -192,25 +435,31 @@ export class OperationRegistry<T, Context = unknown> {
192
435
  const entry = this.pendingEntry(id);
193
436
  if (entry === undefined) return undefined;
194
437
  this.entries.delete(id);
438
+ if (this.entries.size === 0) this.resetEmptyIndex();
195
439
  this.pendingCount--;
196
440
  if (this.pendingCount === 0) this.onPendingChanged?.();
197
441
  return entry;
198
442
  }
199
443
 
444
+ private resetEmptyIndex(): void {
445
+ this.deadlineCursor = undefined;
446
+ this.earliestDeadlineMs = Number.POSITIVE_INFINITY;
447
+ this.scanEarliestDeadlineMs = Number.POSITIVE_INFINITY;
448
+ }
449
+
200
450
  private pendingEntry(id: bigint): Entry<T, Context> | undefined {
201
451
  const entry = this.entries.get(id);
202
- return entry !== undefined && (entry.resolve !== undefined || entry.observer !== undefined)
452
+ return entry instanceof RegistryOperation &&
453
+ (entry.resolve !== undefined || entry.observer !== undefined)
203
454
  ? entry
204
455
  : undefined;
205
456
  }
206
457
 
207
458
  private retainTerminal(id: bigint, entry: Entry<T, Context>, retentionMs: number): void {
208
459
  if (this.closed || entry.context === undefined || retentionMs === 0) return;
209
- entry.resolve = undefined;
210
- entry.reject = undefined;
211
- entry.observer = undefined;
212
- entry.deadlineMs = this.clock.now() + retentionMs;
213
- this.entries.set(id, entry);
214
- this.earliestDeadlineMs = Math.min(this.earliestDeadlineMs, entry.deadlineMs);
460
+ const retained = { context: entry.context, deadlineMs: this.clock.now() + retentionMs };
461
+ this.entries.set(id, retained);
462
+ this.earliestDeadlineMs = Math.min(this.earliestDeadlineMs, retained.deadlineMs);
463
+ this.onPendingChanged?.();
215
464
  }
216
465
  }