@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,7 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
ServiceNodeDescriptor,
|
|
3
|
-
ServiceObjectRole
|
|
4
|
-
} from './service-topology-registry';
|
|
1
|
+
import type { ServiceNodeDescriptor, ServiceObjectRole } from './service-topology-registry';
|
|
5
2
|
|
|
6
3
|
export function routeMeshConnectionNotRequired(
|
|
7
4
|
localObjectRole: ServiceObjectRole,
|
|
@@ -9,10 +6,12 @@ export function routeMeshConnectionNotRequired(
|
|
|
9
6
|
remoteObjectRole: ServiceObjectRole,
|
|
10
7
|
remoteHasServerChannel: boolean
|
|
11
8
|
): boolean {
|
|
12
|
-
return
|
|
13
|
-
&&
|
|
14
|
-
&&
|
|
15
|
-
&&
|
|
9
|
+
return (
|
|
10
|
+
localObjectRole === 'client' &&
|
|
11
|
+
!localHasServerChannel &&
|
|
12
|
+
remoteObjectRole === 'client' &&
|
|
13
|
+
!remoteHasServerChannel
|
|
14
|
+
);
|
|
16
15
|
}
|
|
17
16
|
|
|
18
17
|
export function descriptorConnectionNotRequired(
|
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
import { ZLinkFrameworkRuntimeState } from '../../contracts';
|
|
2
2
|
|
|
3
3
|
export type MaintenanceAdmissionState =
|
|
4
|
-
| '
|
|
5
|
-
| 'serving'
|
|
6
|
-
| 'retiring'
|
|
7
|
-
| 'draining'
|
|
8
|
-
| 'stopped'
|
|
9
|
-
| 'error';
|
|
4
|
+
'preparing' | 'serving' | 'retiring' | 'draining' | 'stopped' | 'error';
|
|
10
5
|
|
|
11
6
|
export type DiscoveryAvailability =
|
|
12
|
-
| '
|
|
13
|
-
| 'serving'
|
|
14
|
-
| 'retiring'
|
|
15
|
-
| 'stopped'
|
|
16
|
-
| 'error'
|
|
17
|
-
| 'disconnected';
|
|
7
|
+
'preparing' | 'serving' | 'retiring' | 'stopped' | 'error' | 'disconnected';
|
|
18
8
|
|
|
19
9
|
/** Derives public readiness from the public runtime state authority. */
|
|
20
10
|
export function runtimeStateIsReady(state: ZLinkFrameworkRuntimeState): boolean {
|
|
@@ -34,13 +24,19 @@ export function maintenanceAdmissionState(
|
|
|
34
24
|
state: ZLinkFrameworkRuntimeState
|
|
35
25
|
): MaintenanceAdmissionState {
|
|
36
26
|
switch (state) {
|
|
37
|
-
case ZLinkFrameworkRuntimeState.Preparing:
|
|
38
|
-
|
|
27
|
+
case ZLinkFrameworkRuntimeState.Preparing:
|
|
28
|
+
return 'preparing';
|
|
29
|
+
case ZLinkFrameworkRuntimeState.Serving:
|
|
30
|
+
return 'serving';
|
|
39
31
|
case ZLinkFrameworkRuntimeState.Relocating:
|
|
40
|
-
case ZLinkFrameworkRuntimeState.Relocated:
|
|
41
|
-
|
|
42
|
-
case ZLinkFrameworkRuntimeState.
|
|
43
|
-
|
|
32
|
+
case ZLinkFrameworkRuntimeState.Relocated:
|
|
33
|
+
return 'retiring';
|
|
34
|
+
case ZLinkFrameworkRuntimeState.Draining:
|
|
35
|
+
return 'draining';
|
|
36
|
+
case ZLinkFrameworkRuntimeState.Stopped:
|
|
37
|
+
return 'stopped';
|
|
38
|
+
case ZLinkFrameworkRuntimeState.Error:
|
|
39
|
+
return 'error';
|
|
44
40
|
}
|
|
45
41
|
}
|
|
46
42
|
|
|
@@ -49,13 +45,18 @@ export function discoveryAvailabilityForRuntimeState(
|
|
|
49
45
|
state: ZLinkFrameworkRuntimeState
|
|
50
46
|
): Exclude<DiscoveryAvailability, 'disconnected'> {
|
|
51
47
|
switch (state) {
|
|
52
|
-
case ZLinkFrameworkRuntimeState.Preparing:
|
|
53
|
-
|
|
48
|
+
case ZLinkFrameworkRuntimeState.Preparing:
|
|
49
|
+
return 'preparing';
|
|
50
|
+
case ZLinkFrameworkRuntimeState.Serving:
|
|
51
|
+
return 'serving';
|
|
54
52
|
case ZLinkFrameworkRuntimeState.Relocating:
|
|
55
53
|
case ZLinkFrameworkRuntimeState.Relocated:
|
|
56
|
-
case ZLinkFrameworkRuntimeState.Draining:
|
|
57
|
-
|
|
58
|
-
case ZLinkFrameworkRuntimeState.
|
|
54
|
+
case ZLinkFrameworkRuntimeState.Draining:
|
|
55
|
+
return 'retiring';
|
|
56
|
+
case ZLinkFrameworkRuntimeState.Stopped:
|
|
57
|
+
return 'stopped';
|
|
58
|
+
case ZLinkFrameworkRuntimeState.Error:
|
|
59
|
+
return 'error';
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
|
|
@@ -23,7 +23,6 @@ export interface ServiceDecodedInstanceAuthority extends ServiceReadySpotAuthori
|
|
|
23
23
|
readonly state: 'coldActivating' | 'ready' | 'closing';
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
27
26
|
export interface ServiceActivationRecoveryState {
|
|
28
27
|
readonly reference: string;
|
|
29
28
|
readonly sha256: Uint8Array;
|
|
@@ -104,11 +103,10 @@ export function replaceServiceAuthorityRelocationState(
|
|
|
104
103
|
export function encodeServiceUserSpotAuthorityPayload(
|
|
105
104
|
value: ServiceUserSpotAuthorityPayload
|
|
106
105
|
): Buffer {
|
|
107
|
-
const spot = conditional(
|
|
108
|
-
|
|
109
|
-
text8(value.stableType, 'stableType'),
|
|
110
|
-
|
|
111
|
-
));
|
|
106
|
+
const spot = conditional(
|
|
107
|
+
2,
|
|
108
|
+
concat(rid(value.spotId, 'spotId'), text8(value.stableType, 'stableType'), Buffer.of(1))
|
|
109
|
+
);
|
|
112
110
|
const object = conditional(2, spot);
|
|
113
111
|
const body = concat(
|
|
114
112
|
Buffer.of(value.state === 'creating' ? 1 : value.state === 'closing' ? 3 : 0),
|
|
@@ -137,28 +135,29 @@ export function encodeServiceInstanceAuthorityPayload(
|
|
|
137
135
|
if (value.activationRecovery !== undefined && value.state !== 'ready') {
|
|
138
136
|
throw new RangeError('activationRecovery is allowed only on a Ready Instance Spot authority.');
|
|
139
137
|
}
|
|
140
|
-
const instanceBody = concat(
|
|
141
|
-
text8(value.stableType, 'stableType'),
|
|
142
|
-
rid(value.spotId, 'spotId')
|
|
143
|
-
);
|
|
138
|
+
const instanceBody = concat(text8(value.stableType, 'stableType'), rid(value.spotId, 'spotId'));
|
|
144
139
|
const instance = conditional(
|
|
145
140
|
value.state === 'coldActivating' ? 1 : value.state === 'closing' ? 3 : 2,
|
|
146
141
|
instanceBody
|
|
147
142
|
);
|
|
148
143
|
const spot = conditional(3, instance);
|
|
149
144
|
const object = conditional(2, spot);
|
|
150
|
-
const activationRecovery =
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
145
|
+
const activationRecovery =
|
|
146
|
+
value.activationRecovery === undefined
|
|
147
|
+
? conditional32(0, Buffer.alloc(0))
|
|
148
|
+
: conditional32(
|
|
149
|
+
1,
|
|
150
|
+
concat(
|
|
151
|
+
text16(value.activationRecovery.reference, 'activationRecovery.reference'),
|
|
152
|
+
sha256(value.activationRecovery.sha256),
|
|
153
|
+
boundedU32(value.activationRecovery.encodedSize, 'activationRecovery.encodedSize'),
|
|
154
|
+
u64(value.activationRecovery.inboxSequence, 'activationRecovery.inboxSequence'),
|
|
155
|
+
ordinalU64(value.activationRecovery.replayCursor, 'activationRecovery.replayCursor')
|
|
156
|
+
)
|
|
157
|
+
);
|
|
159
158
|
if (
|
|
160
|
-
value.activationRecovery !== undefined
|
|
161
|
-
|
|
159
|
+
value.activationRecovery !== undefined &&
|
|
160
|
+
value.activationRecovery.replayCursor > value.activationRecovery.inboxSequence
|
|
162
161
|
) {
|
|
163
162
|
throw new RangeError('activationRecovery.replayCursor must not exceed inboxSequence.');
|
|
164
163
|
}
|
|
@@ -187,9 +186,7 @@ export function decodeServiceReadySpotAuthority(
|
|
|
187
186
|
payload: Uint8Array
|
|
188
187
|
): ServiceReadySpotAuthority | undefined {
|
|
189
188
|
const decoded = decodeSpotAuthority(payload);
|
|
190
|
-
return decoded?.state === 'ready' && decoded.operationKind === 0
|
|
191
|
-
? decoded
|
|
192
|
-
: undefined;
|
|
189
|
+
return decoded?.state === 'ready' && decoded.operationKind === 0 ? decoded : undefined;
|
|
193
190
|
}
|
|
194
191
|
|
|
195
192
|
export function decodeServiceInstanceAuthorityPayload(
|
|
@@ -197,11 +194,11 @@ export function decodeServiceInstanceAuthorityPayload(
|
|
|
197
194
|
): ServiceDecodedInstanceAuthority | undefined {
|
|
198
195
|
const decoded = decodeSpotAuthority(payload);
|
|
199
196
|
if (
|
|
200
|
-
decoded?.kind !== 'instance_spot'
|
|
201
|
-
|
|
202
|
-
decoded.state === 'coldActivating' && decoded.operationKind === 1
|
|
203
|
-
|
|
204
|
-
|
|
197
|
+
decoded?.kind !== 'instance_spot' ||
|
|
198
|
+
!(
|
|
199
|
+
(decoded.state === 'coldActivating' && decoded.operationKind === 1) ||
|
|
200
|
+
(decoded.state === 'ready' && decoded.operationKind === 0) ||
|
|
201
|
+
(decoded.state === 'closing' && decoded.operationKind === 3)
|
|
205
202
|
)
|
|
206
203
|
) {
|
|
207
204
|
return undefined;
|
|
@@ -260,13 +257,14 @@ function encodeRewrittenServiceAuthority(
|
|
|
260
257
|
ownerNodeGeneration: target.nodeGeneration
|
|
261
258
|
};
|
|
262
259
|
if (decoded.kind === 'user_spot') {
|
|
263
|
-
const state =
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
260
|
+
const state =
|
|
261
|
+
decoded.operationKind === 0
|
|
262
|
+
? 'ready'
|
|
263
|
+
: decoded.operationKind === 1
|
|
264
|
+
? 'creating'
|
|
265
|
+
: decoded.operationKind === 3
|
|
266
|
+
? 'closing'
|
|
267
|
+
: undefined;
|
|
270
268
|
return state === undefined
|
|
271
269
|
? undefined
|
|
272
270
|
: encodeServiceUserSpotAuthorityPayload({ ...common, state });
|
|
@@ -281,12 +279,12 @@ function encodeRewrittenServiceAuthority(
|
|
|
281
279
|
});
|
|
282
280
|
}
|
|
283
281
|
|
|
284
|
-
function decodeSpotAuthority(
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
282
|
+
function decodeSpotAuthority(payload: Uint8Array):
|
|
283
|
+
| (ServiceReadySpotAuthority & {
|
|
284
|
+
readonly state: 'coldActivating' | 'ready' | 'closing' | 'other';
|
|
285
|
+
readonly operationKind: number;
|
|
286
|
+
})
|
|
287
|
+
| undefined {
|
|
290
288
|
try {
|
|
291
289
|
const reader = new AuthorityReader(payload);
|
|
292
290
|
reader.expect(AUTHORITY_MAGIC);
|
|
@@ -356,27 +354,26 @@ function decodeSpotAuthority(
|
|
|
356
354
|
};
|
|
357
355
|
}
|
|
358
356
|
if (
|
|
359
|
-
activationRecovery !== undefined
|
|
360
|
-
|
|
361
|
-
kind !== 'instance_spot'
|
|
362
|
-
|| state !== 2
|
|
363
|
-
|| operationKind !== 0
|
|
364
|
-
)
|
|
357
|
+
activationRecovery !== undefined &&
|
|
358
|
+
(kind !== 'instance_spot' || state !== 2 || operationKind !== 0)
|
|
365
359
|
) {
|
|
366
360
|
return undefined;
|
|
367
361
|
}
|
|
368
362
|
if (!activationRecoveryBody.done || !body.done) return undefined;
|
|
369
363
|
return {
|
|
370
364
|
kind,
|
|
371
|
-
state:
|
|
372
|
-
|
|
373
|
-
?
|
|
374
|
-
|
|
365
|
+
state:
|
|
366
|
+
kind === 'instance_spot'
|
|
367
|
+
? state === 1
|
|
368
|
+
? 'coldActivating'
|
|
369
|
+
: state === 2
|
|
370
|
+
? 'ready'
|
|
371
|
+
: state === 3
|
|
372
|
+
? 'closing'
|
|
373
|
+
: 'other'
|
|
374
|
+
: state === 1
|
|
375
375
|
? 'ready'
|
|
376
|
-
:
|
|
377
|
-
? 'closing'
|
|
378
|
-
: 'other'
|
|
379
|
-
: state === 1 ? 'ready' : 'other',
|
|
376
|
+
: 'other',
|
|
380
377
|
operationKind,
|
|
381
378
|
stableType,
|
|
382
379
|
spotId,
|
|
@@ -469,7 +466,7 @@ function ordinalU64(value: bigint, name: string): Buffer {
|
|
|
469
466
|
}
|
|
470
467
|
|
|
471
468
|
function concat(...parts: readonly Uint8Array[]): Buffer {
|
|
472
|
-
return Buffer.concat(parts.map(part => Buffer.from(part)));
|
|
469
|
+
return Buffer.concat(parts.map((part) => Buffer.from(part)));
|
|
473
470
|
}
|
|
474
471
|
|
|
475
472
|
class AuthorityReader {
|
|
@@ -33,15 +33,20 @@ export interface SelectedClientServer {
|
|
|
33
33
|
export class ServiceDiscoveryRegistry {
|
|
34
34
|
private readonly clientServers = new Map<string, Current<ClientServerDescriptor>>();
|
|
35
35
|
private readonly fanoutPublishers = new Map<string, Current<FanoutPublisherDescriptor>>();
|
|
36
|
-
private readonly clientServerSelections = new Map<
|
|
36
|
+
private readonly clientServerSelections = new Map<
|
|
37
|
+
string,
|
|
38
|
+
SmoothWeightedSelection<SelectedClientServer>
|
|
39
|
+
>();
|
|
37
40
|
|
|
38
41
|
admitClientServer(descriptor: ClientServerDescriptor, connectionId: string): boolean {
|
|
39
42
|
validateClientServer(descriptor);
|
|
40
43
|
const key = `${descriptor.channelName}\0${descriptor.serverRoutingId}`;
|
|
41
44
|
const current = this.clientServers.get(key);
|
|
42
|
-
if (
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
if (
|
|
46
|
+
current !== undefined &&
|
|
47
|
+
current.descriptor.state === 'disconnected' &&
|
|
48
|
+
sameClientServerDescriptorExceptState(current.descriptor, descriptor)
|
|
49
|
+
) {
|
|
45
50
|
this.clientServers.set(key, { descriptor: { ...descriptor }, connectionId });
|
|
46
51
|
this.invalidateClientServerCandidates(descriptor.channelName);
|
|
47
52
|
return true;
|
|
@@ -69,12 +74,12 @@ export class ServiceDiscoveryRegistry {
|
|
|
69
74
|
return true;
|
|
70
75
|
}
|
|
71
76
|
|
|
72
|
-
removeClientServer(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
removeClientServer(channelName: string, serverRoutingId: string, connectionId: string): boolean {
|
|
78
|
+
const removed = removeCurrent(
|
|
79
|
+
this.clientServers,
|
|
80
|
+
`${channelName}\0${serverRoutingId}`,
|
|
81
|
+
connectionId
|
|
82
|
+
);
|
|
78
83
|
if (removed) this.invalidateClientServerCandidates(channelName);
|
|
79
84
|
return removed;
|
|
80
85
|
}
|
|
@@ -98,10 +103,10 @@ export class ServiceDiscoveryRegistry {
|
|
|
98
103
|
|
|
99
104
|
clientServerDescriptors(channelName: string): readonly ClientServerDescriptor[] {
|
|
100
105
|
return [...this.clientServers.values()]
|
|
101
|
-
.map(value => value.descriptor)
|
|
102
|
-
.filter(value => value.channelName === channelName)
|
|
106
|
+
.map((value) => value.descriptor)
|
|
107
|
+
.filter((value) => value.channelName === channelName)
|
|
103
108
|
.sort((left, right) => compareOrdinal(left.serverRoutingId, right.serverRoutingId))
|
|
104
|
-
.map(value => ({ ...value }));
|
|
109
|
+
.map((value) => ({ ...value }));
|
|
105
110
|
}
|
|
106
111
|
|
|
107
112
|
admitFanoutPublisher(descriptor: FanoutPublisherDescriptor, connectionId: string): boolean {
|
|
@@ -128,30 +133,23 @@ export class ServiceDiscoveryRegistry {
|
|
|
128
133
|
|
|
129
134
|
fanoutEndpoints(channelName: string): readonly FanoutPublisherDescriptor[] {
|
|
130
135
|
return [...this.fanoutPublishers.values()]
|
|
131
|
-
.map(value => value.descriptor)
|
|
132
|
-
.filter(value => value.channelName === channelName && value.state === 'serving')
|
|
136
|
+
.map((value) => value.descriptor)
|
|
137
|
+
.filter((value) => value.channelName === channelName && value.state === 'serving')
|
|
133
138
|
.sort((left, right) => left.publisherRoutingId.localeCompare(right.publisherRoutingId))
|
|
134
|
-
.map(value => ({ ...value }));
|
|
139
|
+
.map((value) => ({ ...value }));
|
|
135
140
|
}
|
|
136
141
|
|
|
137
|
-
private admit<
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
descriptor: T,
|
|
141
|
-
connectionId: string
|
|
142
|
-
): boolean {
|
|
142
|
+
private admit<
|
|
143
|
+
T extends { readonly lifecycleGeneration: bigint; readonly descriptorRevision: bigint }
|
|
144
|
+
>(rows: Map<string, Current<T>>, key: string, descriptor: T, connectionId: string): boolean {
|
|
143
145
|
requireText(connectionId, 'connectionId');
|
|
144
146
|
const current = rows.get(key);
|
|
145
147
|
if (
|
|
146
|
-
current !== undefined
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
current.descriptor.descriptorRevision
|
|
150
|
-
|
|
151
|
-
current.descriptor.descriptorRevision === descriptor.descriptorRevision
|
|
152
|
-
&& !sameDescriptor(current.descriptor, descriptor)
|
|
153
|
-
)
|
|
154
|
-
)
|
|
148
|
+
current !== undefined &&
|
|
149
|
+
current.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration &&
|
|
150
|
+
(current.descriptor.descriptorRevision > descriptor.descriptorRevision ||
|
|
151
|
+
(current.descriptor.descriptorRevision === descriptor.descriptorRevision &&
|
|
152
|
+
!sameDescriptor(current.descriptor, descriptor)))
|
|
155
153
|
) {
|
|
156
154
|
return false;
|
|
157
155
|
}
|
|
@@ -167,13 +165,16 @@ export class ServiceDiscoveryRegistry {
|
|
|
167
165
|
|
|
168
166
|
private clientServerCandidates(channelName: string) {
|
|
169
167
|
return [...this.clientServers.values()]
|
|
170
|
-
.filter(
|
|
171
|
-
value
|
|
172
|
-
|
|
173
|
-
|
|
168
|
+
.filter(
|
|
169
|
+
(value) =>
|
|
170
|
+
value.descriptor.channelName === channelName &&
|
|
171
|
+
value.descriptor.state === 'serving' &&
|
|
172
|
+
value.descriptor.weight > 0
|
|
173
|
+
)
|
|
174
174
|
.sort((left, right) =>
|
|
175
|
-
compareOrdinal(left.descriptor.serverRoutingId, right.descriptor.serverRoutingId)
|
|
176
|
-
|
|
175
|
+
compareOrdinal(left.descriptor.serverRoutingId, right.descriptor.serverRoutingId)
|
|
176
|
+
)
|
|
177
|
+
.map((value) => ({
|
|
177
178
|
id: value.descriptor.serverRoutingId,
|
|
178
179
|
weight: value.descriptor.weight,
|
|
179
180
|
value: Object.freeze({
|
|
@@ -188,33 +189,37 @@ function compareOrdinal(left: string, right: string): number {
|
|
|
188
189
|
return left < right ? -1 : left > right ? 1 : 0;
|
|
189
190
|
}
|
|
190
191
|
|
|
191
|
-
function sameDescriptor<
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
192
|
+
function sameDescriptor<
|
|
193
|
+
T extends { readonly lifecycleGeneration: bigint; readonly descriptorRevision: bigint }
|
|
194
|
+
>(left: T, right: T): boolean {
|
|
195
|
+
return (
|
|
196
|
+
JSON.stringify({
|
|
197
|
+
...left,
|
|
198
|
+
lifecycleGeneration: left.lifecycleGeneration.toString(),
|
|
199
|
+
descriptorRevision: left.descriptorRevision.toString()
|
|
200
|
+
}) ===
|
|
201
|
+
JSON.stringify({
|
|
202
|
+
...right,
|
|
203
|
+
lifecycleGeneration: right.lifecycleGeneration.toString(),
|
|
204
|
+
descriptorRevision: right.descriptorRevision.toString()
|
|
205
|
+
})
|
|
206
|
+
);
|
|
204
207
|
}
|
|
205
208
|
|
|
206
209
|
function sameClientServerDescriptorExceptState(
|
|
207
210
|
left: ClientServerDescriptor,
|
|
208
211
|
right: ClientServerDescriptor
|
|
209
212
|
): boolean {
|
|
210
|
-
return
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
213
|
+
return (
|
|
214
|
+
left.channelName === right.channelName &&
|
|
215
|
+
left.serverRoutingId === right.serverRoutingId &&
|
|
216
|
+
left.lifecycleGeneration === right.lifecycleGeneration &&
|
|
217
|
+
left.descriptorRevision === right.descriptorRevision &&
|
|
218
|
+
left.weight === right.weight &&
|
|
219
|
+
left.securityIdentity === right.securityIdentity &&
|
|
220
|
+
left.effectiveMaxMessageBytes === right.effectiveMaxMessageBytes &&
|
|
221
|
+
left.advertisedEndpoint === right.advertisedEndpoint
|
|
222
|
+
);
|
|
218
223
|
}
|
|
219
224
|
|
|
220
225
|
function removeCurrent<T>(
|
|
@@ -237,7 +242,10 @@ function validateClientServer(descriptor: ClientServerDescriptor): void {
|
|
|
237
242
|
if (!Number.isInteger(descriptor.weight) || descriptor.weight < 0 || descriptor.weight > 10_000) {
|
|
238
243
|
throw new RangeError('ClientServer weight must be an integer in 0..10000.');
|
|
239
244
|
}
|
|
240
|
-
if (
|
|
245
|
+
if (
|
|
246
|
+
!Number.isSafeInteger(descriptor.effectiveMaxMessageBytes) ||
|
|
247
|
+
descriptor.effectiveMaxMessageBytes < 1
|
|
248
|
+
) {
|
|
241
249
|
throw new RangeError('ClientServer message bound must be positive.');
|
|
242
250
|
}
|
|
243
251
|
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { crc32c } from './service-relocation-runtime';
|
|
2
|
-
import {
|
|
3
|
-
validateApplicationPayloadFrame
|
|
4
|
-
} from './service-wire-m6a-codec';
|
|
2
|
+
import { validateApplicationPayloadFrame } from './service-wire-m6a-codec';
|
|
5
3
|
import type { ServiceInstanceActivationTarget } from './service-stateful-wire-codec';
|
|
6
4
|
import { validateServiceMetadataFrame } from './service-metadata-codec';
|
|
7
5
|
|
|
@@ -36,9 +34,8 @@ export function encodeInstanceActivationRecoveryEnvelope(
|
|
|
36
34
|
const targetNodeRid = textBytes(value.target.targetNodeRid, 'targetNodeRid');
|
|
37
35
|
const descriptorVersion = textBytes(value.target.descriptorVersion, 'targetDescriptorVersion');
|
|
38
36
|
const sourceNodeRid = textBytes(value.sourceNodeRid, 'sourceNodeRid');
|
|
39
|
-
const sourceSpotId =
|
|
40
|
-
? undefined
|
|
41
|
-
: textBytes(value.sourceSpotId, 'sourceSpotId');
|
|
37
|
+
const sourceSpotId =
|
|
38
|
+
value.sourceSpotId === undefined ? undefined : textBytes(value.sourceSpotId, 'sourceSpotId');
|
|
42
39
|
validatePositiveU64(value.target.targetNodeGeneration, 'targetNodeGeneration');
|
|
43
40
|
validatePositiveU64(value.sourceNodeGeneration, 'sourceNodeGeneration');
|
|
44
41
|
validateU64(value.operation.high, 'operation.high');
|
|
@@ -47,26 +44,29 @@ export function encodeInstanceActivationRecoveryEnvelope(
|
|
|
47
44
|
validatePositiveU64(value.replyRouteId!, 'replyRouteId');
|
|
48
45
|
}
|
|
49
46
|
validatePositiveU64(value.deadlineUnixMs, 'deadlineUnixMs');
|
|
50
|
-
const metadataFrame =
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
const metadataFrame =
|
|
48
|
+
value.metadataFrame === undefined
|
|
49
|
+
? undefined
|
|
50
|
+
: validateServiceMetadataFrame(value.metadataFrame);
|
|
53
51
|
const bodyLength =
|
|
54
|
-
text8Size(targetSpotId)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
+
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
+
|
|
62
|
-
|
|
63
|
-
+
|
|
64
|
-
+
|
|
65
|
-
+
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
+
|
|
52
|
+
text8Size(targetSpotId) +
|
|
53
|
+
text8Size(stableType) +
|
|
54
|
+
text8Size(targetMeshName) +
|
|
55
|
+
text8Size(targetNodeRid) +
|
|
56
|
+
8 +
|
|
57
|
+
text8Size(descriptorVersion) +
|
|
58
|
+
text8Size(sourceNodeRid) +
|
|
59
|
+
8 +
|
|
60
|
+
1 +
|
|
61
|
+
(sourceSpotId === undefined ? 0 : text8Size(sourceSpotId)) +
|
|
62
|
+
1 +
|
|
63
|
+
8 +
|
|
64
|
+
8 +
|
|
65
|
+
(value.operationKind === 'request' ? 8 : 0) +
|
|
66
|
+
8 +
|
|
67
|
+
1 +
|
|
68
|
+
(metadataFrame?.byteLength ?? 0) +
|
|
69
|
+
value.applicationPayloadFrame.byteLength;
|
|
70
70
|
const envelopeLength = 4 + 1 + 2 + 4 + bodyLength;
|
|
71
71
|
const encodedLength = envelopeLength + 4;
|
|
72
72
|
if (encodedLength > MAX_ENCODED_BYTES) {
|
|
@@ -157,9 +157,7 @@ export function decodeInstanceActivationRecoveryEnvelope(
|
|
|
157
157
|
if (hasMetadata !== 0 && hasMetadata !== 1) {
|
|
158
158
|
throw new TypeError('Instance activation recovery metadata flag is invalid.');
|
|
159
159
|
}
|
|
160
|
-
const metadataFrame = hasMetadata === 1
|
|
161
|
-
? body.metadataFrame()
|
|
162
|
-
: undefined;
|
|
160
|
+
const metadataFrame = hasMetadata === 1 ? body.metadataFrame() : undefined;
|
|
163
161
|
const applicationPayloadFrame = body.takeRemaining();
|
|
164
162
|
validateApplicationPayloadFrame(applicationPayloadFrame);
|
|
165
163
|
if (!body.done) {
|
|
@@ -293,7 +291,8 @@ class RecoveryReader {
|
|
|
293
291
|
optionalText8(): string | undefined {
|
|
294
292
|
const present = this.u8();
|
|
295
293
|
if (present === 0) return undefined;
|
|
296
|
-
if (present !== 1)
|
|
294
|
+
if (present !== 1)
|
|
295
|
+
throw new TypeError('Instance activation recovery optional flag is invalid.');
|
|
297
296
|
return this.text8();
|
|
298
297
|
}
|
|
299
298
|
|
|
@@ -30,10 +30,10 @@ export class ServiceLivenessRegistry {
|
|
|
30
30
|
private readonly peerTimeoutMs = DEFAULT_SERVICE_PEER_TIMEOUT_MS
|
|
31
31
|
) {
|
|
32
32
|
if (
|
|
33
|
-
!Number.isFinite(probeIntervalMs)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
!Number.isFinite(probeIntervalMs) ||
|
|
34
|
+
probeIntervalMs <= 0 ||
|
|
35
|
+
!Number.isFinite(peerTimeoutMs) ||
|
|
36
|
+
peerTimeoutMs <= probeIntervalMs
|
|
37
37
|
) {
|
|
38
38
|
throw new RangeError('Liveness requires a positive probe interval and a larger timeout.');
|
|
39
39
|
}
|
|
@@ -55,11 +55,12 @@ export class ServiceLivenessRegistry {
|
|
|
55
55
|
requestProbe(nodeRoutingId: string, connectionId: string, nowMs: number): boolean {
|
|
56
56
|
const current = this.peers.get(nodeRoutingId);
|
|
57
57
|
if (
|
|
58
|
-
current === undefined
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
)
|
|
58
|
+
current === undefined ||
|
|
59
|
+
current.connectionId !== connectionId ||
|
|
60
|
+
current.ready ||
|
|
61
|
+
current.outstandingProbe !== undefined
|
|
62
|
+
)
|
|
63
|
+
return false;
|
|
63
64
|
current.nextProbeMs = Math.min(current.nextProbeMs, nowMs);
|
|
64
65
|
return true;
|
|
65
66
|
}
|
|
@@ -79,9 +80,9 @@ export class ServiceLivenessRegistry {
|
|
|
79
80
|
): boolean {
|
|
80
81
|
const current = this.peers.get(nodeRoutingId);
|
|
81
82
|
if (
|
|
82
|
-
current === undefined
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
current === undefined ||
|
|
84
|
+
current.connectionId !== connectionId ||
|
|
85
|
+
current.outstandingProbe !== probeId
|
|
85
86
|
) {
|
|
86
87
|
return false;
|
|
87
88
|
}
|
|
@@ -114,7 +115,11 @@ export class ServiceLivenessRegistry {
|
|
|
114
115
|
}
|
|
115
116
|
if (peer.nextProbeMs > nowMs) continue;
|
|
116
117
|
peer.outstandingProbe ??= this.allocateProbeId();
|
|
117
|
-
probes.push({
|
|
118
|
+
probes.push({
|
|
119
|
+
nodeRoutingId,
|
|
120
|
+
connectionId: peer.connectionId,
|
|
121
|
+
probeId: peer.outstandingProbe
|
|
122
|
+
});
|
|
118
123
|
do {
|
|
119
124
|
peer.nextProbeMs += this.probeIntervalMs;
|
|
120
125
|
} while (peer.nextProbeMs <= nowMs);
|