@zlink-systems/framework 0.25.0 → 0.27.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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.js +16 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +28 -0
- package/dist/runtime/activation-admission.js +57 -0
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +19 -17
- package/dist/runtime/actors/actor-handoff.d.ts +13 -7
- package/dist/runtime/actors/actor-handoff.js +36 -25
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +85 -123
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
- package/dist/runtime/actors/actor-remote-joiner.js +11 -17
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
- package/dist/runtime/actors/deferred-join-completion.js +21 -0
- package/dist/runtime/actors/index.d.ts +10 -8
- package/dist/runtime/actors/index.js +101 -73
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +7 -1
- package/dist/runtime/admission.js +11 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +8 -33
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
- package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
- package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -9
- package/dist/runtime/channels/channel-clients.js +68 -60
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -18
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
- package/dist/runtime/channels/channel-runtime-manager.js +4 -12
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
- package/dist/runtime/channels/channel-socket-registry.js +296 -235
- package/dist/runtime/channels/channel-transports.d.ts +11 -20
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +133 -81
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +22 -9
- package/dist/runtime/execution/index.js +107 -37
- package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
- package/dist/runtime/execution/serial-execution-queue.js +99 -26
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/listener-records.d.ts +11 -0
- package/dist/runtime/foundation/listener-records.js +20 -0
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
- package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
- package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
- package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
- package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
- package/dist/runtime/foundation/service-topology-registry.js +22 -61
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
- package/dist/runtime/host/actor-transfer-runtime.js +210 -256
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +19 -14
- package/dist/runtime/host/index.js +234 -175
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +11 -23
- package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
- package/dist/runtime/host/route-mesh-runtime.js +178 -257
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
- package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
- package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
- package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
- package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +5 -10
- package/dist/runtime/locations/lifecycle.js +4 -33
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +44 -30
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
- package/dist/runtime/locations/spot-location-claims.js +40 -23
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
- package/dist/runtime/spots/index.d.ts +29 -29
- package/dist/runtime/spots/index.js +441 -313
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
- package/dist/runtime/spots/spot-activation-registry.js +27 -60
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
- package/dist/runtime/spots/spot-activation-state.js +4 -17
- package/dist/runtime/spots/spot-activation.d.ts +10 -9
- package/dist/runtime/spots/spot-activation.js +103 -81
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
- package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
- package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
- package/dist/runtime/spots/spot-actor-membership.js +44 -53
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-entry-activation.js +9 -21
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +6 -5
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
- package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +10 -37
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
- package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
- package/dist/runtime/spots/spot-serial-executor.js +9 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
- package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
- package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +12 -19
- package/dist/runtime/streams/index.d.ts +15 -14
- package/dist/runtime/streams/index.js +38 -39
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/session-serial-executor.js +2 -2
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +15 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +72 -0
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +45 -39
- package/src/runtime/actors/actor-handoff.ts +55 -45
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +174 -215
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +15 -36
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/actor-source-transfer.ts +5 -18
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +44 -0
- package/src/runtime/actors/index.ts +122 -88
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +13 -2
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +15 -42
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
- package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
- package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
- package/src/runtime/backend/raw-binding-port.ts +14 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -31
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +8 -15
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +369 -262
- package/src/runtime/channels/channel-transports.ts +161 -115
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +175 -106
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +116 -38
- package/src/runtime/execution/serial-execution-queue.ts +179 -34
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/listener-records.ts +21 -0
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
- package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
- package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
- package/src/runtime/foundation/service-topology-registry.ts +30 -79
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +266 -418
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +408 -312
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +12 -44
- package/src/runtime/host/route-mesh-runtime.ts +236 -275
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
- package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
- package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +16 -45
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +90 -58
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +54 -26
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
- package/src/runtime/spots/index.ts +687 -437
- package/src/runtime/spots/spot-activation-registry.ts +42 -71
- package/src/runtime/spots/spot-activation-state.ts +4 -16
- package/src/runtime/spots/spot-activation.ts +167 -115
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
- package/src/runtime/spots/spot-actor-membership.ts +107 -75
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -33
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +29 -21
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
- package/src/runtime/spots/spot-outbound.ts +47 -68
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +10 -43
- package/src/runtime/spots/spot-serial-executor.ts +10 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +23 -37
- package/src/runtime/streams/index.ts +102 -88
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/session-serial-executor.ts +2 -2
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
- package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
const UNKNOWN_DIAGNOSTIC_CALLER = '<unknown caller>';
|
|
2
3
|
|
|
3
4
|
type ZLinkStateLaneWork<T> = () => Promise<T> | T;
|
|
4
5
|
|
|
6
|
+
interface ZLinkStateLaneTurn {
|
|
7
|
+
readonly lane: ZLinkStateLane;
|
|
8
|
+
active: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function isStructuralGuardEnabled(): boolean {
|
|
12
|
+
return process.env.ZLINK_NODE_STRUCTURAL_GUARD === '1' || process.env.NODE_ENV === 'test';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const currentLaneStorage = new AsyncLocalStorage<ZLinkStateLane>();
|
|
16
|
+
const diagnosticPending = isStructuralGuardEnabled() ? new Map<number, string>() : undefined;
|
|
17
|
+
let nextDiagnosticWork = 0;
|
|
18
|
+
const diagnosticTurnStorage =
|
|
19
|
+
diagnosticPending === undefined ? undefined : new AsyncLocalStorage<ZLinkStateLaneTurn>();
|
|
20
|
+
|
|
5
21
|
/**
|
|
6
22
|
* Single-owner execution lane for a component's mutable state.
|
|
7
23
|
*
|
|
@@ -10,15 +26,13 @@ type ZLinkStateLaneWork<T> = () => Promise<T> | T;
|
|
|
10
26
|
* Actor serial executors, which also own lifecycle and relocation concerns.
|
|
11
27
|
*/
|
|
12
28
|
export class ZLinkStateLane {
|
|
13
|
-
private static readonly currentLaneStorage = new AsyncLocalStorage<ZLinkStateLane>();
|
|
14
|
-
|
|
15
29
|
private readonly mailbox: Array<() => Promise<void>> = [];
|
|
16
30
|
private draining = false;
|
|
17
31
|
private drainPromise: Promise<void> | undefined;
|
|
18
32
|
private closed = false;
|
|
19
33
|
|
|
20
34
|
static get current(): ZLinkStateLane | undefined {
|
|
21
|
-
return
|
|
35
|
+
return currentLaneStorage.getStore();
|
|
22
36
|
}
|
|
23
37
|
|
|
24
38
|
get isOnLane(): boolean {
|
|
@@ -100,7 +114,7 @@ export class ZLinkStateLane {
|
|
|
100
114
|
return;
|
|
101
115
|
}
|
|
102
116
|
try {
|
|
103
|
-
await
|
|
117
|
+
await currentLaneStorage.run(this, work);
|
|
104
118
|
} catch {
|
|
105
119
|
// Posted callbacks own their errors. One failure must not strand later work.
|
|
106
120
|
}
|
|
@@ -114,3 +128,127 @@ export class ZLinkStateLane {
|
|
|
114
128
|
}
|
|
115
129
|
}
|
|
116
130
|
}
|
|
131
|
+
|
|
132
|
+
// Install the structural check only in diagnostic processes. The release run()
|
|
133
|
+
// method and its returned Promise are left untouched.
|
|
134
|
+
if (isStructuralGuardEnabled()) {
|
|
135
|
+
Object.defineProperty(ZLinkStateLane, 'current', {
|
|
136
|
+
configurable: true,
|
|
137
|
+
get: () => {
|
|
138
|
+
const turn = diagnosticTurnStorage?.getStore();
|
|
139
|
+
return turn?.active === true ? turn.lane : undefined;
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const run = ZLinkStateLane.prototype.run;
|
|
144
|
+
ZLinkStateLane.prototype.run = function <T>(
|
|
145
|
+
this: ZLinkStateLane,
|
|
146
|
+
work: ZLinkStateLaneWork<T>
|
|
147
|
+
): Promise<T> {
|
|
148
|
+
const completion = run.call(this, () => runDiagnosticTurn(this, work)) as Promise<T>;
|
|
149
|
+
return guardStateLaneCompletion(
|
|
150
|
+
trackDiagnosticCompletion(completion, `state lane ${diagnosticWorkName(work)}`),
|
|
151
|
+
'another state lane completion',
|
|
152
|
+
this
|
|
153
|
+
);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const tryPost = ZLinkStateLane.prototype.tryPost;
|
|
157
|
+
ZLinkStateLane.prototype.tryPost = function (
|
|
158
|
+
this: ZLinkStateLane,
|
|
159
|
+
work: ZLinkStateLaneWork<void>
|
|
160
|
+
): boolean {
|
|
161
|
+
const release = registerDiagnosticWork(`state lane post ${diagnosticWorkName(work)}`);
|
|
162
|
+
const accepted = tryPost.call(this, () => {
|
|
163
|
+
try {
|
|
164
|
+
const result = runDiagnosticTurn(this, work);
|
|
165
|
+
if (result instanceof Promise) return result.finally(release);
|
|
166
|
+
release();
|
|
167
|
+
return result;
|
|
168
|
+
} catch (error) {
|
|
169
|
+
release();
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
if (!accepted) release();
|
|
174
|
+
return accepted;
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function runDiagnosticTurn<T>(lane: ZLinkStateLane, work: ZLinkStateLaneWork<T>): Promise<T> | T {
|
|
179
|
+
const turn: ZLinkStateLaneTurn = { lane, active: true };
|
|
180
|
+
return diagnosticTurnStorage!.run(turn, () => {
|
|
181
|
+
try {
|
|
182
|
+
const result = work();
|
|
183
|
+
if (result instanceof Promise) {
|
|
184
|
+
return result.finally(() => {
|
|
185
|
+
turn.active = false;
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
turn.active = false;
|
|
189
|
+
return result;
|
|
190
|
+
} catch (error) {
|
|
191
|
+
turn.active = false;
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** Applied only by debug-installed wrappers; release completions keep their original identity. */
|
|
198
|
+
export function guardStateLaneCompletion<T>(
|
|
199
|
+
completion: Promise<T>,
|
|
200
|
+
label: string,
|
|
201
|
+
owner?: ZLinkStateLane
|
|
202
|
+
): Promise<T> {
|
|
203
|
+
return new Proxy(completion, {
|
|
204
|
+
get(target, property) {
|
|
205
|
+
if (property === 'then') {
|
|
206
|
+
return (onFulfilled: (value: T) => unknown, onRejected: (error: unknown) => unknown) => {
|
|
207
|
+
const current = ZLinkStateLane.current;
|
|
208
|
+
if (current !== undefined && current !== owner) {
|
|
209
|
+
throw new Error(`A state lane turn cannot wait for ${label}.`);
|
|
210
|
+
}
|
|
211
|
+
return target.then(onFulfilled, onRejected);
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
if (property === 'catch') {
|
|
215
|
+
return (onRejected: (error: unknown) => unknown) =>
|
|
216
|
+
guardStateLaneCompletion(target.catch(onRejected), label, owner);
|
|
217
|
+
}
|
|
218
|
+
if (property === 'finally') {
|
|
219
|
+
return (onFinally: () => void) =>
|
|
220
|
+
guardStateLaneCompletion(target.finally(onFinally), label, owner);
|
|
221
|
+
}
|
|
222
|
+
const value = Reflect.get(target, property, target) as unknown;
|
|
223
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export function trackDiagnosticCompletion<T>(completion: Promise<T>, name: string): Promise<T> {
|
|
229
|
+
const release = registerDiagnosticWork(name);
|
|
230
|
+
void completion.then(release, release);
|
|
231
|
+
return completion;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function debugPendingWorkNames(): string[] {
|
|
235
|
+
return [...(diagnosticPending?.values() ?? [])];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export function diagnosticWorkName(work: { readonly name: string }): string {
|
|
239
|
+
return work.name.length > 0 ? work.name : '<anonymous>';
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function registerDiagnosticWork(name: string): () => void {
|
|
243
|
+
if (diagnosticPending === undefined) return () => undefined;
|
|
244
|
+
const id = ++nextDiagnosticWork;
|
|
245
|
+
const frames = new Error().stack?.split('\n').slice(2) ?? [];
|
|
246
|
+
const caller =
|
|
247
|
+
frames
|
|
248
|
+
.find((frame) => !frame.includes('state-lane.') && !frame.includes('serial-execution-queue.'))
|
|
249
|
+
?.trim() ?? UNKNOWN_DIAGNOSTIC_CALLER;
|
|
250
|
+
diagnosticPending.set(id, `${name} ${caller}`);
|
|
251
|
+
return () => {
|
|
252
|
+
diagnosticPending.delete(id);
|
|
253
|
+
};
|
|
254
|
+
}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { UINT64_MAX } from '@zlink-systems/stream-wire';
|
|
1
2
|
import { createHash } from 'node:crypto';
|
|
2
3
|
import type { RoutingId, ZLinkActorJoinOperationId } from '../../contracts';
|
|
3
|
-
import { decodeRoutingId, encodeRoutingIdStorageHex } from '../routing-id';
|
|
4
4
|
import {
|
|
5
5
|
decodeZljrRecordV1 as decodeGeneratedZljrRecordV1,
|
|
6
6
|
encodeZljrRecordV1 as encodeGeneratedZljrRecordV1
|
|
7
7
|
} from '../protocol/service_wire_pilot_codec.generated';
|
|
8
|
+
import { decodeRoutingId, encodeRoutingIdStorageHex } from '../routing-id';
|
|
8
9
|
import { decodeServiceWireFrozenRecord } from './service-stateful-wire-codec';
|
|
10
|
+
const ACTOR_ID_DIGEST_MAX_BYTES = 0xffff;
|
|
11
|
+
|
|
12
|
+
export const SHA256_DIGEST_BYTES = 32;
|
|
9
13
|
|
|
10
14
|
const RECOVERY_PACKET_NAME = '__zlink.actor.routed_join.recovery';
|
|
11
15
|
const RECOVERY_CONTENT_TYPE = 'application/x-zlink-actor-routed-join-recovery-v1';
|
|
@@ -13,8 +17,8 @@ const MAXIMUM_METADATA_BYTES = 256 * 1024;
|
|
|
13
17
|
const FRAMEWORK_METADATA_UPPER_BOUND_BYTES = 64 * 1024;
|
|
14
18
|
const ACCEPTED_JOURNAL_UPPER_BOUND_BYTES = 16 * 1024 * 1024;
|
|
15
19
|
const SNAPSHOT_APPLICATION_STATE_RESERVATION_BYTES = 64 * 1024 * 1024;
|
|
16
|
-
const RECREATE_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.recreate';
|
|
17
|
-
const SNAPSHOT_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.snapshot';
|
|
20
|
+
export const RECREATE_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.recreate';
|
|
21
|
+
export const SNAPSHOT_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.snapshot';
|
|
18
22
|
|
|
19
23
|
export interface CanonicalActorJoinRecoveryRequest {
|
|
20
24
|
readonly actorId: string;
|
|
@@ -87,7 +91,8 @@ export function canonicalActorJoinHandoffId(input: {
|
|
|
87
91
|
readonly correlation: bigint;
|
|
88
92
|
}): string {
|
|
89
93
|
const actor = textBytes(input.actorId, 'actorId');
|
|
90
|
-
if (actor.byteLength >
|
|
94
|
+
if (actor.byteLength > ACTOR_ID_DIGEST_MAX_BYTES)
|
|
95
|
+
throw new RangeError('Actor id exceeds u16 bytes.');
|
|
91
96
|
const digest = createHash('sha256')
|
|
92
97
|
.update(
|
|
93
98
|
Buffer.concat([
|
|
@@ -139,7 +144,7 @@ export function encodeCanonicalActorJoinRecoverySavedWork(
|
|
|
139
144
|
RelocationChecksumCrc32c: 0,
|
|
140
145
|
RelocationAggregateId: canonicalUuid(input.relocationId),
|
|
141
146
|
RelocationAggregateGeneration: 1n,
|
|
142
|
-
RelocationInventoryDigest: Buffer.alloc(
|
|
147
|
+
RelocationInventoryDigest: Buffer.alloc(SHA256_DIGEST_BYTES).toString('base64'),
|
|
143
148
|
RequestContentType: requireText(input.requestContentType, 'Actor Join request content type'),
|
|
144
149
|
Request: '',
|
|
145
150
|
HandoffFrames: [],
|
|
@@ -423,7 +428,7 @@ function requireText(value: string | undefined, name: string): string {
|
|
|
423
428
|
}
|
|
424
429
|
|
|
425
430
|
function nonZeroU64(value: bigint, name: string): bigint {
|
|
426
|
-
if (value < 1n || value >
|
|
431
|
+
if (value < 1n || value > UINT64_MAX) throw new RangeError(`${name} is invalid.`);
|
|
427
432
|
return value;
|
|
428
433
|
}
|
|
429
434
|
|
|
@@ -435,7 +440,7 @@ function u16(value: number): Buffer {
|
|
|
435
440
|
}
|
|
436
441
|
|
|
437
442
|
function u64(value: bigint): Buffer {
|
|
438
|
-
if (value < 0n || value >
|
|
443
|
+
if (value < 0n || value > UINT64_MAX) throw new RangeError('u64');
|
|
439
444
|
const result = Buffer.alloc(8);
|
|
440
445
|
result.writeBigUInt64BE(value);
|
|
441
446
|
return result;
|
|
@@ -461,7 +466,7 @@ function integer(value: unknown, name: string): bigint {
|
|
|
461
466
|
if (typeof value !== 'string' || !/^\d+$/u.test(value))
|
|
462
467
|
throw new TypeError(`${name} is invalid.`);
|
|
463
468
|
const parsed = BigInt(value);
|
|
464
|
-
if (parsed >
|
|
469
|
+
if (parsed > UINT64_MAX) throw new TypeError(`${name} exceeds u64.`);
|
|
465
470
|
return parsed;
|
|
466
471
|
}
|
|
467
472
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { runZLinkExecutionArea } from '../execution';
|
|
2
|
-
|
|
3
1
|
export interface CloseableResource {
|
|
4
2
|
close(): void | Promise<void>;
|
|
5
3
|
}
|
|
@@ -23,7 +21,7 @@ export class EventLoopResourceStack {
|
|
|
23
21
|
}
|
|
24
22
|
}
|
|
25
23
|
|
|
26
|
-
async function closeResources(resources: readonly CloseableResource[]): Promise<void> {
|
|
24
|
+
export async function closeResources(resources: readonly CloseableResource[]): Promise<void> {
|
|
27
25
|
const failures: unknown[] = [];
|
|
28
26
|
for (const resource of resources) {
|
|
29
27
|
try {
|
|
@@ -32,126 +30,11 @@ async function closeResources(resources: readonly CloseableResource[]): Promise<
|
|
|
32
30
|
failures.push(error);
|
|
33
31
|
}
|
|
34
32
|
}
|
|
35
|
-
|
|
36
|
-
throw new AggregateError(failures, 'Event-loop resource cleanup failed.');
|
|
37
|
-
}
|
|
33
|
+
finishResourceCleanup(failures);
|
|
38
34
|
}
|
|
39
35
|
|
|
40
|
-
export
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
export class EventLoopWorkQueues {
|
|
44
|
-
private readonly infrastructure: Array<EventLoopTask | undefined> = [];
|
|
45
|
-
private infrastructureHead = 0;
|
|
46
|
-
private infrastructureCount = 0;
|
|
47
|
-
private readonly application: Array<EventLoopTask | undefined> = [];
|
|
48
|
-
private applicationHead = 0;
|
|
49
|
-
private applicationCount = 0;
|
|
50
|
-
private infrastructureScheduled = false;
|
|
51
|
-
private applicationScheduled = false;
|
|
52
|
-
private accepting = true;
|
|
53
|
-
|
|
54
|
-
submitInfrastructure(task: EventLoopTask): boolean {
|
|
55
|
-
if (!this.accepting) return false;
|
|
56
|
-
this.infrastructure.push(task);
|
|
57
|
-
this.infrastructureCount += 1;
|
|
58
|
-
this.scheduleInfrastructure();
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
submitApplication(task: EventLoopTask): boolean {
|
|
63
|
-
if (!this.accepting) return false;
|
|
64
|
-
this.application.push(task);
|
|
65
|
-
this.applicationCount += 1;
|
|
66
|
-
this.scheduleApplication();
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
stopAdmission(): void {
|
|
71
|
-
this.accepting = false;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
private scheduleInfrastructure(): void {
|
|
75
|
-
if (this.infrastructureScheduled) return;
|
|
76
|
-
this.infrastructureScheduled = true;
|
|
77
|
-
queueMicrotask(() => this.drainInfrastructure());
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
private drainInfrastructure(): void {
|
|
81
|
-
this.infrastructureScheduled = false;
|
|
82
|
-
const task = this.takeInfrastructure();
|
|
83
|
-
if (task === undefined) return;
|
|
84
|
-
try {
|
|
85
|
-
const result = runZLinkExecutionArea('infrastructure', task);
|
|
86
|
-
if (result instanceof Promise) void result.catch(() => undefined);
|
|
87
|
-
} finally {
|
|
88
|
-
if (this.infrastructureCount > 0) this.scheduleInfrastructure();
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
private scheduleApplication(): void {
|
|
93
|
-
if (this.applicationScheduled) return;
|
|
94
|
-
this.applicationScheduled = true;
|
|
95
|
-
queueMicrotask(() => void this.drainApplication());
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
private async drainApplication(): Promise<void> {
|
|
99
|
-
try {
|
|
100
|
-
const task = this.takeApplication();
|
|
101
|
-
if (task !== undefined) {
|
|
102
|
-
await runZLinkExecutionArea('application', task);
|
|
103
|
-
}
|
|
104
|
-
} catch {
|
|
105
|
-
// Handler failure is reported by the dispatch owner; it does not stop this queue.
|
|
106
|
-
} finally {
|
|
107
|
-
this.applicationScheduled = false;
|
|
108
|
-
if (this.applicationCount > 0) this.scheduleApplication();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
private takeInfrastructure(): EventLoopTask | undefined {
|
|
113
|
-
const task = this.infrastructure[this.infrastructureHead];
|
|
114
|
-
if (task === undefined) return undefined;
|
|
115
|
-
this.infrastructure[this.infrastructureHead] = undefined;
|
|
116
|
-
this.infrastructureHead += 1;
|
|
117
|
-
this.infrastructureCount -= 1;
|
|
118
|
-
this.compactInfrastructure();
|
|
119
|
-
return task;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
private takeApplication(): EventLoopTask | undefined {
|
|
123
|
-
const task = this.application[this.applicationHead];
|
|
124
|
-
if (task === undefined) return undefined;
|
|
125
|
-
this.application[this.applicationHead] = undefined;
|
|
126
|
-
this.applicationHead += 1;
|
|
127
|
-
this.applicationCount -= 1;
|
|
128
|
-
this.compactApplication();
|
|
129
|
-
return task;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
private compactInfrastructure(): void {
|
|
133
|
-
if (this.infrastructureCount === 0) {
|
|
134
|
-
this.infrastructure.length = 0;
|
|
135
|
-
this.infrastructureHead = 0;
|
|
136
|
-
} else if (
|
|
137
|
-
this.infrastructureHead >= 1024 &&
|
|
138
|
-
this.infrastructureHead * 2 >= this.infrastructure.length
|
|
139
|
-
) {
|
|
140
|
-
this.infrastructure.splice(0, this.infrastructureHead);
|
|
141
|
-
this.infrastructureHead = 0;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
private compactApplication(): void {
|
|
146
|
-
if (this.applicationCount === 0) {
|
|
147
|
-
this.application.length = 0;
|
|
148
|
-
this.applicationHead = 0;
|
|
149
|
-
} else if (
|
|
150
|
-
this.applicationHead >= 1024 &&
|
|
151
|
-
this.applicationHead * 2 >= this.application.length
|
|
152
|
-
) {
|
|
153
|
-
this.application.splice(0, this.applicationHead);
|
|
154
|
-
this.applicationHead = 0;
|
|
155
|
-
}
|
|
36
|
+
export function finishResourceCleanup(failures: readonly unknown[]): void {
|
|
37
|
+
if (failures.length > 0) {
|
|
38
|
+
throw new AggregateError(failures, 'Event-loop resource cleanup failed.');
|
|
156
39
|
}
|
|
157
40
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ZLinkListenerKind } from '../../contracts/RouteMesh/RuntimeTopology';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Bound listener records of one runtime generation (spec 04 §3.1). A listener writes its
|
|
5
|
+
* record when it finishes binding. The listener status query reads only this object.
|
|
6
|
+
*/
|
|
7
|
+
export class ZLinkListenerRecords {
|
|
8
|
+
private readonly endpoints = new Map<string, string>();
|
|
9
|
+
|
|
10
|
+
record(kind: ZLinkListenerKind, name: string, endpoint: string): void {
|
|
11
|
+
this.endpoints.set(`${kind}:${name}`, endpoint);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
clear(): void {
|
|
15
|
+
this.endpoints.clear();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
endpoint(kind: ZLinkListenerKind, name: string): string | undefined {
|
|
19
|
+
return this.endpoints.get(`${kind}:${name}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import { UINT64_BYTES, UINT64_MAX } from '@zlink-systems/stream-wire';
|
|
1
2
|
import { randomBytes } from 'node:crypto';
|
|
3
|
+
export const OPERATION_IDENTITY_BYTES = 16;
|
|
4
|
+
|
|
5
|
+
export const ZLINK_NATIVE_CORRELATION_OPERATION_NAMESPACE = 2n;
|
|
2
6
|
|
|
3
7
|
export interface ZLinkOperationIdentity128 {
|
|
4
8
|
readonly high: bigint;
|
|
@@ -27,13 +31,15 @@ export function createRandomOperationIdentity(
|
|
|
27
31
|
source: (size: number) => Buffer = randomBytes
|
|
28
32
|
): ZLinkOperationIdentity128 {
|
|
29
33
|
for (;;) {
|
|
30
|
-
const bytes = source(
|
|
31
|
-
if (bytes.length !==
|
|
32
|
-
throw new RangeError(
|
|
34
|
+
const bytes = source(OPERATION_IDENTITY_BYTES);
|
|
35
|
+
if (bytes.length !== OPERATION_IDENTITY_BYTES) {
|
|
36
|
+
throw new RangeError(
|
|
37
|
+
`Operation identity entropy source must return exactly ${OPERATION_IDENTITY_BYTES} bytes.`
|
|
38
|
+
);
|
|
33
39
|
}
|
|
34
40
|
const operationId = {
|
|
35
41
|
high: bytes.readBigUInt64BE(0),
|
|
36
|
-
low: bytes.readBigUInt64BE(
|
|
42
|
+
low: bytes.readBigUInt64BE(UINT64_BYTES)
|
|
37
43
|
};
|
|
38
44
|
if (operationId.high !== 0n || operationId.low !== 0n) {
|
|
39
45
|
return operationId;
|
|
@@ -42,7 +48,7 @@ export function createRandomOperationIdentity(
|
|
|
42
48
|
}
|
|
43
49
|
|
|
44
50
|
function requireUnsigned64(value: bigint, name: string): void {
|
|
45
|
-
if (typeof value !== 'bigint' || value < 0n || value >
|
|
51
|
+
if (typeof value !== 'bigint' || value < 0n || value > UINT64_MAX) {
|
|
46
52
|
throw new RangeError(`${name} must be an unsigned 64-bit integer.`);
|
|
47
53
|
}
|
|
48
54
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export interface OperationClock {
|
|
2
|
-
|
|
3
|
-
clearTimeout(handle: unknown): void;
|
|
2
|
+
now(): number;
|
|
4
3
|
}
|
|
5
4
|
|
|
6
5
|
export class OperationTimeoutError extends Error {
|
|
@@ -26,32 +25,26 @@ export interface PendingOperation<T> {
|
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
interface Entry<T> {
|
|
29
|
-
readonly
|
|
28
|
+
readonly deadlineMs?: number;
|
|
30
29
|
readonly resolve: (value: T | PromiseLike<T>) => void;
|
|
31
30
|
readonly reject: (reason: unknown) => void;
|
|
32
|
-
timer?: unknown;
|
|
33
31
|
}
|
|
34
32
|
|
|
35
33
|
const systemClock: OperationClock = {
|
|
36
|
-
|
|
37
|
-
// A request promise is live work. Raw RouteMesh polling deliberately
|
|
38
|
-
// uses unref'ed timers, so this deadline is the handle that keeps a
|
|
39
|
-
// submit() caller alive until a reply, cancellation, or deadline settles.
|
|
40
|
-
return setTimeout(callback, delayMs);
|
|
41
|
-
},
|
|
42
|
-
clearTimeout(handle) {
|
|
43
|
-
clearTimeout(handle as NodeJS.Timeout);
|
|
44
|
-
}
|
|
34
|
+
now: () => performance.now()
|
|
45
35
|
};
|
|
46
36
|
|
|
47
37
|
/** Owns request completion so reply, timeout, cancellation, and shutdown race safely. */
|
|
48
38
|
export class OperationRegistry<T> {
|
|
49
39
|
private readonly entries = new Map<bigint, Entry<T>>();
|
|
50
40
|
private nextId = 1n;
|
|
51
|
-
private
|
|
41
|
+
private deadlineCursor?: MapIterator<[bigint, Entry<T>]>;
|
|
52
42
|
private closed = false;
|
|
53
43
|
|
|
54
|
-
constructor(
|
|
44
|
+
constructor(
|
|
45
|
+
private readonly clock: OperationClock = systemClock,
|
|
46
|
+
private readonly onPendingChanged?: () => void
|
|
47
|
+
) {}
|
|
55
48
|
|
|
56
49
|
register(
|
|
57
50
|
timeoutMs: number,
|
|
@@ -62,23 +55,19 @@ export class OperationRegistry<T> {
|
|
|
62
55
|
throw new RangeError('timeoutMs must be a non-negative finite number.');
|
|
63
56
|
}
|
|
64
57
|
const id = this.nextId++;
|
|
65
|
-
const generation = this.generation;
|
|
66
58
|
let resolve!: Entry<T>['resolve'];
|
|
67
59
|
let reject!: Entry<T>['reject'];
|
|
68
60
|
const promise = new Promise<T>((onResolve, onReject) => {
|
|
69
61
|
resolve = onResolve;
|
|
70
62
|
reject = onReject;
|
|
71
63
|
});
|
|
72
|
-
const entry: Entry<T> = {
|
|
64
|
+
const entry: Entry<T> = {
|
|
65
|
+
deadlineMs: timeoutOwner === 'registry' ? this.clock.now() + timeoutMs : undefined,
|
|
66
|
+
resolve,
|
|
67
|
+
reject
|
|
68
|
+
};
|
|
73
69
|
this.entries.set(id, entry);
|
|
74
|
-
|
|
75
|
-
// identity and cancellation here without racing that decision with a timer.
|
|
76
|
-
if (timeoutOwner === 'registry') {
|
|
77
|
-
entry.timer = this.clock.setTimeout(
|
|
78
|
-
() => this.rejectIfCurrent(id, generation, new OperationTimeoutError(id)),
|
|
79
|
-
timeoutMs
|
|
80
|
-
);
|
|
81
|
-
}
|
|
70
|
+
if (this.entries.size === 1) this.onPendingChanged?.();
|
|
82
71
|
return { id, promise };
|
|
83
72
|
}
|
|
84
73
|
|
|
@@ -90,10 +79,6 @@ export class OperationRegistry<T> {
|
|
|
90
79
|
}
|
|
91
80
|
|
|
92
81
|
fail(id: bigint, reason: unknown): boolean {
|
|
93
|
-
return this.failCore(id, reason);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
private failCore(id: bigint, reason: unknown): boolean {
|
|
97
82
|
const entry = this.take(id);
|
|
98
83
|
if (entry === undefined) return false;
|
|
99
84
|
entry.reject(reason);
|
|
@@ -101,7 +86,7 @@ export class OperationRegistry<T> {
|
|
|
101
86
|
}
|
|
102
87
|
|
|
103
88
|
cancel(id: bigint, message?: string): boolean {
|
|
104
|
-
return this.
|
|
89
|
+
return this.fail(id, new OperationCancelledError(id, message));
|
|
105
90
|
}
|
|
106
91
|
|
|
107
92
|
isPending(id: bigint): boolean {
|
|
@@ -111,38 +96,36 @@ export class OperationRegistry<T> {
|
|
|
111
96
|
close(reason = 'Operation registry closed.'): void {
|
|
112
97
|
if (this.closed) return;
|
|
113
98
|
this.closed = true;
|
|
114
|
-
this.
|
|
115
|
-
|
|
116
|
-
this.entries.clear();
|
|
117
|
-
for (const [, entry] of pending) this.clearTimer(entry);
|
|
118
|
-
for (const [id, entry] of pending) {
|
|
119
|
-
entry.reject(new OperationCancelledError(id, reason));
|
|
120
|
-
}
|
|
99
|
+
for (const id of this.entries.keys()) this.cancel(id, reason);
|
|
100
|
+
this.deadlineCursor = undefined;
|
|
121
101
|
}
|
|
122
102
|
|
|
123
103
|
get size(): number {
|
|
124
104
|
return this.entries.size;
|
|
125
105
|
}
|
|
126
106
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
107
|
+
expire(nowMs: number, turnDeadlineMs: number): number {
|
|
108
|
+
let expired = 0;
|
|
109
|
+
while (this.clock.now() < turnDeadlineMs) {
|
|
110
|
+
this.deadlineCursor ??= this.entries.entries();
|
|
111
|
+
const current = this.deadlineCursor.next();
|
|
112
|
+
if (current.done === true) {
|
|
113
|
+
this.deadlineCursor = undefined;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
const [id, entry] = current.value;
|
|
117
|
+
if (entry.deadlineMs !== undefined && entry.deadlineMs <= nowMs) {
|
|
118
|
+
if (this.fail(id, new OperationTimeoutError(id))) expired++;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return expired;
|
|
133
122
|
}
|
|
134
123
|
|
|
135
124
|
private take(id: bigint): Entry<T> | undefined {
|
|
136
125
|
const entry = this.entries.get(id);
|
|
137
126
|
if (entry === undefined) return undefined;
|
|
138
127
|
this.entries.delete(id);
|
|
139
|
-
this.
|
|
128
|
+
if (this.entries.size === 0) this.onPendingChanged?.();
|
|
140
129
|
return entry;
|
|
141
130
|
}
|
|
142
|
-
|
|
143
|
-
private clearTimer(entry: Entry<T>): void {
|
|
144
|
-
if (entry.timer === undefined) return;
|
|
145
|
-
this.clock.clearTimeout(entry.timer);
|
|
146
|
-
entry.timer = undefined;
|
|
147
|
-
}
|
|
148
131
|
}
|