@zlink-systems/framework 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +15 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +1 -2
- package/dist/runtime/activation-admission.js +2 -6
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +13 -11
- package/dist/runtime/actors/actor-handoff.d.ts +4 -4
- package/dist/runtime/actors/actor-handoff.js +8 -8
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +83 -105
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.js +5 -9
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
- package/dist/runtime/actors/deferred-join-completion.js +1 -0
- package/dist/runtime/actors/index.d.ts +9 -7
- package/dist/runtime/actors/index.js +87 -69
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +2 -0
- package/dist/runtime/admission.js +7 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +6 -23
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
- package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -8
- package/dist/runtime/channels/channel-clients.js +68 -52
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -10
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.js +5 -2
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
- package/dist/runtime/channels/channel-socket-registry.js +248 -174
- package/dist/runtime/channels/channel-transports.d.ts +11 -17
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +130 -72
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +12 -9
- package/dist/runtime/execution/index.js +58 -14
- package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
- package/dist/runtime/execution/serial-execution-queue.js +54 -15
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
- package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
- package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
- package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
- package/dist/runtime/foundation/service-topology-registry.js +17 -32
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
- package/dist/runtime/host/actor-transfer-runtime.js +143 -176
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +14 -13
- package/dist/runtime/host/index.js +190 -157
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +7 -20
- package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
- package/dist/runtime/host/route-mesh-runtime.js +171 -252
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
- package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
- package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
- package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +4 -9
- package/dist/runtime/locations/lifecycle.js +2 -31
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +37 -28
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
- package/dist/runtime/locations/spot-location-claims.js +42 -1
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
- package/dist/runtime/spots/index.d.ts +14 -20
- package/dist/runtime/spots/index.js +302 -176
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
- package/dist/runtime/spots/spot-activation-registry.js +14 -50
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +2 -2
- package/dist/runtime/spots/spot-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-activation.js +49 -32
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
- package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
- package/dist/runtime/spots/spot-actor-membership.js +22 -45
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +9 -20
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +5 -4
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +9 -8
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
- package/dist/runtime/spots/spot-serial-executor.js +2 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
- package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +11 -1
- package/dist/runtime/streams/index.d.ts +14 -15
- package/dist/runtime/streams/index.js +20 -21
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +14 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +2 -8
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +39 -33
- package/src/runtime/actors/actor-handoff.ts +24 -22
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +172 -174
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +9 -11
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +10 -6
- package/src/runtime/actors/index.ts +100 -79
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +8 -1
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +13 -29
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
- package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
- package/src/runtime/backend/raw-binding-port.ts +1 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -85
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -23
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +6 -2
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +301 -192
- package/src/runtime/channels/channel-transports.ts +161 -112
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +172 -91
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +60 -20
- package/src/runtime/execution/serial-execution-queue.ts +131 -18
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
- package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
- package/src/runtime/foundation/service-topology-registry.ts +23 -32
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +180 -260
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +327 -296
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +8 -41
- package/src/runtime/host/route-mesh-runtime.ts +228 -271
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
- package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +13 -43
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +75 -49
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +58 -1
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
- package/src/runtime/spots/index.ts +433 -229
- package/src/runtime/spots/spot-activation-registry.ts +30 -69
- package/src/runtime/spots/spot-activation-state.ts +2 -2
- package/src/runtime/spots/spot-activation.ts +67 -37
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
- package/src/runtime/spots/spot-actor-membership.ts +40 -72
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -30
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +21 -17
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
- package/src/runtime/spots/spot-outbound.ts +45 -23
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +5 -27
- package/src/runtime/spots/spot-serial-executor.ts +2 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +21 -1
- package/src/runtime/streams/index.ts +76 -64
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UINT64_MAX } from '@zlink-systems/stream-wire';
|
|
2
|
+
import { ZLinkSpotKind, zlinkSpotKindToWire } from '../../contracts';
|
|
2
3
|
import type { ZLinkLocationOwnerToken } from '../../contracts/Locations';
|
|
4
|
+
import { SHA256_DIGEST_BYTES } from './actor-join-recovery-codec';
|
|
5
|
+
import { crc32c } from './service-relocation-runtime';
|
|
6
|
+
import { SERVICE_WIRE_TEXT8_MAX_BYTES } from './service-wire-binary-primitives';
|
|
7
|
+
const SPOT_AUTHORITY_OBJECT_KIND = 2;
|
|
8
|
+
const USER_SPOT_WIRE_KIND = zlinkSpotKindToWire(ZLinkSpotKind.User);
|
|
9
|
+
const INSTANCE_SPOT_WIRE_KIND = zlinkSpotKindToWire(ZLinkSpotKind.Instance);
|
|
10
|
+
const AUTHORITY_TEXT16_MAX_BYTES = 0xffff;
|
|
3
11
|
|
|
4
12
|
const AUTHORITY_MAGIC = Buffer.from([0x5a, 0x4c, 0x41, 0x55]);
|
|
5
13
|
const AUTHORITY_FORMAT_VERSION = 1;
|
|
@@ -311,7 +319,7 @@ function decodeSpotAuthority(payload: Uint8Array):
|
|
|
311
319
|
const operationKind = body.u8();
|
|
312
320
|
const objectKind = body.u8();
|
|
313
321
|
const object = body.takeReader(body.u16());
|
|
314
|
-
if (objectKind !==
|
|
322
|
+
if (objectKind !== SPOT_AUTHORITY_OBJECT_KIND) return undefined;
|
|
315
323
|
const spotKind = object.u8();
|
|
316
324
|
const spot = object.takeReader(object.u16());
|
|
317
325
|
if (!object.done) return undefined;
|
|
@@ -320,12 +328,12 @@ function decodeSpotAuthority(payload: Uint8Array):
|
|
|
320
328
|
let state: number;
|
|
321
329
|
let stableType: string;
|
|
322
330
|
let spotId: string;
|
|
323
|
-
if (spotKind ===
|
|
331
|
+
if (spotKind === USER_SPOT_WIRE_KIND) {
|
|
324
332
|
kind = 'user_spot';
|
|
325
333
|
spotId = spot.rid();
|
|
326
334
|
stableType = spot.text8();
|
|
327
335
|
state = spot.u8();
|
|
328
|
-
} else if (spotKind ===
|
|
336
|
+
} else if (spotKind === INSTANCE_SPOT_WIRE_KIND) {
|
|
329
337
|
kind = 'instance_spot';
|
|
330
338
|
state = spot.u8();
|
|
331
339
|
const instance = spot.takeReader(spot.u16());
|
|
@@ -417,23 +425,33 @@ function rid(value: string, name: string): Buffer {
|
|
|
417
425
|
|
|
418
426
|
function text16(value: string, name: string): Buffer {
|
|
419
427
|
const bytes = Buffer.from(value);
|
|
420
|
-
if (bytes.byteLength < 1 || bytes.byteLength >
|
|
421
|
-
throw new RangeError(
|
|
428
|
+
if (bytes.byteLength < 1 || bytes.byteLength > AUTHORITY_TEXT16_MAX_BYTES || bytes.includes(0)) {
|
|
429
|
+
throw new RangeError(
|
|
430
|
+
`${name} must contain 1..${AUTHORITY_TEXT16_MAX_BYTES} UTF-8 bytes without NUL.`
|
|
431
|
+
);
|
|
422
432
|
}
|
|
423
433
|
return concat(u16(bytes.byteLength), bytes);
|
|
424
434
|
}
|
|
425
435
|
|
|
426
436
|
function sha256(value: Uint8Array): Buffer {
|
|
427
|
-
if (value.byteLength !==
|
|
428
|
-
throw new RangeError(
|
|
437
|
+
if (value.byteLength !== SHA256_DIGEST_BYTES) {
|
|
438
|
+
throw new RangeError(
|
|
439
|
+
`activationRecovery.sha256 must contain exactly ${SHA256_DIGEST_BYTES} bytes.`
|
|
440
|
+
);
|
|
429
441
|
}
|
|
430
|
-
return concat(Buffer.of(
|
|
442
|
+
return concat(Buffer.of(SHA256_DIGEST_BYTES), value);
|
|
431
443
|
}
|
|
432
444
|
|
|
433
445
|
function sized8(value: string, name: string): Buffer {
|
|
434
446
|
const bytes = Buffer.from(value);
|
|
435
|
-
if (
|
|
436
|
-
|
|
447
|
+
if (
|
|
448
|
+
bytes.byteLength < 1 ||
|
|
449
|
+
bytes.byteLength > SERVICE_WIRE_TEXT8_MAX_BYTES ||
|
|
450
|
+
bytes.includes(0)
|
|
451
|
+
) {
|
|
452
|
+
throw new RangeError(
|
|
453
|
+
`${name} must contain 1..${SERVICE_WIRE_TEXT8_MAX_BYTES} UTF-8 bytes without NUL.`
|
|
454
|
+
);
|
|
437
455
|
}
|
|
438
456
|
return concat(Buffer.of(bytes.byteLength), bytes);
|
|
439
457
|
}
|
|
@@ -458,7 +476,7 @@ function boundedU32(value: number, name: string): Buffer {
|
|
|
458
476
|
}
|
|
459
477
|
|
|
460
478
|
function u64(value: bigint, name: string): Buffer {
|
|
461
|
-
if (value <= 0n || value >
|
|
479
|
+
if (value <= 0n || value > UINT64_MAX) {
|
|
462
480
|
throw new RangeError(`${name} must be a non-zero u64.`);
|
|
463
481
|
}
|
|
464
482
|
const result = Buffer.alloc(8);
|
|
@@ -467,7 +485,7 @@ function u64(value: bigint, name: string): Buffer {
|
|
|
467
485
|
}
|
|
468
486
|
|
|
469
487
|
function ordinalU64(value: bigint, name: string): Buffer {
|
|
470
|
-
if (value < 0n || value >
|
|
488
|
+
if (value < 0n || value > UINT64_MAX) {
|
|
471
489
|
throw new RangeError(`${name} must be a u64.`);
|
|
472
490
|
}
|
|
473
491
|
const result = Buffer.alloc(8);
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isValidPublicWeight,
|
|
3
|
+
ZLINK_MAX_PUBLIC_WEIGHT
|
|
4
|
+
} from '../../contracts/Configuration/RegistrationBuilderPolicy';
|
|
5
|
+
import { SmoothWeightedSelection } from './service-weighted-selection';
|
|
1
6
|
export interface ClientServerDescriptor {
|
|
2
7
|
readonly channelName: string;
|
|
3
8
|
readonly serverRoutingId: string;
|
|
@@ -31,6 +36,20 @@ export interface SelectedClientServer {
|
|
|
31
36
|
|
|
32
37
|
/** Dedicated discovery state; fanout publishers never reuse RouteMesh peer rows. */
|
|
33
38
|
export class ServiceDiscoveryRegistry {
|
|
39
|
+
private readonly clientServerChanged = new Set<(error?: Error) => void>();
|
|
40
|
+
|
|
41
|
+
onClientServerChanged(listener: (error?: Error) => void): () => void {
|
|
42
|
+
this.clientServerChanged.add(listener);
|
|
43
|
+
return () => {
|
|
44
|
+
this.clientServerChanged.delete(listener);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
dispose(error: Error): void {
|
|
49
|
+
for (const listener of this.clientServerChanged) listener(error);
|
|
50
|
+
this.clientServerChanged.clear();
|
|
51
|
+
}
|
|
52
|
+
|
|
34
53
|
private readonly clientServers = new Map<string, Current<ClientServerDescriptor>>();
|
|
35
54
|
private readonly fanoutPublishers = new Map<string, Current<FanoutPublisherDescriptor>>();
|
|
36
55
|
private readonly clientServerSelections = new Map<
|
|
@@ -101,6 +120,14 @@ export class ServiceDiscoveryRegistry {
|
|
|
101
120
|
return selection.select();
|
|
102
121
|
}
|
|
103
122
|
|
|
123
|
+
hasReadyClientServer(channelName: string): boolean {
|
|
124
|
+
return [...this.clientServers.values()].some(
|
|
125
|
+
({ descriptor }) =>
|
|
126
|
+
descriptor.channelName === channelName &&
|
|
127
|
+
(descriptor.state === 'serving' || descriptor.state === 'retiring')
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
104
131
|
clientServerDescriptors(channelName: string): readonly ClientServerDescriptor[] {
|
|
105
132
|
return [...this.clientServers.values()]
|
|
106
133
|
.map((value) => value.descriptor)
|
|
@@ -161,6 +188,7 @@ export class ServiceDiscoveryRegistry {
|
|
|
161
188
|
if (this.clientServerSelections.has(channelName)) {
|
|
162
189
|
this.clientServerSelections.get(channelName)!.rebuild();
|
|
163
190
|
}
|
|
191
|
+
for (const listener of this.clientServerChanged) listener();
|
|
164
192
|
}
|
|
165
193
|
|
|
166
194
|
private clientServerCandidates(channelName: string) {
|
|
@@ -239,8 +267,10 @@ function validateClientServer(descriptor: ClientServerDescriptor): void {
|
|
|
239
267
|
requireText(descriptor.securityIdentity, 'securityIdentity');
|
|
240
268
|
requireText(descriptor.advertisedEndpoint, 'advertisedEndpoint');
|
|
241
269
|
validateRevision(descriptor.lifecycleGeneration, descriptor.descriptorRevision);
|
|
242
|
-
if (!
|
|
243
|
-
throw new RangeError(
|
|
270
|
+
if (!isValidPublicWeight(descriptor.weight)) {
|
|
271
|
+
throw new RangeError(
|
|
272
|
+
`ClientServer weight must be an integer in 0..${ZLINK_MAX_PUBLIC_WEIGHT}.`
|
|
273
|
+
);
|
|
244
274
|
}
|
|
245
275
|
if (
|
|
246
276
|
!Number.isSafeInteger(descriptor.effectiveMaxMessageBytes) ||
|
|
@@ -268,4 +298,3 @@ function requireText(value: string, field: string): void {
|
|
|
268
298
|
throw new TypeError(`${field} must be non-empty text without NUL.`);
|
|
269
299
|
}
|
|
270
300
|
}
|
|
271
|
-
import { SmoothWeightedSelection } from './service-weighted-selection';
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { SERVICE_WIRE_TEXT8_MAX_BYTES } from './service-wire-binary-primitives';
|
|
2
|
+
import { UINT64_MAX } from '@zlink-systems/stream-wire';
|
|
1
3
|
import { crc32c } from './service-relocation-runtime';
|
|
2
4
|
import { validateApplicationPayloadFrame } from './service-wire-m6a-codec';
|
|
3
5
|
import type { ServiceInstanceActivationTarget } from './service-stateful-wire-codec';
|
|
@@ -199,8 +201,14 @@ function requireOperation(value: ServiceInstanceActivationRecoveryEnvelope): voi
|
|
|
199
201
|
|
|
200
202
|
function textBytes(value: string, name: string): Buffer {
|
|
201
203
|
const bytes = Buffer.from(value, 'utf8');
|
|
202
|
-
if (
|
|
203
|
-
|
|
204
|
+
if (
|
|
205
|
+
bytes.byteLength < 1 ||
|
|
206
|
+
bytes.byteLength > SERVICE_WIRE_TEXT8_MAX_BYTES ||
|
|
207
|
+
bytes.includes(0)
|
|
208
|
+
) {
|
|
209
|
+
throw new RangeError(
|
|
210
|
+
`${name} must contain 1..${SERVICE_WIRE_TEXT8_MAX_BYTES} UTF-8 bytes without NUL.`
|
|
211
|
+
);
|
|
204
212
|
}
|
|
205
213
|
return bytes;
|
|
206
214
|
}
|
|
@@ -216,13 +224,13 @@ function writeText8(target: Buffer, offset: number, value: Uint8Array): number {
|
|
|
216
224
|
}
|
|
217
225
|
|
|
218
226
|
function validatePositiveU64(value: bigint, name: string): void {
|
|
219
|
-
if (value <= 0n || value >
|
|
227
|
+
if (value <= 0n || value > UINT64_MAX) {
|
|
220
228
|
throw new RangeError(`${name} is out of range.`);
|
|
221
229
|
}
|
|
222
230
|
}
|
|
223
231
|
|
|
224
232
|
function validateU64(value: bigint, name: string): void {
|
|
225
|
-
if (value < 0n || value >
|
|
233
|
+
if (value < 0n || value > UINT64_MAX) {
|
|
226
234
|
throw new RangeError(`${name} is out of range.`);
|
|
227
235
|
}
|
|
228
236
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UINT64_MAX } from '@zlink-systems/stream-wire';
|
|
1
2
|
export interface ServiceProbe {
|
|
2
3
|
readonly nodeRoutingId: string;
|
|
3
4
|
readonly connectionId: string;
|
|
@@ -139,7 +140,7 @@ export class ServiceLivenessRegistry {
|
|
|
139
140
|
|
|
140
141
|
private allocateProbeId(): bigint {
|
|
141
142
|
const result = this.nextProbeId++;
|
|
142
|
-
if (this.nextProbeId >
|
|
143
|
+
if (this.nextProbeId > UINT64_MAX) this.nextProbeId = 1n;
|
|
143
144
|
return result;
|
|
144
145
|
}
|
|
145
146
|
}
|
|
@@ -252,13 +252,3 @@ export class ServiceMaintenanceRuntime {
|
|
|
252
252
|
function startOutsideStateLane<T>(work: () => T): T {
|
|
253
253
|
return detachedStateLaneResource.runInAsyncScope(work);
|
|
254
254
|
}
|
|
255
|
-
|
|
256
|
-
export function classifyRelocationRecovery(
|
|
257
|
-
publishedReference: boolean,
|
|
258
|
-
payloadPresent: boolean,
|
|
259
|
-
checksumMatches: boolean,
|
|
260
|
-
inventoryMatches: boolean
|
|
261
|
-
): 'resume' | 'orphan' | 'relocationDataLost' {
|
|
262
|
-
if (!publishedReference) return payloadPresent ? 'orphan' : 'resume';
|
|
263
|
-
return payloadPresent && checksumMatches && inventoryMatches ? 'resume' : 'relocationDataLost';
|
|
264
|
-
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { ZLINK_STREAM_MAX_METADATA_BYTES as MAX_METADATA_BYTES } from '@zlink-systems/stream-wire';
|
|
2
2
|
const FATAL_UTF8 = new TextDecoder('utf-8', { fatal: true });
|
|
3
3
|
|
|
4
4
|
export function encodeServiceMetadataFrame(entries: ReadonlyMap<string, string>): Buffer {
|
|
@@ -18,7 +18,7 @@ export function encodeServiceMetadataFrame(entries: ReadonlyMap<string, string>)
|
|
|
18
18
|
|
|
19
19
|
export function validateServiceMetadataFrame(frame: Uint8Array): Buffer {
|
|
20
20
|
if (frame.byteLength > MAX_METADATA_BYTES) {
|
|
21
|
-
throw new RangeError(
|
|
21
|
+
throw new RangeError(`Application metadata frame exceeds ${MAX_METADATA_BYTES} bytes.`);
|
|
22
22
|
}
|
|
23
23
|
const bytes = Buffer.from(frame);
|
|
24
24
|
let offset = 0;
|
|
@@ -36,15 +36,13 @@ export interface ServicePreparedRelocationAggregate {
|
|
|
36
36
|
readonly plan: ServiceRelocationAggregatePlan;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
type AggregateStore = Pick<
|
|
40
|
-
ZLinkObjectCreationStore,
|
|
41
|
-
'prepareAggregate' | 'commitAggregate' | 'abortAggregate'
|
|
42
|
-
> &
|
|
39
|
+
type AggregateStore = Pick<ZLinkObjectCreationStore, 'prepareAggregate' | 'abortAggregate'> &
|
|
43
40
|
Pick<ZLinkAuthorityStore, 'readAuthority'>;
|
|
44
41
|
|
|
45
42
|
const MAX_PREPARE_CONFLICT_ATTEMPTS = 8;
|
|
46
43
|
|
|
47
|
-
/**
|
|
44
|
+
/** Prepares and aborts relocation through one Location Store fence. */
|
|
45
|
+
|
|
48
46
|
export class ServiceRelocationAggregateCommitter {
|
|
49
47
|
constructor(private readonly store: AggregateStore) {}
|
|
50
48
|
|
|
@@ -109,73 +107,12 @@ export class ServiceRelocationAggregateCommitter {
|
|
|
109
107
|
return true;
|
|
110
108
|
}
|
|
111
109
|
|
|
112
|
-
async commit(
|
|
113
|
-
prepared: ServicePreparedRelocationAggregate,
|
|
114
|
-
signal?: AbortSignal
|
|
115
|
-
): Promise<ReadonlyMap<string, ZLinkAuthoritySnapshot>> {
|
|
116
|
-
try {
|
|
117
|
-
await this.commitFence(prepared.fence, signal);
|
|
118
|
-
} catch (firstError) {
|
|
119
|
-
// A lost commit response is reconciled by repeating the exact durable fence.
|
|
120
|
-
try {
|
|
121
|
-
await this.commitFence(prepared.fence, signal);
|
|
122
|
-
} catch {
|
|
123
|
-
throw firstError;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return await this.readCommittedParticipants(prepared.plan, signal);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
110
|
async abort(prepared: ServicePreparedRelocationAggregate, signal?: AbortSignal): Promise<void> {
|
|
130
111
|
const result = await this.store.abortAggregate(prepared.fence, signal);
|
|
131
112
|
if (result.kind !== 'aborted' && result.kind !== 'alreadyAborted') {
|
|
132
113
|
throw new Error(`Location Store rejected relocation aggregate abort: ${result.kind}.`);
|
|
133
114
|
}
|
|
134
115
|
}
|
|
135
|
-
|
|
136
|
-
private async commitFence(fence: ZLinkAggregateFence, signal?: AbortSignal): Promise<void> {
|
|
137
|
-
const result = await this.store.commitAggregate(fence, signal);
|
|
138
|
-
if (result.kind !== 'committed' && result.kind !== 'alreadyCommitted') {
|
|
139
|
-
throw new Error(`Location Store rejected relocation aggregate commit: ${result.kind}.`);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
private async readCommittedParticipants(
|
|
144
|
-
plan: ServiceRelocationAggregatePlan,
|
|
145
|
-
signal?: AbortSignal
|
|
146
|
-
): Promise<ReadonlyMap<string, ZLinkAuthoritySnapshot>> {
|
|
147
|
-
const committed = new Map<string, ZLinkAuthoritySnapshot>();
|
|
148
|
-
for (const participant of plan.participants) {
|
|
149
|
-
const current = await this.store.readAuthority(participant.key, signal);
|
|
150
|
-
if (
|
|
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))
|
|
155
|
-
) {
|
|
156
|
-
throw new Error(
|
|
157
|
-
'Committed relocation aggregate does not match its exact participant plan.'
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
if (participant.ownerTransition === 'newOwner') {
|
|
161
|
-
if (
|
|
162
|
-
current.ownerId !== plan.targetOwner.ownerId ||
|
|
163
|
-
current.ownerLeaseGeneration !== plan.targetOwner.leaseGeneration ||
|
|
164
|
-
current.authorityOwnerGeneration <= participant.expected.authorityOwnerGeneration
|
|
165
|
-
) {
|
|
166
|
-
throw new Error('Committed relocation participant has a different owner fence.');
|
|
167
|
-
}
|
|
168
|
-
} else if (
|
|
169
|
-
current.ownerId !== participant.expected.ownerId ||
|
|
170
|
-
current.ownerLeaseGeneration !== participant.expected.ownerLeaseGeneration ||
|
|
171
|
-
current.authorityOwnerGeneration !== participant.expected.authorityOwnerGeneration
|
|
172
|
-
) {
|
|
173
|
-
throw new Error('Preserved relocation participant changed its owner fence.');
|
|
174
|
-
}
|
|
175
|
-
committed.set(participant.key.value, current);
|
|
176
|
-
}
|
|
177
|
-
return committed;
|
|
178
|
-
}
|
|
179
116
|
}
|
|
180
117
|
|
|
181
118
|
function validateAndEncodeParticipants(
|
|
@@ -13,6 +13,7 @@ import type {
|
|
|
13
13
|
ServiceRelocationQueuedMessage,
|
|
14
14
|
ServiceRelocationTimer
|
|
15
15
|
} from './service-relocation-runtime';
|
|
16
|
+
const DEFAULT_RELOCATION_CALLBACK_CONCURRENCY = 8;
|
|
16
17
|
|
|
17
18
|
export interface ServiceRelocationSealedWork {
|
|
18
19
|
readonly boundSessionState: Uint8Array;
|
|
@@ -84,7 +85,9 @@ export class ServiceCapturedObjectRelocation {
|
|
|
84
85
|
|
|
85
86
|
/** Captures the two valid relocation units: User Spot aggregate or one Actor. */
|
|
86
87
|
export class ServiceRelocationObjectCaptureOwner {
|
|
87
|
-
constructor(
|
|
88
|
+
constructor(
|
|
89
|
+
private readonly maxConcurrentCallbacks: number = DEFAULT_RELOCATION_CALLBACK_CONCURRENCY
|
|
90
|
+
) {
|
|
88
91
|
requireCallbackConcurrency(maxConcurrentCallbacks);
|
|
89
92
|
}
|
|
90
93
|
|
|
@@ -254,7 +257,7 @@ export class ServiceRelocationObjectRestoreOwner<
|
|
|
254
257
|
constructor(
|
|
255
258
|
private readonly target: ServiceRelocationTargetObjectPort<THidden>,
|
|
256
259
|
private readonly authorityKey: (value: string) => ZLinkAuthorityKey,
|
|
257
|
-
private readonly maxConcurrentCallbacks =
|
|
260
|
+
private readonly maxConcurrentCallbacks: number = DEFAULT_RELOCATION_CALLBACK_CONCURRENCY
|
|
258
261
|
) {
|
|
259
262
|
requireCallbackConcurrency(maxConcurrentCallbacks);
|
|
260
263
|
}
|
|
@@ -1,15 +1,25 @@
|
|
|
1
|
+
import { UINT64_MAX } from '@zlink-systems/stream-wire';
|
|
1
2
|
import { createHash } from 'node:crypto';
|
|
3
|
+
import { AUTHORITY_ENVELOPE_MAX_BYTES } from '../../contracts/Configuration/InternalDefaults';
|
|
4
|
+
import { decodeAuthorityKey } from '../locations/authority-key-codec';
|
|
2
5
|
import type {
|
|
3
|
-
|
|
4
|
-
|
|
6
|
+
ZLinkAuthorityKey,
|
|
7
|
+
ZLinkPlacementObjectKind
|
|
5
8
|
} from '../locations/internal-location-contracts';
|
|
6
|
-
import {
|
|
9
|
+
import { enumWireRelocationPhase } from '../protocol/service_wire_codec.generated';
|
|
7
10
|
import {
|
|
8
11
|
decodeRelocationEnvelopeV1 as decodeGeneratedRelocationEnvelopeV1,
|
|
9
12
|
encodeRelocationEnvelopeV1 as encodeGeneratedRelocationEnvelopeV1,
|
|
10
13
|
type RelocationEnvelopeV1 as GeneratedRelocationEnvelopeV1,
|
|
11
14
|
type RelocationObjectIdentity as GeneratedRelocationObjectIdentity
|
|
12
15
|
} from '../protocol/service_wire_pilot_codec.generated';
|
|
16
|
+
import { SHA256_DIGEST_BYTES } from './actor-join-recovery-codec';
|
|
17
|
+
const MAX_RELOCATION_GENERATION = 0x7fff_ffff_ffff_ffffn;
|
|
18
|
+
|
|
19
|
+
const RELOCATION_PREPARING_PHASE = enumWireRelocationPhase('preparing');
|
|
20
|
+
const RELOCATION_ACTIVATING_PHASE = enumWireRelocationPhase('activating');
|
|
21
|
+
const RELOCATION_COMPLETED_PHASE = enumWireRelocationPhase('completed');
|
|
22
|
+
const RELOCATION_LAST_PHASE = enumWireRelocationPhase('aborted');
|
|
13
23
|
|
|
14
24
|
export interface ServiceRelocationParticipant {
|
|
15
25
|
/** Wire-local participant ordinal; identity is projected from Location Store. */
|
|
@@ -280,7 +290,7 @@ export function projectServiceRelocationAuthorityTargetReady(
|
|
|
280
290
|
coordinatorNodeRid: target.nodeRid,
|
|
281
291
|
coordinatorNodeGeneration: target.nodeGeneration,
|
|
282
292
|
coordinatorExpectedStoreVersion: target.coordinatorExpectedStoreVersion,
|
|
283
|
-
phase:
|
|
293
|
+
phase: RELOCATION_ACTIVATING_PHASE,
|
|
284
294
|
sourceCleanupState: 0
|
|
285
295
|
});
|
|
286
296
|
return replaceCanonicalRelocationSlot(layout, slot);
|
|
@@ -323,7 +333,7 @@ function decodeCanonicalAuthorityPublication(
|
|
|
323
333
|
function decodeCanonicalAuthorityLayout(payload: Uint8Array): CanonicalAuthorityLayout | undefined {
|
|
324
334
|
try {
|
|
325
335
|
const bytes = Buffer.from(payload);
|
|
326
|
-
if (bytes.byteLength < 20 || bytes.byteLength >
|
|
336
|
+
if (bytes.byteLength < 20 || bytes.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) return undefined;
|
|
327
337
|
const reader = new CanonicalReader(bytes);
|
|
328
338
|
reader.expect(Buffer.from('ZLAU'));
|
|
329
339
|
if (reader.u8() !== 1) return undefined;
|
|
@@ -395,21 +405,21 @@ export function decodeCanonicalRelocationSlot(
|
|
|
395
405
|
if (
|
|
396
406
|
!reader.done ||
|
|
397
407
|
aggregateGeneration > 0x7fff_ffff_ffff_fffen ||
|
|
398
|
-
(aggregateGeneration === 0n && phase !==
|
|
408
|
+
(aggregateGeneration === 0n && phase !== RELOCATION_PREPARING_PHASE) ||
|
|
399
409
|
(rootAggregateGeneration !== undefined && aggregateGeneration !== rootAggregateGeneration) ||
|
|
400
|
-
targetAttemptGeneration >
|
|
410
|
+
targetAttemptGeneration > MAX_RELOCATION_GENERATION ||
|
|
401
411
|
sourceNodeGeneration === 0n ||
|
|
402
|
-
sourceNodeGeneration >
|
|
412
|
+
sourceNodeGeneration > MAX_RELOCATION_GENERATION ||
|
|
403
413
|
sourceOwnerLeaseGeneration === 0n ||
|
|
404
|
-
sourceOwnerLeaseGeneration >
|
|
405
|
-
targetNodeGeneration >
|
|
406
|
-
targetOwnerLeaseGeneration >
|
|
414
|
+
sourceOwnerLeaseGeneration > MAX_RELOCATION_GENERATION ||
|
|
415
|
+
targetNodeGeneration > MAX_RELOCATION_GENERATION ||
|
|
416
|
+
targetOwnerLeaseGeneration > MAX_RELOCATION_GENERATION ||
|
|
407
417
|
coordinatorLeaseGeneration === 0n ||
|
|
408
|
-
coordinatorLeaseGeneration >
|
|
418
|
+
coordinatorLeaseGeneration > MAX_RELOCATION_GENERATION ||
|
|
409
419
|
coordinatorNodeGeneration === 0n ||
|
|
410
|
-
coordinatorNodeGeneration >
|
|
411
|
-
phase <
|
|
412
|
-
phase >
|
|
420
|
+
coordinatorNodeGeneration > MAX_RELOCATION_GENERATION ||
|
|
421
|
+
phase < RELOCATION_PREPARING_PHASE ||
|
|
422
|
+
phase > RELOCATION_LAST_PHASE ||
|
|
413
423
|
applicationVersion < 0n ||
|
|
414
424
|
sourceCleanupState > 2
|
|
415
425
|
)
|
|
@@ -452,10 +462,10 @@ export function encodeCanonicalRelocationSlot(value: CanonicalRelocationSlot): B
|
|
|
452
462
|
if (aggregateGeneration > 0x7fff_ffff_ffff_fffen) {
|
|
453
463
|
throw new TypeError('Aggregate generation exceeds the issued range.');
|
|
454
464
|
}
|
|
455
|
-
if (aggregateGeneration === 0n && value.phase !==
|
|
465
|
+
if (aggregateGeneration === 0n && value.phase !== RELOCATION_PREPARING_PHASE) {
|
|
456
466
|
throw new TypeError('Zero aggregate generation is only valid while preparing.');
|
|
457
467
|
}
|
|
458
|
-
if (targetAttemptGeneration >
|
|
468
|
+
if (targetAttemptGeneration > MAX_RELOCATION_GENERATION) {
|
|
459
469
|
throw new TypeError('Target attempt generation exceeds the ordinal range.');
|
|
460
470
|
}
|
|
461
471
|
const sourceNodeGeneration = canonicalNonZeroOrdinal(
|
|
@@ -482,7 +492,11 @@ export function encodeCanonicalRelocationSlot(value: CanonicalRelocationSlot): B
|
|
|
482
492
|
value.coordinatorNodeGeneration,
|
|
483
493
|
'coordinator node generation'
|
|
484
494
|
);
|
|
485
|
-
if (
|
|
495
|
+
if (
|
|
496
|
+
!Number.isInteger(value.phase) ||
|
|
497
|
+
value.phase < RELOCATION_PREPARING_PHASE ||
|
|
498
|
+
value.phase > RELOCATION_LAST_PHASE
|
|
499
|
+
) {
|
|
486
500
|
throw new TypeError('Canonical relocation phase is invalid.');
|
|
487
501
|
}
|
|
488
502
|
if (
|
|
@@ -553,7 +567,7 @@ function encodeCanonicalRelocationPublicationSlot(
|
|
|
553
567
|
coordinatorNodeRid: publication.coordinatorNodeRid ?? nodeRid,
|
|
554
568
|
coordinatorNodeGeneration: publication.coordinatorNodeGeneration ?? layout.nodeGeneration,
|
|
555
569
|
coordinatorExpectedStoreVersion: publication.coordinatorExpectedStoreVersion ?? '',
|
|
556
|
-
phase: publication.canonicalPhase ??
|
|
570
|
+
phase: publication.canonicalPhase ?? RELOCATION_COMPLETED_PHASE,
|
|
557
571
|
applicationVersion,
|
|
558
572
|
sourceCleanupState: publication.canonicalSourceCleanupState ?? 0
|
|
559
573
|
});
|
|
@@ -579,8 +593,10 @@ function replaceCanonicalRelocationSlot(
|
|
|
579
593
|
body
|
|
580
594
|
]);
|
|
581
595
|
const result = Buffer.concat([envelope, canonicalU32(crc32c(envelope))]);
|
|
582
|
-
if (result.byteLength >
|
|
583
|
-
throw new TypeError(
|
|
596
|
+
if (result.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) {
|
|
597
|
+
throw new TypeError(
|
|
598
|
+
`Canonical authority payload exceeds ${AUTHORITY_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`
|
|
599
|
+
);
|
|
584
600
|
}
|
|
585
601
|
return result;
|
|
586
602
|
}
|
|
@@ -1022,8 +1038,8 @@ function encodeAuthorityEnvelope(
|
|
|
1022
1038
|
'target owner lease generation'
|
|
1023
1039
|
);
|
|
1024
1040
|
if (
|
|
1025
|
-
aggregateGeneration >
|
|
1026
|
-
targetOwnerLeaseGeneration >
|
|
1041
|
+
aggregateGeneration > MAX_RELOCATION_GENERATION ||
|
|
1042
|
+
targetOwnerLeaseGeneration > MAX_RELOCATION_GENERATION
|
|
1027
1043
|
) {
|
|
1028
1044
|
throw new TypeError('Relocation publication generations must fit signed 64-bit storage.');
|
|
1029
1045
|
}
|
|
@@ -1040,8 +1056,10 @@ function encodeAuthorityEnvelope(
|
|
|
1040
1056
|
i64le(targetOwnerLeaseGeneration),
|
|
1041
1057
|
bytes32le(base)
|
|
1042
1058
|
]);
|
|
1043
|
-
if (payload.byteLength >
|
|
1044
|
-
throw new TypeError(
|
|
1059
|
+
if (payload.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) {
|
|
1060
|
+
throw new TypeError(
|
|
1061
|
+
`Location authority relocation payload exceeds ${AUTHORITY_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`
|
|
1062
|
+
);
|
|
1045
1063
|
}
|
|
1046
1064
|
return payload;
|
|
1047
1065
|
}
|
|
@@ -1067,8 +1085,8 @@ function decodeAuthorityEnvelope(
|
|
|
1067
1085
|
if (
|
|
1068
1086
|
!reader.done ||
|
|
1069
1087
|
aggregateGeneration === 0n ||
|
|
1070
|
-
aggregateGeneration >
|
|
1071
|
-
inventoryDigestBytes.byteLength !==
|
|
1088
|
+
aggregateGeneration > MAX_RELOCATION_GENERATION ||
|
|
1089
|
+
inventoryDigestBytes.byteLength !== SHA256_DIGEST_BYTES ||
|
|
1072
1090
|
targetOwnerLeaseGeneration <= 0n
|
|
1073
1091
|
) {
|
|
1074
1092
|
return undefined;
|
|
@@ -1181,8 +1199,10 @@ function text16le(value: string): Buffer {
|
|
|
1181
1199
|
|
|
1182
1200
|
function bytes32le(value: Uint8Array): Buffer {
|
|
1183
1201
|
const bytes = Buffer.from(value);
|
|
1184
|
-
if (bytes.byteLength >
|
|
1185
|
-
throw new TypeError(
|
|
1202
|
+
if (bytes.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) {
|
|
1203
|
+
throw new TypeError(
|
|
1204
|
+
`Relocation byte field exceeds ${AUTHORITY_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`
|
|
1205
|
+
);
|
|
1186
1206
|
}
|
|
1187
1207
|
const length = Buffer.alloc(4);
|
|
1188
1208
|
length.writeInt32LE(bytes.byteLength);
|
|
@@ -1350,7 +1370,7 @@ function canonicalU32(value: number): Buffer {
|
|
|
1350
1370
|
}
|
|
1351
1371
|
|
|
1352
1372
|
function canonicalU64(value: bigint): Buffer {
|
|
1353
|
-
if (value < 0n || value >
|
|
1373
|
+
if (value < 0n || value > UINT64_MAX) {
|
|
1354
1374
|
throw new TypeError('Canonical authority u64 is invalid.');
|
|
1355
1375
|
}
|
|
1356
1376
|
const result = Buffer.alloc(8);
|
|
@@ -1360,7 +1380,7 @@ function canonicalU64(value: bigint): Buffer {
|
|
|
1360
1380
|
|
|
1361
1381
|
function canonicalOrdinal(value: bigint, name: string): bigint {
|
|
1362
1382
|
const ordinal = nonNegativeBigInt(value, name);
|
|
1363
|
-
if (ordinal >
|
|
1383
|
+
if (ordinal > MAX_RELOCATION_GENERATION) {
|
|
1364
1384
|
throw new TypeError(`${name} exceeds the ordinal range.`);
|
|
1365
1385
|
}
|
|
1366
1386
|
return ordinal;
|
|
@@ -1373,7 +1393,7 @@ function canonicalNonZeroOrdinal(value: bigint, name: string): bigint {
|
|
|
1373
1393
|
}
|
|
1374
1394
|
|
|
1375
1395
|
function canonicalI64(value: bigint): Buffer {
|
|
1376
|
-
if (value < 0n || value >
|
|
1396
|
+
if (value < 0n || value > MAX_RELOCATION_GENERATION) {
|
|
1377
1397
|
throw new TypeError('Canonical authority i64 is invalid.');
|
|
1378
1398
|
}
|
|
1379
1399
|
const result = Buffer.alloc(8);
|
|
@@ -1387,8 +1407,10 @@ class DotnetBinaryReader {
|
|
|
1387
1407
|
|
|
1388
1408
|
constructor(payload: Uint8Array) {
|
|
1389
1409
|
this.bytes = Buffer.from(payload);
|
|
1390
|
-
if (this.bytes.byteLength >
|
|
1391
|
-
throw new TypeError(
|
|
1410
|
+
if (this.bytes.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) {
|
|
1411
|
+
throw new TypeError(
|
|
1412
|
+
`Location authority relocation payload exceeds ${AUTHORITY_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`
|
|
1413
|
+
);
|
|
1392
1414
|
}
|
|
1393
1415
|
}
|
|
1394
1416
|
|
|
@@ -1426,7 +1448,7 @@ class DotnetBinaryReader {
|
|
|
1426
1448
|
|
|
1427
1449
|
bytes32(): Buffer {
|
|
1428
1450
|
const length = this.take(4).readInt32LE(0);
|
|
1429
|
-
if (length < 0 || length >
|
|
1451
|
+
if (length < 0 || length > AUTHORITY_ENVELOPE_MAX_BYTES) {
|
|
1430
1452
|
throw new TypeError('Location authority relocation byte field is invalid.');
|
|
1431
1453
|
}
|
|
1432
1454
|
return Buffer.from(this.take(length));
|