@zlink-systems/framework 0.30.1 → 0.30.2
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/ZLinkEncodedPayload.d.ts +6 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
- package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
- package/dist/contracts/Common/encoded-payload-storage.js +5 -2
- package/dist/contracts/Configuration/Builders.d.ts +1 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
- package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
- package/dist/contracts/Locations/Rows.d.ts +2 -0
- package/dist/contracts/Spots/Contracts.d.ts +4 -0
- package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
- package/dist/runtime/abort.d.ts +5 -0
- package/dist/runtime/abort.js +10 -0
- package/dist/runtime/actors/actor-authority-publication.js +3 -2
- package/dist/runtime/actors/actor-client.d.ts +0 -1
- package/dist/runtime/actors/actor-client.js +38 -45
- package/dist/runtime/actors/actor-context.d.ts +2 -0
- package/dist/runtime/actors/actor-context.js +46 -9
- package/dist/runtime/actors/actor-handoff.d.ts +7 -3
- package/dist/runtime/actors/actor-handoff.js +212 -88
- package/dist/runtime/actors/actor-join-relocation.d.ts +2 -0
- package/dist/runtime/actors/actor-local-native-join.js +4 -0
- package/dist/runtime/actors/actor-mailbox.js +27 -1
- package/dist/runtime/actors/actor-remote-joiner.js +3 -1
- package/dist/runtime/actors/actor-reply.d.ts +4 -0
- package/dist/runtime/actors/actor-reply.js +29 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-state.js +2 -20
- package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
- package/dist/runtime/actors/index.d.ts +6 -2
- package/dist/runtime/actors/index.js +37 -21
- package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
- package/dist/runtime/actors/session-disconnected-wire.js +48 -0
- package/dist/runtime/admission.d.ts +9 -1
- package/dist/runtime/admission.js +55 -32
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +13 -0
- package/dist/runtime/application-jobs/application-job-queue-scope.js +27 -1
- package/dist/runtime/application-jobs/contracts.d.ts +2 -0
- package/dist/runtime/backend/contracts/index.d.ts +19 -3
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
- package/dist/runtime/backend/mesh-completion-table.js +5 -0
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +26 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +193 -107
- package/dist/runtime/backend/node/node-raw-binding-port.js +90 -58
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +33 -8
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +142 -143
- package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +5 -5
- package/dist/runtime/channels/channel-clients.d.ts +1 -0
- package/dist/runtime/channels/channel-clients.js +20 -5
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +22 -3
- package/dist/runtime/channels/channel-dispatch-pipeline.js +103 -57
- package/dist/runtime/channels/channel-dispatchers.d.ts +3 -2
- package/dist/runtime/channels/channel-dispatchers.js +44 -37
- package/dist/runtime/channels/channel-envelope.d.ts +1 -0
- package/dist/runtime/channels/channel-envelope.js +74 -31
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
- package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
- package/dist/runtime/channels/channel-runtime-manager.d.ts +3 -2
- package/dist/runtime/channels/channel-runtime-manager.js +4 -4
- package/dist/runtime/channels/channel-transports.d.ts +0 -1
- package/dist/runtime/channels/channel-transports.js +35 -33
- package/dist/runtime/channels/client-server-location-runtime.js +5 -4
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/fanout-location-runtime.js +3 -3
- package/dist/runtime/diagnostics/flow-context.js +19 -7
- package/dist/runtime/diagnostics/index.js +4 -9
- package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
- package/dist/runtime/diagnostics/message-flow.js +35 -5
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
- package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
- package/dist/runtime/execution/index.d.ts +4 -2
- package/dist/runtime/execution/index.js +33 -10
- package/dist/runtime/execution/serial-execution-queue.d.ts +4 -0
- package/dist/runtime/execution/serial-execution-queue.js +21 -2
- package/dist/runtime/execution/state-lane.d.ts +2 -0
- package/dist/runtime/execution/state-lane.js +5 -0
- package/dist/runtime/foundation/operation-registry.d.ts +25 -1
- package/dist/runtime/foundation/operation-registry.js +86 -18
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +39 -3
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +151 -55
- package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
- package/dist/runtime/foundation/service-liveness-registry.js +38 -0
- package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
- package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -3
- package/dist/runtime/foundation/service-relocation-object-owner.js +48 -35
- package/dist/runtime/foundation/service-relocation-runtime.js +7 -3
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +8 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
- package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
- package/dist/runtime/foundation/service-stateful-registry.js +24 -26
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +72 -6
- package/dist/runtime/foundation/service-stateful-runtime.js +444 -117
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -1
- package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
- package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +10 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +166 -53
- package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
- package/dist/runtime/host/actor-packet-relay.js +59 -72
- package/dist/runtime/host/actor-placement-coordinator.js +25 -8
- package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
- package/dist/runtime/host/actor-transfer-runtime.js +85 -331
- package/dist/runtime/host/application-job-queue.d.ts +24 -3
- package/dist/runtime/host/application-job-queue.js +28 -41
- package/dist/runtime/host/index.d.ts +5 -1
- package/dist/runtime/host/index.js +171 -97
- package/dist/runtime/host/location-runtime-owner.js +2 -6
- package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
- package/dist/runtime/host/mesh-router-resolver.js +14 -6
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
- package/dist/runtime/host/remote-bound-session-relay.js +71 -190
- package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
- package/dist/runtime/host/route-mesh-runtime.js +5 -3
- package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
- package/dist/runtime/host/runtime-shutdown.js +3 -2
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +17 -7
- package/dist/runtime/host/service-relocation-host-runtime.js +550 -367
- package/dist/runtime/host/spot-runtime-options-factory.js +15 -7
- package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
- package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
- package/dist/runtime/locations/auto-connect-loop.js +22 -14
- package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
- package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
- package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
- package/dist/runtime/locations/descriptor-publication.js +11 -0
- package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
- package/dist/runtime/locations/in-memory-authority-store.js +56 -19
- package/dist/runtime/locations/in-memory-location-store.js +1 -10
- package/dist/runtime/locations/index.d.ts +1 -0
- package/dist/runtime/locations/index.js +1 -0
- package/dist/runtime/locations/lease-tracker.js +1 -6
- package/dist/runtime/locations/location-store-repository.d.ts +51 -1
- package/dist/runtime/locations/location-store-repository.js +363 -139
- package/dist/runtime/locations/relocation-blob.d.ts +18 -1
- package/dist/runtime/locations/relocation-blob.js +52 -1
- package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
- package/dist/runtime/locations/request-source-resolver.js +80 -0
- package/dist/runtime/locations/resolvers.js +1 -1
- package/dist/runtime/locations/runtime.d.ts +6 -2
- package/dist/runtime/locations/runtime.js +37 -30
- package/dist/runtime/messaging/payload-codec.d.ts +7 -1
- package/dist/runtime/messaging/payload-codec.js +7 -6
- package/dist/runtime/messaging/request-result.js +29 -26
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +19 -1
- package/dist/runtime/protocol/service_wire_codec.generated.js +85 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +7 -1
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +23 -7
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +3 -2
- package/dist/runtime/spots/index.d.ts +18 -11
- package/dist/runtime/spots/index.js +234 -176
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
- package/dist/runtime/spots/spot-activation-registry.js +21 -11
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +7 -7
- package/dist/runtime/spots/spot-activation.d.ts +6 -3
- package/dist/runtime/spots/spot-activation.js +123 -44
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
- package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-membership.js +0 -8
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
- package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
- package/dist/runtime/spots/spot-entry-activation.js +14 -9
- package/dist/runtime/spots/spot-handler-registry.d.ts +4 -3
- package/dist/runtime/spots/spot-handler-registry.js +6 -2
- package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
- package/dist/runtime/spots/spot-manager-public.js +2 -2
- package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
- package/dist/runtime/spots/spot-node-autoconnect.js +18 -39
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
- package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
- package/dist/runtime/spots/spot-outbound.js +3 -3
- package/dist/runtime/spots/spot-remote-codec.js +5 -1
- package/dist/runtime/spots/spot-runtime-ports.d.ts +0 -1
- package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
- package/dist/runtime/spots/spot-serial-executor.js +61 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
- package/dist/runtime/spots/spot-subscription-dispatch.js +1 -1
- package/dist/runtime/spots/spot-timer.d.ts +57 -5
- package/dist/runtime/spots/spot-timer.js +287 -103
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
- package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
- package/dist/runtime/streams/bound-session-service.d.ts +1 -1
- package/dist/runtime/streams/bound-session-service.js +6 -11
- package/dist/runtime/streams/index.d.ts +3 -2
- package/dist/runtime/streams/index.js +6 -4
- package/dist/runtime/streams/managed-stream.js +3 -2
- package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
- package/dist/runtime/streams/session-actor-coordinator.js +15 -32
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
- package/dist/runtime/streams/stream-session-runtime.js +1 -4
- package/dist/runtime/workers/index.js +1 -1
- package/package.json +3 -3
- package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
- package/src/contracts/Common/encoded-payload-storage.ts +6 -3
- package/src/contracts/Configuration/Builders.ts +4 -1
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
- package/src/contracts/Locations/Rows.ts +2 -0
- package/src/contracts/Spots/Contracts.ts +8 -0
- package/src/contracts/Spots/ZLinkSpot.ts +3 -3
- package/src/runtime/abort.ts +12 -0
- package/src/runtime/actors/actor-authority-publication.ts +3 -2
- package/src/runtime/actors/actor-client.ts +61 -70
- package/src/runtime/actors/actor-context.ts +49 -9
- package/src/runtime/actors/actor-handoff.ts +282 -106
- package/src/runtime/actors/actor-join-relocation.ts +2 -0
- package/src/runtime/actors/actor-local-native-join.ts +4 -0
- package/src/runtime/actors/actor-mailbox.ts +40 -2
- package/src/runtime/actors/actor-remote-joiner.ts +6 -1
- package/src/runtime/actors/actor-reply.ts +42 -0
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
- package/src/runtime/actors/actor-runtime-state.ts +2 -20
- package/src/runtime/actors/actor-source-transfer.ts +1 -34
- package/src/runtime/actors/index.ts +41 -27
- package/src/runtime/actors/session-disconnected-wire.ts +66 -0
- package/src/runtime/admission.ts +69 -34
- package/src/runtime/application-jobs/application-job-queue-scope.ts +33 -1
- package/src/runtime/application-jobs/contracts.ts +2 -0
- package/src/runtime/backend/contracts/index.ts +39 -4
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
- package/src/runtime/backend/mesh-completion-table.ts +4 -0
- package/src/runtime/backend/mesh-dispatch-pump.ts +223 -124
- package/src/runtime/backend/node/node-raw-binding-port.ts +106 -70
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +221 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -5
- package/src/runtime/channels/channel-clients.ts +49 -24
- package/src/runtime/channels/channel-dispatch-pipeline.ts +173 -124
- package/src/runtime/channels/channel-dispatchers.ts +116 -72
- package/src/runtime/channels/channel-envelope.ts +105 -36
- package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
- package/src/runtime/channels/channel-runtime-manager.ts +12 -5
- package/src/runtime/channels/channel-transports.ts +49 -58
- package/src/runtime/channels/client-server-location-runtime.ts +11 -10
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
- package/src/runtime/channels/fanout-location-runtime.ts +17 -9
- package/src/runtime/diagnostics/flow-context.ts +20 -7
- package/src/runtime/diagnostics/index.ts +1 -7
- package/src/runtime/diagnostics/message-flow.ts +47 -9
- package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
- package/src/runtime/execution/index.ts +40 -14
- package/src/runtime/execution/serial-execution-queue.ts +31 -4
- package/src/runtime/execution/state-lane.ts +7 -0
- package/src/runtime/foundation/operation-registry.ts +98 -20
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +244 -67
- package/src/runtime/foundation/service-liveness-registry.ts +39 -0
- package/src/runtime/foundation/service-mailbox.ts +8 -0
- package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
- package/src/runtime/foundation/service-relocation-object-owner.ts +54 -37
- package/src/runtime/foundation/service-relocation-runtime.ts +7 -3
- package/src/runtime/foundation/service-runtime-contracts.ts +12 -1
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
- package/src/runtime/foundation/service-stateful-registry.ts +38 -35
- package/src/runtime/foundation/service-stateful-runtime.ts +667 -152
- package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -11
- package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +187 -51
- package/src/runtime/host/actor-packet-relay.ts +113 -94
- package/src/runtime/host/actor-placement-coordinator.ts +31 -8
- package/src/runtime/host/actor-transfer-runtime.ts +104 -430
- package/src/runtime/host/application-job-queue.ts +29 -44
- package/src/runtime/host/index.ts +286 -129
- package/src/runtime/host/location-runtime-owner.ts +2 -6
- package/src/runtime/host/mesh-router-resolver.ts +13 -5
- package/src/runtime/host/remote-bound-session-relay.ts +86 -248
- package/src/runtime/host/route-mesh-runtime.ts +11 -5
- package/src/runtime/host/runtime-shutdown.ts +15 -4
- package/src/runtime/host/service-relocation-host-runtime.ts +784 -475
- package/src/runtime/host/spot-runtime-options-factory.ts +18 -7
- package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
- package/src/runtime/locations/auto-connect-loop.ts +22 -14
- package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
- package/src/runtime/locations/auto-connect-types.ts +0 -1
- package/src/runtime/locations/descriptor-publication.ts +7 -0
- package/src/runtime/locations/domain-store-contract.ts +5 -0
- package/src/runtime/locations/in-memory-authority-store.ts +85 -23
- package/src/runtime/locations/in-memory-location-store.ts +1 -12
- package/src/runtime/locations/index.ts +1 -0
- package/src/runtime/locations/lease-tracker.ts +2 -9
- package/src/runtime/locations/location-store-repository.ts +628 -152
- package/src/runtime/locations/relocation-blob.ts +75 -1
- package/src/runtime/locations/request-source-resolver.ts +138 -0
- package/src/runtime/locations/resolvers.ts +2 -2
- package/src/runtime/locations/runtime.ts +70 -40
- package/src/runtime/messaging/payload-codec.ts +8 -11
- package/src/runtime/messaging/request-result.ts +33 -29
- package/src/runtime/protocol/service_wire_codec.generated.ts +87 -4
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +13 -10
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +3 -2
- package/src/runtime/spots/index.ts +375 -281
- package/src/runtime/spots/spot-activation-registry.ts +25 -13
- package/src/runtime/spots/spot-activation-state.ts +12 -19
- package/src/runtime/spots/spot-activation.ts +170 -86
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
- package/src/runtime/spots/spot-actor-membership.ts +0 -15
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
- package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
- package/src/runtime/spots/spot-entry-activation.ts +24 -19
- package/src/runtime/spots/spot-handler-registry.ts +15 -4
- package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
- package/src/runtime/spots/spot-manager-public.ts +2 -2
- package/src/runtime/spots/spot-node-autoconnect.ts +22 -45
- package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
- package/src/runtime/spots/spot-outbound.ts +3 -3
- package/src/runtime/spots/spot-remote-codec.ts +9 -2
- package/src/runtime/spots/spot-runtime-ports.ts +0 -1
- package/src/runtime/spots/spot-serial-executor.ts +97 -25
- package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
- package/src/runtime/spots/spot-subscription-dispatch.ts +1 -1
- package/src/runtime/spots/spot-timer.ts +413 -157
- package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
- package/src/runtime/streams/bound-session-service.ts +7 -10
- package/src/runtime/streams/index.ts +12 -6
- package/src/runtime/streams/managed-stream.ts +4 -2
- package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
- package/src/runtime/streams/session-actor-coordinator.ts +39 -88
- package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
- package/src/runtime/streams/stream-session-runtime.ts +1 -5
- package/src/runtime/workers/index.ts +1 -1
|
@@ -146,10 +146,6 @@ class ZLinkLocationRuntimeOwner {
|
|
|
146
146
|
}
|
|
147
147
|
spotNodeRuntime.configureLocationAutoConnect(runtime, stores, this.options.registration.locations.options, this.currentEvents);
|
|
148
148
|
channelRuntime.configureLocationAutoConnect(runtime, stores, this.options.registration.locations.options, this.currentEvents);
|
|
149
|
-
if (runtime.ownerLeaseUsable) {
|
|
150
|
-
await spotNodeRuntime.startLocationAutoConnect();
|
|
151
|
-
await channelRuntime.startLocationAutoConnect();
|
|
152
|
-
}
|
|
153
149
|
return runtime;
|
|
154
150
|
}
|
|
155
151
|
clearForStop() {
|
|
@@ -168,7 +164,7 @@ class ZLinkLocationRuntimeOwner {
|
|
|
168
164
|
const locations = this.options.registration.locations;
|
|
169
165
|
if (locations.useInMemoryStores) {
|
|
170
166
|
const provider = new locations_1.ZLinkInMemoryProviderLocationStore();
|
|
171
|
-
const store = new locations_1.ZLinkLocationStoreRepository(provider);
|
|
167
|
+
const store = new locations_1.ZLinkLocationStoreRepository(provider, undefined, this.options.metrics);
|
|
172
168
|
return {
|
|
173
169
|
locationStore: store,
|
|
174
170
|
authorityStore: store,
|
|
@@ -183,7 +179,7 @@ class ZLinkLocationRuntimeOwner {
|
|
|
183
179
|
}
|
|
184
180
|
const provider = locations.storeInstance;
|
|
185
181
|
if (provider !== undefined) {
|
|
186
|
-
const store = new locations_1.ZLinkLocationStoreRepository(provider);
|
|
182
|
+
const store = new locations_1.ZLinkLocationStoreRepository(provider, undefined, this.options.metrics);
|
|
187
183
|
return {
|
|
188
184
|
locationStore: store,
|
|
189
185
|
authorityStore: store,
|
|
@@ -5,6 +5,10 @@ export declare class MeshRouterResolver {
|
|
|
5
5
|
private readonly registration;
|
|
6
6
|
constructor(registration: ZLinkFrameworkRegistration);
|
|
7
7
|
canUseRouterChannel(routerChannelId: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Runs on every node-direct send: a direct scan of the registered manual
|
|
10
|
+
* peers, without temporary arrays or a predicate closure per call.
|
|
11
|
+
*/
|
|
8
12
|
classifyManualNodeTarget(meshName: string, targetNodeRid: RoutingId): boolean | undefined;
|
|
9
13
|
defaultRouterChannelId(): string | undefined;
|
|
10
14
|
defaultSpotRouterChannelId(): string | undefined;
|
|
@@ -11,17 +11,25 @@ class MeshRouterResolver {
|
|
|
11
11
|
return (this.registration.routeChannels.has(routerChannelId) ||
|
|
12
12
|
this.registration.spotNodes.get(routerChannelId)?.router !== undefined);
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Runs on every node-direct send: a direct scan of the registered manual
|
|
16
|
+
* peers, without temporary arrays or a predicate closure per call.
|
|
17
|
+
*/
|
|
14
18
|
classifyManualNodeTarget(meshName, targetNodeRid) {
|
|
15
19
|
const router = this.registration.spotNodes.get(meshName)?.router;
|
|
16
20
|
if (router === undefined)
|
|
17
21
|
return undefined;
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
const manualPeers = router.manualPeerConnections;
|
|
23
|
+
if (manualPeers !== undefined) {
|
|
24
|
+
for (const peer of manualPeers) {
|
|
25
|
+
if ((0, routing_id_1.routingIdsEqual)(peer.peerRid, targetNodeRid))
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const manualConnectionCount = router.manualConnections?.length ?? 0;
|
|
30
|
+
if (manualConnectionCount === 0 && (manualPeers?.length ?? 0) === 0)
|
|
21
31
|
return undefined;
|
|
22
|
-
|
|
23
|
-
return true;
|
|
24
|
-
return manualConnections.length === 0 ? false : undefined;
|
|
32
|
+
return manualConnectionCount === 0 ? false : undefined;
|
|
25
33
|
}
|
|
26
34
|
defaultRouterChannelId() {
|
|
27
35
|
const candidates = [
|
|
@@ -25,7 +25,6 @@ export declare class ZLinkRemoteBoundSessionRelay {
|
|
|
25
25
|
private readonly options;
|
|
26
26
|
private readonly actorOwnershipGenerations;
|
|
27
27
|
private readonly activeServiceWireRelocations;
|
|
28
|
-
private readonly terminalServiceWireRelocations;
|
|
29
28
|
constructor(options: ZLinkRemoteBoundSessionRelayOptions);
|
|
30
29
|
receiveRoutedBoundSession(actorId: string, message: unknown, packetName: string | undefined, metadata: ReadonlyMap<string, string>, actorRef?: ActorRef, actorPacketTarget?: unknown): Promise<void>;
|
|
31
30
|
receiveRoutedBoundSessionResponse(actorId: string, packetName: string, requestSeq: bigint, message: unknown, replyOptions: ZLinkActorResponseOptions, actorPacketTarget?: unknown): Promise<void>;
|
|
@@ -40,12 +39,11 @@ export declare class ZLinkRemoteBoundSessionRelay {
|
|
|
40
39
|
receiveRemoteBoundSessionError(payload: unknown): Promise<{
|
|
41
40
|
readonly ok: boolean;
|
|
42
41
|
}>;
|
|
43
|
-
receiveServiceWireSessionRelocationSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal): Promise<ServiceSessionRelocationSealed>;
|
|
42
|
+
receiveServiceWireSessionRelocationSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal, onInstalled?: () => void): Promise<ServiceSessionRelocationSealed | undefined>;
|
|
44
43
|
receiveServiceWireSessionRelocationRoute(value: ServiceSessionRelocationRoute): Promise<void>;
|
|
45
|
-
clearServiceWireSessionRelocations(): void
|
|
44
|
+
clearServiceWireSessionRelocations(): Promise<void>;
|
|
46
45
|
private warnLateSessionRouteUpdate;
|
|
47
46
|
private applyServiceWireSessionRelocationRoute;
|
|
48
|
-
private validateServiceWireSessionRoute;
|
|
49
47
|
resolveRemoteBoundSessionTarget(sourceNodeRid: RoutingId, sourceSessionRid: RoutingId): ZLinkRemoteBoundSessionTarget | undefined;
|
|
50
48
|
actorPacketTargetForState(actorId: string): ZLinkRemoteActorPacketTarget | undefined;
|
|
51
49
|
clearOwnership(actorId: string): void;
|
|
@@ -8,14 +8,11 @@ const actor_packet_relay_wire_1 = require("../actors/actor-packet-relay-wire");
|
|
|
8
8
|
const routing_id_1 = require("../routing-id");
|
|
9
9
|
const service_stateful_wire_codec_1 = require("../foundation/service-stateful-wire-codec");
|
|
10
10
|
const service_wire_m6a_codec_1 = require("../foundation/service-wire-m6a-codec");
|
|
11
|
-
const bounded_replay_map_1 = require("./bounded-replay-map");
|
|
12
11
|
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
13
|
-
const SERVICE_CONTROL_TERMINAL_CAPACITY = 4096;
|
|
14
12
|
class ZLinkRemoteBoundSessionRelay {
|
|
15
13
|
options;
|
|
16
14
|
actorOwnershipGenerations = new Map();
|
|
17
15
|
activeServiceWireRelocations = new Map();
|
|
18
|
-
terminalServiceWireRelocations = new bounded_replay_map_1.BoundedReplayMap(SERVICE_CONTROL_TERMINAL_CAPACITY);
|
|
19
16
|
constructor(options) {
|
|
20
17
|
this.options = options;
|
|
21
18
|
}
|
|
@@ -112,77 +109,40 @@ class ZLinkRemoteBoundSessionRelay {
|
|
|
112
109
|
.sendLocalBoundSessionError(response.actorId, response.boundPacketName, response.requestSeq, response.error, new Map(Object.entries(response.metadata ?? {})));
|
|
113
110
|
return { ok: sent };
|
|
114
111
|
}
|
|
115
|
-
async receiveServiceWireSessionRelocationSeal(value, signal) {
|
|
112
|
+
async receiveServiceWireSessionRelocationSeal(value, signal, onInstalled) {
|
|
113
|
+
const runtime = this.options.streamBindingRuntime();
|
|
114
|
+
const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(runtime);
|
|
115
|
+
const sealController = new AbortController();
|
|
116
|
+
const sealSignal = signal === undefined
|
|
117
|
+
? sealController.signal
|
|
118
|
+
: AbortSignal.any([signal, sealController.signal]);
|
|
119
|
+
const prepared = await owner.prepareSessionRelocationSeal(value, sealSignal);
|
|
120
|
+
if (prepared === undefined)
|
|
121
|
+
return undefined;
|
|
122
|
+
if (prepared.response.sealResult === 'bindingAbsent')
|
|
123
|
+
return prepared.response;
|
|
116
124
|
const key = serviceWireBarrierKey(value);
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
if (terminal.sealFingerprint !== fingerprint) {
|
|
121
|
-
throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 42 with different bytes.`);
|
|
122
|
-
}
|
|
123
|
-
this.terminalServiceWireRelocations.touch(key);
|
|
124
|
-
return terminal.sealed;
|
|
125
|
-
}
|
|
126
|
-
const active = this.activeServiceWireRelocations.get(key);
|
|
127
|
-
if (active !== undefined) {
|
|
128
|
-
if (active.sealFingerprint !== fingerprint) {
|
|
129
|
-
throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 42 with different bytes.`);
|
|
130
|
-
}
|
|
131
|
-
return await active.sealPromise;
|
|
132
|
-
}
|
|
125
|
+
const existing = this.activeServiceWireRelocations.get(key);
|
|
126
|
+
if (existing !== undefined)
|
|
127
|
+
return await existing.sealPromise;
|
|
133
128
|
const actorId = value.actor.actor.actorId;
|
|
134
|
-
|
|
135
|
-
// Concurrent identical commands join this promise; different bytes for
|
|
136
|
-
// the same identity fail before they can install another seal.
|
|
137
|
-
let state;
|
|
138
|
-
const sealController = new AbortController();
|
|
139
|
-
const sealPromise = Promise.resolve().then(async () => {
|
|
140
|
-
await this.validateServiceWireSessionRoute(value);
|
|
141
|
-
await (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(this.options.streamBindingRuntime()).sealRelocation({
|
|
142
|
-
actorId,
|
|
143
|
-
actorGeneration: value.actor.actor.generation,
|
|
144
|
-
bindingGeneration: value.session.bindingGeneration,
|
|
145
|
-
sessionIdentity: value.session.sessionRid,
|
|
146
|
-
actorNodeRid: value.actor.actor.nodeRid,
|
|
147
|
-
actorNodeGeneration: value.actor.targetNodeGeneration,
|
|
148
|
-
sealId: key
|
|
149
|
-
}, {
|
|
150
|
-
objectGeneration: value.actor.actor.generation,
|
|
151
|
-
bindingGeneration: value.session.bindingGeneration
|
|
152
|
-
}, sealController.signal);
|
|
153
|
-
return {
|
|
154
|
-
relocation: value.relocation,
|
|
155
|
-
coordinator: value.coordinator,
|
|
156
|
-
actor: value.actor,
|
|
157
|
-
session: value.session
|
|
158
|
-
};
|
|
159
|
-
});
|
|
160
|
-
state = {
|
|
129
|
+
const state = {
|
|
161
130
|
actorId,
|
|
162
|
-
|
|
163
|
-
sealPromise,
|
|
164
|
-
sealController
|
|
131
|
+
sealPromise: prepared.ready.then(() => prepared.response)
|
|
165
132
|
};
|
|
166
133
|
this.activeServiceWireRelocations.set(key, state);
|
|
134
|
+
onInstalled?.();
|
|
167
135
|
const expire = async (error) => {
|
|
168
|
-
if (state.terminal === true ||
|
|
136
|
+
if (state.terminal === true ||
|
|
137
|
+
(await owner.relocationSnapshot(actorId, key))?.phase !== 'sealed')
|
|
169
138
|
return;
|
|
170
139
|
state.terminal = true;
|
|
171
140
|
sealController.abort(error);
|
|
172
141
|
if (this.activeServiceWireRelocations.get(key) === state) {
|
|
173
142
|
this.activeServiceWireRelocations.delete(key);
|
|
174
143
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
actorId,
|
|
178
|
-
sealFingerprint: state.sealFingerprint,
|
|
179
|
-
sealed: state.sealed
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(this.options.streamBindingRuntime());
|
|
183
|
-
await owner.clearRelocation(actorId, error);
|
|
184
|
-
void this.options
|
|
185
|
-
.streamBindingRuntime()
|
|
144
|
+
await owner.clearRelocation(actorId, error, key);
|
|
145
|
+
void runtime
|
|
186
146
|
.closeSessionBinding(actorId, value.session)
|
|
187
147
|
.catch((disconnectError) => this.options.reportOwnershipRefreshError?.(actorId, disconnectError));
|
|
188
148
|
state.sealAbortCleanup?.();
|
|
@@ -203,9 +163,7 @@ class ZLinkRemoteBoundSessionRelay {
|
|
|
203
163
|
signal.addEventListener('abort', onAbort, { once: true });
|
|
204
164
|
}
|
|
205
165
|
try {
|
|
206
|
-
|
|
207
|
-
state.sealed = sealed;
|
|
208
|
-
return sealed;
|
|
166
|
+
return await state.sealPromise;
|
|
209
167
|
}
|
|
210
168
|
catch (error) {
|
|
211
169
|
clearTimeout(state.sealTimer);
|
|
@@ -213,126 +171,69 @@ class ZLinkRemoteBoundSessionRelay {
|
|
|
213
171
|
if (this.activeServiceWireRelocations.get(key) === state) {
|
|
214
172
|
this.activeServiceWireRelocations.delete(key);
|
|
215
173
|
}
|
|
216
|
-
if (state.terminal !== true) {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
.streamBindingRuntime()
|
|
222
|
-
.closeSessionBinding(actorId, value.session)
|
|
223
|
-
.catch((disconnectError) => this.options.reportOwnershipRefreshError?.(actorId, disconnectError));
|
|
224
|
-
}
|
|
174
|
+
if (state.terminal !== true && (await owner.relocationSnapshot(actorId, key)) !== undefined) {
|
|
175
|
+
await owner.clearRelocation(actorId, error, key);
|
|
176
|
+
void runtime
|
|
177
|
+
.closeSessionBinding(actorId, value.session)
|
|
178
|
+
.catch((disconnectError) => this.options.reportOwnershipRefreshError?.(actorId, disconnectError));
|
|
225
179
|
}
|
|
226
180
|
throw sealController.signal.aborted ? sealController.signal.reason : error;
|
|
227
181
|
}
|
|
228
182
|
}
|
|
229
183
|
async receiveServiceWireSessionRelocationRoute(value) {
|
|
230
184
|
const key = serviceWireBarrierKey(value);
|
|
231
|
-
const
|
|
232
|
-
const
|
|
233
|
-
const terminal = this.terminalServiceWireRelocations.get(key);
|
|
234
|
-
if (terminal !== undefined) {
|
|
235
|
-
if (terminal.routeFingerprint === undefined) {
|
|
236
|
-
// The Session owner already closed this binding at the seal deadline.
|
|
237
|
-
// A late command 44 is terminal and cannot reactivate the route.
|
|
238
|
-
this.terminalServiceWireRelocations.touch(key);
|
|
239
|
-
this.warnLateSessionRouteUpdate(value);
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
if (terminal.routeFingerprint !== fingerprint) {
|
|
243
|
-
throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 44 with different bytes.`);
|
|
244
|
-
}
|
|
245
|
-
this.terminalServiceWireRelocations.touch(key);
|
|
246
|
-
this.warnLateSessionRouteUpdate(value);
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
185
|
+
const runtime = this.options.streamBindingRuntime();
|
|
186
|
+
const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(runtime);
|
|
249
187
|
const state = this.activeServiceWireRelocations.get(key);
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}
|
|
254
|
-
if (state.routeRequestFingerprint !== undefined &&
|
|
255
|
-
state.routeRequestFingerprint !== routeRequestFingerprint) {
|
|
256
|
-
throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 44 with different bytes.`);
|
|
257
|
-
}
|
|
258
|
-
if (state.routeFingerprint !== undefined) {
|
|
259
|
-
if (state.routeFingerprint !== fingerprint || state.routePromise === undefined) {
|
|
260
|
-
throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 44 with different bytes.`);
|
|
188
|
+
const accepted = await owner.acceptSessionRelocationRoute(value, async () => {
|
|
189
|
+
if (state === undefined) {
|
|
190
|
+
throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Session relocation '${key}' has no active seal.`);
|
|
261
191
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
clearTimeout(state.sealTimer);
|
|
270
|
-
state.sealAbortCleanup?.();
|
|
271
|
-
const routePromise = state.sealPromise.then(async (sealed) => {
|
|
272
|
-
validateSessionRelocationRouteAgainstSeal(value, sealed);
|
|
273
|
-
await this.applyServiceWireSessionRelocationRoute(key, value);
|
|
274
|
-
});
|
|
275
|
-
state.routePromise = routePromise;
|
|
276
|
-
try {
|
|
277
|
-
await routePromise;
|
|
278
|
-
this.terminalServiceWireRelocations.remember(key, {
|
|
279
|
-
actorId: state.actorId,
|
|
280
|
-
sealFingerprint: state.sealFingerprint,
|
|
281
|
-
sealed: state.sealed ?? (await state.sealPromise),
|
|
282
|
-
routeRequestFingerprint,
|
|
283
|
-
routeFingerprint: fingerprint
|
|
284
|
-
});
|
|
285
|
-
if (this.activeServiceWireRelocations.get(key) === state) {
|
|
286
|
-
this.activeServiceWireRelocations.delete(key);
|
|
192
|
+
if (state.sealTimer !== undefined)
|
|
193
|
+
clearTimeout(state.sealTimer);
|
|
194
|
+
state.sealAbortCleanup?.();
|
|
195
|
+
try {
|
|
196
|
+
const sealed = await state.sealPromise;
|
|
197
|
+
validateSessionRelocationRouteAgainstSeal(value, sealed);
|
|
198
|
+
await this.applyServiceWireSessionRelocationRoute(key, value);
|
|
287
199
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
if (this.activeServiceWireRelocations.get(key) === state) {
|
|
297
|
-
this.activeServiceWireRelocations.delete(key);
|
|
200
|
+
catch (error) {
|
|
201
|
+
// The binding owner chose this command. A failed one-way apply closes
|
|
202
|
+
// its physical Session; conflicting duplicates never enter this callback.
|
|
203
|
+
await owner.clearRelocation(state.actorId, error, key);
|
|
204
|
+
await runtime
|
|
205
|
+
.closeSessionBinding(state.actorId, value.session)
|
|
206
|
+
.catch((disconnectError) => this.options.reportOwnershipRefreshError?.(state.actorId, disconnectError));
|
|
207
|
+
throw error;
|
|
298
208
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
await this.options
|
|
309
|
-
.streamBindingRuntime()
|
|
310
|
-
.closeSessionBinding(state.actorId, value.session)
|
|
311
|
-
.catch((disconnectError) => this.options.reportOwnershipRefreshError?.(state.actorId, disconnectError));
|
|
312
|
-
throw error;
|
|
313
|
-
}
|
|
209
|
+
finally {
|
|
210
|
+
state.terminal = true;
|
|
211
|
+
if (this.activeServiceWireRelocations.get(key) === state) {
|
|
212
|
+
this.activeServiceWireRelocations.delete(key);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
if (!accepted)
|
|
217
|
+
this.warnLateSessionRouteUpdate(value);
|
|
314
218
|
}
|
|
315
|
-
clearServiceWireSessionRelocations() {
|
|
219
|
+
async clearServiceWireSessionRelocations() {
|
|
316
220
|
for (const state of this.activeServiceWireRelocations.values()) {
|
|
317
221
|
if (state.sealTimer !== undefined)
|
|
318
222
|
clearTimeout(state.sealTimer);
|
|
223
|
+
state.sealAbortCleanup?.();
|
|
319
224
|
}
|
|
320
225
|
this.activeServiceWireRelocations.clear();
|
|
321
|
-
this.
|
|
226
|
+
await (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwnerIfRegistered)(this.options.streamBindingRuntime())?.clearSessionRelocationResults();
|
|
322
227
|
}
|
|
323
228
|
warnLateSessionRouteUpdate(value) {
|
|
324
229
|
console.warn(`late_session_route_update session=${value.session.sessionRid}`);
|
|
325
230
|
}
|
|
326
231
|
async applyServiceWireSessionRelocationRoute(key, value) {
|
|
327
232
|
const runtime = this.options.streamBindingRuntime();
|
|
328
|
-
const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(runtime);
|
|
329
|
-
const fingerprint = (0, service_stateful_wire_codec_1.encodeSessionRelocationRoute)(value).toString('base64');
|
|
330
233
|
if (value.route.action === 'abort') {
|
|
331
|
-
await
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
}
|
|
335
|
-
});
|
|
234
|
+
if (!(await runtime.abortActorRouteSeal(value.actor.actorId, key))) {
|
|
235
|
+
throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Actor '${value.actor.actorId}' command 44 abort lost its Session seal.`);
|
|
236
|
+
}
|
|
336
237
|
}
|
|
337
238
|
else {
|
|
338
239
|
const committedRoute = value.route;
|
|
@@ -344,36 +245,20 @@ class ZLinkRemoteBoundSessionRelay {
|
|
|
344
245
|
actorId: value.actor.actorId,
|
|
345
246
|
objectGeneration: value.actor.generation,
|
|
346
247
|
meshName: current.meshName,
|
|
347
|
-
nodeRid:
|
|
248
|
+
nodeRid: committedRoute.targetNodeRid,
|
|
348
249
|
bindingGeneration: value.session.bindingGeneration,
|
|
349
250
|
ownershipGeneration: committedRoute.targetAuthorityOwnerGeneration,
|
|
350
251
|
ownerNodeGeneration: committedRoute.targetNodeGeneration,
|
|
351
252
|
ownerLeaseGeneration: committedRoute.targetOwnerLeaseGeneration
|
|
352
253
|
};
|
|
353
|
-
await
|
|
354
|
-
|
|
355
|
-
confirmRemoteSessionBinding: 'send',
|
|
356
|
-
releaseSeal: { sealId: key }
|
|
357
|
-
});
|
|
358
|
-
const currentGeneration = this.actorOwnershipGenerations.get(value.actor.actorId);
|
|
359
|
-
if (currentGeneration === undefined ||
|
|
360
|
-
currentGeneration < committedRoute.targetAuthorityOwnerGeneration) {
|
|
361
|
-
this.actorOwnershipGenerations.set(value.actor.actorId, committedRoute.targetAuthorityOwnerGeneration);
|
|
362
|
-
}
|
|
254
|
+
await runtime.commitActorRoute(targetActorRef, undefined, {
|
|
255
|
+
releaseSeal: { sealId: key }
|
|
363
256
|
});
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
.streamBindingRuntime()
|
|
370
|
-
.sessionRouteFence(value.actor.actor.actorId);
|
|
371
|
-
if (current === undefined ||
|
|
372
|
-
current.actor.objectGeneration !== value.actor.actor.generation ||
|
|
373
|
-
!(0, routing_id_1.routingIdsEqual)(current.actor.nodeRid, value.actor.actor.nodeRid) ||
|
|
374
|
-
current.sessionRid.toString() !== value.session.sessionRid ||
|
|
375
|
-
current.bindingGeneration !== value.session.bindingGeneration) {
|
|
376
|
-
throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Actor '${value.actor.actor.actorId}' command 42 was fenced by its exact Session route.`);
|
|
257
|
+
const currentGeneration = this.actorOwnershipGenerations.get(value.actor.actorId);
|
|
258
|
+
if (currentGeneration === undefined ||
|
|
259
|
+
currentGeneration < committedRoute.targetAuthorityOwnerGeneration) {
|
|
260
|
+
this.actorOwnershipGenerations.set(value.actor.actorId, committedRoute.targetAuthorityOwnerGeneration);
|
|
261
|
+
}
|
|
377
262
|
}
|
|
378
263
|
}
|
|
379
264
|
resolveRemoteBoundSessionTarget(sourceNodeRid, sourceSessionRid) {
|
|
@@ -405,10 +290,6 @@ class ZLinkRemoteBoundSessionRelay {
|
|
|
405
290
|
this.activeServiceWireRelocations.delete(key);
|
|
406
291
|
}
|
|
407
292
|
}
|
|
408
|
-
for (const [key, value] of this.terminalServiceWireRelocations) {
|
|
409
|
-
if (value.actorId === actorId)
|
|
410
|
-
this.terminalServiceWireRelocations.delete(key);
|
|
411
|
-
}
|
|
412
293
|
}
|
|
413
294
|
async sendActorResponse(actor, packetName, requestSeq, response, replyOptions, fallbackBoundSessionTarget, fallbackActorRef, signal) {
|
|
414
295
|
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
@@ -3,7 +3,7 @@ import type { ZLinkActivationAdmission } from '../activation-admission';
|
|
|
3
3
|
import type { ZLinkRuntimeAdmissionGate } from '../admission';
|
|
4
4
|
import type { ZLinkBackendMeshNode } from '../backend';
|
|
5
5
|
import type { ZLinkSpotNodeOptions } from '../configuration';
|
|
6
|
-
type ZLinkDrainForceReason = 'deadline_exceeded' | 'drain_state_publish_failed' | 'owner_cleanup_failed' | 'teardown_failed';
|
|
6
|
+
export type ZLinkDrainForceReason = 'deadline_exceeded' | 'drain_state_publish_failed' | 'owner_cleanup_failed' | 'teardown_failed';
|
|
7
7
|
type ZLinkMeshDrainResult = {
|
|
8
8
|
readonly kind: 'drained';
|
|
9
9
|
} | {
|
|
@@ -28,7 +28,7 @@ export interface ZLinkRouteMeshRuntimeCoordinatorOptions {
|
|
|
28
28
|
readonly drainResources: (meshName: string, signal: AbortSignal, stopStartingSignal?: AbortSignal) => Promise<void>;
|
|
29
29
|
readonly shutdownResources?: (meshName: string, signal: AbortSignal) => Promise<void>;
|
|
30
30
|
readonly cleanupHostResources: (signal: AbortSignal) => Promise<void>;
|
|
31
|
-
readonly forceStopResources: (meshName: string) => Promise<void>;
|
|
31
|
+
readonly forceStopResources: (meshName: string, reason: ZLinkDrainForceReason, signal: AbortSignal) => Promise<void>;
|
|
32
32
|
}
|
|
33
33
|
export interface ZLinkLocalPlacementCounts {
|
|
34
34
|
readonly activeActorCount: number;
|
|
@@ -312,7 +312,9 @@ class ZLinkRouteMeshRuntimeCoordinator {
|
|
|
312
312
|
: deadline.signal.aborted
|
|
313
313
|
? 'deadline_exceeded'
|
|
314
314
|
: classified;
|
|
315
|
-
await this.options
|
|
315
|
+
await this.options
|
|
316
|
+
.forceStopResources(meshName, reason, deadline.signal)
|
|
317
|
+
.catch(() => undefined);
|
|
316
318
|
result = { kind: 'forceStopped', reason };
|
|
317
319
|
this.transition(meshName, state, contracts_1.ZLinkTopologyState.Failed);
|
|
318
320
|
}
|
|
@@ -362,7 +364,7 @@ class ZLinkRouteMeshRuntimeCoordinator {
|
|
|
362
364
|
: deadline.signal.aborted
|
|
363
365
|
? 'deadline_exceeded'
|
|
364
366
|
: classified;
|
|
365
|
-
await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName).catch(() => undefined)));
|
|
367
|
+
await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName, reason, deadline.signal).catch(() => undefined)));
|
|
366
368
|
result = { kind: 'forceStopped', reason };
|
|
367
369
|
for (const [meshName, state] of entries) {
|
|
368
370
|
this.transition(meshName, state, contracts_1.ZLinkTopologyState.Failed);
|
|
@@ -408,7 +410,7 @@ class ZLinkRouteMeshRuntimeCoordinator {
|
|
|
408
410
|
: signal.aborted
|
|
409
411
|
? 'deadline_exceeded'
|
|
410
412
|
: classified;
|
|
411
|
-
await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName).catch(() => undefined)));
|
|
413
|
+
await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName, reason, signal).catch(() => undefined)));
|
|
412
414
|
result = { kind: 'forceStopped', reason, error };
|
|
413
415
|
for (const [meshName, state] of entries) {
|
|
414
416
|
this.transition(meshName, state, contracts_1.ZLinkTopologyState.Failed);
|
|
@@ -26,6 +26,7 @@ export interface ZLinkRuntimeStopParts {
|
|
|
26
26
|
readonly spotNodeRuntime?: ZLinkSpotNodeRuntimeManager;
|
|
27
27
|
readonly channelRuntime?: ZLinkChannelRuntimeManager;
|
|
28
28
|
readonly serviceRelocation?: {
|
|
29
|
+
drainActorJoinSources?(): Promise<void>;
|
|
29
30
|
dispose(): Promise<void>;
|
|
30
31
|
};
|
|
31
32
|
readonly ownedStores?: readonly ZLinkRuntimeOwnedStore[];
|
|
@@ -20,10 +20,11 @@ async function rollbackRuntimeStart(parts) {
|
|
|
20
20
|
async function stopRuntimeParts(parts) {
|
|
21
21
|
const state = parts.state;
|
|
22
22
|
const errors = [];
|
|
23
|
+
await runShutdownStep(errors, () => (0, abort_1.awaitWithAbort)(Promise.resolve(parts.serviceRelocation?.drainActorJoinSources?.()), parts.shutdownSignal));
|
|
23
24
|
await runShutdownStep(errors, () => parts.streamRuntime?.dispose());
|
|
24
|
-
await runShutdownStep(errors, () => parts.spotNodeRuntime?.dispose(
|
|
25
|
+
await runShutdownStep(errors, () => parts.spotNodeRuntime?.dispose(parts.shutdownSignal, parts.cleanupDeadline));
|
|
25
26
|
await runShutdownStep(errors, () => parts.channelRuntime?.dispose());
|
|
26
|
-
await runShutdownStep(errors, () => parts.serviceRelocation?.dispose());
|
|
27
|
+
await runShutdownStep(errors, () => (0, abort_1.awaitWithAbort)(Promise.resolve(parts.serviceRelocation?.dispose()), parts.shutdownSignal));
|
|
27
28
|
await runShutdownStep(errors, () => parts.locationSnapshot.lifecycle?.dispose());
|
|
28
29
|
await runShutdownStep(errors, () => parts.locationSnapshot.runtime?.stop(parts.shutdownSignal));
|
|
29
30
|
await Promise.allSettled(state.listenerTasks);
|
|
@@ -7,36 +7,39 @@ import type { ZLinkActorJoinRelocation } from '../actors/actor-join-relocation';
|
|
|
7
7
|
import type { ZLinkBackendMeshNode, ZLinkMeshCompletionTable } from '../backend';
|
|
8
8
|
import type { ZLinkFrameworkRegistration } from '../configuration';
|
|
9
9
|
import { type ZLinkRuntimeEventPublisher, type ZLinkRuntimeMetrics } from '../diagnostics';
|
|
10
|
+
import { type ZLinkMessageFlowTracer } from '../diagnostics/message-flow';
|
|
10
11
|
import { type ServiceRelocationQueuedMessage } from '../foundation/service-relocation-runtime';
|
|
11
12
|
import { type ReceiveRecord } from '../foundation/service-runtime-contracts';
|
|
12
13
|
import { type ServiceSessionRelocationRoute, type ServiceSessionRelocationSeal, type ServiceSessionRelocationSealed } from '../foundation/service-stateful-wire-codec';
|
|
13
14
|
import type { ZLinkDomainLocationStore as ZLinkLocationStore } from '../locations/domain-store-contract';
|
|
14
15
|
import type { ZLinkLocationOwnerToken } from '../locations/internal-location-contracts';
|
|
15
16
|
import type { ZLinkTrackedInstanceAuthority } from '../locations/spot-location-claims';
|
|
16
|
-
import type { DefaultZLinkSpotManager
|
|
17
|
+
import type { DefaultZLinkSpotManager } from '../spots';
|
|
17
18
|
import { type ZLinkActorTransferRuntime } from './actor-transfer-runtime';
|
|
18
19
|
export declare class ZLinkRelocationStateIncompatibleError extends Error {
|
|
19
20
|
constructor(message: string);
|
|
20
21
|
}
|
|
21
22
|
interface ZLinkHostRelocationOptions {
|
|
23
|
+
readonly flowCreationEnabled?: () => boolean;
|
|
24
|
+
readonly messageFlow?: () => ZLinkMessageFlowTracer | undefined;
|
|
22
25
|
readonly registration: ZLinkFrameworkRegistration;
|
|
23
26
|
readonly providerResolver?: ZLinkProviderResolver;
|
|
24
27
|
readonly locationStore: () => ZLinkLocationStore | undefined;
|
|
25
28
|
readonly currentOwner: () => ZLinkLocationOwnerToken | undefined;
|
|
26
29
|
readonly targetAdmissionSealed?: () => boolean;
|
|
30
|
+
readonly requestPeerReconcile?: (meshName: string, peerRid: string) => Promise<void>;
|
|
27
31
|
readonly sourceQuiescenceChanged?: () => void;
|
|
28
32
|
readonly liveDescriptors: (meshName: string, signal?: AbortSignal) => Promise<readonly ZLinkMeshNodeDescriptor[]>;
|
|
29
33
|
readonly localDescriptor?: (meshName: string) => ZLinkMeshNodeDescriptor | undefined;
|
|
30
34
|
readonly meshNode: (meshName: string) => ZLinkBackendMeshNode | undefined;
|
|
31
35
|
readonly completions: (meshName: string) => ZLinkMeshCompletionTable | undefined;
|
|
32
36
|
readonly spotManager: () => DefaultZLinkSpotManager | undefined;
|
|
33
|
-
readonly spotNodeRuntime: () => ZLinkSpotNodeRuntimeManager | undefined;
|
|
34
37
|
readonly actorManager: () => DefaultZLinkActorManager | undefined;
|
|
35
38
|
readonly actorTransfer: ZLinkActorTransferRuntime;
|
|
36
39
|
readonly boundSessionRelocation?: {
|
|
37
|
-
receiveSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal): Promise<ServiceSessionRelocationSealed>;
|
|
40
|
+
receiveSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal, onInstalled?: () => void): Promise<ServiceSessionRelocationSealed | undefined>;
|
|
38
41
|
receiveRoute(value: ServiceSessionRelocationRoute): Promise<void>;
|
|
39
|
-
clear?(): void
|
|
42
|
+
clear?(): void | Promise<void>;
|
|
40
43
|
};
|
|
41
44
|
readonly trackInstanceSpot?: (input: ZLinkTrackedInstanceAuthority) => void;
|
|
42
45
|
readonly invalidateActorRoute?: (actorId: string) => void;
|
|
@@ -50,7 +53,6 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
|
|
|
50
53
|
private readonly options;
|
|
51
54
|
private readonly targetStages;
|
|
52
55
|
private readonly terminalTargets;
|
|
53
|
-
private readonly relocationAuthorityKeys;
|
|
54
56
|
private readonly targetPrepareOperations;
|
|
55
57
|
private readonly pendingReplyRelays;
|
|
56
58
|
private readonly pendingSessionRelocations;
|
|
@@ -88,6 +90,7 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
|
|
|
88
90
|
* checksum integrity failure — it must not be reported as DataLost(35).
|
|
89
91
|
*/
|
|
90
92
|
private disposed;
|
|
93
|
+
private readonly targetPreparationStop;
|
|
91
94
|
constructor(options: ZLinkHostRelocationOptions);
|
|
92
95
|
relocateActorJoin(input: Parameters<ZLinkActorJoinRelocation['relocateActorJoin']>[0]): ReturnType<ZLinkActorJoinRelocation['relocateActorJoin']>;
|
|
93
96
|
dispose(): Promise<void>;
|
|
@@ -95,7 +98,12 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
|
|
|
95
98
|
drainTargetAttempts(): Promise<void>;
|
|
96
99
|
/** Spec 28 §4.4: the target owner alone orders shutdown seal and verified cutover. */
|
|
97
100
|
private targetStageSealed;
|
|
101
|
+
/** The Shutdown admission seal: closed once the target owner starts shutdown. */
|
|
102
|
+
private targetAdmissionSealed;
|
|
98
103
|
completeActorJoinSourceCleanup(actorId: string): void;
|
|
104
|
+
/** Drains the exact source scopes before their Spot lifecycle owners stop. */
|
|
105
|
+
drainActorJoinSources(meshName?: string): Promise<void>;
|
|
106
|
+
private retireActorJoinSource;
|
|
99
107
|
private finalizeActorJoinSource;
|
|
100
108
|
relocateMesh(meshName: string, targetApplicationVersion?: bigint, signal?: AbortSignal, stopStartingSignal?: AbortSignal): Promise<void>;
|
|
101
109
|
tryHandleControl(meshName: string, record: ReceiveRecord, signal?: AbortSignal): boolean | Promise<boolean>;
|
|
@@ -133,6 +141,7 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
|
|
|
133
141
|
private reserveRelocationId;
|
|
134
142
|
private reserveExactRelocationId;
|
|
135
143
|
private runCoordinator;
|
|
144
|
+
private completeSourceRelocationMetric;
|
|
136
145
|
/** Streams the payload chunks of one stage under the effective in-flight budgets. */
|
|
137
146
|
private sendRelocationStateChunks;
|
|
138
147
|
/**
|
|
@@ -165,7 +174,8 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
|
|
|
165
174
|
* excludes a late target commit. `target`: the
|
|
166
175
|
* target committed. `source`: Preserve fenced the target out while the
|
|
167
176
|
* source owner lease was valid. `lost`: the source owner lease ended first
|
|
168
|
-
* or authority is Missing or
|
|
177
|
+
* or authority is Missing or fails the same-object, advanced-generation fence.
|
|
178
|
+
* A committed later owner has no Follow snapshot (Location runtime §10). An uncertain
|
|
169
179
|
* Store or lease result keeps the work retained and repeats the same decision.
|
|
170
180
|
*/
|
|
171
181
|
private settleSourceAuthority;
|
|
@@ -212,7 +222,7 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
|
|
|
212
222
|
private acceptReplyRelayAck;
|
|
213
223
|
private requireAdmittedPeer;
|
|
214
224
|
private targetReplyRelayCoordinator;
|
|
215
|
-
private
|
|
225
|
+
private relayTerminalReply;
|
|
216
226
|
private exactSourceLeaseExpired;
|
|
217
227
|
private publishSessionRoutes;
|
|
218
228
|
private sendControl;
|