@zlink-systems/framework 0.21.0 → 0.23.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/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -0
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/contracts/Streams/IZLinkSession.d.ts +2 -1
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +28 -22
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-join-deferred-scope.d.ts +0 -1
- package/dist/runtime/actors/actor-join-deferred-scope.js +0 -18
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +160 -130
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/contracts/index.d.ts +1 -0
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +3 -0
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +134 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +12 -20
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +46 -42
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -0
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -39
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +6 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +55 -0
- package/dist/runtime/diagnostics/flow-context.d.ts +2 -1
- package/dist/runtime/diagnostics/flow-context.js +2 -2
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +58 -42
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -27
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +4 -2
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +169 -144
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +1 -0
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +4 -0
- package/dist/runtime/foundation/service-stateful-runtime.js +461 -439
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -0
- package/dist/runtime/foundation/service-topology-registry.js +105 -96
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +245 -228
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +20 -18
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +209 -220
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +2 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +29 -21
- package/dist/runtime/spots/spot-actor-packet-drain.js +14 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +79 -86
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +17 -15
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +2 -3
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +6 -6
- package/dist/runtime/spots/spot-timer.js +26 -30
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +21 -8
- package/dist/runtime/streams/actor-session-binding-registry.js +168 -148
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -0
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +20 -17
- package/dist/runtime/streams/bound-session-response-target.js +8 -1
- package/dist/runtime/streams/bound-session-service.d.ts +1 -0
- package/dist/runtime/streams/bound-session-service.js +14 -12
- package/dist/runtime/streams/index.js +28 -20
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +52 -31
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.d.ts +5 -1
- package/dist/runtime/streams/protocol.js +68 -20
- package/dist/runtime/streams/session-actor-coordinator.js +37 -41
- package/dist/runtime/streams/session-context.d.ts +9 -2
- package/dist/runtime/streams/session-context.js +50 -32
- package/dist/runtime/streams/session-local-actors.d.ts +3 -1
- package/dist/runtime/streams/session-local-actors.js +17 -2
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.d.ts +1 -1
- package/dist/runtime/streams/stream-frame-factory.js +14 -7
- package/dist/runtime/streams/stream-session-runtime.js +112 -78
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +3 -3
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +2 -2
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +142 -134
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +1 -32
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +353 -326
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +77 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +370 -390
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +44 -44
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +218 -206
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +12 -47
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/dispatch-error-details.ts +62 -0
- package/src/runtime/diagnostics/flow-context.ts +18 -7
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +107 -79
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -55
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +364 -396
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1233 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +170 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +19 -18
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +595 -564
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +196 -148
- package/src/runtime/spots/spot-actor-packet-drain.ts +56 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +235 -222
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +129 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +13 -18
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +58 -47
- package/src/runtime/spots/spot-timer.ts +103 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +421 -292
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +8 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +60 -50
- package/src/runtime/streams/bound-session-response-target.ts +39 -9
- package/src/runtime/streams/bound-session-service.ts +52 -42
- package/src/runtime/streams/index.ts +183 -100
- package/src/runtime/streams/managed-stream.ts +123 -90
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +115 -46
- package/src/runtime/streams/session-actor-coordinator.ts +109 -93
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +96 -51
- package/src/runtime/streams/session-local-actors.ts +19 -3
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +59 -40
- package/src/runtime/streams/stream-session-runtime.ts +317 -214
- package/src/runtime/workers/index.ts +68 -29
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ZLinkFrameworkInternalErrorKind,
|
|
3
|
+
createInternalFrameworkException
|
|
4
|
+
} from '../framework-errors-internal';
|
|
2
5
|
import { randomUUID } from 'node:crypto';
|
|
3
6
|
import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
|
|
4
7
|
import type {
|
|
@@ -14,29 +17,20 @@ import type {
|
|
|
14
17
|
} from '../../contracts';
|
|
15
18
|
import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
|
|
16
19
|
import type { ZLinkRuntimeEventPublisher } from '../diagnostics';
|
|
17
|
-
import {
|
|
18
|
-
ZLinkLocationWriteIntent,
|
|
19
|
-
ZLinkLocationWriteStatus
|
|
20
|
-
} from '../../contracts/Locations';
|
|
20
|
+
import { ZLinkLocationWriteIntent, ZLinkLocationWriteStatus } from '../../contracts/Locations';
|
|
21
21
|
import {
|
|
22
22
|
ZLinkFrameworkRuntimeState,
|
|
23
23
|
ZLinkFrameworkException,
|
|
24
24
|
ZLinkObjectRole
|
|
25
25
|
} from '../../contracts';
|
|
26
|
-
import {
|
|
27
|
-
ZLinkSubmitStatus,
|
|
28
|
-
type ZLinkSubmitResult
|
|
29
|
-
} from '../messaging/submission-result';
|
|
26
|
+
import { ZLinkSubmitStatus, type ZLinkSubmitResult } from '../messaging/submission-result';
|
|
30
27
|
import {
|
|
31
28
|
ZLinkRuntimeDispatchErrorAction as ZLinkDispatchErrorAction,
|
|
32
29
|
ZLinkRuntimeDispatchErrorReason as ZLinkDispatchErrorReason,
|
|
33
30
|
ZLinkDispatchErrorSurface,
|
|
34
31
|
ZLinkDispatchMessageKind
|
|
35
32
|
} from '../../contracts/Dispatch/ZLinkDispatchOptions';
|
|
36
|
-
import {
|
|
37
|
-
SubmitResult,
|
|
38
|
-
isZLinkBackendResultError
|
|
39
|
-
} from '../backend/runtime-values';
|
|
33
|
+
import { SubmitResult, isZLinkBackendResultError } from '../backend/runtime-values';
|
|
40
34
|
import {
|
|
41
35
|
ReceiveKind,
|
|
42
36
|
type ReadyRecord,
|
|
@@ -154,8 +148,7 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
154
148
|
>();
|
|
155
149
|
private disposed = false;
|
|
156
150
|
private readonly autoConnectLoops: ZLinkAutoConnectLoop[] = [];
|
|
157
|
-
private readonly publishedMeshNodeDescriptors =
|
|
158
|
-
new Map<string, ZLinkMeshNodeDescriptor>();
|
|
151
|
+
private readonly publishedMeshNodeDescriptors = new Map<string, ZLinkMeshNodeDescriptor>();
|
|
159
152
|
// Keep the revision source separate from the cached Store row. A new owner
|
|
160
153
|
// lease may require a NewClaim against an empty Store, while peers still
|
|
161
154
|
// retain the monotonic revision from this MeshNode lifecycle.
|
|
@@ -170,8 +163,9 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
170
163
|
private readonly applicationJobQueue: ApplicationJobQueue;
|
|
171
164
|
|
|
172
165
|
constructor(private readonly options: ZLinkSpotNodeRuntimeManagerOptions) {
|
|
173
|
-
this.applicationJobQueue =
|
|
174
|
-
??
|
|
166
|
+
this.applicationJobQueue =
|
|
167
|
+
options.applicationJobQueue ??
|
|
168
|
+
new ApplicationJobQueue(resolveApplicationJobQueueConfiguration());
|
|
175
169
|
}
|
|
176
170
|
|
|
177
171
|
createReceived() {
|
|
@@ -188,7 +182,12 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
188
182
|
options: ZLinkLocationOptionOverrides,
|
|
189
183
|
events?: ZLinkLocationEventSink
|
|
190
184
|
): void {
|
|
191
|
-
this.locationAutoConnect = createSpotNodeLocationAutoConnectContext(
|
|
185
|
+
this.locationAutoConnect = createSpotNodeLocationAutoConnectContext(
|
|
186
|
+
runtime,
|
|
187
|
+
stores,
|
|
188
|
+
options,
|
|
189
|
+
events
|
|
190
|
+
);
|
|
192
191
|
}
|
|
193
192
|
|
|
194
193
|
async startLocationAutoConnect(signal?: AbortSignal): Promise<void> {
|
|
@@ -254,10 +253,11 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
254
253
|
}
|
|
255
254
|
const meshAdapter = this.options.backendAdapterFactory.createMeshAdapter();
|
|
256
255
|
for (const [spotNodeName, spotNode] of this.options.registration.spotNodes.entries()) {
|
|
257
|
-
const routingId =
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
256
|
+
const routingId =
|
|
257
|
+
spotNode.routingId ??
|
|
258
|
+
spotNode.router?.routingId ??
|
|
259
|
+
spotNode.pubSub?.routingId ??
|
|
260
|
+
`${spotNode.routingIdPrefix ?? spotNodeName}-${randomUUID()}`;
|
|
261
261
|
const bind = spotNode.router?.bind;
|
|
262
262
|
if (bind === undefined) {
|
|
263
263
|
throw new ZLinkConfigurationException(
|
|
@@ -269,10 +269,12 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
269
269
|
routingId,
|
|
270
270
|
receiveTimeoutMs: spotNode.router?.receiveTimeoutMs,
|
|
271
271
|
applicationJobQueue: this.applicationJobQueue,
|
|
272
|
-
applicationJobReceiveFlowFailureSink:
|
|
273
|
-
this.options.applicationJobReceiveFlowFailureSink,
|
|
272
|
+
applicationJobReceiveFlowFailureSink: this.options.applicationJobReceiveFlowFailureSink,
|
|
274
273
|
peerAdmissionSealed: () => this.options.peerAdmissionSealed?.(spotNodeName) ?? false
|
|
275
274
|
});
|
|
275
|
+
if (this.options.dispatchErrors !== undefined) {
|
|
276
|
+
node.setDispatchErrorReporter?.(this.options.dispatchErrors, spotNodeName);
|
|
277
|
+
}
|
|
276
278
|
node.setMailboxRecordDroppedHandler?.((record) =>
|
|
277
279
|
this.options.dispatchErrors?.report({
|
|
278
280
|
surface: ZLinkDispatchErrorSurface.RouteMeshChannel,
|
|
@@ -283,7 +285,8 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
283
285
|
error: new Error(
|
|
284
286
|
`MeshNode '${spotNodeName}' no longer accepts ${record.kind} for '${record.owner}'.`
|
|
285
287
|
)
|
|
286
|
-
})
|
|
288
|
+
})
|
|
289
|
+
);
|
|
287
290
|
node.setProtocolErrorHandler?.((record) =>
|
|
288
291
|
this.options.dispatchErrors?.report({
|
|
289
292
|
surface: ZLinkDispatchErrorSurface.RouteMeshChannel,
|
|
@@ -297,10 +300,11 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
297
300
|
channelName: spotNodeName,
|
|
298
301
|
sourceRid: record.sourceNodeRid,
|
|
299
302
|
error: new Error(
|
|
300
|
-
`MeshNode '${spotNodeName}' rejected an invalid service wire record from '${record.sourceNodeRid}'`
|
|
301
|
-
|
|
303
|
+
`MeshNode '${spotNodeName}' rejected an invalid service wire record from '${record.sourceNodeRid}'` +
|
|
304
|
+
(record.command === undefined ? '.' : ` (command ${record.command}).`)
|
|
302
305
|
)
|
|
303
|
-
})
|
|
306
|
+
})
|
|
307
|
+
);
|
|
304
308
|
let pump: ZLinkMeshDispatchPump | undefined;
|
|
305
309
|
const completions = new ZLinkMeshCompletionTable();
|
|
306
310
|
try {
|
|
@@ -313,30 +317,24 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
313
317
|
...Object.keys(spotNode.instanceSpotFactoryRegistrations ?? {}),
|
|
314
318
|
...Object.keys(spotNode.actorFactoryRegistrations ?? {})
|
|
315
319
|
];
|
|
316
|
-
const instanceSpotTypes = Object.keys(
|
|
317
|
-
spotNode.instanceSpotFactoryRegistrations ?? {}
|
|
318
|
-
);
|
|
320
|
+
const instanceSpotTypes = Object.keys(spotNode.instanceSpotFactoryRegistrations ?? {});
|
|
319
321
|
const hasLegacyObjectFactories =
|
|
320
|
-
(spotNode.spotFactories?.length ?? 0) > 0
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
spotNode.actorFactories
|
|
324
|
-
|
|
325
|
-
: Object.keys(spotNode.actorFactories ?? {}).length
|
|
326
|
-
) > 0;
|
|
322
|
+
(spotNode.spotFactories?.length ?? 0) > 0 ||
|
|
323
|
+
Object.keys(spotNode.instanceSpotFactories ?? {}).length > 0 ||
|
|
324
|
+
(spotNode.actorFactories instanceof Map
|
|
325
|
+
? spotNode.actorFactories.size
|
|
326
|
+
: Object.keys(spotNode.actorFactories ?? {}).length) > 0;
|
|
327
327
|
node.configureObjectPlacement({
|
|
328
|
-
role: spotNode.objectRole
|
|
329
|
-
?? (hasLegacyObjectFactories ? 'server' : 'none'),
|
|
328
|
+
role: spotNode.objectRole ?? (hasLegacyObjectFactories ? 'server' : 'none'),
|
|
330
329
|
placementWeight: spotNode.placementWeight ?? 100,
|
|
331
|
-
activeCapacityLimit:
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
),
|
|
330
|
+
activeCapacityLimit: aggregatePlacementCapacity(
|
|
331
|
+
spotNode.actorLimit ?? 0,
|
|
332
|
+
spotNode.spotLimit ?? 0
|
|
333
|
+
),
|
|
336
334
|
pendingCapacityLimit: spotNode.activationConcurrencyLimit ?? 128,
|
|
337
335
|
objectCapabilities: [
|
|
338
|
-
...stableTypes.map(type => `object-type:${type}`),
|
|
339
|
-
...instanceSpotTypes.map(type => `instance-spot-type:${type}`)
|
|
336
|
+
...stableTypes.map((type) => `object-type:${type}`),
|
|
337
|
+
...instanceSpotTypes.map((type) => `instance-spot-type:${type}`)
|
|
340
338
|
],
|
|
341
339
|
...(this.options.registration.maintenanceWave === undefined
|
|
342
340
|
? {}
|
|
@@ -363,17 +361,18 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
363
361
|
pump = new ZLinkMeshDispatchPump(node, {
|
|
364
362
|
applicationJobQueue: this.applicationJobQueue,
|
|
365
363
|
dispatch: (owner, record) => this.dispatchMeshRecord(spotNodeName, owner, record),
|
|
366
|
-
reportError: (error, context) =>
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
364
|
+
reportError: (error, context) =>
|
|
365
|
+
this.options.dispatchErrors?.report({
|
|
366
|
+
surface: ZLinkDispatchErrorSurface.Node,
|
|
367
|
+
messageKind: ZLinkDispatchMessageKind.Control,
|
|
368
|
+
reason: ZLinkDispatchErrorReason.HandlerException,
|
|
369
|
+
action: ZLinkDispatchErrorAction.Drop,
|
|
370
|
+
meshName: spotNodeName,
|
|
371
|
+
packetName: context?.packetName,
|
|
372
|
+
sourceRid: context?.sourceNodeRid,
|
|
373
|
+
commandId: context?.commandId,
|
|
374
|
+
error
|
|
375
|
+
})
|
|
377
376
|
});
|
|
378
377
|
pump.start();
|
|
379
378
|
this.meshNodes.set(spotNodeName, node);
|
|
@@ -401,7 +400,9 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
401
400
|
): Promise<void> {
|
|
402
401
|
const previous = this.statePublication;
|
|
403
402
|
let release!: () => void;
|
|
404
|
-
this.statePublication = new Promise<void>((resolve) => {
|
|
403
|
+
this.statePublication = new Promise<void>((resolve) => {
|
|
404
|
+
release = resolve;
|
|
405
|
+
});
|
|
405
406
|
await previous;
|
|
406
407
|
try {
|
|
407
408
|
await this.publishMeshNodeStateCore(state, signal, selectedMeshName);
|
|
@@ -418,8 +419,8 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
418
419
|
const location = this.locationAutoConnect;
|
|
419
420
|
const owner = location?.runtime.currentOwnerToken;
|
|
420
421
|
if (location === undefined || owner === undefined) return;
|
|
421
|
-
const ownerChanged =
|
|
422
|
-
&& !sameOwnerToken(this.publishedOwnerToken, owner);
|
|
422
|
+
const ownerChanged =
|
|
423
|
+
this.publishedOwnerToken !== undefined && !sameOwnerToken(this.publishedOwnerToken, owner);
|
|
423
424
|
if (ownerChanged) {
|
|
424
425
|
// A new owner token can refer to an empty or replaced Store. The cached
|
|
425
426
|
// descriptor was written under the previous lease and must not force a
|
|
@@ -436,16 +437,15 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
436
437
|
const actors = effectiveActorRegistrations(registration);
|
|
437
438
|
const capabilities = [
|
|
438
439
|
...userSpots.map(([stableType, factory]) =>
|
|
439
|
-
objectCapability('user_spot', stableType, factory)
|
|
440
|
+
objectCapability('user_spot', stableType, factory)
|
|
441
|
+
),
|
|
440
442
|
...instanceSpots.map(([stableType, factory]) =>
|
|
441
|
-
objectCapability('instance_spot', stableType, factory)
|
|
442
|
-
|
|
443
|
-
|
|
443
|
+
objectCapability('instance_spot', stableType, factory)
|
|
444
|
+
),
|
|
445
|
+
...actors.map(([stableType, factory]) => objectCapability('actor', stableType, factory))
|
|
444
446
|
].sort((left, right) => {
|
|
445
447
|
const kindOrder = left.objectKind.localeCompare(right.objectKind);
|
|
446
|
-
return kindOrder !== 0
|
|
447
|
-
? kindOrder
|
|
448
|
-
: left.stableType.localeCompare(right.stableType);
|
|
448
|
+
return kindOrder !== 0 ? kindOrder : left.stableType.localeCompare(right.stableType);
|
|
449
449
|
});
|
|
450
450
|
const current = this.publishedMeshNodeDescriptors.get(meshName);
|
|
451
451
|
const previousRevision = this.descriptorRevisionByMesh.get(meshName) ?? 0n;
|
|
@@ -472,11 +472,13 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
472
472
|
limit: registration.spotLimit ?? 0
|
|
473
473
|
},
|
|
474
474
|
spotTypes: capabilities
|
|
475
|
-
.filter(capability => capability.objectKind !== 'actor')
|
|
476
|
-
.map(capability => {
|
|
477
|
-
const previous = current?.populationCapacity.spotTypes.find(
|
|
478
|
-
candidate
|
|
479
|
-
|
|
475
|
+
.filter((capability) => capability.objectKind !== 'actor')
|
|
476
|
+
.map((capability) => {
|
|
477
|
+
const previous = current?.populationCapacity.spotTypes.find(
|
|
478
|
+
(candidate) =>
|
|
479
|
+
candidate.objectKind === capability.objectKind &&
|
|
480
|
+
candidate.stableType === capability.stableType
|
|
481
|
+
);
|
|
480
482
|
return {
|
|
481
483
|
objectKind: capability.objectKind as 'user_spot' | 'instance_spot',
|
|
482
484
|
stableType: capability.stableType,
|
|
@@ -487,35 +489,33 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
487
489
|
})
|
|
488
490
|
},
|
|
489
491
|
activationConcurrency: {
|
|
490
|
-
active:
|
|
491
|
-
|
|
492
|
-
??
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
??
|
|
492
|
+
active:
|
|
493
|
+
this.options.instanceActivationConcurrencyProvider?.(meshName).active ??
|
|
494
|
+
current?.activationConcurrency.active ??
|
|
495
|
+
0,
|
|
496
|
+
limit:
|
|
497
|
+
this.options.instanceActivationConcurrencyProvider?.(meshName).limit ??
|
|
498
|
+
registration.activationConcurrencyLimit ??
|
|
499
|
+
128
|
|
496
500
|
},
|
|
497
501
|
channelWeights: Object.fromEntries(
|
|
498
|
-
this.serverChannels(meshName)
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
])
|
|
502
|
+
this.serverChannels(meshName).map(([channelName, channel]) => [
|
|
503
|
+
channelName,
|
|
504
|
+
state === ZLinkFrameworkRuntimeState.Draining
|
|
505
|
+
? 0
|
|
506
|
+
: this.effectiveChannelWeight(meshName, channelName, channel.weight ?? 100)
|
|
507
|
+
])
|
|
505
508
|
),
|
|
506
509
|
applicationVersion: this.options.registration.applicationVersion,
|
|
507
510
|
maintenanceWave: this.options.registration.maintenanceWave,
|
|
508
511
|
spotTypes: [
|
|
509
512
|
...userSpots.map(([stableType]) => stableType),
|
|
510
513
|
...instanceSpots.map(([stableType]) => stableType),
|
|
511
|
-
...(registration.entrySpotType === undefined
|
|
512
|
-
|
|
513
|
-
: [registration.entrySpotType.name])
|
|
514
|
-
]
|
|
515
|
-
.sort(),
|
|
514
|
+
...(registration.entrySpotType === undefined ? [] : [registration.entrySpotType.name])
|
|
515
|
+
].sort(),
|
|
516
516
|
objectCapabilities: capabilities,
|
|
517
517
|
state,
|
|
518
|
-
securityIdentity: 'default'
|
|
518
|
+
securityIdentity: 'default'
|
|
519
519
|
};
|
|
520
520
|
const result = await location.runtime.writeMeshNode(
|
|
521
521
|
descriptor,
|
|
@@ -553,12 +553,13 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
553
553
|
const status = node.status();
|
|
554
554
|
const owner = location.runtime.currentOwnerToken;
|
|
555
555
|
if (owner === undefined) return;
|
|
556
|
-
const current = (await location.runtime.listLiveMeshNodes(meshName, signal))
|
|
557
|
-
|
|
558
|
-
String(descriptor.rid) === String(status.routingId)
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
556
|
+
const current = (await location.runtime.listLiveMeshNodes(meshName, signal)).find(
|
|
557
|
+
(descriptor) =>
|
|
558
|
+
String(descriptor.rid) === String(status.routingId) &&
|
|
559
|
+
descriptor.lifecycleGeneration === status.lifecycleGeneration &&
|
|
560
|
+
descriptor.ownerId === owner.ownerId &&
|
|
561
|
+
descriptor.leaseGeneration === owner.leaseGeneration
|
|
562
|
+
);
|
|
562
563
|
if (current !== undefined) {
|
|
563
564
|
this.publishedMeshNodeDescriptors.set(meshName, current);
|
|
564
565
|
this.descriptorRevisionByMesh.set(
|
|
@@ -570,10 +571,7 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
570
571
|
await this.publishMeshNodeState(state, signal, meshName);
|
|
571
572
|
}
|
|
572
573
|
|
|
573
|
-
private entrySpotId(
|
|
574
|
-
meshName: string,
|
|
575
|
-
registration: ZLinkSpotNodeOptions
|
|
576
|
-
): string | undefined {
|
|
574
|
+
private entrySpotId(meshName: string, registration: ZLinkSpotNodeOptions): string | undefined {
|
|
577
575
|
if (effectiveObjectRole(registration) !== ZLinkObjectRole.Server) {
|
|
578
576
|
return undefined;
|
|
579
577
|
}
|
|
@@ -608,9 +606,7 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
608
606
|
|
|
609
607
|
entrySpotIdForMesh(meshName: string): string | undefined {
|
|
610
608
|
const registration = this.options.registration.spotNodes.get(meshName);
|
|
611
|
-
return registration === undefined
|
|
612
|
-
? undefined
|
|
613
|
-
: this.entrySpotId(meshName, registration);
|
|
609
|
+
return registration === undefined ? undefined : this.entrySpotId(meshName, registration);
|
|
614
610
|
}
|
|
615
611
|
|
|
616
612
|
meshNodeDescriptor(meshName: string): ZLinkMeshNodeDescriptor | undefined {
|
|
@@ -622,9 +618,7 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
622
618
|
if (registration === undefined) {
|
|
623
619
|
throw new ZLinkConfigurationException(`Mesh '${meshName}' is not registered.`);
|
|
624
620
|
}
|
|
625
|
-
return this.runtimePlacementWeights.get(meshName)
|
|
626
|
-
?? registration.placementWeight
|
|
627
|
-
?? 100;
|
|
621
|
+
return this.runtimePlacementWeights.get(meshName) ?? registration.placementWeight ?? 100;
|
|
628
622
|
}
|
|
629
623
|
|
|
630
624
|
channelWeight(channelName: string): number {
|
|
@@ -656,7 +650,10 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
656
650
|
);
|
|
657
651
|
}
|
|
658
652
|
const validated = requirePublicRuntimeWeight(weight, 'Channel weight');
|
|
659
|
-
if (
|
|
653
|
+
if (
|
|
654
|
+
this.effectiveChannelWeight(match.meshName, channelName, match.configuredWeight) === validated
|
|
655
|
+
)
|
|
656
|
+
return;
|
|
660
657
|
let weights = this.runtimeChannelWeights.get(match.meshName);
|
|
661
658
|
if (weights === undefined) {
|
|
662
659
|
weights = new Map();
|
|
@@ -694,15 +691,14 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
694
691
|
readonly meshName: string;
|
|
695
692
|
readonly configuredWeight: number;
|
|
696
693
|
} {
|
|
697
|
-
const matches = [...this.options.registration.spotNodes]
|
|
698
|
-
.
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
? []
|
|
702
|
-
: [{ meshName, configuredWeight: channel.weight ?? 100 }];
|
|
703
|
-
});
|
|
694
|
+
const matches = [...this.options.registration.spotNodes].flatMap(([meshName, registration]) => {
|
|
695
|
+
const channel = registration.meshChannels?.[channelName];
|
|
696
|
+
return channel === undefined ? [] : [{ meshName, configuredWeight: channel.weight ?? 100 }];
|
|
697
|
+
});
|
|
704
698
|
if (matches.length === 0) {
|
|
705
|
-
throw new ZLinkConfigurationException(
|
|
699
|
+
throw new ZLinkConfigurationException(
|
|
700
|
+
`RouteMesh channel '${channelName}' is not registered.`
|
|
701
|
+
);
|
|
706
702
|
}
|
|
707
703
|
if (matches.length > 1) {
|
|
708
704
|
throw new ZLinkConfigurationException(
|
|
@@ -716,12 +712,15 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
716
712
|
meshName: string,
|
|
717
713
|
applyWeight: () => Promise<void>
|
|
718
714
|
): void {
|
|
719
|
-
const publish = this.runtimeWeightPublication
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
715
|
+
const publish = this.runtimeWeightPublication
|
|
716
|
+
.catch(() => undefined)
|
|
717
|
+
.then(async () => {
|
|
718
|
+
await applyWeight();
|
|
719
|
+
const state =
|
|
720
|
+
this.publishedMeshNodeDescriptors.get(meshName)?.state ??
|
|
721
|
+
ZLinkFrameworkRuntimeState.Serving;
|
|
722
|
+
await this.publishMeshNodeState(state, undefined, meshName);
|
|
723
|
+
});
|
|
725
724
|
this.runtimeWeightPublication = publish;
|
|
726
725
|
if (this.options.detachedTaskRunner !== undefined) {
|
|
727
726
|
this.options.detachedTaskRunner.runDetached(
|
|
@@ -744,13 +743,14 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
744
743
|
createRequest: ZLinkMessage,
|
|
745
744
|
signal?: AbortSignal
|
|
746
745
|
): Promise<import('../../contracts').ZLinkActorCreateResponse | undefined> {
|
|
747
|
-
let activation = [...this.entryActivations.values()].find(
|
|
748
|
-
|
|
746
|
+
let activation = [...this.entryActivations.values()].find((entryActivation) =>
|
|
747
|
+
routingIdsEqual(entryActivation.nodeRid, nodeRid)
|
|
749
748
|
);
|
|
750
749
|
if (activation === undefined) {
|
|
751
750
|
for (const [meshName, node] of this.meshNodes) {
|
|
752
751
|
if (!routingIdsEqual(node.status().routingId, nodeRid)) continue;
|
|
753
|
-
if (this.options.registration.spotNodes.get(meshName)?.entrySpotType === undefined)
|
|
752
|
+
if (this.options.registration.spotNodes.get(meshName)?.entrySpotType === undefined)
|
|
753
|
+
continue;
|
|
754
754
|
await this.ensureEntryActivation(meshName);
|
|
755
755
|
activation = this.entryActivations.get(meshName);
|
|
756
756
|
break;
|
|
@@ -759,10 +759,7 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
759
759
|
return activation?.notifyCreateActor(actor, createRequest, signal);
|
|
760
760
|
}
|
|
761
761
|
|
|
762
|
-
notifyPrimaryEntrySpotActorJoined(
|
|
763
|
-
actor: ZLinkActor,
|
|
764
|
-
signal?: AbortSignal
|
|
765
|
-
): Promise<void> {
|
|
762
|
+
notifyPrimaryEntrySpotActorJoined(actor: ZLinkActor, signal?: AbortSignal): Promise<void> {
|
|
766
763
|
const activation = this.primaryEntryActivation();
|
|
767
764
|
return activation?.notifyJoinActor(actor, signal) ?? Promise.resolve();
|
|
768
765
|
}
|
|
@@ -774,13 +771,12 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
774
771
|
membershipEpoch?: bigint
|
|
775
772
|
): Promise<void> {
|
|
776
773
|
const activation = this.primaryEntryActivation();
|
|
777
|
-
return
|
|
774
|
+
return (
|
|
775
|
+
activation?.notifyLeaveActor(actor, signal, actorRef, membershipEpoch) ?? Promise.resolve()
|
|
776
|
+
);
|
|
778
777
|
}
|
|
779
778
|
|
|
780
|
-
notifyPrimaryEntrySpotActorDisconnected(
|
|
781
|
-
actor: ZLinkActor,
|
|
782
|
-
signal?: AbortSignal
|
|
783
|
-
): Promise<void> {
|
|
779
|
+
notifyPrimaryEntrySpotActorDisconnected(actor: ZLinkActor, signal?: AbortSignal): Promise<void> {
|
|
784
780
|
const activation = this.primaryEntryActivation();
|
|
785
781
|
return activation?.notifyDisconnectActor(actor, signal) ?? Promise.resolve();
|
|
786
782
|
}
|
|
@@ -795,8 +791,9 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
795
791
|
}
|
|
796
792
|
|
|
797
793
|
serverChannels(meshName: string) {
|
|
798
|
-
return Object.entries(
|
|
799
|
-
.
|
|
794
|
+
return Object.entries(
|
|
795
|
+
this.options.registration.spotNodes.get(meshName)?.meshChannels ?? {}
|
|
796
|
+
).filter(([, channel]) => channel.server === true);
|
|
800
797
|
}
|
|
801
798
|
|
|
802
799
|
async dispose(signal?: AbortSignal, deadline?: Date): Promise<void> {
|
|
@@ -814,18 +811,22 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
814
811
|
const errors: unknown[] = [];
|
|
815
812
|
const settle = async (operations: readonly Promise<unknown>[]) => {
|
|
816
813
|
const results = await Promise.allSettled(operations);
|
|
817
|
-
errors.push(
|
|
818
|
-
|
|
819
|
-
|
|
814
|
+
errors.push(
|
|
815
|
+
...results
|
|
816
|
+
.filter((result): result is PromiseRejectedResult => result.status === 'rejected')
|
|
817
|
+
.map((result) => result.reason)
|
|
818
|
+
);
|
|
820
819
|
};
|
|
821
820
|
await settle(publishers.map(async (publisher) => publisher.close()));
|
|
822
821
|
await settle(autoConnectLoops.map((loop) => loop.prepareTransportShutdown()));
|
|
823
822
|
await settle(entryActivations.reverse().map((activation) => activation.dispose(deadline)));
|
|
824
823
|
await settle(meshPumps.reverse().map((pump) => pump.dispose()));
|
|
825
|
-
await settle(
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
824
|
+
await settle(
|
|
825
|
+
meshNodes.reverse().map(async (node) => {
|
|
826
|
+
node.shutdown(1000);
|
|
827
|
+
node.close();
|
|
828
|
+
})
|
|
829
|
+
);
|
|
829
830
|
for (const completions of meshCompletions) {
|
|
830
831
|
completions.dispose();
|
|
831
832
|
}
|
|
@@ -853,18 +854,18 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
853
854
|
return;
|
|
854
855
|
}
|
|
855
856
|
const node = this.meshNodes.get(meshName);
|
|
856
|
-
const targetsEntrySpot =
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
String(node.status().routingId)
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
record.kind === ReceiveKind.ActorSend
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
)
|
|
857
|
+
const targetsEntrySpot =
|
|
858
|
+
owner.spotId === null ||
|
|
859
|
+
(node !== undefined &&
|
|
860
|
+
routingIdsEqual(owner.spotId as unknown as RoutingId, String(node.status().routingId)));
|
|
861
|
+
if (
|
|
862
|
+
targetsEntrySpot &&
|
|
863
|
+
(record.kind === ReceiveKind.ActorSend ||
|
|
864
|
+
record.kind === ReceiveKind.ActorRequest ||
|
|
865
|
+
record.kind === ReceiveKind.SpotSend ||
|
|
866
|
+
record.kind === ReceiveKind.SpotRequest ||
|
|
867
|
+
record.kind === ReceiveKind.SpotMulticast)
|
|
868
|
+
) {
|
|
868
869
|
await this.ensureEntryActivation(meshName);
|
|
869
870
|
}
|
|
870
871
|
const dispatcher = this.options.meshRecordDispatcher;
|
|
@@ -881,23 +882,23 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
881
882
|
owner: ReadyRecord,
|
|
882
883
|
record: ReceiveRecord
|
|
883
884
|
): Promise<boolean> {
|
|
884
|
-
if (
|
|
885
|
-
|
|
886
|
-
|
|
885
|
+
if (
|
|
886
|
+
record.kind !== ReceiveKind.SpotSend &&
|
|
887
|
+
record.kind !== ReceiveKind.SpotRequest &&
|
|
888
|
+
record.kind !== ReceiveKind.SpotMulticast
|
|
889
|
+
) {
|
|
887
890
|
return false;
|
|
888
891
|
}
|
|
889
892
|
await this.ensureEntryActivation(meshName);
|
|
890
893
|
const activation = this.entryActivations.get(meshName);
|
|
891
|
-
if (
|
|
892
|
-
activation === undefined
|
|
893
|
-
|| owner.spotId === null
|
|
894
|
-
|| activation.spotId !== owner.spotId
|
|
895
|
-
) {
|
|
894
|
+
if (activation === undefined || owner.spotId === null || activation.spotId !== owner.spotId) {
|
|
896
895
|
return false;
|
|
897
896
|
}
|
|
898
897
|
if (record.kind === ReceiveKind.SpotMulticast) {
|
|
899
898
|
if (record.topic === null || record.topic.length === 0) {
|
|
900
|
-
throw new ZLinkConfigurationException(
|
|
899
|
+
throw new ZLinkConfigurationException(
|
|
900
|
+
'MeshNode Entry Spot multicast record is missing its topic.'
|
|
901
|
+
);
|
|
901
902
|
}
|
|
902
903
|
await activation.dispatchSubscriptionRecord(
|
|
903
904
|
record.topic,
|
|
@@ -928,7 +929,9 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
928
929
|
context,
|
|
929
930
|
true
|
|
930
931
|
);
|
|
931
|
-
requireEntrySpotReply(
|
|
932
|
+
requireEntrySpotReply(
|
|
933
|
+
record.reply(encodeChannelReplyParts(envelope.header, response, codecs))
|
|
934
|
+
);
|
|
932
935
|
} catch (error) {
|
|
933
936
|
requireEntrySpotReply(record.reply(encodeChannelErrorReplyParts(envelope.header, error)));
|
|
934
937
|
}
|
|
@@ -982,10 +985,8 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
982
985
|
spotPublisherClient: this.options.spotPublisherClient,
|
|
983
986
|
routedTransport: this.options.routedTransport,
|
|
984
987
|
spotRouterChannelIdForMesh: this.options.spotRouterChannelIdForMesh,
|
|
985
|
-
channelMeshNameForChannel: (channelName) =>
|
|
986
|
-
this.options.registration,
|
|
987
|
-
channelName
|
|
988
|
-
),
|
|
988
|
+
channelMeshNameForChannel: (channelName) =>
|
|
989
|
+
resolveChannelMeshName(this.options.registration, channelName),
|
|
989
990
|
timerHandlers: spotNode.entrySpotTimerHandlers,
|
|
990
991
|
packetHandlers: spotNode.entrySpotPacketHandlers,
|
|
991
992
|
subscriptionHandlers: spotNode.entrySpotSubscriptionHandlers,
|
|
@@ -1034,11 +1035,15 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1034
1035
|
): Promise<unknown> {
|
|
1035
1036
|
let activation = this.primaryEntryActivation();
|
|
1036
1037
|
if (activation === undefined) {
|
|
1037
|
-
const candidates =
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1038
|
+
const candidates =
|
|
1039
|
+
this.options.primaryMeshName === undefined
|
|
1040
|
+
? this.options.registration.spotNodes
|
|
1041
|
+
: new Map([
|
|
1042
|
+
[
|
|
1043
|
+
this.options.primaryMeshName,
|
|
1044
|
+
this.options.registration.spotNodes.get(this.options.primaryMeshName)
|
|
1045
|
+
]
|
|
1046
|
+
]);
|
|
1042
1047
|
for (const [spotNodeName, spotNode] of candidates) {
|
|
1043
1048
|
if (spotNode === undefined) {
|
|
1044
1049
|
continue;
|
|
@@ -1054,7 +1059,9 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1054
1059
|
}
|
|
1055
1060
|
}
|
|
1056
1061
|
if (activation === undefined) {
|
|
1057
|
-
throw new ZLinkConfigurationException(
|
|
1062
|
+
throw new ZLinkConfigurationException(
|
|
1063
|
+
'Entry Spot actor packet dispatch requires an Entry Spot.'
|
|
1064
|
+
);
|
|
1058
1065
|
}
|
|
1059
1066
|
return await activation.dispatchActorPacket({
|
|
1060
1067
|
actorId,
|
|
@@ -1114,15 +1121,16 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1114
1121
|
): Promise<ZLinkSubmitResult> {
|
|
1115
1122
|
const parts = runWithOutboundFlow(
|
|
1116
1123
|
this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true,
|
|
1117
|
-
() =>
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1124
|
+
() =>
|
|
1125
|
+
encodeChannelPublishEnvelopeParts(
|
|
1126
|
+
channelName,
|
|
1127
|
+
topic,
|
|
1128
|
+
packetName,
|
|
1129
|
+
event,
|
|
1130
|
+
undefined,
|
|
1131
|
+
this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true,
|
|
1132
|
+
metadata
|
|
1133
|
+
)
|
|
1126
1134
|
);
|
|
1127
1135
|
const processing = publisher.publishAsync(channelName, topic, parts, undefined, undefined);
|
|
1128
1136
|
void Promise.resolve(processing).catch(() => undefined);
|
|
@@ -1137,7 +1145,15 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1137
1145
|
event: Message,
|
|
1138
1146
|
metadata: ReadonlyMap<string, string> = EMPTY_SPOT_METADATA
|
|
1139
1147
|
): ZLinkSubmitResult {
|
|
1140
|
-
return this.publishWithFlags(
|
|
1148
|
+
return this.publishWithFlags(
|
|
1149
|
+
meshName,
|
|
1150
|
+
channelName,
|
|
1151
|
+
topic,
|
|
1152
|
+
packetName,
|
|
1153
|
+
event,
|
|
1154
|
+
ZLINK_SEND_DONT_WAIT,
|
|
1155
|
+
metadata
|
|
1156
|
+
);
|
|
1141
1157
|
}
|
|
1142
1158
|
|
|
1143
1159
|
private publishWithFlags(
|
|
@@ -1158,18 +1174,20 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1158
1174
|
}
|
|
1159
1175
|
const parts = runWithOutboundFlow(
|
|
1160
1176
|
this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true,
|
|
1161
|
-
() =>
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1177
|
+
() =>
|
|
1178
|
+
encodeChannelPublishEnvelopeParts(
|
|
1179
|
+
channelName,
|
|
1180
|
+
topic,
|
|
1181
|
+
packetName,
|
|
1182
|
+
event,
|
|
1183
|
+
undefined,
|
|
1184
|
+
this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true,
|
|
1185
|
+
metadata
|
|
1186
|
+
)
|
|
1170
1187
|
);
|
|
1171
1188
|
try {
|
|
1172
|
-
publisher.publish(channelName, topic, parts, { flags });
|
|
1189
|
+
const processing = publisher.publish(channelName, topic, parts, { flags });
|
|
1190
|
+
void Promise.resolve(processing).catch(() => undefined);
|
|
1173
1191
|
return { status: ZLinkSubmitStatus.Submitted };
|
|
1174
1192
|
} catch (error) {
|
|
1175
1193
|
if (isZLinkBackendResultError(error) && error.operation === 'submit') {
|
|
@@ -1178,7 +1196,6 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1178
1196
|
throw error;
|
|
1179
1197
|
}
|
|
1180
1198
|
}
|
|
1181
|
-
|
|
1182
1199
|
}
|
|
1183
1200
|
|
|
1184
1201
|
function runtimeShutdownError(): ZLinkFrameworkException {
|
|
@@ -1202,7 +1219,9 @@ function resolveChannelMeshName(
|
|
|
1202
1219
|
channelName: string
|
|
1203
1220
|
): string | undefined {
|
|
1204
1221
|
const matches = [...registration.spotNodes.entries()]
|
|
1205
|
-
.filter(([, node]) =>
|
|
1222
|
+
.filter(([, node]) =>
|
|
1223
|
+
Object.prototype.hasOwnProperty.call(node.meshChannels ?? {}, channelName)
|
|
1224
|
+
)
|
|
1206
1225
|
.map(([meshName]) => meshName);
|
|
1207
1226
|
return matches.length === 1 ? matches[0] : undefined;
|
|
1208
1227
|
}
|
|
@@ -1224,7 +1243,9 @@ function mapPublishSubmitStatus(result: number): ZLinkSubmitStatus {
|
|
|
1224
1243
|
case SubmitResult.InvalidHandle:
|
|
1225
1244
|
return ZLinkSubmitStatus.Shutdown;
|
|
1226
1245
|
default:
|
|
1227
|
-
throw new ZLinkConfigurationException(
|
|
1246
|
+
throw new ZLinkConfigurationException(
|
|
1247
|
+
`Logical Multicast failed with submit result '${result}'.`
|
|
1248
|
+
);
|
|
1228
1249
|
}
|
|
1229
1250
|
}
|
|
1230
1251
|
|
|
@@ -1238,9 +1259,7 @@ function requireEntrySpotReply(result: number): void {
|
|
|
1238
1259
|
|
|
1239
1260
|
function requirePublicRuntimeWeight(value: number, label: string): number {
|
|
1240
1261
|
if (!Number.isInteger(value) || value < 0 || value > 10_000) {
|
|
1241
|
-
throw new ZLinkConfigurationException(
|
|
1242
|
-
`${label} must be an integer in 0..10000.`
|
|
1243
|
-
);
|
|
1262
|
+
throw new ZLinkConfigurationException(`${label} must be an integer in 0..10000.`);
|
|
1244
1263
|
}
|
|
1245
1264
|
return value;
|
|
1246
1265
|
}
|
|
@@ -1261,8 +1280,9 @@ function effectiveUserSpotRegistrations(
|
|
|
1261
1280
|
Object.entries(registration.spotFactoryRegistrations ?? {})
|
|
1262
1281
|
);
|
|
1263
1282
|
const explicitImplementations = new Set(
|
|
1264
|
-
Object.values(registration.spotFactoryRegistrations ?? {})
|
|
1265
|
-
|
|
1283
|
+
Object.values(registration.spotFactoryRegistrations ?? {}).map(
|
|
1284
|
+
({ implementation }) => implementation
|
|
1285
|
+
)
|
|
1266
1286
|
);
|
|
1267
1287
|
for (const implementation of registration.spotFactories ?? []) {
|
|
1268
1288
|
// `spotFactories` is also retained as the runtime implementation set.
|
|
@@ -1295,23 +1315,22 @@ function effectiveActorRegistrations(
|
|
|
1295
1315
|
const registrations = new Map<string, DescriptorFactoryRegistration>(
|
|
1296
1316
|
Object.entries(registration.actorFactoryRegistrations ?? {})
|
|
1297
1317
|
);
|
|
1298
|
-
const legacy =
|
|
1299
|
-
|
|
1300
|
-
|
|
1318
|
+
const legacy =
|
|
1319
|
+
registration.actorFactories instanceof Map
|
|
1320
|
+
? registration.actorFactories.keys()
|
|
1321
|
+
: Object.keys(registration.actorFactories ?? {});
|
|
1301
1322
|
for (const stableType of legacy) {
|
|
1302
1323
|
if (!registrations.has(stableType)) registrations.set(stableType, {});
|
|
1303
1324
|
}
|
|
1304
1325
|
return [...registrations];
|
|
1305
1326
|
}
|
|
1306
1327
|
|
|
1307
|
-
function effectiveObjectRole(
|
|
1308
|
-
registration: ZLinkSpotNodeOptions
|
|
1309
|
-
): ZLinkObjectRole {
|
|
1328
|
+
function effectiveObjectRole(registration: ZLinkSpotNodeOptions): ZLinkObjectRole {
|
|
1310
1329
|
if (registration.objectRole === 'server') return ZLinkObjectRole.Server;
|
|
1311
1330
|
if (registration.objectRole === 'client') return ZLinkObjectRole.Client;
|
|
1312
|
-
return effectiveUserSpotRegistrations(registration).length > 0
|
|
1313
|
-
|
|
1314
|
-
|
|
1331
|
+
return effectiveUserSpotRegistrations(registration).length > 0 ||
|
|
1332
|
+
effectiveInstanceSpotRegistrations(registration).length > 0 ||
|
|
1333
|
+
effectiveActorRegistrations(registration).length > 0
|
|
1315
1334
|
? ZLinkObjectRole.Server
|
|
1316
1335
|
: ZLinkObjectRole.None;
|
|
1317
1336
|
}
|
|
@@ -1327,9 +1346,7 @@ function objectCapability(
|
|
|
1327
1346
|
stableType,
|
|
1328
1347
|
policy,
|
|
1329
1348
|
hasSnapshotAdapter: policy === 'snapshot',
|
|
1330
|
-
limit: objectKind === 'actor'
|
|
1331
|
-
? 0
|
|
1332
|
-
: factory.options?.stableTypeLimit ?? 0
|
|
1349
|
+
limit: objectKind === 'actor' ? 0 : (factory.options?.stableTypeLimit ?? 0)
|
|
1333
1350
|
};
|
|
1334
1351
|
}
|
|
1335
1352
|
|
|
@@ -1344,10 +1361,6 @@ function maxBigInt(left: bigint, right: bigint): bigint {
|
|
|
1344
1361
|
return left > right ? left : right;
|
|
1345
1362
|
}
|
|
1346
1363
|
|
|
1347
|
-
function sameOwnerToken(
|
|
1348
|
-
left
|
|
1349
|
-
right: ZLinkLocationOwnerToken
|
|
1350
|
-
): boolean {
|
|
1351
|
-
return left.ownerId === right.ownerId
|
|
1352
|
-
&& left.leaseGeneration === right.leaseGeneration;
|
|
1364
|
+
function sameOwnerToken(left: ZLinkLocationOwnerToken, right: ZLinkLocationOwnerToken): boolean {
|
|
1365
|
+
return left.ownerId === right.ownerId && left.leaseGeneration === right.leaseGeneration;
|
|
1353
1366
|
}
|