@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,6 +1,7 @@
|
|
|
1
1
|
import { type ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
|
|
2
2
|
import type { RoutingId } from '../../contracts/Common';
|
|
3
3
|
import { type ZLinkPeerLocationResolver, type ZLinkPeerLocation } from './internal-location-contracts';
|
|
4
|
+
import type { ZLinkDispatchErrorSink } from '../diagnostics/dispatch-error-port';
|
|
4
5
|
import type { IZLinkAutoConnectExecutor, IZLinkAutoConnectPeerPublisher, ZLinkAutoConnectEventSink, ZLinkAutoConnectLocal, ZLinkAutoConnectTarget } from './auto-connect-types';
|
|
5
6
|
export interface ZLinkAutoConnectReconcilerOptions {
|
|
6
7
|
readonly local: ZLinkAutoConnectLocal;
|
|
@@ -12,6 +13,7 @@ export interface ZLinkAutoConnectReconcilerOptions {
|
|
|
12
13
|
readonly events?: ZLinkAutoConnectEventSink;
|
|
13
14
|
readonly options?: ZLinkLocationOptionOverrides;
|
|
14
15
|
readonly monotonicNowMs?: () => number;
|
|
16
|
+
readonly errorSink: ZLinkDispatchErrorSink;
|
|
15
17
|
}
|
|
16
18
|
export declare class ZLinkAutoConnectReconciler {
|
|
17
19
|
private readonly lane;
|
|
@@ -24,6 +26,7 @@ export declare class ZLinkAutoConnectReconciler {
|
|
|
24
26
|
private readonly events?;
|
|
25
27
|
private readonly options;
|
|
26
28
|
private readonly monotonicNowMs;
|
|
29
|
+
private readonly errorSink;
|
|
27
30
|
private readonly active;
|
|
28
31
|
private readonly pendingDisconnects;
|
|
29
32
|
private readonly failedEndpoints;
|
|
@@ -50,6 +53,7 @@ export declare class ZLinkAutoConnectReconciler {
|
|
|
50
53
|
private completePublishClaimCore;
|
|
51
54
|
private preparePublishRenewalCore;
|
|
52
55
|
private recordStoreFailure;
|
|
56
|
+
private connectTarget;
|
|
53
57
|
private beginStoreFailureCore;
|
|
54
58
|
private completeStoreFailureConnectCore;
|
|
55
59
|
private recordDisconnectedEndpoint;
|
|
@@ -7,6 +7,7 @@ const key_codec_1 = require("./key-codec");
|
|
|
7
7
|
const EndpointNotation_1 = require("../../contracts/Configuration/EndpointNotation");
|
|
8
8
|
const auto_connect_planner_1 = require("./auto-connect-planner");
|
|
9
9
|
const state_lane_1 = require("../execution/state-lane");
|
|
10
|
+
const zlink_1 = require("@zlink-systems/zlink");
|
|
10
11
|
const encodeRoutingIdHex = key_codec_1.ZLinkLocationKeyCodec.encodeRoutingIdHex;
|
|
11
12
|
class ZLinkAutoConnectReconciler {
|
|
12
13
|
lane = new state_lane_1.ZLinkStateLane();
|
|
@@ -19,6 +20,7 @@ class ZLinkAutoConnectReconciler {
|
|
|
19
20
|
events;
|
|
20
21
|
options;
|
|
21
22
|
monotonicNowMs;
|
|
23
|
+
errorSink;
|
|
22
24
|
active = new Map();
|
|
23
25
|
pendingDisconnects = new Map();
|
|
24
26
|
failedEndpoints = new Set();
|
|
@@ -45,6 +47,7 @@ class ZLinkAutoConnectReconciler {
|
|
|
45
47
|
this.events = options.events;
|
|
46
48
|
this.options = { ...Options_1.zlinkRuntimeDefaultLocationOptions, ...options.options };
|
|
47
49
|
this.monotonicNowMs = options.monotonicNowMs ?? (() => performance.now());
|
|
50
|
+
this.errorSink = options.errorSink;
|
|
48
51
|
this.executor.onDisconnected?.((endpoint) => this.recordDisconnectedEndpoint(endpoint));
|
|
49
52
|
}
|
|
50
53
|
get storeFailed() {
|
|
@@ -116,13 +119,6 @@ class ZLinkAutoConnectReconciler {
|
|
|
116
119
|
await this.lane.run(() => {
|
|
117
120
|
this.storeFailedValue = false;
|
|
118
121
|
this.storeFailureStartedAtMs = undefined;
|
|
119
|
-
// After a store restart, owners may need one full lease interval to
|
|
120
|
-
// reclaim their token and republish a descriptor. Do not interpret the
|
|
121
|
-
// incomplete post-restart scan as a definitive removal.
|
|
122
|
-
// Keep the existing transport set through one lease interval while
|
|
123
|
-
// owners reclaim their tokens and republish descriptors. This deferral
|
|
124
|
-
// applies only after a Store operation failed; a successful empty scan
|
|
125
|
-
// is authoritative and must remove stale peers promptly.
|
|
126
122
|
this.recoveryDeferUntilMs = this.monotonicNowMs() + this.options.ownerLeaseTtlMs;
|
|
127
123
|
});
|
|
128
124
|
}
|
|
@@ -133,7 +129,6 @@ class ZLinkAutoConnectReconciler {
|
|
|
133
129
|
.map((nodeRid) => encodeRoutingIdHex(nodeRid)));
|
|
134
130
|
});
|
|
135
131
|
const candidates = auto_connect_planner_1.ZLinkAutoConnectPlanner.computeCandidates(this.local, rows);
|
|
136
|
-
const nowMs = this.monotonicNowMs();
|
|
137
132
|
this.executor.expectPeers?.([...candidates.values()]);
|
|
138
133
|
this.executor.replaceNotRequired?.(auto_connect_planner_1.ZLinkAutoConnectPlanner.computeNotRequired(this.local, rows));
|
|
139
134
|
const desired = new Map(auto_connect_planner_1.ZLinkAutoConnectPlanner.computeDesired(this.local, rows));
|
|
@@ -152,6 +147,19 @@ class ZLinkAutoConnectReconciler {
|
|
|
152
147
|
if (activeKeys.has(key))
|
|
153
148
|
desired.set(key, target);
|
|
154
149
|
}
|
|
150
|
+
const deferringMissingTargets = this.monotonicNowMs() < (await this.lane.run(() => this.recoveryDeferUntilMs));
|
|
151
|
+
let staleCandidates = candidates;
|
|
152
|
+
if (deferringMissingTargets) {
|
|
153
|
+
const retainedCandidates = new Map(candidates);
|
|
154
|
+
const lastDesired = await this.lane.run(() => [...this.lastDesired]);
|
|
155
|
+
for (const [key, target] of lastDesired) {
|
|
156
|
+
if (!desired.has(key))
|
|
157
|
+
desired.set(key, target);
|
|
158
|
+
if (!retainedCandidates.has(key))
|
|
159
|
+
retainedCandidates.set(key, target);
|
|
160
|
+
}
|
|
161
|
+
staleCandidates = retainedCandidates;
|
|
162
|
+
}
|
|
155
163
|
await this.lane.run(() => {
|
|
156
164
|
this.lastDesired = new Map(desired);
|
|
157
165
|
});
|
|
@@ -178,14 +186,13 @@ class ZLinkAutoConnectReconciler {
|
|
|
178
186
|
await this.lane.run(() => {
|
|
179
187
|
this.pendingDisconnects.delete(key);
|
|
180
188
|
});
|
|
181
|
-
|
|
182
|
-
if (connected) {
|
|
189
|
+
await this.connectTarget(target, async () => {
|
|
183
190
|
connectedEndpoints.push(target.endpoint);
|
|
184
191
|
await this.lane.run(() => {
|
|
185
192
|
this.active.set(key, target);
|
|
186
193
|
this.failedEndpoints.delete(target.endpoint);
|
|
187
194
|
});
|
|
188
|
-
}
|
|
195
|
+
});
|
|
189
196
|
continue;
|
|
190
197
|
}
|
|
191
198
|
if (current.endpoint !== target.endpoint || current.ownerId !== target.ownerId) {
|
|
@@ -203,25 +210,16 @@ class ZLinkAutoConnectReconciler {
|
|
|
203
210
|
await this.lane.run(() => {
|
|
204
211
|
this.pendingDisconnects.delete(key);
|
|
205
212
|
});
|
|
206
|
-
|
|
207
|
-
if (connected) {
|
|
213
|
+
await this.connectTarget(target, async () => {
|
|
208
214
|
connectedEndpoints.push(target.endpoint);
|
|
209
215
|
await this.lane.run(() => {
|
|
210
216
|
this.active.set(key, target);
|
|
211
217
|
this.failedEndpoints.delete(target.endpoint);
|
|
212
218
|
});
|
|
213
|
-
}
|
|
219
|
+
});
|
|
214
220
|
}
|
|
215
221
|
}
|
|
216
|
-
|
|
217
|
-
this.publishDesiredSetChange(connectedEndpoints, disconnectedEndpoints);
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
// A store restart can expose an incomplete descriptor set while peers are
|
|
221
|
-
// reclaiming their owner leases. Preserve existing transport connections
|
|
222
|
-
// during that recovery window; stale-peer cleanup is safe after the
|
|
223
|
-
// deferred reconciliation has completed.
|
|
224
|
-
this.executor.disconnectStalePeers?.([...candidates.values()]);
|
|
222
|
+
this.executor.disconnectStalePeers?.([...staleCandidates.values()]);
|
|
225
223
|
const activeTargets = await this.lane.run(() => [...this.active]);
|
|
226
224
|
for (const [key, target] of activeTargets) {
|
|
227
225
|
if (!desired.has(key)) {
|
|
@@ -330,10 +328,24 @@ class ZLinkAutoConnectReconciler {
|
|
|
330
328
|
if (retryTargets === undefined)
|
|
331
329
|
return;
|
|
332
330
|
for (const [key, target] of retryTargets) {
|
|
333
|
-
|
|
331
|
+
await this.connectTarget(target, async () => {
|
|
334
332
|
await this.lane.run(() => this.completeStoreFailureConnectCore(key, target));
|
|
335
|
-
}
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
async connectTarget(target, accept) {
|
|
337
|
+
let accepted;
|
|
338
|
+
try {
|
|
339
|
+
accepted = await this.executor.connect(target);
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
if (!(error instanceof zlink_1.ConnectError))
|
|
343
|
+
throw error;
|
|
344
|
+
this.errorSink.reportRuntimeTaskException('auto-connect', error);
|
|
345
|
+
return;
|
|
336
346
|
}
|
|
347
|
+
if (accepted)
|
|
348
|
+
await accept();
|
|
337
349
|
}
|
|
338
350
|
beginStoreFailureCore() {
|
|
339
351
|
const nowMs = this.monotonicNowMs();
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.randomOperationId = randomOperationId;
|
|
4
|
+
const stream_wire_1 = require("@zlink-systems/stream-wire");
|
|
5
|
+
const operation_identity_1 = require("../foundation/operation-identity");
|
|
4
6
|
const node_crypto_1 = require("node:crypto");
|
|
5
|
-
function randomOperationId(entropy = (0, node_crypto_1.randomBytes)(
|
|
6
|
-
if (entropy.byteLength !==
|
|
7
|
-
throw new RangeError(
|
|
7
|
+
function randomOperationId(entropy = (0, node_crypto_1.randomBytes)(operation_identity_1.OPERATION_IDENTITY_BYTES)) {
|
|
8
|
+
if (entropy.byteLength !== operation_identity_1.OPERATION_IDENTITY_BYTES)
|
|
9
|
+
throw new RangeError(`Operation ID entropy must be ${operation_identity_1.OPERATION_IDENTITY_BYTES} bytes.`);
|
|
8
10
|
const bytes = Buffer.from(entropy);
|
|
9
11
|
const high = bytes.readBigUInt64BE(0);
|
|
10
|
-
const low = bytes.readBigUInt64BE(
|
|
12
|
+
const low = bytes.readBigUInt64BE(stream_wire_1.UINT64_BYTES);
|
|
11
13
|
return high === 0n && low === 0n ? { high, low: 1n } : { high, low };
|
|
12
14
|
}
|
|
@@ -22,10 +22,10 @@ export interface ZLinkDomainLocationStore {
|
|
|
22
22
|
compareExchangeAuthority(key: ZLinkAuthorityKey, expectedStoreVersion: ZLinkAuthorityStoreVersion, mutation: ZLinkAuthorityMutation, signal?: AbortSignal): Promise<ZLinkAuthorityCompareExchangeResult>;
|
|
23
23
|
listAuthorities(prefix: string, cursor: ZLinkAuthorityScanCursor | undefined, limit: number, signal?: AbortSignal): Promise<ZLinkAuthorityScanResult>;
|
|
24
24
|
readCreationTerminal(operation: ZLinkCreationOperationIdentity, signal?: AbortSignal): Promise<ZLinkCreationTerminalReadResult>;
|
|
25
|
-
reserve(request: ZLinkObjectReserveRequest, signal?: AbortSignal): Promise<ZLinkObjectReserveResult>;
|
|
26
|
-
commit(request: ZLinkObjectCommitRequest, signal?: AbortSignal): Promise<ZLinkObjectCommitResult>;
|
|
25
|
+
reserve(request: ZLinkObjectReserveRequest, signal?: AbortSignal, deadlineUnixMs?: bigint): Promise<ZLinkObjectReserveResult>;
|
|
26
|
+
commit(request: ZLinkObjectCommitRequest, signal?: AbortSignal, deadlineUnixMs?: bigint): Promise<ZLinkObjectCommitResult>;
|
|
27
27
|
completeCreation(request: ZLinkObjectCreationCompleteRequest, signal?: AbortSignal): Promise<ZLinkObjectCreationCompleteResult>;
|
|
28
|
-
abort(request: ZLinkObjectAbortRequest, signal?: AbortSignal): Promise<ZLinkObjectAbortResult>;
|
|
28
|
+
abort(request: ZLinkObjectAbortRequest, signal?: AbortSignal, deadlineUnixMs?: bigint): Promise<ZLinkObjectAbortResult>;
|
|
29
29
|
prepareAggregate(request: ZLinkAggregatePrepareRequest, signal?: AbortSignal): Promise<ZLinkAggregatePrepareResult>;
|
|
30
30
|
commitAggregate(fence: ZLinkAggregateFence, signal?: AbortSignal): Promise<ZLinkAggregateCommitResult>;
|
|
31
31
|
abortAggregate(fence: ZLinkAggregateFence, signal?: AbortSignal): Promise<ZLinkAggregateAbortResult>;
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkInMemoryAuthorityStore = void 0;
|
|
4
|
+
const InternalDefaults_1 = require("../../contracts/Configuration/InternalDefaults");
|
|
5
|
+
const stream_wire_1 = require("@zlink-systems/stream-wire");
|
|
6
|
+
const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
|
|
7
|
+
const Stores_1 = require("../../contracts/Locations/Stores");
|
|
4
8
|
const node_crypto_1 = require("node:crypto");
|
|
9
|
+
const actor_join_recovery_codec_1 = require("../foundation/actor-join-recovery-codec");
|
|
5
10
|
const authority_key_codec_1 = require("./authority-key-codec");
|
|
6
11
|
const opaque_record_key_1 = require("./opaque-record-key");
|
|
7
12
|
const MAX_GENERATION = 0x7fffffffffffffffn;
|
|
8
|
-
const MAX_PAYLOAD_BYTES = 1024 * 1024;
|
|
9
13
|
const CREATION_TERMINAL_RETENTION_MS = 5 * 60 * 1000;
|
|
10
|
-
const MAX_U64 =
|
|
14
|
+
const MAX_U64 = stream_wire_1.UINT64_MAX;
|
|
11
15
|
/**
|
|
12
16
|
* In-memory reference provider for the provider-owned authority state machine.
|
|
13
17
|
* Opaque payload bytes are copied but never parsed.
|
|
@@ -101,11 +105,21 @@ class ZLinkInMemoryAuthorityStore {
|
|
|
101
105
|
if (!this.isOwnerLive(row.snapshot)) {
|
|
102
106
|
return { kind: 'conflict', current: this.read(keyValue) };
|
|
103
107
|
}
|
|
108
|
+
if (mutation.generationTransition === 'reincarnate' &&
|
|
109
|
+
(this.objectGeneration >= MAX_GENERATION || this.ownerGeneration >= MAX_GENERATION)) {
|
|
110
|
+
return { kind: 'generationExhausted' };
|
|
111
|
+
}
|
|
104
112
|
const nextVersion = this.tryNextStoreVersion();
|
|
105
113
|
if (nextVersion === undefined)
|
|
106
114
|
return { kind: 'generationExhausted' };
|
|
107
115
|
row.snapshot = {
|
|
108
116
|
...row.snapshot,
|
|
117
|
+
...(mutation.generationTransition === 'reincarnate'
|
|
118
|
+
? {
|
|
119
|
+
objectGeneration: ++this.objectGeneration,
|
|
120
|
+
authorityOwnerGeneration: ++this.ownerGeneration
|
|
121
|
+
}
|
|
122
|
+
: {}),
|
|
109
123
|
storeVersion: version(nextVersion),
|
|
110
124
|
payload: Buffer.from(mutation.payload)
|
|
111
125
|
};
|
|
@@ -114,8 +128,8 @@ class ZLinkInMemoryAuthorityStore {
|
|
|
114
128
|
}
|
|
115
129
|
async listAuthorities(prefix, cursor, limit, signal) {
|
|
116
130
|
signal?.throwIfAborted();
|
|
117
|
-
if (!Number.isInteger(limit) || limit < 1 || limit >
|
|
118
|
-
throw new RangeError(
|
|
131
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > Stores_1.ZLINK_PROVIDER_MAX_PAGE_SIZE) {
|
|
132
|
+
throw new RangeError(`Authority scan limit must be in 1..${Stores_1.ZLINK_PROVIDER_MAX_PAGE_SIZE}.`);
|
|
119
133
|
}
|
|
120
134
|
const decoded = cursor === undefined
|
|
121
135
|
? { revision: this.scanRevision, offset: 0, prefix }
|
|
@@ -611,7 +625,7 @@ function validateAuthorityMutation(mutation) {
|
|
|
611
625
|
}
|
|
612
626
|
const generationTransition = mutation
|
|
613
627
|
.generationTransition;
|
|
614
|
-
if (generationTransition !== 'preserve') {
|
|
628
|
+
if (generationTransition !== 'preserve' && generationTransition !== 'reincarnate') {
|
|
615
629
|
throw new TypeError('Authority owner transitions require an aggregate CAS.');
|
|
616
630
|
}
|
|
617
631
|
}
|
|
@@ -621,17 +635,19 @@ function validateReserve(request) {
|
|
|
621
635
|
requireText(request.intent.requestContentReference, 'creation content reference');
|
|
622
636
|
validatePayload(request.creatingPayload);
|
|
623
637
|
validateCapacityVector(request.capacity);
|
|
624
|
-
if (request.intent.requestSha256.byteLength !==
|
|
638
|
+
if (request.intent.requestSha256.byteLength !== actor_join_recovery_codec_1.SHA256_DIGEST_BYTES ||
|
|
625
639
|
request.intent.requestEncodedSize < 0n ||
|
|
626
|
-
request.intent.requestEncodedSize > BigInt(
|
|
640
|
+
request.intent.requestEncodedSize > BigInt(InternalDefaults_1.CREATION_INTENT_MAX_BYTES)) {
|
|
627
641
|
throw new TypeError('Object creation content receipt is invalid.');
|
|
628
642
|
}
|
|
629
643
|
}
|
|
630
644
|
function validateCreationOperation(operation) {
|
|
631
645
|
const sourceRid = String(operation.sourceNodeRid);
|
|
632
646
|
const sourceRidBytes = Buffer.byteLength(sourceRid, 'utf8');
|
|
633
|
-
if (sourceRidBytes < 1 ||
|
|
634
|
-
|
|
647
|
+
if (sourceRidBytes < 1 ||
|
|
648
|
+
sourceRidBytes > CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES ||
|
|
649
|
+
sourceRid.includes('\0')) {
|
|
650
|
+
throw new TypeError(`Creation terminal source node RID must contain 1..${CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES} UTF-8 bytes without NUL.`);
|
|
635
651
|
}
|
|
636
652
|
if (operation.sourceNodeGeneration < 1n ||
|
|
637
653
|
operation.sourceNodeGeneration > MAX_U64 ||
|
|
@@ -647,8 +663,8 @@ function validateTerminalForMutation(publication, storeNow) {
|
|
|
647
663
|
if (publication === undefined)
|
|
648
664
|
return undefined;
|
|
649
665
|
validateCreationOperation(publication.operation);
|
|
650
|
-
if (publication.terminalEnvelope.byteLength >
|
|
651
|
-
throw new RangeError(
|
|
666
|
+
if (publication.terminalEnvelope.byteLength > InternalDefaults_1.CREATION_TERMINAL_ENVELOPE_MAX_BYTES) {
|
|
667
|
+
throw new RangeError(`Creation terminal envelope must not exceed ${InternalDefaults_1.CREATION_TERMINAL_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`);
|
|
652
668
|
}
|
|
653
669
|
const deadlineMs = publication.operationDeadline.getTime();
|
|
654
670
|
const expiresAtMs = deadlineMs + CREATION_TERMINAL_RETENTION_MS;
|
|
@@ -691,8 +707,8 @@ function validateAggregateRequest(request) {
|
|
|
691
707
|
if (request.aggregateGeneration < 1n || request.participants.length < 1) {
|
|
692
708
|
throw new RangeError('Aggregate generation and participant count are invalid.');
|
|
693
709
|
}
|
|
694
|
-
if (request.inventoryDigest.byteLength !==
|
|
695
|
-
throw new TypeError(
|
|
710
|
+
if (request.inventoryDigest.byteLength !== actor_join_recovery_codec_1.SHA256_DIGEST_BYTES) {
|
|
711
|
+
throw new TypeError(`Aggregate inventory digest must contain ${actor_join_recovery_codec_1.SHA256_DIGEST_BYTES} bytes.`);
|
|
696
712
|
}
|
|
697
713
|
validateCapacityVector(request.capacity);
|
|
698
714
|
const keys = request.participants.map((participant) => participant.authorityKey.value);
|
|
@@ -702,8 +718,8 @@ function validateAggregateRequest(request) {
|
|
|
702
718
|
}
|
|
703
719
|
}
|
|
704
720
|
function validatePayload(payload) {
|
|
705
|
-
if (payload.byteLength >
|
|
706
|
-
throw new RangeError(
|
|
721
|
+
if (payload.byteLength > InternalDefaults_1.AUTHORITY_ENVELOPE_MAX_BYTES) {
|
|
722
|
+
throw new RangeError(`Authority payload exceeds ${InternalDefaults_1.AUTHORITY_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`);
|
|
707
723
|
}
|
|
708
724
|
}
|
|
709
725
|
function validateCapacityVector(value) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ZLinkLocationWriteIntent, ZLinkLocationWriteStatus, type ZLinkActorLocation, type ZLinkAggregateAbortResult, type ZLinkAggregateCommitResult, type ZLinkAggregateFence, type ZLinkAggregatePrepareRequest, type ZLinkAggregatePrepareResult, type ZLinkAuthorityCompareExchangeResult, type ZLinkAuthorityKey, type ZLinkAuthorityMutation, type ZLinkAuthorityReadResult, type ZLinkAuthorityScanCursor, type ZLinkAuthorityScanResult, type ZLinkAuthorityStoreVersion, type ZLinkActorLocationFilter, type ZLinkActorLocationKey, type ZLinkLocationChangeStampScope, type ZLinkLocationOwnerToken, type ZLinkLocationPage, type ZLinkLocationWriteResult, type ZLinkMeshNodeDescriptor, type ZLinkMeshNodeDescriptorKey, type ZLinkClientServerServerDescriptor, type ZLinkClientServerServerDescriptorKey, type ZLinkFanoutPublisherDescriptor, type ZLinkFanoutPublisherDescriptorKey, type ZLinkOwnerLeaseClaimResult, type ZLinkOwnerLeaseReadResult, type ZLinkOwnerLeaseReleaseResult, type ZLinkOwnerLeaseRenewResult, type ZLinkObjectAbortRequest, type ZLinkObjectAbortResult, type ZLinkObjectCommitRequest, type ZLinkObjectCommitResult, type ZLinkObjectCreationCompleteRequest, type ZLinkObjectCreationCompleteResult, type ZLinkObjectReserveRequest, type ZLinkObjectReserveResult, type ZLinkCreationOperationIdentity, type ZLinkCreationTerminalReadResult, type ZLinkPageRequest, type ZLinkPeerLocation, type ZLinkPeerLocationFilter, type ZLinkPeerLocationKey, type ZLinkRouteLocation, type ZLinkRouteLocationFilter, type ZLinkRouteLocationKey, type ZLinkSpotLocation, type ZLinkSpotLocationFilter, type ZLinkSpotLocationKey } from './internal-location-contracts';
|
|
2
1
|
import type { ZLinkActorTransferPrepareRequest, ZLinkActorTransferRecord, ZLinkActorTransferWriteResult } from '../../contracts/Locations/ActorTransfer';
|
|
3
|
-
import type { ZLinkFanoutLocationStore } from './internal-store-contracts';
|
|
4
2
|
import type { ZLinkDomainLocationStore } from './domain-store-contract';
|
|
3
|
+
import { ZLinkLocationWriteIntent, ZLinkLocationWriteStatus, type ZLinkActorLocation, type ZLinkActorLocationFilter, type ZLinkActorLocationKey, type ZLinkAggregateAbortResult, type ZLinkAggregateCommitResult, type ZLinkAggregateFence, type ZLinkAggregatePrepareRequest, type ZLinkAggregatePrepareResult, type ZLinkAuthorityCompareExchangeResult, type ZLinkAuthorityKey, type ZLinkAuthorityMutation, type ZLinkAuthorityReadResult, type ZLinkAuthorityScanCursor, type ZLinkAuthorityScanResult, type ZLinkAuthorityStoreVersion, type ZLinkClientServerServerDescriptor, type ZLinkClientServerServerDescriptorKey, type ZLinkCreationOperationIdentity, type ZLinkCreationTerminalReadResult, type ZLinkFanoutPublisherDescriptor, type ZLinkFanoutPublisherDescriptorKey, type ZLinkLocationChangeStampScope, type ZLinkLocationOwnerToken, type ZLinkLocationPage, type ZLinkLocationWriteResult, type ZLinkMeshNodeDescriptor, type ZLinkMeshNodeDescriptorKey, type ZLinkObjectAbortRequest, type ZLinkObjectAbortResult, type ZLinkObjectCommitRequest, type ZLinkObjectCommitResult, type ZLinkObjectCreationCompleteRequest, type ZLinkObjectCreationCompleteResult, type ZLinkObjectReserveRequest, type ZLinkObjectReserveResult, type ZLinkOwnerLeaseClaimResult, type ZLinkOwnerLeaseReadResult, type ZLinkOwnerLeaseReleaseResult, type ZLinkOwnerLeaseRenewResult, type ZLinkPageRequest, type ZLinkPeerLocation, type ZLinkPeerLocationFilter, type ZLinkPeerLocationKey, type ZLinkRouteLocation, type ZLinkRouteLocationFilter, type ZLinkRouteLocationKey, type ZLinkSpotLocation, type ZLinkSpotLocationFilter, type ZLinkSpotLocationKey } from './internal-location-contracts';
|
|
4
|
+
import type { ZLinkFanoutLocationStore } from './internal-store-contracts';
|
|
5
5
|
export declare class ZLinkInMemoryLocationStore implements ZLinkDomainLocationStore, ZLinkFanoutLocationStore {
|
|
6
6
|
private readonly now;
|
|
7
7
|
private readonly leases;
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkInMemoryLocationStore = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
4
|
+
const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
|
|
5
|
+
const RegistrationBuilderPolicy_1 = require("../../contracts/Configuration/RegistrationBuilderPolicy");
|
|
6
|
+
const location_store_integration_1 = require("../../location-store-integration");
|
|
6
7
|
const authority_key_codec_1 = require("./authority-key-codec");
|
|
8
|
+
const in_memory_authority_store_1 = require("./in-memory-authority-store");
|
|
9
|
+
const internal_location_contracts_1 = require("./internal-location-contracts");
|
|
7
10
|
const key_codec_1 = require("./key-codec");
|
|
8
|
-
const
|
|
11
|
+
const MAX_LOCATION_GENERATION = 0x7fffffffffffffffn;
|
|
12
|
+
const MAX_DESCRIPTOR_OBJECT_CAPABILITIES = 1024;
|
|
9
13
|
class ZLinkInMemoryLocationStore {
|
|
10
14
|
now;
|
|
11
15
|
leases = new Map();
|
|
@@ -526,7 +530,7 @@ class ZLinkInMemoryLocationStore {
|
|
|
526
530
|
if (current !== undefined && current.leaseExpiresAt.getTime() > storeNow.getTime()) {
|
|
527
531
|
return { kind: 'conflict' };
|
|
528
532
|
}
|
|
529
|
-
if (this.ownerLeaseGeneration >=
|
|
533
|
+
if (this.ownerLeaseGeneration >= MAX_LOCATION_GENERATION) {
|
|
530
534
|
return { kind: 'generationExhausted' };
|
|
531
535
|
}
|
|
532
536
|
const token = { ownerId, leaseGeneration: ++this.ownerLeaseGeneration };
|
|
@@ -743,13 +747,13 @@ function validateMeshNodeDescriptor(descriptor) {
|
|
|
743
747
|
}
|
|
744
748
|
if (descriptor.objectRole === internal_location_contracts_1.ZLinkObjectRole.Server) {
|
|
745
749
|
if (descriptor.entrySpotId !== undefined && !validDescriptorText(descriptor.entrySpotId)) {
|
|
746
|
-
throw new TypeError(
|
|
750
|
+
throw new TypeError(`MeshNode Entry Spot ID must contain 1..${CoreTypes_1.ZLINK_MAX_IDENTITY_TEXT_BYTES} UTF-8 bytes.`);
|
|
747
751
|
}
|
|
748
752
|
}
|
|
749
753
|
else if (descriptor.entrySpotId !== undefined) {
|
|
750
754
|
throw new TypeError('Only Object Server descriptors may publish an Entry Spot ID.');
|
|
751
755
|
}
|
|
752
|
-
const maxGeneration =
|
|
756
|
+
const maxGeneration = MAX_LOCATION_GENERATION;
|
|
753
757
|
if (descriptor.lifecycleGeneration < 1n ||
|
|
754
758
|
descriptor.lifecycleGeneration > maxGeneration ||
|
|
755
759
|
descriptor.descriptorRevision < 1n ||
|
|
@@ -777,9 +781,8 @@ function validateMeshNodeDescriptor(descriptor) {
|
|
|
777
781
|
!Number.isSafeInteger(descriptor.activationConcurrency.limit) ||
|
|
778
782
|
descriptor.activationConcurrency.limit < 1 ||
|
|
779
783
|
descriptor.activationConcurrency.active > descriptor.activationConcurrency.limit ||
|
|
780
|
-
descriptor.placementWeight
|
|
781
|
-
descriptor.
|
|
782
|
-
descriptor.objectCapabilities.length > 1024 ||
|
|
784
|
+
!(0, RegistrationBuilderPolicy_1.isValidPublicWeight)(descriptor.placementWeight) ||
|
|
785
|
+
descriptor.objectCapabilities.length > MAX_DESCRIPTOR_OBJECT_CAPABILITIES ||
|
|
783
786
|
(descriptor.objectRole !== internal_location_contracts_1.ZLinkObjectRole.Server && descriptor.objectCapabilities.length !== 0)) {
|
|
784
787
|
throw new RangeError('MeshNode object capacity is invalid.');
|
|
785
788
|
}
|
|
@@ -804,7 +807,7 @@ function validateMeshNodeDescriptor(descriptor) {
|
|
|
804
807
|
}
|
|
805
808
|
function validDescriptorText(value) {
|
|
806
809
|
const size = Buffer.byteLength(value, 'utf8');
|
|
807
|
-
return size >= 1 && size <=
|
|
810
|
+
return size >= 1 && size <= CoreTypes_1.ZLINK_MAX_IDENTITY_TEXT_BYTES && !value.includes('\0');
|
|
808
811
|
}
|
|
809
812
|
function meshNodeImmutableFingerprint(descriptor) {
|
|
810
813
|
const capabilities = [...descriptor.objectCapabilities].sort((left, right) => {
|
|
@@ -867,7 +870,7 @@ function validateClientServerDescriptor(descriptor) {
|
|
|
867
870
|
!validDescriptorText(descriptor.ownerId)) {
|
|
868
871
|
throw new TypeError('ClientServer descriptor identity and endpoint are required.');
|
|
869
872
|
}
|
|
870
|
-
const maxGeneration =
|
|
873
|
+
const maxGeneration = MAX_LOCATION_GENERATION;
|
|
871
874
|
if (descriptor.lifecycleGeneration < 1n ||
|
|
872
875
|
descriptor.lifecycleGeneration > maxGeneration ||
|
|
873
876
|
descriptor.descriptorRevision < 1n ||
|
|
@@ -876,8 +879,8 @@ function validateClientServerDescriptor(descriptor) {
|
|
|
876
879
|
descriptor.leaseGeneration > maxGeneration) {
|
|
877
880
|
throw new RangeError('ClientServer descriptor generations are invalid.');
|
|
878
881
|
}
|
|
879
|
-
if (!
|
|
880
|
-
throw new RangeError(
|
|
882
|
+
if (!(0, RegistrationBuilderPolicy_1.isValidPublicWeight)(descriptor.weight)) {
|
|
883
|
+
throw new RangeError(`ClientServer descriptor weight must be an integer in 0..${RegistrationBuilderPolicy_1.ZLINK_MAX_PUBLIC_WEIGHT}.`);
|
|
881
884
|
}
|
|
882
885
|
}
|
|
883
886
|
function clientServerImmutableFingerprint(descriptor) {
|
|
@@ -907,7 +910,7 @@ function validateFanoutPublisherDescriptor(descriptor) {
|
|
|
907
910
|
!validDescriptorText(descriptor.ownerId)) {
|
|
908
911
|
throw new TypeError('Fanout publisher descriptor identity and endpoint are required.');
|
|
909
912
|
}
|
|
910
|
-
const maxGeneration =
|
|
913
|
+
const maxGeneration = MAX_LOCATION_GENERATION;
|
|
911
914
|
if (descriptor.lifecycleGeneration < 1n ||
|
|
912
915
|
descriptor.lifecycleGeneration > maxGeneration ||
|
|
913
916
|
descriptor.descriptorRevision < 1n ||
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ZLinkLocationStore, ZLinkStoreKey, ZLinkStoreReadResult, ZLinkStoreScanRequest, ZLinkStoreScanResult, ZLinkStoreVersion, ZLinkStoreWriteRequest, ZLinkStoreWriteResult } from '../../contracts';
|
|
2
|
+
export declare const PROVIDER_STORAGE_NAMESPACE_PREFIX = "zlink:v11:";
|
|
2
3
|
/**
|
|
3
4
|
* Framework-owned primitive Store used by the explicit in-memory option.
|
|
4
5
|
* Domain records are encoded by ZLinkLocationStoreRepository.
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ZLinkInMemoryProviderLocationStore = void 0;
|
|
3
|
+
exports.ZLinkInMemoryProviderLocationStore = exports.PROVIDER_STORAGE_NAMESPACE_PREFIX = void 0;
|
|
4
4
|
exports.storeKey = storeKey;
|
|
5
5
|
exports.storeVersion = storeVersion;
|
|
6
|
+
const Stores_1 = require("../../contracts/Locations/Stores");
|
|
7
|
+
exports.PROVIDER_STORAGE_NAMESPACE_PREFIX = 'zlink:v11:';
|
|
6
8
|
/**
|
|
7
9
|
* Framework-owned primitive Store used by the explicit in-memory option.
|
|
8
10
|
* Domain records are encoded by ZLinkLocationStoreRepository.
|
|
@@ -42,6 +44,12 @@ class ZLinkInMemoryProviderLocationStore {
|
|
|
42
44
|
if (current !== undefined)
|
|
43
45
|
return { kind: 'conflict', storeNow };
|
|
44
46
|
}
|
|
47
|
+
else if (condition.kind === 'value') {
|
|
48
|
+
if (current === undefined ||
|
|
49
|
+
!Buffer.from(current.bytes).equals(Buffer.from(condition.expected))) {
|
|
50
|
+
return { kind: 'conflict', storeNow };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
45
53
|
else if (current?.version.value !== condition.expected.value) {
|
|
46
54
|
return { kind: 'conflict', storeNow };
|
|
47
55
|
}
|
|
@@ -52,7 +60,7 @@ class ZLinkInMemoryProviderLocationStore {
|
|
|
52
60
|
this.values.delete(mutation.key.value);
|
|
53
61
|
continue;
|
|
54
62
|
}
|
|
55
|
-
const retentionMs =
|
|
63
|
+
const retentionMs = mutation.retentionMs === undefined ? undefined : Math.ceil(mutation.retentionMs);
|
|
56
64
|
const version = storeVersion((++this.nextVersion).toString());
|
|
57
65
|
const expiresAt = retentionMs === undefined ? undefined : new Date(storeNow.getTime() + retentionMs);
|
|
58
66
|
this.values.set(mutation.key.value, {
|
|
@@ -84,13 +92,26 @@ class ZLinkInMemoryProviderLocationStore {
|
|
|
84
92
|
this.scans.set(snapshotId, snapshot);
|
|
85
93
|
}
|
|
86
94
|
else {
|
|
87
|
-
|
|
95
|
+
const cursor = parseCursor(request.cursor);
|
|
96
|
+
snapshotId = cursor?.[0] ?? '';
|
|
97
|
+
offset = cursor?.[1] ?? 0;
|
|
88
98
|
snapshot = this.scans.get(snapshotId);
|
|
89
|
-
if (snapshot === undefined)
|
|
99
|
+
if (snapshot === undefined || offset > snapshot.items.length)
|
|
90
100
|
return { kind: 'expired' };
|
|
91
101
|
}
|
|
92
|
-
|
|
93
|
-
|
|
102
|
+
let nextOffset = offset;
|
|
103
|
+
let encodedBytes = 0;
|
|
104
|
+
while (nextOffset < snapshot.items.length && nextOffset - offset < request.limit) {
|
|
105
|
+
const item = snapshot.items[nextOffset];
|
|
106
|
+
const itemBytes = Buffer.byteLength(item.key.value, 'utf8') +
|
|
107
|
+
Buffer.byteLength(item.value.version.value, 'utf8') +
|
|
108
|
+
item.value.bytes.byteLength;
|
|
109
|
+
if (encodedBytes + itemBytes > Stores_1.ZLINK_PROVIDER_MAX_ENCODED_PAGE_BYTES)
|
|
110
|
+
break;
|
|
111
|
+
encodedBytes += itemBytes;
|
|
112
|
+
nextOffset += 1;
|
|
113
|
+
}
|
|
114
|
+
const selected = snapshot.items.slice(offset, nextOffset);
|
|
94
115
|
const nextCursor = nextOffset < snapshot.items.length ? scanCursor(`${snapshotId}:${nextOffset}`) : undefined;
|
|
95
116
|
if (nextCursor === undefined)
|
|
96
117
|
this.scans.delete(snapshotId);
|
|
@@ -133,9 +154,10 @@ function scanCursor(value) {
|
|
|
133
154
|
function parseCursor(cursor) {
|
|
134
155
|
const separator = cursor.value.indexOf(':');
|
|
135
156
|
const snapshotId = cursor.value.slice(0, separator);
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
157
|
+
const encodedOffset = cursor.value.slice(separator + 1);
|
|
158
|
+
const offset = Number(encodedOffset);
|
|
159
|
+
if (separator < 1 || !/^(0|[1-9][0-9]*)$/.test(encodedOffset) || !Number.isSafeInteger(offset)) {
|
|
160
|
+
return undefined;
|
|
139
161
|
}
|
|
140
162
|
return [snapshotId, offset];
|
|
141
163
|
}
|
|
@@ -145,27 +167,55 @@ function requireWriteRequest(request) {
|
|
|
145
167
|
const keys = [...new Set([...conditionKeys, ...mutationKeys])];
|
|
146
168
|
if (new Set(conditionKeys).size !== conditionKeys.length ||
|
|
147
169
|
new Set(mutationKeys).size !== mutationKeys.length ||
|
|
148
|
-
keys.length >
|
|
149
|
-
throw new RangeError(
|
|
170
|
+
keys.length > Stores_1.ZLINK_PROVIDER_MAX_WRITE_KEYS) {
|
|
171
|
+
throw new RangeError(`Location Store write keys must be unique and bounded to ${Stores_1.ZLINK_PROVIDER_MAX_WRITE_KEYS.toLocaleString('en-US')}.`);
|
|
150
172
|
}
|
|
151
173
|
for (const key of keys)
|
|
152
174
|
requireKey(key);
|
|
153
|
-
const encodedSize = request.
|
|
154
|
-
|
|
155
|
-
|
|
175
|
+
const encodedSize = request.conditions.reduce((sum, condition) => {
|
|
176
|
+
const keyBytes = Buffer.byteLength(condition.key.value, 'utf8');
|
|
177
|
+
if (condition.kind === 'missing')
|
|
178
|
+
return sum + keyBytes;
|
|
179
|
+
if (condition.kind === 'value') {
|
|
180
|
+
requireValue(condition.expected, undefined);
|
|
181
|
+
return sum + keyBytes + condition.expected.byteLength;
|
|
182
|
+
}
|
|
183
|
+
const versionBytes = Buffer.byteLength(condition.expected.value, 'utf8');
|
|
184
|
+
if (versionBytes < 1 || versionBytes > Stores_1.ZLINK_PROVIDER_MAX_VERSION_BYTES) {
|
|
185
|
+
throw new RangeError(`Location Store version must contain 1..${Stores_1.ZLINK_PROVIDER_MAX_VERSION_BYTES.toLocaleString('en-US')} UTF-8 bytes.`);
|
|
186
|
+
}
|
|
187
|
+
return sum + keyBytes + versionBytes;
|
|
188
|
+
}, 0) +
|
|
189
|
+
request.mutations.reduce((sum, mutation) => {
|
|
190
|
+
const keyBytes = Buffer.byteLength(mutation.key.value, 'utf8');
|
|
191
|
+
if (mutation.kind !== 'put')
|
|
192
|
+
return sum + keyBytes;
|
|
193
|
+
requireValue(mutation.bytes, mutation.retentionMs);
|
|
194
|
+
return sum + keyBytes + mutation.bytes.byteLength;
|
|
195
|
+
}, 0);
|
|
196
|
+
if (encodedSize > Stores_1.ZLINK_PROVIDER_MAX_WRITE_BYTES) {
|
|
197
|
+
throw new RangeError(`Location Store write exceeds ${Stores_1.ZLINK_PROVIDER_MAX_WRITE_BYTES / (1024 * 1024)} MiB.`);
|
|
156
198
|
}
|
|
157
199
|
}
|
|
158
200
|
function requireScanRequest(request) {
|
|
159
|
-
if (
|
|
160
|
-
|
|
201
|
+
if (request.cursor !== undefined) {
|
|
202
|
+
const bytes = Buffer.byteLength(request.cursor.value, 'utf8');
|
|
203
|
+
if (bytes < 1 || bytes > Stores_1.ZLINK_PROVIDER_MAX_SCAN_CURSOR_BYTES) {
|
|
204
|
+
throw new RangeError(`Location Store cursor must contain 1..${Stores_1.ZLINK_PROVIDER_MAX_SCAN_CURSOR_BYTES.toLocaleString('en-US')} UTF-8 bytes.`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (Buffer.byteLength(request.prefix, 'utf8') > Stores_1.ZLINK_PROVIDER_MAX_KEY_BYTES) {
|
|
208
|
+
throw new RangeError(`Location Store scan prefix exceeds ${Stores_1.ZLINK_PROVIDER_MAX_KEY_BYTES.toLocaleString('en-US')} UTF-8 bytes.`);
|
|
161
209
|
}
|
|
162
|
-
if (!Number.isSafeInteger(request.limit) ||
|
|
163
|
-
|
|
210
|
+
if (!Number.isSafeInteger(request.limit) ||
|
|
211
|
+
request.limit < 1 ||
|
|
212
|
+
request.limit > Stores_1.ZLINK_PROVIDER_MAX_PAGE_SIZE) {
|
|
213
|
+
throw new RangeError(`Location Store scan limit must be in 1..${Stores_1.ZLINK_PROVIDER_MAX_PAGE_SIZE}.`);
|
|
164
214
|
}
|
|
165
215
|
}
|
|
166
216
|
function requireValue(bytes, retentionMs) {
|
|
167
|
-
if (bytes.byteLength >
|
|
168
|
-
throw new RangeError(
|
|
217
|
+
if (bytes.byteLength > Stores_1.ZLINK_PROVIDER_MAX_VALUE_BYTES) {
|
|
218
|
+
throw new RangeError(`Location Store value exceeds ${Stores_1.ZLINK_PROVIDER_MAX_VALUE_BYTES / (1024 * 1024)} MiB.`);
|
|
169
219
|
}
|
|
170
220
|
if (retentionMs !== undefined &&
|
|
171
221
|
(!Number.isFinite(retentionMs) ||
|
|
@@ -177,7 +227,7 @@ function requireValue(bytes, retentionMs) {
|
|
|
177
227
|
}
|
|
178
228
|
function requireKey(value) {
|
|
179
229
|
const bytes = Buffer.byteLength(value, 'utf8');
|
|
180
|
-
if (bytes < 1 || bytes >
|
|
181
|
-
throw new RangeError(
|
|
230
|
+
if (bytes < 1 || bytes > Stores_1.ZLINK_PROVIDER_MAX_KEY_BYTES) {
|
|
231
|
+
throw new RangeError(`Location Store key must contain 1..${Stores_1.ZLINK_PROVIDER_MAX_KEY_BYTES.toLocaleString('en-US')} UTF-8 bytes.`);
|
|
182
232
|
}
|
|
183
233
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkLocationKeyCodec = void 0;
|
|
4
|
+
const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
|
|
4
5
|
const canonical_codec_1 = require("./canonical-codec");
|
|
5
6
|
const routing_id_1 = require("../routing-id");
|
|
6
7
|
// Framework bookkeeping codec for in-memory row maps and generation guards.
|
|
@@ -31,8 +32,8 @@ function encodeSegments(...segments) {
|
|
|
31
32
|
}
|
|
32
33
|
function requireSpotId(value) {
|
|
33
34
|
const bytes = Buffer.byteLength(value, 'utf8');
|
|
34
|
-
if (bytes < 1 || bytes >
|
|
35
|
-
throw new TypeError(
|
|
35
|
+
if (bytes < 1 || bytes > CoreTypes_1.ZLINK_MAX_SPOT_ID_BYTES) {
|
|
36
|
+
throw new TypeError(`SpotId must contain 1..${CoreTypes_1.ZLINK_MAX_SPOT_ID_BYTES} UTF-8 bytes.`);
|
|
36
37
|
}
|
|
37
38
|
return value;
|
|
38
39
|
}
|
|
@@ -19,6 +19,7 @@ export declare class ZLinkOwnerLeaseTracker {
|
|
|
19
19
|
isOwnerLive(ownerId: string, signal?: AbortSignal): Promise<boolean>;
|
|
20
20
|
remainingLeaseMs(ownerId: string, signal?: AbortSignal): Promise<number>;
|
|
21
21
|
remainingOwnerTokenLeaseMs(owner: ZLinkLocationOwnerToken, signal?: AbortSignal): Promise<number>;
|
|
22
|
+
isOwnerTokenLive(owner: ZLinkLocationOwnerToken, signal?: AbortSignal): Promise<boolean>;
|
|
22
23
|
getLiveOwnerSetVersion(signal?: AbortSignal): Promise<number>;
|
|
23
24
|
private getSnapshot;
|
|
24
25
|
private prepareSnapshotRefresh;
|
|
@@ -28,9 +29,6 @@ export declare class ZLinkOwnerLeaseTracker {
|
|
|
28
29
|
private isLive;
|
|
29
30
|
}
|
|
30
31
|
export declare class ZLinkLiveRowFilter {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
filter<TRow>(rows: readonly TRow[], ownerIdOf: (row: TRow) => string, signal?: AbortSignal, include?: (row: TRow) => boolean): Promise<TRow[]>;
|
|
34
|
-
resolve<TRow>(row: TRow | undefined, ownerIdOf: (row: TRow) => string, signal?: AbortSignal, include?: (row: TRow) => boolean): Promise<TRow | undefined>;
|
|
35
|
-
private isLive;
|
|
32
|
+
filter<TRow>(rows: readonly TRow[], isLive: (row: TRow, signal?: AbortSignal) => Promise<boolean>, signal?: AbortSignal, include?: (row: TRow) => boolean): Promise<TRow[]>;
|
|
33
|
+
resolve<TRow>(row: TRow | undefined, isLive: (row: TRow, signal?: AbortSignal) => Promise<boolean>, signal?: AbortSignal, include?: (row: TRow) => boolean): Promise<TRow | undefined>;
|
|
36
34
|
}
|