@zlink-systems/framework 0.21.0 → 0.22.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/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- 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 +24 -18
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- 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 +158 -124
- 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/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.js +116 -113
- 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 +10 -18
- 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 +43 -33
- 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.js +9 -7
- 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/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +47 -39
- 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 -23
- 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.js +136 -136
- 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-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.js +416 -438
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.js +96 -95
- 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 +244 -227
- 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/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 +208 -219
- 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.js +23 -20
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -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 +74 -85
- 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 +16 -14
- 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 +1 -2
- 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 +5 -5
- package/dist/runtime/spots/spot-timer.js +25 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +98 -107
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +18 -16
- package/dist/runtime/streams/bound-session-service.js +8 -9
- package/dist/runtime/streams/index.js +20 -19
- package/dist/runtime/streams/managed-stream.js +32 -30
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.js +29 -18
- package/dist/runtime/streams/session-actor-coordinator.js +34 -37
- package/dist/runtime/streams/session-context.js +30 -28
- 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.js +11 -5
- package/dist/runtime/streams/stream-session-runtime.js +70 -66
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +2 -2
- 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 +1 -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 +0 -1
- 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 +138 -130
- 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 +5 -4
- 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 +351 -320
- 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 +73 -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 +335 -383
- 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 +40 -42
- 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 +215 -197
- 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 +11 -8
- 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/flow-context.ts +12 -3
- 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 +95 -76
- 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 -51
- 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 +312 -385
- 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 +1 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1174 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +157 -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 +1 -1
- 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 +593 -563
- 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 +184 -153
- package/src/runtime/spots/spot-actor-packet-drain.ts +54 -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 +230 -221
- 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 +128 -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 +11 -17
- 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 +56 -46
- package/src/runtime/spots/spot-timer.ts +98 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +277 -235
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +7 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +53 -51
- package/src/runtime/streams/bound-session-response-target.ts +29 -8
- package/src/runtime/streams/bound-session-service.ts +39 -39
- package/src/runtime/streams/index.ts +176 -100
- package/src/runtime/streams/managed-stream.ts +98 -87
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +73 -43
- package/src/runtime/streams/session-actor-coordinator.ts +97 -89
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +66 -48
- 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 +55 -38
- package/src/runtime/streams/stream-session-runtime.ts +268 -210
- 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,8 +269,7 @@ 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
|
});
|
|
276
275
|
node.setMailboxRecordDroppedHandler?.((record) =>
|
|
@@ -283,7 +282,8 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
283
282
|
error: new Error(
|
|
284
283
|
`MeshNode '${spotNodeName}' no longer accepts ${record.kind} for '${record.owner}'.`
|
|
285
284
|
)
|
|
286
|
-
})
|
|
285
|
+
})
|
|
286
|
+
);
|
|
287
287
|
node.setProtocolErrorHandler?.((record) =>
|
|
288
288
|
this.options.dispatchErrors?.report({
|
|
289
289
|
surface: ZLinkDispatchErrorSurface.RouteMeshChannel,
|
|
@@ -297,10 +297,11 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
297
297
|
channelName: spotNodeName,
|
|
298
298
|
sourceRid: record.sourceNodeRid,
|
|
299
299
|
error: new Error(
|
|
300
|
-
`MeshNode '${spotNodeName}' rejected an invalid service wire record from '${record.sourceNodeRid}'`
|
|
301
|
-
|
|
300
|
+
`MeshNode '${spotNodeName}' rejected an invalid service wire record from '${record.sourceNodeRid}'` +
|
|
301
|
+
(record.command === undefined ? '.' : ` (command ${record.command}).`)
|
|
302
302
|
)
|
|
303
|
-
})
|
|
303
|
+
})
|
|
304
|
+
);
|
|
304
305
|
let pump: ZLinkMeshDispatchPump | undefined;
|
|
305
306
|
const completions = new ZLinkMeshCompletionTable();
|
|
306
307
|
try {
|
|
@@ -313,30 +314,24 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
313
314
|
...Object.keys(spotNode.instanceSpotFactoryRegistrations ?? {}),
|
|
314
315
|
...Object.keys(spotNode.actorFactoryRegistrations ?? {})
|
|
315
316
|
];
|
|
316
|
-
const instanceSpotTypes = Object.keys(
|
|
317
|
-
spotNode.instanceSpotFactoryRegistrations ?? {}
|
|
318
|
-
);
|
|
317
|
+
const instanceSpotTypes = Object.keys(spotNode.instanceSpotFactoryRegistrations ?? {});
|
|
319
318
|
const hasLegacyObjectFactories =
|
|
320
|
-
(spotNode.spotFactories?.length ?? 0) > 0
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
spotNode.actorFactories
|
|
324
|
-
|
|
325
|
-
: Object.keys(spotNode.actorFactories ?? {}).length
|
|
326
|
-
) > 0;
|
|
319
|
+
(spotNode.spotFactories?.length ?? 0) > 0 ||
|
|
320
|
+
Object.keys(spotNode.instanceSpotFactories ?? {}).length > 0 ||
|
|
321
|
+
(spotNode.actorFactories instanceof Map
|
|
322
|
+
? spotNode.actorFactories.size
|
|
323
|
+
: Object.keys(spotNode.actorFactories ?? {}).length) > 0;
|
|
327
324
|
node.configureObjectPlacement({
|
|
328
|
-
role: spotNode.objectRole
|
|
329
|
-
?? (hasLegacyObjectFactories ? 'server' : 'none'),
|
|
325
|
+
role: spotNode.objectRole ?? (hasLegacyObjectFactories ? 'server' : 'none'),
|
|
330
326
|
placementWeight: spotNode.placementWeight ?? 100,
|
|
331
|
-
activeCapacityLimit:
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
),
|
|
327
|
+
activeCapacityLimit: aggregatePlacementCapacity(
|
|
328
|
+
spotNode.actorLimit ?? 0,
|
|
329
|
+
spotNode.spotLimit ?? 0
|
|
330
|
+
),
|
|
336
331
|
pendingCapacityLimit: spotNode.activationConcurrencyLimit ?? 128,
|
|
337
332
|
objectCapabilities: [
|
|
338
|
-
...stableTypes.map(type => `object-type:${type}`),
|
|
339
|
-
...instanceSpotTypes.map(type => `instance-spot-type:${type}`)
|
|
333
|
+
...stableTypes.map((type) => `object-type:${type}`),
|
|
334
|
+
...instanceSpotTypes.map((type) => `instance-spot-type:${type}`)
|
|
340
335
|
],
|
|
341
336
|
...(this.options.registration.maintenanceWave === undefined
|
|
342
337
|
? {}
|
|
@@ -363,17 +358,18 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
363
358
|
pump = new ZLinkMeshDispatchPump(node, {
|
|
364
359
|
applicationJobQueue: this.applicationJobQueue,
|
|
365
360
|
dispatch: (owner, record) => this.dispatchMeshRecord(spotNodeName, owner, record),
|
|
366
|
-
reportError: (error, context) =>
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
361
|
+
reportError: (error, context) =>
|
|
362
|
+
this.options.dispatchErrors?.report({
|
|
363
|
+
surface: ZLinkDispatchErrorSurface.Node,
|
|
364
|
+
messageKind: ZLinkDispatchMessageKind.Control,
|
|
365
|
+
reason: ZLinkDispatchErrorReason.HandlerException,
|
|
366
|
+
action: ZLinkDispatchErrorAction.Drop,
|
|
367
|
+
meshName: spotNodeName,
|
|
368
|
+
packetName: context?.packetName,
|
|
369
|
+
sourceRid: context?.sourceNodeRid,
|
|
370
|
+
commandId: context?.commandId,
|
|
371
|
+
error
|
|
372
|
+
})
|
|
377
373
|
});
|
|
378
374
|
pump.start();
|
|
379
375
|
this.meshNodes.set(spotNodeName, node);
|
|
@@ -401,7 +397,9 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
401
397
|
): Promise<void> {
|
|
402
398
|
const previous = this.statePublication;
|
|
403
399
|
let release!: () => void;
|
|
404
|
-
this.statePublication = new Promise<void>((resolve) => {
|
|
400
|
+
this.statePublication = new Promise<void>((resolve) => {
|
|
401
|
+
release = resolve;
|
|
402
|
+
});
|
|
405
403
|
await previous;
|
|
406
404
|
try {
|
|
407
405
|
await this.publishMeshNodeStateCore(state, signal, selectedMeshName);
|
|
@@ -418,8 +416,8 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
418
416
|
const location = this.locationAutoConnect;
|
|
419
417
|
const owner = location?.runtime.currentOwnerToken;
|
|
420
418
|
if (location === undefined || owner === undefined) return;
|
|
421
|
-
const ownerChanged =
|
|
422
|
-
&& !sameOwnerToken(this.publishedOwnerToken, owner);
|
|
419
|
+
const ownerChanged =
|
|
420
|
+
this.publishedOwnerToken !== undefined && !sameOwnerToken(this.publishedOwnerToken, owner);
|
|
423
421
|
if (ownerChanged) {
|
|
424
422
|
// A new owner token can refer to an empty or replaced Store. The cached
|
|
425
423
|
// descriptor was written under the previous lease and must not force a
|
|
@@ -436,16 +434,15 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
436
434
|
const actors = effectiveActorRegistrations(registration);
|
|
437
435
|
const capabilities = [
|
|
438
436
|
...userSpots.map(([stableType, factory]) =>
|
|
439
|
-
objectCapability('user_spot', stableType, factory)
|
|
437
|
+
objectCapability('user_spot', stableType, factory)
|
|
438
|
+
),
|
|
440
439
|
...instanceSpots.map(([stableType, factory]) =>
|
|
441
|
-
objectCapability('instance_spot', stableType, factory)
|
|
442
|
-
|
|
443
|
-
|
|
440
|
+
objectCapability('instance_spot', stableType, factory)
|
|
441
|
+
),
|
|
442
|
+
...actors.map(([stableType, factory]) => objectCapability('actor', stableType, factory))
|
|
444
443
|
].sort((left, right) => {
|
|
445
444
|
const kindOrder = left.objectKind.localeCompare(right.objectKind);
|
|
446
|
-
return kindOrder !== 0
|
|
447
|
-
? kindOrder
|
|
448
|
-
: left.stableType.localeCompare(right.stableType);
|
|
445
|
+
return kindOrder !== 0 ? kindOrder : left.stableType.localeCompare(right.stableType);
|
|
449
446
|
});
|
|
450
447
|
const current = this.publishedMeshNodeDescriptors.get(meshName);
|
|
451
448
|
const previousRevision = this.descriptorRevisionByMesh.get(meshName) ?? 0n;
|
|
@@ -472,11 +469,13 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
472
469
|
limit: registration.spotLimit ?? 0
|
|
473
470
|
},
|
|
474
471
|
spotTypes: capabilities
|
|
475
|
-
.filter(capability => capability.objectKind !== 'actor')
|
|
476
|
-
.map(capability => {
|
|
477
|
-
const previous = current?.populationCapacity.spotTypes.find(
|
|
478
|
-
candidate
|
|
479
|
-
|
|
472
|
+
.filter((capability) => capability.objectKind !== 'actor')
|
|
473
|
+
.map((capability) => {
|
|
474
|
+
const previous = current?.populationCapacity.spotTypes.find(
|
|
475
|
+
(candidate) =>
|
|
476
|
+
candidate.objectKind === capability.objectKind &&
|
|
477
|
+
candidate.stableType === capability.stableType
|
|
478
|
+
);
|
|
480
479
|
return {
|
|
481
480
|
objectKind: capability.objectKind as 'user_spot' | 'instance_spot',
|
|
482
481
|
stableType: capability.stableType,
|
|
@@ -487,35 +486,33 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
487
486
|
})
|
|
488
487
|
},
|
|
489
488
|
activationConcurrency: {
|
|
490
|
-
active:
|
|
491
|
-
|
|
492
|
-
??
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
??
|
|
489
|
+
active:
|
|
490
|
+
this.options.instanceActivationConcurrencyProvider?.(meshName).active ??
|
|
491
|
+
current?.activationConcurrency.active ??
|
|
492
|
+
0,
|
|
493
|
+
limit:
|
|
494
|
+
this.options.instanceActivationConcurrencyProvider?.(meshName).limit ??
|
|
495
|
+
registration.activationConcurrencyLimit ??
|
|
496
|
+
128
|
|
496
497
|
},
|
|
497
498
|
channelWeights: Object.fromEntries(
|
|
498
|
-
this.serverChannels(meshName)
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
])
|
|
499
|
+
this.serverChannels(meshName).map(([channelName, channel]) => [
|
|
500
|
+
channelName,
|
|
501
|
+
state === ZLinkFrameworkRuntimeState.Draining
|
|
502
|
+
? 0
|
|
503
|
+
: this.effectiveChannelWeight(meshName, channelName, channel.weight ?? 100)
|
|
504
|
+
])
|
|
505
505
|
),
|
|
506
506
|
applicationVersion: this.options.registration.applicationVersion,
|
|
507
507
|
maintenanceWave: this.options.registration.maintenanceWave,
|
|
508
508
|
spotTypes: [
|
|
509
509
|
...userSpots.map(([stableType]) => stableType),
|
|
510
510
|
...instanceSpots.map(([stableType]) => stableType),
|
|
511
|
-
...(registration.entrySpotType === undefined
|
|
512
|
-
|
|
513
|
-
: [registration.entrySpotType.name])
|
|
514
|
-
]
|
|
515
|
-
.sort(),
|
|
511
|
+
...(registration.entrySpotType === undefined ? [] : [registration.entrySpotType.name])
|
|
512
|
+
].sort(),
|
|
516
513
|
objectCapabilities: capabilities,
|
|
517
514
|
state,
|
|
518
|
-
securityIdentity: 'default'
|
|
515
|
+
securityIdentity: 'default'
|
|
519
516
|
};
|
|
520
517
|
const result = await location.runtime.writeMeshNode(
|
|
521
518
|
descriptor,
|
|
@@ -553,12 +550,13 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
553
550
|
const status = node.status();
|
|
554
551
|
const owner = location.runtime.currentOwnerToken;
|
|
555
552
|
if (owner === undefined) return;
|
|
556
|
-
const current = (await location.runtime.listLiveMeshNodes(meshName, signal))
|
|
557
|
-
|
|
558
|
-
String(descriptor.rid) === String(status.routingId)
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
553
|
+
const current = (await location.runtime.listLiveMeshNodes(meshName, signal)).find(
|
|
554
|
+
(descriptor) =>
|
|
555
|
+
String(descriptor.rid) === String(status.routingId) &&
|
|
556
|
+
descriptor.lifecycleGeneration === status.lifecycleGeneration &&
|
|
557
|
+
descriptor.ownerId === owner.ownerId &&
|
|
558
|
+
descriptor.leaseGeneration === owner.leaseGeneration
|
|
559
|
+
);
|
|
562
560
|
if (current !== undefined) {
|
|
563
561
|
this.publishedMeshNodeDescriptors.set(meshName, current);
|
|
564
562
|
this.descriptorRevisionByMesh.set(
|
|
@@ -570,10 +568,7 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
570
568
|
await this.publishMeshNodeState(state, signal, meshName);
|
|
571
569
|
}
|
|
572
570
|
|
|
573
|
-
private entrySpotId(
|
|
574
|
-
meshName: string,
|
|
575
|
-
registration: ZLinkSpotNodeOptions
|
|
576
|
-
): string | undefined {
|
|
571
|
+
private entrySpotId(meshName: string, registration: ZLinkSpotNodeOptions): string | undefined {
|
|
577
572
|
if (effectiveObjectRole(registration) !== ZLinkObjectRole.Server) {
|
|
578
573
|
return undefined;
|
|
579
574
|
}
|
|
@@ -608,9 +603,7 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
608
603
|
|
|
609
604
|
entrySpotIdForMesh(meshName: string): string | undefined {
|
|
610
605
|
const registration = this.options.registration.spotNodes.get(meshName);
|
|
611
|
-
return registration === undefined
|
|
612
|
-
? undefined
|
|
613
|
-
: this.entrySpotId(meshName, registration);
|
|
606
|
+
return registration === undefined ? undefined : this.entrySpotId(meshName, registration);
|
|
614
607
|
}
|
|
615
608
|
|
|
616
609
|
meshNodeDescriptor(meshName: string): ZLinkMeshNodeDescriptor | undefined {
|
|
@@ -622,9 +615,7 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
622
615
|
if (registration === undefined) {
|
|
623
616
|
throw new ZLinkConfigurationException(`Mesh '${meshName}' is not registered.`);
|
|
624
617
|
}
|
|
625
|
-
return this.runtimePlacementWeights.get(meshName)
|
|
626
|
-
?? registration.placementWeight
|
|
627
|
-
?? 100;
|
|
618
|
+
return this.runtimePlacementWeights.get(meshName) ?? registration.placementWeight ?? 100;
|
|
628
619
|
}
|
|
629
620
|
|
|
630
621
|
channelWeight(channelName: string): number {
|
|
@@ -656,7 +647,10 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
656
647
|
);
|
|
657
648
|
}
|
|
658
649
|
const validated = requirePublicRuntimeWeight(weight, 'Channel weight');
|
|
659
|
-
if (
|
|
650
|
+
if (
|
|
651
|
+
this.effectiveChannelWeight(match.meshName, channelName, match.configuredWeight) === validated
|
|
652
|
+
)
|
|
653
|
+
return;
|
|
660
654
|
let weights = this.runtimeChannelWeights.get(match.meshName);
|
|
661
655
|
if (weights === undefined) {
|
|
662
656
|
weights = new Map();
|
|
@@ -694,15 +688,14 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
694
688
|
readonly meshName: string;
|
|
695
689
|
readonly configuredWeight: number;
|
|
696
690
|
} {
|
|
697
|
-
const matches = [...this.options.registration.spotNodes]
|
|
698
|
-
.
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
? []
|
|
702
|
-
: [{ meshName, configuredWeight: channel.weight ?? 100 }];
|
|
703
|
-
});
|
|
691
|
+
const matches = [...this.options.registration.spotNodes].flatMap(([meshName, registration]) => {
|
|
692
|
+
const channel = registration.meshChannels?.[channelName];
|
|
693
|
+
return channel === undefined ? [] : [{ meshName, configuredWeight: channel.weight ?? 100 }];
|
|
694
|
+
});
|
|
704
695
|
if (matches.length === 0) {
|
|
705
|
-
throw new ZLinkConfigurationException(
|
|
696
|
+
throw new ZLinkConfigurationException(
|
|
697
|
+
`RouteMesh channel '${channelName}' is not registered.`
|
|
698
|
+
);
|
|
706
699
|
}
|
|
707
700
|
if (matches.length > 1) {
|
|
708
701
|
throw new ZLinkConfigurationException(
|
|
@@ -716,12 +709,15 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
716
709
|
meshName: string,
|
|
717
710
|
applyWeight: () => Promise<void>
|
|
718
711
|
): void {
|
|
719
|
-
const publish = this.runtimeWeightPublication
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
712
|
+
const publish = this.runtimeWeightPublication
|
|
713
|
+
.catch(() => undefined)
|
|
714
|
+
.then(async () => {
|
|
715
|
+
await applyWeight();
|
|
716
|
+
const state =
|
|
717
|
+
this.publishedMeshNodeDescriptors.get(meshName)?.state ??
|
|
718
|
+
ZLinkFrameworkRuntimeState.Serving;
|
|
719
|
+
await this.publishMeshNodeState(state, undefined, meshName);
|
|
720
|
+
});
|
|
725
721
|
this.runtimeWeightPublication = publish;
|
|
726
722
|
if (this.options.detachedTaskRunner !== undefined) {
|
|
727
723
|
this.options.detachedTaskRunner.runDetached(
|
|
@@ -744,13 +740,14 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
744
740
|
createRequest: ZLinkMessage,
|
|
745
741
|
signal?: AbortSignal
|
|
746
742
|
): Promise<import('../../contracts').ZLinkActorCreateResponse | undefined> {
|
|
747
|
-
let activation = [...this.entryActivations.values()].find(
|
|
748
|
-
|
|
743
|
+
let activation = [...this.entryActivations.values()].find((entryActivation) =>
|
|
744
|
+
routingIdsEqual(entryActivation.nodeRid, nodeRid)
|
|
749
745
|
);
|
|
750
746
|
if (activation === undefined) {
|
|
751
747
|
for (const [meshName, node] of this.meshNodes) {
|
|
752
748
|
if (!routingIdsEqual(node.status().routingId, nodeRid)) continue;
|
|
753
|
-
if (this.options.registration.spotNodes.get(meshName)?.entrySpotType === undefined)
|
|
749
|
+
if (this.options.registration.spotNodes.get(meshName)?.entrySpotType === undefined)
|
|
750
|
+
continue;
|
|
754
751
|
await this.ensureEntryActivation(meshName);
|
|
755
752
|
activation = this.entryActivations.get(meshName);
|
|
756
753
|
break;
|
|
@@ -759,10 +756,7 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
759
756
|
return activation?.notifyCreateActor(actor, createRequest, signal);
|
|
760
757
|
}
|
|
761
758
|
|
|
762
|
-
notifyPrimaryEntrySpotActorJoined(
|
|
763
|
-
actor: ZLinkActor,
|
|
764
|
-
signal?: AbortSignal
|
|
765
|
-
): Promise<void> {
|
|
759
|
+
notifyPrimaryEntrySpotActorJoined(actor: ZLinkActor, signal?: AbortSignal): Promise<void> {
|
|
766
760
|
const activation = this.primaryEntryActivation();
|
|
767
761
|
return activation?.notifyJoinActor(actor, signal) ?? Promise.resolve();
|
|
768
762
|
}
|
|
@@ -774,13 +768,12 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
774
768
|
membershipEpoch?: bigint
|
|
775
769
|
): Promise<void> {
|
|
776
770
|
const activation = this.primaryEntryActivation();
|
|
777
|
-
return
|
|
771
|
+
return (
|
|
772
|
+
activation?.notifyLeaveActor(actor, signal, actorRef, membershipEpoch) ?? Promise.resolve()
|
|
773
|
+
);
|
|
778
774
|
}
|
|
779
775
|
|
|
780
|
-
notifyPrimaryEntrySpotActorDisconnected(
|
|
781
|
-
actor: ZLinkActor,
|
|
782
|
-
signal?: AbortSignal
|
|
783
|
-
): Promise<void> {
|
|
776
|
+
notifyPrimaryEntrySpotActorDisconnected(actor: ZLinkActor, signal?: AbortSignal): Promise<void> {
|
|
784
777
|
const activation = this.primaryEntryActivation();
|
|
785
778
|
return activation?.notifyDisconnectActor(actor, signal) ?? Promise.resolve();
|
|
786
779
|
}
|
|
@@ -795,8 +788,9 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
795
788
|
}
|
|
796
789
|
|
|
797
790
|
serverChannels(meshName: string) {
|
|
798
|
-
return Object.entries(
|
|
799
|
-
.
|
|
791
|
+
return Object.entries(
|
|
792
|
+
this.options.registration.spotNodes.get(meshName)?.meshChannels ?? {}
|
|
793
|
+
).filter(([, channel]) => channel.server === true);
|
|
800
794
|
}
|
|
801
795
|
|
|
802
796
|
async dispose(signal?: AbortSignal, deadline?: Date): Promise<void> {
|
|
@@ -814,18 +808,22 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
814
808
|
const errors: unknown[] = [];
|
|
815
809
|
const settle = async (operations: readonly Promise<unknown>[]) => {
|
|
816
810
|
const results = await Promise.allSettled(operations);
|
|
817
|
-
errors.push(
|
|
818
|
-
|
|
819
|
-
|
|
811
|
+
errors.push(
|
|
812
|
+
...results
|
|
813
|
+
.filter((result): result is PromiseRejectedResult => result.status === 'rejected')
|
|
814
|
+
.map((result) => result.reason)
|
|
815
|
+
);
|
|
820
816
|
};
|
|
821
817
|
await settle(publishers.map(async (publisher) => publisher.close()));
|
|
822
818
|
await settle(autoConnectLoops.map((loop) => loop.prepareTransportShutdown()));
|
|
823
819
|
await settle(entryActivations.reverse().map((activation) => activation.dispose(deadline)));
|
|
824
820
|
await settle(meshPumps.reverse().map((pump) => pump.dispose()));
|
|
825
|
-
await settle(
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
821
|
+
await settle(
|
|
822
|
+
meshNodes.reverse().map(async (node) => {
|
|
823
|
+
node.shutdown(1000);
|
|
824
|
+
node.close();
|
|
825
|
+
})
|
|
826
|
+
);
|
|
829
827
|
for (const completions of meshCompletions) {
|
|
830
828
|
completions.dispose();
|
|
831
829
|
}
|
|
@@ -853,18 +851,18 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
853
851
|
return;
|
|
854
852
|
}
|
|
855
853
|
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
|
-
)
|
|
854
|
+
const targetsEntrySpot =
|
|
855
|
+
owner.spotId === null ||
|
|
856
|
+
(node !== undefined &&
|
|
857
|
+
routingIdsEqual(owner.spotId as unknown as RoutingId, String(node.status().routingId)));
|
|
858
|
+
if (
|
|
859
|
+
targetsEntrySpot &&
|
|
860
|
+
(record.kind === ReceiveKind.ActorSend ||
|
|
861
|
+
record.kind === ReceiveKind.ActorRequest ||
|
|
862
|
+
record.kind === ReceiveKind.SpotSend ||
|
|
863
|
+
record.kind === ReceiveKind.SpotRequest ||
|
|
864
|
+
record.kind === ReceiveKind.SpotMulticast)
|
|
865
|
+
) {
|
|
868
866
|
await this.ensureEntryActivation(meshName);
|
|
869
867
|
}
|
|
870
868
|
const dispatcher = this.options.meshRecordDispatcher;
|
|
@@ -881,23 +879,23 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
881
879
|
owner: ReadyRecord,
|
|
882
880
|
record: ReceiveRecord
|
|
883
881
|
): Promise<boolean> {
|
|
884
|
-
if (
|
|
885
|
-
|
|
886
|
-
|
|
882
|
+
if (
|
|
883
|
+
record.kind !== ReceiveKind.SpotSend &&
|
|
884
|
+
record.kind !== ReceiveKind.SpotRequest &&
|
|
885
|
+
record.kind !== ReceiveKind.SpotMulticast
|
|
886
|
+
) {
|
|
887
887
|
return false;
|
|
888
888
|
}
|
|
889
889
|
await this.ensureEntryActivation(meshName);
|
|
890
890
|
const activation = this.entryActivations.get(meshName);
|
|
891
|
-
if (
|
|
892
|
-
activation === undefined
|
|
893
|
-
|| owner.spotId === null
|
|
894
|
-
|| activation.spotId !== owner.spotId
|
|
895
|
-
) {
|
|
891
|
+
if (activation === undefined || owner.spotId === null || activation.spotId !== owner.spotId) {
|
|
896
892
|
return false;
|
|
897
893
|
}
|
|
898
894
|
if (record.kind === ReceiveKind.SpotMulticast) {
|
|
899
895
|
if (record.topic === null || record.topic.length === 0) {
|
|
900
|
-
throw new ZLinkConfigurationException(
|
|
896
|
+
throw new ZLinkConfigurationException(
|
|
897
|
+
'MeshNode Entry Spot multicast record is missing its topic.'
|
|
898
|
+
);
|
|
901
899
|
}
|
|
902
900
|
await activation.dispatchSubscriptionRecord(
|
|
903
901
|
record.topic,
|
|
@@ -928,7 +926,9 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
928
926
|
context,
|
|
929
927
|
true
|
|
930
928
|
);
|
|
931
|
-
requireEntrySpotReply(
|
|
929
|
+
requireEntrySpotReply(
|
|
930
|
+
record.reply(encodeChannelReplyParts(envelope.header, response, codecs))
|
|
931
|
+
);
|
|
932
932
|
} catch (error) {
|
|
933
933
|
requireEntrySpotReply(record.reply(encodeChannelErrorReplyParts(envelope.header, error)));
|
|
934
934
|
}
|
|
@@ -982,10 +982,8 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
982
982
|
spotPublisherClient: this.options.spotPublisherClient,
|
|
983
983
|
routedTransport: this.options.routedTransport,
|
|
984
984
|
spotRouterChannelIdForMesh: this.options.spotRouterChannelIdForMesh,
|
|
985
|
-
channelMeshNameForChannel: (channelName) =>
|
|
986
|
-
this.options.registration,
|
|
987
|
-
channelName
|
|
988
|
-
),
|
|
985
|
+
channelMeshNameForChannel: (channelName) =>
|
|
986
|
+
resolveChannelMeshName(this.options.registration, channelName),
|
|
989
987
|
timerHandlers: spotNode.entrySpotTimerHandlers,
|
|
990
988
|
packetHandlers: spotNode.entrySpotPacketHandlers,
|
|
991
989
|
subscriptionHandlers: spotNode.entrySpotSubscriptionHandlers,
|
|
@@ -1034,11 +1032,15 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1034
1032
|
): Promise<unknown> {
|
|
1035
1033
|
let activation = this.primaryEntryActivation();
|
|
1036
1034
|
if (activation === undefined) {
|
|
1037
|
-
const candidates =
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1035
|
+
const candidates =
|
|
1036
|
+
this.options.primaryMeshName === undefined
|
|
1037
|
+
? this.options.registration.spotNodes
|
|
1038
|
+
: new Map([
|
|
1039
|
+
[
|
|
1040
|
+
this.options.primaryMeshName,
|
|
1041
|
+
this.options.registration.spotNodes.get(this.options.primaryMeshName)
|
|
1042
|
+
]
|
|
1043
|
+
]);
|
|
1042
1044
|
for (const [spotNodeName, spotNode] of candidates) {
|
|
1043
1045
|
if (spotNode === undefined) {
|
|
1044
1046
|
continue;
|
|
@@ -1054,7 +1056,9 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1054
1056
|
}
|
|
1055
1057
|
}
|
|
1056
1058
|
if (activation === undefined) {
|
|
1057
|
-
throw new ZLinkConfigurationException(
|
|
1059
|
+
throw new ZLinkConfigurationException(
|
|
1060
|
+
'Entry Spot actor packet dispatch requires an Entry Spot.'
|
|
1061
|
+
);
|
|
1058
1062
|
}
|
|
1059
1063
|
return await activation.dispatchActorPacket({
|
|
1060
1064
|
actorId,
|
|
@@ -1114,15 +1118,16 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1114
1118
|
): Promise<ZLinkSubmitResult> {
|
|
1115
1119
|
const parts = runWithOutboundFlow(
|
|
1116
1120
|
this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true,
|
|
1117
|
-
() =>
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1121
|
+
() =>
|
|
1122
|
+
encodeChannelPublishEnvelopeParts(
|
|
1123
|
+
channelName,
|
|
1124
|
+
topic,
|
|
1125
|
+
packetName,
|
|
1126
|
+
event,
|
|
1127
|
+
undefined,
|
|
1128
|
+
this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true,
|
|
1129
|
+
metadata
|
|
1130
|
+
)
|
|
1126
1131
|
);
|
|
1127
1132
|
const processing = publisher.publishAsync(channelName, topic, parts, undefined, undefined);
|
|
1128
1133
|
void Promise.resolve(processing).catch(() => undefined);
|
|
@@ -1137,7 +1142,15 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1137
1142
|
event: Message,
|
|
1138
1143
|
metadata: ReadonlyMap<string, string> = EMPTY_SPOT_METADATA
|
|
1139
1144
|
): ZLinkSubmitResult {
|
|
1140
|
-
return this.publishWithFlags(
|
|
1145
|
+
return this.publishWithFlags(
|
|
1146
|
+
meshName,
|
|
1147
|
+
channelName,
|
|
1148
|
+
topic,
|
|
1149
|
+
packetName,
|
|
1150
|
+
event,
|
|
1151
|
+
ZLINK_SEND_DONT_WAIT,
|
|
1152
|
+
metadata
|
|
1153
|
+
);
|
|
1141
1154
|
}
|
|
1142
1155
|
|
|
1143
1156
|
private publishWithFlags(
|
|
@@ -1158,15 +1171,16 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1158
1171
|
}
|
|
1159
1172
|
const parts = runWithOutboundFlow(
|
|
1160
1173
|
this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true,
|
|
1161
|
-
() =>
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1174
|
+
() =>
|
|
1175
|
+
encodeChannelPublishEnvelopeParts(
|
|
1176
|
+
channelName,
|
|
1177
|
+
topic,
|
|
1178
|
+
packetName,
|
|
1179
|
+
event,
|
|
1180
|
+
undefined,
|
|
1181
|
+
this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true,
|
|
1182
|
+
metadata
|
|
1183
|
+
)
|
|
1170
1184
|
);
|
|
1171
1185
|
try {
|
|
1172
1186
|
publisher.publish(channelName, topic, parts, { flags });
|
|
@@ -1178,7 +1192,6 @@ export class ZLinkSpotNodeRuntimeManager {
|
|
|
1178
1192
|
throw error;
|
|
1179
1193
|
}
|
|
1180
1194
|
}
|
|
1181
|
-
|
|
1182
1195
|
}
|
|
1183
1196
|
|
|
1184
1197
|
function runtimeShutdownError(): ZLinkFrameworkException {
|
|
@@ -1202,7 +1215,9 @@ function resolveChannelMeshName(
|
|
|
1202
1215
|
channelName: string
|
|
1203
1216
|
): string | undefined {
|
|
1204
1217
|
const matches = [...registration.spotNodes.entries()]
|
|
1205
|
-
.filter(([, node]) =>
|
|
1218
|
+
.filter(([, node]) =>
|
|
1219
|
+
Object.prototype.hasOwnProperty.call(node.meshChannels ?? {}, channelName)
|
|
1220
|
+
)
|
|
1206
1221
|
.map(([meshName]) => meshName);
|
|
1207
1222
|
return matches.length === 1 ? matches[0] : undefined;
|
|
1208
1223
|
}
|
|
@@ -1224,7 +1239,9 @@ function mapPublishSubmitStatus(result: number): ZLinkSubmitStatus {
|
|
|
1224
1239
|
case SubmitResult.InvalidHandle:
|
|
1225
1240
|
return ZLinkSubmitStatus.Shutdown;
|
|
1226
1241
|
default:
|
|
1227
|
-
throw new ZLinkConfigurationException(
|
|
1242
|
+
throw new ZLinkConfigurationException(
|
|
1243
|
+
`Logical Multicast failed with submit result '${result}'.`
|
|
1244
|
+
);
|
|
1228
1245
|
}
|
|
1229
1246
|
}
|
|
1230
1247
|
|
|
@@ -1238,9 +1255,7 @@ function requireEntrySpotReply(result: number): void {
|
|
|
1238
1255
|
|
|
1239
1256
|
function requirePublicRuntimeWeight(value: number, label: string): number {
|
|
1240
1257
|
if (!Number.isInteger(value) || value < 0 || value > 10_000) {
|
|
1241
|
-
throw new ZLinkConfigurationException(
|
|
1242
|
-
`${label} must be an integer in 0..10000.`
|
|
1243
|
-
);
|
|
1258
|
+
throw new ZLinkConfigurationException(`${label} must be an integer in 0..10000.`);
|
|
1244
1259
|
}
|
|
1245
1260
|
return value;
|
|
1246
1261
|
}
|
|
@@ -1261,8 +1276,9 @@ function effectiveUserSpotRegistrations(
|
|
|
1261
1276
|
Object.entries(registration.spotFactoryRegistrations ?? {})
|
|
1262
1277
|
);
|
|
1263
1278
|
const explicitImplementations = new Set(
|
|
1264
|
-
Object.values(registration.spotFactoryRegistrations ?? {})
|
|
1265
|
-
|
|
1279
|
+
Object.values(registration.spotFactoryRegistrations ?? {}).map(
|
|
1280
|
+
({ implementation }) => implementation
|
|
1281
|
+
)
|
|
1266
1282
|
);
|
|
1267
1283
|
for (const implementation of registration.spotFactories ?? []) {
|
|
1268
1284
|
// `spotFactories` is also retained as the runtime implementation set.
|
|
@@ -1295,23 +1311,22 @@ function effectiveActorRegistrations(
|
|
|
1295
1311
|
const registrations = new Map<string, DescriptorFactoryRegistration>(
|
|
1296
1312
|
Object.entries(registration.actorFactoryRegistrations ?? {})
|
|
1297
1313
|
);
|
|
1298
|
-
const legacy =
|
|
1299
|
-
|
|
1300
|
-
|
|
1314
|
+
const legacy =
|
|
1315
|
+
registration.actorFactories instanceof Map
|
|
1316
|
+
? registration.actorFactories.keys()
|
|
1317
|
+
: Object.keys(registration.actorFactories ?? {});
|
|
1301
1318
|
for (const stableType of legacy) {
|
|
1302
1319
|
if (!registrations.has(stableType)) registrations.set(stableType, {});
|
|
1303
1320
|
}
|
|
1304
1321
|
return [...registrations];
|
|
1305
1322
|
}
|
|
1306
1323
|
|
|
1307
|
-
function effectiveObjectRole(
|
|
1308
|
-
registration: ZLinkSpotNodeOptions
|
|
1309
|
-
): ZLinkObjectRole {
|
|
1324
|
+
function effectiveObjectRole(registration: ZLinkSpotNodeOptions): ZLinkObjectRole {
|
|
1310
1325
|
if (registration.objectRole === 'server') return ZLinkObjectRole.Server;
|
|
1311
1326
|
if (registration.objectRole === 'client') return ZLinkObjectRole.Client;
|
|
1312
|
-
return effectiveUserSpotRegistrations(registration).length > 0
|
|
1313
|
-
|
|
1314
|
-
|
|
1327
|
+
return effectiveUserSpotRegistrations(registration).length > 0 ||
|
|
1328
|
+
effectiveInstanceSpotRegistrations(registration).length > 0 ||
|
|
1329
|
+
effectiveActorRegistrations(registration).length > 0
|
|
1315
1330
|
? ZLinkObjectRole.Server
|
|
1316
1331
|
: ZLinkObjectRole.None;
|
|
1317
1332
|
}
|
|
@@ -1327,9 +1342,7 @@ function objectCapability(
|
|
|
1327
1342
|
stableType,
|
|
1328
1343
|
policy,
|
|
1329
1344
|
hasSnapshotAdapter: policy === 'snapshot',
|
|
1330
|
-
limit: objectKind === 'actor'
|
|
1331
|
-
? 0
|
|
1332
|
-
: factory.options?.stableTypeLimit ?? 0
|
|
1345
|
+
limit: objectKind === 'actor' ? 0 : (factory.options?.stableTypeLimit ?? 0)
|
|
1333
1346
|
};
|
|
1334
1347
|
}
|
|
1335
1348
|
|
|
@@ -1344,10 +1357,6 @@ function maxBigInt(left: bigint, right: bigint): bigint {
|
|
|
1344
1357
|
return left > right ? left : right;
|
|
1345
1358
|
}
|
|
1346
1359
|
|
|
1347
|
-
function sameOwnerToken(
|
|
1348
|
-
left
|
|
1349
|
-
right: ZLinkLocationOwnerToken
|
|
1350
|
-
): boolean {
|
|
1351
|
-
return left.ownerId === right.ownerId
|
|
1352
|
-
&& left.leaseGeneration === right.leaseGeneration;
|
|
1360
|
+
function sameOwnerToken(left: ZLinkLocationOwnerToken, right: ZLinkLocationOwnerToken): boolean {
|
|
1361
|
+
return left.ownerId === right.ownerId && left.leaseGeneration === right.leaseGeneration;
|
|
1353
1362
|
}
|