@zlink-systems/framework 0.21.0 → 0.22.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/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- 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 +24 -18
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- 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 +158 -124
- 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/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.js +116 -113
- 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 +10 -18
- 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 +43 -33
- 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.js +9 -7
- 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/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +47 -39
- 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 -23
- 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.js +136 -136
- 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-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.js +416 -438
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.js +96 -95
- 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 +244 -227
- 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/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 +208 -219
- 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.js +23 -20
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -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 +74 -85
- 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 +16 -14
- 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 +1 -2
- 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 +5 -5
- package/dist/runtime/spots/spot-timer.js +25 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +98 -107
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +18 -16
- package/dist/runtime/streams/bound-session-service.js +8 -9
- package/dist/runtime/streams/index.js +20 -19
- package/dist/runtime/streams/managed-stream.js +32 -30
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.js +29 -18
- package/dist/runtime/streams/session-actor-coordinator.js +34 -37
- package/dist/runtime/streams/session-context.js +30 -28
- 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.js +11 -5
- package/dist/runtime/streams/stream-session-runtime.js +70 -66
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +2 -2
- 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 +1 -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 +0 -1
- 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 +138 -130
- 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 +5 -4
- 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 +351 -320
- 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 +73 -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 +335 -383
- 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 +40 -42
- 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 +215 -197
- 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 +11 -8
- 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/flow-context.ts +12 -3
- 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 +95 -76
- 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 -51
- 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 +312 -385
- 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 +1 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1174 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +157 -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 +1 -1
- 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 +593 -563
- 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 +184 -153
- package/src/runtime/spots/spot-actor-packet-drain.ts +54 -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 +230 -221
- 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 +128 -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 +11 -17
- 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 +56 -46
- package/src/runtime/spots/spot-timer.ts +98 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +277 -235
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +7 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +53 -51
- package/src/runtime/streams/bound-session-response-target.ts +29 -8
- package/src/runtime/streams/bound-session-service.ts +39 -39
- package/src/runtime/streams/index.ts +176 -100
- package/src/runtime/streams/managed-stream.ts +98 -87
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +73 -43
- package/src/runtime/streams/session-actor-coordinator.ts +97 -89
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +66 -48
- 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 +55 -38
- package/src/runtime/streams/stream-session-runtime.ts +268 -210
- package/src/runtime/workers/index.ts +68 -29
|
@@ -97,16 +97,13 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
97
97
|
break;
|
|
98
98
|
excludedNodeRids.add(String(target.nodeRid));
|
|
99
99
|
}
|
|
100
|
-
if (reserved.kind === 'alreadyExists'
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const current = reserved.kind === 'alreadyExists'
|
|
106
|
-
|
|
107
|
-
: reserved.current;
|
|
108
|
-
if (current.kind === 'snapshot'
|
|
109
|
-
&& current.allocation.state === 'active') {
|
|
100
|
+
if (reserved.kind === 'alreadyExists' ||
|
|
101
|
+
(reserved.kind === 'conflict' &&
|
|
102
|
+
reserved.current.kind === 'snapshot' &&
|
|
103
|
+
reserved.current.allocation.objectKind === 'user_spot' &&
|
|
104
|
+
reserved.current.allocation.stableType === request.stableType)) {
|
|
105
|
+
const current = reserved.kind === 'alreadyExists' ? reserved.current : reserved.current;
|
|
106
|
+
if (current.kind === 'snapshot' && current.allocation.state === 'active') {
|
|
110
107
|
if (request.generatedIdentity === true) {
|
|
111
108
|
deadline.close();
|
|
112
109
|
throw spotIdConflict(request.spotId);
|
|
@@ -118,8 +115,7 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
118
115
|
spot
|
|
119
116
|
};
|
|
120
117
|
}
|
|
121
|
-
if (current.kind !== 'snapshot'
|
|
122
|
-
|| !sameCreationTarget(current, authorityTarget)) {
|
|
118
|
+
if (current.kind !== 'snapshot' || !sameCreationTarget(current, authorityTarget)) {
|
|
123
119
|
deadline.close();
|
|
124
120
|
if (request.generatedIdentity === true) {
|
|
125
121
|
throw spotIdConflict(request.spotId);
|
|
@@ -136,9 +132,7 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
136
132
|
}
|
|
137
133
|
if (current.allocation.state === 'reserved' && target.isLocal) {
|
|
138
134
|
const pending = current.pendingCreation;
|
|
139
|
-
const admitted = pending === undefined
|
|
140
|
-
? undefined
|
|
141
|
-
: this.localCreations.get(pending.reservationId);
|
|
135
|
+
const admitted = pending === undefined ? undefined : this.localCreations.get(pending.reservationId);
|
|
142
136
|
if (admitted === undefined) {
|
|
143
137
|
try {
|
|
144
138
|
const spot = await this.awaitReady(request, signal);
|
|
@@ -247,8 +241,8 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
247
241
|
requestPayload: Buffer.alloc(0),
|
|
248
242
|
timeoutMs: 1
|
|
249
243
|
});
|
|
250
|
-
if (String(current.allocation.descriptor.rid) !== String(spot.nodeRid)
|
|
251
|
-
|
|
244
|
+
if (String(current.allocation.descriptor.rid) !== String(spot.nodeRid) ||
|
|
245
|
+
current.allocation.descriptor.meshName !== spot.meshName) {
|
|
252
246
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale, `User Spot '${String(spot.spotId)}' owner route is stale.`);
|
|
253
247
|
}
|
|
254
248
|
return { spot: currentRef, snapshot: current };
|
|
@@ -264,11 +258,13 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
264
258
|
const result = this.materializeRemoteCreate(record, materialize, discard, signal);
|
|
265
259
|
admitted = { fingerprint, result };
|
|
266
260
|
this.remoteCreations.set(key, admitted);
|
|
267
|
-
void result
|
|
261
|
+
void result
|
|
262
|
+
.finally(() => {
|
|
268
263
|
if (this.remoteCreations.get(key)?.result === result) {
|
|
269
264
|
this.remoteCreations.delete(key);
|
|
270
265
|
}
|
|
271
|
-
})
|
|
266
|
+
})
|
|
267
|
+
.catch(() => undefined);
|
|
272
268
|
}
|
|
273
269
|
return await admitted.result;
|
|
274
270
|
}
|
|
@@ -278,11 +274,13 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
278
274
|
if (admitted === undefined) {
|
|
279
275
|
admitted = this.materializeRemoteCreate(record, materialize, discard, signal);
|
|
280
276
|
this.localCreations.set(key, admitted);
|
|
281
|
-
void admitted
|
|
277
|
+
void admitted
|
|
278
|
+
.finally(() => {
|
|
282
279
|
if (this.localCreations.get(key) === admitted) {
|
|
283
280
|
this.localCreations.delete(key);
|
|
284
281
|
}
|
|
285
|
-
})
|
|
282
|
+
})
|
|
283
|
+
.catch(() => undefined);
|
|
286
284
|
}
|
|
287
285
|
return await admitted;
|
|
288
286
|
}
|
|
@@ -291,21 +289,20 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
291
289
|
const current = await this.options.store.readAuthority(key, signal);
|
|
292
290
|
const exactIdentity = current.kind !== 'snapshot'
|
|
293
291
|
? false
|
|
294
|
-
: current.allocation.objectKind === 'user_spot'
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
=== record.reservation.pendingCapacityDelta;
|
|
292
|
+
: current.allocation.objectKind === 'user_spot' &&
|
|
293
|
+
current.allocation.stableType === record.stableType &&
|
|
294
|
+
current.objectGeneration === record.reservation.objectGeneration &&
|
|
295
|
+
current.authorityOwnerGeneration === record.reservation.authorityOwnerGeneration &&
|
|
296
|
+
String(current.allocation.descriptor.rid) === record.reservation.targetNodeRid &&
|
|
297
|
+
current.allocation.descriptorLifecycleGeneration ===
|
|
298
|
+
record.reservation.targetNodeGeneration &&
|
|
299
|
+
current.ownerId === record.reservation.targetOwnerId &&
|
|
300
|
+
current.ownerLeaseGeneration === record.reservation.targetOwnerLeaseGeneration &&
|
|
301
|
+
current.allocation.capacity.actors === 0 &&
|
|
302
|
+
current.allocation.capacity.spots === record.reservation.pendingCapacityDelta &&
|
|
303
|
+
current.allocation.capacity.spotType?.objectKind === 'user_spot' &&
|
|
304
|
+
current.allocation.capacity.spotType.stableType === record.stableType &&
|
|
305
|
+
current.allocation.capacity.spotType.count === record.reservation.pendingCapacityDelta;
|
|
309
306
|
if (!exactIdentity || current.kind !== 'snapshot') {
|
|
310
307
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, 'Remote User Spot reservation fence is stale.');
|
|
311
308
|
}
|
|
@@ -329,8 +326,7 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
329
326
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, 'Remote User Spot Pending StoreVersion is stale.');
|
|
330
327
|
}
|
|
331
328
|
const pending = current.pendingCreation;
|
|
332
|
-
if (pending === undefined
|
|
333
|
-
|| pending.reservationId !== record.reservation.reservationId) {
|
|
329
|
+
if (pending === undefined || pending.reservationId !== record.reservation.reservationId) {
|
|
334
330
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestFailed, 'Remote User Spot Pending creation projection is missing.');
|
|
335
331
|
}
|
|
336
332
|
const requestPayload = decodeLocationCreationContent(pending.requestContentReference, pending.requestSha256, pending.requestEncodedSize);
|
|
@@ -427,7 +423,7 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
427
423
|
cleanupDeadline.close();
|
|
428
424
|
const cleanupErrors = cleanup
|
|
429
425
|
.filter((item) => item.status === 'rejected')
|
|
430
|
-
.map(item => item.reason);
|
|
426
|
+
.map((item) => item.reason);
|
|
431
427
|
if (cleanupErrors.length > 0) {
|
|
432
428
|
throw new AggregateError([error, ...cleanupErrors], 'Remote User Spot creation rollback failed.');
|
|
433
429
|
}
|
|
@@ -442,13 +438,12 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
442
438
|
if (current.objectGeneration !== record.target.objectGeneration) {
|
|
443
439
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale, `User Spot '${record.target.spotId}' generation is stale.`);
|
|
444
440
|
}
|
|
445
|
-
if (current.authorityOwnerGeneration !== record.target.authorityOwnerGeneration
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|| current.allocation.state !== 'active') {
|
|
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') {
|
|
452
447
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `User Spot '${record.target.spotId}' close authority is moving.`, true);
|
|
453
448
|
}
|
|
454
449
|
const spot = {
|
|
@@ -482,9 +477,9 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
482
477
|
}
|
|
483
478
|
async beginClosing(key, current, spotId, signal) {
|
|
484
479
|
const ready = (0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)(current.payload);
|
|
485
|
-
if (ready?.kind !== 'user_spot'
|
|
486
|
-
|
|
487
|
-
|
|
480
|
+
if (ready?.kind !== 'user_spot' ||
|
|
481
|
+
ready.spotId !== spotId ||
|
|
482
|
+
ready.stableType !== current.allocation.stableType) {
|
|
488
483
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `User Spot '${spotId}' is not in Framework-owned Ready state.`, true);
|
|
489
484
|
}
|
|
490
485
|
const closing = await this.options.store.compareExchangeAuthority(key, current.storeVersion, {
|
|
@@ -547,8 +542,7 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
547
542
|
},
|
|
548
543
|
deadlineUnixMs: BigInt(deadlineUnixMs)
|
|
549
544
|
}, timeoutMs);
|
|
550
|
-
if (result.terminalResult !== 0
|
|
551
|
-
|| result.tail?.kind !== 'userSpotCreate') {
|
|
545
|
+
if (result.terminalResult !== 0 || result.tail?.kind !== 'userSpotCreate') {
|
|
552
546
|
throw remoteUserSpotFailure(result.terminalResult, result.failureCode, 'Remote User Spot creation failed.');
|
|
553
547
|
}
|
|
554
548
|
const spot = {
|
|
@@ -569,8 +563,8 @@ class ZLinkUserSpotCreationCoordinator {
|
|
|
569
563
|
...(result.payload === undefined
|
|
570
564
|
? {}
|
|
571
565
|
: {
|
|
572
|
-
reply: this.options.decodeRemoteReply?.(result.payload.payload)
|
|
573
|
-
|
|
566
|
+
reply: this.options.decodeRemoteReply?.(result.payload.payload) ??
|
|
567
|
+
Buffer.from(result.payload.payload)
|
|
574
568
|
})
|
|
575
569
|
},
|
|
576
570
|
spot
|
|
@@ -596,12 +590,12 @@ function readySpotRoute(spotId, snapshot) {
|
|
|
596
590
|
}
|
|
597
591
|
function spotRef(snapshot, request, allowPending = false) {
|
|
598
592
|
const decoded = (0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)(snapshot.payload);
|
|
599
|
-
if (
|
|
600
|
-
?
|
|
601
|
-
|
|
602
|
-
:
|
|
603
|
-
|
|
604
|
-
|
|
593
|
+
if (allowPending
|
|
594
|
+
? snapshot.allocation.objectKind !== 'user_spot' ||
|
|
595
|
+
snapshot.allocation.stableType !== request.stableType
|
|
596
|
+
: decoded?.kind !== 'user_spot' ||
|
|
597
|
+
decoded.stableType !== request.stableType ||
|
|
598
|
+
decoded.spotId !== String(request.spotId)) {
|
|
605
599
|
throw new Error('User Spot Ready authority does not match the requested identity.');
|
|
606
600
|
}
|
|
607
601
|
return {
|
|
@@ -667,18 +661,18 @@ function decodeLocationCreationContent(reference, expectedSha256, expectedEncode
|
|
|
667
661
|
return payload;
|
|
668
662
|
}
|
|
669
663
|
function sameCreationTarget(snapshot, target) {
|
|
670
|
-
return snapshot.allocation.descriptor.meshName === target.meshName
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
664
|
+
return (snapshot.allocation.descriptor.meshName === target.meshName &&
|
|
665
|
+
String(snapshot.allocation.descriptor.rid) === String(target.nodeRid) &&
|
|
666
|
+
snapshot.allocation.descriptorLifecycleGeneration === target.nodeLifecycleGeneration &&
|
|
667
|
+
snapshot.ownerId === target.owner.ownerId &&
|
|
668
|
+
snapshot.ownerLeaseGeneration === target.owner.leaseGeneration);
|
|
675
669
|
}
|
|
676
670
|
function remoteCreationFingerprint(record) {
|
|
677
671
|
return JSON.stringify({
|
|
678
672
|
spotId: record.spotId,
|
|
679
673
|
stableType: record.stableType,
|
|
680
674
|
reservation: record.reservation
|
|
681
|
-
}, (_key, value) => typeof value === 'bigint' ? `${value}n` : value);
|
|
675
|
+
}, (_key, value) => (typeof value === 'bigint' ? `${value}n` : value));
|
|
682
676
|
}
|
|
683
677
|
function userSpotAuthorityPayload(snapshot, spotId, state) {
|
|
684
678
|
return (0, service_authority_payload_codec_1.encodeServiceUserSpotAuthorityPayload)({
|
|
@@ -735,10 +729,10 @@ function waitForAbort(operation, signal) {
|
|
|
735
729
|
return new Promise((resolve, reject) => {
|
|
736
730
|
const abort = () => reject(signal.reason);
|
|
737
731
|
signal.addEventListener('abort', abort, { once: true });
|
|
738
|
-
operation.then(value => {
|
|
732
|
+
operation.then((value) => {
|
|
739
733
|
signal.removeEventListener('abort', abort);
|
|
740
734
|
resolve(value);
|
|
741
|
-
}, error => {
|
|
735
|
+
}, (error) => {
|
|
742
736
|
signal.removeEventListener('abort', abort);
|
|
743
737
|
reject(error);
|
|
744
738
|
});
|
|
@@ -211,10 +211,10 @@ class ZLinkActorLocationClaims {
|
|
|
211
211
|
const current = await this.actorStore.resolveActor(key);
|
|
212
212
|
if (this.actors.get(canonical) !== tracked)
|
|
213
213
|
continue;
|
|
214
|
-
if (current === undefined
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
214
|
+
if (current === undefined ||
|
|
215
|
+
current.ownerId !== owner.ownerId ||
|
|
216
|
+
(current.leaseGeneration !== tracked.row.leaseGeneration &&
|
|
217
|
+
current.leaseGeneration !== owner.leaseGeneration)) {
|
|
218
218
|
if (this.actors.get(canonical) !== tracked)
|
|
219
219
|
continue;
|
|
220
220
|
this.actors.delete(canonical);
|
|
@@ -276,8 +276,7 @@ class ZLinkActorLocationClaims {
|
|
|
276
276
|
if (result.status === internal_location_contracts_1.ZLinkLocationWriteStatus.Stored) {
|
|
277
277
|
tracked.row = {
|
|
278
278
|
...candidate,
|
|
279
|
-
leaseGeneration: this.runtime.currentOwnerToken?.leaseGeneration
|
|
280
|
-
?? candidate.leaseGeneration,
|
|
279
|
+
leaseGeneration: this.runtime.currentOwnerToken?.leaseGeneration ?? candidate.leaseGeneration,
|
|
281
280
|
updatedAt: result.updatedAt
|
|
282
281
|
};
|
|
283
282
|
tracked.generation = result.generation;
|
|
@@ -293,14 +292,21 @@ class ZLinkActorLocationClaims {
|
|
|
293
292
|
const current = await store.readAuthority(key);
|
|
294
293
|
if (!matchesActorAuthority(current, actorRef, ownerToken))
|
|
295
294
|
return;
|
|
296
|
-
const result = await store.compareExchangeAuthority(key, current.storeVersion, {
|
|
297
|
-
|
|
295
|
+
const result = await store.compareExchangeAuthority(key, current.storeVersion, {
|
|
296
|
+
kind: 'delete'
|
|
297
|
+
});
|
|
298
|
+
if (result.kind === 'deleted' ||
|
|
299
|
+
(result.kind === 'conflict' && result.current.kind === 'missing')) {
|
|
298
300
|
return;
|
|
299
301
|
}
|
|
300
|
-
if (result.kind === 'conflict' &&
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
302
|
+
if (result.kind === 'conflict' &&
|
|
303
|
+
result.current.kind === 'snapshot' &&
|
|
304
|
+
matchesActorAuthority(result.current, actorRef, ownerToken)) {
|
|
305
|
+
const retry = await store.compareExchangeAuthority(key, result.current.storeVersion, {
|
|
306
|
+
kind: 'delete'
|
|
307
|
+
});
|
|
308
|
+
if (retry.kind === 'deleted' ||
|
|
309
|
+
(retry.kind === 'conflict' && retry.current.kind === 'missing')) {
|
|
304
310
|
return;
|
|
305
311
|
}
|
|
306
312
|
}
|
|
@@ -308,12 +314,12 @@ class ZLinkActorLocationClaims {
|
|
|
308
314
|
}
|
|
309
315
|
exports.ZLinkActorLocationClaims = ZLinkActorLocationClaims;
|
|
310
316
|
function matchesActorAuthority(current, actorRef, ownerToken) {
|
|
311
|
-
return current.kind === 'snapshot'
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
317
|
+
return (current.kind === 'snapshot' &&
|
|
318
|
+
current.ownerId === ownerToken.ownerId &&
|
|
319
|
+
current.ownerLeaseGeneration === ownerToken.leaseGeneration &&
|
|
320
|
+
current.allocation.state === 'active' &&
|
|
321
|
+
current.allocation.objectKind === 'actor' &&
|
|
322
|
+
current.objectGeneration === actorRef.objectGeneration &&
|
|
323
|
+
current.allocation.descriptor.meshName === actorRef.meshName &&
|
|
324
|
+
(0, routing_id_1.routingIdsEqual)(current.allocation.descriptor.rid, actorRef.nodeRid));
|
|
319
325
|
}
|
|
@@ -22,9 +22,9 @@ class ZLinkAggregateInventoryStore {
|
|
|
22
22
|
const tree = buildTree(request);
|
|
23
23
|
await parallelForEach(tree.pages, WRITE_CONCURRENCY, async (page) => {
|
|
24
24
|
const bytes = encode(page);
|
|
25
|
-
if (page.entries.length > MAX_PAGE_ENTRIES
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
if (page.entries.length > MAX_PAGE_ENTRIES ||
|
|
26
|
+
page.children.length > MAX_PAGE_ENTRIES ||
|
|
27
|
+
bytes.byteLength > MAX_PAGE_BYTES) {
|
|
28
28
|
throw new Error('Aggregate inventory page exceeds its encoded bounds.');
|
|
29
29
|
}
|
|
30
30
|
await putImmutable(this.provider, pageKey(fence, page.level, page.index), bytes, signal);
|
|
@@ -39,8 +39,8 @@ class ZLinkAggregateInventoryStore {
|
|
|
39
39
|
}
|
|
40
40
|
const root = decodeRoot(rootBytes);
|
|
41
41
|
validateRoot(root, fence);
|
|
42
|
-
if (expectedDeclaredDigest !== undefined
|
|
43
|
-
|
|
42
|
+
if (expectedDeclaredDigest !== undefined &&
|
|
43
|
+
!sameHash(root.declaredDigest, expectedDeclaredDigest)) {
|
|
44
44
|
throw dataLost(fence, 'declared digest does not match');
|
|
45
45
|
}
|
|
46
46
|
const entries = [];
|
|
@@ -53,26 +53,25 @@ class ZLinkAggregateInventoryStore {
|
|
|
53
53
|
throw dataLost(fence, 'page reference is duplicated');
|
|
54
54
|
visited.add(identity);
|
|
55
55
|
const bytes = await requireFound(this.provider, pageKey(fence, reference.level, reference.index), signal);
|
|
56
|
-
if (bytes.byteLength > MAX_PAGE_BYTES
|
|
57
|
-
|
|
56
|
+
if (bytes.byteLength > MAX_PAGE_BYTES ||
|
|
57
|
+
!sameHash(reference.sha256, (0, node_crypto_1.createHash)('sha256').update(bytes).digest())) {
|
|
58
58
|
throw dataLost(fence, 'page checksum is invalid');
|
|
59
59
|
}
|
|
60
60
|
const page = decodePage(bytes);
|
|
61
|
-
if (page.level !== reference.level
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
if (page.level !== reference.level ||
|
|
62
|
+
page.index !== reference.index ||
|
|
63
|
+
page.startIndex !== reference.startIndex ||
|
|
64
|
+
page.entryCount !== reference.entryCount) {
|
|
65
65
|
throw dataLost(fence, 'page metadata changed');
|
|
66
66
|
}
|
|
67
|
-
if (page.entries.length > MAX_PAGE_ENTRIES
|
|
68
|
-
|| page.children.length > MAX_PAGE_ENTRIES) {
|
|
67
|
+
if (page.entries.length > MAX_PAGE_ENTRIES || page.children.length > MAX_PAGE_ENTRIES) {
|
|
69
68
|
throw dataLost(fence, 'page entry bound is invalid');
|
|
70
69
|
}
|
|
71
70
|
observedPageCounts[page.level]++;
|
|
72
71
|
if (page.level === 0) {
|
|
73
|
-
if (page.entries.length < 1
|
|
74
|
-
|
|
75
|
-
|
|
72
|
+
if (page.entries.length < 1 ||
|
|
73
|
+
page.children.length !== 0 ||
|
|
74
|
+
page.entries.length !== page.entryCount) {
|
|
76
75
|
throw dataLost(fence, 'leaf page bounds are invalid');
|
|
77
76
|
}
|
|
78
77
|
for (let offset = 0; offset < page.entries.length; offset++) {
|
|
@@ -101,16 +100,15 @@ class ZLinkAggregateInventoryStore {
|
|
|
101
100
|
};
|
|
102
101
|
let expectedStart = 0;
|
|
103
102
|
for (const reference of root.topPages) {
|
|
104
|
-
if (reference.level !== root.topLevel
|
|
105
|
-
|| reference.startIndex !== expectedStart) {
|
|
103
|
+
if (reference.level !== root.topLevel || reference.startIndex !== expectedStart) {
|
|
106
104
|
throw dataLost(fence, 'top page references are reordered');
|
|
107
105
|
}
|
|
108
106
|
await readPage(reference);
|
|
109
107
|
expectedStart += reference.entryCount;
|
|
110
108
|
}
|
|
111
|
-
if (expectedStart !== root.totalCount
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
if (expectedStart !== root.totalCount ||
|
|
110
|
+
entries.length !== root.totalCount ||
|
|
111
|
+
observedPageCounts.some((count, level) => count !== root.pageCountsByLevel[level])) {
|
|
114
112
|
throw dataLost(fence, 'page counts do not match the root');
|
|
115
113
|
}
|
|
116
114
|
for (let level = 0; level < observedPageCounts.length; level++) {
|
|
@@ -129,7 +127,7 @@ class ZLinkAggregateInventoryStore {
|
|
|
129
127
|
if (!sameHash(root.digest, digest.digest())) {
|
|
130
128
|
throw dataLost(fence, 'inventory digest does not match');
|
|
131
129
|
}
|
|
132
|
-
return entries.map(entry => ({ ...entry }));
|
|
130
|
+
return entries.map((entry) => ({ ...entry }));
|
|
133
131
|
}
|
|
134
132
|
}
|
|
135
133
|
exports.ZLinkAggregateInventoryStore = ZLinkAggregateInventoryStore;
|
|
@@ -148,9 +146,9 @@ function buildTree(request) {
|
|
|
148
146
|
authorityPayloadSha256: sha256(participant.authorityPayload),
|
|
149
147
|
membershipMutationSha256: sha256(participant.membershipMutation)
|
|
150
148
|
}));
|
|
151
|
-
const keys = entries.map(entry => entry.authorityKey);
|
|
152
|
-
if (new Set(keys).size !== keys.length
|
|
153
|
-
|
|
149
|
+
const keys = entries.map((entry) => entry.authorityKey);
|
|
150
|
+
if (new Set(keys).size !== keys.length ||
|
|
151
|
+
keys.some((key, index) => index > 0 && keys[index - 1].localeCompare(key) >= 0)) {
|
|
154
152
|
throw new TypeError('Aggregate participants must be unique and canonically sorted.');
|
|
155
153
|
}
|
|
156
154
|
const digest = (0, node_crypto_1.createHash)('sha256');
|
|
@@ -159,9 +157,9 @@ function buildTree(request) {
|
|
|
159
157
|
const pages = [];
|
|
160
158
|
let references = packLeafPages(entries, pages);
|
|
161
159
|
let level = 0;
|
|
162
|
-
while (references.length > MAX_PAGE_ENTRIES
|
|
163
|
-
|
|
164
|
-
|
|
160
|
+
while (references.length > MAX_PAGE_ENTRIES ||
|
|
161
|
+
encode(rootCandidate(entries.length, level, references, pages, '', '')).byteLength >
|
|
162
|
+
MAX_PAGE_BYTES) {
|
|
165
163
|
level++;
|
|
166
164
|
if (level >= MAX_TREE_LEVELS) {
|
|
167
165
|
throw new RangeError('Aggregate inventory tree exceeds 32 levels.');
|
|
@@ -252,23 +250,23 @@ function rootCandidate(totalCount, topLevel, topPages, pages, digest, declaredDi
|
|
|
252
250
|
};
|
|
253
251
|
}
|
|
254
252
|
function validateRoot(root, fence) {
|
|
255
|
-
if (!Number.isSafeInteger(root.totalCount)
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
253
|
+
if (!Number.isSafeInteger(root.totalCount) ||
|
|
254
|
+
root.totalCount < 1 ||
|
|
255
|
+
!isSha256(root.digest) ||
|
|
256
|
+
!isSha256(root.declaredDigest) ||
|
|
257
|
+
!Number.isSafeInteger(root.topLevel) ||
|
|
258
|
+
root.topLevel < 0 ||
|
|
259
|
+
root.topLevel >= MAX_TREE_LEVELS ||
|
|
260
|
+
root.topPages.length < 1 ||
|
|
261
|
+
root.topPages.length > MAX_PAGE_ENTRIES ||
|
|
262
|
+
root.pageCountsByLevel.length !== root.topLevel + 1 ||
|
|
263
|
+
root.pageCountsByLevel.some((count) => !Number.isSafeInteger(count) || count < 1 || count > root.totalCount)) {
|
|
266
264
|
throw dataLost(fence, 'root metadata is invalid');
|
|
267
265
|
}
|
|
268
266
|
const leafPages = root.pageCountsByLevel[0];
|
|
269
|
-
if (leafPages > root.totalCount
|
|
270
|
-
|
|
271
|
-
|
|
267
|
+
if (leafPages > root.totalCount ||
|
|
268
|
+
root.totalCount > leafPages * MAX_PAGE_ENTRIES ||
|
|
269
|
+
root.topPages.length !== root.pageCountsByLevel[root.topLevel]) {
|
|
272
270
|
throw dataLost(fence, 'root page counts are invalid');
|
|
273
271
|
}
|
|
274
272
|
for (let level = 1; level < root.pageCountsByLevel.length; level++) {
|
|
@@ -280,26 +278,26 @@ function validateRoot(root, fence) {
|
|
|
280
278
|
}
|
|
281
279
|
}
|
|
282
280
|
function validateReference(reference, root, fence) {
|
|
283
|
-
if (!Number.isSafeInteger(reference.level)
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
281
|
+
if (!Number.isSafeInteger(reference.level) ||
|
|
282
|
+
reference.level < 0 ||
|
|
283
|
+
reference.level > root.topLevel ||
|
|
284
|
+
!Number.isSafeInteger(reference.index) ||
|
|
285
|
+
reference.index < 0 ||
|
|
286
|
+
!Number.isSafeInteger(reference.startIndex) ||
|
|
287
|
+
reference.startIndex < 0 ||
|
|
288
|
+
!Number.isSafeInteger(reference.entryCount) ||
|
|
289
|
+
reference.entryCount < 1 ||
|
|
290
|
+
!isSha256(reference.sha256)) {
|
|
293
291
|
throw dataLost(fence, 'page reference is invalid');
|
|
294
292
|
}
|
|
295
293
|
}
|
|
296
294
|
function validateEntry(entry, index, fence) {
|
|
297
|
-
if (entry.index !== index
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
295
|
+
if (entry.index !== index ||
|
|
296
|
+
entry.authorityKey.length < 1 ||
|
|
297
|
+
entry.expectedStoreVersion.length < 1 ||
|
|
298
|
+
!['preserve', 'newOwner'].includes(entry.ownerTransition) ||
|
|
299
|
+
!isSha256(entry.authorityPayloadSha256) ||
|
|
300
|
+
!isSha256(entry.membershipMutationSha256)) {
|
|
303
301
|
throw dataLost(fence, 'inventory entry is invalid or reordered');
|
|
304
302
|
}
|
|
305
303
|
}
|
|
@@ -311,8 +309,7 @@ async function putImmutable(provider, key, bytes, signal) {
|
|
|
311
309
|
if (result.kind === 'applied')
|
|
312
310
|
return;
|
|
313
311
|
const current = await provider.read(key, signal);
|
|
314
|
-
if (current.kind !== 'found'
|
|
315
|
-
|| !Buffer.from(current.value.bytes).equals(Buffer.from(bytes))) {
|
|
312
|
+
if (current.kind !== 'found' || !Buffer.from(current.value.bytes).equals(Buffer.from(bytes))) {
|
|
316
313
|
throw new Error(`Immutable aggregate inventory value changed: ${key.value}.`);
|
|
317
314
|
}
|
|
318
315
|
}
|
|
@@ -325,24 +322,24 @@ async function requireFound(provider, key, signal) {
|
|
|
325
322
|
}
|
|
326
323
|
function decodeRoot(bytes) {
|
|
327
324
|
const value = JSON.parse(Buffer.from(bytes).toString('utf8'));
|
|
328
|
-
if (value === null
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
325
|
+
if (value === null ||
|
|
326
|
+
typeof value !== 'object' ||
|
|
327
|
+
!('kind' in value) ||
|
|
328
|
+
value.kind !== 'aggregate-inventory-root-v1') {
|
|
332
329
|
throw new Error('Invalid inventory root.');
|
|
333
330
|
}
|
|
334
331
|
return value;
|
|
335
332
|
}
|
|
336
333
|
function decodePage(bytes) {
|
|
337
334
|
const value = JSON.parse(Buffer.from(bytes).toString('utf8'));
|
|
338
|
-
if (value === null
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
335
|
+
if (value === null ||
|
|
336
|
+
typeof value !== 'object' ||
|
|
337
|
+
!('kind' in value) ||
|
|
338
|
+
value.kind !== 'aggregate-inventory-page-v1' ||
|
|
339
|
+
!('entries' in value) ||
|
|
340
|
+
!Array.isArray(value.entries) ||
|
|
341
|
+
!('children' in value) ||
|
|
342
|
+
!Array.isArray(value.children)) {
|
|
346
343
|
throw new Error('Invalid inventory page.');
|
|
347
344
|
}
|
|
348
345
|
return value;
|
|
@@ -381,9 +378,9 @@ function isSha256(value) {
|
|
|
381
378
|
return typeof value === 'string' && /^[0-9a-f]{64}$/.test(value);
|
|
382
379
|
}
|
|
383
380
|
function sameHash(expected, actual) {
|
|
384
|
-
return isSha256(expected)
|
|
385
|
-
|
|
386
|
-
|
|
381
|
+
return (isSha256(expected) &&
|
|
382
|
+
actual.byteLength === 32 &&
|
|
383
|
+
(0, node_crypto_1.timingSafeEqual)(Buffer.from(expected, 'hex'), Buffer.from(actual)));
|
|
387
384
|
}
|
|
388
385
|
function dataLost(fence, reason) {
|
|
389
386
|
return new Error(`Aggregate '${fence.aggregateId.value}:${fence.aggregateGeneration}' inventory ${reason}.`);
|
|
@@ -68,11 +68,11 @@ function percentEncode(bytes) {
|
|
|
68
68
|
return result;
|
|
69
69
|
}
|
|
70
70
|
function isUnreserved(byte) {
|
|
71
|
-
return byte >= 0x41 && byte <= 0x5a
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
71
|
+
return ((byte >= 0x41 && byte <= 0x5a) ||
|
|
72
|
+
(byte >= 0x61 && byte <= 0x7a) ||
|
|
73
|
+
(byte >= 0x30 && byte <= 0x39) ||
|
|
74
|
+
byte === 0x2d ||
|
|
75
|
+
byte === 0x2e ||
|
|
76
|
+
byte === 0x5f ||
|
|
77
|
+
byte === 0x7e);
|
|
78
78
|
}
|
|
@@ -67,9 +67,9 @@ class ZLinkAutoConnectLoop {
|
|
|
67
67
|
const liveOwners = this.leaseTracker === undefined
|
|
68
68
|
? 0
|
|
69
69
|
: await this.leaseTracker.getLiveOwnerSetVersion(signal);
|
|
70
|
-
if (this.lastStamp === stamp
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
if (this.lastStamp === stamp &&
|
|
71
|
+
this.lastLiveOwnerSetVersion === liveOwners &&
|
|
72
|
+
this.reconciler.localPublicationReady) {
|
|
73
73
|
return;
|
|
74
74
|
}
|
|
75
75
|
const tickFailed = await this.runReconcile(signal);
|