@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
|
@@ -9,6 +9,7 @@ import type { ZLinkListenerRecords } from '../foundation/listener-records';
|
|
|
9
9
|
import { ApplicationJobQueue } from '../host/application-job-queue';
|
|
10
10
|
import type { ZLinkSubmitResult } from '../messaging/submission-result';
|
|
11
11
|
import { type ZLinkActorSessionAuthorityFence } from './actor-session-binding-registry';
|
|
12
|
+
import { type ZLinkBoundActorRelaySenderOptions } from './bound-actor-relay-sender';
|
|
12
13
|
import { type ZLinkBoundSessionResponseTarget } from './bound-session-response-target';
|
|
13
14
|
import { type ZLinkBoundSessionTransport } from './bound-session-service';
|
|
14
15
|
import { ZLinkManagedStream } from './managed-stream';
|
|
@@ -45,7 +46,7 @@ export interface ZLinkStreamBindingRuntimeOptions {
|
|
|
45
46
|
reportRuntimeTaskException(taskName: string, error: unknown): void;
|
|
46
47
|
} | undefined;
|
|
47
48
|
readonly relay?: (actor: ZLinkSessionActor, header: ZLinkStreamFrameHeader, payload: Message) => Promise<boolean>;
|
|
48
|
-
readonly notifyDisconnected?:
|
|
49
|
+
readonly notifyDisconnected?: ZLinkBoundActorRelaySenderOptions['notifyDisconnected'];
|
|
49
50
|
readonly flowCreationEnabled?: () => boolean;
|
|
50
51
|
readonly metrics?: import('../diagnostics').ZLinkRuntimeMetrics;
|
|
51
52
|
}
|
|
@@ -139,7 +140,7 @@ export declare class ZLinkStreamBindingRuntime {
|
|
|
139
140
|
sendNativeBoundSession(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, message: unknown, packetName: string | undefined, metadata: ReadonlyMap<string, string>, signal?: AbortSignal): Promise<ZLinkSubmitResult>;
|
|
140
141
|
sendNativeBoundSessionResponse(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, packetName: string, requestSeq: bigint, message: unknown, metadata: ReadonlyMap<string, string>, compressPayload: boolean, signal?: AbortSignal): Promise<void>;
|
|
141
142
|
sendNativeBoundSessionError(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, packetName: string, requestSeq: bigint, error: unknown, metadata: ReadonlyMap<string, string>, signal?: AbortSignal): Promise<void>;
|
|
142
|
-
disconnectNativeBoundSession(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, signal?: AbortSignal): Promise<void>;
|
|
143
|
+
disconnectNativeBoundSession(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, timeoutMs: number, signal?: AbortSignal): Promise<void>;
|
|
143
144
|
disconnectBoundSession(actorId: string, signal?: AbortSignal): Promise<void>;
|
|
144
145
|
closeSessionBinding(actorId: string, expected: ZLinkSessionBindingIdentity, signal?: AbortSignal): Promise<void>;
|
|
145
146
|
relay(actor: DefaultZLinkSessionActor, payload: ZLinkMessage, dispatchHeader?: ZLinkStreamFrameHeader): Promise<ZLinkSubmitResult>;
|
|
@@ -220,12 +220,14 @@ class ZLinkStreamBindingRuntime {
|
|
|
220
220
|
this.sessionActors = new session_actor_coordinator_1.ZLinkSessionActorCoordinator(this.routes, this, runtimeOptions, actorSessionLifecycle);
|
|
221
221
|
this.boundActorRelay = new bound_actor_relay_sender_1.ZLinkBoundActorRelaySender(this.routes, this.frameMessages, runtimeOptions, actorSessionLifecycle);
|
|
222
222
|
(0, actor_session_binding_runtime_owner_1.registerActorSessionBindingRuntimeOwner)(this, {
|
|
223
|
+
prepareSessionRelocationSeal: (...args) => this.routes.prepareSessionRelocationSeal(...args),
|
|
224
|
+
acceptSessionRelocationRoute: (value, apply) => this.routes.acceptSessionRelocationRoute(value, apply),
|
|
225
|
+
clearSessionRelocationResults: () => this.routes.clearSessionRelocationResults(),
|
|
223
226
|
actorSlot: async (actorId, sessionRid) => (await this.routes.routeForSessionBinding(actorId, sessionRid))?.actorSlot,
|
|
224
|
-
sealRelocation: (claim, expected, signal) => this.routes.sealRelocation(claim, expected, signal),
|
|
225
227
|
relocationSnapshot: (actorId, sealId) => this.routes.relocationSnapshot(actorId, sealId),
|
|
226
228
|
applyRelocation: (...args) => this.routes.applyRelocation(...args),
|
|
227
229
|
observeRelocationTerminal: (...args) => this.routes.observeRelocationTerminal(...args),
|
|
228
|
-
clearRelocation: (
|
|
230
|
+
clearRelocation: (...args) => this.routes.clearRelocation(...args),
|
|
229
231
|
committedRoute: async (actorId) => {
|
|
230
232
|
const route = await this.routes.route(actorId);
|
|
231
233
|
return route === undefined
|
|
@@ -319,8 +321,8 @@ class ZLinkStreamBindingRuntime {
|
|
|
319
321
|
async sendNativeBoundSessionError(node, actorRef, packetName, requestSeq, error, metadata, signal) {
|
|
320
322
|
await this.boundSessions.sendNativeBoundSessionError(node, actorRef, packetName, requestSeq, error, metadata, signal);
|
|
321
323
|
}
|
|
322
|
-
async disconnectNativeBoundSession(node, actorRef, signal) {
|
|
323
|
-
await this.boundSessions.disconnectNativeBoundSession(node, actorRef, signal);
|
|
324
|
+
async disconnectNativeBoundSession(node, actorRef, timeoutMs, signal) {
|
|
325
|
+
await this.boundSessions.disconnectNativeBoundSession(node, actorRef, timeoutMs, signal);
|
|
324
326
|
}
|
|
325
327
|
async disconnectBoundSession(actorId, signal) {
|
|
326
328
|
await this.boundSessions.disconnectBoundSession(actorId, signal);
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkManagedStream = void 0;
|
|
4
4
|
exports.streamSessionIdFromRoutingId = streamSessionIdFromRoutingId;
|
|
5
|
+
const routing_id_1 = require("../routing-id");
|
|
5
6
|
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
6
7
|
const submission_result_1 = require("../messaging/submission-result");
|
|
7
8
|
const abort_1 = require("../abort");
|
|
@@ -140,7 +141,7 @@ class ZLinkManagedStream {
|
|
|
140
141
|
? undefined
|
|
141
142
|
: (_actorId, retiredSession, replacedActor) => {
|
|
142
143
|
onBindingReplaced(replacedActor, retiredSession);
|
|
143
|
-
}, toStreamSessionActorAuthorityFence(authorityFence)), signal), `Actor '${actor.actorId}' native session bind`);
|
|
144
|
+
}, toStreamSessionActorAuthorityFence(authorityFence), () => this.close()), signal), `Actor '${actor.actorId}' native session bind`);
|
|
144
145
|
const binding = route.service
|
|
145
146
|
.bindings(this.backendRoutingId())
|
|
146
147
|
.find((candidate) => candidate.actor.actorId === nativeActor.actorId &&
|
|
@@ -180,7 +181,7 @@ class ZLinkManagedStream {
|
|
|
180
181
|
resolved === undefined ||
|
|
181
182
|
resolved.actorId !== actor.actorId ||
|
|
182
183
|
resolved.generation !== actor.objectGeneration ||
|
|
183
|
-
|
|
184
|
+
!(0, routing_id_1.routingIdsEqual)(resolved.nodeRid, actor.nodeRid)) {
|
|
184
185
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorRouteNotFound, `Actor '${actor.actorId}' native route fence does not match its ActorRef ` +
|
|
185
186
|
`(expected ${String(actor.nodeRid)}/${actor.objectGeneration}, ` +
|
|
186
187
|
`resolved ${(0, diagnostic_text_1.diagnosticTextOrAbsent)(resolved === undefined
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkNativeFallbackBoundSession = void 0;
|
|
4
|
+
const Registration_1 = require("../../contracts/Configuration/Registration");
|
|
4
5
|
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
5
6
|
const contracts_1 = require("../../contracts");
|
|
6
7
|
const submission_result_1 = require("../messaging/submission-result");
|
|
7
8
|
const actors_1 = require("../actors");
|
|
8
9
|
const actor_packet_relay_wire_1 = require("../actors/actor-packet-relay-wire");
|
|
9
10
|
const bound_session_wire_1 = require("../actors/bound-session-wire");
|
|
10
|
-
const actor_routed_json_request_1 = require("../actors/actor-routed-json-request");
|
|
11
|
-
const protocol_1 = require("./protocol");
|
|
12
11
|
const packet_name_1 = require("../messaging/packet-name");
|
|
13
12
|
const flow_context_1 = require("../diagnostics/flow-context");
|
|
14
13
|
class ZLinkNativeFallbackBoundSession {
|
|
@@ -20,40 +19,12 @@ class ZLinkNativeFallbackBoundSession {
|
|
|
20
19
|
return new ZLinkNativeFallbackBoundSessionSendCall(this.options, message);
|
|
21
20
|
}
|
|
22
21
|
async disconnect(signal) {
|
|
23
|
-
const remoteTarget = this.options.remoteBoundSessionTargetProvider();
|
|
24
|
-
if (remoteTarget !== undefined) {
|
|
25
|
-
const spotKind = 'spotKind' in remoteTarget
|
|
26
|
-
? remoteTarget.spotKind
|
|
27
|
-
: undefined;
|
|
28
|
-
const payload = (0, actor_packet_relay_wire_1.encodeRemoteActorPacketRelayPayload)({
|
|
29
|
-
actorId: this.options.actorId,
|
|
30
|
-
routerChannelId: remoteTarget.routerChannelId,
|
|
31
|
-
header: (0, protocol_1.encodeStreamHeader)(disconnectedFrameHeader()),
|
|
32
|
-
payload: Buffer.alloc(0)
|
|
33
|
-
});
|
|
34
|
-
const target = {
|
|
35
|
-
routerChannelId: remoteTarget.routerChannelId,
|
|
36
|
-
targetNodeRid: remoteTarget.targetNodeRid,
|
|
37
|
-
spotId: remoteTarget.spotId,
|
|
38
|
-
spotKind: spotKind ?? contracts_1.ZLinkSpotKind.Entry
|
|
39
|
-
};
|
|
40
|
-
if (await (0, actor_routed_json_request_1.tryRequestRoutedJson)(this.options.routedTransport, target, payload, {
|
|
41
|
-
timeoutMs: this.options.requestTimeoutMs,
|
|
42
|
-
signal
|
|
43
|
-
})) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
await this.options.routedTransport.sendToSpot(target, payload, {
|
|
47
|
-
packetName: actors_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
|
|
48
|
-
});
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
22
|
const actorRef = this.options.actorRefProvider();
|
|
52
23
|
const node = this.options.nativeActorNodeProvider();
|
|
53
24
|
if (actorRef !== undefined &&
|
|
54
25
|
node !== undefined &&
|
|
55
26
|
currentBindingGeneration(actorRef) !== undefined) {
|
|
56
|
-
await this.options.runtime.disconnectNativeBoundSession(node, actorRef, signal);
|
|
27
|
+
await this.options.runtime.disconnectNativeBoundSession(node, actorRef, this.options.requestTimeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, signal);
|
|
57
28
|
return;
|
|
58
29
|
}
|
|
59
30
|
await this.options.runtime.disconnectBoundSession(this.options.actorId, signal);
|
|
@@ -96,30 +67,11 @@ class ZLinkNativeFallbackBoundSessionSendCall {
|
|
|
96
67
|
async executeScoped(packetName) {
|
|
97
68
|
const localActor = this.options.localActorProvider?.() === true;
|
|
98
69
|
const remoteTarget = this.options.remoteBoundSessionTargetProvider();
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return result;
|
|
105
|
-
}
|
|
106
|
-
// A local Actor with a concrete native owner has a direct binding path.
|
|
107
|
-
// Use that path before a routed transfer target. The transfer target is
|
|
108
|
-
// retained for actors whose current owner is remote or whose native
|
|
109
|
-
// binding is no longer available.
|
|
110
|
-
const actorRef = this.options.actorRefProvider();
|
|
111
|
-
const node = this.options.nativeActorNodeProvider();
|
|
112
|
-
const bindingGeneration = currentBindingGeneration(actorRef);
|
|
113
|
-
if (actorRef !== undefined && node !== undefined && bindingGeneration !== undefined) {
|
|
114
|
-
nativeAttempted = true;
|
|
115
|
-
const result = await this.options.runtime.sendNativeBoundSession(node, actorRef, this.message, packetName, this.selectedMetadata);
|
|
116
|
-
if (result.status !== submission_result_1.ZLinkSubmitStatus.TargetNotFound) {
|
|
117
|
-
this.traceSubmitted(result, packetName);
|
|
118
|
-
return result;
|
|
119
|
-
}
|
|
120
|
-
if (remoteTarget === undefined) {
|
|
121
|
-
return result;
|
|
122
|
-
}
|
|
70
|
+
if (localActor || remoteTarget === undefined) {
|
|
71
|
+
const localResult = await this.options.runtime.submitLocalBoundSession(this.options.actorId, this.message, packetName, this.selectedMetadata);
|
|
72
|
+
if (localResult.status !== submission_result_1.ZLinkSubmitStatus.TargetNotFound) {
|
|
73
|
+
this.traceSubmitted(localResult, packetName);
|
|
74
|
+
return localResult;
|
|
123
75
|
}
|
|
124
76
|
}
|
|
125
77
|
if (remoteTarget !== undefined) {
|
|
@@ -152,18 +104,10 @@ class ZLinkNativeFallbackBoundSessionSendCall {
|
|
|
152
104
|
this.traceSubmitted(result, packetName);
|
|
153
105
|
return result;
|
|
154
106
|
}
|
|
155
|
-
const localResult = await this.options.runtime.submitLocalBoundSession(this.options.actorId, this.message, packetName, this.selectedMetadata);
|
|
156
|
-
if (localResult.status !== submission_result_1.ZLinkSubmitStatus.TargetNotFound) {
|
|
157
|
-
this.traceSubmitted(localResult, packetName);
|
|
158
|
-
return localResult;
|
|
159
|
-
}
|
|
160
107
|
const actorRef = this.options.actorRefProvider();
|
|
161
108
|
const node = this.options.nativeActorNodeProvider();
|
|
162
109
|
const bindingGeneration = currentBindingGeneration(actorRef);
|
|
163
|
-
if (
|
|
164
|
-
actorRef !== undefined &&
|
|
165
|
-
node !== undefined &&
|
|
166
|
-
bindingGeneration !== undefined) {
|
|
110
|
+
if (actorRef !== undefined && node !== undefined && bindingGeneration !== undefined) {
|
|
167
111
|
const result = await this.options.runtime.sendNativeBoundSession(node, actorRef, this.message, packetName, this.selectedMetadata);
|
|
168
112
|
this.traceSubmitted(result, packetName);
|
|
169
113
|
return result;
|
|
@@ -189,12 +133,3 @@ function currentBindingGeneration(actorRef) {
|
|
|
189
133
|
function positiveBindingGeneration(generation) {
|
|
190
134
|
return generation !== undefined && generation > 0n ? generation : undefined;
|
|
191
135
|
}
|
|
192
|
-
function disconnectedFrameHeader() {
|
|
193
|
-
return {
|
|
194
|
-
kind: protocol_1.ZLinkStreamMessageKind.Send,
|
|
195
|
-
codec: protocol_1.ZLinkStreamCodec.Raw,
|
|
196
|
-
flags: protocol_1.ZLinkStreamHeaderFlags.None,
|
|
197
|
-
name: actors_1.ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET,
|
|
198
|
-
metadata: new Map()
|
|
199
|
-
};
|
|
200
|
-
}
|
|
@@ -3,7 +3,7 @@ import type { ZLinkRuntimeMetrics } from '../diagnostics';
|
|
|
3
3
|
import { ZLinkActorSessionBindingRegistry, type ZLinkActorSessionAuthorityFence } from './actor-session-binding-registry';
|
|
4
4
|
import { ZLinkActorSessionLifecycleCoordinator } from './actor-session-lifecycle-coordinator';
|
|
5
5
|
import { DefaultZLinkSessionActor, DefaultZLinkSessionContext } from './session-context';
|
|
6
|
-
import type { ZLinkSessionBindingConfirmationOptions } from './stream-binding-runtime-ports';
|
|
6
|
+
import type { ZLinkActorRouteCommitOptions, ZLinkSessionBindingConfirmationOptions } from './stream-binding-runtime-ports';
|
|
7
7
|
export interface ZLinkSessionActorCoordinatorOptions {
|
|
8
8
|
readonly actorBindTimeoutMs?: number;
|
|
9
9
|
readonly actorRefResolver?: (actor: ZLinkActor) => ActorRef;
|
|
@@ -28,17 +28,11 @@ export declare class ZLinkSessionActorCoordinator {
|
|
|
28
28
|
constructor(routes: ZLinkActorSessionBindingRegistry<DefaultZLinkSessionContext, DefaultZLinkSessionActor>, sessionActorRuntime: ConstructorParameters<typeof DefaultZLinkSessionActor>[0], options?: ZLinkSessionActorCoordinatorOptions, lifecycle?: ZLinkActorSessionLifecycleCoordinator);
|
|
29
29
|
bind(context: DefaultZLinkSessionContext, actorOrRef: ZLinkActor | ActorRef, signal?: AbortSignal): Promise<DefaultZLinkSessionActor>;
|
|
30
30
|
private replaceBinding;
|
|
31
|
-
private replaceBindingCore;
|
|
32
31
|
private resolveAuthorityFence;
|
|
33
32
|
bindOrGet(context: DefaultZLinkSessionContext, actorRef: ActorRef, signal?: AbortSignal): Promise<DefaultZLinkSessionActor>;
|
|
34
33
|
rebindActor(actorRef: ActorRef, signal?: AbortSignal): Promise<void>;
|
|
35
34
|
refreshActor(actorRef: ActorRef, signal?: AbortSignal): Promise<void>;
|
|
36
|
-
commitActorRoute(actorRef: ActorRef, signal?: AbortSignal, options?:
|
|
37
|
-
readonly confirmRemoteSessionBinding?: boolean | 'send';
|
|
38
|
-
readonly releaseSeal?: {
|
|
39
|
-
readonly sealId: string;
|
|
40
|
-
};
|
|
41
|
-
}): Promise<void>;
|
|
35
|
+
commitActorRoute(actorRef: ActorRef, signal?: AbortSignal, options?: ZLinkActorRouteCommitOptions): Promise<void>;
|
|
42
36
|
retireRemoteBinding(actorRef: ActorRef, sessionRid: ActorRef['nodeRid'], bindingGeneration: bigint, signal?: AbortSignal): Promise<boolean>;
|
|
43
37
|
authorityFence(actorId: string): Promise<{
|
|
44
38
|
readonly authorityOwnerGeneration: bigint;
|
|
@@ -26,10 +26,7 @@ class ZLinkSessionActorCoordinator {
|
|
|
26
26
|
: this.resolveActorRef(actorOrRef);
|
|
27
27
|
return await this.lifecycle.run(actorRef.actorId, async () => this.replaceBinding(context, actorRef, signal));
|
|
28
28
|
}
|
|
29
|
-
async replaceBinding(context, actorRef, signal
|
|
30
|
-
return await this.replaceBindingCore(context, actorRef, signal, confirmRemoteSessionBinding, releaseSeal);
|
|
31
|
-
}
|
|
32
|
-
async replaceBindingCore(context, actorRef, signal, confirmRemoteSessionBinding = true, releaseSeal) {
|
|
29
|
+
async replaceBinding(context, actorRef, signal) {
|
|
33
30
|
(0, abort_1.throwIfAborted)(signal);
|
|
34
31
|
if (actorRef.actorId.trim().length === 0) {
|
|
35
32
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorRouteNotFound, 'Actor id must not be empty.');
|
|
@@ -60,22 +57,15 @@ class ZLinkSessionActorCoordinator {
|
|
|
60
57
|
: undefined, previous?.actor.ref);
|
|
61
58
|
const sessionActor = reuseActor ??
|
|
62
59
|
new session_context_1.DefaultZLinkSessionActor(this.sessionActorRuntime, boundActorRef, bindingToken);
|
|
63
|
-
const sessionIdentity =
|
|
60
|
+
const sessionIdentity = this.actorBindingRoutingId(context);
|
|
64
61
|
if (previous === undefined) {
|
|
65
|
-
if (releaseSeal !== undefined) {
|
|
66
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorSessionNotBound, `Actor '${actorRef.actorId}' route switch has no Session binding to release.`, true);
|
|
67
|
-
}
|
|
68
62
|
await this.routes.bind(context, sessionActor, bindingToken, authorityFence, sessionIdentity, () => sessionActor.updateRef(boundActorRef));
|
|
69
63
|
}
|
|
70
|
-
else if (releaseSeal !== undefined) {
|
|
71
|
-
await this.routes.replaceAndReleaseSeal(previous, context, sessionActor, bindingToken, releaseSeal.sealId, authorityFence, sessionIdentity, () => sessionActor.updateRef(boundActorRef));
|
|
72
|
-
}
|
|
73
64
|
else {
|
|
74
65
|
await this.routes.replace(previous, context, sessionActor, bindingToken, authorityFence, sessionIdentity, () => sessionActor.updateRef(boundActorRef));
|
|
75
66
|
}
|
|
76
|
-
if (
|
|
77
|
-
|
|
78
|
-
const waitForAcknowledgement = previous === undefined && confirmRemoteSessionBinding !== 'send';
|
|
67
|
+
if (this.options.confirmRemoteActorSessionBinding !== undefined) {
|
|
68
|
+
const waitForAcknowledgement = previous === undefined;
|
|
79
69
|
const confirmation = this.options.confirmRemoteActorSessionBinding(boundActorRef, this.actorBindingRoutingId(context), undefined, {
|
|
80
70
|
waitForAcknowledgement,
|
|
81
71
|
binding: context.stream instanceof managed_stream_1.ZLinkManagedStream
|
|
@@ -204,25 +194,18 @@ class ZLinkSessionActorCoordinator {
|
|
|
204
194
|
if (route === undefined)
|
|
205
195
|
return;
|
|
206
196
|
requireSameIncarnation(route.actor.ref, normalizedActorRef);
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}
|
|
219
|
-
if (options.releaseSeal !== undefined &&
|
|
220
|
-
!(await this.routes.abortSeal(normalizedActorRef.actorId, options.releaseSeal.sealId))) {
|
|
221
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${normalizedActorRef.actorId}' route switch lost its relocation seal.`, true);
|
|
222
|
-
}
|
|
223
|
-
return;
|
|
197
|
+
const authorityFence = await this.resolveAuthorityFence(normalizedActorRef, signal);
|
|
198
|
+
// Relocation changes only the Actor route of this physical binding.
|
|
199
|
+
// Publish the ref and authority together in the binding registry's turn;
|
|
200
|
+
// a native bind would issue a different binding generation.
|
|
201
|
+
const boundActorRef = withBindingGeneration(normalizedActorRef, bindingGenerationOf(route.actor.ref), undefined);
|
|
202
|
+
const commitActor = () => route.actor.updateRef(boundActorRef);
|
|
203
|
+
if (options.releaseSeal !== undefined) {
|
|
204
|
+
await this.routes.replaceAndReleaseSeal(route, route.context, route.actor, route.bindingToken, options.releaseSeal.sealId, authorityFence, route.sessionIdentity, commitActor);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
await this.routes.replace(route, route.context, route.actor, route.bindingToken, authorityFence, route.sessionIdentity, commitActor);
|
|
224
208
|
}
|
|
225
|
-
await this.replaceBinding(route.context, normalizedActorRef, signal, options.confirmRemoteSessionBinding, options.releaseSeal);
|
|
226
209
|
});
|
|
227
210
|
}
|
|
228
211
|
async retireRemoteBinding(actorRef, sessionRid, bindingGeneration, signal) {
|
|
@@ -26,15 +26,8 @@ export interface ZLinkStreamActorLifecyclePort {
|
|
|
26
26
|
}
|
|
27
27
|
export interface ZLinkActorRouteCommitOptions {
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* request/ACK would create a nested route request while the Session
|
|
32
|
-
* ownership command is being dispatched.
|
|
33
|
-
*/
|
|
34
|
-
readonly confirmRemoteSessionBinding?: boolean | 'send';
|
|
35
|
-
/**
|
|
36
|
-
* Command 44 keeps ingress sealed while the native route is prepared, then
|
|
37
|
-
* publishes the new route and releases this exact seal in one owner turn.
|
|
29
|
+
* Command 44 publishes the Actor route of the existing binding and releases
|
|
30
|
+
* this exact seal in one owner turn.
|
|
38
31
|
*/
|
|
39
32
|
readonly releaseSeal?: {
|
|
40
33
|
readonly sealId: string;
|
|
@@ -68,7 +61,7 @@ export interface ZLinkRemoteBoundSessionPort extends ZLinkStreamActorLifecyclePo
|
|
|
68
61
|
sendNativeBoundSessionError(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, packetName: string, requestSeq: bigint, error: unknown, metadata: ReadonlyMap<string, string>, signal?: AbortSignal): Promise<void>;
|
|
69
62
|
}
|
|
70
63
|
export interface ZLinkNativeFallbackBoundSessionPort {
|
|
71
|
-
disconnectNativeBoundSession(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, signal?: AbortSignal): Promise<void>;
|
|
64
|
+
disconnectNativeBoundSession(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, timeoutMs: number, signal?: AbortSignal): Promise<void>;
|
|
72
65
|
disconnectBoundSession(actorId: string, signal?: AbortSignal): Promise<void>;
|
|
73
66
|
sendLocalBoundSession(actorId: string, message: unknown, packetName: string | undefined, metadata: ReadonlyMap<string, string>): Promise<boolean>;
|
|
74
67
|
submitLocalBoundSession(actorId: string, message: unknown, packetName: string | undefined, metadata: ReadonlyMap<string, string>, signal?: AbortSignal): Promise<ZLinkSubmitResult>;
|
|
@@ -66,7 +66,7 @@ class ZLinkStreamSessionRuntime {
|
|
|
66
66
|
this.traceFrameWritten(kind, packetName, correlationId);
|
|
67
67
|
});
|
|
68
68
|
const sessionOrPromise = options.sessionFactory(this.context);
|
|
69
|
-
this.sessionReady = isPromiseLike(sessionOrPromise)
|
|
69
|
+
this.sessionReady = (0, abort_1.isPromiseLike)(sessionOrPromise)
|
|
70
70
|
? sessionOrPromise.then((session) => this.completeSessionCreation(session), (error) => {
|
|
71
71
|
this.context.completeConfiguration();
|
|
72
72
|
throw error;
|
|
@@ -1139,9 +1139,6 @@ function streamMonitorHasEndpoint(event) {
|
|
|
1139
1139
|
const endpoint = event;
|
|
1140
1140
|
return endpoint.localAddr !== undefined || endpoint.remoteAddr !== undefined;
|
|
1141
1141
|
}
|
|
1142
|
-
function isPromiseLike(value) {
|
|
1143
|
-
return typeof value.then === 'function';
|
|
1144
|
-
}
|
|
1145
1142
|
function normalizeStreamCloseReason(reason) {
|
|
1146
1143
|
switch (reason) {
|
|
1147
1144
|
case 'client_close':
|
|
@@ -409,7 +409,7 @@ class DefaultZLinkWorkerCall {
|
|
|
409
409
|
yield(signal) {
|
|
410
410
|
const turn = (0, execution_1.requireZLinkYieldTurn)(this.turn);
|
|
411
411
|
const pending = this.begin(signal);
|
|
412
|
-
return turn.
|
|
412
|
+
return turn.yieldFrameworkPromise(pending);
|
|
413
413
|
}
|
|
414
414
|
begin(signal) {
|
|
415
415
|
if (this.terminatorSelected) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zlink-systems/framework",
|
|
3
|
-
"version": "0.30.
|
|
3
|
+
"version": "0.30.2",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@opentelemetry/api": "^1.9.1",
|
|
21
21
|
"@opentelemetry/api-logs": "^0.221.0",
|
|
22
|
-
"@zlink-systems/stream-wire": "0.30.
|
|
23
|
-
"@zlink-systems/zlink": "1.
|
|
22
|
+
"@zlink-systems/stream-wire": "0.30.2",
|
|
23
|
+
"@zlink-systems/zlink": "1.20.0"
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -1,18 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
adoptEncodedPayload,
|
|
3
|
+
borrowEncodedPayload,
|
|
4
|
+
storeEncodedPayload
|
|
5
|
+
} from './encoded-payload-storage';
|
|
2
6
|
|
|
3
7
|
export class ZLinkEncodedPayload {
|
|
4
|
-
private constructor(bytes: Uint8Array) {
|
|
5
|
-
|
|
8
|
+
private constructor(bytes: Uint8Array, owned: boolean) {
|
|
9
|
+
if (owned) {
|
|
10
|
+
adoptEncodedPayload(this, bytes);
|
|
11
|
+
} else {
|
|
12
|
+
storeEncodedPayload(this, bytes);
|
|
13
|
+
}
|
|
6
14
|
}
|
|
7
15
|
|
|
16
|
+
/** Copies the supplied bytes. */
|
|
8
17
|
static from(bytes: Uint8Array): ZLinkEncodedPayload {
|
|
9
|
-
return new ZLinkEncodedPayload(bytes);
|
|
18
|
+
return new ZLinkEncodedPayload(bytes, false);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Retains the supplied bytes without copying. Do not modify them afterward; mutation changes the payload. */
|
|
22
|
+
static fromOwned(bytes: Uint8Array): ZLinkEncodedPayload {
|
|
23
|
+
return new ZLinkEncodedPayload(bytes, true);
|
|
10
24
|
}
|
|
11
25
|
|
|
26
|
+
/** Returns a copy of the stored bytes. */
|
|
12
27
|
data(): Uint8Array {
|
|
13
28
|
return new Uint8Array(this.stored());
|
|
14
29
|
}
|
|
15
30
|
|
|
31
|
+
/** Returns the stored bytes without copying. Do not modify this view or its backing buffer. */
|
|
32
|
+
view(): Readonly<Uint8Array> {
|
|
33
|
+
return this.stored();
|
|
34
|
+
}
|
|
35
|
+
|
|
16
36
|
toBytes(): Uint8Array {
|
|
17
37
|
return this.data();
|
|
18
38
|
}
|
|
@@ -6,9 +6,12 @@ export function storeEncodedPayload(owner: object, bytes: Uint8Array): Buffer {
|
|
|
6
6
|
return stored;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
export function adoptEncodedPayload(owner: object, bytes:
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
export function adoptEncodedPayload(owner: object, bytes: Uint8Array): Buffer {
|
|
10
|
+
const stored = Buffer.isBuffer(bytes)
|
|
11
|
+
? bytes
|
|
12
|
+
: Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
13
|
+
encodedPayloadStorage.set(owner, stored);
|
|
14
|
+
return stored;
|
|
12
15
|
}
|
|
13
16
|
|
|
14
17
|
export function borrowEncodedPayload(owner: object): Buffer | undefined {
|
|
@@ -141,7 +141,10 @@ export interface ZLinkMeshObjectRoleBuilder {
|
|
|
141
141
|
export interface ZLinkMeshObjectClientBuilder {}
|
|
142
142
|
|
|
143
143
|
export interface ZLinkMeshObjectServerBuilder {
|
|
144
|
-
addEntrySpot<TEntrySpot extends ZLinkEntrySpot>(
|
|
144
|
+
addEntrySpot<TEntrySpot extends ZLinkEntrySpot>(
|
|
145
|
+
entrySpotType: Type<TEntrySpot>,
|
|
146
|
+
actorType: string
|
|
147
|
+
): this;
|
|
145
148
|
addSpotFactory<TSpot extends ZLinkSpot>(
|
|
146
149
|
spotType: string,
|
|
147
150
|
implementation: Type<TSpot>,
|
|
@@ -68,13 +68,18 @@ export function validateSessionReplacementCallbackTimeout(timeoutMs: number): nu
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
export function registerEntrySpot(
|
|
71
|
-
options: { entrySpotType?: Type<ZLinkEntrySpot
|
|
72
|
-
entrySpotType: Type<ZLinkEntrySpot
|
|
71
|
+
options: { entrySpotType?: Type<ZLinkEntrySpot>; entrySpotActorType?: string },
|
|
72
|
+
entrySpotType: Type<ZLinkEntrySpot>,
|
|
73
|
+
actorType: string
|
|
73
74
|
): void {
|
|
74
75
|
if (options.entrySpotType !== undefined) {
|
|
75
76
|
throw new ZLinkConfigurationException('Duplicate Entry Spot registration on SpotNode.');
|
|
76
77
|
}
|
|
78
|
+
if (typeof actorType !== 'string' || actorType.length === 0) {
|
|
79
|
+
throw new ZLinkConfigurationException('Entry Spot Actor type must be a non-empty string.');
|
|
80
|
+
}
|
|
77
81
|
options.entrySpotType = entrySpotType;
|
|
82
|
+
options.entrySpotActorType = actorType;
|
|
78
83
|
}
|
|
79
84
|
|
|
80
85
|
export function registerSpotFactory(
|
|
@@ -1234,8 +1234,11 @@ class DefaultMeshObjectServerBuilder implements ZLinkMeshObjectServerBuilder {
|
|
|
1234
1234
|
private readonly node: MutableSpotNodeOptions
|
|
1235
1235
|
) {}
|
|
1236
1236
|
|
|
1237
|
-
addEntrySpot<TEntrySpot extends ZLinkEntrySpot>(
|
|
1238
|
-
|
|
1237
|
+
addEntrySpot<TEntrySpot extends ZLinkEntrySpot>(
|
|
1238
|
+
entrySpotType: Type<TEntrySpot>,
|
|
1239
|
+
actorType: string
|
|
1240
|
+
): this {
|
|
1241
|
+
registerEntrySpot(this.node, entrySpotType, actorType);
|
|
1239
1242
|
return this;
|
|
1240
1243
|
}
|
|
1241
1244
|
|
|
@@ -1646,6 +1649,7 @@ interface MutableSpotNodeOptions {
|
|
|
1646
1649
|
router?: MutableSpotRouterCapabilityOptions;
|
|
1647
1650
|
pubSub?: MutableSpotPubSubCapabilityOptions;
|
|
1648
1651
|
entrySpotType?: Type<ZLinkEntrySpot>;
|
|
1652
|
+
entrySpotActorType?: string;
|
|
1649
1653
|
spotFactories?: Type<ZLinkSpot>[];
|
|
1650
1654
|
spotFactoryRegistrations?: Record<
|
|
1651
1655
|
string,
|
|
@@ -268,6 +268,7 @@ export interface ZLinkSpotNodeOptions {
|
|
|
268
268
|
readonly router?: ZLinkSpotRouterCapabilityOptions;
|
|
269
269
|
readonly pubSub?: ZLinkSpotPubSubCapabilityOptions;
|
|
270
270
|
readonly entrySpotType?: Type<ZLinkEntrySpot>;
|
|
271
|
+
readonly entrySpotActorType?: string;
|
|
271
272
|
readonly spotFactories?: readonly Type<ZLinkSpot>[];
|
|
272
273
|
readonly spotFactoryRegistrations?: Readonly<
|
|
273
274
|
Record<
|
|
@@ -85,7 +85,7 @@ export interface ZLinkRuntimeMessageFlowEvent {
|
|
|
85
85
|
readonly commandId?: number;
|
|
86
86
|
readonly messageSize?: number;
|
|
87
87
|
readonly durationSeconds?: number;
|
|
88
|
-
readonly errorReason?: ZLinkDispatchErrorReason;
|
|
88
|
+
readonly errorReason?: ZLinkDispatchErrorReason | 'activation_timeout' | 'activation_rejected';
|
|
89
89
|
readonly errorAction?: ZLinkDispatchErrorAction;
|
|
90
90
|
readonly errorType?: string;
|
|
91
91
|
readonly errorMessage?: string;
|
|
@@ -195,6 +195,7 @@ export type ZLinkDispatchErrorReason =
|
|
|
195
195
|
| 'unexpected_reply'
|
|
196
196
|
| 'backpressure'
|
|
197
197
|
| 'target_closed'
|
|
198
|
+
| 'location_unavailable'
|
|
198
199
|
| 'stale_target'
|
|
199
200
|
| 'shutdown';
|
|
200
201
|
|
|
@@ -25,6 +25,8 @@ export interface ZLinkObjectCapability {
|
|
|
25
25
|
readonly policy: ZLinkObjectMaintenancePolicyKind;
|
|
26
26
|
readonly hasSnapshotAdapter: boolean;
|
|
27
27
|
readonly limit: number;
|
|
28
|
+
/** True only for an Actor capability whose node registered an Entry Spot type accepting it. */
|
|
29
|
+
readonly entryAccepted: boolean;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
export interface ZLinkPopulationCapacity {
|
|
@@ -16,12 +16,20 @@ export interface ZLinkActorHandlerRegistry {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export interface ZLinkSpotHandlerRegistry extends ZLinkActorHandlerRegistry {
|
|
19
|
+
/** Declares a timer handler constructor for relocation without registering an endpoint. */
|
|
20
|
+
addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkSpot>>(
|
|
21
|
+
handlerType: Type<THandler>
|
|
22
|
+
): this;
|
|
19
23
|
addPacket<THandler>(handlerType: Type<THandler>): this;
|
|
20
24
|
addSubscribe<THandler>(handlerType: Type<THandler>, channelName: string, topic: string): this;
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
export interface ZLinkInstanceSpotHandlerRegistry {
|
|
24
28
|
addPacket<THandler>(handlerType: Type<THandler>): this;
|
|
29
|
+
/** Declares a timer handler constructor for relocation without registering an endpoint. */
|
|
30
|
+
addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkInstanceSpot>>(
|
|
31
|
+
handlerType: Type<THandler>
|
|
32
|
+
): this;
|
|
25
33
|
}
|
|
26
34
|
|
|
27
35
|
export interface ZLinkWorkerCall<T> {
|
|
@@ -61,8 +61,8 @@ export interface ZLinkSpot<
|
|
|
61
61
|
> extends ZLinkUserSpotActorLifecycle<TActor> {
|
|
62
62
|
readonly context: ZLinkSpotContext<TActor>;
|
|
63
63
|
configure?(): void;
|
|
64
|
-
onCreate?(request: ZLinkMessage): Promise<ZLinkSpotCreateResponse>;
|
|
65
|
-
onInitialize?(): Promise<void>;
|
|
64
|
+
onCreate?(request: ZLinkMessage, signal?: AbortSignal): Promise<ZLinkSpotCreateResponse>;
|
|
65
|
+
onInitialize?(signal?: AbortSignal): Promise<void>;
|
|
66
66
|
onClosing?(context: ZLinkSpotClosingContext, cleanupSignal: AbortSignal): Promise<void>;
|
|
67
67
|
onRelocationReadyCompleted?(completion: ZLinkSpotRelocationReadyCompletion): Promise<void>;
|
|
68
68
|
}
|
|
@@ -70,7 +70,7 @@ export interface ZLinkSpot<
|
|
|
70
70
|
export interface ZLinkInstanceSpot {
|
|
71
71
|
readonly context: ZLinkInstanceSpotContext;
|
|
72
72
|
configure?(): void;
|
|
73
|
-
onInitialize?(): Promise<void>;
|
|
73
|
+
onInitialize?(signal?: AbortSignal): Promise<void>;
|
|
74
74
|
onClosing?(context: ZLinkSpotClosingContext, cleanupSignal: AbortSignal): Promise<void>;
|
|
75
75
|
}
|
|
76
76
|
|
package/src/runtime/abort.ts
CHANGED
|
@@ -38,6 +38,18 @@ export function throwIfAborted(signal: AbortSignal | undefined): void {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Whether a handler or dispatch result is a thenable the caller must wait
|
|
43
|
+
* for. Synchronous results, including null and undefined, are not.
|
|
44
|
+
*/
|
|
45
|
+
export function isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {
|
|
46
|
+
return (
|
|
47
|
+
value !== null &&
|
|
48
|
+
(typeof value === 'object' || typeof value === 'function') &&
|
|
49
|
+
typeof (value as { then?: unknown }).then === 'function'
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
41
53
|
export function macrotaskBoundary(): Promise<void> {
|
|
42
54
|
return new Promise((resolve) => setImmediate(resolve));
|
|
43
55
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { routingIdsEqual } from '../routing-id';
|
|
1
2
|
import { createHash } from 'node:crypto';
|
|
2
3
|
import type { ActorRef } from '../../contracts';
|
|
3
4
|
import { ZLinkSpotKind } from '../../contracts';
|
|
@@ -278,7 +279,7 @@ function requireActorAuthority(
|
|
|
278
279
|
snapshot.allocation.objectKind !== 'actor' ||
|
|
279
280
|
snapshot.allocation.stableType !== expected.actorType ||
|
|
280
281
|
snapshot.allocation.descriptor.meshName !== expected.meshName ||
|
|
281
|
-
|
|
282
|
+
!routingIdsEqual(snapshot.allocation.descriptor.rid, expected.actor.nodeRid) ||
|
|
282
283
|
snapshot.allocation.descriptorLifecycleGeneration !== expected.ownerNodeGeneration ||
|
|
283
284
|
snapshot.ownerId !== expected.owner.ownerId ||
|
|
284
285
|
snapshot.ownerLeaseGeneration !== expected.owner.leaseGeneration ||
|
|
@@ -286,7 +287,7 @@ function requireActorAuthority(
|
|
|
286
287
|
actual.actorType !== expected.actorType ||
|
|
287
288
|
actual.actor.actorId !== expected.actor.actorId ||
|
|
288
289
|
actual.actor.objectGeneration !== expected.actor.objectGeneration ||
|
|
289
|
-
|
|
290
|
+
!routingIdsEqual(actual.actor.nodeRid, expected.actor.nodeRid)
|
|
290
291
|
) {
|
|
291
292
|
throw new Error(
|
|
292
293
|
`Actor '${expected.actor.actorId}' authority fence does not match its ActorRef.`
|