@zlink-systems/framework 0.25.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/Channels/IZLinkFanoutClient.d.ts +0 -6
- 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/RouteMesh/RuntimeTopology.d.ts +8 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.js +16 -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 +28 -0
- package/dist/runtime/activation-admission.js +57 -0
- 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 +19 -17
- package/dist/runtime/actors/actor-handoff.d.ts +13 -7
- package/dist/runtime/actors/actor-handoff.js +36 -25
- 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 +85 -123
- 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 +3 -3
- package/dist/runtime/actors/actor-remote-joiner.js +11 -17
- 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-contracts.d.ts +4 -2
- 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/actor-source-transfer.d.ts +5 -5
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
- package/dist/runtime/actors/deferred-join-completion.js +21 -0
- package/dist/runtime/actors/index.d.ts +10 -8
- package/dist/runtime/actors/index.js +101 -73
- 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 +7 -1
- package/dist/runtime/admission.js +11 -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 +8 -33
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
- 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-factory.d.ts +1 -2
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
- package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
- package/dist/runtime/backend/raw-binding-port.d.ts +13 -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 -9
- package/dist/runtime/channels/channel-clients.js +68 -60
- 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 -18
- 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.d.ts +2 -5
- package/dist/runtime/channels/channel-runtime-manager.js +4 -12
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
- package/dist/runtime/channels/channel-socket-registry.js +296 -235
- package/dist/runtime/channels/channel-transports.d.ts +11 -20
- 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 +133 -81
- 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 +22 -9
- package/dist/runtime/execution/index.js +107 -37
- package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
- package/dist/runtime/execution/serial-execution-queue.js +99 -26
- 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/listener-records.d.ts +11 -0
- package/dist/runtime/foundation/listener-records.js +20 -0
- 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 +18 -26
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
- 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.d.ts +1 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +30 -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 +23 -8
- 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-coordinator.d.ts +9 -0
- package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
- package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
- 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 -19
- 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 +28 -24
- package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
- package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
- package/dist/runtime/foundation/service-topology-registry.js +22 -61
- 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 +28 -28
- package/dist/runtime/host/actor-transfer-runtime.js +210 -256
- 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 +19 -14
- package/dist/runtime/host/index.js +234 -175
- 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 +11 -23
- package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
- package/dist/runtime/host/route-mesh-runtime.js +178 -257
- 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 +71 -38
- package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
- 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 -7
- package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
- package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
- package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
- 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 +79 -27
- 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 +5 -10
- package/dist/runtime/locations/lifecycle.js +4 -33
- 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 +44 -30
- 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 +8 -2
- package/dist/runtime/locations/spot-location-claims.js +40 -23
- 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 +2 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
- package/dist/runtime/spots/index.d.ts +29 -29
- package/dist/runtime/spots/index.js +441 -313
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
- package/dist/runtime/spots/spot-activation-registry.js +27 -60
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
- package/dist/runtime/spots/spot-activation-state.js +4 -17
- package/dist/runtime/spots/spot-activation.d.ts +10 -9
- package/dist/runtime/spots/spot-activation.js +103 -81
- 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 +5 -55
- package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
- package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
- package/dist/runtime/spots/spot-actor-membership.js +44 -53
- 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 +3 -4
- package/dist/runtime/spots/spot-entry-activation.js +9 -21
- 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 +6 -5
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
- package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +10 -37
- 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 -2
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
- 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 +4 -20
- package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
- package/dist/runtime/spots/spot-serial-executor.js +9 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
- package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
- package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
- 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 +12 -19
- package/dist/runtime/streams/index.d.ts +15 -14
- package/dist/runtime/streams/index.js +38 -39
- 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/session-serial-executor.js +2 -2
- 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/Channels/IZLinkFanoutClient.ts +0 -7
- 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/RouteMesh/RuntimeTopology.ts +10 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +15 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +72 -0
- 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 +45 -39
- package/src/runtime/actors/actor-handoff.ts +55 -45
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +174 -215
- 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 +15 -36
- 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-contracts.ts +4 -10
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/actor-source-transfer.ts +5 -18
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +44 -0
- package/src/runtime/actors/index.ts +122 -88
- 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 +13 -2
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +15 -42
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
- package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
- package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
- package/src/runtime/backend/raw-binding-port.ts +14 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -96
- 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 -31
- 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 +8 -15
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +369 -262
- package/src/runtime/channels/channel-transports.ts +161 -115
- 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 +175 -106
- 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 +116 -38
- package/src/runtime/execution/serial-execution-queue.ts +179 -34
- 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/listener-records.ts +21 -0
- 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 +170 -571
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +41 -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 +30 -19
- 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-coordinator.ts +13 -0
- package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
- 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 -25
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
- package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
- package/src/runtime/foundation/service-topology-registry.ts +30 -79
- 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 +266 -418
- 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 +408 -312
- 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 +12 -44
- package/src/runtime/host/route-mesh-runtime.ts +236 -275
- 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 +1161 -904
- 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 +92 -30
- package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
- package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
- 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 +110 -31
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +16 -45
- 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 +90 -58
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +54 -26
- 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 +27 -10
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
- package/src/runtime/spots/index.ts +687 -437
- package/src/runtime/spots/spot-activation-registry.ts +42 -71
- package/src/runtime/spots/spot-activation-state.ts +4 -16
- package/src/runtime/spots/spot-activation.ts +167 -115
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
- package/src/runtime/spots/spot-actor-membership.ts +107 -75
- 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 -33
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +29 -21
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
- package/src/runtime/spots/spot-outbound.ts +47 -68
- 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 -6
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +10 -43
- package/src/runtime/spots/spot-serial-executor.ts +10 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +23 -37
- package/src/runtime/streams/index.ts +102 -88
- 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/session-serial-executor.ts +2 -2
- 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/deferred-join-accepted-journal.d.ts +0 -47
- package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
- 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/deferred-join-accepted-journal.ts +0 -1346
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import { ZLinkFrameworkRuntimeState } from '../../contracts';
|
|
1
|
+
import { ZLinkFrameworkRuntimeState, ZLinkTopologyState } from '../../contracts';
|
|
2
|
+
|
|
3
|
+
export function runtimeObservationIsTerminal(state: ZLinkFrameworkRuntimeState): boolean {
|
|
4
|
+
return state === ZLinkFrameworkRuntimeState.Stopped;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function topologyObservationIsTerminal(state: ZLinkTopologyState): boolean {
|
|
8
|
+
return state === ZLinkTopologyState.Stopped || state === ZLinkTopologyState.Failed;
|
|
9
|
+
}
|
|
2
10
|
|
|
3
11
|
export type MaintenanceAdmissionState =
|
|
4
12
|
'preparing' | 'serving' | 'retiring' | 'draining' | 'stopped' | 'error';
|
|
@@ -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;
|
|
@@ -189,6 +197,16 @@ export function decodeServiceReadySpotAuthority(
|
|
|
189
197
|
return decoded?.state === 'ready' && decoded.operationKind === 0 ? decoded : undefined;
|
|
190
198
|
}
|
|
191
199
|
|
|
200
|
+
export function decodeServiceClosingSpotAuthority(
|
|
201
|
+
payload: Uint8Array
|
|
202
|
+
): ServiceReadySpotAuthority | undefined {
|
|
203
|
+
const decoded = decodeSpotAuthority(payload);
|
|
204
|
+
return decoded?.operationKind === 3 &&
|
|
205
|
+
(decoded.kind === 'user_spot' || decoded.state === 'closing')
|
|
206
|
+
? decoded
|
|
207
|
+
: undefined;
|
|
208
|
+
}
|
|
209
|
+
|
|
192
210
|
export function decodeServiceInstanceAuthorityPayload(
|
|
193
211
|
payload: Uint8Array
|
|
194
212
|
): ServiceDecodedInstanceAuthority | undefined {
|
|
@@ -301,7 +319,7 @@ function decodeSpotAuthority(payload: Uint8Array):
|
|
|
301
319
|
const operationKind = body.u8();
|
|
302
320
|
const objectKind = body.u8();
|
|
303
321
|
const object = body.takeReader(body.u16());
|
|
304
|
-
if (objectKind !==
|
|
322
|
+
if (objectKind !== SPOT_AUTHORITY_OBJECT_KIND) return undefined;
|
|
305
323
|
const spotKind = object.u8();
|
|
306
324
|
const spot = object.takeReader(object.u16());
|
|
307
325
|
if (!object.done) return undefined;
|
|
@@ -310,12 +328,12 @@ function decodeSpotAuthority(payload: Uint8Array):
|
|
|
310
328
|
let state: number;
|
|
311
329
|
let stableType: string;
|
|
312
330
|
let spotId: string;
|
|
313
|
-
if (spotKind ===
|
|
331
|
+
if (spotKind === USER_SPOT_WIRE_KIND) {
|
|
314
332
|
kind = 'user_spot';
|
|
315
333
|
spotId = spot.rid();
|
|
316
334
|
stableType = spot.text8();
|
|
317
335
|
state = spot.u8();
|
|
318
|
-
} else if (spotKind ===
|
|
336
|
+
} else if (spotKind === INSTANCE_SPOT_WIRE_KIND) {
|
|
319
337
|
kind = 'instance_spot';
|
|
320
338
|
state = spot.u8();
|
|
321
339
|
const instance = spot.takeReader(spot.u16());
|
|
@@ -407,23 +425,33 @@ function rid(value: string, name: string): Buffer {
|
|
|
407
425
|
|
|
408
426
|
function text16(value: string, name: string): Buffer {
|
|
409
427
|
const bytes = Buffer.from(value);
|
|
410
|
-
if (bytes.byteLength < 1 || bytes.byteLength >
|
|
411
|
-
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
|
+
);
|
|
412
432
|
}
|
|
413
433
|
return concat(u16(bytes.byteLength), bytes);
|
|
414
434
|
}
|
|
415
435
|
|
|
416
436
|
function sha256(value: Uint8Array): Buffer {
|
|
417
|
-
if (value.byteLength !==
|
|
418
|
-
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
|
+
);
|
|
419
441
|
}
|
|
420
|
-
return concat(Buffer.of(
|
|
442
|
+
return concat(Buffer.of(SHA256_DIGEST_BYTES), value);
|
|
421
443
|
}
|
|
422
444
|
|
|
423
445
|
function sized8(value: string, name: string): Buffer {
|
|
424
446
|
const bytes = Buffer.from(value);
|
|
425
|
-
if (
|
|
426
|
-
|
|
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
|
+
);
|
|
427
455
|
}
|
|
428
456
|
return concat(Buffer.of(bytes.byteLength), bytes);
|
|
429
457
|
}
|
|
@@ -448,7 +476,7 @@ function boundedU32(value: number, name: string): Buffer {
|
|
|
448
476
|
}
|
|
449
477
|
|
|
450
478
|
function u64(value: bigint, name: string): Buffer {
|
|
451
|
-
if (value <= 0n || value >
|
|
479
|
+
if (value <= 0n || value > UINT64_MAX) {
|
|
452
480
|
throw new RangeError(`${name} must be a non-zero u64.`);
|
|
453
481
|
}
|
|
454
482
|
const result = Buffer.alloc(8);
|
|
@@ -457,7 +485,7 @@ function u64(value: bigint, name: string): Buffer {
|
|
|
457
485
|
}
|
|
458
486
|
|
|
459
487
|
function ordinalU64(value: bigint, name: string): Buffer {
|
|
460
|
-
if (value < 0n || value >
|
|
488
|
+
if (value < 0n || value > UINT64_MAX) {
|
|
461
489
|
throw new RangeError(`${name} must be a u64.`);
|
|
462
490
|
}
|
|
463
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
|
}
|
|
@@ -145,12 +145,27 @@ export class ServiceMaintenanceRuntime {
|
|
|
145
145
|
|
|
146
146
|
private async runUnits(signal: AbortSignal, stopStartingSignal?: AbortSignal): Promise<void> {
|
|
147
147
|
const pending = new Set<Promise<void>>();
|
|
148
|
+
// A unit failure is recorded before its promise leaves `pending`, so no
|
|
149
|
+
// failure is lost. Every started unit runs to its own terminal before the
|
|
150
|
+
// first failure is reported: the host result follows the settled
|
|
151
|
+
// authority of each unit (spec 30 §13).
|
|
152
|
+
const failures: unknown[] = [];
|
|
153
|
+
const reportFailure = async (): Promise<void> => {
|
|
154
|
+
if (failures.length === 0) return;
|
|
155
|
+
await Promise.allSettled(pending);
|
|
156
|
+
throw failures[0];
|
|
157
|
+
};
|
|
148
158
|
for (;;) {
|
|
159
|
+
await reportFailure();
|
|
149
160
|
const queued = await this.lane.run(() => this.units.length > 0);
|
|
150
|
-
if (!queued && pending.size === 0)
|
|
161
|
+
if (!queued && pending.size === 0) {
|
|
162
|
+
await reportFailure();
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
151
165
|
signal.throwIfAborted();
|
|
152
166
|
if (stopStartingSignal?.aborted === true) {
|
|
153
167
|
await Promise.allSettled(pending);
|
|
168
|
+
await reportFailure();
|
|
154
169
|
stopStartingSignal.throwIfAborted();
|
|
155
170
|
}
|
|
156
171
|
let admitted = false;
|
|
@@ -173,19 +188,25 @@ export class ServiceMaintenanceRuntime {
|
|
|
173
188
|
admitted = true;
|
|
174
189
|
let running!: Promise<void>;
|
|
175
190
|
running = startOutsideStateLane(() =>
|
|
176
|
-
unit
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
191
|
+
unit
|
|
192
|
+
.relocate(signal)
|
|
193
|
+
.catch((error: unknown) => {
|
|
194
|
+
failures.push(error);
|
|
195
|
+
})
|
|
196
|
+
.finally(async () => {
|
|
197
|
+
const publication = await this.lane.run(() => {
|
|
198
|
+
this.activeOutbound--;
|
|
199
|
+
pending.delete(running);
|
|
200
|
+
return this.publishCore();
|
|
201
|
+
});
|
|
202
|
+
this.notify(publication);
|
|
203
|
+
})
|
|
184
204
|
);
|
|
185
205
|
pending.add(running);
|
|
186
206
|
this.notify(claim.publication);
|
|
187
207
|
}
|
|
188
208
|
if (pending.size === 0) {
|
|
209
|
+
await reportFailure();
|
|
189
210
|
if (!admitted) throw new Error('No relocation unit is ready to start.');
|
|
190
211
|
} else {
|
|
191
212
|
await Promise.race(pending);
|
|
@@ -231,13 +252,3 @@ export class ServiceMaintenanceRuntime {
|
|
|
231
252
|
function startOutsideStateLane<T>(work: () => T): T {
|
|
232
253
|
return detachedStateLaneResource.runInAsyncScope(work);
|
|
233
254
|
}
|
|
234
|
-
|
|
235
|
-
export function classifyRelocationRecovery(
|
|
236
|
-
publishedReference: boolean,
|
|
237
|
-
payloadPresent: boolean,
|
|
238
|
-
checksumMatches: boolean,
|
|
239
|
-
inventoryMatches: boolean
|
|
240
|
-
): 'resume' | 'orphan' | 'relocationDataLost' {
|
|
241
|
-
if (!publishedReference) return payloadPresent ? 'orphan' : 'resume';
|
|
242
|
-
return payloadPresent && checksumMatches && inventoryMatches ? 'resume' : 'relocationDataLost';
|
|
243
|
-
}
|
|
@@ -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(
|
|
@@ -32,3 +32,16 @@ export class ServiceRelocationPostCommitError extends Error {
|
|
|
32
32
|
this.name = 'ServiceRelocationPostCommitError';
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* A relocation whose settled authority leaves the host in `Error` with
|
|
38
|
+
* `Blocked/RelocationFailed` (spec 30 §13): the source owner lease ended
|
|
39
|
+
* before its Preserve fence succeeded, or units settled on both the source
|
|
40
|
+
* and the target.
|
|
41
|
+
*/
|
|
42
|
+
export class ServiceRelocationAuthorityError extends Error {
|
|
43
|
+
constructor(message: string, options?: ErrorOptions) {
|
|
44
|
+
super(message, options);
|
|
45
|
+
this.name = 'ServiceRelocationAuthorityError';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -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;
|
|
@@ -30,10 +31,12 @@ export interface ServiceRelocationCaptureUnit {
|
|
|
30
31
|
captureApplicationState(signal?: AbortSignal): Promise<Uint8Array>;
|
|
31
32
|
commitSeal(): Promise<void> | void;
|
|
32
33
|
abortSeal(): Promise<void> | void;
|
|
34
|
+
/** Expired-owner terminal: pending requests fail once and dispatch stays closed. */
|
|
35
|
+
discardSeal?(reason: unknown): Promise<void> | void;
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
export class ServiceCapturedObjectRelocation {
|
|
36
|
-
private terminal: 'open' | 'committed' | 'aborted' = 'open';
|
|
39
|
+
private terminal: 'open' | 'committed' | 'aborted' | 'discarded' = 'open';
|
|
37
40
|
|
|
38
41
|
constructor(
|
|
39
42
|
readonly envelope: ServiceRelocationEnvelope,
|
|
@@ -42,8 +45,8 @@ export class ServiceCapturedObjectRelocation {
|
|
|
42
45
|
|
|
43
46
|
async commitSource(): Promise<void> {
|
|
44
47
|
if (this.terminal === 'committed') return;
|
|
45
|
-
if (this.terminal
|
|
46
|
-
throw new Error(
|
|
48
|
+
if (this.terminal !== 'open') {
|
|
49
|
+
throw new Error(`Relocation source capture was already ${this.terminal}.`);
|
|
47
50
|
}
|
|
48
51
|
for (const unit of this.units) await unit.commitSeal();
|
|
49
52
|
this.terminal = 'committed';
|
|
@@ -51,8 +54,8 @@ export class ServiceCapturedObjectRelocation {
|
|
|
51
54
|
|
|
52
55
|
async abortSource(): Promise<void> {
|
|
53
56
|
if (this.terminal === 'aborted') return;
|
|
54
|
-
if (this.terminal
|
|
55
|
-
throw new Error(
|
|
57
|
+
if (this.terminal !== 'open') {
|
|
58
|
+
throw new Error(`A ${this.terminal} relocation source capture cannot be aborted.`);
|
|
56
59
|
}
|
|
57
60
|
const failures: unknown[] = [];
|
|
58
61
|
for (const unit of [...this.units].reverse()) {
|
|
@@ -67,11 +70,24 @@ export class ServiceCapturedObjectRelocation {
|
|
|
67
70
|
throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
|
|
68
71
|
}
|
|
69
72
|
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The source owner lease ended before the authority settled (spec 28 §4.4):
|
|
76
|
+
* the source neither resumes nor commits. Retained work is dropped and
|
|
77
|
+
* every pending request without a terminal fails once with `reason`.
|
|
78
|
+
*/
|
|
79
|
+
async discardSource(reason: unknown): Promise<void> {
|
|
80
|
+
if (this.terminal !== 'open') return;
|
|
81
|
+
this.terminal = 'discarded';
|
|
82
|
+
for (const unit of this.units) await unit.discardSeal?.(reason);
|
|
83
|
+
}
|
|
70
84
|
}
|
|
71
85
|
|
|
72
86
|
/** Captures the two valid relocation units: User Spot aggregate or one Actor. */
|
|
73
87
|
export class ServiceRelocationObjectCaptureOwner {
|
|
74
|
-
constructor(
|
|
88
|
+
constructor(
|
|
89
|
+
private readonly maxConcurrentCallbacks: number = DEFAULT_RELOCATION_CALLBACK_CONCURRENCY
|
|
90
|
+
) {
|
|
75
91
|
requireCallbackConcurrency(maxConcurrentCallbacks);
|
|
76
92
|
}
|
|
77
93
|
|
|
@@ -241,7 +257,7 @@ export class ServiceRelocationObjectRestoreOwner<
|
|
|
241
257
|
constructor(
|
|
242
258
|
private readonly target: ServiceRelocationTargetObjectPort<THidden>,
|
|
243
259
|
private readonly authorityKey: (value: string) => ZLinkAuthorityKey,
|
|
244
|
-
private readonly maxConcurrentCallbacks =
|
|
260
|
+
private readonly maxConcurrentCallbacks: number = DEFAULT_RELOCATION_CALLBACK_CONCURRENCY
|
|
245
261
|
) {
|
|
246
262
|
requireCallbackConcurrency(maxConcurrentCallbacks);
|
|
247
263
|
}
|