@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
|
@@ -20,25 +20,19 @@ class OperationCancelledError extends Error {
|
|
|
20
20
|
}
|
|
21
21
|
exports.OperationCancelledError = OperationCancelledError;
|
|
22
22
|
const systemClock = {
|
|
23
|
-
|
|
24
|
-
// A request promise is live work. Raw RouteMesh polling deliberately
|
|
25
|
-
// uses unref'ed timers, so this deadline is the handle that keeps a
|
|
26
|
-
// submit() caller alive until a reply, cancellation, or deadline settles.
|
|
27
|
-
return setTimeout(callback, delayMs);
|
|
28
|
-
},
|
|
29
|
-
clearTimeout(handle) {
|
|
30
|
-
clearTimeout(handle);
|
|
31
|
-
}
|
|
23
|
+
now: () => performance.now()
|
|
32
24
|
};
|
|
33
25
|
/** Owns request completion so reply, timeout, cancellation, and shutdown race safely. */
|
|
34
26
|
class OperationRegistry {
|
|
35
27
|
clock;
|
|
28
|
+
onPendingChanged;
|
|
36
29
|
entries = new Map();
|
|
37
30
|
nextId = 1n;
|
|
38
|
-
|
|
31
|
+
deadlineCursor;
|
|
39
32
|
closed = false;
|
|
40
|
-
constructor(clock = systemClock) {
|
|
33
|
+
constructor(clock = systemClock, onPendingChanged) {
|
|
41
34
|
this.clock = clock;
|
|
35
|
+
this.onPendingChanged = onPendingChanged;
|
|
42
36
|
}
|
|
43
37
|
register(timeoutMs, timeoutOwner = 'registry') {
|
|
44
38
|
if (this.closed)
|
|
@@ -47,20 +41,20 @@ class OperationRegistry {
|
|
|
47
41
|
throw new RangeError('timeoutMs must be a non-negative finite number.');
|
|
48
42
|
}
|
|
49
43
|
const id = this.nextId++;
|
|
50
|
-
const generation = this.generation;
|
|
51
44
|
let resolve;
|
|
52
45
|
let reject;
|
|
53
46
|
const promise = new Promise((onResolve, onReject) => {
|
|
54
47
|
resolve = onResolve;
|
|
55
48
|
reject = onReject;
|
|
56
49
|
});
|
|
57
|
-
const entry = {
|
|
50
|
+
const entry = {
|
|
51
|
+
deadlineMs: timeoutOwner === 'registry' ? this.clock.now() + timeoutMs : undefined,
|
|
52
|
+
resolve,
|
|
53
|
+
reject
|
|
54
|
+
};
|
|
58
55
|
this.entries.set(id, entry);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if (timeoutOwner === 'registry') {
|
|
62
|
-
entry.timer = this.clock.setTimeout(() => this.rejectIfCurrent(id, generation, new OperationTimeoutError(id)), timeoutMs);
|
|
63
|
-
}
|
|
56
|
+
if (this.entries.size === 1)
|
|
57
|
+
this.onPendingChanged?.();
|
|
64
58
|
return { id, promise };
|
|
65
59
|
}
|
|
66
60
|
complete(id, value) {
|
|
@@ -71,9 +65,6 @@ class OperationRegistry {
|
|
|
71
65
|
return true;
|
|
72
66
|
}
|
|
73
67
|
fail(id, reason) {
|
|
74
|
-
return this.failCore(id, reason);
|
|
75
|
-
}
|
|
76
|
-
failCore(id, reason) {
|
|
77
68
|
const entry = this.take(id);
|
|
78
69
|
if (entry === undefined)
|
|
79
70
|
return false;
|
|
@@ -81,7 +72,7 @@ class OperationRegistry {
|
|
|
81
72
|
return true;
|
|
82
73
|
}
|
|
83
74
|
cancel(id, message) {
|
|
84
|
-
return this.
|
|
75
|
+
return this.fail(id, new OperationCancelledError(id, message));
|
|
85
76
|
}
|
|
86
77
|
isPending(id) {
|
|
87
78
|
return this.entries.has(id);
|
|
@@ -90,39 +81,38 @@ class OperationRegistry {
|
|
|
90
81
|
if (this.closed)
|
|
91
82
|
return;
|
|
92
83
|
this.closed = true;
|
|
93
|
-
this.
|
|
94
|
-
|
|
95
|
-
this.
|
|
96
|
-
for (const [, entry] of pending)
|
|
97
|
-
this.clearTimer(entry);
|
|
98
|
-
for (const [id, entry] of pending) {
|
|
99
|
-
entry.reject(new OperationCancelledError(id, reason));
|
|
100
|
-
}
|
|
84
|
+
for (const id of this.entries.keys())
|
|
85
|
+
this.cancel(id, reason);
|
|
86
|
+
this.deadlineCursor = undefined;
|
|
101
87
|
}
|
|
102
88
|
get size() {
|
|
103
89
|
return this.entries.size;
|
|
104
90
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
91
|
+
expire(nowMs, turnDeadlineMs) {
|
|
92
|
+
let expired = 0;
|
|
93
|
+
while (this.clock.now() < turnDeadlineMs) {
|
|
94
|
+
this.deadlineCursor ??= this.entries.entries();
|
|
95
|
+
const current = this.deadlineCursor.next();
|
|
96
|
+
if (current.done === true) {
|
|
97
|
+
this.deadlineCursor = undefined;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
const [id, entry] = current.value;
|
|
101
|
+
if (entry.deadlineMs !== undefined && entry.deadlineMs <= nowMs) {
|
|
102
|
+
if (this.fail(id, new OperationTimeoutError(id)))
|
|
103
|
+
expired++;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return expired;
|
|
112
107
|
}
|
|
113
108
|
take(id) {
|
|
114
109
|
const entry = this.entries.get(id);
|
|
115
110
|
if (entry === undefined)
|
|
116
111
|
return undefined;
|
|
117
112
|
this.entries.delete(id);
|
|
118
|
-
this.
|
|
113
|
+
if (this.entries.size === 0)
|
|
114
|
+
this.onPendingChanged?.();
|
|
119
115
|
return entry;
|
|
120
116
|
}
|
|
121
|
-
clearTimer(entry) {
|
|
122
|
-
if (entry.timer === undefined)
|
|
123
|
-
return;
|
|
124
|
-
this.clock.clearTimeout(entry.timer);
|
|
125
|
-
entry.timer = undefined;
|
|
126
|
-
}
|
|
127
117
|
}
|
|
128
118
|
exports.OperationRegistry = OperationRegistry;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { ApplicationIngressRecordOwner } from '../application-jobs/application-ingress-record-owner';
|
|
2
|
+
import type { ApplicationJobQueuePort } from '../application-jobs/contracts';
|
|
1
3
|
import type { ZLinkRawBindingPort } from '../backend/raw-binding-port';
|
|
2
4
|
import { SubmitResult } from '../backend/runtime-values';
|
|
3
|
-
import type { ApplicationJobQueuePort } from '../application-jobs/contracts';
|
|
4
|
-
import { ApplicationIngressRecordOwner } from '../application-jobs/application-ingress-record-owner';
|
|
5
5
|
import { type PendingOperation } from './operation-registry';
|
|
6
6
|
import { ServiceLivenessRegistry, type ServiceLivenessTick } from './service-liveness-registry';
|
|
7
7
|
import { ServiceMailbox, type ServiceMailboxRecord } from './service-mailbox';
|
|
@@ -29,6 +29,7 @@ export interface RawServiceIngressRecord {
|
|
|
29
29
|
}
|
|
30
30
|
export type RawServiceIngressHandler = (record: RawServiceIngressRecord) => RawServicePumpResult | undefined | Promise<RawServicePumpResult | undefined>;
|
|
31
31
|
export interface RawServiceMeshRuntimeOptions {
|
|
32
|
+
readonly onPendingOperationsChanged?: () => void;
|
|
32
33
|
readonly descriptor: ServiceNodeDescriptor;
|
|
33
34
|
readonly resolveAdvertisedEndpoint?: (boundEndpoint: string) => string;
|
|
34
35
|
readonly probeIntervalMs?: number;
|
|
@@ -47,6 +48,7 @@ export interface RawServiceMeshRuntimeOptions {
|
|
|
47
48
|
readonly command?: number;
|
|
48
49
|
}) => void;
|
|
49
50
|
}
|
|
51
|
+
export declare const RAW_MESH_RECEIVE_TIME_BUDGET_MS = 2;
|
|
50
52
|
/**
|
|
51
53
|
* RouteMesh M6A runtime built only on the public raw binding package.
|
|
52
54
|
* It owns protocol, admission, mailbox, request and liveness state.
|
|
@@ -105,7 +107,6 @@ export declare class RawServiceMeshRuntime {
|
|
|
105
107
|
requestToNode(targetNodeRoutingId: string, payload: ServiceApplicationPayloadInput, timeoutMs: number): PendingOperation<RawServiceRequestResult>;
|
|
106
108
|
requestToChannel(channelName: string, payload: ServiceApplicationPayloadInput, timeoutMs: number): PendingOperation<RawServiceRequestResult>;
|
|
107
109
|
private selectChannelTarget;
|
|
108
|
-
private isLocalOrReadyPeer;
|
|
109
110
|
setServiceIngress(handler: RawServiceIngressHandler): void;
|
|
110
111
|
reserveLocalIngress(signal?: AbortSignal): Promise<ApplicationIngressRecordOwner>;
|
|
111
112
|
sendService(targetNodeRoutingId: string, parts: readonly Uint8Array[]): Promise<boolean>;
|
|
@@ -113,13 +114,15 @@ export declare class RawServiceMeshRuntime {
|
|
|
113
114
|
replyService(record: Pick<RawServiceIngressRecord, 'sourceRoutingId' | 'sourceRoute' | 'requestSequence' | 'reply'>, parts: readonly Uint8Array[]): void;
|
|
114
115
|
reply(request: ServiceMailboxRecord, payload: ServiceApplicationPayloadInput, terminalResult?: number, failureCode?: number): void;
|
|
115
116
|
pumpOne(nowMs?: number, observe?: RawServicePumpObserver): Promise<RawServicePumpResult>;
|
|
116
|
-
setReadableHandler(handler: () => void): void;
|
|
117
|
+
setReadableHandler(handler: (receiveReady: boolean, routeReady: boolean) => void): void;
|
|
117
118
|
/** Returns whether a receive budget ended before no-data; idle ticks only maintain peers. */
|
|
118
|
-
pumpBatch(receiveReady?: boolean): Promise<boolean>;
|
|
119
|
+
pumpBatch(receiveReady?: boolean, routeReady?: boolean): Promise<boolean>;
|
|
119
120
|
private receiveOne;
|
|
120
121
|
private reportProtocolError;
|
|
121
122
|
private replyGenericProtocolError;
|
|
122
123
|
private processReceived;
|
|
124
|
+
expireOperations(nowMs: number, turnDeadlineMs: number): number;
|
|
125
|
+
get pendingOperationCount(): number;
|
|
123
126
|
tickLiveness(nowMs?: number): Promise<ServiceLivenessTick>;
|
|
124
127
|
/**
|
|
125
128
|
* The socket's one route observer (Core ROUTER §10.1). It replaces the
|
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RawServiceMeshRuntime = void 0;
|
|
4
|
-
const
|
|
3
|
+
exports.RawServiceMeshRuntime = exports.RAW_MESH_RECEIVE_TIME_BUDGET_MS = void 0;
|
|
4
|
+
const node_os_1 = require("node:os");
|
|
5
5
|
const application_ingress_record_owner_1 = require("../application-jobs/application-ingress-record-owner");
|
|
6
|
+
const runtime_values_1 = require("../backend/runtime-values");
|
|
7
|
+
const service_wire_codec_generated_1 = require("../protocol/service_wire_codec.generated");
|
|
6
8
|
const operation_registry_1 = require("./operation-registry");
|
|
7
9
|
const service_liveness_registry_1 = require("./service-liveness-registry");
|
|
8
10
|
const service_mailbox_1 = require("./service-mailbox");
|
|
9
11
|
const service_topology_registry_1 = require("./service-topology-registry");
|
|
10
|
-
const service_wire_m6a_codec_1 = require("./service-wire-m6a-codec");
|
|
11
12
|
const service_wire_codec_1 = require("./service-wire-codec");
|
|
12
13
|
const service_wire_constants_generated_1 = require("./service-wire-constants.generated");
|
|
14
|
+
const service_wire_m6a_codec_1 = require("./service-wire-m6a-codec");
|
|
15
|
+
const nativeErrnoValues = node_os_1.constants.errno;
|
|
13
16
|
// Framework error code 13 (RequestTargetNotFound) is encoded as 14 on a
|
|
14
17
|
// RequestResult.NotFound reply. Boundary transport results keep failureCode 0.
|
|
15
|
-
const
|
|
18
|
+
const RAW_MESH_RECEIVE_RECORD_BUDGET = 64;
|
|
19
|
+
const RAW_MESH_RECEIVE_BYTE_BUDGET = 4 * 1024 * 1024;
|
|
20
|
+
exports.RAW_MESH_RECEIVE_TIME_BUDGET_MS = 2;
|
|
21
|
+
const REQUEST_TARGET_NOT_FOUND_FAILURE_CODE = service_wire_constants_generated_1.ServiceWireFrameworkErrorCode.requestTargetNotFound;
|
|
16
22
|
const livenessCodec = (0, service_wire_codec_1.createServiceWireCodec)({
|
|
17
|
-
magic:
|
|
18
|
-
major:
|
|
23
|
+
magic: service_wire_constants_generated_1.SERVICE_WIRE_MAGIC,
|
|
24
|
+
major: service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
|
|
19
25
|
commands: service_wire_m6a_codec_1.M6aServiceWireCommand
|
|
20
26
|
});
|
|
21
27
|
/**
|
|
@@ -26,7 +32,7 @@ class RawServiceMeshRuntime {
|
|
|
26
32
|
topology;
|
|
27
33
|
mailbox;
|
|
28
34
|
liveness;
|
|
29
|
-
operations
|
|
35
|
+
operations;
|
|
30
36
|
expectedPeers = new Map();
|
|
31
37
|
endpointOnlyPeers = new Set();
|
|
32
38
|
peerConnectionIntentRemoved = new Set();
|
|
@@ -51,6 +57,7 @@ class RawServiceMeshRuntime {
|
|
|
51
57
|
serviceIngress;
|
|
52
58
|
closed = false;
|
|
53
59
|
constructor(options) {
|
|
60
|
+
this.operations = new operation_registry_1.OperationRegistry(undefined, options.onPendingOperationsChanged);
|
|
54
61
|
this.descriptor = options.descriptor;
|
|
55
62
|
this.topology = new service_topology_registry_1.ServiceTopologyRegistry(options.descriptor);
|
|
56
63
|
this.mailbox = new service_mailbox_1.ServiceMailbox(options.onMailboxReady);
|
|
@@ -102,32 +109,32 @@ class RawServiceMeshRuntime {
|
|
|
102
109
|
}
|
|
103
110
|
connectPeer(endpoint, expected) {
|
|
104
111
|
this.requireStarted().connectToRoutingId(expected.nodeRoutingId, endpoint);
|
|
105
|
-
this.expectedPeers.set(expected.nodeRoutingId, {
|
|
112
|
+
this.expectedPeers.set(expected.nodeRoutingId, Object.assign(this.expectedPeers.get(expected.nodeRoutingId) ?? {}, {
|
|
106
113
|
meshName: expected.meshName,
|
|
107
114
|
nodeRoutingId: expected.nodeRoutingId,
|
|
108
115
|
endpoint,
|
|
109
116
|
securityIdentity: expected.securityIdentity,
|
|
110
117
|
lifecycleGeneration: expected.lifecycleGeneration
|
|
111
|
-
});
|
|
118
|
+
}));
|
|
112
119
|
}
|
|
113
120
|
connectPeerByRoutingId(endpoint, nodeRoutingId, securityIdentity, lifecycleGeneration) {
|
|
114
121
|
this.requireStarted().connectToRoutingId(nodeRoutingId, endpoint);
|
|
115
|
-
this.expectedPeers.set(nodeRoutingId, {
|
|
122
|
+
this.expectedPeers.set(nodeRoutingId, Object.assign(this.expectedPeers.get(nodeRoutingId) ?? {}, {
|
|
116
123
|
meshName: this.topology.localDescriptor().meshName,
|
|
117
124
|
nodeRoutingId,
|
|
118
125
|
endpoint,
|
|
119
126
|
securityIdentity,
|
|
120
127
|
lifecycleGeneration
|
|
121
|
-
});
|
|
128
|
+
}));
|
|
122
129
|
}
|
|
123
130
|
expectPeerByRoutingId(endpoint, nodeRoutingId, securityIdentity, lifecycleGeneration) {
|
|
124
|
-
this.expectedPeers.set(nodeRoutingId, {
|
|
131
|
+
this.expectedPeers.set(nodeRoutingId, Object.assign(this.expectedPeers.get(nodeRoutingId) ?? {}, {
|
|
125
132
|
meshName: this.topology.localDescriptor().meshName,
|
|
126
133
|
nodeRoutingId,
|
|
127
134
|
endpoint,
|
|
128
135
|
securityIdentity,
|
|
129
136
|
lifecycleGeneration
|
|
130
|
-
});
|
|
137
|
+
}));
|
|
131
138
|
}
|
|
132
139
|
connectPeerEndpoint(endpoint) {
|
|
133
140
|
this.requireStarted().connect(endpoint);
|
|
@@ -215,11 +222,21 @@ class RawServiceMeshRuntime {
|
|
|
215
222
|
listener(nodeRoutingId);
|
|
216
223
|
}
|
|
217
224
|
async announcePeer(nodeRoutingId) {
|
|
218
|
-
|
|
225
|
+
const expected = this.expectedPeers.get(nodeRoutingId);
|
|
226
|
+
const generation = this.selectedRoutes.get(nodeRoutingId);
|
|
227
|
+
if (expected === undefined ||
|
|
228
|
+
generation === undefined ||
|
|
229
|
+
expected.helloSubmittedGeneration === generation ||
|
|
230
|
+
this.peerAdmissionSealed?.() === true)
|
|
219
231
|
return false;
|
|
220
|
-
|
|
232
|
+
const accepted = await this.send(nodeRoutingId, [
|
|
221
233
|
(0, service_wire_m6a_codec_1.encodeRouteMeshAdmission)(service_wire_m6a_codec_1.M6aServiceWireCommand.hello, this.topology.localDescriptor())
|
|
222
234
|
]);
|
|
235
|
+
if (accepted &&
|
|
236
|
+
this.expectedPeers.get(nodeRoutingId) === expected &&
|
|
237
|
+
this.selectedRoutes.get(nodeRoutingId) === generation)
|
|
238
|
+
expected.helloSubmittedGeneration = generation;
|
|
239
|
+
return accepted;
|
|
223
240
|
}
|
|
224
241
|
isPeerRouteReady(nodeRoutingId, lifecycleGeneration) {
|
|
225
242
|
// Admission is bound to the observed selected route: the route observer
|
|
@@ -233,11 +250,6 @@ class RawServiceMeshRuntime {
|
|
|
233
250
|
async announceExpectedPeers() {
|
|
234
251
|
let accepted = 0;
|
|
235
252
|
for (const nodeRoutingId of this.expectedPeers.keys()) {
|
|
236
|
-
// Admission is a one-time fence for the current selected route.
|
|
237
|
-
// Re-sending Hello after the peer is admitted would re-run admission on
|
|
238
|
-
// every poll and reset the liveness record before application traffic
|
|
239
|
-
// can use the route. A peer whose selected route ended is removed by the
|
|
240
|
-
// route observer and remains eligible for the next admission attempt.
|
|
241
253
|
if (this.topology.peer(nodeRoutingId) !== undefined)
|
|
242
254
|
continue;
|
|
243
255
|
if (await this.announcePeer(nodeRoutingId))
|
|
@@ -271,7 +283,6 @@ class RawServiceMeshRuntime {
|
|
|
271
283
|
for (const peer of this.topology.peers()) {
|
|
272
284
|
await this.send(peer.descriptor.nodeRoutingId, [update]);
|
|
273
285
|
}
|
|
274
|
-
await this.announceExpectedPeers();
|
|
275
286
|
}
|
|
276
287
|
replaceDiscoveredNotRequired(descriptors) {
|
|
277
288
|
this.topology.replaceDiscoveredNotRequired(descriptors);
|
|
@@ -291,25 +302,6 @@ class RawServiceMeshRuntime {
|
|
|
291
302
|
return selection.submitResult;
|
|
292
303
|
const selected = selection.peer;
|
|
293
304
|
const applicationFrame = this.applicationFrame(payload);
|
|
294
|
-
if (selected.descriptor.nodeRoutingId === this.descriptor.nodeRoutingId) {
|
|
295
|
-
const applicationJobOwner = await this.reserveLocalIngress();
|
|
296
|
-
try {
|
|
297
|
-
const applicationJob = await applicationJobOwner.acquire('application');
|
|
298
|
-
const accepted = this.mailbox.tryEnqueue({
|
|
299
|
-
owner: `channel:${channelName}`,
|
|
300
|
-
domain: 'application',
|
|
301
|
-
parts: [(0, service_wire_m6a_codec_1.encodeChannelSendHeader)(channelName), applicationFrame],
|
|
302
|
-
sourceRoutingId: this.descriptor.nodeRoutingId,
|
|
303
|
-
applicationJob
|
|
304
|
-
});
|
|
305
|
-
if (!accepted)
|
|
306
|
-
applicationJob.close();
|
|
307
|
-
return accepted ? runtime_values_1.SubmitResult.Ok : runtime_values_1.SubmitResult.NotAdmitted;
|
|
308
|
-
}
|
|
309
|
-
finally {
|
|
310
|
-
applicationJobOwner.close();
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
305
|
return (await this.send(selected.descriptor.nodeRoutingId, [
|
|
314
306
|
(0, service_wire_m6a_codec_1.encodeChannelSendHeader)(channelName),
|
|
315
307
|
applicationFrame
|
|
@@ -330,7 +322,7 @@ class RawServiceMeshRuntime {
|
|
|
330
322
|
return this.requestToTarget(selection.peer.descriptor.nodeRoutingId, payload, timeoutMs, channelName);
|
|
331
323
|
}
|
|
332
324
|
selectChannelTarget(channelName) {
|
|
333
|
-
const selected = this.topology.selectChannel(channelName, (peer) => this.
|
|
325
|
+
const selected = this.topology.selectChannel(channelName, (peer) => this.isPeerRouteReady(peer.descriptor.nodeRoutingId));
|
|
334
326
|
if (selected !== undefined)
|
|
335
327
|
return { kind: 'selected', peer: selected };
|
|
336
328
|
return this.topology.hasKnownChannelTarget(channelName)
|
|
@@ -348,9 +340,6 @@ class RawServiceMeshRuntime {
|
|
|
348
340
|
}
|
|
349
341
|
};
|
|
350
342
|
}
|
|
351
|
-
isLocalOrReadyPeer(nodeRoutingId) {
|
|
352
|
-
return nodeRoutingId === this.descriptor.nodeRoutingId || this.isPeerRouteReady(nodeRoutingId);
|
|
353
|
-
}
|
|
354
343
|
setServiceIngress(handler) {
|
|
355
344
|
if (this.serviceIngress !== undefined && this.serviceIngress !== handler) {
|
|
356
345
|
throw new Error('Raw service ingress is already registered.');
|
|
@@ -399,15 +388,16 @@ class RawServiceMeshRuntime {
|
|
|
399
388
|
this.requireStarted().setReadableHandler(handler);
|
|
400
389
|
}
|
|
401
390
|
/** Returns whether a receive budget ended before no-data; idle ticks only maintain peers. */
|
|
402
|
-
async pumpBatch(receiveReady = true) {
|
|
403
|
-
|
|
391
|
+
async pumpBatch(receiveReady = true, routeReady = false) {
|
|
392
|
+
if (routeReady)
|
|
393
|
+
await this.observeSelectedRoutes();
|
|
404
394
|
const startedAtMs = performance.now();
|
|
405
395
|
let messages = 0;
|
|
406
396
|
let bytes = 0;
|
|
407
397
|
const observe = (_source, byteCount) => {
|
|
408
398
|
bytes += byteCount;
|
|
409
399
|
};
|
|
410
|
-
while (receiveReady && messages <
|
|
400
|
+
while (receiveReady && messages < RAW_MESH_RECEIVE_RECORD_BUDGET && !this.closed) {
|
|
411
401
|
const result = await this.receiveOne(performance.now(), observe);
|
|
412
402
|
if (result === 'noData') {
|
|
413
403
|
receiveReady = false;
|
|
@@ -416,7 +406,8 @@ class RawServiceMeshRuntime {
|
|
|
416
406
|
messages += 1;
|
|
417
407
|
// Core owns the per-peer fair-queue cursor. The Framework limit bounds
|
|
418
408
|
// the entire round, so changing peers does not renew its byte/count budget.
|
|
419
|
-
if (bytes >=
|
|
409
|
+
if (bytes >= RAW_MESH_RECEIVE_BYTE_BUDGET ||
|
|
410
|
+
performance.now() - startedAtMs >= exports.RAW_MESH_RECEIVE_TIME_BUDGET_MS)
|
|
420
411
|
break;
|
|
421
412
|
}
|
|
422
413
|
if (!this.closed) {
|
|
@@ -527,7 +518,9 @@ class RawServiceMeshRuntime {
|
|
|
527
518
|
if (expected !== undefined &&
|
|
528
519
|
(expected.meshName !== descriptor.meshName ||
|
|
529
520
|
expected.nodeRoutingId !== descriptor.nodeRoutingId)) {
|
|
530
|
-
await this.send(received.sourceRid, [
|
|
521
|
+
await this.send(received.sourceRid, [
|
|
522
|
+
(0, service_wire_m6a_codec_1.encodeReject)((0, service_wire_codec_generated_1.enumWireRejectReason)('identityMismatch'))
|
|
523
|
+
]);
|
|
531
524
|
return 'infrastructure';
|
|
532
525
|
}
|
|
533
526
|
const result = this.admitPeer(descriptor, routeConnectionId(received.routeGeneration), nowMs, expected);
|
|
@@ -558,23 +551,7 @@ class RawServiceMeshRuntime {
|
|
|
558
551
|
if (header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.reject) {
|
|
559
552
|
if (received.parts.length !== 1)
|
|
560
553
|
return 'protocolError';
|
|
561
|
-
|
|
562
|
-
// Keep an already admitted peer: a reject of an earlier Hello on the
|
|
563
|
-
// same selected route does not end the admission that succeeded.
|
|
564
|
-
if (reason === 4 && this.topology.peer(received.sourceRid) === undefined) {
|
|
565
|
-
const expected = this.expectedPeers.get(received.sourceRid);
|
|
566
|
-
const local = this.topology.localDescriptor();
|
|
567
|
-
this.topology.markNotRequired({
|
|
568
|
-
...local,
|
|
569
|
-
nodeRoutingId: received.sourceRid,
|
|
570
|
-
lifecycleGeneration: 1n,
|
|
571
|
-
descriptorRevision: 1n,
|
|
572
|
-
advertisedEndpoint: expected?.endpoint ?? local.advertisedEndpoint,
|
|
573
|
-
channels: [],
|
|
574
|
-
objectRole: 'client'
|
|
575
|
-
});
|
|
576
|
-
this.retireNotRequiredExpectedPeer(received.sourceRid);
|
|
577
|
-
}
|
|
554
|
+
(0, service_wire_m6a_codec_1.decodeReject)(received.parts[0]);
|
|
578
555
|
return 'infrastructure';
|
|
579
556
|
}
|
|
580
557
|
const peer = this.topology.peer(received.sourceRid);
|
|
@@ -700,6 +677,12 @@ class RawServiceMeshRuntime {
|
|
|
700
677
|
throw error;
|
|
701
678
|
}
|
|
702
679
|
}
|
|
680
|
+
expireOperations(nowMs, turnDeadlineMs) {
|
|
681
|
+
return this.operations.expire(nowMs, turnDeadlineMs);
|
|
682
|
+
}
|
|
683
|
+
get pendingOperationCount() {
|
|
684
|
+
return this.operations.size;
|
|
685
|
+
}
|
|
703
686
|
async tickLiveness(nowMs = performance.now()) {
|
|
704
687
|
const result = this.liveness.tick(nowMs);
|
|
705
688
|
this.requireStarted();
|
|
@@ -739,6 +722,9 @@ class RawServiceMeshRuntime {
|
|
|
739
722
|
if (observed.get(nodeRoutingId) === generation)
|
|
740
723
|
continue;
|
|
741
724
|
changes++;
|
|
725
|
+
const expected = this.expectedPeers.get(nodeRoutingId);
|
|
726
|
+
if (expected !== undefined)
|
|
727
|
+
delete expected.helloSubmittedGeneration;
|
|
742
728
|
const peer = this.topology.peer(nodeRoutingId);
|
|
743
729
|
if (peer !== undefined && peer.connectionId === routeConnectionId(generation)) {
|
|
744
730
|
this.removePeer(peer);
|
|
@@ -761,7 +747,6 @@ class RawServiceMeshRuntime {
|
|
|
761
747
|
close() {
|
|
762
748
|
if (this.closed)
|
|
763
749
|
return;
|
|
764
|
-
this.closed = true;
|
|
765
750
|
this.applicationJobStop.abort(new Error('Raw service runtime application job admission stopped.'));
|
|
766
751
|
this.mailbox.close();
|
|
767
752
|
this.operations.close('Raw service runtime closed.');
|
|
@@ -771,10 +756,11 @@ class RawServiceMeshRuntime {
|
|
|
771
756
|
this.applicationJobQueue.unregisterReceiveFlowTarget?.(router);
|
|
772
757
|
}
|
|
773
758
|
const host = this.host;
|
|
774
|
-
this.router = undefined;
|
|
775
|
-
this.host = undefined;
|
|
776
759
|
if (host !== undefined)
|
|
777
760
|
host.close();
|
|
761
|
+
this.router = undefined;
|
|
762
|
+
this.host = undefined;
|
|
763
|
+
this.closed = true;
|
|
778
764
|
}
|
|
779
765
|
requestToTarget(targetNodeRoutingId, payload, timeoutMs, channelName) {
|
|
780
766
|
const correlation = this.nextCorrelation++;
|
|
@@ -796,13 +782,12 @@ class RawServiceMeshRuntime {
|
|
|
796
782
|
for (;;) {
|
|
797
783
|
const alternate = this.topology.selectChannel(channelName, (peer) => {
|
|
798
784
|
const candidate = peer.descriptor.nodeRoutingId;
|
|
799
|
-
return !excludedTargets.has(candidate) && this.
|
|
785
|
+
return !excludedTargets.has(candidate) && this.isPeerRouteReady(candidate);
|
|
800
786
|
});
|
|
801
787
|
if (alternate === undefined)
|
|
802
788
|
break;
|
|
803
789
|
selectedTargetNodeRoutingId = alternate.descriptor.nodeRoutingId;
|
|
804
|
-
if (
|
|
805
|
-
this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
|
|
790
|
+
if (this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
|
|
806
791
|
break;
|
|
807
792
|
}
|
|
808
793
|
excludedTargets.add(selectedTargetNodeRoutingId);
|
|
@@ -824,9 +809,7 @@ class RawServiceMeshRuntime {
|
|
|
824
809
|
return;
|
|
825
810
|
}
|
|
826
811
|
const accepted = this.mailbox.tryEnqueue({
|
|
827
|
-
owner:
|
|
828
|
-
? `node:${this.descriptor.nodeRoutingId}`
|
|
829
|
-
: `channel:${channelName}`,
|
|
812
|
+
owner: `node:${this.descriptor.nodeRoutingId}`,
|
|
830
813
|
domain: 'application',
|
|
831
814
|
parts,
|
|
832
815
|
sourceRoutingId: this.descriptor.nodeRoutingId,
|
|
@@ -1019,7 +1002,7 @@ function isAlreadyDisconnectedError(error) {
|
|
|
1019
1002
|
if (typeof error !== 'object' || error === null || !('nativeErrno' in error)) {
|
|
1020
1003
|
return false;
|
|
1021
1004
|
}
|
|
1022
|
-
return error.nativeErrno ===
|
|
1005
|
+
return error.nativeErrno === nativeErrnoValues.ENOENT;
|
|
1023
1006
|
}
|
|
1024
1007
|
/**
|
|
1025
1008
|
* An admission belongs to one Core selected route. Its connection identity is
|
|
@@ -1081,14 +1064,10 @@ function immutableDescriptorMismatch(current, descriptor) {
|
|
|
1081
1064
|
function admissionReason(result) {
|
|
1082
1065
|
switch (result) {
|
|
1083
1066
|
case 'meshMismatch':
|
|
1084
|
-
return
|
|
1067
|
+
return (0, service_wire_codec_generated_1.enumWireRejectReason)('topologyMismatch');
|
|
1085
1068
|
case 'staleDescriptor':
|
|
1086
|
-
return
|
|
1069
|
+
return (0, service_wire_codec_generated_1.enumWireRejectReason)('descriptorRevisionStale');
|
|
1087
1070
|
case 'invalidDescriptor':
|
|
1088
|
-
return
|
|
1089
|
-
case 'notRequired':
|
|
1090
|
-
return 4;
|
|
1091
|
-
case 'admitted':
|
|
1092
|
-
return 1;
|
|
1071
|
+
return (0, service_wire_codec_generated_1.enumWireRejectReason)('invalidDescriptor');
|
|
1093
1072
|
}
|
|
1094
1073
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { ZLinkFrameworkRuntimeState } from '../../contracts';
|
|
1
|
+
import { ZLinkFrameworkRuntimeState, ZLinkTopologyState } from '../../contracts';
|
|
2
|
+
export declare function runtimeObservationIsTerminal(state: ZLinkFrameworkRuntimeState): boolean;
|
|
3
|
+
export declare function topologyObservationIsTerminal(state: ZLinkTopologyState): boolean;
|
|
2
4
|
export type MaintenanceAdmissionState = 'preparing' | 'serving' | 'retiring' | 'draining' | 'stopped' | 'error';
|
|
3
5
|
export type DiscoveryAvailability = 'preparing' | 'serving' | 'retiring' | 'stopped' | 'error' | 'disconnected';
|
|
4
6
|
/** Derives public readiness from the public runtime state authority. */
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runtimeObservationIsTerminal = runtimeObservationIsTerminal;
|
|
4
|
+
exports.topologyObservationIsTerminal = topologyObservationIsTerminal;
|
|
3
5
|
exports.runtimeStateIsReady = runtimeStateIsReady;
|
|
4
6
|
exports.runtimeAcceptsWork = runtimeAcceptsWork;
|
|
5
7
|
exports.maintenanceAdmissionState = maintenanceAdmissionState;
|
|
6
8
|
exports.discoveryAvailabilityForRuntimeState = discoveryAvailabilityForRuntimeState;
|
|
7
9
|
exports.topologyRuntimeIsReady = topologyRuntimeIsReady;
|
|
8
10
|
const contracts_1 = require("../../contracts");
|
|
11
|
+
function runtimeObservationIsTerminal(state) {
|
|
12
|
+
return state === contracts_1.ZLinkFrameworkRuntimeState.Stopped;
|
|
13
|
+
}
|
|
14
|
+
function topologyObservationIsTerminal(state) {
|
|
15
|
+
return state === contracts_1.ZLinkTopologyState.Stopped || state === contracts_1.ZLinkTopologyState.Failed;
|
|
16
|
+
}
|
|
9
17
|
/** Derives public readiness from the public runtime state authority. */
|
|
10
18
|
function runtimeStateIsReady(state) {
|
|
11
19
|
return state === contracts_1.ZLinkFrameworkRuntimeState.Serving;
|
|
@@ -8,7 +8,15 @@ exports.decodeServiceClosingSpotAuthority = decodeServiceClosingSpotAuthority;
|
|
|
8
8
|
exports.decodeServiceInstanceAuthorityPayload = decodeServiceInstanceAuthorityPayload;
|
|
9
9
|
exports.rewriteServiceAuthorityOwner = rewriteServiceAuthorityOwner;
|
|
10
10
|
exports.rewriteServiceAuthorityRoute = rewriteServiceAuthorityRoute;
|
|
11
|
+
const stream_wire_1 = require("@zlink-systems/stream-wire");
|
|
12
|
+
const contracts_1 = require("../../contracts");
|
|
13
|
+
const actor_join_recovery_codec_1 = require("./actor-join-recovery-codec");
|
|
11
14
|
const service_relocation_runtime_1 = require("./service-relocation-runtime");
|
|
15
|
+
const service_wire_binary_primitives_1 = require("./service-wire-binary-primitives");
|
|
16
|
+
const SPOT_AUTHORITY_OBJECT_KIND = 2;
|
|
17
|
+
const USER_SPOT_WIRE_KIND = (0, contracts_1.zlinkSpotKindToWire)(contracts_1.ZLinkSpotKind.User);
|
|
18
|
+
const INSTANCE_SPOT_WIRE_KIND = (0, contracts_1.zlinkSpotKindToWire)(contracts_1.ZLinkSpotKind.Instance);
|
|
19
|
+
const AUTHORITY_TEXT16_MAX_BYTES = 0xffff;
|
|
12
20
|
const AUTHORITY_MAGIC = Buffer.from([0x5a, 0x4c, 0x41, 0x55]);
|
|
13
21
|
const AUTHORITY_FORMAT_VERSION = 1;
|
|
14
22
|
const AUTHORITY_FLAGS = 0;
|
|
@@ -171,7 +179,7 @@ function decodeSpotAuthority(payload) {
|
|
|
171
179
|
const operationKind = body.u8();
|
|
172
180
|
const objectKind = body.u8();
|
|
173
181
|
const object = body.takeReader(body.u16());
|
|
174
|
-
if (objectKind !==
|
|
182
|
+
if (objectKind !== SPOT_AUTHORITY_OBJECT_KIND)
|
|
175
183
|
return undefined;
|
|
176
184
|
const spotKind = object.u8();
|
|
177
185
|
const spot = object.takeReader(object.u16());
|
|
@@ -181,13 +189,13 @@ function decodeSpotAuthority(payload) {
|
|
|
181
189
|
let state;
|
|
182
190
|
let stableType;
|
|
183
191
|
let spotId;
|
|
184
|
-
if (spotKind ===
|
|
192
|
+
if (spotKind === USER_SPOT_WIRE_KIND) {
|
|
185
193
|
kind = 'user_spot';
|
|
186
194
|
spotId = spot.rid();
|
|
187
195
|
stableType = spot.text8();
|
|
188
196
|
state = spot.u8();
|
|
189
197
|
}
|
|
190
|
-
else if (spotKind ===
|
|
198
|
+
else if (spotKind === INSTANCE_SPOT_WIRE_KIND) {
|
|
191
199
|
kind = 'instance_spot';
|
|
192
200
|
state = spot.u8();
|
|
193
201
|
const instance = spot.takeReader(spot.u16());
|
|
@@ -279,21 +287,23 @@ function rid(value, name) {
|
|
|
279
287
|
}
|
|
280
288
|
function text16(value, name) {
|
|
281
289
|
const bytes = Buffer.from(value);
|
|
282
|
-
if (bytes.byteLength < 1 || bytes.byteLength >
|
|
283
|
-
throw new RangeError(`${name} must contain 1
|
|
290
|
+
if (bytes.byteLength < 1 || bytes.byteLength > AUTHORITY_TEXT16_MAX_BYTES || bytes.includes(0)) {
|
|
291
|
+
throw new RangeError(`${name} must contain 1..${AUTHORITY_TEXT16_MAX_BYTES} UTF-8 bytes without NUL.`);
|
|
284
292
|
}
|
|
285
293
|
return concat(u16(bytes.byteLength), bytes);
|
|
286
294
|
}
|
|
287
295
|
function sha256(value) {
|
|
288
|
-
if (value.byteLength !==
|
|
289
|
-
throw new RangeError(
|
|
296
|
+
if (value.byteLength !== actor_join_recovery_codec_1.SHA256_DIGEST_BYTES) {
|
|
297
|
+
throw new RangeError(`activationRecovery.sha256 must contain exactly ${actor_join_recovery_codec_1.SHA256_DIGEST_BYTES} bytes.`);
|
|
290
298
|
}
|
|
291
|
-
return concat(Buffer.of(
|
|
299
|
+
return concat(Buffer.of(actor_join_recovery_codec_1.SHA256_DIGEST_BYTES), value);
|
|
292
300
|
}
|
|
293
301
|
function sized8(value, name) {
|
|
294
302
|
const bytes = Buffer.from(value);
|
|
295
|
-
if (bytes.byteLength < 1 ||
|
|
296
|
-
|
|
303
|
+
if (bytes.byteLength < 1 ||
|
|
304
|
+
bytes.byteLength > service_wire_binary_primitives_1.SERVICE_WIRE_TEXT8_MAX_BYTES ||
|
|
305
|
+
bytes.includes(0)) {
|
|
306
|
+
throw new RangeError(`${name} must contain 1..${service_wire_binary_primitives_1.SERVICE_WIRE_TEXT8_MAX_BYTES} UTF-8 bytes without NUL.`);
|
|
297
307
|
}
|
|
298
308
|
return concat(Buffer.of(bytes.byteLength), bytes);
|
|
299
309
|
}
|
|
@@ -314,7 +324,7 @@ function boundedU32(value, name) {
|
|
|
314
324
|
return u32(value);
|
|
315
325
|
}
|
|
316
326
|
function u64(value, name) {
|
|
317
|
-
if (value <= 0n || value >
|
|
327
|
+
if (value <= 0n || value > stream_wire_1.UINT64_MAX) {
|
|
318
328
|
throw new RangeError(`${name} must be a non-zero u64.`);
|
|
319
329
|
}
|
|
320
330
|
const result = Buffer.alloc(8);
|
|
@@ -322,7 +332,7 @@ function u64(value, name) {
|
|
|
322
332
|
return result;
|
|
323
333
|
}
|
|
324
334
|
function ordinalU64(value, name) {
|
|
325
|
-
if (value < 0n || value >
|
|
335
|
+
if (value < 0n || value > stream_wire_1.UINT64_MAX) {
|
|
326
336
|
throw new RangeError(`${name} must be a u64.`);
|
|
327
337
|
}
|
|
328
338
|
const result = Buffer.alloc(8);
|
|
@@ -23,6 +23,9 @@ export interface SelectedClientServer {
|
|
|
23
23
|
}
|
|
24
24
|
/** Dedicated discovery state; fanout publishers never reuse RouteMesh peer rows. */
|
|
25
25
|
export declare class ServiceDiscoveryRegistry {
|
|
26
|
+
private readonly clientServerChanged;
|
|
27
|
+
onClientServerChanged(listener: (error?: Error) => void): () => void;
|
|
28
|
+
dispose(error: Error): void;
|
|
26
29
|
private readonly clientServers;
|
|
27
30
|
private readonly fanoutPublishers;
|
|
28
31
|
private readonly clientServerSelections;
|
|
@@ -32,6 +35,7 @@ export declare class ServiceDiscoveryRegistry {
|
|
|
32
35
|
selectClientServer(channelName: string): ClientServerDescriptor | undefined;
|
|
33
36
|
selectClientServerConnection(channelName: string): SelectedClientServer | undefined;
|
|
34
37
|
private selectClientServerConnectionCore;
|
|
38
|
+
hasReadyClientServer(channelName: string): boolean;
|
|
35
39
|
clientServerDescriptors(channelName: string): readonly ClientServerDescriptor[];
|
|
36
40
|
admitFanoutPublisher(descriptor: FanoutPublisherDescriptor, connectionId: string): boolean;
|
|
37
41
|
removeFanoutPublisher(channelName: string, publisherRoutingId: string, connectionId: string): boolean;
|