@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,29 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RawServiceMeshRuntime = void 0;
|
|
4
|
-
const
|
|
5
|
-
const runtime_values_1 = require("../backend/runtime-values");
|
|
3
|
+
exports.RawServiceMeshRuntime = exports.RAW_MESH_RECEIVE_TIME_BUDGET_MS = void 0;
|
|
4
|
+
const node_os_1 = require("node:os");
|
|
6
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");
|
|
7
8
|
const operation_registry_1 = require("./operation-registry");
|
|
8
9
|
const service_liveness_registry_1 = require("./service-liveness-registry");
|
|
9
10
|
const service_mailbox_1 = require("./service-mailbox");
|
|
10
11
|
const service_topology_registry_1 = require("./service-topology-registry");
|
|
11
|
-
const service_wire_m6a_codec_1 = require("./service-wire-m6a-codec");
|
|
12
12
|
const service_wire_codec_1 = require("./service-wire-codec");
|
|
13
13
|
const service_wire_constants_generated_1 = require("./service-wire-constants.generated");
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const MONITOR_CONNECTION_READY_EDGE = 1;
|
|
14
|
+
const service_wire_m6a_codec_1 = require("./service-wire-m6a-codec");
|
|
15
|
+
const nativeErrnoValues = node_os_1.constants.errno;
|
|
17
16
|
// Framework error code 13 (RequestTargetNotFound) is encoded as 14 on a
|
|
18
17
|
// RequestResult.NotFound reply. Boundary transport results keep failureCode 0.
|
|
19
|
-
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;
|
|
20
22
|
const livenessCodec = (0, service_wire_codec_1.createServiceWireCodec)({
|
|
21
|
-
magic:
|
|
22
|
-
major:
|
|
23
|
+
magic: service_wire_constants_generated_1.SERVICE_WIRE_MAGIC,
|
|
24
|
+
major: service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
|
|
23
25
|
commands: service_wire_m6a_codec_1.M6aServiceWireCommand
|
|
24
26
|
});
|
|
25
|
-
const MAX_PENDING_MONITOR_EVENTS = 8192;
|
|
26
|
-
const MAX_UNRESOLVED_CONNECTION_CANDIDATES = 4096;
|
|
27
27
|
/**
|
|
28
28
|
* RouteMesh M6A runtime built only on the public raw binding package.
|
|
29
29
|
* It owns protocol, admission, mailbox, request and liveness state.
|
|
@@ -32,21 +32,15 @@ class RawServiceMeshRuntime {
|
|
|
32
32
|
topology;
|
|
33
33
|
mailbox;
|
|
34
34
|
liveness;
|
|
35
|
-
operations
|
|
35
|
+
operations;
|
|
36
36
|
expectedPeers = new Map();
|
|
37
37
|
endpointOnlyPeers = new Set();
|
|
38
38
|
peerConnectionIntentRemoved = new Set();
|
|
39
|
-
connectionCandidates = new Map();
|
|
40
|
-
unresolvedConnectionCandidates = [];
|
|
41
|
-
connectionIds = new Map();
|
|
42
39
|
/**
|
|
43
|
-
* The
|
|
44
|
-
*
|
|
45
|
-
* longer usable by the application route.
|
|
40
|
+
* The last observed Core selected route of each RID (Core ROUTER §10.1):
|
|
41
|
+
* RID -> route generation. Only `observeSelectedRoutes` replaces it.
|
|
46
42
|
*/
|
|
47
|
-
|
|
48
|
-
monitorEvents = [];
|
|
49
|
-
monitorDrainBuffer = [];
|
|
43
|
+
selectedRoutes = new Map();
|
|
50
44
|
bindingPort;
|
|
51
45
|
applicationJobQueue;
|
|
52
46
|
peerAdmissionSealed;
|
|
@@ -59,11 +53,11 @@ class RawServiceMeshRuntime {
|
|
|
59
53
|
descriptor;
|
|
60
54
|
host;
|
|
61
55
|
router;
|
|
62
|
-
monitor;
|
|
63
56
|
nextCorrelation = 1n;
|
|
64
57
|
serviceIngress;
|
|
65
58
|
closed = false;
|
|
66
59
|
constructor(options) {
|
|
60
|
+
this.operations = new operation_registry_1.OperationRegistry(undefined, options.onPendingOperationsChanged);
|
|
67
61
|
this.descriptor = options.descriptor;
|
|
68
62
|
this.topology = new service_topology_registry_1.ServiceTopologyRegistry(options.descriptor);
|
|
69
63
|
this.mailbox = new service_mailbox_1.ServiceMailbox(options.onMailboxReady);
|
|
@@ -102,8 +96,6 @@ class RawServiceMeshRuntime {
|
|
|
102
96
|
};
|
|
103
97
|
this.topology.publishLocal(next);
|
|
104
98
|
this.descriptor = next;
|
|
105
|
-
this.monitor = router.monitor();
|
|
106
|
-
this.pullMonitorEvents();
|
|
107
99
|
this.host = host;
|
|
108
100
|
this.router = router;
|
|
109
101
|
}
|
|
@@ -117,32 +109,32 @@ class RawServiceMeshRuntime {
|
|
|
117
109
|
}
|
|
118
110
|
connectPeer(endpoint, expected) {
|
|
119
111
|
this.requireStarted().connectToRoutingId(expected.nodeRoutingId, endpoint);
|
|
120
|
-
this.expectedPeers.set(expected.nodeRoutingId, {
|
|
112
|
+
this.expectedPeers.set(expected.nodeRoutingId, Object.assign(this.expectedPeers.get(expected.nodeRoutingId) ?? {}, {
|
|
121
113
|
meshName: expected.meshName,
|
|
122
114
|
nodeRoutingId: expected.nodeRoutingId,
|
|
123
115
|
endpoint,
|
|
124
116
|
securityIdentity: expected.securityIdentity,
|
|
125
117
|
lifecycleGeneration: expected.lifecycleGeneration
|
|
126
|
-
});
|
|
118
|
+
}));
|
|
127
119
|
}
|
|
128
120
|
connectPeerByRoutingId(endpoint, nodeRoutingId, securityIdentity, lifecycleGeneration) {
|
|
129
121
|
this.requireStarted().connectToRoutingId(nodeRoutingId, endpoint);
|
|
130
|
-
this.expectedPeers.set(nodeRoutingId, {
|
|
122
|
+
this.expectedPeers.set(nodeRoutingId, Object.assign(this.expectedPeers.get(nodeRoutingId) ?? {}, {
|
|
131
123
|
meshName: this.topology.localDescriptor().meshName,
|
|
132
124
|
nodeRoutingId,
|
|
133
125
|
endpoint,
|
|
134
126
|
securityIdentity,
|
|
135
127
|
lifecycleGeneration
|
|
136
|
-
});
|
|
128
|
+
}));
|
|
137
129
|
}
|
|
138
130
|
expectPeerByRoutingId(endpoint, nodeRoutingId, securityIdentity, lifecycleGeneration) {
|
|
139
|
-
this.expectedPeers.set(nodeRoutingId, {
|
|
131
|
+
this.expectedPeers.set(nodeRoutingId, Object.assign(this.expectedPeers.get(nodeRoutingId) ?? {}, {
|
|
140
132
|
meshName: this.topology.localDescriptor().meshName,
|
|
141
133
|
nodeRoutingId,
|
|
142
134
|
endpoint,
|
|
143
135
|
securityIdentity,
|
|
144
136
|
lifecycleGeneration
|
|
145
|
-
});
|
|
137
|
+
}));
|
|
146
138
|
}
|
|
147
139
|
connectPeerEndpoint(endpoint) {
|
|
148
140
|
this.requireStarted().connect(endpoint);
|
|
@@ -230,31 +222,34 @@ class RawServiceMeshRuntime {
|
|
|
230
222
|
listener(nodeRoutingId);
|
|
231
223
|
}
|
|
232
224
|
async announcePeer(nodeRoutingId) {
|
|
233
|
-
|
|
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)
|
|
234
231
|
return false;
|
|
235
|
-
|
|
232
|
+
const accepted = await this.send(nodeRoutingId, [
|
|
236
233
|
(0, service_wire_m6a_codec_1.encodeRouteMeshAdmission)(service_wire_m6a_codec_1.M6aServiceWireCommand.hello, this.topology.localDescriptor())
|
|
237
234
|
]);
|
|
235
|
+
if (accepted &&
|
|
236
|
+
this.expectedPeers.get(nodeRoutingId) === expected &&
|
|
237
|
+
this.selectedRoutes.get(nodeRoutingId) === generation)
|
|
238
|
+
expected.helloSubmittedGeneration = generation;
|
|
239
|
+
return accepted;
|
|
238
240
|
}
|
|
239
241
|
isPeerRouteReady(nodeRoutingId, lifecycleGeneration) {
|
|
242
|
+
// Admission is bound to the observed selected route: the route observer
|
|
243
|
+
// removes the peer when that route ends or is replaced.
|
|
240
244
|
const peer = this.topology.peer(nodeRoutingId);
|
|
241
|
-
|
|
242
|
-
const applicationRouteReady = monitorConnection === undefined || monitorConnection === peer?.connectionId;
|
|
243
|
-
const ready = peer !== undefined &&
|
|
245
|
+
return (peer !== undefined &&
|
|
244
246
|
(lifecycleGeneration === undefined ||
|
|
245
247
|
peer.descriptor.lifecycleGeneration === lifecycleGeneration) &&
|
|
246
|
-
|
|
247
|
-
this.liveness.isReady(nodeRoutingId, peer.connectionId);
|
|
248
|
-
return ready;
|
|
248
|
+
this.liveness.isReady(nodeRoutingId, peer.connectionId));
|
|
249
249
|
}
|
|
250
250
|
async announceExpectedPeers() {
|
|
251
251
|
let accepted = 0;
|
|
252
252
|
for (const nodeRoutingId of this.expectedPeers.keys()) {
|
|
253
|
-
// Admission is a one-time fence for the current physical connection.
|
|
254
|
-
// Re-sending Hello after the peer is admitted would re-run admission on
|
|
255
|
-
// every poll and reset the liveness record before application traffic
|
|
256
|
-
// can use the route. A disconnected peer is removed by monitor handling
|
|
257
|
-
// and remains eligible for the next admission attempt.
|
|
258
253
|
if (this.topology.peer(nodeRoutingId) !== undefined)
|
|
259
254
|
continue;
|
|
260
255
|
if (await this.announcePeer(nodeRoutingId))
|
|
@@ -288,7 +283,6 @@ class RawServiceMeshRuntime {
|
|
|
288
283
|
for (const peer of this.topology.peers()) {
|
|
289
284
|
await this.send(peer.descriptor.nodeRoutingId, [update]);
|
|
290
285
|
}
|
|
291
|
-
await this.announceExpectedPeers();
|
|
292
286
|
}
|
|
293
287
|
replaceDiscoveredNotRequired(descriptors) {
|
|
294
288
|
this.topology.replaceDiscoveredNotRequired(descriptors);
|
|
@@ -308,25 +302,6 @@ class RawServiceMeshRuntime {
|
|
|
308
302
|
return selection.submitResult;
|
|
309
303
|
const selected = selection.peer;
|
|
310
304
|
const applicationFrame = this.applicationFrame(payload);
|
|
311
|
-
if (selected.descriptor.nodeRoutingId === this.descriptor.nodeRoutingId) {
|
|
312
|
-
const applicationJobOwner = await this.reserveLocalIngress();
|
|
313
|
-
try {
|
|
314
|
-
const applicationJob = await applicationJobOwner.acquire('application');
|
|
315
|
-
const accepted = this.mailbox.tryEnqueue({
|
|
316
|
-
owner: `channel:${channelName}`,
|
|
317
|
-
domain: 'application',
|
|
318
|
-
parts: [(0, service_wire_m6a_codec_1.encodeChannelSendHeader)(channelName), applicationFrame],
|
|
319
|
-
sourceRoutingId: this.descriptor.nodeRoutingId,
|
|
320
|
-
applicationJob
|
|
321
|
-
});
|
|
322
|
-
if (!accepted)
|
|
323
|
-
applicationJob.close();
|
|
324
|
-
return accepted ? runtime_values_1.SubmitResult.Ok : runtime_values_1.SubmitResult.NotAdmitted;
|
|
325
|
-
}
|
|
326
|
-
finally {
|
|
327
|
-
applicationJobOwner.close();
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
305
|
return (await this.send(selected.descriptor.nodeRoutingId, [
|
|
331
306
|
(0, service_wire_m6a_codec_1.encodeChannelSendHeader)(channelName),
|
|
332
307
|
applicationFrame
|
|
@@ -347,7 +322,7 @@ class RawServiceMeshRuntime {
|
|
|
347
322
|
return this.requestToTarget(selection.peer.descriptor.nodeRoutingId, payload, timeoutMs, channelName);
|
|
348
323
|
}
|
|
349
324
|
selectChannelTarget(channelName) {
|
|
350
|
-
const selected = this.topology.selectChannel(channelName, (peer) => this.
|
|
325
|
+
const selected = this.topology.selectChannel(channelName, (peer) => this.isPeerRouteReady(peer.descriptor.nodeRoutingId));
|
|
351
326
|
if (selected !== undefined)
|
|
352
327
|
return { kind: 'selected', peer: selected };
|
|
353
328
|
return this.topology.hasKnownChannelTarget(channelName)
|
|
@@ -365,9 +340,6 @@ class RawServiceMeshRuntime {
|
|
|
365
340
|
}
|
|
366
341
|
};
|
|
367
342
|
}
|
|
368
|
-
isLocalOrReadyPeer(nodeRoutingId) {
|
|
369
|
-
return nodeRoutingId === this.descriptor.nodeRoutingId || this.isPeerRouteReady(nodeRoutingId);
|
|
370
|
-
}
|
|
371
343
|
setServiceIngress(handler) {
|
|
372
344
|
if (this.serviceIngress !== undefined && this.serviceIngress !== handler) {
|
|
373
345
|
throw new Error('Raw service ingress is already registered.');
|
|
@@ -410,22 +382,22 @@ class RawServiceMeshRuntime {
|
|
|
410
382
|
]);
|
|
411
383
|
}
|
|
412
384
|
async pumpOne(nowMs = performance.now(), observe) {
|
|
413
|
-
this.pullMonitorEvents();
|
|
414
385
|
return this.receiveOne(nowMs, observe);
|
|
415
386
|
}
|
|
416
387
|
setReadableHandler(handler) {
|
|
417
388
|
this.requireStarted().setReadableHandler(handler);
|
|
418
389
|
}
|
|
419
390
|
/** Returns whether a receive budget ended before no-data; idle ticks only maintain peers. */
|
|
420
|
-
async pumpBatch(receiveReady = true) {
|
|
421
|
-
|
|
391
|
+
async pumpBatch(receiveReady = true, routeReady = false) {
|
|
392
|
+
if (routeReady)
|
|
393
|
+
await this.observeSelectedRoutes();
|
|
422
394
|
const startedAtMs = performance.now();
|
|
423
395
|
let messages = 0;
|
|
424
396
|
let bytes = 0;
|
|
425
397
|
const observe = (_source, byteCount) => {
|
|
426
398
|
bytes += byteCount;
|
|
427
399
|
};
|
|
428
|
-
while (receiveReady && messages <
|
|
400
|
+
while (receiveReady && messages < RAW_MESH_RECEIVE_RECORD_BUDGET && !this.closed) {
|
|
429
401
|
const result = await this.receiveOne(performance.now(), observe);
|
|
430
402
|
if (result === 'noData') {
|
|
431
403
|
receiveReady = false;
|
|
@@ -434,7 +406,8 @@ class RawServiceMeshRuntime {
|
|
|
434
406
|
messages += 1;
|
|
435
407
|
// Core owns the per-peer fair-queue cursor. The Framework limit bounds
|
|
436
408
|
// the entire round, so changing peers does not renew its byte/count budget.
|
|
437
|
-
if (bytes >=
|
|
409
|
+
if (bytes >= RAW_MESH_RECEIVE_BYTE_BUDGET ||
|
|
410
|
+
performance.now() - startedAtMs >= exports.RAW_MESH_RECEIVE_TIME_BUDGET_MS)
|
|
438
411
|
break;
|
|
439
412
|
}
|
|
440
413
|
if (!this.closed) {
|
|
@@ -483,22 +456,6 @@ class RawServiceMeshRuntime {
|
|
|
483
456
|
applicationJobOwner.close();
|
|
484
457
|
}
|
|
485
458
|
}
|
|
486
|
-
pullMonitorEvents() {
|
|
487
|
-
this.monitor?.drain((event) => {
|
|
488
|
-
this.observeMonitorEvent(event);
|
|
489
|
-
if (this.monitorEvents.length < MAX_PENDING_MONITOR_EVENTS) {
|
|
490
|
-
this.monitorEvents.push(event);
|
|
491
|
-
return;
|
|
492
|
-
}
|
|
493
|
-
const existingIndex = this.monitorEvents.findIndex((candidate) => sameMonitorConnection(candidate, event));
|
|
494
|
-
if (existingIndex >= 0)
|
|
495
|
-
this.monitorEvents[existingIndex] = event;
|
|
496
|
-
else {
|
|
497
|
-
this.monitorEvents.shift();
|
|
498
|
-
this.monitorEvents.push(event);
|
|
499
|
-
}
|
|
500
|
-
});
|
|
501
|
-
}
|
|
502
459
|
reportProtocolError(received) {
|
|
503
460
|
const request = received.requestSeq !== undefined;
|
|
504
461
|
const replied = request && this.replyGenericProtocolError(received);
|
|
@@ -561,11 +518,12 @@ class RawServiceMeshRuntime {
|
|
|
561
518
|
if (expected !== undefined &&
|
|
562
519
|
(expected.meshName !== descriptor.meshName ||
|
|
563
520
|
expected.nodeRoutingId !== descriptor.nodeRoutingId)) {
|
|
564
|
-
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
|
+
]);
|
|
565
524
|
return 'infrastructure';
|
|
566
525
|
}
|
|
567
|
-
const
|
|
568
|
-
const result = this.admitPeer(descriptor, connection, nowMs, expected);
|
|
526
|
+
const result = this.admitPeer(descriptor, routeConnectionId(received.routeGeneration), nowMs, expected);
|
|
569
527
|
if (result !== 'admitted' && result !== 'notRequired') {
|
|
570
528
|
const detail = result === 'invalidDescriptor'
|
|
571
529
|
? describeInvalidAdmissionDescriptor(descriptor, expected, this.topology.peer(descriptor.nodeRoutingId)?.descriptor)
|
|
@@ -593,25 +551,7 @@ class RawServiceMeshRuntime {
|
|
|
593
551
|
if (header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.reject) {
|
|
594
552
|
if (received.parts.length !== 1)
|
|
595
553
|
return 'protocolError';
|
|
596
|
-
|
|
597
|
-
// A reject belongs to one physical candidate, but the wire record does
|
|
598
|
-
// not carry that candidate's connection id. Keep an already admitted
|
|
599
|
-
// peer: bilateral manual connect can reject the duplicate after the
|
|
600
|
-
// other candidate has become Ready.
|
|
601
|
-
if (reason === 4 && this.topology.peer(received.sourceRid) === undefined) {
|
|
602
|
-
const expected = this.expectedPeers.get(received.sourceRid);
|
|
603
|
-
const local = this.topology.localDescriptor();
|
|
604
|
-
this.topology.markNotRequired({
|
|
605
|
-
...local,
|
|
606
|
-
nodeRoutingId: received.sourceRid,
|
|
607
|
-
lifecycleGeneration: 1n,
|
|
608
|
-
descriptorRevision: 1n,
|
|
609
|
-
advertisedEndpoint: expected?.endpoint ?? local.advertisedEndpoint,
|
|
610
|
-
channels: [],
|
|
611
|
-
objectRole: 'client'
|
|
612
|
-
});
|
|
613
|
-
this.retireNotRequiredExpectedPeer(received.sourceRid);
|
|
614
|
-
}
|
|
554
|
+
(0, service_wire_m6a_codec_1.decodeReject)(received.parts[0]);
|
|
615
555
|
return 'infrastructure';
|
|
616
556
|
}
|
|
617
557
|
const peer = this.topology.peer(received.sourceRid);
|
|
@@ -737,6 +677,12 @@ class RawServiceMeshRuntime {
|
|
|
737
677
|
throw error;
|
|
738
678
|
}
|
|
739
679
|
}
|
|
680
|
+
expireOperations(nowMs, turnDeadlineMs) {
|
|
681
|
+
return this.operations.expire(nowMs, turnDeadlineMs);
|
|
682
|
+
}
|
|
683
|
+
get pendingOperationCount() {
|
|
684
|
+
return this.operations.size;
|
|
685
|
+
}
|
|
740
686
|
async tickLiveness(nowMs = performance.now()) {
|
|
741
687
|
const result = this.liveness.tick(nowMs);
|
|
742
688
|
this.requireStarted();
|
|
@@ -752,126 +698,55 @@ class RawServiceMeshRuntime {
|
|
|
752
698
|
const peer = this.topology.peer(nodeRoutingId);
|
|
753
699
|
if (peer === undefined)
|
|
754
700
|
continue;
|
|
755
|
-
// Liveness timeout is a semantic peer removal.
|
|
756
|
-
// physical candidate state, and auto-connect intent must be retired by
|
|
757
|
-
// the same owner so a failed endpoint cannot be selected again.
|
|
758
|
-
this.removeConnectionCandidate(nodeRoutingId, peer.connectionId);
|
|
701
|
+
// Liveness timeout is a semantic peer removal of the admitted route.
|
|
759
702
|
this.removePeer(peer);
|
|
760
703
|
}
|
|
761
704
|
return result;
|
|
762
705
|
}
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
this.
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
const candidate = this.createConnectionCandidate(nodeRoutingId, event);
|
|
789
|
-
const existingPeer = this.topology.peer(nodeRoutingId);
|
|
790
|
-
if (existingPeer !== undefined && existingPeer.connectionId === candidate.connectionId) {
|
|
791
|
-
this.monitorConnectionStates.set(nodeRoutingId, candidate.connectionId);
|
|
792
|
-
continue;
|
|
793
|
-
}
|
|
794
|
-
if (existingPeer !== undefined) {
|
|
795
|
-
if (this.liveness.isReady(nodeRoutingId, existingPeer.connectionId)) {
|
|
796
|
-
const existingCandidate = this.connectionCandidates
|
|
797
|
-
.get(nodeRoutingId)
|
|
798
|
-
?.get(existingPeer.connectionId);
|
|
799
|
-
if (this.isDiscoveredLifecycleReplacement(existingPeer, nodeRoutingId)) {
|
|
800
|
-
// A current discovery descriptor with the same RID but a
|
|
801
|
-
// different lifecycle token denotes a replacement process.
|
|
802
|
-
// Keep its physical pair provisional until its Hello passes
|
|
803
|
-
// the descriptor fence; the old ready peer remains semantic
|
|
804
|
-
// current until then.
|
|
805
|
-
let provisionalCandidates = this.connectionCandidates.get(nodeRoutingId);
|
|
806
|
-
if (provisionalCandidates === undefined) {
|
|
807
|
-
provisionalCandidates = new Map();
|
|
808
|
-
this.connectionCandidates.set(nodeRoutingId, provisionalCandidates);
|
|
809
|
-
}
|
|
810
|
-
provisionalCandidates.set(candidate.connectionId, candidate);
|
|
811
|
-
await this.announcePeer(nodeRoutingId);
|
|
812
|
-
continue;
|
|
813
|
-
}
|
|
814
|
-
if (existingCandidate?.connectionId === candidate.connectionId) {
|
|
815
|
-
this.removeConnectionCandidate(nodeRoutingId, candidate.connectionId);
|
|
816
|
-
this.monitorConnectionStates.set(nodeRoutingId, existingPeer.connectionId);
|
|
817
|
-
continue;
|
|
818
|
-
}
|
|
819
|
-
// A non-replacement ready route is the current semantic owner.
|
|
820
|
-
// A second physical candidate may be admitted only after the
|
|
821
|
-
// current lease expires; this also prevents a late old-process
|
|
822
|
-
// reconnect from replacing the ready replacement by arrival order.
|
|
823
|
-
this.removeConnectionCandidate(nodeRoutingId, candidate.connectionId);
|
|
824
|
-
continue;
|
|
825
|
-
}
|
|
826
|
-
// Keep the physical candidate until the wire descriptor decides
|
|
827
|
-
// whether it is the current logical peer. READY events can race
|
|
828
|
-
// with DISCONNECTED events during reconnect; rejecting the READY
|
|
829
|
-
// here can terminate the replacement before admission evaluates its
|
|
830
|
-
// lifecycle generation.
|
|
831
|
-
let provisionalCandidates = this.connectionCandidates.get(nodeRoutingId);
|
|
832
|
-
if (provisionalCandidates === undefined) {
|
|
833
|
-
provisionalCandidates = new Map();
|
|
834
|
-
this.connectionCandidates.set(nodeRoutingId, provisionalCandidates);
|
|
835
|
-
}
|
|
836
|
-
provisionalCandidates.set(candidate.connectionId, candidate);
|
|
837
|
-
this.connectionIds.set(nodeRoutingId, candidate.connectionId);
|
|
838
|
-
await this.announcePeer(nodeRoutingId);
|
|
839
|
-
continue;
|
|
840
|
-
}
|
|
841
|
-
let candidates = this.connectionCandidates.get(nodeRoutingId);
|
|
842
|
-
if (candidates === undefined) {
|
|
843
|
-
candidates = new Map();
|
|
844
|
-
this.connectionCandidates.set(nodeRoutingId, candidates);
|
|
845
|
-
}
|
|
846
|
-
candidates.set(candidate.connectionId, candidate);
|
|
847
|
-
// Before wire admission the monitor candidate is the only physical
|
|
848
|
-
// route evidence available to the admission message.
|
|
849
|
-
this.connectionIds.set(nodeRoutingId, candidate.connectionId);
|
|
850
|
-
await this.announcePeer(nodeRoutingId);
|
|
851
|
-
}
|
|
852
|
-
else if (event.event === MONITOR_DISCONNECTED && nodeRoutingId !== undefined) {
|
|
853
|
-
const peer = this.topology.peer(nodeRoutingId);
|
|
854
|
-
const disconnectedId = monitorConnectionId(event, nodeRoutingId);
|
|
855
|
-
this.removeConnectionCandidate(nodeRoutingId, disconnectedId);
|
|
856
|
-
if (peer !== undefined && peer.connectionId === disconnectedId) {
|
|
857
|
-
this.removePeer(peer);
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
else if (event.event === MONITOR_DISCONNECTED) {
|
|
861
|
-
const disconnectedId = monitorConnectionId(event);
|
|
862
|
-
const index = this.unresolvedConnectionCandidates.findIndex((candidate) => candidate.connectionId === disconnectedId);
|
|
863
|
-
if (index >= 0)
|
|
864
|
-
this.unresolvedConnectionCandidates.splice(index, 1);
|
|
706
|
+
/**
|
|
707
|
+
* The socket's one route observer (Core ROUTER §10.1). It replaces the
|
|
708
|
+
* observation with Core's selected-route snapshot, ends the admission of
|
|
709
|
+
* every RID whose observed route disappeared or was replaced, and starts the
|
|
710
|
+
* handshake of every newly selected route. Returns the number of changes.
|
|
711
|
+
*/
|
|
712
|
+
async observeSelectedRoutes() {
|
|
713
|
+
const router = this.router;
|
|
714
|
+
if (router === undefined || this.closed)
|
|
715
|
+
return 0;
|
|
716
|
+
const observed = new Map();
|
|
717
|
+
for (const route of router.routesSnapshot()) {
|
|
718
|
+
observed.set(route.routingId, route.routeGeneration);
|
|
719
|
+
}
|
|
720
|
+
let changes = 0;
|
|
721
|
+
for (const [nodeRoutingId, generation] of this.selectedRoutes) {
|
|
722
|
+
if (observed.get(nodeRoutingId) === generation)
|
|
723
|
+
continue;
|
|
724
|
+
changes++;
|
|
725
|
+
const expected = this.expectedPeers.get(nodeRoutingId);
|
|
726
|
+
if (expected !== undefined)
|
|
727
|
+
delete expected.helloSubmittedGeneration;
|
|
728
|
+
const peer = this.topology.peer(nodeRoutingId);
|
|
729
|
+
if (peer !== undefined && peer.connectionId === routeConnectionId(generation)) {
|
|
730
|
+
this.removePeer(peer);
|
|
865
731
|
}
|
|
866
732
|
}
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
733
|
+
const selected = [];
|
|
734
|
+
for (const [nodeRoutingId, generation] of observed) {
|
|
735
|
+
if (this.selectedRoutes.get(nodeRoutingId) === generation)
|
|
736
|
+
continue;
|
|
737
|
+
if (!this.selectedRoutes.has(nodeRoutingId))
|
|
738
|
+
changes++;
|
|
739
|
+
selected.push(nodeRoutingId);
|
|
740
|
+
}
|
|
741
|
+
this.selectedRoutes = observed;
|
|
742
|
+
// A new selected route admits only through a new handshake.
|
|
743
|
+
for (const nodeRoutingId of selected)
|
|
744
|
+
await this.announcePeer(nodeRoutingId);
|
|
745
|
+
return changes;
|
|
870
746
|
}
|
|
871
747
|
close() {
|
|
872
748
|
if (this.closed)
|
|
873
749
|
return;
|
|
874
|
-
this.closed = true;
|
|
875
750
|
this.applicationJobStop.abort(new Error('Raw service runtime application job admission stopped.'));
|
|
876
751
|
this.mailbox.close();
|
|
877
752
|
this.operations.close('Raw service runtime closed.');
|
|
@@ -880,13 +755,12 @@ class RawServiceMeshRuntime {
|
|
|
880
755
|
if (router !== undefined) {
|
|
881
756
|
this.applicationJobQueue.unregisterReceiveFlowTarget?.(router);
|
|
882
757
|
}
|
|
883
|
-
this.monitor?.close();
|
|
884
|
-
this.monitor = undefined;
|
|
885
758
|
const host = this.host;
|
|
886
|
-
this.router = undefined;
|
|
887
|
-
this.host = undefined;
|
|
888
759
|
if (host !== undefined)
|
|
889
760
|
host.close();
|
|
761
|
+
this.router = undefined;
|
|
762
|
+
this.host = undefined;
|
|
763
|
+
this.closed = true;
|
|
890
764
|
}
|
|
891
765
|
requestToTarget(targetNodeRoutingId, payload, timeoutMs, channelName) {
|
|
892
766
|
const correlation = this.nextCorrelation++;
|
|
@@ -908,13 +782,12 @@ class RawServiceMeshRuntime {
|
|
|
908
782
|
for (;;) {
|
|
909
783
|
const alternate = this.topology.selectChannel(channelName, (peer) => {
|
|
910
784
|
const candidate = peer.descriptor.nodeRoutingId;
|
|
911
|
-
return !excludedTargets.has(candidate) && this.
|
|
785
|
+
return !excludedTargets.has(candidate) && this.isPeerRouteReady(candidate);
|
|
912
786
|
});
|
|
913
787
|
if (alternate === undefined)
|
|
914
788
|
break;
|
|
915
789
|
selectedTargetNodeRoutingId = alternate.descriptor.nodeRoutingId;
|
|
916
|
-
if (
|
|
917
|
-
this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
|
|
790
|
+
if (this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
|
|
918
791
|
break;
|
|
919
792
|
}
|
|
920
793
|
excludedTargets.add(selectedTargetNodeRoutingId);
|
|
@@ -936,9 +809,7 @@ class RawServiceMeshRuntime {
|
|
|
936
809
|
return;
|
|
937
810
|
}
|
|
938
811
|
const accepted = this.mailbox.tryEnqueue({
|
|
939
|
-
owner:
|
|
940
|
-
? `node:${this.descriptor.nodeRoutingId}`
|
|
941
|
-
: `channel:${channelName}`,
|
|
812
|
+
owner: `node:${this.descriptor.nodeRoutingId}`,
|
|
942
813
|
domain: 'application',
|
|
943
814
|
parts,
|
|
944
815
|
sourceRoutingId: this.descriptor.nodeRoutingId,
|
|
@@ -964,16 +835,13 @@ class RawServiceMeshRuntime {
|
|
|
964
835
|
})().catch((error) => this.operations.fail(pending.id, error));
|
|
965
836
|
return pending;
|
|
966
837
|
}
|
|
967
|
-
if (
|
|
968
|
-
//
|
|
969
|
-
//
|
|
970
|
-
//
|
|
971
|
-
// as RequestTargetNotFound without submitting an application frame.
|
|
972
|
-
const knownTarget = this.topology.peer(selectedTargetNodeRoutingId) !== undefined ||
|
|
973
|
-
this.topology.knownDescriptor(selectedTargetNodeRoutingId) !== undefined;
|
|
838
|
+
if (this.topology.peer(selectedTargetNodeRoutingId) === undefined) {
|
|
839
|
+
// Logical target selection is the requester's decision: an RID that is
|
|
840
|
+
// not an admitted peer is not a target. Whether an admitted target's
|
|
841
|
+
// route can carry the request is Core's REQUEST result.
|
|
974
842
|
this.operations.complete(pending.id, {
|
|
975
|
-
terminalResult:
|
|
976
|
-
failureCode:
|
|
843
|
+
terminalResult: runtime_values_1.RequestResult.NotFound,
|
|
844
|
+
failureCode: REQUEST_TARGET_NOT_FOUND_FAILURE_CODE
|
|
977
845
|
});
|
|
978
846
|
return pending;
|
|
979
847
|
}
|
|
@@ -1031,7 +899,7 @@ class RawServiceMeshRuntime {
|
|
|
1031
899
|
applicationPayload(payload) {
|
|
1032
900
|
return Buffer.isBuffer(payload) ? (0, service_wire_m6a_codec_1.decodeApplicationPayloadView)(payload) : payload;
|
|
1033
901
|
}
|
|
1034
|
-
admitPeer(descriptor,
|
|
902
|
+
admitPeer(descriptor, connectionId, nowMs, expected) {
|
|
1035
903
|
const previous = this.topology.peer(descriptor.nodeRoutingId);
|
|
1036
904
|
if (previous !== undefined &&
|
|
1037
905
|
previous.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration &&
|
|
@@ -1040,190 +908,16 @@ class RawServiceMeshRuntime {
|
|
|
1040
908
|
!(0, service_topology_registry_1.sameServiceNodeDescriptor)(previous.descriptor, descriptor)))) {
|
|
1041
909
|
throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`RouteMesh peer '${descriptor.nodeRoutingId}' descriptor revision is stale or conflicting.`);
|
|
1042
910
|
}
|
|
1043
|
-
const result = this.topology.admit(descriptor,
|
|
911
|
+
const result = this.topology.admit(descriptor, connectionId, expected);
|
|
1044
912
|
if (result === 'admitted') {
|
|
1045
|
-
this.
|
|
1046
|
-
this.liveness.
|
|
1047
|
-
this.liveness.requestProbe(descriptor.nodeRoutingId, connection.connectionId, nowMs);
|
|
1048
|
-
this.monitorConnectionStates.set(descriptor.nodeRoutingId, connection.connectionId);
|
|
1049
|
-
if (previous !== undefined && previous.connectionId !== connection.connectionId) {
|
|
1050
|
-
const previousCandidate = this.connectionCandidates
|
|
1051
|
-
.get(descriptor.nodeRoutingId)
|
|
1052
|
-
?.get(previous.connectionId);
|
|
1053
|
-
if (previousCandidate !== undefined) {
|
|
1054
|
-
this.removeConnectionCandidate(descriptor.nodeRoutingId, previousCandidate.connectionId);
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
913
|
+
this.liveness.admit(descriptor.nodeRoutingId, connectionId, nowMs);
|
|
914
|
+
this.liveness.requestProbe(descriptor.nodeRoutingId, connectionId, nowMs);
|
|
1057
915
|
}
|
|
1058
916
|
else if (result === 'notRequired' && previous !== undefined) {
|
|
1059
917
|
this.liveness.disconnect(descriptor.nodeRoutingId, previous.connectionId);
|
|
1060
918
|
}
|
|
1061
|
-
else if (previous !== undefined) {
|
|
1062
|
-
this.connectionIds.set(descriptor.nodeRoutingId, previous.connectionId);
|
|
1063
|
-
if (connection.connectionId !== previous.connectionId) {
|
|
1064
|
-
this.removeConnectionCandidate(descriptor.nodeRoutingId, connection.connectionId);
|
|
1065
|
-
}
|
|
1066
|
-
}
|
|
1067
919
|
return result;
|
|
1068
920
|
}
|
|
1069
|
-
currentConnectionCandidate(nodeRoutingId, advertisedEndpoint) {
|
|
1070
|
-
let connectionId = this.connectionIds.get(nodeRoutingId);
|
|
1071
|
-
let candidate = connectionId === undefined
|
|
1072
|
-
? undefined
|
|
1073
|
-
: this.connectionCandidates.get(nodeRoutingId)?.get(connectionId);
|
|
1074
|
-
if (candidate === undefined) {
|
|
1075
|
-
candidate = this.promoteUnresolvedConnectionCandidate(nodeRoutingId, advertisedEndpoint);
|
|
1076
|
-
connectionId = candidate?.connectionId;
|
|
1077
|
-
}
|
|
1078
|
-
if (candidate === undefined) {
|
|
1079
|
-
const localRid = this.topology.localDescriptor().nodeRoutingId;
|
|
1080
|
-
const endpointOnly = this.endpointOnlyPeers.has(advertisedEndpoint);
|
|
1081
|
-
const direction = this.expectedPeers.has(nodeRoutingId)
|
|
1082
|
-
? 'outbound'
|
|
1083
|
-
: endpointOnly
|
|
1084
|
-
? localRid.localeCompare(nodeRoutingId) <= 0
|
|
1085
|
-
? 'outbound'
|
|
1086
|
-
: 'inbound'
|
|
1087
|
-
: 'inbound';
|
|
1088
|
-
const initiator = endpointOnly && localRid.localeCompare(nodeRoutingId) > 0
|
|
1089
|
-
? nodeRoutingId
|
|
1090
|
-
: direction === 'outbound'
|
|
1091
|
-
? localRid
|
|
1092
|
-
: nodeRoutingId;
|
|
1093
|
-
connectionId = `unmonitored:${direction}:${(0, node_crypto_1.randomUUID)()}`;
|
|
1094
|
-
candidate = {
|
|
1095
|
-
connectionId,
|
|
1096
|
-
direction,
|
|
1097
|
-
discriminator: `initiator:${initiator}`,
|
|
1098
|
-
localAddress: '',
|
|
1099
|
-
remoteAddress: advertisedEndpoint
|
|
1100
|
-
};
|
|
1101
|
-
let candidates = this.connectionCandidates.get(nodeRoutingId);
|
|
1102
|
-
if (candidates === undefined) {
|
|
1103
|
-
candidates = new Map();
|
|
1104
|
-
this.connectionCandidates.set(nodeRoutingId, candidates);
|
|
1105
|
-
}
|
|
1106
|
-
candidates.set(connectionId, candidate);
|
|
1107
|
-
this.connectionIds.set(nodeRoutingId, connectionId);
|
|
1108
|
-
}
|
|
1109
|
-
return candidate;
|
|
1110
|
-
}
|
|
1111
|
-
createConnectionCandidate(nodeRoutingId, event) {
|
|
1112
|
-
const local = this.topology.localDescriptor();
|
|
1113
|
-
const expected = this.expectedPeers.get(nodeRoutingId);
|
|
1114
|
-
const direction = event.localAddress === local.advertisedEndpoint
|
|
1115
|
-
? 'inbound'
|
|
1116
|
-
: expected?.endpoint === event.remoteAddress
|
|
1117
|
-
? 'outbound'
|
|
1118
|
-
: this.endpointOnlyPeers.has(event.remoteAddress)
|
|
1119
|
-
? 'outbound'
|
|
1120
|
-
: 'unknown';
|
|
1121
|
-
const initiator = direction === 'outbound'
|
|
1122
|
-
? local.nodeRoutingId
|
|
1123
|
-
: direction === 'inbound'
|
|
1124
|
-
? nodeRoutingId
|
|
1125
|
-
: undefined;
|
|
1126
|
-
return {
|
|
1127
|
-
connectionId: monitorConnectionId(event, nodeRoutingId),
|
|
1128
|
-
direction,
|
|
1129
|
-
discriminator: initiator === undefined
|
|
1130
|
-
? `unknown:${monitorConnectionId(event, nodeRoutingId)}`
|
|
1131
|
-
: `initiator:${initiator}`,
|
|
1132
|
-
localAddress: event.localAddress,
|
|
1133
|
-
remoteAddress: event.remoteAddress
|
|
1134
|
-
};
|
|
1135
|
-
}
|
|
1136
|
-
createUnresolvedConnectionCandidate(event) {
|
|
1137
|
-
const connectionId = monitorConnectionId(event);
|
|
1138
|
-
const local = this.topology.localDescriptor();
|
|
1139
|
-
const direction = this.endpointOnlyPeers.has(event.remoteAddress) ||
|
|
1140
|
-
this.expectedPeerRoutingId(event.remoteAddress) !== undefined
|
|
1141
|
-
? 'outbound'
|
|
1142
|
-
: event.localAddress === local.advertisedEndpoint
|
|
1143
|
-
? 'inbound'
|
|
1144
|
-
: 'unknown';
|
|
1145
|
-
return {
|
|
1146
|
-
connectionId,
|
|
1147
|
-
direction,
|
|
1148
|
-
discriminator: `unresolved:${connectionId}`,
|
|
1149
|
-
localAddress: event.localAddress,
|
|
1150
|
-
remoteAddress: event.remoteAddress
|
|
1151
|
-
};
|
|
1152
|
-
}
|
|
1153
|
-
promoteUnresolvedConnectionCandidate(nodeRoutingId, advertisedEndpoint) {
|
|
1154
|
-
const relevant = this.unresolvedConnectionCandidates
|
|
1155
|
-
.map((candidate, index) => ({ candidate, index }))
|
|
1156
|
-
.filter(({ candidate }) => candidate.remoteAddress === advertisedEndpoint || candidate.direction === 'inbound');
|
|
1157
|
-
if (relevant.length === 0)
|
|
1158
|
-
return undefined;
|
|
1159
|
-
const directions = new Set(relevant.map((value) => value.candidate.direction));
|
|
1160
|
-
const localRid = this.topology.localDescriptor().nodeRoutingId;
|
|
1161
|
-
const preferredDirection = directions.has('inbound') && directions.has('outbound')
|
|
1162
|
-
? localRid.localeCompare(nodeRoutingId) <= 0
|
|
1163
|
-
? 'outbound'
|
|
1164
|
-
: 'inbound'
|
|
1165
|
-
: relevant.at(-1).candidate.direction;
|
|
1166
|
-
const selected = [...relevant].reverse().find((value) => value.candidate.direction === preferredDirection) ??
|
|
1167
|
-
relevant.at(-1);
|
|
1168
|
-
this.unresolvedConnectionCandidates.splice(selected.index, 1);
|
|
1169
|
-
const initiator = selected.candidate.direction === 'outbound'
|
|
1170
|
-
? localRid
|
|
1171
|
-
: selected.candidate.direction === 'inbound'
|
|
1172
|
-
? nodeRoutingId
|
|
1173
|
-
: undefined;
|
|
1174
|
-
const candidate = {
|
|
1175
|
-
...selected.candidate,
|
|
1176
|
-
discriminator: initiator === undefined
|
|
1177
|
-
? `unknown:${selected.candidate.connectionId}`
|
|
1178
|
-
: `initiator:${initiator}`
|
|
1179
|
-
};
|
|
1180
|
-
let candidates = this.connectionCandidates.get(nodeRoutingId);
|
|
1181
|
-
if (candidates === undefined) {
|
|
1182
|
-
candidates = new Map();
|
|
1183
|
-
this.connectionCandidates.set(nodeRoutingId, candidates);
|
|
1184
|
-
}
|
|
1185
|
-
candidates.set(candidate.connectionId, candidate);
|
|
1186
|
-
this.connectionIds.set(nodeRoutingId, candidate.connectionId);
|
|
1187
|
-
return candidate;
|
|
1188
|
-
}
|
|
1189
|
-
removeConnectionCandidate(nodeRoutingId, connectionId) {
|
|
1190
|
-
const candidates = this.connectionCandidates.get(nodeRoutingId);
|
|
1191
|
-
candidates?.delete(connectionId);
|
|
1192
|
-
if (candidates?.size === 0)
|
|
1193
|
-
this.connectionCandidates.delete(nodeRoutingId);
|
|
1194
|
-
if (this.connectionIds.get(nodeRoutingId) === connectionId) {
|
|
1195
|
-
this.connectionIds.delete(nodeRoutingId);
|
|
1196
|
-
}
|
|
1197
|
-
}
|
|
1198
|
-
isDiscoveredLifecycleReplacement(admitted, nodeRoutingId) {
|
|
1199
|
-
const expected = this.expectedPeers.get(nodeRoutingId);
|
|
1200
|
-
// A same-RID replacement is permitted only from a complete discovery
|
|
1201
|
-
// fence. Manual/endpoint-only intent has no authority to replace a ready
|
|
1202
|
-
// peer, and lifecycle generations are opaque equality tokens.
|
|
1203
|
-
return (expected?.endpoint !== undefined &&
|
|
1204
|
-
expected.securityIdentity !== undefined &&
|
|
1205
|
-
expected.lifecycleGeneration !== undefined &&
|
|
1206
|
-
admitted.descriptor.lifecycleGeneration !== expected.lifecycleGeneration);
|
|
1207
|
-
}
|
|
1208
|
-
expectedPeerRoutingId(endpoint) {
|
|
1209
|
-
for (const [nodeRoutingId, expected] of this.expectedPeers) {
|
|
1210
|
-
if (expected.endpoint === endpoint)
|
|
1211
|
-
return nodeRoutingId;
|
|
1212
|
-
}
|
|
1213
|
-
return undefined;
|
|
1214
|
-
}
|
|
1215
|
-
acceptsExpectedMonitorEndpoint(nodeRoutingId, event) {
|
|
1216
|
-
// A monitor address is the physical socket address, which may be an
|
|
1217
|
-
// ephemeral port. Once Core has resolved the peer routing ID, that ID is
|
|
1218
|
-
// the semantic identity; comparing the physical address with the
|
|
1219
|
-
// discovery advertised endpoint would reject valid READY events.
|
|
1220
|
-
if (event.routingId === nodeRoutingId)
|
|
1221
|
-
return true;
|
|
1222
|
-
const expected = this.expectedPeers.get(nodeRoutingId);
|
|
1223
|
-
return (expected === undefined ||
|
|
1224
|
-
expected.endpoint === undefined ||
|
|
1225
|
-
expected.endpoint === event.remoteAddress);
|
|
1226
|
-
}
|
|
1227
921
|
retireNotRequiredExpectedPeer(nodeRoutingId, advertisedEndpoint) {
|
|
1228
922
|
const expected = this.expectedPeers.get(nodeRoutingId);
|
|
1229
923
|
const endpoint = expected?.endpoint ??
|
|
@@ -1254,31 +948,10 @@ class RawServiceMeshRuntime {
|
|
|
1254
948
|
this.endpointOnlyPeers.delete(endpoint);
|
|
1255
949
|
}
|
|
1256
950
|
removePeer(peer) {
|
|
1257
|
-
if (this.monitorConnectionStates.get(peer.descriptor.nodeRoutingId) === peer.connectionId) {
|
|
1258
|
-
this.monitorConnectionStates.set(peer.descriptor.nodeRoutingId, null);
|
|
1259
|
-
}
|
|
1260
951
|
this.topology.disconnect(peer.descriptor.nodeRoutingId, peer.connectionId);
|
|
1261
952
|
this.liveness.disconnect(peer.descriptor.nodeRoutingId, peer.connectionId);
|
|
1262
953
|
this.onPeerDisconnected?.(peer.descriptor.nodeRoutingId, peer.descriptor.advertisedEndpoint, peer.descriptor.lifecycleGeneration);
|
|
1263
954
|
}
|
|
1264
|
-
observeMonitorEvent(event) {
|
|
1265
|
-
const nodeRoutingId = event.routingId ?? this.expectedPeerRoutingId(event.remoteAddress);
|
|
1266
|
-
if (nodeRoutingId === undefined)
|
|
1267
|
-
return;
|
|
1268
|
-
const connectionId = monitorConnectionId(event, nodeRoutingId);
|
|
1269
|
-
if (event.event === MONITOR_CONNECTION_READY && isConnectionReadyEdge(event)) {
|
|
1270
|
-
if (!this.acceptsExpectedMonitorEndpoint(nodeRoutingId, event))
|
|
1271
|
-
return;
|
|
1272
|
-
// The event is queued for admission. Updating monitor state here would
|
|
1273
|
-
// allow a late stale READY to overwrite the admitted replacement.
|
|
1274
|
-
return;
|
|
1275
|
-
}
|
|
1276
|
-
if (event.event === MONITOR_DISCONNECTED &&
|
|
1277
|
-
this.monitorConnectionStates.get(nodeRoutingId) === connectionId &&
|
|
1278
|
-
this.topology.peer(nodeRoutingId)?.connectionId === connectionId) {
|
|
1279
|
-
this.monitorConnectionStates.set(nodeRoutingId, null);
|
|
1280
|
-
}
|
|
1281
|
-
}
|
|
1282
955
|
requireStarted() {
|
|
1283
956
|
if (this.router === undefined)
|
|
1284
957
|
throw new Error('Raw service runtime is not started.');
|
|
@@ -1329,30 +1002,14 @@ function isAlreadyDisconnectedError(error) {
|
|
|
1329
1002
|
if (typeof error !== 'object' || error === null || !('nativeErrno' in error)) {
|
|
1330
1003
|
return false;
|
|
1331
1004
|
}
|
|
1332
|
-
return error.nativeErrno ===
|
|
1005
|
+
return error.nativeErrno === nativeErrnoValues.ENOENT;
|
|
1333
1006
|
}
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
// socket's ready count and DISCONNECTED reports its reason. It is not a
|
|
1341
|
-
// connection identity. The public monitor record has no native
|
|
1342
|
-
// connection id, so use the stable routing and endpoint tuple instead.
|
|
1343
|
-
resolvedNodeRoutingId,
|
|
1344
|
-
event.localAddress,
|
|
1345
|
-
event.remoteAddress
|
|
1346
|
-
]);
|
|
1347
|
-
}
|
|
1348
|
-
function sameMonitorConnection(left, right) {
|
|
1349
|
-
return (monitorConnectionId(left) === monitorConnectionId(right) &&
|
|
1350
|
-
left.remoteAddress === right.remoteAddress);
|
|
1351
|
-
}
|
|
1352
|
-
function isConnectionReadyEdge(event) {
|
|
1353
|
-
return event.flags === undefined
|
|
1354
|
-
? event.value > 0n
|
|
1355
|
-
: (event.flags & MONITOR_CONNECTION_READY_EDGE) !== 0;
|
|
1007
|
+
/**
|
|
1008
|
+
* An admission belongs to one Core selected route. Its connection identity is
|
|
1009
|
+
* that route's generation, an opaque token compared only for equality.
|
|
1010
|
+
*/
|
|
1011
|
+
function routeConnectionId(routeGeneration) {
|
|
1012
|
+
return `route:${routeGeneration.toString()}`;
|
|
1356
1013
|
}
|
|
1357
1014
|
function describeInvalidAdmissionDescriptor(descriptor, expected, current) {
|
|
1358
1015
|
try {
|
|
@@ -1407,14 +1064,10 @@ function immutableDescriptorMismatch(current, descriptor) {
|
|
|
1407
1064
|
function admissionReason(result) {
|
|
1408
1065
|
switch (result) {
|
|
1409
1066
|
case 'meshMismatch':
|
|
1410
|
-
return
|
|
1067
|
+
return (0, service_wire_codec_generated_1.enumWireRejectReason)('topologyMismatch');
|
|
1411
1068
|
case 'staleDescriptor':
|
|
1412
|
-
return
|
|
1069
|
+
return (0, service_wire_codec_generated_1.enumWireRejectReason)('descriptorRevisionStale');
|
|
1413
1070
|
case 'invalidDescriptor':
|
|
1414
|
-
return
|
|
1415
|
-
case 'notRequired':
|
|
1416
|
-
return 4;
|
|
1417
|
-
case 'admitted':
|
|
1418
|
-
return 1;
|
|
1071
|
+
return (0, service_wire_codec_generated_1.enumWireRejectReason)('invalidDescriptor');
|
|
1419
1072
|
}
|
|
1420
1073
|
}
|