@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
|
@@ -219,21 +219,6 @@ export class ZLinkSpotActorMembership {
|
|
|
219
219
|
);
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
-
async restoreActorAfterFailedTransfer(
|
|
223
|
-
spotId: RoutingId,
|
|
224
|
-
actor: ZLinkActor,
|
|
225
|
-
signal?: AbortSignal
|
|
226
|
-
): Promise<void> {
|
|
227
|
-
throwIfAborted(signal);
|
|
228
|
-
const activation = this.requireActivation(spotId);
|
|
229
|
-
await this.runLifecycleOperation(activation, () =>
|
|
230
|
-
activation.serial.execute(async () => {
|
|
231
|
-
activation.cancelActorTransfer(actor.context.actorId);
|
|
232
|
-
await activation.spot.onJoinedActor(actor);
|
|
233
|
-
})
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
222
|
async beginActorTransfer(spotId: RoutingId, actorId: string): Promise<void> {
|
|
238
223
|
const activation = this.requireActivation(spotId);
|
|
239
224
|
await this.runLifecycleOperation(activation, () =>
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { actorMessageFollowContext } from '../actors/actor-message-follow-context';
|
|
2
|
+
import { DefaultZLinkActorContext } from '../actors/actor-context';
|
|
3
|
+
import { decodeSessionDisconnected } from '../actors/session-disconnected-wire';
|
|
4
|
+
import { routingIdsEqual } from '../routing-id';
|
|
1
5
|
import type { ApplicationJobOrigin } from '../application-jobs/contracts';
|
|
2
6
|
import {
|
|
3
7
|
ZLinkFrameworkInternalErrorKind,
|
|
@@ -12,7 +16,13 @@ import type {
|
|
|
12
16
|
ZLinkSpot
|
|
13
17
|
} from '../../contracts';
|
|
14
18
|
import type { Message } from '../../contracts/Common/Message';
|
|
15
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
ZLinkFrameworkException,
|
|
21
|
+
ZLinkFrameworkErrorKind,
|
|
22
|
+
ZLinkMessage,
|
|
23
|
+
ZLinkEncodedPayload,
|
|
24
|
+
zlinkMessageMetadata
|
|
25
|
+
} from '../../contracts';
|
|
16
26
|
import {
|
|
17
27
|
ZLinkRuntimeMessageFlowOutcome as ZLinkMessageFlowOutcome,
|
|
18
28
|
ZLinkRuntimeDispatchErrorAction as ZLinkDispatchErrorAction,
|
|
@@ -45,6 +55,10 @@ import { zlinkMetadataByteLength, zlinkSerialWorkOptions } from '../execution/se
|
|
|
45
55
|
import type { ZLinkMessageFollowOrigin } from '../foundation/service-runtime-contracts';
|
|
46
56
|
import { releaseApplicationJobPermitBeforeHandler } from '../application-jobs/application-job-queue-scope';
|
|
47
57
|
|
|
58
|
+
const emptyDisconnectedReply = ZLinkMessage.fromEncoded(
|
|
59
|
+
ZLinkEncodedPayload.fromOwned(Buffer.alloc(0))
|
|
60
|
+
);
|
|
61
|
+
|
|
48
62
|
export interface ZLinkActorResponseOptions {
|
|
49
63
|
readonly metadata: ReadonlyMap<string, string>;
|
|
50
64
|
readonly compressPayload: boolean;
|
|
@@ -204,11 +218,13 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
204
218
|
? ZLinkDispatchErrorAction.ReplyError
|
|
205
219
|
: ZLinkDispatchErrorAction.Drop;
|
|
206
220
|
this.trace(ZLinkMessageFlowOutcome.Received, actorId, header, messageKind);
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
header.
|
|
210
|
-
|
|
211
|
-
|
|
221
|
+
const disconnected = header.name === ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET;
|
|
222
|
+
const disconnectedReply =
|
|
223
|
+
disconnected && header.kind === ZLinkStreamMessageKind.Request
|
|
224
|
+
? emptyDisconnectedReply
|
|
225
|
+
: undefined;
|
|
226
|
+
if (this.options.actorLeft?.(actorId) === true && disconnected) {
|
|
227
|
+
return disconnectedReply;
|
|
212
228
|
}
|
|
213
229
|
const routed = await this.options.routeBeforeLocal?.(delivery);
|
|
214
230
|
if (routed?.handled === true) {
|
|
@@ -229,9 +245,34 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
229
245
|
requestTerminal
|
|
230
246
|
);
|
|
231
247
|
}
|
|
232
|
-
if (
|
|
248
|
+
if (disconnected) {
|
|
249
|
+
const identity = decodeSessionDisconnected(messageToBytes(parts[1]));
|
|
250
|
+
if (identity === undefined) {
|
|
251
|
+
if (this.options.dispatchErrors?.captureEnabled() === true)
|
|
252
|
+
this.reportInvalidFrame(
|
|
253
|
+
actorId,
|
|
254
|
+
messageKind,
|
|
255
|
+
new ZLinkFrameworkException(
|
|
256
|
+
ZLinkFrameworkErrorKind.ProtocolError,
|
|
257
|
+
'ProtocolError: malformed Session disconnect identity.'
|
|
258
|
+
),
|
|
259
|
+
'warning'
|
|
260
|
+
);
|
|
261
|
+
return disconnectedReply;
|
|
262
|
+
}
|
|
263
|
+
const current =
|
|
264
|
+
actor.context instanceof DefaultZLinkActorContext
|
|
265
|
+
? actor.context.currentSessionBinding
|
|
266
|
+
: undefined;
|
|
267
|
+
if (
|
|
268
|
+
current !== undefined &&
|
|
269
|
+
(!routingIdsEqual(current.sessionNodeRid, identity.sessionOwnerNodeRid) ||
|
|
270
|
+
current.sessionOwnerNodeGeneration !== identity.sessionOwnerNodeGeneration ||
|
|
271
|
+
current.bindingGeneration !== identity.bindingGeneration)
|
|
272
|
+
)
|
|
273
|
+
return disconnectedReply;
|
|
233
274
|
await this.options.onDisconnectActor(actor);
|
|
234
|
-
return
|
|
275
|
+
return disconnectedReply;
|
|
235
276
|
}
|
|
236
277
|
const decodePayload = this.createPayloadDecoder(parts[1], header);
|
|
237
278
|
return this.dispatchActorPacket(
|
|
@@ -303,7 +344,9 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
303
344
|
return undefined;
|
|
304
345
|
}
|
|
305
346
|
const missingActorError = createInternalFrameworkException(
|
|
306
|
-
|
|
347
|
+
actorMessageFollowContext(fallbackActorRef) === undefined
|
|
348
|
+
? ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound
|
|
349
|
+
: ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
307
350
|
`SPOT actor is not registered locally: ${actorId}`
|
|
308
351
|
);
|
|
309
352
|
if (
|
|
@@ -603,7 +646,8 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
603
646
|
private reportInvalidFrame(
|
|
604
647
|
actorId: string,
|
|
605
648
|
messageKind: ZLinkDispatchMessageKind,
|
|
606
|
-
error?: unknown
|
|
649
|
+
error?: unknown,
|
|
650
|
+
severity?: 'warning'
|
|
607
651
|
): void {
|
|
608
652
|
this.options.dispatchErrors?.report({
|
|
609
653
|
surface: ZLinkDispatchErrorSurface.SpotActor,
|
|
@@ -612,7 +656,8 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
612
656
|
action: ZLinkDispatchErrorAction.Drop,
|
|
613
657
|
spotId: this.options.spotId(),
|
|
614
658
|
actorId,
|
|
615
|
-
error
|
|
659
|
+
error,
|
|
660
|
+
severity
|
|
616
661
|
});
|
|
617
662
|
}
|
|
618
663
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { ActorRef, RoutingId, ZLinkMessageSerializer } from '../../contracts';
|
|
2
|
-
import { ZLinkFrameworkException, ZLinkFrameworkErrorKind } from '../../contracts';
|
|
3
2
|
import type { Message } from '../../contracts/Common/Message';
|
|
4
3
|
import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
|
|
5
4
|
import { RequestResult } from '../backend/runtime-values';
|
|
@@ -7,15 +6,9 @@ import type { ZLinkBackendActorRef, ZLinkBackendActorRecvInfo } from '../backend
|
|
|
7
6
|
import type { ZLinkActorPacketDelivery } from './spot-actor-packet-dispatch';
|
|
8
7
|
import { REMOTE_BOUND_SESSION_BIND_PACKET } from './spot-remote-codec';
|
|
9
8
|
import { ZLINK_RECV_DONT_WAIT } from './spot-native-flags';
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
messageToBytes,
|
|
14
|
-
streamCodecForContentType,
|
|
15
|
-
ZLinkStreamHeaderFlags,
|
|
16
|
-
ZLinkStreamMessageKind
|
|
17
|
-
} from '../streams/protocol';
|
|
18
|
-
import { encodeFrameworkPayload } from '../messaging/payload-codec';
|
|
9
|
+
import { decodeStreamHeader, messageToBytes, ZLinkStreamMessageKind } from '../streams/protocol';
|
|
10
|
+
import { encodeActorReply } from '../actors/actor-reply';
|
|
11
|
+
import { boundSessionErrorPayload } from '../streams/bound-session-response-target';
|
|
19
12
|
|
|
20
13
|
export interface ZLinkActorDispatchPart {
|
|
21
14
|
readonly info: {
|
|
@@ -218,7 +211,7 @@ export class ZLinkSpotActorPacketDrain {
|
|
|
218
211
|
this.encodeActorReplyFrame(
|
|
219
212
|
parts[0],
|
|
220
213
|
ZLinkStreamMessageKind.Error,
|
|
221
|
-
|
|
214
|
+
boundSessionErrorPayload(error)
|
|
222
215
|
)
|
|
223
216
|
],
|
|
224
217
|
RequestResult.Ok
|
|
@@ -231,37 +224,14 @@ export class ZLinkSpotActorPacketDrain {
|
|
|
231
224
|
kind: ZLinkStreamMessageKind.Response | ZLinkStreamMessageKind.Error,
|
|
232
225
|
payload: unknown
|
|
233
226
|
): Message {
|
|
234
|
-
const
|
|
235
|
-
|
|
227
|
+
const [frame] = encodeActorReply(
|
|
228
|
+
messageToBytes(requestHeaderPart),
|
|
229
|
+
kind,
|
|
236
230
|
payload,
|
|
237
231
|
this.options.messageSerializers,
|
|
238
|
-
|
|
239
|
-
'payload'
|
|
232
|
+
this.flowEnabled()
|
|
240
233
|
);
|
|
241
|
-
|
|
242
|
-
// encodeStreamFrame returns a fresh, unaliased array; view it without re-copying.
|
|
243
|
-
const frame = encodeStreamFrame(
|
|
244
|
-
{
|
|
245
|
-
kind,
|
|
246
|
-
codec: streamCodecForContentType(encoded.contentType),
|
|
247
|
-
flags: ZLinkStreamHeaderFlags.None,
|
|
248
|
-
requestSeq: requestHeader.requestSeq,
|
|
249
|
-
name: '',
|
|
250
|
-
metadata: new Map(),
|
|
251
|
-
correlationId: requestHeader.correlationId,
|
|
252
|
-
// Spec 27 §7: preserve the request flow pair on the reply while
|
|
253
|
-
// tracing is on; the gated decode above already strips it at Off.
|
|
254
|
-
flowId: requestHeader.flowId,
|
|
255
|
-
flowOrigin: requestHeader.flowOrigin
|
|
256
|
-
},
|
|
257
|
-
encoded.message.data()
|
|
258
|
-
);
|
|
259
|
-
return RuntimeMessage.fromOwned(
|
|
260
|
-
Buffer.from(frame.buffer, frame.byteOffset, frame.byteLength)
|
|
261
|
-
) as Message;
|
|
262
|
-
} finally {
|
|
263
|
-
encoded.message.close();
|
|
264
|
-
}
|
|
234
|
+
return RuntimeMessage.fromOwned(frame) as Message;
|
|
265
235
|
}
|
|
266
236
|
|
|
267
237
|
private consumeRemoteBoundSessionBind(
|
|
@@ -329,16 +299,3 @@ function isStreamHeaderMessage(message: Message, flowEnabled: boolean): boolean
|
|
|
329
299
|
function closeMessages(messages: readonly Message[]): void {
|
|
330
300
|
for (const message of messages) message.close();
|
|
331
301
|
}
|
|
332
|
-
|
|
333
|
-
function frameworkErrorPayload(error: unknown): {
|
|
334
|
-
readonly message: string;
|
|
335
|
-
readonly kind: ZLinkFrameworkErrorKind;
|
|
336
|
-
} {
|
|
337
|
-
return {
|
|
338
|
-
message: error instanceof Error ? error.message : String(error),
|
|
339
|
-
kind:
|
|
340
|
-
error instanceof ZLinkFrameworkException
|
|
341
|
-
? error.kind
|
|
342
|
-
: ZLinkFrameworkErrorKind.InternalFailure
|
|
343
|
-
};
|
|
344
|
-
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { currentApplicationJobOrigin } from '../application-jobs/application-job-queue-scope';
|
|
1
2
|
import type {
|
|
2
3
|
ActorRef,
|
|
3
4
|
RoutingId,
|
|
@@ -50,7 +51,7 @@ import {
|
|
|
50
51
|
DefaultZLinkSpotHandlerRegistry
|
|
51
52
|
} from './spot-handler-registry';
|
|
52
53
|
import { DefaultZLinkSpotOutbound, type ZLinkSpotRoutedTransport } from './spot-outbound';
|
|
53
|
-
import {
|
|
54
|
+
import { createFreshProviderInstance } from './spot-provider';
|
|
54
55
|
import { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
|
|
55
56
|
import { ZLinkSpotSerialExecutor } from './spot-serial-executor';
|
|
56
57
|
import { invokeSpotClosing } from './spot-closing';
|
|
@@ -269,7 +270,7 @@ export class ZLinkEntrySpotActivation {
|
|
|
269
270
|
}
|
|
270
271
|
|
|
271
272
|
async create(): Promise<void> {
|
|
272
|
-
const entrySpot = await
|
|
273
|
+
const entrySpot = await createFreshProviderInstance(
|
|
273
274
|
this.options.entrySpotType,
|
|
274
275
|
this.options.providerResolver,
|
|
275
276
|
this.context
|
|
@@ -479,23 +480,7 @@ export class ZLinkEntrySpotActivation {
|
|
|
479
480
|
remoteBoundSessionTarget,
|
|
480
481
|
fallbackActorRef,
|
|
481
482
|
undefined,
|
|
482
|
-
messageFollowOrigin
|
|
483
|
-
(
|
|
484
|
-
replayedParts,
|
|
485
|
-
replayReturnResponse,
|
|
486
|
-
replayRemoteBoundSessionTarget,
|
|
487
|
-
replayFallbackActorRef
|
|
488
|
-
) =>
|
|
489
|
-
this.spotSerialExecutor.executeActor(actorId, () =>
|
|
490
|
-
this.dispatchActorPacketInsideMailbox({
|
|
491
|
-
origin: delivery.origin,
|
|
492
|
-
actorId,
|
|
493
|
-
parts: replayedParts,
|
|
494
|
-
returnResponse: replayReturnResponse,
|
|
495
|
-
remoteBoundSessionTarget: replayRemoteBoundSessionTarget,
|
|
496
|
-
fallbackActorRef: replayFallbackActorRef
|
|
497
|
-
})
|
|
498
|
-
)
|
|
483
|
+
messageFollowOrigin
|
|
499
484
|
);
|
|
500
485
|
if (handoff !== undefined) return await handoff;
|
|
501
486
|
return this.spotSerialExecutor.executeActor(actorId, () =>
|
|
@@ -503,6 +488,26 @@ export class ZLinkEntrySpotActivation {
|
|
|
503
488
|
);
|
|
504
489
|
}
|
|
505
490
|
|
|
491
|
+
/** Restores source packets through the Entry Actor's existing executor. */
|
|
492
|
+
admitActorPacketPrefix(
|
|
493
|
+
actorId: string,
|
|
494
|
+
records: readonly import('../actors/actor-handoff').ZLinkActorHandoffPrefixRecord[]
|
|
495
|
+
): import('../actors/actor-handoff').ZLinkActorHandoffPrefixAdmission {
|
|
496
|
+
return this.spotSerialExecutor.admitActorPacketPrefix(
|
|
497
|
+
actorId,
|
|
498
|
+
records,
|
|
499
|
+
(_serial, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) =>
|
|
500
|
+
this.dispatchActorPacketInsideMailbox({
|
|
501
|
+
origin: currentApplicationJobOrigin(),
|
|
502
|
+
actorId,
|
|
503
|
+
parts,
|
|
504
|
+
returnResponse,
|
|
505
|
+
remoteBoundSessionTarget,
|
|
506
|
+
fallbackActorRef
|
|
507
|
+
})
|
|
508
|
+
);
|
|
509
|
+
}
|
|
510
|
+
|
|
506
511
|
private async replayActorBacklog(
|
|
507
512
|
actor: ZLinkActor,
|
|
508
513
|
backlog: readonly ZLinkActorHandoffPacket[]
|
|
@@ -2,9 +2,11 @@ import type {
|
|
|
2
2
|
Type,
|
|
3
3
|
ZLinkActor,
|
|
4
4
|
ZLinkEntrySpot,
|
|
5
|
+
ZLinkInstanceSpot,
|
|
5
6
|
ZLinkInstanceSpotHandlerRegistry,
|
|
6
7
|
ZLinkSpot,
|
|
7
|
-
ZLinkSpotHandlerRegistry
|
|
8
|
+
ZLinkSpotHandlerRegistry,
|
|
9
|
+
ZLinkSpotTimerHandler
|
|
8
10
|
} from '../../contracts';
|
|
9
11
|
import type {
|
|
10
12
|
ZLinkEntrySpotActorRequestHandlerRegistration,
|
|
@@ -26,7 +28,7 @@ import { ZLinkActorPacketKind, ZLinkSpotActorHandlerRegistryRuntime } from '../a
|
|
|
26
28
|
import { readZLinkDecoratorMetadata } from '../../contracts/Handlers/Attributes';
|
|
27
29
|
|
|
28
30
|
export interface ZLinkSpotHandlerRegistration {
|
|
29
|
-
readonly kind: 'packet' | 'subscribe' | 'actorSend' | 'actorRequest' | '
|
|
31
|
+
readonly kind: 'packet' | 'subscribe' | 'actorSend' | 'actorRequest' | 'timer';
|
|
30
32
|
readonly handlerType: Type;
|
|
31
33
|
readonly packetName?: string;
|
|
32
34
|
readonly channelName?: string;
|
|
@@ -195,9 +197,11 @@ export class DefaultZLinkSpotHandlerRegistry<
|
|
|
195
197
|
return this.addSubscribe(handlerType, channelName, topic);
|
|
196
198
|
}
|
|
197
199
|
|
|
198
|
-
|
|
200
|
+
addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkSpot>>(
|
|
201
|
+
handlerType: Type<THandler>
|
|
202
|
+
): this {
|
|
199
203
|
prepareHandlerInstance(this.providerResolver, handlerType);
|
|
200
|
-
this.entries.push({ kind: '
|
|
204
|
+
this.entries.push({ kind: 'timer', handlerType });
|
|
201
205
|
return this;
|
|
202
206
|
}
|
|
203
207
|
|
|
@@ -218,6 +222,13 @@ export class DefaultZLinkInstanceSpotHandlerRegistry implements ZLinkInstanceSpo
|
|
|
218
222
|
return this;
|
|
219
223
|
}
|
|
220
224
|
|
|
225
|
+
addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkInstanceSpot>>(
|
|
226
|
+
handlerType: Type<THandler>
|
|
227
|
+
): this {
|
|
228
|
+
this.registrations.addTimerHandler(handlerType as never);
|
|
229
|
+
return this;
|
|
230
|
+
}
|
|
231
|
+
|
|
221
232
|
snapshot(): readonly ZLinkSpotHandlerRegistration[] {
|
|
222
233
|
return this.registrations.snapshot();
|
|
223
234
|
}
|
|
@@ -196,7 +196,7 @@ export class ZLinkPublicSpotManager implements ZLinkSpotManager {
|
|
|
196
196
|
yield: (signal) => {
|
|
197
197
|
const yieldTurn = requireZLinkYieldTurn(turn);
|
|
198
198
|
const pending = this.submit(spotId, stableType, generatedIdentity, state, signal);
|
|
199
|
-
return yieldTurn.
|
|
199
|
+
return yieldTurn.yieldFrameworkPromise(pending);
|
|
200
200
|
}
|
|
201
201
|
};
|
|
202
202
|
return call;
|
|
@@ -264,7 +264,7 @@ export class ZLinkPublicSpotManager implements ZLinkSpotManager {
|
|
|
264
264
|
}
|
|
265
265
|
};
|
|
266
266
|
} catch (error) {
|
|
267
|
-
this.options.local.abortUserSpotPublication(target.meshName, spotId);
|
|
267
|
+
await this.options.local.abortUserSpotPublication(target.meshName, spotId);
|
|
268
268
|
throw error;
|
|
269
269
|
}
|
|
270
270
|
},
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { routingIdsEqual } from '../routing-id';
|
|
1
2
|
import { ZLINK_DEFAULT_PUBLIC_WEIGHT } from '../../contracts/Configuration/RegistrationBuilderPolicy';
|
|
2
3
|
import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
|
|
3
4
|
import type { ZLinkPeerLocationFilter } from '../../contracts/Locations/Keys';
|
|
@@ -8,13 +9,13 @@ import { ZLinkLocationAutoConnectType } from '../../contracts/Locations/Values';
|
|
|
8
9
|
import { ZLinkFrameworkRuntimeState, ZLinkLocationRole } from '../../contracts';
|
|
9
10
|
import type { ZLinkSpotNodeOptions } from '../configuration';
|
|
10
11
|
import type { ZLinkBackendMeshNode } from '../backend/contracts';
|
|
11
|
-
import {
|
|
12
|
-
import { ZLinkStateLane } from '../execution/state-lane';
|
|
12
|
+
import { startOutsideStateLane, ZLinkStateLane } from '../execution/state-lane';
|
|
13
13
|
import { toBackendRoutingId as toBackendRoutingId } from '../routing-id';
|
|
14
14
|
import { MeshPeerRuntimeState } from '../foundation/service-runtime-contracts';
|
|
15
15
|
import {
|
|
16
16
|
ZLinkLocationRuntime,
|
|
17
17
|
ZLinkOwnerLeaseTracker,
|
|
18
|
+
ZLinkRequestSourceResolver,
|
|
18
19
|
type IZLinkAutoConnectExecutor,
|
|
19
20
|
type ZLinkAutoConnectLocal,
|
|
20
21
|
type ZLinkAutoConnectTarget,
|
|
@@ -28,6 +29,7 @@ export interface ZLinkSpotNodeLocationAutoConnectContext {
|
|
|
28
29
|
readonly options: ZLinkLocationOptionOverrides;
|
|
29
30
|
readonly leaseTracker: ZLinkOwnerLeaseTracker;
|
|
30
31
|
readonly resolver: ZLinkPeerLocationResolver;
|
|
32
|
+
readonly requestSources: ZLinkRequestSourceResolver;
|
|
31
33
|
readonly events?: ZLinkLocationEventSink;
|
|
32
34
|
readonly changeStampStore?: Pick<ZLinkLocationStore, 'getMeshNodeChangeStamp'>;
|
|
33
35
|
}
|
|
@@ -48,12 +50,17 @@ export function createSpotNodeLocationAutoConnectContext(
|
|
|
48
50
|
store: stores.ownerLeaseStore,
|
|
49
51
|
options
|
|
50
52
|
});
|
|
53
|
+
const requestSources = new ZLinkRequestSourceResolver({
|
|
54
|
+
listLiveMeshNodes: (meshName, signal) => runtime.listLiveMeshNodes(meshName, signal),
|
|
55
|
+
remainingOwnerTokenLeaseMs: (owner, signal) => runtime.remainingOwnerTokenLeaseMs(owner, signal)
|
|
56
|
+
});
|
|
51
57
|
return {
|
|
52
58
|
runtime,
|
|
53
59
|
stores,
|
|
54
60
|
options,
|
|
55
61
|
leaseTracker,
|
|
56
|
-
resolver: meshDescriptorPeerResolver(runtime),
|
|
62
|
+
resolver: meshDescriptorPeerResolver(runtime, requestSources),
|
|
63
|
+
requestSources,
|
|
57
64
|
events,
|
|
58
65
|
// The opaque provider has no cross-process change notification primitive.
|
|
59
66
|
// A process-local inherited stamp would hide descriptors written by peers,
|
|
@@ -86,14 +93,16 @@ export function spotNodeAutoConnectCapability(
|
|
|
86
93
|
(channel) => channel.server === true
|
|
87
94
|
)
|
|
88
95
|
};
|
|
89
|
-
const manualConnections = hasManualRouterConnections(spotNode);
|
|
90
96
|
return {
|
|
91
97
|
local,
|
|
92
|
-
executor: new ZLinkSpotNodeAutoConnectExecutor(node
|
|
98
|
+
executor: new ZLinkSpotNodeAutoConnectExecutor(node)
|
|
93
99
|
};
|
|
94
100
|
}
|
|
95
101
|
|
|
96
|
-
function meshDescriptorPeerResolver(
|
|
102
|
+
function meshDescriptorPeerResolver(
|
|
103
|
+
runtime: ZLinkLocationRuntime,
|
|
104
|
+
requestSources: ZLinkRequestSourceResolver
|
|
105
|
+
): ZLinkPeerLocationResolver {
|
|
97
106
|
return {
|
|
98
107
|
async listLivePeers(
|
|
99
108
|
filter: ZLinkPeerLocationFilter,
|
|
@@ -108,6 +117,8 @@ function meshDescriptorPeerResolver(runtime: ZLinkLocationRuntime): ZLinkPeerLoc
|
|
|
108
117
|
return [];
|
|
109
118
|
}
|
|
110
119
|
const descriptors = await runtime.listLiveMeshNodes(filter.meshName, signal);
|
|
120
|
+
// The auto-connect poll owns the live descriptors; request acceptance reads them.
|
|
121
|
+
await requestSources.observeLiveDescriptors(filter.meshName, descriptors, signal);
|
|
111
122
|
return descriptors
|
|
112
123
|
.map((descriptor): ZLinkPeerLocation => ({
|
|
113
124
|
autoConnectType: ZLinkLocationAutoConnectType.RouteMesh,
|
|
@@ -130,22 +141,13 @@ function meshDescriptorPeerResolver(runtime: ZLinkLocationRuntime): ZLinkPeerLoc
|
|
|
130
141
|
}))
|
|
131
142
|
.filter(
|
|
132
143
|
(peer) =>
|
|
133
|
-
(filter.nodeRid === undefined ||
|
|
144
|
+
(filter.nodeRid === undefined || routingIdsEqual(peer.nodeRid, filter.nodeRid)) &&
|
|
134
145
|
(filter.endpoint === undefined || peer.endpoint === filter.endpoint)
|
|
135
146
|
);
|
|
136
147
|
}
|
|
137
148
|
};
|
|
138
149
|
}
|
|
139
150
|
|
|
140
|
-
function hasManualRouterConnections(spotNode: ZLinkSpotNodeOptions): boolean {
|
|
141
|
-
return (
|
|
142
|
-
(spotNode.router?.manualConnections?.length ?? 0) > 0 ||
|
|
143
|
-
(spotNode.router?.manualPeerConnections?.length ?? 0) > 0
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const detachedSpotNodeAutoConnectResource = new AsyncResource('zlink:spot-node-autoconnect');
|
|
148
|
-
|
|
149
151
|
interface ZLinkSpotNodeConnectionIntent {
|
|
150
152
|
connectionIntentId?: bigint;
|
|
151
153
|
}
|
|
@@ -154,10 +156,7 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
|
|
|
154
156
|
private readonly lane = new ZLinkStateLane();
|
|
155
157
|
private readonly connectionIntents = new Map<string, ZLinkSpotNodeConnectionIntent>();
|
|
156
158
|
|
|
157
|
-
constructor(
|
|
158
|
-
private readonly node: ZLinkBackendMeshNode,
|
|
159
|
-
private readonly manualConnections: boolean
|
|
160
|
-
) {}
|
|
159
|
+
constructor(private readonly node: ZLinkBackendMeshNode) {}
|
|
161
160
|
|
|
162
161
|
onDisconnected(handler: (endpoint: string) => void): void {
|
|
163
162
|
this.node.onPeerDisconnected?.(handler);
|
|
@@ -172,7 +171,7 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
|
|
|
172
171
|
return false;
|
|
173
172
|
const intent = await this.lane.run(() => this.prepareConnectCore(key));
|
|
174
173
|
if (intent === undefined) return true;
|
|
175
|
-
return await
|
|
174
|
+
return await startOutsideStateLane(() => this.connectPeer(target, key, intent));
|
|
176
175
|
}
|
|
177
176
|
|
|
178
177
|
disconnect(target: ZLinkAutoConnectTarget): void {
|
|
@@ -180,24 +179,6 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
|
|
|
180
179
|
this.disconnectPeer(target);
|
|
181
180
|
}
|
|
182
181
|
|
|
183
|
-
disconnectStalePeers(targets: readonly ZLinkAutoConnectTarget[]): void {
|
|
184
|
-
if (this.manualConnections) return;
|
|
185
|
-
const current = new Map(
|
|
186
|
-
targets
|
|
187
|
-
.filter((target) => target.nodeRid !== undefined)
|
|
188
|
-
.map((target) => [String(target.nodeRid), target])
|
|
189
|
-
);
|
|
190
|
-
const peers = this.node.peers();
|
|
191
|
-
for (const peer of peers) {
|
|
192
|
-
if (peer.routingId === null) continue;
|
|
193
|
-
const target = current.get(String(peer.routingId));
|
|
194
|
-
if (target !== undefined && peer.endpoint === target.endpoint) {
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
this.node.disconnectPeer(peer.routingId, peer.lifecycleGeneration);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
182
|
isDisconnected(target: ZLinkAutoConnectTarget): boolean {
|
|
202
183
|
// A connect intent still owns transport state even when its peer has not
|
|
203
184
|
// reached the admitted table yet. Shutdown must remove that intent before
|
|
@@ -209,7 +190,7 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
|
|
|
209
190
|
(peer) =>
|
|
210
191
|
peer.routingId !== null &&
|
|
211
192
|
peer.endpoint === target.endpoint &&
|
|
212
|
-
(target.nodeRid === undefined ||
|
|
193
|
+
(target.nodeRid === undefined || routingIdsEqual(peer.routingId, target.nodeRid)) &&
|
|
213
194
|
peer.lifecycleGeneration === target.lifecycleGeneration &&
|
|
214
195
|
peer.state === MeshPeerRuntimeState.Serving
|
|
215
196
|
);
|
|
@@ -291,7 +272,7 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
|
|
|
291
272
|
if (peer.endpoint !== target.endpoint) {
|
|
292
273
|
continue;
|
|
293
274
|
}
|
|
294
|
-
if (target.nodeRid !== undefined &&
|
|
275
|
+
if (target.nodeRid !== undefined && !routingIdsEqual(peer.routingId, target.nodeRid)) {
|
|
295
276
|
continue;
|
|
296
277
|
}
|
|
297
278
|
this.node.disconnectPeer(peer.routingId, peer.lifecycleGeneration);
|
|
@@ -299,10 +280,6 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
|
|
|
299
280
|
}
|
|
300
281
|
}
|
|
301
282
|
|
|
302
|
-
function runDetachedSpotNodeAutoConnect<T>(work: () => Promise<T>): Promise<T> {
|
|
303
|
-
return detachedSpotNodeAutoConnectResource.runInAsyncScope(work);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
283
|
function connectionKey(target: ZLinkAutoConnectTarget): string {
|
|
307
284
|
return `${target.nodeRid ?? ''}\0${target.lifecycleGeneration}\0${target.endpoint}`;
|
|
308
285
|
}
|