@zlink-systems/framework 0.20.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
|
@@ -70,12 +70,8 @@ import {
|
|
|
70
70
|
type ServiceStatefulPendingOperation,
|
|
71
71
|
type ServiceStatefulResult
|
|
72
72
|
} from '../../foundation/service-stateful-runtime';
|
|
73
|
-
import type {
|
|
74
|
-
|
|
75
|
-
ServiceSpotState
|
|
76
|
-
} from '../../foundation/service-stateful-registry';
|
|
77
|
-
import { serviceSessionBindingIngressPortIfRegistered } from
|
|
78
|
-
'../../foundation/service-session-binding-ingress-port';
|
|
73
|
+
import type { ServiceActorRef, ServiceSpotState } from '../../foundation/service-stateful-registry';
|
|
74
|
+
import { serviceSessionBindingIngressPortIfRegistered } from '../../foundation/service-session-binding-ingress-port';
|
|
79
75
|
import type {
|
|
80
76
|
ServiceActorCreateRecord,
|
|
81
77
|
ServiceDirectSpotRouteFence,
|
|
@@ -87,9 +83,7 @@ import type {
|
|
|
87
83
|
ServiceUserSpotCreateRecord
|
|
88
84
|
} from '../../foundation/service-stateful-wire-codec';
|
|
89
85
|
import { encodeServiceMetadataFrame } from '../../foundation/service-metadata-codec';
|
|
90
|
-
import type {
|
|
91
|
-
ServiceInstanceActivationRecoveryEnvelope
|
|
92
|
-
} from '../../foundation/service-instance-activation-recovery-codec';
|
|
86
|
+
import type { ServiceInstanceActivationRecoveryEnvelope } from '../../foundation/service-instance-activation-recovery-codec';
|
|
93
87
|
import type {
|
|
94
88
|
ServiceMailboxClaim,
|
|
95
89
|
ServiceMailboxDomain,
|
|
@@ -101,8 +95,7 @@ import type {
|
|
|
101
95
|
} from '../../foundation/service-topology-registry';
|
|
102
96
|
import type { RoutingId } from '../../../contracts';
|
|
103
97
|
import { buildAdvertisedEndpoint } from '../../../contracts/Configuration/EndpointNotation';
|
|
104
|
-
import { ZLinkConfigurationException } from
|
|
105
|
-
'../../../contracts/Configuration/ConfigurationException';
|
|
98
|
+
import { ZLinkConfigurationException } from '../../../contracts/Configuration/ConfigurationException';
|
|
106
99
|
import type {
|
|
107
100
|
ZLinkBackendActorRef,
|
|
108
101
|
ZLinkBackendActorSessionSendFence,
|
|
@@ -135,11 +128,14 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
135
128
|
readonly nativeInstance = this;
|
|
136
129
|
|
|
137
130
|
private readonly channels = new Map<string, number>();
|
|
138
|
-
private readonly peerIntents = new Map<
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
131
|
+
private readonly peerIntents = new Map<
|
|
132
|
+
bigint,
|
|
133
|
+
{
|
|
134
|
+
readonly endpoint: string;
|
|
135
|
+
readonly nodeRoutingId?: string;
|
|
136
|
+
readonly lifecycleGeneration?: bigint;
|
|
137
|
+
}
|
|
138
|
+
>();
|
|
143
139
|
private readonly completions: Array<PendingCompletion | undefined> = [];
|
|
144
140
|
private completionHead = 0;
|
|
145
141
|
private completionCount = 0;
|
|
@@ -209,10 +205,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
209
205
|
}): void {
|
|
210
206
|
this.requireNotStarted();
|
|
211
207
|
this.objectRole = options.role;
|
|
212
|
-
this.placementWeight = requirePublicWeight(
|
|
213
|
-
options.placementWeight,
|
|
214
|
-
'placementWeight'
|
|
215
|
-
);
|
|
208
|
+
this.placementWeight = requirePublicWeight(options.placementWeight, 'placementWeight');
|
|
216
209
|
this.activeCapacityLimit = requirePositivePlacementValue(
|
|
217
210
|
options.activeCapacityLimit,
|
|
218
211
|
'activeCapacityLimit'
|
|
@@ -225,20 +218,24 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
225
218
|
this.maintenanceWave = options.maintenanceWave;
|
|
226
219
|
}
|
|
227
220
|
|
|
228
|
-
setMailboxRecordDroppedHandler(
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
221
|
+
setMailboxRecordDroppedHandler(
|
|
222
|
+
handler: (record: {
|
|
223
|
+
readonly kind: 'spot_multicast' | 'actor_control' | 'actor_binding';
|
|
224
|
+
readonly owner: string;
|
|
225
|
+
}) => void
|
|
226
|
+
): void {
|
|
232
227
|
this.mailboxRecordDropped = handler;
|
|
233
228
|
this.stateful?.setMailboxDropHandler(handler);
|
|
234
229
|
}
|
|
235
230
|
|
|
236
|
-
setProtocolErrorHandler(
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
231
|
+
setProtocolErrorHandler(
|
|
232
|
+
handler: (record: {
|
|
233
|
+
readonly sourceNodeRid: string;
|
|
234
|
+
readonly request: boolean;
|
|
235
|
+
readonly replied: boolean;
|
|
236
|
+
readonly command?: number;
|
|
237
|
+
}) => void
|
|
238
|
+
): void {
|
|
242
239
|
this.protocolError = handler;
|
|
243
240
|
}
|
|
244
241
|
|
|
@@ -251,14 +248,16 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
251
248
|
const localNodeRid = runtime.topology.localDescriptor().nodeRoutingId;
|
|
252
249
|
const status = runtime.topology.objectPlacementStatus(
|
|
253
250
|
stableType,
|
|
254
|
-
candidate =>
|
|
255
|
-
|
|
251
|
+
(candidate) =>
|
|
252
|
+
candidate.nodeRoutingId === localNodeRid ||
|
|
253
|
+
runtime.isPeerRouteReady(candidate.nodeRoutingId)
|
|
256
254
|
);
|
|
257
255
|
if (status !== 'available') return { kind: status };
|
|
258
256
|
const descriptor = runtime.topology.selectObjectPlacement(
|
|
259
257
|
stableType,
|
|
260
|
-
candidate =>
|
|
261
|
-
|
|
258
|
+
(candidate) =>
|
|
259
|
+
candidate.nodeRoutingId === localNodeRid ||
|
|
260
|
+
runtime.isPeerRouteReady(candidate.nodeRoutingId)
|
|
262
261
|
);
|
|
263
262
|
return descriptor === undefined
|
|
264
263
|
? { kind: 'unavailable' }
|
|
@@ -333,33 +332,32 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
333
332
|
start(): void {
|
|
334
333
|
if (this.runtime !== undefined) return;
|
|
335
334
|
if (this.closed) throw new Error('MeshNode is closed.');
|
|
336
|
-
if (this.bindEndpoint === undefined)
|
|
335
|
+
if (this.bindEndpoint === undefined)
|
|
336
|
+
throw new Error('MeshNode bind endpoint is not configured.');
|
|
337
337
|
const descriptor = this.createDescriptor();
|
|
338
338
|
const runtime = new RawServiceMeshRuntime({
|
|
339
339
|
descriptor,
|
|
340
|
-
resolveAdvertisedEndpoint: boundEndpoint =>
|
|
341
|
-
this.resolveAdvertisedEndpoint(boundEndpoint),
|
|
340
|
+
resolveAdvertisedEndpoint: (boundEndpoint) => this.resolveAdvertisedEndpoint(boundEndpoint),
|
|
342
341
|
bindingPort: this.bindingPort,
|
|
343
342
|
applicationJobQueue: this.requireApplicationJobQueue(),
|
|
344
343
|
peerAdmissionSealed: this.peerAdmissionSealed,
|
|
345
344
|
onReceiveFlowConfigFailure: this.applicationJobReceiveFlowFailureSink,
|
|
346
|
-
onMailboxReady: (domain) =>
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
345
|
+
onMailboxReady: (domain) =>
|
|
346
|
+
this.readyHandler?.(
|
|
347
|
+
domain === 'application' ? ReadyDomain.Application : ReadyDomain.Infrastructure
|
|
348
|
+
),
|
|
349
|
+
onProtocolError: (record) =>
|
|
350
|
+
this.protocolError?.({
|
|
351
|
+
sourceNodeRid: record.sourceRoutingId,
|
|
352
|
+
request: record.request,
|
|
353
|
+
replied: record.replied,
|
|
354
|
+
...(record.command === undefined ? {} : { command: record.command })
|
|
355
|
+
}),
|
|
355
356
|
onPeerNotRequired: (nodeRoutingId, endpoint) => {
|
|
356
357
|
for (const [intent, peer] of this.peerIntents) {
|
|
357
358
|
if (
|
|
358
|
-
(
|
|
359
|
-
|
|
360
|
-
|| peer.nodeRoutingId === nodeRoutingId
|
|
361
|
-
)
|
|
362
|
-
&& peer.endpoint === endpoint
|
|
359
|
+
(peer.nodeRoutingId === undefined || peer.nodeRoutingId === nodeRoutingId) &&
|
|
360
|
+
peer.endpoint === endpoint
|
|
363
361
|
) {
|
|
364
362
|
this.peerIntents.delete(intent);
|
|
365
363
|
}
|
|
@@ -368,8 +366,8 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
368
366
|
onPeerDisconnected: (nodeRoutingId, endpoint) => {
|
|
369
367
|
for (const [intentId, peer] of this.peerIntents) {
|
|
370
368
|
if (
|
|
371
|
-
peer.endpoint === endpoint
|
|
372
|
-
|
|
369
|
+
peer.endpoint === endpoint &&
|
|
370
|
+
(peer.nodeRoutingId === undefined || peer.nodeRoutingId === nodeRoutingId)
|
|
373
371
|
) {
|
|
374
372
|
this.peerIntents.delete(intentId);
|
|
375
373
|
}
|
|
@@ -397,9 +395,11 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
397
395
|
this.scheduleMaintenance();
|
|
398
396
|
}
|
|
399
397
|
|
|
400
|
-
setMessageFollowHandler(
|
|
401
|
-
|
|
402
|
-
|
|
398
|
+
setMessageFollowHandler(
|
|
399
|
+
handler: (
|
|
400
|
+
record: import('../../foundation/service-stateful-wire-codec').ServiceMessageFollowRecord
|
|
401
|
+
) => void
|
|
402
|
+
): void {
|
|
403
403
|
this.messageFollowHandler = handler;
|
|
404
404
|
}
|
|
405
405
|
|
|
@@ -470,27 +470,27 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
470
470
|
readonly expectedLifecycleGeneration?: bigint;
|
|
471
471
|
}): Promise<bigint> {
|
|
472
472
|
const runtime = this.requireRuntime();
|
|
473
|
-
const nodeRoutingId =
|
|
474
|
-
? undefined
|
|
475
|
-
: String(options.expectedRid);
|
|
473
|
+
const nodeRoutingId =
|
|
474
|
+
options.expectedRid === undefined ? undefined : String(options.expectedRid);
|
|
476
475
|
if (nodeRoutingId === undefined) {
|
|
477
476
|
runtime.connectPeerEndpoint(options.endpoint);
|
|
478
477
|
} else {
|
|
479
478
|
runtime.connectPeerByRoutingId(
|
|
480
479
|
options.endpoint,
|
|
481
480
|
nodeRoutingId,
|
|
482
|
-
options.expectedSecurityIdentity
|
|
483
|
-
?? runtime.topology.localDescriptor().securityIdentity,
|
|
481
|
+
options.expectedSecurityIdentity ?? runtime.topology.localDescriptor().securityIdentity,
|
|
484
482
|
options.expectedLifecycleGeneration
|
|
485
483
|
);
|
|
486
484
|
}
|
|
487
485
|
const intent = this.nextPeerIntent++;
|
|
488
486
|
this.peerIntents.set(intent, {
|
|
489
487
|
endpoint: options.endpoint,
|
|
490
|
-
...(nodeRoutingId === undefined
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
488
|
+
...(nodeRoutingId === undefined
|
|
489
|
+
? {}
|
|
490
|
+
: {
|
|
491
|
+
nodeRoutingId,
|
|
492
|
+
lifecycleGeneration: options.expectedLifecycleGeneration
|
|
493
|
+
})
|
|
494
494
|
});
|
|
495
495
|
if (nodeRoutingId !== undefined) await runtime.announcePeer(nodeRoutingId);
|
|
496
496
|
return intent;
|
|
@@ -528,27 +528,19 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
528
528
|
disconnectPeer(peerRid: unknown, lifecycleGeneration: bigint): void {
|
|
529
529
|
const nodeRoutingId = String(peerRid);
|
|
530
530
|
const admitted = this.runtime?.topology.peer(nodeRoutingId);
|
|
531
|
-
if (
|
|
532
|
-
admitted !== undefined
|
|
533
|
-
&& admitted.descriptor.lifecycleGeneration !== lifecycleGeneration
|
|
534
|
-
) {
|
|
531
|
+
if (admitted !== undefined && admitted.descriptor.lifecycleGeneration !== lifecycleGeneration) {
|
|
535
532
|
return;
|
|
536
533
|
}
|
|
537
534
|
const admittedEndpoint = admitted?.descriptor.advertisedEndpoint;
|
|
538
|
-
const found = [...this.peerIntents.entries()]
|
|
539
|
-
|
|
540
|
-
(
|
|
541
|
-
intent.
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
)
|
|
546
|
-
|
|
547
|
-
|| (
|
|
548
|
-
intent.nodeRoutingId === undefined
|
|
549
|
-
&& admittedEndpoint !== undefined
|
|
550
|
-
&& intent.endpoint === admittedEndpoint
|
|
551
|
-
));
|
|
535
|
+
const found = [...this.peerIntents.entries()].find(
|
|
536
|
+
([, intent]) =>
|
|
537
|
+
(intent.nodeRoutingId === nodeRoutingId &&
|
|
538
|
+
(intent.lifecycleGeneration === undefined ||
|
|
539
|
+
intent.lifecycleGeneration === lifecycleGeneration)) ||
|
|
540
|
+
(intent.nodeRoutingId === undefined &&
|
|
541
|
+
admittedEndpoint !== undefined &&
|
|
542
|
+
intent.endpoint === admittedEndpoint)
|
|
543
|
+
);
|
|
552
544
|
if (found === undefined) {
|
|
553
545
|
if (admitted !== undefined) {
|
|
554
546
|
this.runtime?.disconnectPeer(
|
|
@@ -562,22 +554,26 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
562
554
|
this.removePeerConnection(found[0]);
|
|
563
555
|
}
|
|
564
556
|
|
|
565
|
-
replaceDiscoveredNotRequiredPeers(
|
|
566
|
-
readonly
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
557
|
+
replaceDiscoveredNotRequiredPeers(
|
|
558
|
+
peers: readonly {
|
|
559
|
+
readonly nodeRoutingId: string;
|
|
560
|
+
readonly lifecycleGeneration: bigint;
|
|
561
|
+
readonly descriptorRevision: bigint;
|
|
562
|
+
readonly endpoint: string;
|
|
563
|
+
}[]
|
|
564
|
+
): void {
|
|
571
565
|
const local = this.requireRuntime().topology.localDescriptor();
|
|
572
|
-
this.requireRuntime().replaceDiscoveredNotRequired(
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
566
|
+
this.requireRuntime().replaceDiscoveredNotRequired(
|
|
567
|
+
peers.map((peer) => ({
|
|
568
|
+
...local,
|
|
569
|
+
nodeRoutingId: peer.nodeRoutingId,
|
|
570
|
+
lifecycleGeneration: peer.lifecycleGeneration,
|
|
571
|
+
descriptorRevision: peer.descriptorRevision,
|
|
572
|
+
advertisedEndpoint: peer.endpoint,
|
|
573
|
+
channels: [],
|
|
574
|
+
objectRole: 'client'
|
|
575
|
+
}))
|
|
576
|
+
);
|
|
581
577
|
}
|
|
582
578
|
|
|
583
579
|
isObjectClientNodeDirectTarget(targetRid: unknown): boolean {
|
|
@@ -592,30 +588,36 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
592
588
|
targetRid: unknown,
|
|
593
589
|
parts: MessageLike | readonly MessageLike[]
|
|
594
590
|
): Promise<SubmitResultValue> {
|
|
595
|
-
return await this.requireRuntime().sendToNode(
|
|
591
|
+
return (await this.requireRuntime().sendToNode(
|
|
596
592
|
String(targetRid),
|
|
597
593
|
encodeMultipartApplicationFrame(parts)
|
|
598
|
-
)
|
|
594
|
+
))
|
|
595
|
+
? SubmitResult.Ok
|
|
596
|
+
: SubmitResult.NotConnected;
|
|
599
597
|
}
|
|
600
598
|
|
|
601
599
|
async sendInfrastructureControl(
|
|
602
600
|
targetRid: unknown,
|
|
603
601
|
record: Uint8Array | readonly Uint8Array[]
|
|
604
602
|
): Promise<SubmitResultValue> {
|
|
605
|
-
return await this.requireRuntime().sendService(
|
|
603
|
+
return (await this.requireRuntime().sendService(
|
|
606
604
|
String(targetRid),
|
|
607
|
-
(Array.isArray(record) ? record : [record]).map(value => Buffer.from(value))
|
|
608
|
-
)
|
|
605
|
+
(Array.isArray(record) ? record : [record]).map((value) => Buffer.from(value))
|
|
606
|
+
))
|
|
607
|
+
? SubmitResult.Ok
|
|
608
|
+
: SubmitResult.NotConnected;
|
|
609
609
|
}
|
|
610
610
|
|
|
611
611
|
async sendInfrastructureControlFrames(
|
|
612
612
|
targetRid: unknown,
|
|
613
613
|
frames: readonly Uint8Array[]
|
|
614
614
|
): Promise<SubmitResultValue> {
|
|
615
|
-
return await this.requireRuntime().sendService(
|
|
615
|
+
return (await this.requireRuntime().sendService(
|
|
616
616
|
String(targetRid),
|
|
617
|
-
frames.map(frame => Buffer.from(frame))
|
|
618
|
-
)
|
|
617
|
+
frames.map((frame) => Buffer.from(frame))
|
|
618
|
+
))
|
|
619
|
+
? SubmitResult.Ok
|
|
620
|
+
: SubmitResult.NotConnected;
|
|
619
621
|
}
|
|
620
622
|
|
|
621
623
|
async requestInfrastructureControlFrames(
|
|
@@ -625,7 +627,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
625
627
|
): Promise<readonly Uint8Array[]> {
|
|
626
628
|
return await this.requireRuntime().requestService(
|
|
627
629
|
String(targetRid),
|
|
628
|
-
frames.map(frame => Buffer.from(frame)),
|
|
630
|
+
frames.map((frame) => Buffer.from(frame)),
|
|
629
631
|
options?.timeoutMs ?? 30_000
|
|
630
632
|
);
|
|
631
633
|
}
|
|
@@ -647,10 +649,12 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
647
649
|
channelName: string,
|
|
648
650
|
parts: MessageLike | readonly MessageLike[]
|
|
649
651
|
): Promise<SubmitResultValue> {
|
|
650
|
-
return await this.requireRuntime().sendToChannel(
|
|
652
|
+
return (await this.requireRuntime().sendToChannel(
|
|
651
653
|
channelName,
|
|
652
654
|
encodeMultipartApplicationFrame(parts)
|
|
653
|
-
)
|
|
655
|
+
))
|
|
656
|
+
? SubmitResult.Ok
|
|
657
|
+
: SubmitResult.NotConnected;
|
|
654
658
|
}
|
|
655
659
|
|
|
656
660
|
requestToChannel(
|
|
@@ -682,14 +686,14 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
682
686
|
channelCount: descriptor.channels.length,
|
|
683
687
|
configuredPeerCount: this.peerIntents.size,
|
|
684
688
|
admittedPeerCount: peers.length,
|
|
685
|
-
drainingPeerCount: peers.filter(peer => peer.descriptor.state === 'draining').length,
|
|
689
|
+
drainingPeerCount: peers.filter((peer) => peer.descriptor.state === 'draining').length,
|
|
686
690
|
pendingApplicationMessages: BigInt(this.runtime?.mailbox.pendingMessages('application') ?? 0),
|
|
687
691
|
pendingInfrastructureMessages: BigInt(
|
|
688
692
|
(this.runtime?.mailbox.pendingMessages('infrastructure') ?? 0) + this.completionCount
|
|
689
693
|
),
|
|
690
694
|
pendingBytes: BigInt(
|
|
691
|
-
(this.runtime?.mailbox.pendingBytes('application') ?? 0)
|
|
692
|
-
|
|
695
|
+
(this.runtime?.mailbox.pendingBytes('application') ?? 0) +
|
|
696
|
+
(this.runtime?.mailbox.pendingBytes('infrastructure') ?? 0)
|
|
693
697
|
),
|
|
694
698
|
lastError: 0,
|
|
695
699
|
lastChangedMs: BigInt(Math.trunc(performance.now()))
|
|
@@ -702,21 +706,19 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
702
706
|
...intent
|
|
703
707
|
}));
|
|
704
708
|
const findIntent = (nodeRoutingId: string, endpoint: string) =>
|
|
705
|
-
intents.find(
|
|
706
|
-
intent
|
|
707
|
-
|
|
708
|
-
intent.nodeRoutingId === undefined
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
peer.descriptor.nodeRoutingId,
|
|
714
|
-
peer.descriptor.advertisedEndpoint
|
|
715
|
-
)?.id ?? 0n,
|
|
709
|
+
intents.find(
|
|
710
|
+
(intent) =>
|
|
711
|
+
intent.nodeRoutingId === nodeRoutingId ||
|
|
712
|
+
(intent.nodeRoutingId === undefined && intent.endpoint === endpoint)
|
|
713
|
+
);
|
|
714
|
+
const admitted = (this.runtime?.topology.peers() ?? []).map((peer) => ({
|
|
715
|
+
connectionIntentId:
|
|
716
|
+
findIntent(peer.descriptor.nodeRoutingId, peer.descriptor.advertisedEndpoint)?.id ?? 0n,
|
|
716
717
|
source: 1,
|
|
717
|
-
state:
|
|
718
|
-
|
|
719
|
-
|
|
718
|
+
state:
|
|
719
|
+
this.runtime?.isPeerRouteReady(peer.descriptor.nodeRoutingId) === false
|
|
720
|
+
? 1
|
|
721
|
+
: peerStateCode(peer.descriptor.state),
|
|
720
722
|
routingId: peer.descriptor.nodeRoutingId as RoutingId,
|
|
721
723
|
lifecycleGeneration: peer.descriptor.lifecycleGeneration,
|
|
722
724
|
descriptorRevision: peer.descriptor.descriptorRevision,
|
|
@@ -725,11 +727,9 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
725
727
|
lastError: 0,
|
|
726
728
|
lastChangedMs: BigInt(Math.trunc(performance.now()))
|
|
727
729
|
}));
|
|
728
|
-
const notRequired = (this.runtime?.topology.notRequiredPeers() ?? []).map(descriptor => ({
|
|
729
|
-
connectionIntentId:
|
|
730
|
-
descriptor.nodeRoutingId,
|
|
731
|
-
descriptor.advertisedEndpoint
|
|
732
|
-
)?.id ?? 0n,
|
|
730
|
+
const notRequired = (this.runtime?.topology.notRequiredPeers() ?? []).map((descriptor) => ({
|
|
731
|
+
connectionIntentId:
|
|
732
|
+
findIntent(descriptor.nodeRoutingId, descriptor.advertisedEndpoint)?.id ?? 0n,
|
|
733
733
|
source: 1,
|
|
734
734
|
state: 6,
|
|
735
735
|
routingId: descriptor.nodeRoutingId as RoutingId,
|
|
@@ -741,14 +741,12 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
741
741
|
lastChangedMs: BigInt(Math.trunc(performance.now()))
|
|
742
742
|
}));
|
|
743
743
|
const projected = new Set([
|
|
744
|
-
...admitted.map(peer => peer.connectionIntentId),
|
|
745
|
-
...notRequired.map(peer => peer.connectionIntentId)
|
|
744
|
+
...admitted.map((peer) => peer.connectionIntentId),
|
|
745
|
+
...notRequired.map((peer) => peer.connectionIntentId)
|
|
746
746
|
]);
|
|
747
747
|
const disconnected = intents
|
|
748
|
-
.filter(intent =>
|
|
749
|
-
|
|
750
|
-
&& !projected.has(intent.id))
|
|
751
|
-
.map(intent => {
|
|
748
|
+
.filter((intent) => intent.nodeRoutingId !== undefined && !projected.has(intent.id))
|
|
749
|
+
.map((intent) => {
|
|
752
750
|
const descriptor = this.runtime?.topology.knownDescriptor(intent.nodeRoutingId!);
|
|
753
751
|
return {
|
|
754
752
|
connectionIntentId: intent.id,
|
|
@@ -765,8 +763,9 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
765
763
|
lastChangedMs: BigInt(Math.trunc(performance.now()))
|
|
766
764
|
};
|
|
767
765
|
});
|
|
768
|
-
return [...admitted, ...notRequired, ...disconnected]
|
|
769
|
-
|
|
766
|
+
return [...admitted, ...notRequired, ...disconnected].sort((left, right) =>
|
|
767
|
+
String(left.routingId).localeCompare(String(right.routingId))
|
|
768
|
+
);
|
|
770
769
|
}
|
|
771
770
|
|
|
772
771
|
peerChannels(peerRid: unknown, lifecycleGeneration: bigint) {
|
|
@@ -775,8 +774,8 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
775
774
|
return { names: [], weights: [] };
|
|
776
775
|
}
|
|
777
776
|
return {
|
|
778
|
-
names: descriptor.channels.map(channel => channel.name),
|
|
779
|
-
weights: descriptor.channels.map(channel => channel.weight)
|
|
777
|
+
names: descriptor.channels.map((channel) => channel.name),
|
|
778
|
+
weights: descriptor.channels.map((channel) => channel.weight)
|
|
780
779
|
};
|
|
781
780
|
}
|
|
782
781
|
|
|
@@ -815,17 +814,18 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
815
814
|
return new RawReadyBatch(capacity);
|
|
816
815
|
}
|
|
817
816
|
|
|
818
|
-
createReceiveBatch(
|
|
819
|
-
messageCapacity: number,
|
|
820
|
-
partCapacity: number
|
|
821
|
-
): ReceiveBatch {
|
|
817
|
+
createReceiveBatch(messageCapacity: number, partCapacity: number): ReceiveBatch {
|
|
822
818
|
return new RawReceiveBatch(messageCapacity, partCapacity);
|
|
823
819
|
}
|
|
824
820
|
|
|
825
821
|
drainReady(
|
|
826
822
|
domains: number,
|
|
827
823
|
batch: ReadyBatch
|
|
828
|
-
): {
|
|
824
|
+
): {
|
|
825
|
+
readonly ok: boolean;
|
|
826
|
+
readonly hasResidue: boolean;
|
|
827
|
+
readonly records: readonly ReadyRecord[];
|
|
828
|
+
} {
|
|
829
829
|
const target = requireRawReadyBatch(batch);
|
|
830
830
|
if ((domains & ReadyDomain.Infrastructure) !== 0) {
|
|
831
831
|
this.drainCompletions(target);
|
|
@@ -835,13 +835,12 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
835
835
|
this.drainMailbox('application', target);
|
|
836
836
|
}
|
|
837
837
|
const runtime = this.runtime;
|
|
838
|
-
const infrastructureResidue =
|
|
839
|
-
&&
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
)
|
|
843
|
-
|
|
844
|
-
&& (runtime?.mailbox.pendingMessages('application') ?? 0) > 0;
|
|
838
|
+
const infrastructureResidue =
|
|
839
|
+
(domains & ReadyDomain.Infrastructure) !== 0 &&
|
|
840
|
+
(this.completionCount > 0 || (runtime?.mailbox.pendingMessages('infrastructure') ?? 0) > 0);
|
|
841
|
+
const applicationResidue =
|
|
842
|
+
(domains & ReadyDomain.Application) !== 0 &&
|
|
843
|
+
(runtime?.mailbox.pendingMessages('application') ?? 0) > 0;
|
|
845
844
|
return {
|
|
846
845
|
ok: true,
|
|
847
846
|
// Residue is scoped to the requested lane. The pump drains lanes in
|
|
@@ -873,10 +872,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
873
872
|
return this.requireStateful().instanceSpotApplicationTarget(spotId);
|
|
874
873
|
}
|
|
875
874
|
|
|
876
|
-
waitForInstanceApplicationQuiescence(
|
|
877
|
-
spotId: string,
|
|
878
|
-
signal?: AbortSignal
|
|
879
|
-
): Promise<void> {
|
|
875
|
+
waitForInstanceApplicationQuiescence(spotId: string, signal?: AbortSignal): Promise<void> {
|
|
880
876
|
return this.requireStateful().waitForInstanceApplicationQuiescence(spotId, signal);
|
|
881
877
|
}
|
|
882
878
|
|
|
@@ -980,9 +976,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
980
976
|
this.requireStateful().registerAsyncInstanceActivationAuthority(authority);
|
|
981
977
|
}
|
|
982
978
|
|
|
983
|
-
registerInstanceApplicationLifecycle(
|
|
984
|
-
lifecycle: ServiceInstanceApplicationLifecycle
|
|
985
|
-
): void {
|
|
979
|
+
registerInstanceApplicationLifecycle(lifecycle: ServiceInstanceApplicationLifecycle): void {
|
|
986
980
|
this.requireStateful().registerInstanceApplicationLifecycle(lifecycle);
|
|
987
981
|
}
|
|
988
982
|
|
|
@@ -1027,7 +1021,11 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1027
1021
|
pending: ServicePendingInstanceActivation,
|
|
1028
1022
|
expectedCurrentRoute?: ServiceInstanceRouteFence | null
|
|
1029
1023
|
): Promise<boolean> {
|
|
1030
|
-
return this.requireStateful().recoverPendingInstanceActivation(
|
|
1024
|
+
return this.requireStateful().recoverPendingInstanceActivation(
|
|
1025
|
+
envelope,
|
|
1026
|
+
pending,
|
|
1027
|
+
expectedCurrentRoute
|
|
1028
|
+
);
|
|
1031
1029
|
}
|
|
1032
1030
|
|
|
1033
1031
|
completeRecoveredInstanceActivation(
|
|
@@ -1035,7 +1033,11 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1035
1033
|
route: ServiceInstanceRouteFence,
|
|
1036
1034
|
expectedCurrentRoute?: ServiceInstanceRouteFence | null
|
|
1037
1035
|
): Promise<ServiceInstanceRouteFence | undefined> {
|
|
1038
|
-
return this.requireStateful().completeRecoveredInstanceActivation(
|
|
1036
|
+
return this.requireStateful().completeRecoveredInstanceActivation(
|
|
1037
|
+
target,
|
|
1038
|
+
route,
|
|
1039
|
+
expectedCurrentRoute
|
|
1040
|
+
);
|
|
1039
1041
|
}
|
|
1040
1042
|
|
|
1041
1043
|
forgetInstanceIntent(
|
|
@@ -1059,10 +1061,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1059
1061
|
this.requireStateful().rememberSpotRoute(route, expectedCurrentRoute);
|
|
1060
1062
|
}
|
|
1061
1063
|
|
|
1062
|
-
entrySpotRouteFence(
|
|
1063
|
-
targetNodeRid: string,
|
|
1064
|
-
targetSpotId: string
|
|
1065
|
-
): ServiceDirectSpotRouteFence {
|
|
1064
|
+
entrySpotRouteFence(targetNodeRid: string, targetSpotId: string): ServiceDirectSpotRouteFence {
|
|
1066
1065
|
const generation = this.peerGeneration(targetNodeRid);
|
|
1067
1066
|
return {
|
|
1068
1067
|
spot: { spotId: targetSpotId, generation },
|
|
@@ -1089,11 +1088,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1089
1088
|
target: ServiceDirectSpotRouteFence,
|
|
1090
1089
|
durationMs: number
|
|
1091
1090
|
): Promise<boolean> {
|
|
1092
|
-
return this.requireStateful().commitSpotMessageFollowIngress(
|
|
1093
|
-
seal,
|
|
1094
|
-
target,
|
|
1095
|
-
durationMs
|
|
1096
|
-
);
|
|
1091
|
+
return this.requireStateful().commitSpotMessageFollowIngress(seal, target, durationMs);
|
|
1097
1092
|
}
|
|
1098
1093
|
|
|
1099
1094
|
forgetSpotRoute(
|
|
@@ -1224,12 +1219,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1224
1219
|
const target = String(targetNodeRid);
|
|
1225
1220
|
return this.observeStateful(
|
|
1226
1221
|
OperationKind.ActorJoin,
|
|
1227
|
-
this.requireStateful().joinActorEntrySpot(
|
|
1228
|
-
actor,
|
|
1229
|
-
target,
|
|
1230
|
-
request,
|
|
1231
|
-
timeoutMs
|
|
1232
|
-
)
|
|
1222
|
+
this.requireStateful().joinActorEntrySpot(actor, target, request, timeoutMs)
|
|
1233
1223
|
);
|
|
1234
1224
|
}
|
|
1235
1225
|
|
|
@@ -1293,13 +1283,13 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1293
1283
|
target: ZLinkBackendActorRef,
|
|
1294
1284
|
parts: MessageLike | readonly MessageLike[]
|
|
1295
1285
|
): Promise<SubmitResultValue> {
|
|
1296
|
-
return await this.requireStateful().sendToActor(
|
|
1286
|
+
return (await this.requireStateful().sendToActor(
|
|
1297
1287
|
target,
|
|
1298
1288
|
this.peerGeneration(String(target.nodeRid)),
|
|
1299
1289
|
target.generation,
|
|
1300
1290
|
encodeMultipart(parts),
|
|
1301
1291
|
source
|
|
1302
|
-
) as SubmitResultValue;
|
|
1292
|
+
)) as SubmitResultValue;
|
|
1303
1293
|
}
|
|
1304
1294
|
|
|
1305
1295
|
actorRequestToActor(
|
|
@@ -1328,12 +1318,12 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1328
1318
|
_flags?: number,
|
|
1329
1319
|
actorFence?: ZLinkBackendActorSessionSendFence
|
|
1330
1320
|
): Promise<SubmitResultValue> {
|
|
1331
|
-
return await this.requireStateful().sendBoundSession(
|
|
1321
|
+
return (await this.requireStateful().sendBoundSession(
|
|
1332
1322
|
actor,
|
|
1333
1323
|
expectedBindingGeneration,
|
|
1334
1324
|
encodeMultipart(parts),
|
|
1335
1325
|
actorFence
|
|
1336
|
-
) as SubmitResultValue;
|
|
1326
|
+
)) as SubmitResultValue;
|
|
1337
1327
|
}
|
|
1338
1328
|
|
|
1339
1329
|
closeActorBoundSession(
|
|
@@ -1380,11 +1370,11 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1380
1370
|
target: ServiceDirectSpotRouteFence,
|
|
1381
1371
|
parts: MessageLike | readonly MessageLike[]
|
|
1382
1372
|
): Promise<SubmitResultValue> {
|
|
1383
|
-
return await this.requireStateful().sendToSpot(
|
|
1373
|
+
return (await this.requireStateful().sendToSpot(
|
|
1384
1374
|
source.ref.spotId,
|
|
1385
1375
|
target,
|
|
1386
1376
|
encodeMultipart(parts)
|
|
1387
|
-
) as SubmitResultValue;
|
|
1377
|
+
)) as SubmitResultValue;
|
|
1388
1378
|
}
|
|
1389
1379
|
|
|
1390
1380
|
requestFromSpot(
|
|
@@ -1422,19 +1412,11 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1422
1412
|
);
|
|
1423
1413
|
}
|
|
1424
1414
|
|
|
1425
|
-
setSpotSubscription(
|
|
1426
|
-
state: ServiceSpotState,
|
|
1427
|
-
channelName: string,
|
|
1428
|
-
topicFilter: string
|
|
1429
|
-
): void {
|
|
1415
|
+
setSpotSubscription(state: ServiceSpotState, channelName: string, topicFilter: string): void {
|
|
1430
1416
|
this.requireStateful().setSubscription(state, channelName, topicFilter);
|
|
1431
1417
|
}
|
|
1432
1418
|
|
|
1433
|
-
unsetSpotSubscription(
|
|
1434
|
-
state: ServiceSpotState,
|
|
1435
|
-
channelName: string,
|
|
1436
|
-
topicFilter: string
|
|
1437
|
-
): void {
|
|
1419
|
+
unsetSpotSubscription(state: ServiceSpotState, channelName: string, topicFilter: string): void {
|
|
1438
1420
|
this.requireStateful().unsetSubscription(state, channelName, topicFilter);
|
|
1439
1421
|
}
|
|
1440
1422
|
|
|
@@ -1458,10 +1440,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1458
1440
|
securityIdentity: 'default',
|
|
1459
1441
|
applicationVersion: 0n,
|
|
1460
1442
|
...(this.maintenanceWave === undefined ? {} : { maintenanceWave: this.maintenanceWave }),
|
|
1461
|
-
protocolCapabilities: [
|
|
1462
|
-
SERVICE_WIRE_REQUIRED_CAPABILITY,
|
|
1463
|
-
...this.objectCapabilities
|
|
1464
|
-
].sort(),
|
|
1443
|
+
protocolCapabilities: [SERVICE_WIRE_REQUIRED_CAPABILITY, ...this.objectCapabilities].sort(),
|
|
1465
1444
|
objectRole: this.objectRole,
|
|
1466
1445
|
placementWeight: this.placementWeight,
|
|
1467
1446
|
activeCapacityLimit: this.activeCapacityLimit,
|
|
@@ -1483,10 +1462,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1483
1462
|
|
|
1484
1463
|
private scheduleMaintenance(): void {
|
|
1485
1464
|
if (this.closed || this.maintenanceTimer !== undefined) return;
|
|
1486
|
-
this.maintenanceTimer = setTimeout(
|
|
1487
|
-
this.onMaintenance,
|
|
1488
|
-
MESH_BACKEND_MAINTENANCE_INTERVAL_MS
|
|
1489
|
-
);
|
|
1465
|
+
this.maintenanceTimer = setTimeout(this.onMaintenance, MESH_BACKEND_MAINTENANCE_INTERVAL_MS);
|
|
1490
1466
|
}
|
|
1491
1467
|
|
|
1492
1468
|
private async pump(): Promise<void> {
|
|
@@ -1535,9 +1511,8 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1535
1511
|
): MeshOperationId {
|
|
1536
1512
|
const id = { high: 1n, low };
|
|
1537
1513
|
void promise.then(
|
|
1538
|
-
result => this.enqueueCompletion(id, operationKind, result),
|
|
1539
|
-
error => this.enqueueCompletion(
|
|
1540
|
-
id, operationKind, genericOperationFailure(error))
|
|
1514
|
+
(result) => this.enqueueCompletion(id, operationKind, result),
|
|
1515
|
+
(error) => this.enqueueCompletion(id, operationKind, genericOperationFailure(error))
|
|
1541
1516
|
);
|
|
1542
1517
|
return id;
|
|
1543
1518
|
}
|
|
@@ -1548,8 +1523,8 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1548
1523
|
): MeshOperationId {
|
|
1549
1524
|
const id = { high: 2n, low: pending.id };
|
|
1550
1525
|
void pending.promise.then(
|
|
1551
|
-
result => this.enqueueCompletion(id, operationKind, result),
|
|
1552
|
-
error => this.enqueueCompletion(id, operationKind, statefulOperationFailure(error))
|
|
1526
|
+
(result) => this.enqueueCompletion(id, operationKind, result),
|
|
1527
|
+
(error) => this.enqueueCompletion(id, operationKind, statefulOperationFailure(error))
|
|
1553
1528
|
);
|
|
1554
1529
|
return id;
|
|
1555
1530
|
}
|
|
@@ -1597,8 +1572,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1597
1572
|
this.completionCount -= 1;
|
|
1598
1573
|
if (this.completionCount === 0) {
|
|
1599
1574
|
this.clearCompletions();
|
|
1600
|
-
} else if (this.completionHead >= 1024
|
|
1601
|
-
&& this.completionHead * 2 >= this.completions.length) {
|
|
1575
|
+
} else if (this.completionHead >= 1024 && this.completionHead * 2 >= this.completions.length) {
|
|
1602
1576
|
this.completions.splice(0, this.completionHead);
|
|
1603
1577
|
this.completionHead = 0;
|
|
1604
1578
|
}
|
|
@@ -1615,17 +1589,10 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
|
|
|
1615
1589
|
const runtime = this.runtime;
|
|
1616
1590
|
if (runtime === undefined) return;
|
|
1617
1591
|
while (!batch.full) {
|
|
1618
|
-
const claim = runtime.mailbox.tryClaim(
|
|
1619
|
-
domain,
|
|
1620
|
-
MAX_DRAIN_RECORDS,
|
|
1621
|
-
Number.MAX_SAFE_INTEGER
|
|
1622
|
-
);
|
|
1592
|
+
const claim = runtime.mailbox.tryClaim(domain, MAX_DRAIN_RECORDS, Number.MAX_SAFE_INTEGER);
|
|
1623
1593
|
if (claim === undefined) break;
|
|
1624
1594
|
const owner = readyOwner(claim.owner, this.routingId, this.stateful, domain);
|
|
1625
|
-
batch.push(
|
|
1626
|
-
owner,
|
|
1627
|
-
new MailboxClaim(runtime, claim)
|
|
1628
|
-
);
|
|
1595
|
+
batch.push(owner, new MailboxClaim(runtime, claim));
|
|
1629
1596
|
}
|
|
1630
1597
|
}
|
|
1631
1598
|
|
|
@@ -1730,17 +1697,10 @@ class RawServiceSpot implements ServiceSpot {
|
|
|
1730
1697
|
String(targetSpotId),
|
|
1731
1698
|
targetSpotGeneration,
|
|
1732
1699
|
options?.entrySpot === true
|
|
1733
|
-
? this.backend.entrySpotRouteFence(
|
|
1734
|
-
String(targetNodeRid),
|
|
1735
|
-
String(targetSpotId)
|
|
1736
|
-
)
|
|
1700
|
+
? this.backend.entrySpotRouteFence(String(targetNodeRid), String(targetSpotId))
|
|
1737
1701
|
: undefined
|
|
1738
1702
|
);
|
|
1739
|
-
return this.backend.sendFromSpot(
|
|
1740
|
-
this.state,
|
|
1741
|
-
routeFence,
|
|
1742
|
-
parts
|
|
1743
|
-
);
|
|
1703
|
+
return this.backend.sendFromSpot(this.state, routeFence, parts);
|
|
1744
1704
|
}
|
|
1745
1705
|
|
|
1746
1706
|
requestToSpot(
|
|
@@ -1761,10 +1721,7 @@ class RawServiceSpot implements ServiceSpot {
|
|
|
1761
1721
|
String(targetSpotId),
|
|
1762
1722
|
targetSpotGeneration,
|
|
1763
1723
|
options?.entrySpot === true
|
|
1764
|
-
? this.backend.entrySpotRouteFence(
|
|
1765
|
-
String(targetNodeRid),
|
|
1766
|
-
String(targetSpotId)
|
|
1767
|
-
)
|
|
1724
|
+
? this.backend.entrySpotRouteFence(String(targetNodeRid), String(targetSpotId))
|
|
1768
1725
|
: undefined
|
|
1769
1726
|
);
|
|
1770
1727
|
return this.backend.requestFromSpot(
|
|
@@ -1788,14 +1745,16 @@ class RawServiceSpot implements ServiceSpot {
|
|
|
1788
1745
|
|
|
1789
1746
|
setSubscription(channelName: string, topicFilter: string, kind = 0): void {
|
|
1790
1747
|
this.requireOpen();
|
|
1791
|
-
if (kind !== 0)
|
|
1748
|
+
if (kind !== 0)
|
|
1749
|
+
throw new RangeError('Only the default logical multicast subscription kind is supported.');
|
|
1792
1750
|
this.backend.setSpotSubscription(this.state, channelName, topicFilter);
|
|
1793
1751
|
this.subscriptions.add(`${channelName}\0${topicFilter}\0${kind}`);
|
|
1794
1752
|
}
|
|
1795
1753
|
|
|
1796
1754
|
unsetSubscription(channelName: string, topicFilter: string, kind = 0): void {
|
|
1797
1755
|
this.requireOpen();
|
|
1798
|
-
if (kind !== 0)
|
|
1756
|
+
if (kind !== 0)
|
|
1757
|
+
throw new RangeError('Only the default logical multicast subscription kind is supported.');
|
|
1799
1758
|
this.backend.unsetSpotSubscription(this.state, channelName, topicFilter);
|
|
1800
1759
|
this.subscriptions.delete(`${channelName}\0${topicFilter}\0${kind}`);
|
|
1801
1760
|
}
|
|
@@ -1830,10 +1789,10 @@ function requireDirectSpotRouteFence(
|
|
|
1830
1789
|
return entryRoute;
|
|
1831
1790
|
}
|
|
1832
1791
|
if (
|
|
1833
|
-
route === undefined
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1792
|
+
route === undefined ||
|
|
1793
|
+
route.targetNodeRid !== targetNodeRid ||
|
|
1794
|
+
route.spot.spotId !== targetSpotId ||
|
|
1795
|
+
route.spot.generation !== targetSpotGeneration
|
|
1837
1796
|
) {
|
|
1838
1797
|
throw new TypeError('Direct Spot submission requires the exact resolved authority fence.');
|
|
1839
1798
|
}
|
|
@@ -1880,7 +1839,7 @@ class RawStreamSessionService implements StreamSessionService {
|
|
|
1880
1839
|
return {
|
|
1881
1840
|
state: this.state,
|
|
1882
1841
|
lifecycleGeneration: 1n,
|
|
1883
|
-
sessionCount: BigInt(new Set(bindings.map(value => value.sessionRid)).size),
|
|
1842
|
+
sessionCount: BigInt(new Set(bindings.map((value) => value.sessionRid)).size),
|
|
1884
1843
|
bindingCount: BigInt(bindings.length),
|
|
1885
1844
|
pendingMessageCount: 0n,
|
|
1886
1845
|
pendingByteCount: 0n,
|
|
@@ -1888,11 +1847,7 @@ class RawStreamSessionService implements StreamSessionService {
|
|
|
1888
1847
|
};
|
|
1889
1848
|
}
|
|
1890
1849
|
|
|
1891
|
-
lookupActor(
|
|
1892
|
-
targetNodeRid: RoutingId,
|
|
1893
|
-
actorId: string,
|
|
1894
|
-
timeoutMs = 30_000
|
|
1895
|
-
): MeshOperationId {
|
|
1850
|
+
lookupActor(targetNodeRid: RoutingId, actorId: string, timeoutMs = 30_000): MeshOperationId {
|
|
1896
1851
|
this.requireStarted();
|
|
1897
1852
|
return this.observe(
|
|
1898
1853
|
OperationKind.ActorLookup,
|
|
@@ -1937,12 +1892,7 @@ class RawStreamSessionService implements StreamSessionService {
|
|
|
1937
1892
|
this.requireStarted();
|
|
1938
1893
|
return this.observe(
|
|
1939
1894
|
OperationKind.StreamUnbind,
|
|
1940
|
-
this.stateful.unbindSession(
|
|
1941
|
-
String(sessionRid),
|
|
1942
|
-
actor,
|
|
1943
|
-
expectedBindingGeneration,
|
|
1944
|
-
timeoutMs
|
|
1945
|
-
)
|
|
1895
|
+
this.stateful.unbindSession(String(sessionRid), actor, expectedBindingGeneration, timeoutMs)
|
|
1946
1896
|
);
|
|
1947
1897
|
}
|
|
1948
1898
|
|
|
@@ -1956,11 +1906,11 @@ class RawStreamSessionService implements StreamSessionService {
|
|
|
1956
1906
|
parts: MessageLike | readonly MessageLike[]
|
|
1957
1907
|
): Promise<SubmitResultValue> {
|
|
1958
1908
|
this.requireStarted();
|
|
1959
|
-
return await this.stateful.sendSessionToActor(
|
|
1909
|
+
return (await this.stateful.sendSessionToActor(
|
|
1960
1910
|
String(sessionRid),
|
|
1961
1911
|
actor,
|
|
1962
1912
|
encodeMultipart(parts)
|
|
1963
|
-
) as SubmitResultValue;
|
|
1913
|
+
)) as SubmitResultValue;
|
|
1964
1914
|
}
|
|
1965
1915
|
|
|
1966
1916
|
private async deliver(sessionRid: string, payload: Uint8Array): Promise<boolean> {
|
|
@@ -1985,20 +1935,14 @@ class RawStreamSessionService implements StreamSessionService {
|
|
|
1985
1935
|
// Let the socket monitor drive the existing STREAM close/unbind
|
|
1986
1936
|
// lifecycle instead of maintaining a second session-close state.
|
|
1987
1937
|
disconnectStreamPeer(this.stream, target);
|
|
1988
|
-
throw new ZLinkBackendResultError(
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
error.nativeErrno,
|
|
1992
|
-
{ cause: error }
|
|
1993
|
-
);
|
|
1938
|
+
throw new ZLinkBackendResultError('submit', error.result, error.nativeErrno, {
|
|
1939
|
+
cause: error
|
|
1940
|
+
});
|
|
1994
1941
|
case SubmitResult.Backpressured:
|
|
1995
1942
|
case SubmitResult.NotAdmitted:
|
|
1996
|
-
throw new ZLinkBackendResultError(
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
error.nativeErrno,
|
|
2000
|
-
{ cause: error }
|
|
2001
|
-
);
|
|
1943
|
+
throw new ZLinkBackendResultError('submit', error.result, error.nativeErrno, {
|
|
1944
|
+
cause: error
|
|
1945
|
+
});
|
|
2002
1946
|
default:
|
|
2003
1947
|
throw error;
|
|
2004
1948
|
}
|
|
@@ -2017,7 +1961,8 @@ class RawReadyBatch implements ReadyBatch {
|
|
|
2017
1961
|
private readonly claims: RawClaim[] = [];
|
|
2018
1962
|
|
|
2019
1963
|
constructor(private readonly capacity: number) {
|
|
2020
|
-
if (!Number.isInteger(capacity) || capacity < 1)
|
|
1964
|
+
if (!Number.isInteger(capacity) || capacity < 1)
|
|
1965
|
+
throw new RangeError('Ready capacity must be positive.');
|
|
2021
1966
|
}
|
|
2022
1967
|
|
|
2023
1968
|
get full(): boolean {
|
|
@@ -2054,7 +1999,7 @@ class RawReceiveBatch implements ReceiveBatch {
|
|
|
2054
1999
|
private readonly capacity: number,
|
|
2055
2000
|
readonly partCapacity: number
|
|
2056
2001
|
) {
|
|
2057
|
-
if ([capacity, partCapacity].some(value => !Number.isInteger(value) || value < 1)) {
|
|
2002
|
+
if ([capacity, partCapacity].some((value) => !Number.isInteger(value) || value < 1)) {
|
|
2058
2003
|
throw new RangeError('Receive batch capacities must be positive.');
|
|
2059
2004
|
}
|
|
2060
2005
|
this.receiveCapacity = capacity;
|
|
@@ -2065,7 +2010,11 @@ class RawReceiveBatch implements ReceiveBatch {
|
|
|
2065
2010
|
}
|
|
2066
2011
|
|
|
2067
2012
|
reset(messageCapacity = this.capacity): void {
|
|
2068
|
-
if (
|
|
2013
|
+
if (
|
|
2014
|
+
!Number.isInteger(messageCapacity) ||
|
|
2015
|
+
messageCapacity < 1 ||
|
|
2016
|
+
messageCapacity > this.capacity
|
|
2017
|
+
) {
|
|
2069
2018
|
throw new RangeError('Receive limit must be within the batch capacity.');
|
|
2070
2019
|
}
|
|
2071
2020
|
this.receiveCapacity = messageCapacity;
|
|
@@ -2111,10 +2060,7 @@ class MailboxClaim implements RawClaim {
|
|
|
2111
2060
|
throw error;
|
|
2112
2061
|
}
|
|
2113
2062
|
const nextParts = decoded.parts.length;
|
|
2114
|
-
if (
|
|
2115
|
-
records.length >= capacity.messageCapacity
|
|
2116
|
-
|| parts + nextParts > capacity.partCapacity
|
|
2117
|
-
) {
|
|
2063
|
+
if (records.length >= capacity.messageCapacity || parts + nextParts > capacity.partCapacity) {
|
|
2118
2064
|
for (const part of decoded.parts) part.close();
|
|
2119
2065
|
this.remaining = this.claim.records.slice(index);
|
|
2120
2066
|
break;
|
|
@@ -2144,31 +2090,33 @@ class CompletionClaim implements RawClaim {
|
|
|
2144
2090
|
const payload = this.completion.result.payload;
|
|
2145
2091
|
return {
|
|
2146
2092
|
ok: true,
|
|
2147
|
-
records: [
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2093
|
+
records: [
|
|
2094
|
+
{
|
|
2095
|
+
kind: ReceiveKind.Completion,
|
|
2096
|
+
domain: ReadyDomain.Infrastructure,
|
|
2097
|
+
sourceNodeRid: null,
|
|
2098
|
+
sourceSpotId: null,
|
|
2099
|
+
sourceBindingGeneration: 0n,
|
|
2100
|
+
sourceActor: null,
|
|
2101
|
+
operationId: this.completion.operationId,
|
|
2102
|
+
operationKind: this.completion.operationKind,
|
|
2103
|
+
channelName: null,
|
|
2104
|
+
topic: null,
|
|
2105
|
+
applicationMetadata: null,
|
|
2106
|
+
kindData:
|
|
2107
|
+
'kindData' in this.completion.result ? (this.completion.result.kindData ?? null) : null,
|
|
2108
|
+
terminalResult: this.completion.result.terminalResult,
|
|
2109
|
+
failureErrno: this.completion.result.failureCode,
|
|
2110
|
+
parts:
|
|
2111
|
+
payload === undefined
|
|
2112
|
+
? []
|
|
2113
|
+
: payload.contentType === MULTIPART_CONTENT_TYPE
|
|
2114
|
+
? decodeMultipart(payload.payload)
|
|
2115
|
+
: [Message.from(payload.payload)],
|
|
2116
|
+
reply: () => SubmitResult.InvalidState,
|
|
2117
|
+
replyActorJoin: () => SubmitResult.NotSupported
|
|
2118
|
+
}
|
|
2119
|
+
]
|
|
2172
2120
|
};
|
|
2173
2121
|
}
|
|
2174
2122
|
|
|
@@ -2196,12 +2144,11 @@ function decodeMultipartRecord(
|
|
|
2196
2144
|
// multi-frame infrastructure control (Prepare + sideband) from being
|
|
2197
2145
|
// misread as a 2-frame application envelope and dropped as invalid_frame.
|
|
2198
2146
|
if (record.parts.length === 1 || record.domain === 'infrastructure') {
|
|
2199
|
-
const request = record.requestSequence !== undefined
|
|
2200
|
-
&& record.sourceRoutingId !== undefined;
|
|
2147
|
+
const request = record.requestSequence !== undefined && record.sourceRoutingId !== undefined;
|
|
2201
2148
|
return {
|
|
2202
2149
|
kind: request ? ReceiveKind.NodeRequest : ReceiveKind.NodeSend,
|
|
2203
2150
|
domain: readyDomain(record.domain),
|
|
2204
|
-
sourceNodeRid: record.sourceRoutingId as RoutingId | undefined ?? null,
|
|
2151
|
+
sourceNodeRid: (record.sourceRoutingId as RoutingId | undefined) ?? null,
|
|
2205
2152
|
sourceSpotId: null,
|
|
2206
2153
|
sourceBindingGeneration: 0n,
|
|
2207
2154
|
sourceActor: null,
|
|
@@ -2216,17 +2163,20 @@ function decodeMultipartRecord(
|
|
|
2216
2163
|
terminalResult: 0,
|
|
2217
2164
|
failureErrno: 0,
|
|
2218
2165
|
...receiveIngressLifecycle(record),
|
|
2219
|
-
parts: record.parts.map(part => Message.from(part)),
|
|
2166
|
+
parts: record.parts.map((part) => Message.from(part)),
|
|
2220
2167
|
reply(parts) {
|
|
2221
2168
|
if (!request) return SubmitResult.InvalidState;
|
|
2222
2169
|
const values = Array.isArray(parts) ? parts : [parts];
|
|
2223
2170
|
if (values.length === 0) return SubmitResult.InvalidState;
|
|
2224
|
-
runtime.replyService(
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2171
|
+
runtime.replyService(
|
|
2172
|
+
{
|
|
2173
|
+
sourceRoutingId: record.sourceRoutingId!,
|
|
2174
|
+
...(record.sourceRoute === undefined ? {} : { sourceRoute: record.sourceRoute }),
|
|
2175
|
+
requestSequence: record.requestSequence!,
|
|
2176
|
+
...(record.reply === undefined ? {} : { reply: record.reply })
|
|
2177
|
+
},
|
|
2178
|
+
values.map((value) => Buffer.from(messageBytesView(value)))
|
|
2179
|
+
);
|
|
2230
2180
|
return SubmitResult.Ok;
|
|
2231
2181
|
},
|
|
2232
2182
|
replyActorJoin: () => SubmitResult.NotSupported
|
|
@@ -2236,27 +2186,32 @@ function decodeMultipartRecord(
|
|
|
2236
2186
|
const command = header[3]!;
|
|
2237
2187
|
const payloadFrame = record.parts[1]!;
|
|
2238
2188
|
const application = decodeApplicationEnvelope(payloadFrame);
|
|
2239
|
-
const channelName = record.owner.startsWith('channel:')
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2189
|
+
const channelName = record.owner.startsWith('channel:')
|
|
2190
|
+
? record.owner.slice('channel:'.length)
|
|
2191
|
+
: null;
|
|
2192
|
+
const operationId =
|
|
2193
|
+
record.correlation === undefined
|
|
2194
|
+
? { high: 0n, low: 0n }
|
|
2195
|
+
: { high: 1n, low: record.correlation };
|
|
2196
|
+
const kind =
|
|
2197
|
+
command === 16
|
|
2198
|
+
? ReceiveKind.NodeSend
|
|
2199
|
+
: command === 17
|
|
2200
|
+
? ReceiveKind.NodeRequest
|
|
2201
|
+
: command === 18
|
|
2202
|
+
? ReceiveKind.ChannelSend
|
|
2203
|
+
: ReceiveKind.ChannelRequest;
|
|
2204
|
+
const operationKind =
|
|
2205
|
+
kind === ReceiveKind.NodeRequest
|
|
2206
|
+
? OperationKind.NodeRequest
|
|
2207
|
+
: kind === ReceiveKind.ChannelRequest
|
|
2208
|
+
? OperationKind.ChannelRequest
|
|
2209
|
+
: 0;
|
|
2255
2210
|
const ingressLifecycle = receiveIngressLifecycle(record);
|
|
2256
2211
|
return {
|
|
2257
2212
|
kind,
|
|
2258
2213
|
domain: readyDomain(record.domain),
|
|
2259
|
-
sourceNodeRid: record.sourceRoutingId as RoutingId | undefined ?? null,
|
|
2214
|
+
sourceNodeRid: (record.sourceRoutingId as RoutingId | undefined) ?? null,
|
|
2260
2215
|
sourceSpotId: null,
|
|
2261
2216
|
sourceBindingGeneration: 0n,
|
|
2262
2217
|
sourceActor: null,
|
|
@@ -2286,22 +2241,27 @@ function decodeStatefulRecord(
|
|
|
2286
2241
|
stateful: ServiceStatefulMailboxData
|
|
2287
2242
|
): ReceiveRecord {
|
|
2288
2243
|
const payloadFrame = record.parts.length < 2 ? undefined : record.parts[1];
|
|
2289
|
-
const canonicalActorJoin =
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2244
|
+
const canonicalActorJoin =
|
|
2245
|
+
stateful.kindData?.kind === 'actorControl' &&
|
|
2246
|
+
stateful.kindData.canonicalActorJoin !== undefined;
|
|
2247
|
+
const canonicalActorJoinPayload =
|
|
2248
|
+
stateful.operationKind === OperationKind.ActorJoin &&
|
|
2249
|
+
stateful.canonicalApplicationPayload !== undefined;
|
|
2293
2250
|
const application = canonicalActorJoinPayload
|
|
2294
2251
|
? stateful.canonicalApplicationPayload
|
|
2295
|
-
:
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2252
|
+
: payloadFrame === undefined
|
|
2253
|
+
? undefined
|
|
2254
|
+
: decodeApplicationEnvelope(payloadFrame);
|
|
2255
|
+
const operationId =
|
|
2256
|
+
record.correlation === undefined
|
|
2257
|
+
? { high: 0n, low: 0n }
|
|
2258
|
+
: { high: 2n, low: record.correlation };
|
|
2299
2259
|
const ingressLifecycle = receiveIngressLifecycle(record);
|
|
2300
2260
|
return {
|
|
2301
2261
|
kind: stateful.receiveKind,
|
|
2302
2262
|
domain: readyDomain(record.domain),
|
|
2303
|
-
sourceNodeRid: record.sourceRoutingId as RoutingId | undefined ?? null,
|
|
2304
|
-
sourceSpotId: stateful.sourceSpotId as RoutingId | undefined ?? null,
|
|
2263
|
+
sourceNodeRid: (record.sourceRoutingId as RoutingId | undefined) ?? null,
|
|
2264
|
+
sourceSpotId: (stateful.sourceSpotId as RoutingId | undefined) ?? null,
|
|
2305
2265
|
sourceBindingGeneration: stateful.sourceBindingGeneration ?? 0n,
|
|
2306
2266
|
sourceActor: stateful.sourceActor ?? null,
|
|
2307
2267
|
operationId,
|
|
@@ -2319,11 +2279,12 @@ function decodeStatefulRecord(
|
|
|
2319
2279
|
terminalResult: 0,
|
|
2320
2280
|
failureErrno: 0,
|
|
2321
2281
|
...ingressLifecycle,
|
|
2322
|
-
parts:
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2282
|
+
parts:
|
|
2283
|
+
application === undefined
|
|
2284
|
+
? []
|
|
2285
|
+
: canonicalActorJoinPayload
|
|
2286
|
+
? [Message.from(application.payload)]
|
|
2287
|
+
: decodeMultipart(application.payload),
|
|
2327
2288
|
...(stateful.isPending === undefined ? {} : { isPending: stateful.isPending }),
|
|
2328
2289
|
...(stateful.deadlineUnixMs === undefined ? {} : { deadlineUnixMs: stateful.deadlineUnixMs }),
|
|
2329
2290
|
...(stateful.messageFollowOrigin === undefined
|
|
@@ -2334,19 +2295,18 @@ function decodeStatefulRecord(
|
|
|
2334
2295
|
: { onTerminalCompletion: stateful.onTerminalCompletion }),
|
|
2335
2296
|
reply(parts) {
|
|
2336
2297
|
if (stateful.reply === undefined) return SubmitResult.InvalidState;
|
|
2337
|
-
return stateful.reply(
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
encodeMultipart(parts)
|
|
2341
|
-
) ? SubmitResult.Ok : SubmitResult.InvalidState;
|
|
2298
|
+
return stateful.reply(RequestResult.Ok, 0, encodeMultipart(parts))
|
|
2299
|
+
? SubmitResult.Ok
|
|
2300
|
+
: SubmitResult.InvalidState;
|
|
2342
2301
|
},
|
|
2343
2302
|
replyActorJoin(joinResult, parts, _flags, _replyContentType) {
|
|
2344
2303
|
if (stateful.reply === undefined || stateful.targetSpot === undefined) {
|
|
2345
2304
|
return SubmitResult.InvalidState;
|
|
2346
2305
|
}
|
|
2347
|
-
const membershipEpoch =
|
|
2348
|
-
|
|
2349
|
-
|
|
2306
|
+
const membershipEpoch =
|
|
2307
|
+
stateful.kindData?.kind === 'actorControl'
|
|
2308
|
+
? stateful.kindData.currentMembershipEpoch
|
|
2309
|
+
: undefined;
|
|
2350
2310
|
if (joinResult === 0 && membershipEpoch === undefined) {
|
|
2351
2311
|
return SubmitResult.InvalidState;
|
|
2352
2312
|
}
|
|
@@ -2354,26 +2314,19 @@ function decodeStatefulRecord(
|
|
|
2354
2314
|
if (canonicalActorJoin && replyParts.length > 1) {
|
|
2355
2315
|
return SubmitResult.InvalidState;
|
|
2356
2316
|
}
|
|
2357
|
-
const replyPayload = replyParts.length === 0
|
|
2358
|
-
|
|
2359
|
-
:
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
// valid receive chunk cap for this join's relocation state chunks —
|
|
2371
|
-
// a conservative, recompute-stable bound (never lowered).
|
|
2372
|
-
...(joinResult === 0
|
|
2373
|
-
? { receiveChunkLimitBytes: ACTOR_JOIN_ADVERTISED_RECEIVE_CHUNK_LIMIT_BYTES }
|
|
2374
|
-
: {})
|
|
2375
|
-
}
|
|
2376
|
-
);
|
|
2317
|
+
const replyPayload = replyParts.length === 0 ? undefined : encodeMultipart(replyParts);
|
|
2318
|
+
const accepted = stateful.reply(RequestResult.Ok, 0, replyPayload, {
|
|
2319
|
+
kind: 'actorJoin',
|
|
2320
|
+
joinResult: joinResult === 0 ? 0 : 1,
|
|
2321
|
+
spot: stateful.targetSpot,
|
|
2322
|
+
...(membershipEpoch === undefined ? {} : { membershipEpoch }),
|
|
2323
|
+
// Spec 15 §4.2: the accepted admission reply carries the target's
|
|
2324
|
+
// valid receive chunk cap for this join's relocation state chunks —
|
|
2325
|
+
// a conservative, recompute-stable bound (never lowered).
|
|
2326
|
+
...(joinResult === 0
|
|
2327
|
+
? { receiveChunkLimitBytes: ACTOR_JOIN_ADVERTISED_RECEIVE_CHUNK_LIMIT_BYTES }
|
|
2328
|
+
: {})
|
|
2329
|
+
});
|
|
2377
2330
|
return accepted ? SubmitResult.Ok : SubmitResult.InvalidState;
|
|
2378
2331
|
},
|
|
2379
2332
|
replyFailure(terminalResult, failureCode) {
|
|
@@ -2415,9 +2368,8 @@ function readyOwner(
|
|
|
2415
2368
|
}
|
|
2416
2369
|
if (owner.startsWith('actor:')) {
|
|
2417
2370
|
const separator = owner.indexOf('\0', 'actor:'.length);
|
|
2418
|
-
const actorId =
|
|
2419
|
-
? owner.slice('actor:'.length)
|
|
2420
|
-
: owner.slice('actor:'.length, separator);
|
|
2371
|
+
const actorId =
|
|
2372
|
+
separator < 0 ? owner.slice('actor:'.length) : owner.slice('actor:'.length, separator);
|
|
2421
2373
|
const generation = separator < 0 ? 0n : BigInt(owner.slice(separator + 1));
|
|
2422
2374
|
const current = stateful?.actor(actorId);
|
|
2423
2375
|
return {
|
|
@@ -2442,9 +2394,7 @@ function readyOwner(
|
|
|
2442
2394
|
}
|
|
2443
2395
|
|
|
2444
2396
|
function readyDomain(domain: ServiceMailboxDomain): number {
|
|
2445
|
-
return domain === 'infrastructure'
|
|
2446
|
-
? ReadyDomain.Infrastructure
|
|
2447
|
-
: ReadyDomain.Application;
|
|
2397
|
+
return domain === 'infrastructure' ? ReadyDomain.Infrastructure : ReadyDomain.Application;
|
|
2448
2398
|
}
|
|
2449
2399
|
|
|
2450
2400
|
/**
|
|
@@ -2506,9 +2456,7 @@ function encodeMultipart(parts: MessageLike | readonly MessageLike[]) {
|
|
|
2506
2456
|
};
|
|
2507
2457
|
}
|
|
2508
2458
|
|
|
2509
|
-
function encodeMultipartApplicationFrame(
|
|
2510
|
-
parts: MessageLike | readonly MessageLike[]
|
|
2511
|
-
): Buffer {
|
|
2459
|
+
function encodeMultipartApplicationFrame(parts: MessageLike | readonly MessageLike[]): Buffer {
|
|
2512
2460
|
const values = Array.isArray(parts) ? parts : [parts];
|
|
2513
2461
|
if (values.length === 0) throw new TypeError('Multipart payload must contain at least one part.');
|
|
2514
2462
|
return encodeMultipartApplicationPayload(
|
|
@@ -2553,9 +2501,9 @@ function decodeApplicationEnvelope(frame: Uint8Array) {
|
|
|
2553
2501
|
const payloadLength = bytes.readUInt32BE(offset);
|
|
2554
2502
|
offset += 4;
|
|
2555
2503
|
if (
|
|
2556
|
-
packetName !== MULTIPART_PACKET_NAME
|
|
2557
|
-
|
|
2558
|
-
|
|
2504
|
+
packetName !== MULTIPART_PACKET_NAME ||
|
|
2505
|
+
contentType !== MULTIPART_CONTENT_TYPE ||
|
|
2506
|
+
payloadLength !== bytes.length - offset
|
|
2559
2507
|
) {
|
|
2560
2508
|
throw new ServiceWireProtocolError('Unexpected M6A application payload.');
|
|
2561
2509
|
}
|
|
@@ -2613,7 +2561,8 @@ function messageBytesView(value: MessageLike): Uint8Array {
|
|
|
2613
2561
|
}
|
|
2614
2562
|
|
|
2615
2563
|
function requireRawReadyBatch(batch: ReadyBatch): RawReadyBatch {
|
|
2616
|
-
if (!(batch instanceof RawReadyBatch))
|
|
2564
|
+
if (!(batch instanceof RawReadyBatch))
|
|
2565
|
+
throw new TypeError('Ready batch belongs to another backend.');
|
|
2617
2566
|
return batch;
|
|
2618
2567
|
}
|
|
2619
2568
|
|
|
@@ -2623,12 +2572,16 @@ function stateCode(state: ServiceNodeDescriptor['state']): number {
|
|
|
2623
2572
|
|
|
2624
2573
|
function peerStateCode(state: ServiceNodeDescriptor['state']): number {
|
|
2625
2574
|
switch (state) {
|
|
2626
|
-
case 'preparing':
|
|
2575
|
+
case 'preparing':
|
|
2576
|
+
return 2;
|
|
2627
2577
|
case 'serving':
|
|
2628
|
-
case 'retiring':
|
|
2629
|
-
|
|
2578
|
+
case 'retiring':
|
|
2579
|
+
return 3;
|
|
2580
|
+
case 'draining':
|
|
2581
|
+
return 4;
|
|
2630
2582
|
case 'stopped':
|
|
2631
|
-
case 'error':
|
|
2583
|
+
case 'error':
|
|
2584
|
+
return 5;
|
|
2632
2585
|
}
|
|
2633
2586
|
}
|
|
2634
2587
|
|
|
@@ -2636,8 +2589,7 @@ function createLifecycleGeneration(): bigint {
|
|
|
2636
2589
|
// Node's public Spot context exposes this lifecycle token as a number. Keep
|
|
2637
2590
|
// the opaque equality token within the exact range that surface can carry;
|
|
2638
2591
|
// lifecycle ordering is never inferred from its numeric value.
|
|
2639
|
-
const generation = randomBytes(8).readBigUInt64BE()
|
|
2640
|
-
& BigInt(Number.MAX_SAFE_INTEGER);
|
|
2592
|
+
const generation = randomBytes(8).readBigUInt64BE() & BigInt(Number.MAX_SAFE_INTEGER);
|
|
2641
2593
|
return generation === 0n ? 1n : generation;
|
|
2642
2594
|
}
|
|
2643
2595
|
|