@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
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
ApplicationJobRecordLease
|
|
3
|
-
} from '../application-jobs/application-ingress-record-owner';
|
|
1
|
+
import type { ApplicationJobRecordLease } from '../application-jobs/application-ingress-record-owner';
|
|
4
2
|
|
|
5
3
|
export type ServiceMailboxDomain = 'application' | 'infrastructure';
|
|
6
4
|
|
|
@@ -59,12 +57,15 @@ interface DomainState {
|
|
|
59
57
|
export class ServiceMailbox {
|
|
60
58
|
private readonly application: DomainState;
|
|
61
59
|
private readonly infrastructure: DomainState;
|
|
62
|
-
private readonly relocationSeals = new Map<
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
private readonly relocationSeals = new Map<
|
|
61
|
+
string,
|
|
62
|
+
{
|
|
63
|
+
readonly serial: bigint;
|
|
64
|
+
readonly captured: ServiceMailboxRecord[];
|
|
65
|
+
readonly held: ServiceMailboxRecord[];
|
|
66
|
+
heldBytes: number;
|
|
67
|
+
}
|
|
68
|
+
>();
|
|
68
69
|
private readonly relocatedOwners = new Set<string>();
|
|
69
70
|
private nextClaimSerial = 1n;
|
|
70
71
|
private nextRelocationSerial = 1n;
|
|
@@ -154,10 +155,7 @@ export class ServiceMailbox {
|
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
|
|
157
|
-
release(
|
|
158
|
-
claim: ServiceMailboxClaim,
|
|
159
|
-
remaining: readonly ServiceMailboxRecord[] = []
|
|
160
|
-
): boolean {
|
|
158
|
+
release(claim: ServiceMailboxClaim, remaining: readonly ServiceMailboxRecord[] = []): boolean {
|
|
161
159
|
const target = this.domain(claim.domain);
|
|
162
160
|
const queue = target.owners.get(claim.owner);
|
|
163
161
|
if (queue === undefined || !queue.claimed || queue.claimSerial !== claim.serial) return false;
|
|
@@ -217,7 +215,9 @@ export class ServiceMailbox {
|
|
|
217
215
|
return true;
|
|
218
216
|
}
|
|
219
217
|
|
|
220
|
-
commitRelocation(
|
|
218
|
+
commitRelocation(
|
|
219
|
+
seal: ServiceMailboxRelocationSeal
|
|
220
|
+
): readonly ServiceMailboxRecord[] | undefined {
|
|
221
221
|
const current = this.relocationSeals.get(seal.owner);
|
|
222
222
|
if (current === undefined || current.serial !== seal.serial) return undefined;
|
|
223
223
|
this.relocationSeals.delete(seal.owner);
|
|
@@ -5,8 +5,7 @@ const detachedStateLaneResource = new AsyncResource('zlink:service-maintenance-r
|
|
|
5
5
|
|
|
6
6
|
export type ServiceMaintenanceKind = 'retire' | 'shutdown';
|
|
7
7
|
export type ServiceMaintenanceState =
|
|
8
|
-
|
|
9
|
-
| 'completed' | 'blocked' | 'forceStopped';
|
|
8
|
+
'serving' | 'preparing' | 'retiring' | 'draining' | 'completed' | 'blocked' | 'forceStopped';
|
|
10
9
|
|
|
11
10
|
export interface ServiceRelocationUnit {
|
|
12
11
|
readonly id: string;
|
|
@@ -104,7 +103,10 @@ export class ServiceMaintenanceRuntime {
|
|
|
104
103
|
abortSignal?: AbortSignal
|
|
105
104
|
): Promise<ServiceMaintenanceSnapshot> {
|
|
106
105
|
const controller = new AbortController();
|
|
107
|
-
const timer = setTimeout(
|
|
106
|
+
const timer = setTimeout(
|
|
107
|
+
() => controller.abort(new Error('Maintenance deadline exceeded.')),
|
|
108
|
+
deadlineMs
|
|
109
|
+
);
|
|
108
110
|
const abort = () => controller.abort(abortSignal?.reason);
|
|
109
111
|
if (abortSignal?.aborted === true) {
|
|
110
112
|
abort();
|
|
@@ -113,7 +115,7 @@ export class ServiceMaintenanceRuntime {
|
|
|
113
115
|
}
|
|
114
116
|
try {
|
|
115
117
|
this.transition('preparing');
|
|
116
|
-
if (!await this.options.preflight(kind, controller.signal)) {
|
|
118
|
+
if (!(await this.options.preflight(kind, controller.signal))) {
|
|
117
119
|
return await this.transitionAsync('blocked');
|
|
118
120
|
}
|
|
119
121
|
if (kind === 'retire') {
|
|
@@ -141,10 +143,7 @@ export class ServiceMaintenanceRuntime {
|
|
|
141
143
|
}
|
|
142
144
|
}
|
|
143
145
|
|
|
144
|
-
private async runUnits(
|
|
145
|
-
signal: AbortSignal,
|
|
146
|
-
stopStartingSignal?: AbortSignal
|
|
147
|
-
): Promise<void> {
|
|
146
|
+
private async runUnits(signal: AbortSignal, stopStartingSignal?: AbortSignal): Promise<void> {
|
|
148
147
|
const pending = new Set<Promise<void>>();
|
|
149
148
|
for (;;) {
|
|
150
149
|
const queued = await this.lane.run(() => this.units.length > 0);
|
|
@@ -155,7 +154,7 @@ export class ServiceMaintenanceRuntime {
|
|
|
155
154
|
stopStartingSignal.throwIfAborted();
|
|
156
155
|
}
|
|
157
156
|
let admitted = false;
|
|
158
|
-
for (let index = 0
|
|
157
|
+
for (let index = 0; ;) {
|
|
159
158
|
if (stopStartingSignal?.aborted === true) break;
|
|
160
159
|
const unit = await this.lane.run(() => this.units.at(index));
|
|
161
160
|
if (unit === undefined) break;
|
|
@@ -173,14 +172,16 @@ export class ServiceMaintenanceRuntime {
|
|
|
173
172
|
if (!claim.claimed || claim.publication === undefined) continue;
|
|
174
173
|
admitted = true;
|
|
175
174
|
let running!: Promise<void>;
|
|
176
|
-
running = startOutsideStateLane(() =>
|
|
177
|
-
|
|
178
|
-
this.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
175
|
+
running = startOutsideStateLane(() =>
|
|
176
|
+
unit.relocate(signal).finally(async () => {
|
|
177
|
+
const publication = await this.lane.run(() => {
|
|
178
|
+
this.activeOutbound--;
|
|
179
|
+
pending.delete(running);
|
|
180
|
+
return this.publishCore();
|
|
181
|
+
});
|
|
182
|
+
this.notify(publication);
|
|
183
|
+
})
|
|
184
|
+
);
|
|
184
185
|
pending.add(running);
|
|
185
186
|
this.notify(claim.publication);
|
|
186
187
|
}
|
|
@@ -197,7 +198,9 @@ export class ServiceMaintenanceRuntime {
|
|
|
197
198
|
this.publish();
|
|
198
199
|
}
|
|
199
200
|
|
|
200
|
-
private async transitionAsync(
|
|
201
|
+
private async transitionAsync(
|
|
202
|
+
state: ServiceMaintenanceState
|
|
203
|
+
): Promise<ServiceMaintenanceSnapshot> {
|
|
201
204
|
const publication = await this.lane.run(() => {
|
|
202
205
|
this.state = state;
|
|
203
206
|
return this.publishCore();
|
|
@@ -236,7 +239,5 @@ export function classifyRelocationRecovery(
|
|
|
236
239
|
inventoryMatches: boolean
|
|
237
240
|
): 'resume' | 'orphan' | 'relocationDataLost' {
|
|
238
241
|
if (!publishedReference) return payloadPresent ? 'orphan' : 'resume';
|
|
239
|
-
return payloadPresent && checksumMatches && inventoryMatches
|
|
240
|
-
? 'resume'
|
|
241
|
-
: 'relocationDataLost';
|
|
242
|
+
return payloadPresent && checksumMatches && inventoryMatches ? 'resume' : 'relocationDataLost';
|
|
242
243
|
}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
const MAX_METADATA_BYTES = 1024;
|
|
2
2
|
const FATAL_UTF8 = new TextDecoder('utf-8', { fatal: true });
|
|
3
3
|
|
|
4
|
-
export function encodeServiceMetadataFrame(
|
|
5
|
-
entries: ReadonlyMap<string, string>
|
|
6
|
-
): Buffer {
|
|
4
|
+
export function encodeServiceMetadataFrame(entries: ReadonlyMap<string, string>): Buffer {
|
|
7
5
|
if (entries.size > 0xff) {
|
|
8
6
|
throw new RangeError('Application metadata contains more than 255 entries.');
|
|
9
7
|
}
|
|
@@ -61,12 +59,7 @@ export function validateServiceMetadataFrame(frame: Uint8Array): Buffer {
|
|
|
61
59
|
return Buffer.from(bytes);
|
|
62
60
|
}
|
|
63
61
|
|
|
64
|
-
function textBytes(
|
|
65
|
-
value: string,
|
|
66
|
-
minimum: number,
|
|
67
|
-
maximum: number,
|
|
68
|
-
name: string
|
|
69
|
-
): Buffer {
|
|
62
|
+
function textBytes(value: string, minimum: number, maximum: number, name: string): Buffer {
|
|
70
63
|
const bytes = Buffer.from(value, 'utf8');
|
|
71
64
|
if (bytes.byteLength < minimum || bytes.byteLength > maximum || bytes.includes(0)) {
|
|
72
65
|
throw new RangeError(`${name} must contain ${minimum}..${maximum} UTF-8 bytes without NUL.`);
|
|
@@ -8,11 +8,11 @@ import type {
|
|
|
8
8
|
ZLinkLocationOwnerToken,
|
|
9
9
|
ZLinkMeshNodeDescriptorKey
|
|
10
10
|
} from '../locations/internal-location-contracts';
|
|
11
|
-
import type {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} from './service-relocation-runtime';
|
|
11
|
+
import type {
|
|
12
|
+
ZLinkAuthorityStore,
|
|
13
|
+
ZLinkObjectCreationStore
|
|
14
|
+
} from '../locations/internal-store-contracts';
|
|
15
|
+
import { inventoryDigest, type ServiceRelocationEnvelope } from './service-relocation-runtime';
|
|
16
16
|
|
|
17
17
|
export interface ServiceRelocationAggregateParticipantPlan {
|
|
18
18
|
readonly key: ZLinkAuthorityKey;
|
|
@@ -39,7 +39,8 @@ export interface ServicePreparedRelocationAggregate {
|
|
|
39
39
|
type AggregateStore = Pick<
|
|
40
40
|
ZLinkObjectCreationStore,
|
|
41
41
|
'prepareAggregate' | 'commitAggregate' | 'abortAggregate'
|
|
42
|
-
> &
|
|
42
|
+
> &
|
|
43
|
+
Pick<ZLinkAuthorityStore, 'readAuthority'>;
|
|
43
44
|
|
|
44
45
|
const MAX_PREPARE_CONFLICT_ATTEMPTS = 8;
|
|
45
46
|
|
|
@@ -76,7 +77,7 @@ export class ServiceRelocationAggregateCommitter {
|
|
|
76
77
|
// A heartbeat can change one of those versions while every authority
|
|
77
78
|
// row remains the exact Store-confirmed value in this plan. Retry only
|
|
78
79
|
// that coordination loss; a changed authority row leaves immediately.
|
|
79
|
-
if (!await this.authorityStoreVersionsUnchanged(plan, signal)) break;
|
|
80
|
+
if (!(await this.authorityStoreVersionsUnchanged(plan, signal))) break;
|
|
80
81
|
signal?.throwIfAborted();
|
|
81
82
|
result = await this.store.prepareAggregate(request, signal);
|
|
82
83
|
}
|
|
@@ -84,8 +85,8 @@ export class ServiceRelocationAggregateCommitter {
|
|
|
84
85
|
throw new Error(`Location Store rejected relocation aggregate prepare: ${result.kind}.`);
|
|
85
86
|
}
|
|
86
87
|
if (
|
|
87
|
-
result.fence.aggregateId.value !== aggregateId.value
|
|
88
|
-
|
|
88
|
+
result.fence.aggregateId.value !== aggregateId.value ||
|
|
89
|
+
result.fence.aggregateGeneration !== plan.envelope.aggregateGeneration
|
|
89
90
|
) {
|
|
90
91
|
throw new Error('Location Store returned a different relocation aggregate fence.');
|
|
91
92
|
}
|
|
@@ -99,8 +100,8 @@ export class ServiceRelocationAggregateCommitter {
|
|
|
99
100
|
for (const participant of plan.participants) {
|
|
100
101
|
const current = await this.store.readAuthority(participant.key, signal);
|
|
101
102
|
if (
|
|
102
|
-
current.kind !== 'snapshot'
|
|
103
|
-
|
|
103
|
+
current.kind !== 'snapshot' ||
|
|
104
|
+
current.storeVersion.value !== participant.expected.storeVersion.value
|
|
104
105
|
) {
|
|
105
106
|
return false;
|
|
106
107
|
}
|
|
@@ -125,10 +126,7 @@ export class ServiceRelocationAggregateCommitter {
|
|
|
125
126
|
return await this.readCommittedParticipants(prepared.plan, signal);
|
|
126
127
|
}
|
|
127
128
|
|
|
128
|
-
async abort(
|
|
129
|
-
prepared: ServicePreparedRelocationAggregate,
|
|
130
|
-
signal?: AbortSignal
|
|
131
|
-
): Promise<void> {
|
|
129
|
+
async abort(prepared: ServicePreparedRelocationAggregate, signal?: AbortSignal): Promise<void> {
|
|
132
130
|
const result = await this.store.abortAggregate(prepared.fence, signal);
|
|
133
131
|
if (result.kind !== 'aborted' && result.kind !== 'alreadyAborted') {
|
|
134
132
|
throw new Error(`Location Store rejected relocation aggregate abort: ${result.kind}.`);
|
|
@@ -150,25 +148,27 @@ export class ServiceRelocationAggregateCommitter {
|
|
|
150
148
|
for (const participant of plan.participants) {
|
|
151
149
|
const current = await this.store.readAuthority(participant.key, signal);
|
|
152
150
|
if (
|
|
153
|
-
current.kind !== 'snapshot'
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
151
|
+
current.kind !== 'snapshot' ||
|
|
152
|
+
current.objectGeneration !== participant.expected.objectGeneration ||
|
|
153
|
+
current.storeVersion.value === participant.expected.storeVersion.value ||
|
|
154
|
+
!Buffer.from(current.payload).equals(Buffer.from(participant.authorityPayload))
|
|
157
155
|
) {
|
|
158
|
-
throw new Error(
|
|
156
|
+
throw new Error(
|
|
157
|
+
'Committed relocation aggregate does not match its exact participant plan.'
|
|
158
|
+
);
|
|
159
159
|
}
|
|
160
160
|
if (participant.ownerTransition === 'newOwner') {
|
|
161
161
|
if (
|
|
162
|
-
current.ownerId !== plan.targetOwner.ownerId
|
|
163
|
-
|
|
164
|
-
|
|
162
|
+
current.ownerId !== plan.targetOwner.ownerId ||
|
|
163
|
+
current.ownerLeaseGeneration !== plan.targetOwner.leaseGeneration ||
|
|
164
|
+
current.authorityOwnerGeneration <= participant.expected.authorityOwnerGeneration
|
|
165
165
|
) {
|
|
166
166
|
throw new Error('Committed relocation participant has a different owner fence.');
|
|
167
167
|
}
|
|
168
168
|
} else if (
|
|
169
|
-
current.ownerId !== participant.expected.ownerId
|
|
170
|
-
|
|
171
|
-
|
|
169
|
+
current.ownerId !== participant.expected.ownerId ||
|
|
170
|
+
current.ownerLeaseGeneration !== participant.expected.ownerLeaseGeneration ||
|
|
171
|
+
current.authorityOwnerGeneration !== participant.expected.authorityOwnerGeneration
|
|
172
172
|
) {
|
|
173
173
|
throw new Error('Preserved relocation participant changed its owner fence.');
|
|
174
174
|
}
|
|
@@ -181,21 +181,22 @@ export class ServiceRelocationAggregateCommitter {
|
|
|
181
181
|
function validateAndEncodeParticipants(
|
|
182
182
|
plan: ServiceRelocationAggregatePlan
|
|
183
183
|
): readonly ZLinkAggregateParticipant[] {
|
|
184
|
-
const envelopeByKey = new Map(plan.envelope.participants.map(value => [value.key, value]));
|
|
184
|
+
const envelopeByKey = new Map(plan.envelope.participants.map((value) => [value.key, value]));
|
|
185
185
|
const ordered = [...plan.participants].sort((left, right) =>
|
|
186
|
-
left.key.value.localeCompare(right.key.value)
|
|
186
|
+
left.key.value.localeCompare(right.key.value)
|
|
187
|
+
);
|
|
187
188
|
if (
|
|
188
|
-
ordered.length !== plan.envelope.participants.length
|
|
189
|
-
|
|
189
|
+
ordered.length !== plan.envelope.participants.length ||
|
|
190
|
+
new Set(ordered.map(({ key }) => key.value)).size !== ordered.length
|
|
190
191
|
) {
|
|
191
192
|
throw new TypeError('Relocation aggregate plan must cover every participant exactly once.');
|
|
192
193
|
}
|
|
193
|
-
return ordered.map(participant => {
|
|
194
|
+
return ordered.map((participant) => {
|
|
194
195
|
const envelope = envelopeByKey.get(participant.key.value);
|
|
195
196
|
if (
|
|
196
|
-
envelope === undefined
|
|
197
|
-
|
|
198
|
-
|
|
197
|
+
envelope === undefined ||
|
|
198
|
+
envelope.objectGeneration !== participant.expected.objectGeneration ||
|
|
199
|
+
envelope.authorityOwnerGeneration !== participant.expected.authorityOwnerGeneration
|
|
199
200
|
) {
|
|
200
201
|
throw new TypeError('Relocation aggregate participant fence differs from its envelope.');
|
|
201
202
|
}
|
|
@@ -210,8 +211,10 @@ function validateAndEncodeParticipants(
|
|
|
210
211
|
}
|
|
211
212
|
|
|
212
213
|
function aggregateIdentity(value: string): ZLinkAggregateId {
|
|
213
|
-
if (
|
|
214
|
-
|
|
214
|
+
if (
|
|
215
|
+
!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(value) ||
|
|
216
|
+
/^0{8}-0{4}-0{4}-0{4}-0{12}$/.test(value)
|
|
217
|
+
) {
|
|
215
218
|
throw new TypeError('Relocation aggregate id must be a lowercase non-zero 128-bit identity.');
|
|
216
219
|
}
|
|
217
220
|
return { value } as ZLinkAggregateId;
|
|
@@ -6,10 +6,7 @@ export interface ServiceRelocationStaging {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export interface ServiceRelocationRestoreOwner<TStaging extends ServiceRelocationStaging> {
|
|
9
|
-
prepare(
|
|
10
|
-
envelope: ServiceRelocationEnvelope,
|
|
11
|
-
signal?: AbortSignal
|
|
12
|
-
): Promise<TStaging>;
|
|
9
|
+
prepare(envelope: ServiceRelocationEnvelope, signal?: AbortSignal): Promise<TStaging>;
|
|
13
10
|
publish(
|
|
14
11
|
staging: TStaging,
|
|
15
12
|
authority: ZLinkAuthoritySnapshot,
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
ZLinkAuthorityKey,
|
|
3
|
+
ZLinkAuthoritySnapshot
|
|
4
|
+
} from '../locations/internal-location-contracts';
|
|
2
5
|
import type {
|
|
3
6
|
ServiceRelocationRestoreOwner,
|
|
4
7
|
ServiceRelocationStaging
|
|
@@ -80,7 +83,7 @@ export class ServiceRelocationObjectCaptureOwner {
|
|
|
80
83
|
memberships: readonly ServiceRelocationMembership[],
|
|
81
84
|
signal?: AbortSignal
|
|
82
85
|
): Promise<ServiceCapturedObjectRelocation> {
|
|
83
|
-
if (spot.objectKind !== 'user_spot' || actors.some(actor => actor.objectKind !== 'actor')) {
|
|
86
|
+
if (spot.objectKind !== 'user_spot' || actors.some((actor) => actor.objectKind !== 'actor')) {
|
|
84
87
|
throw new TypeError('User Spot relocation requires one Spot and only Actor participants.');
|
|
85
88
|
}
|
|
86
89
|
if (actors.length !== memberships.length) {
|
|
@@ -105,13 +108,7 @@ export class ServiceRelocationObjectCaptureOwner {
|
|
|
105
108
|
if (actor.objectKind !== 'actor' || membership.actorKey !== actor.authorityKey) {
|
|
106
109
|
throw new TypeError('Standalone Actor relocation has an invalid membership identity.');
|
|
107
110
|
}
|
|
108
|
-
return await this.capture(
|
|
109
|
-
aggregateId,
|
|
110
|
-
aggregateGeneration,
|
|
111
|
-
[actor],
|
|
112
|
-
[membership],
|
|
113
|
-
signal
|
|
114
|
-
);
|
|
111
|
+
return await this.capture(aggregateId, aggregateGeneration, [actor], [membership], signal);
|
|
115
112
|
}
|
|
116
113
|
|
|
117
114
|
async captureInstanceSpotAggregate(
|
|
@@ -122,8 +119,10 @@ export class ServiceRelocationObjectCaptureOwner {
|
|
|
122
119
|
memberships: readonly ServiceRelocationMembership[],
|
|
123
120
|
signal?: AbortSignal
|
|
124
121
|
): Promise<ServiceCapturedObjectRelocation> {
|
|
125
|
-
if (
|
|
126
|
-
|
|
122
|
+
if (
|
|
123
|
+
spot.objectKind !== 'instance_spot' ||
|
|
124
|
+
actors.some((actor) => actor.objectKind !== 'actor')
|
|
125
|
+
) {
|
|
127
126
|
throw new TypeError(
|
|
128
127
|
'Instance Spot relocation requires one Spot and only Actor participants.'
|
|
129
128
|
);
|
|
@@ -170,20 +169,23 @@ export class ServiceRelocationObjectCaptureOwner {
|
|
|
170
169
|
authorityOwnerGeneration: unit.authorityOwnerGeneration,
|
|
171
170
|
applicationState: Buffer.from(await unit.captureApplicationState(signal)),
|
|
172
171
|
boundSessionState: Buffer.from(work.boundSessionState),
|
|
173
|
-
queuedMessages: work.queuedMessages.map(message => ({
|
|
172
|
+
queuedMessages: work.queuedMessages.map((message) => ({
|
|
174
173
|
sequence: message.sequence,
|
|
175
174
|
payload: Buffer.from(message.payload)
|
|
176
175
|
})),
|
|
177
|
-
timers: work.timers.map(timer => ({ ...timer }))
|
|
176
|
+
timers: work.timers.map((timer) => ({ ...timer }))
|
|
178
177
|
}),
|
|
179
178
|
signal
|
|
180
179
|
);
|
|
181
|
-
return new ServiceCapturedObjectRelocation(
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
180
|
+
return new ServiceCapturedObjectRelocation(
|
|
181
|
+
{
|
|
182
|
+
aggregateId,
|
|
183
|
+
aggregateGeneration,
|
|
184
|
+
participants,
|
|
185
|
+
memberships
|
|
186
|
+
},
|
|
187
|
+
units
|
|
188
|
+
);
|
|
187
189
|
} catch (error) {
|
|
188
190
|
for (const { unit } of captured.reverse()) await unit.abortSeal();
|
|
189
191
|
throw error;
|
|
@@ -195,13 +197,8 @@ export interface ServiceRelocationHiddenObject {
|
|
|
195
197
|
readonly authorityKey: string;
|
|
196
198
|
}
|
|
197
199
|
|
|
198
|
-
export interface ServiceRelocationTargetObjectPort<
|
|
199
|
-
|
|
200
|
-
> {
|
|
201
|
-
createHidden(
|
|
202
|
-
participant: ServiceRelocationParticipant,
|
|
203
|
-
signal?: AbortSignal
|
|
204
|
-
): Promise<THidden>;
|
|
200
|
+
export interface ServiceRelocationTargetObjectPort<THidden extends ServiceRelocationHiddenObject> {
|
|
201
|
+
createHidden(participant: ServiceRelocationParticipant, signal?: AbortSignal): Promise<THidden>;
|
|
205
202
|
restoreApplicationState(
|
|
206
203
|
hidden: THidden,
|
|
207
204
|
payload: Uint8Array,
|
|
@@ -212,26 +209,14 @@ export interface ServiceRelocationTargetObjectPort<
|
|
|
212
209
|
memberships: readonly ServiceRelocationMembership[],
|
|
213
210
|
signal?: AbortSignal
|
|
214
211
|
): Promise<void>;
|
|
215
|
-
publish(
|
|
216
|
-
|
|
217
|
-
authority: ZLinkAuthoritySnapshot,
|
|
218
|
-
signal?: AbortSignal
|
|
219
|
-
): Promise<void>;
|
|
220
|
-
restoreBoundSession(
|
|
221
|
-
hidden: THidden,
|
|
222
|
-
payload: Uint8Array,
|
|
223
|
-
signal?: AbortSignal
|
|
224
|
-
): Promise<void>;
|
|
212
|
+
publish(hidden: THidden, authority: ZLinkAuthoritySnapshot, signal?: AbortSignal): Promise<void>;
|
|
213
|
+
restoreBoundSession(hidden: THidden, payload: Uint8Array, signal?: AbortSignal): Promise<void>;
|
|
225
214
|
replayQueuedMessage(
|
|
226
215
|
hidden: THidden,
|
|
227
216
|
message: ServiceRelocationQueuedMessage,
|
|
228
217
|
signal?: AbortSignal
|
|
229
218
|
): Promise<void>;
|
|
230
|
-
restoreTimer(
|
|
231
|
-
hidden: THidden,
|
|
232
|
-
timer: ServiceRelocationTimer,
|
|
233
|
-
signal?: AbortSignal
|
|
234
|
-
): Promise<void>;
|
|
219
|
+
restoreTimer(hidden: THidden, timer: ServiceRelocationTimer, signal?: AbortSignal): Promise<void>;
|
|
235
220
|
normalize(
|
|
236
221
|
hidden: THidden,
|
|
237
222
|
authority: ZLinkAuthoritySnapshot,
|
|
@@ -285,16 +270,18 @@ export class ServiceRelocationObjectRestoreOwner<
|
|
|
285
270
|
await mapConcurrentOrdered(
|
|
286
271
|
participants,
|
|
287
272
|
this.maxConcurrentCallbacks,
|
|
288
|
-
participant =>
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
273
|
+
(participant) =>
|
|
274
|
+
this.target.restoreApplicationState(
|
|
275
|
+
hidden.get(participant.key)!,
|
|
276
|
+
participant.applicationState,
|
|
277
|
+
signal
|
|
278
|
+
),
|
|
293
279
|
signal
|
|
294
280
|
);
|
|
295
281
|
await this.target.restoreMemberships(hidden, envelope.memberships, signal);
|
|
296
|
-
const spot = envelope.participants.find(
|
|
297
|
-
objectKind === 'user_spot' || objectKind === 'instance_spot'
|
|
282
|
+
const spot = envelope.participants.find(
|
|
283
|
+
({ objectKind }) => objectKind === 'user_spot' || objectKind === 'instance_spot'
|
|
284
|
+
);
|
|
298
285
|
const primary = spot ?? envelope.participants[0]!;
|
|
299
286
|
return {
|
|
300
287
|
id: `${envelope.aggregateId}:${envelope.aggregateGeneration}`,
|
|
@@ -324,11 +311,7 @@ export class ServiceRelocationObjectRestoreOwner<
|
|
|
324
311
|
): Promise<void> {
|
|
325
312
|
for (const participant of staging.envelope.participants) {
|
|
326
313
|
const hidden = staging.hidden.get(participant.key)!;
|
|
327
|
-
await this.target.restoreBoundSession(
|
|
328
|
-
hidden,
|
|
329
|
-
participant.boundSessionState,
|
|
330
|
-
signal
|
|
331
|
-
);
|
|
314
|
+
await this.target.restoreBoundSession(hidden, participant.boundSessionState, signal);
|
|
332
315
|
for (const message of participant.queuedMessages) {
|
|
333
316
|
await this.target.replayQueuedMessage(hidden, message, signal);
|
|
334
317
|
}
|
|
@@ -379,8 +362,9 @@ export class ServiceRelocationObjectRestoreOwner<
|
|
|
379
362
|
}
|
|
380
363
|
|
|
381
364
|
function validateRelocationShape(envelope: ServiceRelocationEnvelope): void {
|
|
382
|
-
const spots = envelope.participants.filter(
|
|
383
|
-
objectKind === 'user_spot' || objectKind === 'instance_spot'
|
|
365
|
+
const spots = envelope.participants.filter(
|
|
366
|
+
({ objectKind }) => objectKind === 'user_spot' || objectKind === 'instance_spot'
|
|
367
|
+
);
|
|
384
368
|
const actors = envelope.participants.filter(({ objectKind }) => objectKind === 'actor');
|
|
385
369
|
if (spots.length === 0 && (actors.length !== 1 || envelope.participants.length !== 1)) {
|
|
386
370
|
throw new TypeError('Standalone relocation must contain exactly one Actor.');
|
|
@@ -420,9 +404,7 @@ async function mapConcurrentOrdered<TInput, TResult>(
|
|
|
420
404
|
}
|
|
421
405
|
}
|
|
422
406
|
};
|
|
423
|
-
await Promise.all(
|
|
424
|
-
Array.from({ length: Math.min(concurrency, values.length) }, () => worker())
|
|
425
|
-
);
|
|
407
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, values.length) }, () => worker()));
|
|
426
408
|
if (failure !== undefined) throw failure;
|
|
427
409
|
return results;
|
|
428
410
|
}
|