@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
|
@@ -62,29 +62,27 @@ export class ZLinkSpotActivationRegistry {
|
|
|
62
62
|
|
|
63
63
|
resolve(meshName: string, spotId: RoutingId): ZLinkSpotActivation | undefined {
|
|
64
64
|
const key = spotActivationKey(meshName, spotId);
|
|
65
|
-
return this.staged.has(key) ? undefined : this.activations.get(key);
|
|
65
|
+
return this.staged.has(key) || this.pending.has(key) ? undefined : this.activations.get(key);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
resolveUnique(spotId: RoutingId): ZLinkSpotActivation | undefined {
|
|
69
69
|
const matches = [...this.activations.values()].filter(
|
|
70
70
|
(activation) =>
|
|
71
71
|
String(activation.spotId) === String(spotId) &&
|
|
72
|
-
|
|
72
|
+
this.has(activation.meshName, activation.spotId)
|
|
73
73
|
);
|
|
74
74
|
return matches.length === 1 ? matches[0] : undefined;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
has(meshName: string, spotId: RoutingId): boolean {
|
|
78
|
-
|
|
79
|
-
return !this.staged.has(key) && this.activations.has(key);
|
|
78
|
+
return this.resolve(meshName, spotId) !== undefined;
|
|
80
79
|
}
|
|
81
80
|
|
|
82
81
|
list(meshName: string): readonly ZLinkSpotInfo[] {
|
|
83
82
|
return [...this.activations.values()]
|
|
84
83
|
.filter((activation) => {
|
|
85
84
|
if (activation.meshName !== meshName) return false;
|
|
86
|
-
|
|
87
|
-
return !this.staged.has(key);
|
|
85
|
+
return this.has(activation.meshName, activation.spotId);
|
|
88
86
|
})
|
|
89
87
|
.map((activation) => String(activation.spotId))
|
|
90
88
|
.sort((left, right) => left.localeCompare(right))
|
|
@@ -155,24 +153,38 @@ export class ZLinkSpotActivationRegistry {
|
|
|
155
153
|
});
|
|
156
154
|
}
|
|
157
155
|
|
|
158
|
-
|
|
156
|
+
registerPreparing(activation: ZLinkSpotActivation): void {
|
|
157
|
+
this.registerIncarnation(activation);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
register(activation: ZLinkSpotActivation): ZLinkSpotActivation | undefined {
|
|
161
|
+
return this.registerIncarnation(activation);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private registerIncarnation(activation: ZLinkSpotActivation): ZLinkSpotActivation | undefined {
|
|
159
165
|
const key = spotActivationKey(activation.meshName, activation.spotId);
|
|
160
|
-
|
|
166
|
+
const existing = this.activations.get(key);
|
|
167
|
+
if (existing !== undefined && existing !== activation) {
|
|
161
168
|
throw createInternalFrameworkException(
|
|
162
169
|
ZLinkFrameworkInternalErrorKind.SpotTypeMismatch,
|
|
163
170
|
`Spot '${activation.spotId}' was activated more than once.`
|
|
164
171
|
);
|
|
165
172
|
}
|
|
166
|
-
|
|
167
|
-
|
|
173
|
+
if (existing === undefined) {
|
|
174
|
+
this.activations.set(key, activation);
|
|
175
|
+
this.lifecycleMetrics.opened('user');
|
|
176
|
+
}
|
|
177
|
+
return this.staged.has(key) ? undefined : activation;
|
|
168
178
|
}
|
|
169
179
|
|
|
170
180
|
stage(meshName: string, spotId: RoutingId): void {
|
|
171
181
|
this.staged.add(spotActivationKey(meshName, spotId));
|
|
172
182
|
}
|
|
173
183
|
|
|
174
|
-
publish(meshName: string, spotId: RoutingId):
|
|
175
|
-
|
|
184
|
+
publish(meshName: string, spotId: RoutingId): ZLinkSpotActivation | undefined {
|
|
185
|
+
const key = spotActivationKey(meshName, spotId);
|
|
186
|
+
this.staged.delete(key);
|
|
187
|
+
return this.activations.get(key);
|
|
176
188
|
}
|
|
177
189
|
|
|
178
190
|
detachRelocated(meshName: string, spotId: RoutingId): ZLinkSpotActivation | undefined {
|
|
@@ -250,7 +262,7 @@ export class ZLinkSpotActivationRegistry {
|
|
|
250
262
|
): ZLinkSpotActivationOperation {
|
|
251
263
|
const key = spotActivationKey(meshName, spotId);
|
|
252
264
|
const existing = this.activations.get(key);
|
|
253
|
-
if (existing !== undefined) {
|
|
265
|
+
if (existing !== undefined && !this.pending.has(key)) {
|
|
254
266
|
return {
|
|
255
267
|
owner: false,
|
|
256
268
|
ready: existing.serial.execute(() => {
|
|
@@ -16,7 +16,7 @@ import type { ZLinkBackendSpot } from '../backend/contracts';
|
|
|
16
16
|
import type { ZLinkSpotActorHandlerRegistryRuntime } from '../actors';
|
|
17
17
|
import type { DefaultZLinkSpotHandlerRegistry } from './spot-handler-registry';
|
|
18
18
|
import { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
|
|
19
|
-
import { ZLinkSpotSerialExecutor } from './spot-serial-executor';
|
|
19
|
+
import { ZLinkSpotSerialExecutor, type ZLinkActorPacketTurnDispatch } from './spot-serial-executor';
|
|
20
20
|
import type { ZLinkSpotTimerRegistry } from './spot-timer';
|
|
21
21
|
import type { ZLinkSpotActorJoinDispatch } from './spot-actor-join-dispatch';
|
|
22
22
|
import { ZLinkExecutionBarrier, type ZLinkExecutionBarrierSeal } from '../execution';
|
|
@@ -229,37 +229,30 @@ export class ZLinkSpotActivation {
|
|
|
229
229
|
if (!this.relocationBoundaryConsumed) return;
|
|
230
230
|
this.relocationBoundaryConsumed = false;
|
|
231
231
|
this.relocationReadyDeferredTurnId = undefined;
|
|
232
|
-
await this.serial.
|
|
232
|
+
await this.serial.postBarrierTurn(() => this.notifyRelocationReadyCompleted(outcome));
|
|
233
233
|
}
|
|
234
234
|
|
|
235
235
|
async notifyRelocatedBoundary(): Promise<void> {
|
|
236
|
-
await this.serial.
|
|
236
|
+
await this.serial.postBarrierTurn(() =>
|
|
237
237
|
this.notifyRelocationReadyCompleted(ZLinkSpotRelocationReadyOutcome.Relocated)
|
|
238
238
|
);
|
|
239
239
|
}
|
|
240
240
|
|
|
241
241
|
executeActor<T>(
|
|
242
242
|
actorId: string,
|
|
243
|
-
operation: (serial: ZLinkSpotSerialTurnExecutor) => Promise<T> | T
|
|
243
|
+
operation: (serial: ZLinkSpotSerialTurnExecutor) => Promise<T> | T,
|
|
244
|
+
workOptions?: import('../execution/serial-execution-queue').ZLinkSerialWorkOptions
|
|
244
245
|
): Promise<T> {
|
|
245
|
-
return this.serialExecutor.executeActor(actorId, operation);
|
|
246
|
+
return this.serialExecutor.executeActor(actorId, operation, workOptions);
|
|
246
247
|
}
|
|
247
248
|
|
|
248
249
|
/** @internal Restores a non-executing durable prefix into one Actor FIFO. */
|
|
249
|
-
|
|
250
|
+
admitActorPacketPrefix(
|
|
250
251
|
actorId: string,
|
|
251
|
-
records: readonly
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
serial: import('./spot-serial-turn-executor').ZLinkSpotSerialTurnExecutor
|
|
256
|
-
) => Promise<TChild> | TChild
|
|
257
|
-
) => Promise<TChild>
|
|
258
|
-
) => Promise<void>;
|
|
259
|
-
readonly workOptions?: import('../execution/serial-execution-queue').ZLinkSerialWorkOptions;
|
|
260
|
-
}[]
|
|
261
|
-
): readonly Promise<void>[] {
|
|
262
|
-
return this.serialExecutor.admitActorDurablePrefix(actorId, records);
|
|
252
|
+
records: readonly import('../actors/actor-handoff').ZLinkActorHandoffPrefixRecord[],
|
|
253
|
+
dispatch: ZLinkActorPacketTurnDispatch
|
|
254
|
+
): import('../actors/actor-handoff').ZLinkActorHandoffPrefixAdmission {
|
|
255
|
+
return this.serialExecutor.admitActorPacketPrefix(actorId, records, dispatch);
|
|
263
256
|
}
|
|
264
257
|
|
|
265
258
|
sealExecution(kind: ZLinkExecutionBarrierSeal['kind'] = 'relocation'): ZLinkExecutionBarrierSeal {
|
|
@@ -294,7 +287,7 @@ export class ZLinkSpotActivation {
|
|
|
294
287
|
|
|
295
288
|
abortRelocation(capture: ZLinkSpotRelocationCapture): boolean {
|
|
296
289
|
if (!this.executionBarrier.isCurrent(capture.seal)) return false;
|
|
297
|
-
this.timers.abortRelocation(
|
|
290
|
+
this.timers.abortRelocation();
|
|
298
291
|
return this.abortExecutionSeal(capture.seal);
|
|
299
292
|
}
|
|
300
293
|
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
} from '../../contracts';
|
|
31
31
|
import type { Message } from '../../contracts/Common/Message';
|
|
32
32
|
import type { ZLinkMessageFollowOrigin } from '../foundation/service-runtime-contracts';
|
|
33
|
-
import { throwIfAborted } from '../abort';
|
|
33
|
+
import { createAbortError, isAbortError, throwIfAborted } from '../abort';
|
|
34
34
|
import { ZLinkConfigurationException } from '../configuration';
|
|
35
35
|
import {
|
|
36
36
|
ZLinkFrameworkInternalErrorKind,
|
|
@@ -70,7 +70,8 @@ import {
|
|
|
70
70
|
import {
|
|
71
71
|
addSpotTimerRegistrations,
|
|
72
72
|
ZLinkSpotTimerRegistry,
|
|
73
|
-
type ZLinkTimerClock
|
|
73
|
+
type ZLinkTimerClock,
|
|
74
|
+
type ZLinkTimerRelocationState
|
|
74
75
|
} from './spot-timer';
|
|
75
76
|
import { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
|
|
76
77
|
import { ZLinkSpotSerialExecutor } from './spot-serial-executor';
|
|
@@ -149,7 +150,9 @@ export interface ZLinkSpotActivationLifecycleOptions {
|
|
|
149
150
|
objectGeneration: bigint,
|
|
150
151
|
signal?: AbortSignal
|
|
151
152
|
) => Promise<boolean>;
|
|
152
|
-
readonly registerActivation: (activation: ZLinkSpotActivation) => void
|
|
153
|
+
readonly registerActivation: (activation: ZLinkSpotActivation) => void | Promise<void>;
|
|
154
|
+
readonly stageActivation?: (activation: ZLinkSpotActivation) => void;
|
|
155
|
+
readonly discardActivation?: (activation: ZLinkSpotActivation) => void;
|
|
153
156
|
readonly routeToActorJoinPrewarm?: ZLinkRouteToActorJoinPrewarm;
|
|
154
157
|
readonly releaseLocation: (
|
|
155
158
|
activation: ZLinkSpotActivation,
|
|
@@ -201,6 +204,7 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
201
204
|
spotId: RoutingId,
|
|
202
205
|
objectGeneration: bigint,
|
|
203
206
|
authorityOwnerGeneration: bigint,
|
|
207
|
+
restoredTimers: readonly ZLinkTimerRelocationState[],
|
|
204
208
|
signal?: AbortSignal
|
|
205
209
|
): Promise<ZLinkSpotActivation> {
|
|
206
210
|
const executionMode =
|
|
@@ -241,6 +245,9 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
241
245
|
(name) => serialExecutor.isTimerExecuting(name),
|
|
242
246
|
this.options.timerClock
|
|
243
247
|
);
|
|
248
|
+
// Spot timer §1: the source schedule exists before Configure so its
|
|
249
|
+
// registrations reattach to the restored keys.
|
|
250
|
+
timers.stageRelocation(restoredTimers);
|
|
244
251
|
const outbound = new DefaultZLinkSpotOutbound({
|
|
245
252
|
serial,
|
|
246
253
|
channelClient: this.options.channelClient,
|
|
@@ -305,20 +312,6 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
305
312
|
enumerable: false,
|
|
306
313
|
value: context
|
|
307
314
|
});
|
|
308
|
-
await instance.configure?.();
|
|
309
|
-
await addSpotTimerRegistrations(
|
|
310
|
-
timers,
|
|
311
|
-
implementation as unknown as Type<ZLinkSpot>,
|
|
312
|
-
spotId,
|
|
313
|
-
instance as unknown as ZLinkSpot,
|
|
314
|
-
serial,
|
|
315
|
-
{ timerHandlers: this.options.spotTimerHandlers },
|
|
316
|
-
{
|
|
317
|
-
providerResolver: this.options.providerResolver,
|
|
318
|
-
runtimeEventPublisher: this.options.runtimeEventPublisher,
|
|
319
|
-
signal
|
|
320
|
-
}
|
|
321
|
-
);
|
|
322
315
|
activation = new ZLinkSpotActivation({
|
|
323
316
|
meshName,
|
|
324
317
|
spotId,
|
|
@@ -346,9 +339,42 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
346
339
|
nativeSpot,
|
|
347
340
|
metrics: this.options.metrics
|
|
348
341
|
});
|
|
349
|
-
|
|
342
|
+
serialExecutor.beginPreparation('relocation');
|
|
343
|
+
const configured = instance;
|
|
344
|
+
await serial.postBarrierTurn(() =>
|
|
345
|
+
timers.runRelocationInitialization(async () => {
|
|
346
|
+
await configured.configure?.();
|
|
347
|
+
await addSpotTimerRegistrations(
|
|
348
|
+
timers,
|
|
349
|
+
implementation as unknown as Type<ZLinkSpot>,
|
|
350
|
+
spotId,
|
|
351
|
+
configured as unknown as ZLinkSpot,
|
|
352
|
+
serial,
|
|
353
|
+
{ timerHandlers: this.options.spotTimerHandlers },
|
|
354
|
+
{
|
|
355
|
+
providerResolver: this.options.providerResolver,
|
|
356
|
+
runtimeEventPublisher: this.options.runtimeEventPublisher,
|
|
357
|
+
signal
|
|
358
|
+
}
|
|
359
|
+
);
|
|
360
|
+
// Node timer relocation: restored handlers resolve by name among the
|
|
361
|
+
// constructors announced in Configure (addTimer or addTimerHandler).
|
|
362
|
+
await timers.resolveRelocationHandlers(
|
|
363
|
+
handlers
|
|
364
|
+
.snapshot()
|
|
365
|
+
.filter((entry) => entry.kind === 'timer')
|
|
366
|
+
.map((entry) => entry.handlerType),
|
|
367
|
+
(name, periodMs, handlerType) =>
|
|
368
|
+
context.addTimer(name, periodMs, handlerType as never, undefined, signal)
|
|
369
|
+
);
|
|
370
|
+
})
|
|
371
|
+
);
|
|
372
|
+
await this.options.registerActivation(activation);
|
|
350
373
|
return activation;
|
|
351
374
|
} catch (error) {
|
|
375
|
+
const preparation = await Promise.allSettled(
|
|
376
|
+
activation === undefined ? [] : [this.discardPreparation(activation)]
|
|
377
|
+
);
|
|
352
378
|
const cleanup = await Promise.allSettled([
|
|
353
379
|
timers.dispose(),
|
|
354
380
|
...(instance === undefined
|
|
@@ -356,7 +382,7 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
356
382
|
: [disposeLifecycleHandlers(instance, this.options.detachedTaskRunner)]),
|
|
357
383
|
...(nativeSpot === undefined ? [] : [Promise.resolve().then(() => nativeSpot.dispose())])
|
|
358
384
|
]);
|
|
359
|
-
const cleanupErrors = cleanup
|
|
385
|
+
const cleanupErrors = [...preparation, ...cleanup]
|
|
360
386
|
.filter((result): result is PromiseRejectedResult => result.status === 'rejected')
|
|
361
387
|
.map((result) => result.reason);
|
|
362
388
|
if (cleanupErrors.length > 0) {
|
|
@@ -378,6 +404,7 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
378
404
|
signal?: AbortSignal,
|
|
379
405
|
serialOwner?: ZLinkSpotActivation
|
|
380
406
|
): Promise<ZLinkSpotActivation> {
|
|
407
|
+
throwIfAborted(signal);
|
|
381
408
|
const serial = serialOwner?.serial ?? new ZLinkSpotSerialTurnExecutor(true, spotId);
|
|
382
409
|
const serialExecutor = new ZLinkSpotSerialExecutor(
|
|
383
410
|
serial,
|
|
@@ -453,35 +480,52 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
453
480
|
externalActorCount: () => this.options.actorCountProvider?.(spotId) ?? 0
|
|
454
481
|
});
|
|
455
482
|
try {
|
|
456
|
-
|
|
457
|
-
await
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
483
|
+
if (serialOwner === undefined) serialExecutor.beginPreparation();
|
|
484
|
+
await serial.postBarrierTurn(async () => {
|
|
485
|
+
throwIfAborted(signal);
|
|
486
|
+
await instance.configure?.();
|
|
487
|
+
await addSpotTimerRegistrations(
|
|
488
|
+
timers,
|
|
489
|
+
implementation as unknown as Type<ZLinkSpot>,
|
|
490
|
+
spotId,
|
|
491
|
+
instance as unknown as ZLinkSpot,
|
|
492
|
+
serial,
|
|
493
|
+
{ timerHandlers: this.options.spotTimerHandlers },
|
|
494
|
+
{
|
|
495
|
+
providerResolver: this.options.providerResolver,
|
|
496
|
+
runtimeEventPublisher: this.options.runtimeEventPublisher,
|
|
497
|
+
signal
|
|
498
|
+
}
|
|
499
|
+
);
|
|
500
|
+
throwIfAborted(signal);
|
|
501
|
+
await instance!.onInitialize?.(signal);
|
|
502
|
+
});
|
|
503
|
+
throwIfAborted(signal);
|
|
504
|
+
await this.options.registerActivation(activation);
|
|
474
505
|
return activation;
|
|
475
506
|
} catch (error) {
|
|
476
|
-
const
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
]
|
|
480
|
-
|
|
481
|
-
.
|
|
482
|
-
|
|
507
|
+
const failure = signal?.aborted === true ? createAbortError() : error;
|
|
508
|
+
const cancelled = isAbortError(failure);
|
|
509
|
+
if (cancelled && serialOwner === undefined) serial.closeAdmission();
|
|
510
|
+
const cleanupErrors: unknown[] = [];
|
|
511
|
+
try {
|
|
512
|
+
await serialExecutor.finishPreparation(async () => {
|
|
513
|
+
const cleanup = await Promise.allSettled([
|
|
514
|
+
timers.dispose(),
|
|
515
|
+
disposeLifecycleHandlers(instance, this.options.detachedTaskRunner)
|
|
516
|
+
]);
|
|
517
|
+
cleanupErrors.push(
|
|
518
|
+
...cleanup
|
|
519
|
+
.filter((result): result is PromiseRejectedResult => result.status === 'rejected')
|
|
520
|
+
.map((result) => result.reason)
|
|
521
|
+
);
|
|
522
|
+
});
|
|
523
|
+
} catch (cleanupError) {
|
|
524
|
+
cleanupErrors.push(cleanupError);
|
|
525
|
+
}
|
|
526
|
+
if (cancelled && cleanupErrors.length === 0) throw failure;
|
|
483
527
|
throw new AggregateError(
|
|
484
|
-
[
|
|
528
|
+
[failure, ...cleanupErrors],
|
|
485
529
|
`Instance Spot '${instanceType}' materialization failed for '${String(spotId)}'.`
|
|
486
530
|
);
|
|
487
531
|
}
|
|
@@ -489,6 +533,11 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
489
533
|
|
|
490
534
|
async discardInstance(activation: ZLinkSpotActivation): Promise<void> {
|
|
491
535
|
const errors: unknown[] = [];
|
|
536
|
+
try {
|
|
537
|
+
await this.discardPreparation(activation);
|
|
538
|
+
} catch (error) {
|
|
539
|
+
errors.push(error);
|
|
540
|
+
}
|
|
492
541
|
try {
|
|
493
542
|
await activation.serial.execute(() =>
|
|
494
543
|
invokeSpotClosing(
|
|
@@ -531,6 +580,7 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
531
580
|
signal?: AbortSignal,
|
|
532
581
|
authority?: ZLinkNativeSpotAuthority
|
|
533
582
|
): Promise<ZLinkLocalSpotCreateResult> {
|
|
583
|
+
throwIfAborted(signal);
|
|
534
584
|
const executionMode =
|
|
535
585
|
this.options.userSpotExecutionMode?.(meshName, spotType) ??
|
|
536
586
|
ZLinkUserSpotExecutionMode.SpotWide;
|
|
@@ -688,12 +738,8 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
688
738
|
const cleanupErrors: unknown[] = [];
|
|
689
739
|
try {
|
|
690
740
|
if (activation !== undefined) {
|
|
691
|
-
|
|
692
|
-
activation,
|
|
693
|
-
locationClaim.meshName,
|
|
694
|
-
lifecycleStarted,
|
|
695
|
-
signal
|
|
696
|
-
);
|
|
741
|
+
if (!lifecycleStarted)
|
|
742
|
+
await this.cleanupActivation(activation, locationClaim.meshName, false);
|
|
697
743
|
} else {
|
|
698
744
|
const partialCleanup = await Promise.allSettled([
|
|
699
745
|
timers.dispose(),
|
|
@@ -863,7 +909,7 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
863
909
|
undefined,
|
|
864
910
|
ZLinkSpotCloseReason.ExplicitClose,
|
|
865
911
|
undefined,
|
|
866
|
-
|
|
912
|
+
!activation.serialExecutor.isPreparing
|
|
867
913
|
);
|
|
868
914
|
}
|
|
869
915
|
|
|
@@ -930,59 +976,69 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
930
976
|
signal?: AbortSignal
|
|
931
977
|
): Promise<ZLinkLocalSpotCreateResult> {
|
|
932
978
|
try {
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
await addSpotTimerRegistrations(
|
|
936
|
-
activation.timers,
|
|
937
|
-
spotType,
|
|
938
|
-
activation.spotId,
|
|
939
|
-
activation.spot,
|
|
940
|
-
activation.serial,
|
|
941
|
-
{ timerHandlers: this.options.spotTimerHandlers },
|
|
942
|
-
{
|
|
943
|
-
providerResolver: this.options.providerResolver,
|
|
944
|
-
runtimeEventPublisher: this.options.runtimeEventPublisher,
|
|
945
|
-
signal
|
|
946
|
-
}
|
|
947
|
-
);
|
|
979
|
+
activation.serialExecutor.beginPreparation();
|
|
980
|
+
this.options.stageActivation?.(activation);
|
|
948
981
|
let createResponse: ZLinkSpotCreateResponse | undefined;
|
|
949
|
-
await activation.serial.
|
|
982
|
+
await activation.serial.postBarrierTurn(async () => {
|
|
983
|
+
throwIfAborted(signal);
|
|
984
|
+
await activation.spot.configure?.();
|
|
985
|
+
nativeDispatch?.configureSubscriptions(activation.handlers.snapshot());
|
|
986
|
+
await addSpotTimerRegistrations(
|
|
987
|
+
activation.timers,
|
|
988
|
+
spotType,
|
|
989
|
+
activation.spotId,
|
|
990
|
+
activation.spot,
|
|
991
|
+
activation.serial,
|
|
992
|
+
{ timerHandlers: this.options.spotTimerHandlers },
|
|
993
|
+
{
|
|
994
|
+
providerResolver: this.options.providerResolver,
|
|
995
|
+
runtimeEventPublisher: this.options.runtimeEventPublisher,
|
|
996
|
+
signal
|
|
997
|
+
}
|
|
998
|
+
);
|
|
999
|
+
throwIfAborted(signal);
|
|
950
1000
|
createResponse = await activation.spot.onCreate?.(
|
|
951
1001
|
wrapFrameworkPayloadMessage(
|
|
952
1002
|
request,
|
|
953
1003
|
this.options.messageSerializers,
|
|
954
1004
|
frameworkPayloadContentType(request)
|
|
955
|
-
)
|
|
1005
|
+
),
|
|
1006
|
+
signal
|
|
956
1007
|
);
|
|
957
1008
|
if (createResponse?.accepted === false) {
|
|
958
1009
|
return;
|
|
959
1010
|
}
|
|
960
|
-
|
|
1011
|
+
throwIfAborted(signal);
|
|
1012
|
+
await activation.spot.onInitialize?.(signal);
|
|
961
1013
|
});
|
|
1014
|
+
throwIfAborted(signal);
|
|
962
1015
|
if (createResponse?.accepted === false) {
|
|
963
|
-
await this.cleanupActivation(activation, locationClaim.meshName, false
|
|
1016
|
+
await this.cleanupActivation(activation, locationClaim.meshName, false);
|
|
964
1017
|
return {
|
|
965
1018
|
spotId: activation.spotId,
|
|
966
1019
|
state: ZLinkSpotCreateState.Rejected,
|
|
967
1020
|
reply: this.decodeCreateReply(createResponse.reply)
|
|
968
1021
|
};
|
|
969
1022
|
}
|
|
970
|
-
this.options.registerActivation(activation);
|
|
1023
|
+
await this.options.registerActivation(activation);
|
|
971
1024
|
return {
|
|
972
1025
|
spotId: activation.spotId,
|
|
973
1026
|
state: ZLinkSpotCreateState.Created,
|
|
974
1027
|
reply: this.decodeCreateReply(createResponse?.reply)
|
|
975
1028
|
};
|
|
976
1029
|
} catch (error) {
|
|
1030
|
+
const failure = signal?.aborted === true ? createAbortError() : error;
|
|
1031
|
+
const cancelled = isAbortError(failure);
|
|
1032
|
+
if (cancelled) activation.serial.closeAdmission();
|
|
977
1033
|
try {
|
|
978
|
-
await this.cleanupActivation(activation, locationClaim.meshName,
|
|
1034
|
+
await this.cleanupActivation(activation, locationClaim.meshName, !cancelled);
|
|
979
1035
|
} catch (cleanupError) {
|
|
980
1036
|
throw new AggregateError(
|
|
981
|
-
[
|
|
1037
|
+
[failure, cleanupError],
|
|
982
1038
|
`Spot '${activation.spotId}' creation cleanup failed.`
|
|
983
1039
|
);
|
|
984
1040
|
}
|
|
985
|
-
throw
|
|
1041
|
+
throw failure;
|
|
986
1042
|
}
|
|
987
1043
|
}
|
|
988
1044
|
|
|
@@ -1007,20 +1063,48 @@ export class ZLinkSpotActivationLifecycle {
|
|
|
1007
1063
|
};
|
|
1008
1064
|
this.cleanupStates.set(activation, state);
|
|
1009
1065
|
if (state.inFlight !== undefined) return await state.inFlight;
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1066
|
+
let result: unknown;
|
|
1067
|
+
const cleanup = async (ownsLifecycle: boolean) => {
|
|
1068
|
+
try {
|
|
1069
|
+
result = await this.runCleanup(
|
|
1070
|
+
activation,
|
|
1071
|
+
locationMeshName,
|
|
1072
|
+
notifyClosing,
|
|
1073
|
+
reason,
|
|
1074
|
+
state,
|
|
1075
|
+
deadline,
|
|
1076
|
+
ownsLifecycle
|
|
1077
|
+
);
|
|
1078
|
+
} finally {
|
|
1079
|
+
if (activation.serialExecutor.isPreparing) {
|
|
1080
|
+
activation.serial.closeAdmission();
|
|
1081
|
+
// The receive pump releases retained payloads when these records finish.
|
|
1082
|
+
activation.serial.visitPendingApplication((record) => {
|
|
1083
|
+
record.operation = () => undefined;
|
|
1084
|
+
});
|
|
1085
|
+
this.options.discardActivation?.(activation);
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
};
|
|
1089
|
+
state.inFlight = (
|
|
1090
|
+
!owningLifecycle && activation.serialExecutor.isPreparing
|
|
1091
|
+
? activation.serialExecutor.finishPreparation(() => cleanup(true))
|
|
1092
|
+
: cleanup(owningLifecycle)
|
|
1093
|
+
)
|
|
1094
|
+
.then(() => result)
|
|
1095
|
+
.finally(() => {
|
|
1096
|
+
state.inFlight = undefined;
|
|
1097
|
+
});
|
|
1021
1098
|
return await state.inFlight;
|
|
1022
1099
|
}
|
|
1023
1100
|
|
|
1101
|
+
async discardPreparation(activation: ZLinkSpotActivation): Promise<void> {
|
|
1102
|
+
if (!activation.serialExecutor.isPreparing) return;
|
|
1103
|
+
// Clear timer generations before opening admission, so an already due
|
|
1104
|
+
// dispatch can finish without invoking application code.
|
|
1105
|
+
await activation.serialExecutor.finishPreparation(() => activation.timers.dispose());
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1024
1108
|
private async runCleanup(
|
|
1025
1109
|
activation: ZLinkSpotActivation,
|
|
1026
1110
|
locationMeshName: string,
|
|
@@ -59,22 +59,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
59
59
|
remoteBoundSessionTarget,
|
|
60
60
|
fallbackActorRef,
|
|
61
61
|
undefined,
|
|
62
|
-
messageFollowOrigin
|
|
63
|
-
(
|
|
64
|
-
replayedParts,
|
|
65
|
-
replayReturnResponse,
|
|
66
|
-
replayRemoteBoundSessionTarget,
|
|
67
|
-
replayFallbackActorRef
|
|
68
|
-
) =>
|
|
69
|
-
this.dispatchActorPacketDirect(
|
|
70
|
-
origin,
|
|
71
|
-
activation,
|
|
72
|
-
actorId,
|
|
73
|
-
replayedParts,
|
|
74
|
-
replayReturnResponse,
|
|
75
|
-
replayRemoteBoundSessionTarget,
|
|
76
|
-
replayFallbackActorRef
|
|
77
|
-
)
|
|
62
|
+
messageFollowOrigin
|
|
78
63
|
);
|
|
79
64
|
if (handoff !== undefined) return await handoff;
|
|
80
65
|
return await this.dispatchActorPacketDirect(
|
|
@@ -102,10 +87,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
102
87
|
),
|
|
103
88
|
serial: activation.serial,
|
|
104
89
|
actors: {
|
|
105
|
-
resolveActor: (actorId) =>
|
|
106
|
-
activation.hasDepartedActor(actorId)
|
|
107
|
-
? undefined
|
|
108
|
-
: (activation.resolveJoinedActor(actorId) ?? this.options.actorResolver?.(actorId)),
|
|
90
|
+
resolveActor: (actorId) => this.resolveActor(activation, actorId),
|
|
109
91
|
getTarget: () => activation.spot,
|
|
110
92
|
defaultAccept: false,
|
|
111
93
|
transfer:
|
|
@@ -192,38 +174,21 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
192
174
|
actorId: string,
|
|
193
175
|
records: readonly ZLinkActorHandoffPrefixRecord[]
|
|
194
176
|
): ZLinkActorHandoffPrefixAdmission {
|
|
195
|
-
|
|
177
|
+
return activation.admitActorPacketPrefix(
|
|
196
178
|
actorId,
|
|
197
|
-
records
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
fallbackActorRef
|
|
210
|
-
)
|
|
211
|
-
)
|
|
212
|
-
),
|
|
213
|
-
preparation: record.preparation,
|
|
214
|
-
workOptions: { payloadBytes: record.payloadBytes }
|
|
215
|
-
}))
|
|
179
|
+
records,
|
|
180
|
+
(actorSerial, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) =>
|
|
181
|
+
this.dispatchActorPacketInActorTurn(
|
|
182
|
+
currentApplicationJobOrigin(),
|
|
183
|
+
activation,
|
|
184
|
+
actorSerial,
|
|
185
|
+
actorId,
|
|
186
|
+
parts,
|
|
187
|
+
returnResponse,
|
|
188
|
+
remoteBoundSessionTarget,
|
|
189
|
+
fallbackActorRef
|
|
190
|
+
)
|
|
216
191
|
);
|
|
217
|
-
const terminal = Promise.allSettled(terminals).then((outcomes) => {
|
|
218
|
-
const errors = outcomes.flatMap((outcome) =>
|
|
219
|
-
outcome.status === 'rejected' ? [outcome.reason] : []
|
|
220
|
-
);
|
|
221
|
-
if (errors.length === 1) throw errors[0];
|
|
222
|
-
if (errors.length > 1) {
|
|
223
|
-
throw new AggregateError(errors, `Actor '${actorId}' durable prefix replay failed.`);
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
return { terminal };
|
|
227
192
|
}
|
|
228
193
|
|
|
229
194
|
private dispatchActorPacketInActorTurn(
|
|
@@ -242,11 +207,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
242
207
|
spotId: () => String(activation.spotId),
|
|
243
208
|
registry: activation.actorHandlers,
|
|
244
209
|
serial: actorSerial,
|
|
245
|
-
resolveActor: (targetActorId) =>
|
|
246
|
-
activation.hasDepartedActor(targetActorId)
|
|
247
|
-
? undefined
|
|
248
|
-
: (activation.resolveJoinedActor(targetActorId) ??
|
|
249
|
-
this.options.actorResolver?.(targetActorId)),
|
|
210
|
+
resolveActor: (targetActorId) => this.resolveActor(activation, targetActorId),
|
|
250
211
|
actorLeft: (targetActorId) => activation.hasDepartedActor(targetActorId),
|
|
251
212
|
onDisconnectActor: (actor) =>
|
|
252
213
|
activation.serial.execute(() => activation.spot.onDisconnectActor?.(actor)),
|
|
@@ -271,6 +232,15 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
271
232
|
);
|
|
272
233
|
}
|
|
273
234
|
|
|
235
|
+
private resolveActor(activation: ZLinkSpotActivation, actorId: string): ZLinkActor | undefined {
|
|
236
|
+
if (activation.hasDepartedActor(actorId)) return undefined;
|
|
237
|
+
// The manager owns relocation visibility. Membership alone cannot publish
|
|
238
|
+
// a staged Actor; resolver absence supports standalone Spot runtimes.
|
|
239
|
+
return this.options.actorResolver === undefined
|
|
240
|
+
? activation.resolveJoinedActor(actorId)
|
|
241
|
+
: this.options.actorResolver(actorId);
|
|
242
|
+
}
|
|
243
|
+
|
|
274
244
|
private async commitTransferredActorTransaction(
|
|
275
245
|
activation: ZLinkSpotActivation,
|
|
276
246
|
actor: ZLinkActor,
|