@zlink-systems/framework 0.21.0 → 0.23.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/Common/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -0
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/contracts/Streams/IZLinkSession.d.ts +2 -1
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +28 -22
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-join-deferred-scope.d.ts +0 -1
- package/dist/runtime/actors/actor-join-deferred-scope.js +0 -18
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +160 -130
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/contracts/index.d.ts +1 -0
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +3 -0
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +134 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +12 -20
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +46 -42
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -0
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -39
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +6 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +55 -0
- package/dist/runtime/diagnostics/flow-context.d.ts +2 -1
- package/dist/runtime/diagnostics/flow-context.js +2 -2
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +58 -42
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -27
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +4 -2
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +169 -144
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +1 -0
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +4 -0
- package/dist/runtime/foundation/service-stateful-runtime.js +461 -439
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -0
- package/dist/runtime/foundation/service-topology-registry.js +105 -96
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +245 -228
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +20 -18
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +209 -220
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +2 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +29 -21
- package/dist/runtime/spots/spot-actor-packet-drain.js +14 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +79 -86
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +17 -15
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +2 -3
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +6 -6
- package/dist/runtime/spots/spot-timer.js +26 -30
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +21 -8
- package/dist/runtime/streams/actor-session-binding-registry.js +168 -148
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -0
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +20 -17
- package/dist/runtime/streams/bound-session-response-target.js +8 -1
- package/dist/runtime/streams/bound-session-service.d.ts +1 -0
- package/dist/runtime/streams/bound-session-service.js +14 -12
- package/dist/runtime/streams/index.js +28 -20
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +52 -31
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.d.ts +5 -1
- package/dist/runtime/streams/protocol.js +68 -20
- package/dist/runtime/streams/session-actor-coordinator.js +37 -41
- package/dist/runtime/streams/session-context.d.ts +9 -2
- package/dist/runtime/streams/session-context.js +50 -32
- package/dist/runtime/streams/session-local-actors.d.ts +3 -1
- package/dist/runtime/streams/session-local-actors.js +17 -2
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.d.ts +1 -1
- package/dist/runtime/streams/stream-frame-factory.js +14 -7
- package/dist/runtime/streams/stream-session-runtime.js +112 -78
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +3 -3
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +2 -2
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +142 -134
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +1 -32
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +353 -326
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +77 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +370 -390
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +44 -44
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +218 -206
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +12 -47
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/dispatch-error-details.ts +62 -0
- package/src/runtime/diagnostics/flow-context.ts +18 -7
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +107 -79
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -55
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +364 -396
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1233 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +170 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +19 -18
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +595 -564
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +196 -148
- package/src/runtime/spots/spot-actor-packet-drain.ts +56 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +235 -222
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +129 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +13 -18
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +58 -47
- package/src/runtime/spots/spot-timer.ts +103 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +421 -292
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +8 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +60 -50
- package/src/runtime/streams/bound-session-response-target.ts +39 -9
- package/src/runtime/streams/bound-session-service.ts +52 -42
- package/src/runtime/streams/index.ts +183 -100
- package/src/runtime/streams/managed-stream.ts +123 -90
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +115 -46
- package/src/runtime/streams/session-actor-coordinator.ts +109 -93
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +96 -51
- package/src/runtime/streams/session-local-actors.ts +19 -3
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +59 -40
- package/src/runtime/streams/stream-session-runtime.ts +317 -214
- package/src/runtime/workers/index.ts +68 -29
|
@@ -27,15 +27,15 @@ class ZLinkInMemoryLocationStore {
|
|
|
27
27
|
isTargetLive: (key, lifecycleGeneration, owner) => {
|
|
28
28
|
const descriptor = this.meshNodes.rows.get(meshNodeKey(key.meshName, key.rid));
|
|
29
29
|
const lease = this.leases.get(owner.ownerId);
|
|
30
|
-
return descriptor !== undefined
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
return (descriptor !== undefined &&
|
|
31
|
+
descriptor.lifecycleGeneration === lifecycleGeneration &&
|
|
32
|
+
descriptor.ownerId === owner.ownerId &&
|
|
33
|
+
descriptor.leaseGeneration === owner.leaseGeneration &&
|
|
34
|
+
descriptor.objectRole === internal_location_contracts_1.ZLinkObjectRole.Server &&
|
|
35
|
+
descriptor.state === internal_location_contracts_1.ZLinkFrameworkRuntimeState.Serving &&
|
|
36
|
+
lease !== undefined &&
|
|
37
|
+
lease.token.leaseGeneration === owner.leaseGeneration &&
|
|
38
|
+
lease.leaseExpiresAt.getTime() > this.now().getTime());
|
|
39
39
|
},
|
|
40
40
|
placementCapacityAvailable: (key, requested, reserved, active) => {
|
|
41
41
|
const descriptor = this.meshNodes.rows.get(meshNodeKey(key.meshName, key.rid));
|
|
@@ -44,18 +44,19 @@ class ZLinkInMemoryLocationStore {
|
|
|
44
44
|
const spotType = requested.spotType;
|
|
45
45
|
const typeCapacity = spotType === undefined
|
|
46
46
|
? undefined
|
|
47
|
-
: descriptor.populationCapacity.spotTypes.find(candidate => candidate.objectKind === spotType.objectKind
|
|
48
|
-
|
|
49
|
-
return active.actors + reserved.actors + requested.actors
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
: descriptor.populationCapacity.spotTypes.find((candidate) => candidate.objectKind === spotType.objectKind &&
|
|
48
|
+
candidate.stableType === spotType.stableType);
|
|
49
|
+
return (active.actors + reserved.actors + requested.actors <=
|
|
50
|
+
descriptor.populationCapacity.actors.limit &&
|
|
51
|
+
active.spots + reserved.spots + requested.spots <=
|
|
52
|
+
descriptor.populationCapacity.spots.limit &&
|
|
53
|
+
(spotType === undefined ||
|
|
54
|
+
(typeCapacity !== undefined &&
|
|
55
|
+
(typeCapacity.limit === 0 ||
|
|
56
|
+
(active.spotType?.count ?? 0) +
|
|
57
|
+
(reserved.spotType?.count ?? 0) +
|
|
58
|
+
spotType.count <=
|
|
59
|
+
typeCapacity.limit))));
|
|
59
60
|
},
|
|
60
61
|
identityClaimed: (authorityKey) => this.entrySpotClaims.has(authorityKey)
|
|
61
62
|
}, now);
|
|
@@ -99,14 +100,14 @@ class ZLinkInMemoryLocationStore {
|
|
|
99
100
|
const current = this.meshNodes.rows.get(key);
|
|
100
101
|
const lease = this.leases.get(descriptor.ownerId);
|
|
101
102
|
const updatedAt = this.now();
|
|
102
|
-
if (lease === undefined
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
if (lease === undefined ||
|
|
104
|
+
lease.token.leaseGeneration !== descriptor.leaseGeneration ||
|
|
105
|
+
lease.leaseExpiresAt.getTime() <= updatedAt.getTime()) {
|
|
105
106
|
return rejectedConflict();
|
|
106
107
|
}
|
|
107
108
|
if (current === undefined) {
|
|
108
|
-
if (intent !== internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim
|
|
109
|
-
|
|
109
|
+
if (intent !== internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim &&
|
|
110
|
+
intent !== internal_location_contracts_1.ZLinkLocationWriteIntent.Takeover)
|
|
110
111
|
return ignoredStale();
|
|
111
112
|
if (!this.claimEntrySpotIdentity(descriptor, key))
|
|
112
113
|
return rejectedConflict();
|
|
@@ -126,18 +127,18 @@ class ZLinkInMemoryLocationStore {
|
|
|
126
127
|
this.bump(internal_location_contracts_1.ZLinkLocationKind.Peer, descriptor.meshName);
|
|
127
128
|
return stored(next, updatedAt);
|
|
128
129
|
}
|
|
129
|
-
if (current.ownerId === descriptor.ownerId
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
130
|
+
if (current.ownerId === descriptor.ownerId &&
|
|
131
|
+
current.leaseGeneration === descriptor.leaseGeneration &&
|
|
132
|
+
current.lifecycleGeneration === descriptor.lifecycleGeneration &&
|
|
133
|
+
descriptor.descriptorRevision === current.descriptorRevision &&
|
|
134
|
+
meshNodeDescriptorFingerprint(current) === meshNodeDescriptorFingerprint(descriptor)) {
|
|
134
135
|
return stored(this.meshNodes.generations.get(key) ?? 1n, current.updatedAt);
|
|
135
136
|
}
|
|
136
|
-
if (current.ownerId !== descriptor.ownerId
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
137
|
+
if (current.ownerId !== descriptor.ownerId ||
|
|
138
|
+
current.leaseGeneration !== descriptor.leaseGeneration ||
|
|
139
|
+
current.lifecycleGeneration !== descriptor.lifecycleGeneration ||
|
|
140
|
+
descriptor.descriptorRevision <= current.descriptorRevision ||
|
|
141
|
+
meshNodeImmutableFingerprint(current) !== meshNodeImmutableFingerprint(descriptor)) {
|
|
141
142
|
return ignoredStale();
|
|
142
143
|
}
|
|
143
144
|
this.meshNodes.rows.set(key, { ...descriptor, updatedAt });
|
|
@@ -147,9 +148,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
147
148
|
async removeMeshNode(key, owner) {
|
|
148
149
|
const encoded = meshNodeKey(key.meshName, key.rid);
|
|
149
150
|
const current = this.meshNodes.rows.get(encoded);
|
|
150
|
-
if (current === undefined
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
if (current === undefined ||
|
|
152
|
+
current.ownerId !== owner.ownerId ||
|
|
153
|
+
current.leaseGeneration !== owner.leaseGeneration) {
|
|
153
154
|
return internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale;
|
|
154
155
|
}
|
|
155
156
|
this.meshNodes.rows.delete(encoded);
|
|
@@ -166,7 +167,7 @@ class ZLinkInMemoryLocationStore {
|
|
|
166
167
|
const objectCapabilities = row.objectCapabilities.map((capability) => {
|
|
167
168
|
return { ...capability };
|
|
168
169
|
});
|
|
169
|
-
const spotTypes = row.populationCapacity.spotTypes.map(capacity => {
|
|
170
|
+
const spotTypes = row.populationCapacity.spotTypes.map((capacity) => {
|
|
170
171
|
const usage = this.authority.capacityUsage(descriptor, row.lifecycleGeneration, capacity.objectKind, capacity.stableType);
|
|
171
172
|
return { ...capacity, ...usage };
|
|
172
173
|
});
|
|
@@ -182,7 +183,7 @@ class ZLinkInMemoryLocationStore {
|
|
|
182
183
|
}
|
|
183
184
|
};
|
|
184
185
|
});
|
|
185
|
-
return pageValues(rows, page ?? {}, row => meshNodeKey(row.meshName, row.rid));
|
|
186
|
+
return pageValues(rows, page ?? {}, (row) => meshNodeKey(row.meshName, row.rid));
|
|
186
187
|
}
|
|
187
188
|
async updateClientServer(descriptor, intent, signal) {
|
|
188
189
|
signal?.throwIfAborted();
|
|
@@ -191,14 +192,14 @@ class ZLinkInMemoryLocationStore {
|
|
|
191
192
|
const current = this.clientServers.rows.get(key);
|
|
192
193
|
const lease = this.leases.get(descriptor.ownerId);
|
|
193
194
|
const updatedAt = this.now();
|
|
194
|
-
if (lease === undefined
|
|
195
|
-
|
|
196
|
-
|
|
195
|
+
if (lease === undefined ||
|
|
196
|
+
lease.token.leaseGeneration !== descriptor.leaseGeneration ||
|
|
197
|
+
lease.leaseExpiresAt.getTime() <= updatedAt.getTime()) {
|
|
197
198
|
return rejectedConflict();
|
|
198
199
|
}
|
|
199
200
|
if (current === undefined) {
|
|
200
|
-
if (intent !== internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim
|
|
201
|
-
|
|
201
|
+
if (intent !== internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim &&
|
|
202
|
+
intent !== internal_location_contracts_1.ZLinkLocationWriteIntent.Takeover)
|
|
202
203
|
return ignoredStale();
|
|
203
204
|
const generation = (this.clientServers.generations.get(key) ?? 0n) + 1n;
|
|
204
205
|
this.clientServers.rows.set(key, { ...descriptor, updatedAt });
|
|
@@ -217,11 +218,11 @@ class ZLinkInMemoryLocationStore {
|
|
|
217
218
|
if (clientServerDescriptorFingerprint(current) === clientServerDescriptorFingerprint(descriptor)) {
|
|
218
219
|
return stored(this.clientServers.generations.get(key) ?? 1n, current.updatedAt);
|
|
219
220
|
}
|
|
220
|
-
if (current.ownerId !== descriptor.ownerId
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
221
|
+
if (current.ownerId !== descriptor.ownerId ||
|
|
222
|
+
current.leaseGeneration !== descriptor.leaseGeneration ||
|
|
223
|
+
current.lifecycleGeneration !== descriptor.lifecycleGeneration ||
|
|
224
|
+
descriptor.descriptorRevision <= current.descriptorRevision ||
|
|
225
|
+
clientServerImmutableFingerprint(current) !== clientServerImmutableFingerprint(descriptor)) {
|
|
225
226
|
return ignoredStale();
|
|
226
227
|
}
|
|
227
228
|
this.clientServers.rows.set(key, { ...descriptor, updatedAt });
|
|
@@ -232,9 +233,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
232
233
|
signal?.throwIfAborted();
|
|
233
234
|
const encoded = clientServerKey(key.channelName, key.serverRid);
|
|
234
235
|
const current = this.clientServers.rows.get(encoded);
|
|
235
|
-
if (current === undefined
|
|
236
|
-
|
|
237
|
-
|
|
236
|
+
if (current === undefined ||
|
|
237
|
+
current.ownerId !== owner.ownerId ||
|
|
238
|
+
current.leaseGeneration !== owner.leaseGeneration) {
|
|
238
239
|
return internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale;
|
|
239
240
|
}
|
|
240
241
|
this.clientServers.rows.delete(encoded);
|
|
@@ -252,14 +253,14 @@ class ZLinkInMemoryLocationStore {
|
|
|
252
253
|
const current = this.fanoutPublishers.rows.get(key);
|
|
253
254
|
const lease = this.leases.get(descriptor.ownerId);
|
|
254
255
|
const updatedAt = this.now();
|
|
255
|
-
if (lease === undefined
|
|
256
|
-
|
|
257
|
-
|
|
256
|
+
if (lease === undefined ||
|
|
257
|
+
lease.token.leaseGeneration !== descriptor.leaseGeneration ||
|
|
258
|
+
lease.leaseExpiresAt.getTime() <= updatedAt.getTime()) {
|
|
258
259
|
return rejectedConflict();
|
|
259
260
|
}
|
|
260
261
|
if (current === undefined) {
|
|
261
|
-
if (intent !== internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim
|
|
262
|
-
|
|
262
|
+
if (intent !== internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim &&
|
|
263
|
+
intent !== internal_location_contracts_1.ZLinkLocationWriteIntent.Takeover)
|
|
263
264
|
return ignoredStale();
|
|
264
265
|
const generation = (this.fanoutPublishers.generations.get(key) ?? 0n) + 1n;
|
|
265
266
|
this.fanoutPublishers.rows.set(key, { ...descriptor, updatedAt });
|
|
@@ -273,16 +274,16 @@ class ZLinkInMemoryLocationStore {
|
|
|
273
274
|
this.fanoutPublishers.generations.set(key, generation);
|
|
274
275
|
return stored(generation, updatedAt);
|
|
275
276
|
}
|
|
276
|
-
if (fanoutPublisherDescriptorFingerprint(current)
|
|
277
|
-
|
|
277
|
+
if (fanoutPublisherDescriptorFingerprint(current) ===
|
|
278
|
+
fanoutPublisherDescriptorFingerprint(descriptor)) {
|
|
278
279
|
return stored(this.fanoutPublishers.generations.get(key) ?? 1n, current.updatedAt);
|
|
279
280
|
}
|
|
280
|
-
if (current.ownerId !== descriptor.ownerId
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
281
|
+
if (current.ownerId !== descriptor.ownerId ||
|
|
282
|
+
current.leaseGeneration !== descriptor.leaseGeneration ||
|
|
283
|
+
current.lifecycleGeneration !== descriptor.lifecycleGeneration ||
|
|
284
|
+
descriptor.descriptorRevision <= current.descriptorRevision ||
|
|
285
|
+
fanoutPublisherImmutableFingerprint(current) !==
|
|
286
|
+
fanoutPublisherImmutableFingerprint(descriptor)) {
|
|
286
287
|
return ignoredStale();
|
|
287
288
|
}
|
|
288
289
|
this.fanoutPublishers.rows.set(key, { ...descriptor, updatedAt });
|
|
@@ -292,9 +293,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
292
293
|
signal?.throwIfAborted();
|
|
293
294
|
const encoded = fanoutPublisherKey(key.channelName, key.publisherRid);
|
|
294
295
|
const current = this.fanoutPublishers.rows.get(encoded);
|
|
295
|
-
if (current === undefined
|
|
296
|
-
|
|
297
|
-
|
|
296
|
+
if (current === undefined ||
|
|
297
|
+
current.ownerId !== owner.ownerId ||
|
|
298
|
+
current.leaseGeneration !== owner.leaseGeneration) {
|
|
298
299
|
return internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale;
|
|
299
300
|
}
|
|
300
301
|
this.fanoutPublishers.rows.delete(encoded);
|
|
@@ -321,25 +322,28 @@ class ZLinkInMemoryLocationStore {
|
|
|
321
322
|
return [...this.peers.rows.values()].filter((row) => (0, location_store_integration_1.matchesPeerLocation)(row, filter));
|
|
322
323
|
}
|
|
323
324
|
async updateSpot(spot, intent) {
|
|
324
|
-
const key = key_codec_1.ZLinkLocationKeyCodec.encodeSpotKey({
|
|
325
|
+
const key = key_codec_1.ZLinkLocationKeyCodec.encodeSpotKey({
|
|
326
|
+
meshName: spot.meshName,
|
|
327
|
+
spotId: spot.spotId
|
|
328
|
+
});
|
|
325
329
|
const updatedAt = this.now();
|
|
326
330
|
const current = this.spots.rows.get(key);
|
|
327
|
-
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim
|
|
328
|
-
|
|
329
|
-
|
|
331
|
+
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim &&
|
|
332
|
+
current !== undefined &&
|
|
333
|
+
this.isOwnerLive(current.ownerId, updatedAt)) {
|
|
330
334
|
return rejectedConflict();
|
|
331
335
|
}
|
|
332
336
|
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.Renew) {
|
|
333
|
-
if (current === undefined
|
|
334
|
-
|
|
335
|
-
|
|
337
|
+
if (current === undefined ||
|
|
338
|
+
current.ownerId !== spot.ownerId ||
|
|
339
|
+
current.leaseGeneration !== spot.leaseGeneration)
|
|
336
340
|
return ignoredStale();
|
|
337
341
|
this.spots.rows.set(key, { ...spot, updatedAt });
|
|
338
342
|
this.bump(internal_location_contracts_1.ZLinkLocationKind.Spot, spot.meshName);
|
|
339
343
|
return stored(this.spots.generations.get(key) ?? 0n, updatedAt);
|
|
340
344
|
}
|
|
341
|
-
if (current !== undefined
|
|
342
|
-
|
|
345
|
+
if (current !== undefined &&
|
|
346
|
+
!canTakeOver(current.ownerId, current.leaseGeneration, this.leases.get(current.ownerId), spot.ownerId, spot.leaseGeneration, intent, updatedAt))
|
|
343
347
|
return rejectedConflict();
|
|
344
348
|
const generation = (this.spots.generations.get(key) ?? 0n) + 1n;
|
|
345
349
|
this.spots.generations.set(key, generation);
|
|
@@ -351,9 +355,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
351
355
|
const encoded = key_codec_1.ZLinkLocationKeyCodec.encodeSpotKey(key);
|
|
352
356
|
const current = this.spots.rows.get(encoded);
|
|
353
357
|
const leaseGeneration = current?.leaseGeneration ?? this.spots.generations.get(encoded);
|
|
354
|
-
if (current === undefined
|
|
355
|
-
|
|
356
|
-
|
|
358
|
+
if (current === undefined ||
|
|
359
|
+
current.ownerId !== owner.ownerId ||
|
|
360
|
+
leaseGeneration !== owner.leaseGeneration) {
|
|
357
361
|
return internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale;
|
|
358
362
|
}
|
|
359
363
|
this.spots.rows.delete(encoded);
|
|
@@ -367,25 +371,28 @@ class ZLinkInMemoryLocationStore {
|
|
|
367
371
|
return pageRows(this.spots, (row) => (0, location_store_integration_1.matchesSpotLocation)(row, filter), page);
|
|
368
372
|
}
|
|
369
373
|
async updateActor(actor, intent) {
|
|
370
|
-
const key = key_codec_1.ZLinkLocationKeyCodec.encodeActorKey({
|
|
374
|
+
const key = key_codec_1.ZLinkLocationKeyCodec.encodeActorKey({
|
|
375
|
+
meshName: actor.meshName,
|
|
376
|
+
actorId: actor.actorId
|
|
377
|
+
});
|
|
371
378
|
const updatedAt = this.now();
|
|
372
379
|
const current = this.actors.rows.get(key);
|
|
373
|
-
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim
|
|
374
|
-
|
|
375
|
-
|
|
380
|
+
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim &&
|
|
381
|
+
current !== undefined &&
|
|
382
|
+
this.isOwnerLive(current.ownerId, updatedAt)) {
|
|
376
383
|
return rejectedConflict();
|
|
377
384
|
}
|
|
378
385
|
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.Renew) {
|
|
379
|
-
if (current === undefined
|
|
380
|
-
|
|
381
|
-
|
|
386
|
+
if (current === undefined ||
|
|
387
|
+
current.ownerId !== actor.ownerId ||
|
|
388
|
+
current.leaseGeneration !== actor.leaseGeneration)
|
|
382
389
|
return ignoredStale();
|
|
383
390
|
this.actors.rows.set(key, { ...actor, updatedAt });
|
|
384
391
|
this.bump(internal_location_contracts_1.ZLinkLocationKind.Actor, actor.meshName);
|
|
385
392
|
return stored(this.actors.generations.get(key) ?? 0n, updatedAt);
|
|
386
393
|
}
|
|
387
|
-
if (current !== undefined
|
|
388
|
-
|
|
394
|
+
if (current !== undefined &&
|
|
395
|
+
!canTakeOver(current.ownerId, current.leaseGeneration, this.leases.get(current.ownerId), actor.ownerId, actor.leaseGeneration, intent, updatedAt))
|
|
389
396
|
return rejectedConflict();
|
|
390
397
|
const generation = (this.actors.generations.get(key) ?? 0n) + 1n;
|
|
391
398
|
this.actors.generations.set(key, generation);
|
|
@@ -397,9 +404,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
397
404
|
const encoded = key_codec_1.ZLinkLocationKeyCodec.encodeActorKey(key);
|
|
398
405
|
const current = this.actors.rows.get(encoded);
|
|
399
406
|
const leaseGeneration = current?.leaseGeneration ?? this.actors.generations.get(encoded);
|
|
400
|
-
if (current === undefined
|
|
401
|
-
|
|
402
|
-
|
|
407
|
+
if (current === undefined ||
|
|
408
|
+
current.ownerId !== owner.ownerId ||
|
|
409
|
+
leaseGeneration !== owner.leaseGeneration) {
|
|
403
410
|
return internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale;
|
|
404
411
|
}
|
|
405
412
|
this.actors.rows.delete(encoded);
|
|
@@ -413,7 +420,10 @@ class ZLinkInMemoryLocationStore {
|
|
|
413
420
|
return pageRows(this.actors, (row) => (0, location_store_integration_1.matchesActorLocation)(row, filter), page);
|
|
414
421
|
}
|
|
415
422
|
async updateRoute(route, intent) {
|
|
416
|
-
return this.write(this.routes, key_codec_1.ZLinkLocationKeyCodec.encodeRouteKey({
|
|
423
|
+
return this.write(this.routes, key_codec_1.ZLinkLocationKeyCodec.encodeRouteKey({
|
|
424
|
+
routeKind: route.routeKind,
|
|
425
|
+
routeKey: route.routeKey
|
|
426
|
+
}), route, intent, route.ownerId, route.generation, (row) => row.ownerId, (row) => row.generation, (row, generation, updatedAt) => ({ ...row, generation, updatedAt }), internal_location_contracts_1.ZLinkLocationKind.Route, undefined);
|
|
417
427
|
}
|
|
418
428
|
async removeRoute(key, owner) {
|
|
419
429
|
return this.remove(this.routes, key_codec_1.ZLinkLocationKeyCodec.encodeRouteKey(key), owner, (row) => row.ownerId, (row) => row.generation, internal_location_contracts_1.ZLinkLocationKind.Route, undefined);
|
|
@@ -475,7 +485,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
475
485
|
signal?.throwIfAborted();
|
|
476
486
|
validateTransferIdentity(meshName, actorId, transferId);
|
|
477
487
|
validateTransferLease(successorOwnerId, recoveryLeaseTtlMs);
|
|
478
|
-
const record = this.actorTransfers
|
|
488
|
+
const record = this.actorTransfers
|
|
489
|
+
.get(actorTransferKey(meshName, actorId))
|
|
490
|
+
?.records.get(transferId);
|
|
479
491
|
if (record === undefined)
|
|
480
492
|
return transferResult('notFound');
|
|
481
493
|
if (record.state !== 'prepared' && record.state !== 'committed') {
|
|
@@ -497,7 +509,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
497
509
|
async resolveActorTransfer(meshName, actorId, signal) {
|
|
498
510
|
signal?.throwIfAborted();
|
|
499
511
|
const slot = this.actorTransfers.get(actorTransferKey(meshName, actorId));
|
|
500
|
-
return slot?.activeTransferId === undefined
|
|
512
|
+
return slot?.activeTransferId === undefined
|
|
513
|
+
? undefined
|
|
514
|
+
: slot.records.get(slot.activeTransferId);
|
|
501
515
|
}
|
|
502
516
|
async claimOwnerLease(ownerId, leaseTtlMs, signal) {
|
|
503
517
|
signal?.throwIfAborted();
|
|
@@ -537,9 +551,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
537
551
|
validateOwnerLeaseInput(token.ownerId, leaseTtlMs);
|
|
538
552
|
const storeNow = this.now();
|
|
539
553
|
const current = this.leases.get(token.ownerId);
|
|
540
|
-
if (current === undefined
|
|
541
|
-
|
|
542
|
-
|
|
554
|
+
if (current === undefined ||
|
|
555
|
+
current.leaseExpiresAt.getTime() <= storeNow.getTime() ||
|
|
556
|
+
current.token.leaseGeneration !== token.leaseGeneration) {
|
|
543
557
|
return { kind: 'stale' };
|
|
544
558
|
}
|
|
545
559
|
const leaseExpiresAt = new Date(storeNow.getTime() + leaseTtlMs);
|
|
@@ -558,9 +572,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
558
572
|
async removeAllByOwner(owner, signal) {
|
|
559
573
|
signal?.throwIfAborted();
|
|
560
574
|
const lease = this.leases.get(owner.ownerId);
|
|
561
|
-
if (lease === undefined
|
|
562
|
-
|
|
563
|
-
|
|
575
|
+
if (lease === undefined ||
|
|
576
|
+
lease.token.leaseGeneration !== owner.leaseGeneration ||
|
|
577
|
+
lease.leaseExpiresAt.getTime() <= this.now().getTime()) {
|
|
564
578
|
return 0n;
|
|
565
579
|
}
|
|
566
580
|
const ownerId = owner.ownerId;
|
|
@@ -587,9 +601,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
587
601
|
const authorityKey = (0, authority_key_codec_1.encodeAuthorityKey)('user_spot', descriptor.entrySpotId).value;
|
|
588
602
|
const current = this.entrySpotClaims.get(authorityKey);
|
|
589
603
|
if (current !== undefined) {
|
|
590
|
-
if (current.descriptorKey !== descriptorKey
|
|
591
|
-
|
|
592
|
-
|
|
604
|
+
if (current.descriptorKey !== descriptorKey ||
|
|
605
|
+
current.ownerId !== descriptor.ownerId ||
|
|
606
|
+
current.lifecycleGeneration !== descriptor.lifecycleGeneration) {
|
|
593
607
|
return false;
|
|
594
608
|
}
|
|
595
609
|
this.entrySpotClaims.set(authorityKey, {
|
|
@@ -611,9 +625,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
611
625
|
return;
|
|
612
626
|
const authorityKey = (0, authority_key_codec_1.encodeAuthorityKey)('user_spot', descriptor.entrySpotId).value;
|
|
613
627
|
const current = this.entrySpotClaims.get(authorityKey);
|
|
614
|
-
if (current?.ownerId === descriptor.ownerId
|
|
615
|
-
|
|
616
|
-
|
|
628
|
+
if (current?.ownerId === descriptor.ownerId &&
|
|
629
|
+
current.leaseGeneration === descriptor.leaseGeneration &&
|
|
630
|
+
current.lifecycleGeneration === descriptor.lifecycleGeneration) {
|
|
617
631
|
this.entrySpotClaims.delete(authorityKey);
|
|
618
632
|
}
|
|
619
633
|
}
|
|
@@ -623,21 +637,22 @@ class ZLinkInMemoryLocationStore {
|
|
|
623
637
|
write(table, key, row, intent, ownerId, generation, ownerOf, generationOf, finalize, kind, meshName) {
|
|
624
638
|
const updatedAt = this.now();
|
|
625
639
|
const current = table.rows.get(key);
|
|
626
|
-
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim
|
|
627
|
-
|
|
628
|
-
|
|
640
|
+
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim &&
|
|
641
|
+
current !== undefined &&
|
|
642
|
+
this.isOwnerLive(ownerOf(current), updatedAt)) {
|
|
629
643
|
return rejectedConflict();
|
|
630
644
|
}
|
|
631
|
-
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim ||
|
|
645
|
+
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim ||
|
|
646
|
+
intent === internal_location_contracts_1.ZLinkLocationWriteIntent.Takeover) {
|
|
632
647
|
const next = (table.generations.get(key) ?? 0n) + 1n;
|
|
633
648
|
table.generations.set(key, next);
|
|
634
649
|
table.rows.set(key, finalize(row, next, updatedAt));
|
|
635
650
|
this.bump(kind, meshName);
|
|
636
651
|
return stored(next, updatedAt);
|
|
637
652
|
}
|
|
638
|
-
if (current !== undefined
|
|
639
|
-
|
|
640
|
-
|
|
653
|
+
if (current !== undefined &&
|
|
654
|
+
ownerOf(current) === ownerId &&
|
|
655
|
+
(generation === 0n || generationOf(current) === generation)) {
|
|
641
656
|
table.rows.set(key, finalize(row, generation, updatedAt));
|
|
642
657
|
this.bump(kind, meshName);
|
|
643
658
|
return stored(table.generations.get(key) ?? generation, updatedAt);
|
|
@@ -667,8 +682,9 @@ class ZLinkInMemoryLocationStore {
|
|
|
667
682
|
}
|
|
668
683
|
remove(table, key, owner, ownerOf, generationOf, kind, meshName) {
|
|
669
684
|
const current = table.rows.get(key);
|
|
670
|
-
if (current === undefined ||
|
|
671
|
-
|
|
685
|
+
if (current === undefined ||
|
|
686
|
+
ownerOf(current) !== owner.ownerId ||
|
|
687
|
+
generationOf(current) !== owner.leaseGeneration) {
|
|
672
688
|
return ignoredStale();
|
|
673
689
|
}
|
|
674
690
|
table.rows.delete(key);
|
|
@@ -729,10 +745,14 @@ function validateMeshNodeDescriptor(descriptor) {
|
|
|
729
745
|
throw new TypeError('Only Object Server descriptors may publish an Entry Spot ID.');
|
|
730
746
|
}
|
|
731
747
|
const maxGeneration = 0x7fffffffffffffffn;
|
|
732
|
-
if (descriptor.lifecycleGeneration < 1n ||
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
748
|
+
if (descriptor.lifecycleGeneration < 1n ||
|
|
749
|
+
descriptor.lifecycleGeneration > maxGeneration ||
|
|
750
|
+
descriptor.descriptorRevision < 1n ||
|
|
751
|
+
descriptor.descriptorRevision > maxGeneration ||
|
|
752
|
+
descriptor.leaseGeneration < 1n ||
|
|
753
|
+
descriptor.leaseGeneration > maxGeneration ||
|
|
754
|
+
descriptor.applicationVersion < 0n ||
|
|
755
|
+
descriptor.applicationVersion > maxGeneration) {
|
|
736
756
|
throw new RangeError('MeshNode descriptor generations are invalid.');
|
|
737
757
|
}
|
|
738
758
|
const capacities = [
|
|
@@ -740,20 +760,22 @@ function validateMeshNodeDescriptor(descriptor) {
|
|
|
740
760
|
descriptor.populationCapacity.spots,
|
|
741
761
|
...descriptor.populationCapacity.spotTypes
|
|
742
762
|
];
|
|
743
|
-
const values = capacities.flatMap(capacity => [
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
763
|
+
const values = capacities.flatMap((capacity) => [
|
|
764
|
+
capacity.active,
|
|
765
|
+
capacity.reserved,
|
|
766
|
+
capacity.limit
|
|
767
|
+
]);
|
|
768
|
+
if (values.some((value) => !Number.isSafeInteger(value) || value < 0) ||
|
|
769
|
+
capacities.some((capacity) => capacity.active + capacity.reserved > capacity.limit && capacity.limit !== 0) ||
|
|
770
|
+
!Number.isSafeInteger(descriptor.activationConcurrency.active) ||
|
|
771
|
+
descriptor.activationConcurrency.active < 0 ||
|
|
772
|
+
!Number.isSafeInteger(descriptor.activationConcurrency.limit) ||
|
|
773
|
+
descriptor.activationConcurrency.limit < 1 ||
|
|
774
|
+
descriptor.activationConcurrency.active > descriptor.activationConcurrency.limit ||
|
|
775
|
+
descriptor.placementWeight < 0 ||
|
|
776
|
+
descriptor.placementWeight > 10_000 ||
|
|
777
|
+
descriptor.objectCapabilities.length > 1024 ||
|
|
778
|
+
(descriptor.objectRole !== internal_location_contracts_1.ZLinkObjectRole.Server && descriptor.objectCapabilities.length !== 0)) {
|
|
757
779
|
throw new RangeError('MeshNode object capacity is invalid.');
|
|
758
780
|
}
|
|
759
781
|
const keys = new Set();
|
|
@@ -768,8 +790,9 @@ function validateMeshNodeDescriptor(descriptor) {
|
|
|
768
790
|
if ((capability.policy === 'snapshot') !== capability.hasSnapshotAdapter) {
|
|
769
791
|
throw new TypeError('Snapshot adapter presence does not match the maintenance policy.');
|
|
770
792
|
}
|
|
771
|
-
if (!Number.isSafeInteger(capability.limit) ||
|
|
772
|
-
|
|
793
|
+
if (!Number.isSafeInteger(capability.limit) ||
|
|
794
|
+
capability.limit < 0 ||
|
|
795
|
+
(capability.objectKind === 'actor' && capability.limit !== 0)) {
|
|
773
796
|
throw new RangeError('MeshNode capability limit is invalid.');
|
|
774
797
|
}
|
|
775
798
|
}
|
|
@@ -779,8 +802,7 @@ function validDescriptorText(value) {
|
|
|
779
802
|
return size >= 1 && size <= 255 && !value.includes('\0');
|
|
780
803
|
}
|
|
781
804
|
function meshNodeImmutableFingerprint(descriptor) {
|
|
782
|
-
const capabilities = [...descriptor.objectCapabilities]
|
|
783
|
-
.sort((left, right) => {
|
|
805
|
+
const capabilities = [...descriptor.objectCapabilities].sort((left, right) => {
|
|
784
806
|
const byKind = left.objectKind.localeCompare(right.objectKind);
|
|
785
807
|
return byKind !== 0 ? byKind : left.stableType.localeCompare(right.stableType);
|
|
786
808
|
});
|
|
@@ -817,9 +839,7 @@ function meshNodeDescriptorFingerprint(descriptor) {
|
|
|
817
839
|
}
|
|
818
840
|
const TRANSFER_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
819
841
|
function meshNodeKey(meshName, rid) {
|
|
820
|
-
const value = typeof rid === 'string'
|
|
821
|
-
? rid
|
|
822
|
-
: rid.toHex();
|
|
842
|
+
const value = typeof rid === 'string' ? rid : rid.toHex();
|
|
823
843
|
return `${meshName.length}:${meshName}:${value.length}:${value}`;
|
|
824
844
|
}
|
|
825
845
|
function clientServerKey(channelName, serverRid) {
|
|
@@ -835,17 +855,20 @@ function fanoutPublisherKey(channelName, publisherRid) {
|
|
|
835
855
|
return `${channelName.length}:${channelName}:${value.length}:${value}`;
|
|
836
856
|
}
|
|
837
857
|
function validateClientServerDescriptor(descriptor) {
|
|
838
|
-
if (!validDescriptorText(descriptor.channelName)
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
858
|
+
if (!validDescriptorText(descriptor.channelName) ||
|
|
859
|
+
!validDescriptorText(String(descriptor.serverRid)) ||
|
|
860
|
+
!validDescriptorText(descriptor.endpoint) ||
|
|
861
|
+
!validDescriptorText(descriptor.securityIdentity) ||
|
|
862
|
+
!validDescriptorText(descriptor.ownerId)) {
|
|
843
863
|
throw new TypeError('ClientServer descriptor identity and endpoint are required.');
|
|
844
864
|
}
|
|
845
865
|
const maxGeneration = 0x7fffffffffffffffn;
|
|
846
|
-
if (descriptor.lifecycleGeneration < 1n ||
|
|
847
|
-
|
|
848
|
-
|
|
866
|
+
if (descriptor.lifecycleGeneration < 1n ||
|
|
867
|
+
descriptor.lifecycleGeneration > maxGeneration ||
|
|
868
|
+
descriptor.descriptorRevision < 1n ||
|
|
869
|
+
descriptor.descriptorRevision > maxGeneration ||
|
|
870
|
+
descriptor.leaseGeneration < 1n ||
|
|
871
|
+
descriptor.leaseGeneration > maxGeneration) {
|
|
849
872
|
throw new RangeError('ClientServer descriptor generations are invalid.');
|
|
850
873
|
}
|
|
851
874
|
if (!Number.isInteger(descriptor.weight) || descriptor.weight < 0 || descriptor.weight > 10_000) {
|
|
@@ -872,17 +895,20 @@ function clientServerDescriptorFingerprint(descriptor) {
|
|
|
872
895
|
});
|
|
873
896
|
}
|
|
874
897
|
function validateFanoutPublisherDescriptor(descriptor) {
|
|
875
|
-
if (!validDescriptorText(descriptor.channelName)
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
898
|
+
if (!validDescriptorText(descriptor.channelName) ||
|
|
899
|
+
!validDescriptorText(String(descriptor.publisherRid)) ||
|
|
900
|
+
!validDescriptorText(descriptor.endpoint) ||
|
|
901
|
+
!validDescriptorText(descriptor.securityIdentity) ||
|
|
902
|
+
!validDescriptorText(descriptor.ownerId)) {
|
|
880
903
|
throw new TypeError('Fanout publisher descriptor identity and endpoint are required.');
|
|
881
904
|
}
|
|
882
905
|
const maxGeneration = 0x7fffffffffffffffn;
|
|
883
|
-
if (descriptor.lifecycleGeneration < 1n ||
|
|
884
|
-
|
|
885
|
-
|
|
906
|
+
if (descriptor.lifecycleGeneration < 1n ||
|
|
907
|
+
descriptor.lifecycleGeneration > maxGeneration ||
|
|
908
|
+
descriptor.descriptorRevision < 1n ||
|
|
909
|
+
descriptor.descriptorRevision > maxGeneration ||
|
|
910
|
+
descriptor.leaseGeneration < 1n ||
|
|
911
|
+
descriptor.leaseGeneration > maxGeneration) {
|
|
886
912
|
throw new RangeError('Fanout publisher descriptor generations are invalid.');
|
|
887
913
|
}
|
|
888
914
|
}
|
|
@@ -960,9 +986,7 @@ function pageRows(table, matches, page) {
|
|
|
960
986
|
function pageValues(rows, page, key) {
|
|
961
987
|
const ordered = [...rows].sort((left, right) => key(left).localeCompare(key(right)));
|
|
962
988
|
const offset = parseContinuationToken(page.continuationToken);
|
|
963
|
-
const size = page.pageSize !== undefined && page.pageSize > 0
|
|
964
|
-
? page.pageSize
|
|
965
|
-
: Number.MAX_SAFE_INTEGER;
|
|
989
|
+
const size = page.pageSize !== undefined && page.pageSize > 0 ? page.pageSize : Number.MAX_SAFE_INTEGER;
|
|
966
990
|
const items = ordered.slice(offset, offset + size);
|
|
967
991
|
const nextOffset = offset + items.length;
|
|
968
992
|
return {
|
|
@@ -987,7 +1011,11 @@ function ignoredStale() {
|
|
|
987
1011
|
return { status: internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale, generation: 0n, updatedAt: new Date(0) };
|
|
988
1012
|
}
|
|
989
1013
|
function rejectedConflict() {
|
|
990
|
-
return {
|
|
1014
|
+
return {
|
|
1015
|
+
status: internal_location_contracts_1.ZLinkLocationWriteStatus.RejectedConflict,
|
|
1016
|
+
generation: 0n,
|
|
1017
|
+
updatedAt: new Date(0)
|
|
1018
|
+
};
|
|
991
1019
|
}
|
|
992
1020
|
function canTakeOver(currentOwnerId, currentLeaseGeneration, currentLease, nextOwnerId, nextLeaseGeneration, intent, now) {
|
|
993
1021
|
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.Takeover) {
|
|
@@ -998,11 +1026,10 @@ function canTakeOver(currentOwnerId, currentLeaseGeneration, currentLease, nextO
|
|
|
998
1026
|
if (intent !== internal_location_contracts_1.ZLinkLocationWriteIntent.NewClaim) {
|
|
999
1027
|
return false;
|
|
1000
1028
|
}
|
|
1001
|
-
const ownerGone = currentLease === undefined
|
|
1002
|
-
|| currentLease.leaseExpiresAt.getTime() <= now.getTime();
|
|
1029
|
+
const ownerGone = currentLease === undefined || currentLease.leaseExpiresAt.getTime() <= now.getTime();
|
|
1003
1030
|
if (ownerGone)
|
|
1004
1031
|
return true;
|
|
1005
|
-
return currentOwnerId === nextOwnerId
|
|
1006
|
-
|
|
1007
|
-
|
|
1032
|
+
return (currentOwnerId === nextOwnerId &&
|
|
1033
|
+
currentLeaseGeneration !== nextLeaseGeneration &&
|
|
1034
|
+
currentLease.token.leaseGeneration === nextLeaseGeneration);
|
|
1008
1035
|
}
|