@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
|
@@ -3,11 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ZLinkUserSpotCreationCoordinator = void 0;
|
|
4
4
|
exports.encodeLocationCreationContent = encodeLocationCreationContent;
|
|
5
5
|
exports.decodeLocationCreationContent = decodeLocationCreationContent;
|
|
6
|
-
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
7
6
|
const node_crypto_1 = require("node:crypto");
|
|
8
7
|
const contracts_1 = require("../../contracts");
|
|
9
8
|
const service_authority_payload_codec_1 = require("../foundation/service-authority-payload-codec");
|
|
9
|
+
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
10
10
|
const authority_key_codec_1 = require("../locations/authority-key-codec");
|
|
11
|
+
const DEFAULT_USER_SPOT_CLEANUP_TIMEOUT_MS = 1_000;
|
|
12
|
+
const DEFAULT_USER_SPOT_POLL_INTERVAL_MS = 10;
|
|
11
13
|
/**
|
|
12
14
|
* Makes generic Location Store reservation the only visibility barrier for a
|
|
13
15
|
* User Spot. Only the reservation winner invokes application lifecycle code.
|
|
@@ -20,9 +22,10 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
20
22
|
this.options = options;
|
|
21
23
|
}
|
|
22
24
|
async getOrCreate(request, materialize, discard) {
|
|
23
|
-
const deadline = createDeadline(request.timeoutMs, request.signal);
|
|
24
|
-
const deadlineMs = performance.now() + request.timeoutMs;
|
|
25
25
|
const deadlineUnixMs = Date.now() + request.timeoutMs;
|
|
26
|
+
const remainingMs = Math.max(0, deadlineUnixMs - Date.now());
|
|
27
|
+
const deadline = createDeadline(remainingMs, request.signal);
|
|
28
|
+
const deadlineMs = performance.now() + remainingMs;
|
|
26
29
|
const signal = deadline.signal;
|
|
27
30
|
signal.throwIfAborted();
|
|
28
31
|
const sha256 = (0, node_crypto_1.createHash)('sha256').update(request.requestPayload).digest();
|
|
@@ -85,7 +88,7 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
85
88
|
count: 1
|
|
86
89
|
}
|
|
87
90
|
}
|
|
88
|
-
}, signal);
|
|
91
|
+
}, signal, BigInt(deadlineUnixMs));
|
|
89
92
|
}
|
|
90
93
|
catch (error) {
|
|
91
94
|
deadline.close();
|
|
@@ -192,60 +195,35 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
192
195
|
deadline.close();
|
|
193
196
|
}
|
|
194
197
|
}
|
|
195
|
-
async close(spot, closeOwner, signal
|
|
198
|
+
async close(spot, closeOwner, signal) {
|
|
196
199
|
const resolved = await this.resolveCloseTarget(spot, signal);
|
|
197
200
|
if (resolved === undefined)
|
|
198
201
|
return false;
|
|
199
202
|
const { spot: currentRef, snapshot: current } = resolved;
|
|
200
203
|
const key = (0, authority_key_codec_1.encodeAuthorityKey)('user_spot', String(spot.spotId));
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
catch (error) {
|
|
212
|
-
await this.restoreReady(key, closing, String(spot.spotId), signal);
|
|
213
|
-
throw error;
|
|
214
|
-
}
|
|
215
|
-
if (!closed) {
|
|
216
|
-
await this.restoreReady(key, closing, String(spot.spotId), signal);
|
|
217
|
-
return false;
|
|
218
|
-
}
|
|
219
|
-
const deleted = await this.options.store.compareExchangeAuthority(key, closing.storeVersion, { kind: 'delete' }, signal);
|
|
220
|
-
if (deleted.kind === 'deleted') {
|
|
221
|
-
this.forgetReadyRoute(currentRef.spotId, current);
|
|
222
|
-
return true;
|
|
223
|
-
}
|
|
224
|
-
if (deleted.kind === 'conflict') {
|
|
225
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `User Spot '${String(spot.spotId)}' authority changed while closing.`, true);
|
|
226
|
-
}
|
|
227
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale, `User Spot '${String(spot.spotId)}' generation cannot be closed.`);
|
|
204
|
+
return await closeOwner(currentRef, async (onCommitted) => this.commitCloseAuthority(key, current, String(spot.spotId), onCommitted));
|
|
205
|
+
}
|
|
206
|
+
/** Commits Closing for the owner's own incarnation when its context requests Close. */
|
|
207
|
+
async beginOwnerClose(spot, onCommitted) {
|
|
208
|
+
const resolved = await this.resolveCloseTarget(spot);
|
|
209
|
+
if (resolved === undefined)
|
|
210
|
+
return undefined;
|
|
211
|
+
const spotId = String(spot.spotId);
|
|
212
|
+
return await this.commitCloseAuthority((0, authority_key_codec_1.encodeAuthorityKey)('user_spot', spotId), resolved.snapshot, spotId, onCommitted);
|
|
228
213
|
}
|
|
229
214
|
async resolveCloseTarget(spot, signal) {
|
|
230
215
|
const key = (0, authority_key_codec_1.encodeAuthorityKey)('user_spot', String(spot.spotId));
|
|
231
216
|
const current = await this.options.store.readAuthority(key, signal);
|
|
232
217
|
if (current.kind === 'missing')
|
|
233
218
|
return undefined;
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
timeoutMs: 1
|
|
243
|
-
});
|
|
244
|
-
if (String(current.allocation.descriptor.rid) !== String(spot.nodeRid) ||
|
|
245
|
-
current.allocation.descriptor.meshName !== spot.meshName) {
|
|
246
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale, `User Spot '${String(spot.spotId)}' owner route is stale.`);
|
|
247
|
-
}
|
|
248
|
-
return { spot: currentRef, snapshot: current };
|
|
219
|
+
return {
|
|
220
|
+
spot: requireCloseTarget(current, String(spot.spotId), {
|
|
221
|
+
objectGeneration: spot.objectGeneration,
|
|
222
|
+
nodeRid: String(spot.nodeRid),
|
|
223
|
+
meshName: spot.meshName
|
|
224
|
+
}),
|
|
225
|
+
snapshot: current
|
|
226
|
+
};
|
|
249
227
|
}
|
|
250
228
|
async handleRemoteCreate(record, materialize, discard, signal) {
|
|
251
229
|
const key = `${record.spotId}\0${record.reservation.reservationId}`;
|
|
@@ -348,7 +326,7 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
348
326
|
leaseGeneration: current.ownerLeaseGeneration
|
|
349
327
|
}
|
|
350
328
|
}
|
|
351
|
-
}, signal);
|
|
329
|
+
}, signal, record.deadlineUnixMs);
|
|
352
330
|
await discard?.(signal);
|
|
353
331
|
return {
|
|
354
332
|
result: { spot, state: local.state, reply: local.reply },
|
|
@@ -380,7 +358,7 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
380
358
|
ownerNodeRid: String(current.allocation.descriptor.rid),
|
|
381
359
|
ownerNodeGeneration: current.allocation.descriptorLifecycleGeneration
|
|
382
360
|
})
|
|
383
|
-
}, signal);
|
|
361
|
+
}, signal, record.deadlineUnixMs);
|
|
384
362
|
}
|
|
385
363
|
catch (error) {
|
|
386
364
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestFailed, 'User Spot Ready commit Store operation failed.', false, error);
|
|
@@ -401,7 +379,7 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
401
379
|
}
|
|
402
380
|
catch (error) {
|
|
403
381
|
local?.publication?.abort();
|
|
404
|
-
const cleanupDeadline = createDeadline(this.options.cleanupTimeoutMs ??
|
|
382
|
+
const cleanupDeadline = createDeadline(this.options.cleanupTimeoutMs ?? DEFAULT_USER_SPOT_CLEANUP_TIMEOUT_MS);
|
|
405
383
|
const cleanupSignal = cleanupDeadline.signal;
|
|
406
384
|
const cleanup = await Promise.allSettled([
|
|
407
385
|
waitForAbort(this.options.store.abort({
|
|
@@ -430,52 +408,50 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
430
408
|
throw error;
|
|
431
409
|
}
|
|
432
410
|
}
|
|
433
|
-
async handleRemoteClose(record, closeOwner, signal) {
|
|
411
|
+
async handleRemoteClose(record, closeOwner, signal, canResume) {
|
|
434
412
|
const key = (0, authority_key_codec_1.encodeAuthorityKey)('user_spot', record.target.spotId);
|
|
435
413
|
const current = await this.options.store.readAuthority(key, signal);
|
|
436
414
|
if (current.kind === 'missing')
|
|
437
415
|
return false;
|
|
438
|
-
|
|
439
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale, `User Spot '${record.target.spotId}' generation is stale.`);
|
|
440
|
-
}
|
|
441
|
-
if (current.authorityOwnerGeneration !== record.target.authorityOwnerGeneration ||
|
|
442
|
-
current.storeVersion.value !== record.target.expectedStoreVersion ||
|
|
443
|
-
String(current.allocation.descriptor.rid) !== record.target.targetNodeRid ||
|
|
444
|
-
current.allocation.descriptorLifecycleGeneration !== record.target.targetNodeGeneration ||
|
|
445
|
-
current.allocation.objectKind !== 'user_spot' ||
|
|
446
|
-
current.allocation.state !== 'active') {
|
|
447
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `User Spot '${record.target.spotId}' close authority is moving.`, true);
|
|
448
|
-
}
|
|
449
|
-
const spot = {
|
|
416
|
+
const candidate = {
|
|
450
417
|
spotId: record.target.spotId,
|
|
451
418
|
objectGeneration: current.objectGeneration,
|
|
452
419
|
meshName: current.allocation.descriptor.meshName,
|
|
453
420
|
nodeRid: current.allocation.descriptor.rid
|
|
454
421
|
};
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
422
|
+
// A Closing committed by this owner is resumed, so its store version has
|
|
423
|
+
// advanced past the one the source observed.
|
|
424
|
+
const resuming = canResume?.(candidate) === true &&
|
|
425
|
+
(0, service_authority_payload_codec_1.decodeServiceClosingSpotAuthority)(current.payload)?.kind === 'user_spot';
|
|
426
|
+
const spot = requireCloseTarget(current, record.target.spotId, {
|
|
427
|
+
objectGeneration: record.target.objectGeneration,
|
|
428
|
+
nodeRid: record.target.targetNodeRid,
|
|
429
|
+
nodeGeneration: record.target.targetNodeGeneration,
|
|
430
|
+
authorityOwnerGeneration: record.target.authorityOwnerGeneration,
|
|
431
|
+
storeVersion: resuming ? undefined : record.target.expectedStoreVersion
|
|
432
|
+
});
|
|
433
|
+
return await closeOwner(spot, async (onCommitted) => this.commitCloseAuthority(key, current, record.target.spotId, onCommitted), signal);
|
|
434
|
+
}
|
|
435
|
+
async commitCloseAuthority(key, current, spotId, onCommitted) {
|
|
436
|
+
const closing = await this.beginClosing(key, current, spotId);
|
|
437
|
+
const authority = {
|
|
438
|
+
release: async () => {
|
|
439
|
+
this.forgetReadyRoute(spotId, current);
|
|
440
|
+
const deleted = await this.options.store.compareExchangeAuthority(key, closing.storeVersion, {
|
|
441
|
+
kind: 'delete'
|
|
442
|
+
});
|
|
443
|
+
if (deleted.kind !== 'deleted') {
|
|
444
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `User Spot '${spotId}' authority changed while closing.`, true);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
onCommitted();
|
|
449
|
+
return authority;
|
|
474
450
|
}
|
|
475
451
|
forgetReadyRoute(spotId, snapshot) {
|
|
476
452
|
this.options.forgetReadyRoute?.(snapshot.allocation.descriptor.meshName, readySpotRoute(spotId, snapshot));
|
|
477
453
|
}
|
|
478
|
-
async beginClosing(key, current, spotId
|
|
454
|
+
async beginClosing(key, current, spotId) {
|
|
479
455
|
const ready = (0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)(current.payload);
|
|
480
456
|
if (ready?.kind !== 'user_spot' ||
|
|
481
457
|
ready.spotId !== spotId ||
|
|
@@ -486,23 +462,13 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
486
462
|
kind: 'put',
|
|
487
463
|
payload: userSpotAuthorityPayload(current, spotId, 'closing'),
|
|
488
464
|
generationTransition: 'preserve'
|
|
489
|
-
},
|
|
465
|
+
}, undefined);
|
|
490
466
|
if (closing.kind === 'stored') {
|
|
491
467
|
const { kind: _kind, ...snapshot } = closing;
|
|
492
468
|
return { kind: 'snapshot', ...snapshot };
|
|
493
469
|
}
|
|
494
470
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `User Spot authority changed while entering Closing.`, true);
|
|
495
471
|
}
|
|
496
|
-
async restoreReady(key, closing, spotId, signal) {
|
|
497
|
-
const restored = await this.options.store.compareExchangeAuthority(key, closing.storeVersion, {
|
|
498
|
-
kind: 'put',
|
|
499
|
-
payload: userSpotAuthorityPayload(closing, spotId, 'ready'),
|
|
500
|
-
generationTransition: 'preserve'
|
|
501
|
-
}, signal);
|
|
502
|
-
if (restored.kind !== 'stored') {
|
|
503
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, 'User Spot Ready authority could not be restored after close was declined.', true);
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
472
|
async awaitReady(request, signal) {
|
|
507
473
|
const key = (0, authority_key_codec_1.encodeAuthorityKey)('user_spot', String(request.spotId));
|
|
508
474
|
for (;;) {
|
|
@@ -511,7 +477,7 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
511
477
|
if (current.kind === 'snapshot' && current.allocation.state === 'active') {
|
|
512
478
|
return spotRef(current, request);
|
|
513
479
|
}
|
|
514
|
-
await wait(this.options.pollIntervalMs ??
|
|
480
|
+
await wait(this.options.pollIntervalMs ?? DEFAULT_USER_SPOT_POLL_INTERVAL_MS, signal);
|
|
515
481
|
}
|
|
516
482
|
}
|
|
517
483
|
async remoteCreate(request, snapshot, targetNodeRid, targetNodeGeneration, deadlineUnixMs, deadlineMs) {
|
|
@@ -588,6 +554,41 @@ function readySpotRoute(spotId, snapshot) {
|
|
|
588
554
|
storeVersion: snapshot.storeVersion.value
|
|
589
555
|
};
|
|
590
556
|
}
|
|
557
|
+
/**
|
|
558
|
+
* The single classifier of a Close target (§7, §9): another ObjectGeneration is
|
|
559
|
+
* SpotGenerationStale; any owner fence difference or an authority that is not
|
|
560
|
+
* in a Framework-owned Ready or Closing state is SpotMoving.
|
|
561
|
+
*/
|
|
562
|
+
function requireCloseTarget(current, spotId, fence) {
|
|
563
|
+
if (current.objectGeneration !== fence.objectGeneration) {
|
|
564
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale, `User Spot '${spotId}' generation is stale.`);
|
|
565
|
+
}
|
|
566
|
+
// A committed Closing stays the close target: its owner resumes that Close.
|
|
567
|
+
const decoded = (0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)(current.payload) ??
|
|
568
|
+
(0, service_authority_payload_codec_1.decodeServiceClosingSpotAuthority)(current.payload);
|
|
569
|
+
const allocation = current.allocation;
|
|
570
|
+
if (decoded?.kind !== 'user_spot' ||
|
|
571
|
+
decoded.spotId !== spotId ||
|
|
572
|
+
decoded.ownerId !== current.ownerId ||
|
|
573
|
+
decoded.ownerLeaseGeneration !== current.ownerLeaseGeneration ||
|
|
574
|
+
allocation.objectKind !== 'user_spot' ||
|
|
575
|
+
allocation.state !== 'active' ||
|
|
576
|
+
String(allocation.descriptor.rid) !== fence.nodeRid ||
|
|
577
|
+
(fence.meshName !== undefined && allocation.descriptor.meshName !== fence.meshName) ||
|
|
578
|
+
(fence.nodeGeneration !== undefined &&
|
|
579
|
+
allocation.descriptorLifecycleGeneration !== fence.nodeGeneration) ||
|
|
580
|
+
(fence.authorityOwnerGeneration !== undefined &&
|
|
581
|
+
current.authorityOwnerGeneration !== fence.authorityOwnerGeneration) ||
|
|
582
|
+
(fence.storeVersion !== undefined && current.storeVersion.value !== fence.storeVersion)) {
|
|
583
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `User Spot '${spotId}' owner fence changed or the Spot is moving.`, true);
|
|
584
|
+
}
|
|
585
|
+
return {
|
|
586
|
+
spotId: spotId,
|
|
587
|
+
objectGeneration: current.objectGeneration,
|
|
588
|
+
meshName: allocation.descriptor.meshName,
|
|
589
|
+
nodeRid: allocation.descriptor.rid
|
|
590
|
+
};
|
|
591
|
+
}
|
|
591
592
|
function spotRef(snapshot, request, allowPending = false) {
|
|
592
593
|
const decoded = (0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)(snapshot.payload);
|
|
593
594
|
if (allowPending
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkAggregateInventoryStore = void 0;
|
|
4
4
|
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const actor_join_recovery_codec_1 = require("../foundation/actor-join-recovery-codec");
|
|
5
6
|
const in_memory_provider_location_store_1 = require("./in-memory-provider-location-store");
|
|
6
|
-
const
|
|
7
|
+
const INVENTORY_PAGE_KIND = 'aggregate-inventory-page-v1';
|
|
8
|
+
const INVENTORY_ROOT_KIND = 'aggregate-inventory-root-v1';
|
|
9
|
+
const PREFIX = `${in_memory_provider_location_store_1.PROVIDER_STORAGE_NAMESPACE_PREFIX}aggregate-inventory:`;
|
|
7
10
|
const MAX_PAGE_ENTRIES = 1_024;
|
|
8
11
|
const MAX_PAGE_BYTES = 1_024 * 1_024;
|
|
9
12
|
const MAX_TREE_LEVELS = 32;
|
|
@@ -135,8 +138,8 @@ function buildTree(request) {
|
|
|
135
138
|
if (request.participants.length < 1) {
|
|
136
139
|
throw new RangeError('Aggregate inventory requires at least one participant.');
|
|
137
140
|
}
|
|
138
|
-
if (request.inventoryDigest.byteLength !==
|
|
139
|
-
throw new TypeError(
|
|
141
|
+
if (request.inventoryDigest.byteLength !== actor_join_recovery_codec_1.SHA256_DIGEST_BYTES) {
|
|
142
|
+
throw new TypeError(`Aggregate inventory digest must contain ${actor_join_recovery_codec_1.SHA256_DIGEST_BYTES} bytes.`);
|
|
140
143
|
}
|
|
141
144
|
const entries = request.participants.map((participant, index) => ({
|
|
142
145
|
index,
|
|
@@ -162,7 +165,7 @@ function buildTree(request) {
|
|
|
162
165
|
MAX_PAGE_BYTES) {
|
|
163
166
|
level++;
|
|
164
167
|
if (level >= MAX_TREE_LEVELS) {
|
|
165
|
-
throw new RangeError(
|
|
168
|
+
throw new RangeError(`Aggregate inventory tree exceeds ${MAX_TREE_LEVELS} levels.`);
|
|
166
169
|
}
|
|
167
170
|
references = packIndexPages(level, references, pages);
|
|
168
171
|
}
|
|
@@ -180,7 +183,7 @@ function packLeafPages(entries, pages) {
|
|
|
180
183
|
let bytes;
|
|
181
184
|
do {
|
|
182
185
|
page = {
|
|
183
|
-
kind:
|
|
186
|
+
kind: INVENTORY_PAGE_KIND,
|
|
184
187
|
level: 0,
|
|
185
188
|
index: references.length,
|
|
186
189
|
startIndex: offset,
|
|
@@ -211,7 +214,7 @@ function packIndexPages(level, children, pages) {
|
|
|
211
214
|
do {
|
|
212
215
|
const selected = children.slice(offset, offset + count);
|
|
213
216
|
page = {
|
|
214
|
-
kind:
|
|
217
|
+
kind: INVENTORY_PAGE_KIND,
|
|
215
218
|
level,
|
|
216
219
|
index: references.length,
|
|
217
220
|
startIndex: selected[0].startIndex,
|
|
@@ -240,7 +243,7 @@ function rootCandidate(totalCount, topLevel, topPages, pages, digest, declaredDi
|
|
|
240
243
|
pageCountsByLevel[page.level]++;
|
|
241
244
|
}
|
|
242
245
|
return {
|
|
243
|
-
kind:
|
|
246
|
+
kind: INVENTORY_ROOT_KIND,
|
|
244
247
|
totalCount,
|
|
245
248
|
digest,
|
|
246
249
|
declaredDigest,
|
|
@@ -325,7 +328,7 @@ function decodeRoot(bytes) {
|
|
|
325
328
|
if (value === null ||
|
|
326
329
|
typeof value !== 'object' ||
|
|
327
330
|
!('kind' in value) ||
|
|
328
|
-
value.kind !==
|
|
331
|
+
value.kind !== INVENTORY_ROOT_KIND) {
|
|
329
332
|
throw new Error('Invalid inventory root.');
|
|
330
333
|
}
|
|
331
334
|
return value;
|
|
@@ -335,7 +338,7 @@ function decodePage(bytes) {
|
|
|
335
338
|
if (value === null ||
|
|
336
339
|
typeof value !== 'object' ||
|
|
337
340
|
!('kind' in value) ||
|
|
338
|
-
value.kind !==
|
|
341
|
+
value.kind !== INVENTORY_PAGE_KIND ||
|
|
339
342
|
!('entries' in value) ||
|
|
340
343
|
!Array.isArray(value.entries) ||
|
|
341
344
|
!('children' in value) ||
|
|
@@ -379,7 +382,7 @@ function isSha256(value) {
|
|
|
379
382
|
}
|
|
380
383
|
function sameHash(expected, actual) {
|
|
381
384
|
return (isSha256(expected) &&
|
|
382
|
-
actual.byteLength ===
|
|
385
|
+
actual.byteLength === actor_join_recovery_codec_1.SHA256_DIGEST_BYTES &&
|
|
383
386
|
(0, node_crypto_1.timingSafeEqual)(Buffer.from(expected, 'hex'), Buffer.from(actual)));
|
|
384
387
|
}
|
|
385
388
|
function dataLost(fence, reason) {
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.encodeAuthorityKey = encodeAuthorityKey;
|
|
4
4
|
exports.decodeAuthorityKey = decodeAuthorityKey;
|
|
5
|
+
const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
|
|
5
6
|
function encodeAuthorityKey(kind, globalId) {
|
|
6
7
|
const bytes = Buffer.from(globalId);
|
|
7
|
-
if (bytes.byteLength < 1 || bytes.byteLength >
|
|
8
|
-
throw new RangeError(
|
|
8
|
+
if (bytes.byteLength < 1 || bytes.byteLength > CoreTypes_1.ZLINK_MAX_IDENTITY_TEXT_BYTES) {
|
|
9
|
+
throw new RangeError(`Authority identity must contain 1..${CoreTypes_1.ZLINK_MAX_IDENTITY_TEXT_BYTES} UTF-8 bytes.`);
|
|
9
10
|
}
|
|
10
11
|
const discriminator = kind === 'actor' ? 'a' : 's';
|
|
11
12
|
return {
|
|
@@ -20,7 +21,7 @@ function decodeAuthorityKey(key) {
|
|
|
20
21
|
if (match === null)
|
|
21
22
|
throw new TypeError('Authority key is not canonical.');
|
|
22
23
|
const declaredLength = Number(match[2]);
|
|
23
|
-
if (declaredLength >
|
|
24
|
+
if (declaredLength > CoreTypes_1.ZLINK_MAX_IDENTITY_TEXT_BYTES)
|
|
24
25
|
throw new TypeError('Authority key identity exceeds the byte limit.');
|
|
25
26
|
const encoded = match[3];
|
|
26
27
|
const bytes = [];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
|
|
2
2
|
import type { RoutingId } from '../../contracts/Common';
|
|
3
3
|
import { type ZLinkPeerLocationResolver, type ZLinkPeerLocation } from './internal-location-contracts';
|
|
4
|
+
import type { ZLinkDispatchErrorSink } from '../diagnostics/dispatch-error-port';
|
|
4
5
|
import type { IZLinkAutoConnectExecutor, IZLinkAutoConnectPeerPublisher, ZLinkAutoConnectEventSink, ZLinkAutoConnectLocal, ZLinkAutoConnectTarget } from './auto-connect-types';
|
|
5
6
|
export interface ZLinkAutoConnectReconcilerOptions {
|
|
6
7
|
readonly local: ZLinkAutoConnectLocal;
|
|
@@ -12,6 +13,7 @@ export interface ZLinkAutoConnectReconcilerOptions {
|
|
|
12
13
|
readonly events?: ZLinkAutoConnectEventSink;
|
|
13
14
|
readonly options?: ZLinkLocationOptionOverrides;
|
|
14
15
|
readonly monotonicNowMs?: () => number;
|
|
16
|
+
readonly errorSink: ZLinkDispatchErrorSink;
|
|
15
17
|
}
|
|
16
18
|
export declare class ZLinkAutoConnectReconciler {
|
|
17
19
|
private readonly lane;
|
|
@@ -24,6 +26,7 @@ export declare class ZLinkAutoConnectReconciler {
|
|
|
24
26
|
private readonly events?;
|
|
25
27
|
private readonly options;
|
|
26
28
|
private readonly monotonicNowMs;
|
|
29
|
+
private readonly errorSink;
|
|
27
30
|
private readonly active;
|
|
28
31
|
private readonly pendingDisconnects;
|
|
29
32
|
private readonly failedEndpoints;
|
|
@@ -50,6 +53,7 @@ export declare class ZLinkAutoConnectReconciler {
|
|
|
50
53
|
private completePublishClaimCore;
|
|
51
54
|
private preparePublishRenewalCore;
|
|
52
55
|
private recordStoreFailure;
|
|
56
|
+
private connectTarget;
|
|
53
57
|
private beginStoreFailureCore;
|
|
54
58
|
private completeStoreFailureConnectCore;
|
|
55
59
|
private recordDisconnectedEndpoint;
|
|
@@ -7,6 +7,7 @@ const key_codec_1 = require("./key-codec");
|
|
|
7
7
|
const EndpointNotation_1 = require("../../contracts/Configuration/EndpointNotation");
|
|
8
8
|
const auto_connect_planner_1 = require("./auto-connect-planner");
|
|
9
9
|
const state_lane_1 = require("../execution/state-lane");
|
|
10
|
+
const zlink_1 = require("@zlink-systems/zlink");
|
|
10
11
|
const encodeRoutingIdHex = key_codec_1.ZLinkLocationKeyCodec.encodeRoutingIdHex;
|
|
11
12
|
class ZLinkAutoConnectReconciler {
|
|
12
13
|
lane = new state_lane_1.ZLinkStateLane();
|
|
@@ -19,6 +20,7 @@ class ZLinkAutoConnectReconciler {
|
|
|
19
20
|
events;
|
|
20
21
|
options;
|
|
21
22
|
monotonicNowMs;
|
|
23
|
+
errorSink;
|
|
22
24
|
active = new Map();
|
|
23
25
|
pendingDisconnects = new Map();
|
|
24
26
|
failedEndpoints = new Set();
|
|
@@ -45,6 +47,7 @@ class ZLinkAutoConnectReconciler {
|
|
|
45
47
|
this.events = options.events;
|
|
46
48
|
this.options = { ...Options_1.zlinkRuntimeDefaultLocationOptions, ...options.options };
|
|
47
49
|
this.monotonicNowMs = options.monotonicNowMs ?? (() => performance.now());
|
|
50
|
+
this.errorSink = options.errorSink;
|
|
48
51
|
this.executor.onDisconnected?.((endpoint) => this.recordDisconnectedEndpoint(endpoint));
|
|
49
52
|
}
|
|
50
53
|
get storeFailed() {
|
|
@@ -116,13 +119,6 @@ class ZLinkAutoConnectReconciler {
|
|
|
116
119
|
await this.lane.run(() => {
|
|
117
120
|
this.storeFailedValue = false;
|
|
118
121
|
this.storeFailureStartedAtMs = undefined;
|
|
119
|
-
// After a store restart, owners may need one full lease interval to
|
|
120
|
-
// reclaim their token and republish a descriptor. Do not interpret the
|
|
121
|
-
// incomplete post-restart scan as a definitive removal.
|
|
122
|
-
// Keep the existing transport set through one lease interval while
|
|
123
|
-
// owners reclaim their tokens and republish descriptors. This deferral
|
|
124
|
-
// applies only after a Store operation failed; a successful empty scan
|
|
125
|
-
// is authoritative and must remove stale peers promptly.
|
|
126
122
|
this.recoveryDeferUntilMs = this.monotonicNowMs() + this.options.ownerLeaseTtlMs;
|
|
127
123
|
});
|
|
128
124
|
}
|
|
@@ -133,7 +129,6 @@ class ZLinkAutoConnectReconciler {
|
|
|
133
129
|
.map((nodeRid) => encodeRoutingIdHex(nodeRid)));
|
|
134
130
|
});
|
|
135
131
|
const candidates = auto_connect_planner_1.ZLinkAutoConnectPlanner.computeCandidates(this.local, rows);
|
|
136
|
-
const nowMs = this.monotonicNowMs();
|
|
137
132
|
this.executor.expectPeers?.([...candidates.values()]);
|
|
138
133
|
this.executor.replaceNotRequired?.(auto_connect_planner_1.ZLinkAutoConnectPlanner.computeNotRequired(this.local, rows));
|
|
139
134
|
const desired = new Map(auto_connect_planner_1.ZLinkAutoConnectPlanner.computeDesired(this.local, rows));
|
|
@@ -152,6 +147,19 @@ class ZLinkAutoConnectReconciler {
|
|
|
152
147
|
if (activeKeys.has(key))
|
|
153
148
|
desired.set(key, target);
|
|
154
149
|
}
|
|
150
|
+
const deferringMissingTargets = this.monotonicNowMs() < (await this.lane.run(() => this.recoveryDeferUntilMs));
|
|
151
|
+
let staleCandidates = candidates;
|
|
152
|
+
if (deferringMissingTargets) {
|
|
153
|
+
const retainedCandidates = new Map(candidates);
|
|
154
|
+
const lastDesired = await this.lane.run(() => [...this.lastDesired]);
|
|
155
|
+
for (const [key, target] of lastDesired) {
|
|
156
|
+
if (!desired.has(key))
|
|
157
|
+
desired.set(key, target);
|
|
158
|
+
if (!retainedCandidates.has(key))
|
|
159
|
+
retainedCandidates.set(key, target);
|
|
160
|
+
}
|
|
161
|
+
staleCandidates = retainedCandidates;
|
|
162
|
+
}
|
|
155
163
|
await this.lane.run(() => {
|
|
156
164
|
this.lastDesired = new Map(desired);
|
|
157
165
|
});
|
|
@@ -178,14 +186,13 @@ class ZLinkAutoConnectReconciler {
|
|
|
178
186
|
await this.lane.run(() => {
|
|
179
187
|
this.pendingDisconnects.delete(key);
|
|
180
188
|
});
|
|
181
|
-
|
|
182
|
-
if (connected) {
|
|
189
|
+
await this.connectTarget(target, async () => {
|
|
183
190
|
connectedEndpoints.push(target.endpoint);
|
|
184
191
|
await this.lane.run(() => {
|
|
185
192
|
this.active.set(key, target);
|
|
186
193
|
this.failedEndpoints.delete(target.endpoint);
|
|
187
194
|
});
|
|
188
|
-
}
|
|
195
|
+
});
|
|
189
196
|
continue;
|
|
190
197
|
}
|
|
191
198
|
if (current.endpoint !== target.endpoint || current.ownerId !== target.ownerId) {
|
|
@@ -203,25 +210,16 @@ class ZLinkAutoConnectReconciler {
|
|
|
203
210
|
await this.lane.run(() => {
|
|
204
211
|
this.pendingDisconnects.delete(key);
|
|
205
212
|
});
|
|
206
|
-
|
|
207
|
-
if (connected) {
|
|
213
|
+
await this.connectTarget(target, async () => {
|
|
208
214
|
connectedEndpoints.push(target.endpoint);
|
|
209
215
|
await this.lane.run(() => {
|
|
210
216
|
this.active.set(key, target);
|
|
211
217
|
this.failedEndpoints.delete(target.endpoint);
|
|
212
218
|
});
|
|
213
|
-
}
|
|
219
|
+
});
|
|
214
220
|
}
|
|
215
221
|
}
|
|
216
|
-
|
|
217
|
-
this.publishDesiredSetChange(connectedEndpoints, disconnectedEndpoints);
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
// A store restart can expose an incomplete descriptor set while peers are
|
|
221
|
-
// reclaiming their owner leases. Preserve existing transport connections
|
|
222
|
-
// during that recovery window; stale-peer cleanup is safe after the
|
|
223
|
-
// deferred reconciliation has completed.
|
|
224
|
-
this.executor.disconnectStalePeers?.([...candidates.values()]);
|
|
222
|
+
this.executor.disconnectStalePeers?.([...staleCandidates.values()]);
|
|
225
223
|
const activeTargets = await this.lane.run(() => [...this.active]);
|
|
226
224
|
for (const [key, target] of activeTargets) {
|
|
227
225
|
if (!desired.has(key)) {
|
|
@@ -330,10 +328,24 @@ class ZLinkAutoConnectReconciler {
|
|
|
330
328
|
if (retryTargets === undefined)
|
|
331
329
|
return;
|
|
332
330
|
for (const [key, target] of retryTargets) {
|
|
333
|
-
|
|
331
|
+
await this.connectTarget(target, async () => {
|
|
334
332
|
await this.lane.run(() => this.completeStoreFailureConnectCore(key, target));
|
|
335
|
-
}
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
async connectTarget(target, accept) {
|
|
337
|
+
let accepted;
|
|
338
|
+
try {
|
|
339
|
+
accepted = await this.executor.connect(target);
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
if (!(error instanceof zlink_1.ConnectError))
|
|
343
|
+
throw error;
|
|
344
|
+
this.errorSink.reportRuntimeTaskException('auto-connect', error);
|
|
345
|
+
return;
|
|
336
346
|
}
|
|
347
|
+
if (accepted)
|
|
348
|
+
await accept();
|
|
337
349
|
}
|
|
338
350
|
beginStoreFailureCore() {
|
|
339
351
|
const nowMs = this.monotonicNowMs();
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.randomOperationId = randomOperationId;
|
|
4
|
+
const stream_wire_1 = require("@zlink-systems/stream-wire");
|
|
5
|
+
const operation_identity_1 = require("../foundation/operation-identity");
|
|
4
6
|
const node_crypto_1 = require("node:crypto");
|
|
5
|
-
function randomOperationId(entropy = (0, node_crypto_1.randomBytes)(
|
|
6
|
-
if (entropy.byteLength !==
|
|
7
|
-
throw new RangeError(
|
|
7
|
+
function randomOperationId(entropy = (0, node_crypto_1.randomBytes)(operation_identity_1.OPERATION_IDENTITY_BYTES)) {
|
|
8
|
+
if (entropy.byteLength !== operation_identity_1.OPERATION_IDENTITY_BYTES)
|
|
9
|
+
throw new RangeError(`Operation ID entropy must be ${operation_identity_1.OPERATION_IDENTITY_BYTES} bytes.`);
|
|
8
10
|
const bytes = Buffer.from(entropy);
|
|
9
11
|
const high = bytes.readBigUInt64BE(0);
|
|
10
|
-
const low = bytes.readBigUInt64BE(
|
|
12
|
+
const low = bytes.readBigUInt64BE(stream_wire_1.UINT64_BYTES);
|
|
11
13
|
return high === 0n && low === 0n ? { high, low: 1n } : { high, low };
|
|
12
14
|
}
|
|
@@ -22,10 +22,10 @@ export interface ZLinkDomainLocationStore {
|
|
|
22
22
|
compareExchangeAuthority(key: ZLinkAuthorityKey, expectedStoreVersion: ZLinkAuthorityStoreVersion, mutation: ZLinkAuthorityMutation, signal?: AbortSignal): Promise<ZLinkAuthorityCompareExchangeResult>;
|
|
23
23
|
listAuthorities(prefix: string, cursor: ZLinkAuthorityScanCursor | undefined, limit: number, signal?: AbortSignal): Promise<ZLinkAuthorityScanResult>;
|
|
24
24
|
readCreationTerminal(operation: ZLinkCreationOperationIdentity, signal?: AbortSignal): Promise<ZLinkCreationTerminalReadResult>;
|
|
25
|
-
reserve(request: ZLinkObjectReserveRequest, signal?: AbortSignal): Promise<ZLinkObjectReserveResult>;
|
|
26
|
-
commit(request: ZLinkObjectCommitRequest, signal?: AbortSignal): Promise<ZLinkObjectCommitResult>;
|
|
25
|
+
reserve(request: ZLinkObjectReserveRequest, signal?: AbortSignal, deadlineUnixMs?: bigint): Promise<ZLinkObjectReserveResult>;
|
|
26
|
+
commit(request: ZLinkObjectCommitRequest, signal?: AbortSignal, deadlineUnixMs?: bigint): Promise<ZLinkObjectCommitResult>;
|
|
27
27
|
completeCreation(request: ZLinkObjectCreationCompleteRequest, signal?: AbortSignal): Promise<ZLinkObjectCreationCompleteResult>;
|
|
28
|
-
abort(request: ZLinkObjectAbortRequest, signal?: AbortSignal): Promise<ZLinkObjectAbortResult>;
|
|
28
|
+
abort(request: ZLinkObjectAbortRequest, signal?: AbortSignal, deadlineUnixMs?: bigint): Promise<ZLinkObjectAbortResult>;
|
|
29
29
|
prepareAggregate(request: ZLinkAggregatePrepareRequest, signal?: AbortSignal): Promise<ZLinkAggregatePrepareResult>;
|
|
30
30
|
commitAggregate(fence: ZLinkAggregateFence, signal?: AbortSignal): Promise<ZLinkAggregateCommitResult>;
|
|
31
31
|
abortAggregate(fence: ZLinkAggregateFence, signal?: AbortSignal): Promise<ZLinkAggregateAbortResult>;
|