@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,5 +1,8 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
ZLinkPlacementObjectKind,
|
|
4
|
+
ZLinkAuthorityKey
|
|
5
|
+
} from '../locations/internal-location-contracts';
|
|
3
6
|
import { decodeAuthorityKey } from '../locations/authority-key-codec';
|
|
4
7
|
import {
|
|
5
8
|
decodeRelocationEnvelopeV1 as decodeGeneratedRelocationEnvelopeV1,
|
|
@@ -103,10 +106,7 @@ export interface ServiceRelocationPublication {
|
|
|
103
106
|
}
|
|
104
107
|
|
|
105
108
|
export interface ServiceRelocationAuthorityCodec {
|
|
106
|
-
publish(
|
|
107
|
-
currentPayload: Uint8Array,
|
|
108
|
-
publication: ServiceRelocationPublication
|
|
109
|
-
): Uint8Array;
|
|
109
|
+
publish(currentPayload: Uint8Array, publication: ServiceRelocationPublication): Uint8Array;
|
|
110
110
|
read(payload: Uint8Array): ServiceRelocationPublication | undefined;
|
|
111
111
|
clear(currentPayload: Uint8Array, expectedReference: string): Uint8Array;
|
|
112
112
|
}
|
|
@@ -153,12 +153,8 @@ export interface CanonicalRelocationSlot {
|
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
/** Deterministic Location authority wrapper for one immutable relocation root. */
|
|
156
|
-
export class ServiceRelocationAuthorityPayloadCodec
|
|
157
|
-
|
|
158
|
-
publish(
|
|
159
|
-
currentPayload: Uint8Array,
|
|
160
|
-
publication: ServiceRelocationPublication
|
|
161
|
-
): Uint8Array {
|
|
156
|
+
export class ServiceRelocationAuthorityPayloadCodec implements ServiceRelocationAuthorityCodec {
|
|
157
|
+
publish(currentPayload: Uint8Array, publication: ServiceRelocationPublication): Uint8Array {
|
|
162
158
|
if (this.read(currentPayload) !== undefined) {
|
|
163
159
|
throw new TypeError('Location authority already contains a relocation publication.');
|
|
164
160
|
}
|
|
@@ -173,31 +169,27 @@ implements ServiceRelocationAuthorityCodec {
|
|
|
173
169
|
}
|
|
174
170
|
|
|
175
171
|
read(payload: Uint8Array): ServiceRelocationPublication | undefined {
|
|
176
|
-
return
|
|
177
|
-
?? decodeAuthorityEnvelope(payload)?.publication
|
|
172
|
+
return (
|
|
173
|
+
decodeCanonicalAuthorityPublication(payload) ?? decodeAuthorityEnvelope(payload)?.publication
|
|
174
|
+
);
|
|
178
175
|
}
|
|
179
176
|
|
|
180
177
|
clear(currentPayload: Uint8Array, expectedReference: string): Uint8Array {
|
|
181
178
|
const canonical = decodeCanonicalAuthorityLayout(currentPayload);
|
|
182
|
-
const canonicalPublication =
|
|
183
|
-
? undefined
|
|
184
|
-
: decodeCanonicalRelocationSlot(canonical.slot);
|
|
179
|
+
const canonicalPublication =
|
|
180
|
+
canonical === undefined ? undefined : decodeCanonicalRelocationSlot(canonical.slot);
|
|
185
181
|
if (canonical !== undefined && canonicalPublication?.reference !== undefined) {
|
|
186
|
-
if (
|
|
187
|
-
expectedReference,
|
|
188
|
-
|
|
189
|
-
)) {
|
|
182
|
+
if (
|
|
183
|
+
canonicalPublication.reference !== requireText(expectedReference, 'relocation reference')
|
|
184
|
+
) {
|
|
190
185
|
throw new TypeError('Location authority relocation reference changed.');
|
|
191
186
|
}
|
|
192
187
|
return replaceCanonicalRelocationSlot(canonical, Buffer.alloc(0));
|
|
193
188
|
}
|
|
194
189
|
const current = decodeAuthorityEnvelope(currentPayload);
|
|
195
190
|
if (
|
|
196
|
-
current === undefined
|
|
197
|
-
|
|
198
|
-
expectedReference,
|
|
199
|
-
'relocation reference'
|
|
200
|
-
)
|
|
191
|
+
current === undefined ||
|
|
192
|
+
current.publication.reference !== requireText(expectedReference, 'relocation reference')
|
|
201
193
|
) {
|
|
202
194
|
throw new TypeError('Location authority relocation reference changed.');
|
|
203
195
|
}
|
|
@@ -206,9 +198,7 @@ implements ServiceRelocationAuthorityCodec {
|
|
|
206
198
|
}
|
|
207
199
|
|
|
208
200
|
/** Returns the application authority payload hidden by relocation metadata. */
|
|
209
|
-
export function serviceRelocationAuthorityApplicationPayload(
|
|
210
|
-
payload: Uint8Array
|
|
211
|
-
): Buffer {
|
|
201
|
+
export function serviceRelocationAuthorityApplicationPayload(payload: Uint8Array): Buffer {
|
|
212
202
|
const canonical = decodeCanonicalAuthorityLayout(payload);
|
|
213
203
|
if (canonical !== undefined && canonical.slot.byteLength !== 0) {
|
|
214
204
|
if (decodeCanonicalRelocationSlot(canonical.slot) === undefined) {
|
|
@@ -222,14 +212,14 @@ export function serviceRelocationAuthorityApplicationPayload(
|
|
|
222
212
|
/** Reads the canonical relocation identity even before its root pointer exists. */
|
|
223
213
|
export function serviceRelocationAuthoritySlotIdentity(
|
|
224
214
|
payload: Uint8Array
|
|
225
|
-
):
|
|
226
|
-
ServiceRelocationPublication,
|
|
227
|
-
|
|
228
|
-
> | undefined {
|
|
215
|
+
):
|
|
216
|
+
| Pick<ServiceRelocationPublication, 'aggregateId' | 'aggregateGeneration' | 'applicationVersion'>
|
|
217
|
+
| undefined {
|
|
229
218
|
const layout = decodeCanonicalAuthorityLayout(payload);
|
|
230
|
-
const slot =
|
|
231
|
-
|
|
232
|
-
|
|
219
|
+
const slot =
|
|
220
|
+
layout === undefined || layout.slot.byteLength === 0
|
|
221
|
+
? undefined
|
|
222
|
+
: decodeCanonicalRelocationSlot(layout.slot);
|
|
233
223
|
return slot === undefined
|
|
234
224
|
? undefined
|
|
235
225
|
: {
|
|
@@ -330,9 +320,7 @@ function decodeCanonicalAuthorityPublication(
|
|
|
330
320
|
};
|
|
331
321
|
}
|
|
332
322
|
|
|
333
|
-
function decodeCanonicalAuthorityLayout(
|
|
334
|
-
payload: Uint8Array
|
|
335
|
-
): CanonicalAuthorityLayout | undefined {
|
|
323
|
+
function decodeCanonicalAuthorityLayout(payload: Uint8Array): CanonicalAuthorityLayout | undefined {
|
|
336
324
|
try {
|
|
337
325
|
const bytes = Buffer.from(payload);
|
|
338
326
|
if (bytes.byteLength < 20 || bytes.byteLength > 1024 * 1024) return undefined;
|
|
@@ -404,25 +392,28 @@ export function decodeCanonicalRelocationSlot(
|
|
|
404
392
|
const phase = reader.u8();
|
|
405
393
|
const applicationVersion = reader.i64();
|
|
406
394
|
const sourceCleanupState = reader.u8();
|
|
407
|
-
if (
|
|
408
|
-
||
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
395
|
+
if (
|
|
396
|
+
!reader.done ||
|
|
397
|
+
aggregateGeneration > 0x7fff_ffff_ffff_fffen ||
|
|
398
|
+
(aggregateGeneration === 0n && phase !== 1) ||
|
|
399
|
+
(rootAggregateGeneration !== undefined && aggregateGeneration !== rootAggregateGeneration) ||
|
|
400
|
+
targetAttemptGeneration > 0x7fff_ffff_ffff_ffffn ||
|
|
401
|
+
sourceNodeGeneration === 0n ||
|
|
402
|
+
sourceNodeGeneration > 0x7fff_ffff_ffff_ffffn ||
|
|
403
|
+
sourceOwnerLeaseGeneration === 0n ||
|
|
404
|
+
sourceOwnerLeaseGeneration > 0x7fff_ffff_ffff_ffffn ||
|
|
405
|
+
targetNodeGeneration > 0x7fff_ffff_ffff_ffffn ||
|
|
406
|
+
targetOwnerLeaseGeneration > 0x7fff_ffff_ffff_ffffn ||
|
|
407
|
+
coordinatorLeaseGeneration === 0n ||
|
|
408
|
+
coordinatorLeaseGeneration > 0x7fff_ffff_ffff_ffffn ||
|
|
409
|
+
coordinatorNodeGeneration === 0n ||
|
|
410
|
+
coordinatorNodeGeneration > 0x7fff_ffff_ffff_ffffn ||
|
|
411
|
+
phase < 1 ||
|
|
412
|
+
phase > 9 ||
|
|
413
|
+
applicationVersion < 0n ||
|
|
414
|
+
sourceCleanupState > 2
|
|
415
|
+
)
|
|
416
|
+
return undefined;
|
|
426
417
|
return {
|
|
427
418
|
aggregateId,
|
|
428
419
|
aggregateGeneration,
|
|
@@ -453,10 +444,7 @@ export function decodeCanonicalRelocationSlot(
|
|
|
453
444
|
|
|
454
445
|
export function encodeCanonicalRelocationSlot(value: CanonicalRelocationSlot): Buffer {
|
|
455
446
|
const id = relocationId(canonicalUuid(value.aggregateId, 'aggregate id'));
|
|
456
|
-
const aggregateGeneration = nonNegativeBigInt(
|
|
457
|
-
value.aggregateGeneration,
|
|
458
|
-
'aggregate generation'
|
|
459
|
-
);
|
|
447
|
+
const aggregateGeneration = nonNegativeBigInt(value.aggregateGeneration, 'aggregate generation');
|
|
460
448
|
const targetAttemptGeneration = nonNegativeBigInt(
|
|
461
449
|
value.targetAttemptGeneration,
|
|
462
450
|
'target attempt generation'
|
|
@@ -497,23 +485,35 @@ export function encodeCanonicalRelocationSlot(value: CanonicalRelocationSlot): B
|
|
|
497
485
|
if (!Number.isInteger(value.phase) || value.phase < 1 || value.phase > 9) {
|
|
498
486
|
throw new TypeError('Canonical relocation phase is invalid.');
|
|
499
487
|
}
|
|
500
|
-
if (
|
|
501
|
-
|
|
502
|
-
|
|
488
|
+
if (
|
|
489
|
+
!Number.isInteger(value.sourceCleanupState) ||
|
|
490
|
+
value.sourceCleanupState < 0 ||
|
|
491
|
+
value.sourceCleanupState > 2
|
|
492
|
+
) {
|
|
503
493
|
throw new TypeError('Canonical source cleanup state is invalid.');
|
|
504
494
|
}
|
|
505
495
|
return Buffer.concat([
|
|
506
|
-
canonicalU64(id.high),
|
|
507
|
-
canonicalU64(
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
canonicalText8(value.
|
|
496
|
+
canonicalU64(id.high),
|
|
497
|
+
canonicalU64(id.low),
|
|
498
|
+
canonicalU64(aggregateGeneration),
|
|
499
|
+
canonicalU64(targetAttemptGeneration),
|
|
500
|
+
canonicalText16(value.reference),
|
|
501
|
+
canonicalU32(value.checksumCrc32c),
|
|
502
|
+
canonicalText8(value.sourceNodeRid),
|
|
503
|
+
canonicalU64(sourceNodeGeneration),
|
|
504
|
+
canonicalText8(value.sourceOwnerId),
|
|
505
|
+
canonicalU64(sourceOwnerLeaseGeneration),
|
|
506
|
+
canonicalOptionalText8(value.targetNodeRid),
|
|
507
|
+
canonicalU64(targetNodeGeneration),
|
|
508
|
+
canonicalOptionalText8(value.targetOwnerId),
|
|
509
|
+
canonicalU64(targetOwnerLeaseGeneration),
|
|
510
|
+
canonicalText8(value.coordinatorOwnerId),
|
|
511
|
+
canonicalU64(coordinatorLeaseGeneration),
|
|
512
|
+
canonicalText8(value.coordinatorNodeRid),
|
|
513
|
+
canonicalU64(coordinatorNodeGeneration),
|
|
515
514
|
canonicalOptionalText8(value.coordinatorExpectedStoreVersion),
|
|
516
|
-
Buffer.of(value.phase),
|
|
515
|
+
Buffer.of(value.phase),
|
|
516
|
+
canonicalI64(value.applicationVersion),
|
|
517
517
|
Buffer.of(value.sourceCleanupState)
|
|
518
518
|
]);
|
|
519
519
|
}
|
|
@@ -551,10 +551,8 @@ function encodeCanonicalRelocationPublicationSlot(
|
|
|
551
551
|
coordinatorLeaseGeneration:
|
|
552
552
|
publication.coordinatorLeaseGeneration ?? layout.ownerLeaseGeneration,
|
|
553
553
|
coordinatorNodeRid: publication.coordinatorNodeRid ?? nodeRid,
|
|
554
|
-
coordinatorNodeGeneration:
|
|
555
|
-
|
|
556
|
-
coordinatorExpectedStoreVersion:
|
|
557
|
-
publication.coordinatorExpectedStoreVersion ?? '',
|
|
554
|
+
coordinatorNodeGeneration: publication.coordinatorNodeGeneration ?? layout.nodeGeneration,
|
|
555
|
+
coordinatorExpectedStoreVersion: publication.coordinatorExpectedStoreVersion ?? '',
|
|
558
556
|
phase: publication.canonicalPhase ?? 8,
|
|
559
557
|
applicationVersion,
|
|
560
558
|
sourceCleanupState: publication.canonicalSourceCleanupState ?? 0
|
|
@@ -574,8 +572,11 @@ function replaceCanonicalRelocationSlot(
|
|
|
574
572
|
layout.body.subarray(layout.slotEnd)
|
|
575
573
|
]);
|
|
576
574
|
const envelope = Buffer.concat([
|
|
577
|
-
Buffer.from('ZLAU'),
|
|
578
|
-
|
|
575
|
+
Buffer.from('ZLAU'),
|
|
576
|
+
Buffer.of(1),
|
|
577
|
+
canonicalU16(layout.flags),
|
|
578
|
+
canonicalU32(body.byteLength),
|
|
579
|
+
body
|
|
579
580
|
]);
|
|
580
581
|
const result = Buffer.concat([envelope, canonicalU32(crc32c(envelope))]);
|
|
581
582
|
if (result.byteLength > 1024 * 1024) {
|
|
@@ -601,14 +602,12 @@ export function encodeServiceRelocationEnvelope(
|
|
|
601
602
|
applicationVersion: bigint
|
|
602
603
|
): Buffer {
|
|
603
604
|
const aggregate = relocationId(canonicalUuid(envelope.aggregateId, 'aggregate id'));
|
|
604
|
-
const encodedApplicationVersion = nonNegativeBigInt(
|
|
605
|
-
applicationVersion,
|
|
606
|
-
'application version'
|
|
607
|
-
);
|
|
605
|
+
const encodedApplicationVersion = nonNegativeBigInt(applicationVersion, 'application version');
|
|
608
606
|
const participants = canonicalParticipants(envelope.participants);
|
|
609
|
-
const root =
|
|
610
|
-
|
|
611
|
-
??
|
|
607
|
+
const root =
|
|
608
|
+
participants.find((value) => value.rootSpotId !== undefined) ??
|
|
609
|
+
participants.find((value) => value.objectKind !== 'actor') ??
|
|
610
|
+
participants[0]!;
|
|
612
611
|
const rootObjectKind = root.rootObjectKind ?? root.objectKind;
|
|
613
612
|
if (rootObjectKind === 'actor' && participants.length !== 1) {
|
|
614
613
|
throw new TypeError('Standalone Actor relocation requires one participant.');
|
|
@@ -624,23 +623,44 @@ export function encodeServiceRelocationEnvelope(
|
|
|
624
623
|
payload: Buffer.from(participant.applicationState)
|
|
625
624
|
};
|
|
626
625
|
});
|
|
627
|
-
const saved = participants
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
626
|
+
const saved = participants
|
|
627
|
+
.flatMap((participant, index) =>
|
|
628
|
+
participant.queuedMessages.map((message) => ({
|
|
629
|
+
participantId: BigInt(index + 1),
|
|
630
|
+
order: positiveBigInt(message.sequence, 'queue sequence'),
|
|
631
|
+
frozenRecord: Buffer.from(message.payload)
|
|
632
|
+
}))
|
|
633
|
+
)
|
|
634
|
+
.sort(compareParticipantOrder);
|
|
635
|
+
if (
|
|
636
|
+
saved.some(
|
|
637
|
+
(value, index) => index > 0 && compareParticipantOrder(saved[index - 1]!, value) === 0
|
|
638
|
+
)
|
|
639
|
+
) {
|
|
634
640
|
throw new TypeError('Relocation queue sequences must be unique per participant.');
|
|
635
641
|
}
|
|
636
|
-
const timers = participants
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
642
|
+
const timers = participants
|
|
643
|
+
.flatMap((participant, index) =>
|
|
644
|
+
participant.timers.map((timer) => ({
|
|
645
|
+
participantId: BigInt(index + 1),
|
|
646
|
+
timer
|
|
647
|
+
}))
|
|
648
|
+
)
|
|
649
|
+
.sort((a, b) =>
|
|
650
|
+
a.participantId === b.participantId
|
|
651
|
+
? Buffer.compare(Buffer.from(a.timer.timerId), Buffer.from(b.timer.timerId))
|
|
652
|
+
: a.participantId < b.participantId
|
|
653
|
+
? -1
|
|
654
|
+
: 1
|
|
655
|
+
);
|
|
656
|
+
if (
|
|
657
|
+
timers.some(
|
|
658
|
+
(value, index) =>
|
|
659
|
+
index > 0 &&
|
|
660
|
+
timers[index - 1]!.participantId === value.participantId &&
|
|
661
|
+
timers[index - 1]!.timer.timerId === value.timer.timerId
|
|
662
|
+
)
|
|
663
|
+
) {
|
|
644
664
|
throw new TypeError('Relocation timer ids must be unique per participant.');
|
|
645
665
|
}
|
|
646
666
|
const nextOrder = new Map<bigint, bigint>();
|
|
@@ -648,43 +668,65 @@ export function encodeServiceRelocationEnvelope(
|
|
|
648
668
|
const current = nextOrder.get(value.participantId) ?? 0n;
|
|
649
669
|
if (value.order > current) nextOrder.set(value.participantId, value.order);
|
|
650
670
|
}
|
|
651
|
-
const pending = timers
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
671
|
+
const pending = timers
|
|
672
|
+
.flatMap(({ participantId, timer }) =>
|
|
673
|
+
timer.pendingTicks.map((tick) => {
|
|
674
|
+
const current = nextOrder.get(participantId) ?? 0n;
|
|
675
|
+
const order =
|
|
676
|
+
tick.order === undefined
|
|
677
|
+
? current + 1n
|
|
678
|
+
: positiveBigInt(tick.order, 'pending timer order');
|
|
679
|
+
if (order > current) nextOrder.set(participantId, order);
|
|
680
|
+
return { participantId, order, timerName: timer.timerId, tick };
|
|
681
|
+
})
|
|
682
|
+
)
|
|
683
|
+
.sort(compareParticipantOrder);
|
|
684
|
+
return Buffer.from(
|
|
685
|
+
encodeGeneratedRelocationEnvelopeV1({
|
|
686
|
+
relocationHigh: aggregate.high,
|
|
687
|
+
relocationLow: aggregate.low,
|
|
688
|
+
object: toGeneratedRelocationObject(root, rootObjectKind),
|
|
689
|
+
applicationVersion: encodedApplicationVersion,
|
|
690
|
+
applicationStates,
|
|
691
|
+
savedWork: saved,
|
|
692
|
+
timerRegistrations: timers.map(({ participantId, timer }) => ({
|
|
693
|
+
participantId,
|
|
694
|
+
name: timer.timerId,
|
|
695
|
+
handlerType: timer.handlerType,
|
|
696
|
+
periodMilliseconds: BigInt(positiveInteger(timer.intervalMs, 'timer interval')),
|
|
697
|
+
overrunPolicy: timerPolicy(timer.overrunPolicy),
|
|
698
|
+
maxCatchUpTicks: BigInt(positiveInteger(timer.maxCatchUpTicks, 'timer catch-up limit')),
|
|
699
|
+
stopOnUnhandledException: requireBoolean(
|
|
700
|
+
timer.stopOnUnhandledException,
|
|
701
|
+
'timer stop-on-error flag'
|
|
702
|
+
),
|
|
703
|
+
lastCompletedDeliveryIndex: nonNegativeBigInt(timer.deliveryIndex, 'timer delivery index'),
|
|
704
|
+
lastCompletedScheduledIndex: nonNegativeBigInt(
|
|
705
|
+
timer.lastScheduledIndex,
|
|
706
|
+
'timer scheduled index'
|
|
707
|
+
),
|
|
708
|
+
nextScheduledAtUnixMilliseconds: nonNegativeUnixMilliseconds(
|
|
709
|
+
timer.dueAtUnixMs,
|
|
710
|
+
'timer due time'
|
|
711
|
+
)
|
|
712
|
+
})),
|
|
713
|
+
pendingTimerTicks: pending.map((value) => ({
|
|
714
|
+
participantId: value.participantId,
|
|
715
|
+
order: value.order,
|
|
716
|
+
timerName: value.timerName,
|
|
717
|
+
deliveryIndex: nonNegativeBigInt(value.tick.deliveryIndex, 'pending timer delivery index'),
|
|
718
|
+
scheduledIndex: nonNegativeBigInt(
|
|
719
|
+
value.tick.scheduledIndex,
|
|
720
|
+
'pending timer scheduled index'
|
|
721
|
+
),
|
|
722
|
+
scheduledAtUnixMilliseconds: nonNegativeUnixMilliseconds(
|
|
723
|
+
value.tick.scheduledAtUnixMs,
|
|
724
|
+
'pending timer scheduled time'
|
|
725
|
+
),
|
|
726
|
+
skippedTicks: nonNegativeBigInt(value.tick.skippedTicks, 'pending timer skipped ticks')
|
|
727
|
+
}))
|
|
728
|
+
})
|
|
729
|
+
);
|
|
688
730
|
}
|
|
689
731
|
|
|
690
732
|
export function decodeServiceRelocationEnvelope(
|
|
@@ -713,7 +755,7 @@ export function decodeServiceRelocationEnvelope(
|
|
|
713
755
|
}
|
|
714
756
|
return wireParticipant(state.participantId, state.hasState, Buffer.from(state.payload));
|
|
715
757
|
});
|
|
716
|
-
const byId = new Map(participants.map(value => [value.participantId!, value]));
|
|
758
|
+
const byId = new Map(participants.map((value) => [value.participantId!, value]));
|
|
717
759
|
for (const work of generated.savedWork) {
|
|
718
760
|
byId.get(work.participantId)!.queuedMessages.push({
|
|
719
761
|
sequence: work.order,
|
|
@@ -736,7 +778,9 @@ export function decodeServiceRelocationEnvelope(
|
|
|
736
778
|
});
|
|
737
779
|
}
|
|
738
780
|
for (const tick of generated.pendingTimerTicks) {
|
|
739
|
-
const timer = byId
|
|
781
|
+
const timer = byId
|
|
782
|
+
.get(tick.participantId)!
|
|
783
|
+
.timers.find((value) => value.timerId === tick.timerName)!;
|
|
740
784
|
(timer.pendingTicks as ServiceRelocationPendingTimerTick[]).push({
|
|
741
785
|
order: tick.order,
|
|
742
786
|
deliveryIndex: tick.deliveryIndex,
|
|
@@ -751,9 +795,9 @@ export function decodeServiceRelocationEnvelope(
|
|
|
751
795
|
aggregateId,
|
|
752
796
|
aggregateGeneration,
|
|
753
797
|
applicationVersion: generated.applicationVersion,
|
|
754
|
-
participants: participants.map(value =>
|
|
755
|
-
? { ...value, ...rootProjection }
|
|
756
|
-
|
|
798
|
+
participants: participants.map((value) =>
|
|
799
|
+
value === rootParticipant ? { ...value, ...rootProjection } : value
|
|
800
|
+
),
|
|
757
801
|
memberships: []
|
|
758
802
|
};
|
|
759
803
|
}
|
|
@@ -769,8 +813,7 @@ function toGeneratedRelocationObject(
|
|
|
769
813
|
objectKind: 'actor',
|
|
770
814
|
actorId: objectId,
|
|
771
815
|
objectGeneration,
|
|
772
|
-
expectedAuthorityOwnerGeneration:
|
|
773
|
-
root.rootOwnerGeneration ?? root.authorityOwnerGeneration
|
|
816
|
+
expectedAuthorityOwnerGeneration: root.rootOwnerGeneration ?? root.authorityOwnerGeneration
|
|
774
817
|
};
|
|
775
818
|
}
|
|
776
819
|
if (objectKind === 'user_spot') {
|
|
@@ -778,8 +821,7 @@ function toGeneratedRelocationObject(
|
|
|
778
821
|
objectKind: 'userSpot',
|
|
779
822
|
spotId: objectId,
|
|
780
823
|
objectGeneration,
|
|
781
|
-
expectedAuthorityOwnerGeneration:
|
|
782
|
-
root.rootOwnerGeneration ?? root.authorityOwnerGeneration
|
|
824
|
+
expectedAuthorityOwnerGeneration: root.rootOwnerGeneration ?? root.authorityOwnerGeneration
|
|
783
825
|
};
|
|
784
826
|
}
|
|
785
827
|
return {
|
|
@@ -794,8 +836,7 @@ function fromGeneratedRelocationObject(
|
|
|
794
836
|
object: GeneratedRelocationObjectIdentity
|
|
795
837
|
): Pick<
|
|
796
838
|
ServiceRelocationParticipant,
|
|
797
|
-
'rootSpotId' | 'rootSpotGeneration' | 'rootOwnerGeneration'
|
|
798
|
-
| 'rootObjectKind' | 'rootStableType'
|
|
839
|
+
'rootSpotId' | 'rootSpotGeneration' | 'rootOwnerGeneration' | 'rootObjectKind' | 'rootStableType'
|
|
799
840
|
> {
|
|
800
841
|
if (object.objectKind === 'actor') {
|
|
801
842
|
return {
|
|
@@ -821,10 +862,15 @@ function fromGeneratedRelocationObject(
|
|
|
821
862
|
};
|
|
822
863
|
}
|
|
823
864
|
|
|
824
|
-
function canonicalParticipants(
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
if (
|
|
865
|
+
function canonicalParticipants(
|
|
866
|
+
values: readonly ServiceRelocationParticipant[]
|
|
867
|
+
): readonly ServiceRelocationParticipant[] {
|
|
868
|
+
if (values.length === 0)
|
|
869
|
+
throw new TypeError('Relocation participant count is outside its bound.');
|
|
870
|
+
const participants = [...values].sort((a, b) =>
|
|
871
|
+
Buffer.compare(Buffer.from(a.key), Buffer.from(b.key))
|
|
872
|
+
);
|
|
873
|
+
if (new Set(participants.map((value) => value.key)).size !== participants.length) {
|
|
828
874
|
throw new TypeError('Relocation participants must have unique keys.');
|
|
829
875
|
}
|
|
830
876
|
return participants;
|
|
@@ -835,7 +881,9 @@ function authorityGlobalId(key: string): string {
|
|
|
835
881
|
return decodeAuthorityKey({ value: key } as ZLinkAuthorityKey).globalId;
|
|
836
882
|
} catch {
|
|
837
883
|
const marker = key.indexOf(':');
|
|
838
|
-
return marker < 0
|
|
884
|
+
return marker < 0
|
|
885
|
+
? requireText(key, 'participant key')
|
|
886
|
+
: requireText(key.slice(marker + 1), 'participant key');
|
|
839
887
|
}
|
|
840
888
|
}
|
|
841
889
|
|
|
@@ -850,10 +898,18 @@ function uuid(high: bigint, low: bigint): string | undefined {
|
|
|
850
898
|
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
851
899
|
}
|
|
852
900
|
|
|
853
|
-
function compareParticipantOrder<
|
|
901
|
+
function compareParticipantOrder<
|
|
902
|
+
T extends { readonly participantId: bigint; readonly order: bigint }
|
|
903
|
+
>(a: T, b: T): number {
|
|
854
904
|
return a.participantId === b.participantId
|
|
855
|
-
? a.order < b.order
|
|
856
|
-
|
|
905
|
+
? a.order < b.order
|
|
906
|
+
? -1
|
|
907
|
+
: a.order > b.order
|
|
908
|
+
? 1
|
|
909
|
+
: 0
|
|
910
|
+
: a.participantId < b.participantId
|
|
911
|
+
? -1
|
|
912
|
+
: 1;
|
|
857
913
|
}
|
|
858
914
|
|
|
859
915
|
function timerPolicy(value: string): 1 | 2 | 3 {
|
|
@@ -877,11 +933,16 @@ function nonNegativeUnixMilliseconds(value: number, label: string): bigint {
|
|
|
877
933
|
}
|
|
878
934
|
|
|
879
935
|
function unixMilliseconds(value: bigint): number {
|
|
880
|
-
if (value > BigInt(Number.MAX_SAFE_INTEGER))
|
|
936
|
+
if (value > BigInt(Number.MAX_SAFE_INTEGER))
|
|
937
|
+
throw new TypeError('Unix milliseconds exceed Node safe integer range.');
|
|
881
938
|
return Number(value);
|
|
882
939
|
}
|
|
883
940
|
|
|
884
|
-
function wireParticipant(
|
|
941
|
+
function wireParticipant(
|
|
942
|
+
participantId: bigint,
|
|
943
|
+
applicationStatePresent: boolean,
|
|
944
|
+
applicationState: Buffer
|
|
945
|
+
): ServiceRelocationParticipant & {
|
|
885
946
|
queuedMessages: ServiceRelocationQueuedMessage[];
|
|
886
947
|
timers: ServiceRelocationTimer[];
|
|
887
948
|
} {
|
|
@@ -911,27 +972,34 @@ export function inventoryDigest(
|
|
|
911
972
|
participants: readonly ServiceRelocationParticipant[],
|
|
912
973
|
memberships: readonly ServiceRelocationMembership[] = []
|
|
913
974
|
): string {
|
|
914
|
-
const identities = participants
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
975
|
+
const identities = participants
|
|
976
|
+
.map((participant) => ({
|
|
977
|
+
key: requireText(participant.key, 'participant key'),
|
|
978
|
+
objectKind: objectKind(participant.objectKind),
|
|
979
|
+
stableType: requireText(participant.stableType, 'participant stable type'),
|
|
980
|
+
objectGeneration: positiveBigInt(
|
|
981
|
+
participant.objectGeneration,
|
|
982
|
+
'object generation'
|
|
983
|
+
).toString(),
|
|
984
|
+
authorityOwnerGeneration: positiveBigInt(
|
|
985
|
+
participant.authorityOwnerGeneration,
|
|
986
|
+
'authority owner generation'
|
|
987
|
+
).toString()
|
|
988
|
+
}))
|
|
989
|
+
.sort((left, right) => left.key.localeCompare(right.key));
|
|
927
990
|
if (new Set(identities.map(({ key }) => key)).size !== identities.length) {
|
|
928
991
|
throw new TypeError('Relocation participants must have unique keys.');
|
|
929
992
|
}
|
|
930
993
|
const canonicalMemberships = encodeMemberships(memberships, participants);
|
|
931
|
-
return createHash('sha256')
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
994
|
+
return createHash('sha256')
|
|
995
|
+
.update(
|
|
996
|
+
JSON.stringify({
|
|
997
|
+
participants: identities,
|
|
998
|
+
memberships: canonicalMemberships
|
|
999
|
+
}),
|
|
1000
|
+
'utf8'
|
|
1001
|
+
)
|
|
1002
|
+
.digest('hex');
|
|
935
1003
|
}
|
|
936
1004
|
|
|
937
1005
|
function encodeAuthorityEnvelope(
|
|
@@ -954,8 +1022,8 @@ function encodeAuthorityEnvelope(
|
|
|
954
1022
|
'target owner lease generation'
|
|
955
1023
|
);
|
|
956
1024
|
if (
|
|
957
|
-
aggregateGeneration > 0x7fff_ffff_ffff_ffffn
|
|
958
|
-
|
|
1025
|
+
aggregateGeneration > 0x7fff_ffff_ffff_ffffn ||
|
|
1026
|
+
targetOwnerLeaseGeneration > 0x7fff_ffff_ffff_ffffn
|
|
959
1027
|
) {
|
|
960
1028
|
throw new TypeError('Relocation publication generations must fit signed 64-bit storage.');
|
|
961
1029
|
}
|
|
@@ -997,11 +1065,11 @@ function decodeAuthorityEnvelope(
|
|
|
997
1065
|
const targetOwnerLeaseGeneration = reader.i64();
|
|
998
1066
|
const base = reader.bytes32();
|
|
999
1067
|
if (
|
|
1000
|
-
!reader.done
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1068
|
+
!reader.done ||
|
|
1069
|
+
aggregateGeneration === 0n ||
|
|
1070
|
+
aggregateGeneration > 0x7fff_ffff_ffff_ffffn ||
|
|
1071
|
+
inventoryDigestBytes.byteLength !== 32 ||
|
|
1072
|
+
targetOwnerLeaseGeneration <= 0n
|
|
1005
1073
|
) {
|
|
1006
1074
|
return undefined;
|
|
1007
1075
|
}
|
|
@@ -1027,25 +1095,24 @@ function encodeMemberships(
|
|
|
1027
1095
|
participants: readonly ServiceRelocationParticipant[]
|
|
1028
1096
|
) {
|
|
1029
1097
|
validateMemberships(memberships, participants);
|
|
1030
|
-
return memberships
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
membership.membershipEpoch,
|
|
1039
|
-
|
|
1040
|
-
).
|
|
1041
|
-
})).sort((left, right) => left.actorKey.localeCompare(right.actorKey));
|
|
1098
|
+
return memberships
|
|
1099
|
+
.map((membership) => ({
|
|
1100
|
+
actorKey: requireText(membership.actorKey, 'membership actor key'),
|
|
1101
|
+
spotKey: requireText(membership.spotKey, 'membership spot key'),
|
|
1102
|
+
spotObjectGeneration: positiveBigInt(
|
|
1103
|
+
membership.spotObjectGeneration,
|
|
1104
|
+
'membership Spot generation'
|
|
1105
|
+
).toString(),
|
|
1106
|
+
membershipEpoch: positiveBigInt(membership.membershipEpoch, 'membership epoch').toString()
|
|
1107
|
+
}))
|
|
1108
|
+
.sort((left, right) => left.actorKey.localeCompare(right.actorKey));
|
|
1042
1109
|
}
|
|
1043
1110
|
|
|
1044
1111
|
function validateMemberships(
|
|
1045
1112
|
memberships: readonly ServiceRelocationMembership[],
|
|
1046
1113
|
participants: readonly ServiceRelocationParticipant[]
|
|
1047
1114
|
): void {
|
|
1048
|
-
const byKey = new Map(participants.map(participant => [participant.key, participant]));
|
|
1115
|
+
const byKey = new Map(participants.map((participant) => [participant.key, participant]));
|
|
1049
1116
|
const actorKeys = new Set<string>();
|
|
1050
1117
|
for (const membership of memberships) {
|
|
1051
1118
|
const actorKey = requireText(membership.actorKey, 'membership actor key');
|
|
@@ -1059,14 +1126,10 @@ function validateMemberships(
|
|
|
1059
1126
|
}
|
|
1060
1127
|
const spot = byKey.get(requireText(membership.spotKey, 'membership spot key'));
|
|
1061
1128
|
if (
|
|
1062
|
-
spot !== undefined
|
|
1063
|
-
|
|
1064
|
-
spot.
|
|
1065
|
-
|
|
1066
|
-
membership.spotObjectGeneration,
|
|
1067
|
-
'membership Spot generation'
|
|
1068
|
-
)
|
|
1069
|
-
)
|
|
1129
|
+
spot !== undefined &&
|
|
1130
|
+
(spot.objectKind !== 'user_spot' ||
|
|
1131
|
+
spot.objectGeneration !==
|
|
1132
|
+
positiveBigInt(membership.spotObjectGeneration, 'membership Spot generation'))
|
|
1070
1133
|
) {
|
|
1071
1134
|
throw new TypeError('Relocation membership Spot fence does not match its participant.');
|
|
1072
1135
|
}
|
|
@@ -1074,7 +1137,6 @@ function validateMemberships(
|
|
|
1074
1137
|
}
|
|
1075
1138
|
}
|
|
1076
1139
|
|
|
1077
|
-
|
|
1078
1140
|
const CRC32C_TABLE = Uint32Array.from({ length: 256 }, (_, value) => {
|
|
1079
1141
|
let crc = value;
|
|
1080
1142
|
for (let bit = 0; bit < 8; bit++) {
|
|
@@ -1100,8 +1162,10 @@ function requireText(value: unknown, label: string): string {
|
|
|
1100
1162
|
|
|
1101
1163
|
function canonicalUuid(value: unknown, label: string): string {
|
|
1102
1164
|
const text = requireText(value, label);
|
|
1103
|
-
if (
|
|
1104
|
-
|
|
1165
|
+
if (
|
|
1166
|
+
!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/u.test(text) ||
|
|
1167
|
+
/^0{8}-0{4}-0{4}-0{4}-0{12}$/u.test(text)
|
|
1168
|
+
) {
|
|
1105
1169
|
throw new TypeError(`${label} must be a lowercase non-zero 128-bit identity.`);
|
|
1106
1170
|
}
|
|
1107
1171
|
return text;
|
|
@@ -1152,9 +1216,14 @@ function i64le(value: bigint): Buffer {
|
|
|
1152
1216
|
function dotnetGuidBytes(value: string): Buffer {
|
|
1153
1217
|
const canonical = Buffer.from(value.replaceAll('-', ''), 'hex');
|
|
1154
1218
|
return Buffer.from([
|
|
1155
|
-
canonical[3]!,
|
|
1156
|
-
canonical[
|
|
1157
|
-
canonical[
|
|
1219
|
+
canonical[3]!,
|
|
1220
|
+
canonical[2]!,
|
|
1221
|
+
canonical[1]!,
|
|
1222
|
+
canonical[0]!,
|
|
1223
|
+
canonical[5]!,
|
|
1224
|
+
canonical[4]!,
|
|
1225
|
+
canonical[7]!,
|
|
1226
|
+
canonical[6]!,
|
|
1158
1227
|
...canonical.subarray(8)
|
|
1159
1228
|
]);
|
|
1160
1229
|
}
|
|
@@ -1163,13 +1232,20 @@ function canonicalUuidFromDotnetBytes(value: Uint8Array): string {
|
|
|
1163
1232
|
const bytes = Buffer.from(value);
|
|
1164
1233
|
if (bytes.byteLength !== 16) throw new TypeError('Relocation aggregate id is invalid.');
|
|
1165
1234
|
const canonical = Buffer.from([
|
|
1166
|
-
bytes[3]!,
|
|
1167
|
-
bytes[
|
|
1168
|
-
bytes[
|
|
1235
|
+
bytes[3]!,
|
|
1236
|
+
bytes[2]!,
|
|
1237
|
+
bytes[1]!,
|
|
1238
|
+
bytes[0]!,
|
|
1239
|
+
bytes[5]!,
|
|
1240
|
+
bytes[4]!,
|
|
1241
|
+
bytes[7]!,
|
|
1242
|
+
bytes[6]!,
|
|
1169
1243
|
...bytes.subarray(8)
|
|
1170
1244
|
]).toString('hex');
|
|
1171
|
-
return
|
|
1172
|
-
|
|
1245
|
+
return (
|
|
1246
|
+
`${canonical.slice(0, 8)}-${canonical.slice(8, 12)}-${canonical.slice(12, 16)}` +
|
|
1247
|
+
`-${canonical.slice(16, 20)}-${canonical.slice(20)}`
|
|
1248
|
+
);
|
|
1173
1249
|
}
|
|
1174
1250
|
|
|
1175
1251
|
class CanonicalReader {
|