@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
|
@@ -66,17 +66,15 @@ export class ZLinkSpotSerialTurn {
|
|
|
66
66
|
readonly yieldAllowed: boolean
|
|
67
67
|
) {}
|
|
68
68
|
|
|
69
|
-
bindExecutionClaim(claim: ZLinkExecutionBarrierClaim | undefined): void {
|
|
70
|
-
if (this.executionClaim !== undefined) {
|
|
71
|
-
throw new Error('ZLink Spot serial turn already owns an execution claim.');
|
|
72
|
-
}
|
|
73
|
-
this.executionClaim = claim;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
69
|
get isSuspended(): boolean {
|
|
77
70
|
return this.suspendSignaled;
|
|
78
71
|
}
|
|
79
72
|
|
|
73
|
+
/** False when a seal that does not drain yielded turns won before this resume. */
|
|
74
|
+
resumeExecutionClaim(): boolean {
|
|
75
|
+
return this.executionClaim?.resume() ?? true;
|
|
76
|
+
}
|
|
77
|
+
|
|
80
78
|
releaseBoundExecutionClaim(): void {
|
|
81
79
|
this.executionClaim?.release();
|
|
82
80
|
this.executionClaim = undefined;
|
|
@@ -96,6 +94,14 @@ export class ZLinkSpotSerialTurn {
|
|
|
96
94
|
this.owner = owner;
|
|
97
95
|
}
|
|
98
96
|
|
|
97
|
+
/** Settles when the whole turn ends by any path, including yielded continuations. */
|
|
98
|
+
get completion(): Promise<void> {
|
|
99
|
+
return (this.owner ?? Promise.resolve()).then(
|
|
100
|
+
() => undefined,
|
|
101
|
+
() => undefined
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
99
105
|
blockFrameworkOperations(): void {
|
|
100
106
|
this.frameworkOperationsBlocked = true;
|
|
101
107
|
}
|
|
@@ -150,7 +156,7 @@ export class ZLinkSpotSerialTurn {
|
|
|
150
156
|
return;
|
|
151
157
|
}
|
|
152
158
|
this.suspendSignaled = true;
|
|
153
|
-
this.
|
|
159
|
+
this.executionClaim?.suspend();
|
|
154
160
|
this.suspendedResolve?.();
|
|
155
161
|
}
|
|
156
162
|
|
|
@@ -235,10 +241,14 @@ export function isCurrentZLinkSpotSerialTurn(executor: ZLinkSpotSerialTurnExecut
|
|
|
235
241
|
|
|
236
242
|
export interface ZLinkExecutionBarrierSeal {
|
|
237
243
|
readonly generation: bigint;
|
|
244
|
+
readonly kind: 'close' | 'relocation';
|
|
238
245
|
}
|
|
239
246
|
|
|
240
247
|
export interface ZLinkExecutionBarrierClaim {
|
|
241
248
|
release(): void;
|
|
249
|
+
/** The turn yielded; it no longer runs until resume() admits it again. */
|
|
250
|
+
suspend(): void;
|
|
251
|
+
resume(): boolean;
|
|
242
252
|
}
|
|
243
253
|
|
|
244
254
|
interface ZLinkExecutionBarrierWaiter {
|
|
@@ -254,40 +264,47 @@ interface ZLinkExecutionBarrierWaiter {
|
|
|
254
264
|
export class ZLinkExecutionBarrier {
|
|
255
265
|
private generation = 0n;
|
|
256
266
|
private activeClaims = 0;
|
|
267
|
+
private suspendedClaims = 0;
|
|
268
|
+
/** Claims whose turn has started and yielded at least once, until released. */
|
|
269
|
+
private yieldedTurnClaims = 0;
|
|
257
270
|
private currentSeal: ZLinkExecutionBarrierSeal | undefined;
|
|
258
271
|
private readonly admissionWaiters: ZLinkExecutionBarrierWaiter[] = [];
|
|
259
272
|
private readonly quiescenceWaiters = new Set<() => void>();
|
|
260
|
-
private
|
|
273
|
+
private committedSeal?: ZLinkExecutionBarrierSeal;
|
|
274
|
+
|
|
275
|
+
get isSealed(): boolean {
|
|
276
|
+
return this.currentSeal !== undefined || this.committedSeal !== undefined;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
get isCloseSealed(): boolean {
|
|
280
|
+
return (this.currentSeal ?? this.committedSeal)?.kind === 'close';
|
|
281
|
+
}
|
|
261
282
|
|
|
262
|
-
|
|
263
|
-
if (this.
|
|
283
|
+
enter(): ZLinkExecutionBarrierClaim | Promise<ZLinkExecutionBarrierClaim> {
|
|
284
|
+
if (this.committedSeal !== undefined) {
|
|
264
285
|
throw createInternalFrameworkException(
|
|
265
|
-
|
|
286
|
+
this.committedSeal.kind === 'close'
|
|
287
|
+
? ZLinkFrameworkInternalErrorKind.RequestRejected
|
|
288
|
+
: ZLinkFrameworkInternalErrorKind.SpotMoving,
|
|
266
289
|
'ZLink execution barrier is committed.'
|
|
267
290
|
);
|
|
268
291
|
}
|
|
269
292
|
if (this.currentSeal !== undefined) {
|
|
270
|
-
|
|
293
|
+
if (this.currentSeal.kind === 'close') {
|
|
294
|
+
throw createInternalFrameworkException(
|
|
295
|
+
ZLinkFrameworkInternalErrorKind.RequestRejected,
|
|
296
|
+
'ZLink execution barrier is sealed for Close.'
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
return new Promise<ZLinkExecutionBarrierClaim>((resolve, reject) => {
|
|
271
300
|
this.admissionWaiters.push({ resolve, reject });
|
|
272
301
|
});
|
|
273
302
|
}
|
|
274
303
|
return this.createClaim();
|
|
275
304
|
}
|
|
276
305
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
* open. A continuation must fail instead of waiting behind a relocation
|
|
280
|
-
* seal that already won the turn-boundary race.
|
|
281
|
-
*/
|
|
282
|
-
tryEnter(): ZLinkExecutionBarrierClaim | undefined {
|
|
283
|
-
if (this.committed || this.currentSeal !== undefined) {
|
|
284
|
-
return undefined;
|
|
285
|
-
}
|
|
286
|
-
return this.createClaim();
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
seal(): ZLinkExecutionBarrierSeal {
|
|
290
|
-
if (this.committed) {
|
|
306
|
+
seal(kind: ZLinkExecutionBarrierSeal['kind'] = 'relocation'): ZLinkExecutionBarrierSeal {
|
|
307
|
+
if (this.committedSeal !== undefined) {
|
|
291
308
|
throw createInternalFrameworkException(
|
|
292
309
|
ZLinkFrameworkInternalErrorKind.SpotMoving,
|
|
293
310
|
'ZLink execution barrier is committed.'
|
|
@@ -296,17 +313,19 @@ export class ZLinkExecutionBarrier {
|
|
|
296
313
|
if (this.currentSeal !== undefined) {
|
|
297
314
|
throw new Error('ZLink execution barrier is already sealed.');
|
|
298
315
|
}
|
|
299
|
-
const seal = Object.freeze({ generation: ++this.generation });
|
|
316
|
+
const seal = Object.freeze({ generation: ++this.generation, kind });
|
|
300
317
|
this.currentSeal = seal;
|
|
301
318
|
return seal;
|
|
302
319
|
}
|
|
303
320
|
|
|
304
321
|
async waitForQuiescence(seal: ZLinkExecutionBarrierSeal, signal?: AbortSignal): Promise<void> {
|
|
305
322
|
this.requireCurrent(seal);
|
|
306
|
-
if (this.
|
|
323
|
+
if (this.isQuiescent(seal)) return;
|
|
307
324
|
if (signal?.aborted === true) throw signal.reason;
|
|
308
325
|
await new Promise<void>((resolve, reject) => {
|
|
309
326
|
const complete = () => {
|
|
327
|
+
if (!this.isQuiescent(seal)) return;
|
|
328
|
+
this.quiescenceWaiters.delete(complete);
|
|
310
329
|
signal?.removeEventListener('abort', abort);
|
|
311
330
|
resolve();
|
|
312
331
|
};
|
|
@@ -320,6 +339,29 @@ export class ZLinkExecutionBarrier {
|
|
|
320
339
|
this.requireCurrent(seal);
|
|
321
340
|
}
|
|
322
341
|
|
|
342
|
+
/**
|
|
343
|
+
* Spot messaging §7 step 1: a Close that keeps admission open still lets every
|
|
344
|
+
* already-started (yielded) turn finish in its generation before cleanup.
|
|
345
|
+
*/
|
|
346
|
+
async waitForStartedTurns(signal?: AbortSignal): Promise<void> {
|
|
347
|
+
if (this.yieldedTurnClaims === 0) return;
|
|
348
|
+
if (signal?.aborted === true) throw signal.reason;
|
|
349
|
+
await new Promise<void>((resolve, reject) => {
|
|
350
|
+
const complete = () => {
|
|
351
|
+
if (this.yieldedTurnClaims !== 0) return;
|
|
352
|
+
this.quiescenceWaiters.delete(complete);
|
|
353
|
+
signal?.removeEventListener('abort', abort);
|
|
354
|
+
resolve();
|
|
355
|
+
};
|
|
356
|
+
const abort = () => {
|
|
357
|
+
this.quiescenceWaiters.delete(complete);
|
|
358
|
+
reject(signal?.reason);
|
|
359
|
+
};
|
|
360
|
+
this.quiescenceWaiters.add(complete);
|
|
361
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
|
|
323
365
|
abort(seal: ZLinkExecutionBarrierSeal): boolean {
|
|
324
366
|
if (!this.isCurrent(seal)) return false;
|
|
325
367
|
this.currentSeal = undefined;
|
|
@@ -331,9 +373,11 @@ export class ZLinkExecutionBarrier {
|
|
|
331
373
|
commit(seal: ZLinkExecutionBarrierSeal): boolean {
|
|
332
374
|
if (!this.isCurrent(seal)) return false;
|
|
333
375
|
this.currentSeal = undefined;
|
|
334
|
-
this.
|
|
376
|
+
this.committedSeal = seal;
|
|
335
377
|
const error = createInternalFrameworkException(
|
|
336
|
-
|
|
378
|
+
seal.kind === 'close'
|
|
379
|
+
? ZLinkFrameworkInternalErrorKind.RequestRejected
|
|
380
|
+
: ZLinkFrameworkInternalErrorKind.SpotMoving,
|
|
337
381
|
'ZLink execution barrier is committed.'
|
|
338
382
|
);
|
|
339
383
|
for (const waiter of this.admissionWaiters) waiter.reject(error);
|
|
@@ -345,18 +389,52 @@ export class ZLinkExecutionBarrier {
|
|
|
345
389
|
return this.currentSeal?.generation === seal.generation;
|
|
346
390
|
}
|
|
347
391
|
|
|
392
|
+
private isQuiescent(seal: ZLinkExecutionBarrierSeal): boolean {
|
|
393
|
+
return this.activeClaims === 0 && (seal.kind !== 'close' || this.suspendedClaims === 0);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
private notifyQuiescence(): void {
|
|
397
|
+
for (const waiter of [...this.quiescenceWaiters]) waiter();
|
|
398
|
+
}
|
|
399
|
+
|
|
348
400
|
private createClaim(): ZLinkExecutionBarrierClaim {
|
|
349
401
|
this.activeClaims++;
|
|
350
|
-
let released =
|
|
402
|
+
let state: 'active' | 'suspended' | 'released' = 'active';
|
|
403
|
+
let yielded = false;
|
|
404
|
+
const release = () => {
|
|
405
|
+
if (state === 'released') return;
|
|
406
|
+
if (state === 'active') this.activeClaims--;
|
|
407
|
+
else this.suspendedClaims--;
|
|
408
|
+
if (yielded) this.yieldedTurnClaims--;
|
|
409
|
+
state = 'released';
|
|
410
|
+
this.notifyQuiescence();
|
|
411
|
+
};
|
|
351
412
|
return {
|
|
352
|
-
release
|
|
353
|
-
|
|
354
|
-
|
|
413
|
+
release,
|
|
414
|
+
suspend: () => {
|
|
415
|
+
if (state !== 'active') return;
|
|
416
|
+
state = 'suspended';
|
|
417
|
+
if (!yielded) {
|
|
418
|
+
yielded = true;
|
|
419
|
+
this.yieldedTurnClaims++;
|
|
420
|
+
}
|
|
355
421
|
this.activeClaims--;
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
422
|
+
this.suspendedClaims++;
|
|
423
|
+
this.notifyQuiescence();
|
|
424
|
+
},
|
|
425
|
+
resume: () => {
|
|
426
|
+
if (state !== 'suspended') return state === 'active';
|
|
427
|
+
if (
|
|
428
|
+
this.committedSeal !== undefined ||
|
|
429
|
+
(this.currentSeal !== undefined && this.currentSeal.kind !== 'close')
|
|
430
|
+
) {
|
|
431
|
+
release();
|
|
432
|
+
return false;
|
|
359
433
|
}
|
|
434
|
+
state = 'active';
|
|
435
|
+
this.suspendedClaims--;
|
|
436
|
+
this.activeClaims++;
|
|
437
|
+
return true;
|
|
360
438
|
}
|
|
361
439
|
};
|
|
362
440
|
}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
import { macrotaskBoundary } from '../abort';
|
|
2
|
+
import {
|
|
3
|
+
diagnosticWorkName,
|
|
4
|
+
guardStateLaneCompletion,
|
|
5
|
+
isStructuralGuardEnabled,
|
|
6
|
+
trackDiagnosticCompletion
|
|
7
|
+
} from './state-lane';
|
|
8
|
+
|
|
1
9
|
export type ZLinkSerialWorkLane = 'application' | 'lifecycle';
|
|
2
10
|
|
|
3
11
|
export interface ZLinkSerialWorkOptions {
|
|
@@ -21,7 +29,7 @@ export const ZLINK_DEFAULT_SERIAL_SCHEDULER_OPTIONS: Required<ZLinkSerialSchedul
|
|
|
21
29
|
export interface ZLinkSerialWorkRecord<T> {
|
|
22
30
|
readonly acceptedSequence: bigint;
|
|
23
31
|
readonly lane: ZLinkSerialWorkLane;
|
|
24
|
-
|
|
32
|
+
operation: () => Promise<T> | T;
|
|
25
33
|
readonly context?: unknown;
|
|
26
34
|
resolve(value: T): void;
|
|
27
35
|
reject(reason: unknown): void;
|
|
@@ -30,6 +38,11 @@ export interface ZLinkSerialWorkRecord<T> {
|
|
|
30
38
|
fail(reason: unknown): void;
|
|
31
39
|
}
|
|
32
40
|
|
|
41
|
+
/** The active lifecycle owner decides which existing application records can run. */
|
|
42
|
+
export interface ZLinkSerialLifecycleContext {
|
|
43
|
+
canExecuteApplication(record: ZLinkSerialWorkRecord<unknown>): boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
33
46
|
/** Readiness work that must complete without claiming the serial owner. */
|
|
34
47
|
export interface ZLinkSerialWorkPreparation {
|
|
35
48
|
prepare(signal: AbortSignal): Promise<void>;
|
|
@@ -38,6 +51,7 @@ export interface ZLinkSerialWorkPreparation {
|
|
|
38
51
|
|
|
39
52
|
type SerialWorkRecord<T> = Omit<ZLinkSerialWorkRecord<T>, 'acceptedSequence'> & {
|
|
40
53
|
acceptedSequence: bigint;
|
|
54
|
+
readonly operationEnvelope: boolean;
|
|
41
55
|
readonly preparation?: ZLinkSerialWorkPreparation;
|
|
42
56
|
preparationState: 'idle' | 'pending' | 'canceling' | 'ready' | 'failed';
|
|
43
57
|
preparationController?: AbortController;
|
|
@@ -55,6 +69,7 @@ interface ZLinkSerialAdmissionLane {
|
|
|
55
69
|
export class ZLinkSerialExecutionQueue {
|
|
56
70
|
private readonly application: ZLinkSerialAdmissionLane;
|
|
57
71
|
private readonly lifecycle: ZLinkSerialAdmissionLane;
|
|
72
|
+
private activeLifecycle?: ZLinkSerialWorkRecord<unknown>;
|
|
58
73
|
private readonly ownerTimeBudget: number;
|
|
59
74
|
private readonly lifecycleBurstLimit: number;
|
|
60
75
|
private nextAcceptedSequence = 1n;
|
|
@@ -138,23 +153,24 @@ export class ZLinkSerialExecutionQueue {
|
|
|
138
153
|
return this.admit(operation, options, context);
|
|
139
154
|
}
|
|
140
155
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
lifecycleBytes: 0
|
|
152
|
-
};
|
|
156
|
+
/** Holds lifecycle FIFO through an operation result while its application turns can run. */
|
|
157
|
+
submitLifecycleOperation<T>(
|
|
158
|
+
operation: () => Promise<T> | T,
|
|
159
|
+
context?: ZLinkSerialLifecycleContext
|
|
160
|
+
): Promise<T> {
|
|
161
|
+
return this.admit(operation, { lane: 'lifecycle' }, context, undefined, true);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
visitPendingApplication(visitor: (record: ZLinkSerialWorkRecord<unknown>) => void): void {
|
|
165
|
+
for (const record of this.application.records) visitor(record);
|
|
153
166
|
}
|
|
154
167
|
|
|
155
168
|
get hasPendingWork(): boolean {
|
|
156
169
|
return (
|
|
157
|
-
this.draining ||
|
|
170
|
+
this.draining ||
|
|
171
|
+
this.activeLifecycle !== undefined ||
|
|
172
|
+
this.application.records.length > 0 ||
|
|
173
|
+
this.lifecycle.records.length > 0
|
|
158
174
|
);
|
|
159
175
|
}
|
|
160
176
|
|
|
@@ -165,15 +181,25 @@ export class ZLinkSerialExecutionQueue {
|
|
|
165
181
|
|
|
166
182
|
/** Stops new submissions while allowing the accepted FIFO to finish. */
|
|
167
183
|
close(): Promise<void> {
|
|
168
|
-
this.
|
|
184
|
+
this.closeAdmission();
|
|
169
185
|
return this.whenIdle();
|
|
170
186
|
}
|
|
171
187
|
|
|
188
|
+
/** Stops admission within the lifecycle operation that owns this queue's close. */
|
|
189
|
+
closeAdmission(): void {
|
|
190
|
+
this.closed = true;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
get admissionClosed(): boolean {
|
|
194
|
+
return this.closed;
|
|
195
|
+
}
|
|
196
|
+
|
|
172
197
|
private admit<T>(
|
|
173
198
|
operation: () => Promise<T> | T,
|
|
174
199
|
options: ZLinkSerialWorkOptions,
|
|
175
200
|
context?: unknown,
|
|
176
|
-
preparation?: ZLinkSerialWorkPreparation
|
|
201
|
+
preparation?: ZLinkSerialWorkPreparation,
|
|
202
|
+
operationEnvelope = false
|
|
177
203
|
): Promise<T> {
|
|
178
204
|
if (this.closed) throw new Error('The serial execution queue is closed.');
|
|
179
205
|
const lane = options.lane ?? 'application';
|
|
@@ -189,6 +215,14 @@ export class ZLinkSerialExecutionQueue {
|
|
|
189
215
|
const release = (): void => {
|
|
190
216
|
if (released) return;
|
|
191
217
|
released = true;
|
|
218
|
+
if (this.activeLifecycle === record) {
|
|
219
|
+
this.activeLifecycle = undefined;
|
|
220
|
+
if (this.application.records.length > 0 || this.lifecycle.records.length > 0) {
|
|
221
|
+
this.scheduleDrain();
|
|
222
|
+
} else if (!this.draining) {
|
|
223
|
+
this.resolveIdleWaiters();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
192
226
|
};
|
|
193
227
|
const resolve = (value: T): void => {
|
|
194
228
|
if (settled) return;
|
|
@@ -204,6 +238,7 @@ export class ZLinkSerialExecutionQueue {
|
|
|
204
238
|
acceptedSequence: 0n,
|
|
205
239
|
lane,
|
|
206
240
|
operation,
|
|
241
|
+
operationEnvelope,
|
|
207
242
|
context,
|
|
208
243
|
preparation,
|
|
209
244
|
preparationState: preparation === undefined ? 'ready' : 'idle',
|
|
@@ -275,7 +310,25 @@ export class ZLinkSerialExecutionQueue {
|
|
|
275
310
|
}
|
|
276
311
|
this.claimStartedAt ??= performance.now();
|
|
277
312
|
try {
|
|
278
|
-
|
|
313
|
+
if (record.operationEnvelope) {
|
|
314
|
+
try {
|
|
315
|
+
const outcome = record.operation();
|
|
316
|
+
void Promise.resolve(outcome).then(
|
|
317
|
+
(value) => {
|
|
318
|
+
record.resolve(value);
|
|
319
|
+
record.release();
|
|
320
|
+
},
|
|
321
|
+
(error) => {
|
|
322
|
+
record.reject(error);
|
|
323
|
+
record.release();
|
|
324
|
+
}
|
|
325
|
+
);
|
|
326
|
+
} catch (error) {
|
|
327
|
+
record.fail(error);
|
|
328
|
+
}
|
|
329
|
+
} else {
|
|
330
|
+
await this.executeRecord(record);
|
|
331
|
+
}
|
|
279
332
|
} catch (error) {
|
|
280
333
|
record.fail(error);
|
|
281
334
|
} finally {
|
|
@@ -289,13 +342,10 @@ export class ZLinkSerialExecutionQueue {
|
|
|
289
342
|
} finally {
|
|
290
343
|
this.draining = false;
|
|
291
344
|
this.claimStartedAt = undefined;
|
|
292
|
-
if (
|
|
293
|
-
!waitingForPreparation &&
|
|
294
|
-
(this.application.records.length > 0 || this.lifecycle.records.length > 0)
|
|
295
|
-
) {
|
|
345
|
+
if (!waitingForPreparation && this.selectNext() !== undefined) {
|
|
296
346
|
this.scheduleDrain();
|
|
297
347
|
} else {
|
|
298
|
-
if (this.
|
|
348
|
+
if (!this.hasPendingWork) {
|
|
299
349
|
this.resolveIdleWaiters();
|
|
300
350
|
}
|
|
301
351
|
}
|
|
@@ -308,26 +358,34 @@ export class ZLinkSerialExecutionQueue {
|
|
|
308
358
|
readonly record: SerialWorkRecord<unknown>;
|
|
309
359
|
}
|
|
310
360
|
| undefined {
|
|
311
|
-
const
|
|
312
|
-
const
|
|
361
|
+
const lifecycleOwner = this.activeLifecycle?.context as ZLinkSerialLifecycleContext | undefined;
|
|
362
|
+
const applicationRecord =
|
|
363
|
+
lifecycleOwner === undefined
|
|
364
|
+
? this.application.records[0]
|
|
365
|
+
: this.application.records.find((record) => lifecycleOwner.canExecuteApplication(record));
|
|
366
|
+
const applicationReady = applicationRecord !== undefined;
|
|
367
|
+
const lifecycleReady = this.activeLifecycle === undefined && this.lifecycle.records.length > 0;
|
|
313
368
|
if (!applicationReady && !lifecycleReady) return undefined;
|
|
314
369
|
if (!applicationReady) {
|
|
315
370
|
return { lane: 'lifecycle', record: this.lifecycle.records[0]! };
|
|
316
371
|
}
|
|
317
372
|
if (!lifecycleReady) {
|
|
318
|
-
return { lane: 'application', record:
|
|
373
|
+
return { lane: 'application', record: applicationRecord! };
|
|
319
374
|
}
|
|
320
375
|
if (!this.lifecycleDebt && this.lifecycleStreak < this.lifecycleBurstLimit) {
|
|
321
376
|
return { lane: 'lifecycle', record: this.lifecycle.records[0]! };
|
|
322
377
|
}
|
|
323
|
-
return { lane: 'application', record:
|
|
378
|
+
return { lane: 'application', record: applicationRecord! };
|
|
324
379
|
}
|
|
325
380
|
|
|
326
381
|
private takeSelected(selection: {
|
|
327
382
|
readonly lane: ZLinkSerialWorkLane;
|
|
328
383
|
readonly record: SerialWorkRecord<unknown>;
|
|
329
384
|
}): ZLinkSerialWorkRecord<unknown> {
|
|
330
|
-
const record =
|
|
385
|
+
const record =
|
|
386
|
+
selection.lane === 'lifecycle'
|
|
387
|
+
? this.takeLifecycle()
|
|
388
|
+
: this.takeApplication(selection.record);
|
|
331
389
|
if (record !== selection.record) {
|
|
332
390
|
throw new Error('The selected serial work record changed before owner claim.');
|
|
333
391
|
}
|
|
@@ -339,13 +397,17 @@ export class ZLinkSerialExecutionQueue {
|
|
|
339
397
|
if (this.application.records.length > 0 && this.lifecycleStreak >= this.lifecycleBurstLimit) {
|
|
340
398
|
this.lifecycleDebt = true;
|
|
341
399
|
}
|
|
342
|
-
|
|
400
|
+
const record = this.lifecycle.records.shift()!;
|
|
401
|
+
this.activeLifecycle = record;
|
|
402
|
+
return record;
|
|
343
403
|
}
|
|
344
404
|
|
|
345
|
-
private takeApplication(): ZLinkSerialWorkRecord<unknown> {
|
|
405
|
+
private takeApplication(selected: SerialWorkRecord<unknown>): ZLinkSerialWorkRecord<unknown> {
|
|
346
406
|
this.lifecycleStreak = 0;
|
|
347
407
|
this.lifecycleDebt = false;
|
|
348
|
-
return this.application.records.shift()!;
|
|
408
|
+
if (this.application.records[0] === selected) return this.application.records.shift()!;
|
|
409
|
+
const index = this.application.records.indexOf(selected);
|
|
410
|
+
return this.application.records.splice(index, 1)[0]!;
|
|
349
411
|
}
|
|
350
412
|
|
|
351
413
|
private startPreparation(record: SerialWorkRecord<unknown>): void {
|
|
@@ -410,6 +472,93 @@ export class ZLinkSerialExecutionQueue {
|
|
|
410
472
|
}
|
|
411
473
|
}
|
|
412
474
|
|
|
475
|
+
if (isStructuralGuardEnabled()) {
|
|
476
|
+
const submit = ZLinkSerialExecutionQueue.prototype.submit;
|
|
477
|
+
ZLinkSerialExecutionQueue.prototype.submit = function <T>(
|
|
478
|
+
this: ZLinkSerialExecutionQueue,
|
|
479
|
+
operation: () => Promise<T> | T,
|
|
480
|
+
options: ZLinkSerialWorkOptions = {},
|
|
481
|
+
context?: unknown
|
|
482
|
+
): Promise<T> {
|
|
483
|
+
return guardStateLaneCompletion(
|
|
484
|
+
trackDiagnosticCompletion(
|
|
485
|
+
submit.call(this, operation, options, context) as Promise<T>,
|
|
486
|
+
`serial ${options.lane ?? 'application'} ${diagnosticWorkName(operation)}`
|
|
487
|
+
),
|
|
488
|
+
'serial completion'
|
|
489
|
+
);
|
|
490
|
+
};
|
|
491
|
+
|
|
492
|
+
const submitPreAdmitted = ZLinkSerialExecutionQueue.prototype.submitPreAdmitted;
|
|
493
|
+
ZLinkSerialExecutionQueue.prototype.submitPreAdmitted = function <T>(
|
|
494
|
+
this: ZLinkSerialExecutionQueue,
|
|
495
|
+
operation: () => Promise<T> | T,
|
|
496
|
+
options: ZLinkSerialWorkOptions = {},
|
|
497
|
+
context?: unknown
|
|
498
|
+
): Promise<T> {
|
|
499
|
+
return guardStateLaneCompletion(
|
|
500
|
+
trackDiagnosticCompletion(
|
|
501
|
+
submitPreAdmitted.call(this, operation, options, context) as Promise<T>,
|
|
502
|
+
`serial ${options.lane ?? 'application'} ${diagnosticWorkName(operation)}`
|
|
503
|
+
),
|
|
504
|
+
'serial completion'
|
|
505
|
+
);
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
const submitContinuation = ZLinkSerialExecutionQueue.prototype.submitContinuation;
|
|
509
|
+
ZLinkSerialExecutionQueue.prototype.submitContinuation = function <T>(
|
|
510
|
+
this: ZLinkSerialExecutionQueue,
|
|
511
|
+
operation: () => Promise<T> | T,
|
|
512
|
+
context?: unknown
|
|
513
|
+
): Promise<T> {
|
|
514
|
+
return guardStateLaneCompletion(
|
|
515
|
+
trackDiagnosticCompletion(
|
|
516
|
+
submitContinuation.call(this, operation, context) as Promise<T>,
|
|
517
|
+
`serial continuation ${diagnosticWorkName(operation)}`
|
|
518
|
+
),
|
|
519
|
+
'serial completion'
|
|
520
|
+
);
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
const admitDurablePrefix = ZLinkSerialExecutionQueue.prototype.admitDurablePrefix;
|
|
524
|
+
ZLinkSerialExecutionQueue.prototype.admitDurablePrefix = function <T>(
|
|
525
|
+
this: ZLinkSerialExecutionQueue,
|
|
526
|
+
operation: () => Promise<T> | T,
|
|
527
|
+
options: ZLinkSerialWorkOptions = {},
|
|
528
|
+
context?: unknown,
|
|
529
|
+
preparation?: ZLinkSerialWorkPreparation
|
|
530
|
+
): Promise<T> {
|
|
531
|
+
return guardStateLaneCompletion(
|
|
532
|
+
trackDiagnosticCompletion(
|
|
533
|
+
admitDurablePrefix.call(this, operation, options, context, preparation) as Promise<T>,
|
|
534
|
+
`serial durable ${diagnosticWorkName(operation)}`
|
|
535
|
+
),
|
|
536
|
+
'serial completion'
|
|
537
|
+
);
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
const submitLifecycleOperation = ZLinkSerialExecutionQueue.prototype.submitLifecycleOperation;
|
|
541
|
+
ZLinkSerialExecutionQueue.prototype.submitLifecycleOperation = function <T>(
|
|
542
|
+
this: ZLinkSerialExecutionQueue,
|
|
543
|
+
operation: () => Promise<T> | T
|
|
544
|
+
): Promise<T> {
|
|
545
|
+
return guardStateLaneCompletion(
|
|
546
|
+
trackDiagnosticCompletion(
|
|
547
|
+
submitLifecycleOperation.call(this, operation) as Promise<T>,
|
|
548
|
+
`serial lifecycle ${diagnosticWorkName(operation)}`
|
|
549
|
+
),
|
|
550
|
+
'serial completion'
|
|
551
|
+
);
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
const whenIdle = ZLinkSerialExecutionQueue.prototype.whenIdle;
|
|
555
|
+
ZLinkSerialExecutionQueue.prototype.whenIdle = function (
|
|
556
|
+
this: ZLinkSerialExecutionQueue
|
|
557
|
+
): Promise<void> {
|
|
558
|
+
return guardStateLaneCompletion(whenIdle.call(this), 'serial completion');
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
|
|
413
562
|
function createLane(): ZLinkSerialAdmissionLane {
|
|
414
563
|
return {
|
|
415
564
|
records: []
|
|
@@ -427,7 +576,3 @@ function validateNonNegative(value: number, field: string): void {
|
|
|
427
576
|
throw new RangeError(`${field} must be a non-negative safe integer.`);
|
|
428
577
|
}
|
|
429
578
|
}
|
|
430
|
-
|
|
431
|
-
function macrotaskBoundary(): Promise<void> {
|
|
432
|
-
return new Promise((resolve) => setImmediate(resolve));
|
|
433
|
-
}
|