@zlink-systems/framework 0.30.0 → 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/LICENSE +150 -68
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
- package/dist/contracts/Channels/Calls.d.ts +2 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
- package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
- 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/Handlers/Attributes.d.ts +5 -13
- package/dist/contracts/Handlers/Attributes.js +7 -11
- package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
- package/dist/contracts/Handlers/JsonContract.js +4 -153
- package/dist/contracts/Locations/Rows.d.ts +2 -0
- package/dist/contracts/Spots/Contracts.d.ts +6 -1
- package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
- package/dist/nest-integration.d.ts +1 -1
- package/dist/nest-integration.js +2 -1
- 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 +1 -2
- package/dist/runtime/actors/actor-client.js +52 -57
- 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 +8 -4
- package/dist/runtime/actors/actor-handoff.js +219 -92
- package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
- package/dist/runtime/actors/actor-local-native-join.js +13 -12
- package/dist/runtime/actors/actor-mailbox.js +27 -1
- package/dist/runtime/actors/actor-remote-joiner.js +3 -1
- package/dist/runtime/actors/actor-remote-wire.js +15 -0
- package/dist/runtime/actors/actor-reply.d.ts +4 -0
- package/dist/runtime/actors/actor-reply.js +29 -0
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
- package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -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 +8 -3
- package/dist/runtime/actors/index.js +55 -27
- package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
- package/dist/runtime/actors/session-disconnected-wire.js +48 -0
- package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
- package/dist/runtime/admission.d.ts +9 -1
- package/dist/runtime/admission.js +56 -23
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
- package/dist/runtime/application-jobs/contracts.d.ts +12 -1
- package/dist/runtime/backend/contracts/index.d.ts +37 -12
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
- package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
- package/dist/runtime/backend/mesh-completion-table.js +154 -49
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
- package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
- package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
- package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
- package/dist/runtime/backend/runtime-message.d.ts +1 -0
- package/dist/runtime/backend/runtime-message.js +5 -0
- package/dist/runtime/backend/runtime-values.d.ts +1 -0
- package/dist/runtime/backend/runtime-values.js +2 -1
- package/dist/runtime/channels/channel-clients.d.ts +2 -0
- package/dist/runtime/channels/channel-clients.js +75 -23
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
- package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
- package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
- package/dist/runtime/channels/channel-dispatch-services.js +45 -0
- package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
- package/dist/runtime/channels/channel-dispatchers.js +62 -54
- package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
- package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
- package/dist/runtime/channels/channel-envelope.d.ts +2 -0
- package/dist/runtime/channels/channel-envelope.js +146 -28
- package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- 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 +9 -8
- package/dist/runtime/channels/channel-runtime-manager.js +16 -16
- package/dist/runtime/channels/channel-transports.d.ts +18 -16
- package/dist/runtime/channels/channel-transports.js +77 -58
- 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/channels/local-spot-route-transport.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.js +2 -1
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
- package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
- package/dist/runtime/channels/source-spot-router.d.ts +2 -2
- package/dist/runtime/channels/source-spot-router.js +4 -4
- package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-node-route-transport.js +4 -4
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
- 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 +5 -0
- package/dist/runtime/execution/serial-execution-queue.js +22 -2
- package/dist/runtime/execution/state-lane.d.ts +2 -0
- package/dist/runtime/execution/state-lane.js +5 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
- package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
- package/dist/runtime/foundation/durable-service-request.js +98 -0
- package/dist/runtime/foundation/operation-identity.d.ts +1 -0
- package/dist/runtime/foundation/operation-identity.js +5 -1
- 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 +61 -8
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
- 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 +3 -3
- package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
- package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
- package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -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 +75 -9
- package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
- package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
- package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
- package/dist/runtime/foundation/service-topology-registry.js +61 -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 +13 -3
- package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
- package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
- package/dist/runtime/handlers/handler-instance-scope.js +54 -11
- 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-runtime-options-factory.js +2 -2
- 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 +40 -7
- package/dist/runtime/host/application-job-queue.js +137 -42
- package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
- package/dist/runtime/host/entry-actor-runtime.js +3 -0
- package/dist/runtime/host/index.d.ts +12 -2
- package/dist/runtime/host/index.js +300 -202
- 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 +73 -208
- package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
- package/dist/runtime/host/route-mesh-runtime.js +6 -4
- 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-control.d.ts +1 -0
- package/dist/runtime/host/service-relocation-control.js +10 -4
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
- package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
- package/dist/runtime/host/spot-address-transport.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
- package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
- package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
- package/dist/runtime/locations/actor-location-claims.js +34 -19
- 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/lifecycle.d.ts +1 -2
- package/dist/runtime/locations/lifecycle.js +2 -5
- 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 +7 -3
- package/dist/runtime/locations/runtime.js +61 -53
- package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
- package/dist/runtime/messaging/framework-json-v1.js +38 -294
- package/dist/runtime/messaging/packet-name.d.ts +1 -1
- package/dist/runtime/messaging/packet-name.js +8 -24
- 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.d.ts +2 -0
- package/dist/runtime/messaging/request-result.js +57 -0
- package/dist/runtime/messaging/submission-result.d.ts +1 -0
- package/dist/runtime/messaging/submission-result.js +5 -2
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
- package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
- package/dist/runtime/spots/index.d.ts +21 -11
- package/dist/runtime/spots/index.js +243 -178
- 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 +7 -3
- package/dist/runtime/spots/spot-activation.js +140 -52
- 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 +20 -11
- package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
- package/dist/runtime/spots/spot-handler-registry.js +24 -10
- 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 +22 -42
- 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.d.ts +3 -0
- package/dist/runtime/spots/spot-outbound.js +27 -18
- package/dist/runtime/spots/spot-remote-codec.js +5 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
- package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -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 -4
- package/dist/runtime/spots/spot-timer.d.ts +57 -5
- package/dist/runtime/spots/spot-timer.js +288 -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.d.ts +1 -1
- package/dist/runtime/streams/stream-session-runtime.js +14 -31
- package/dist/runtime/workers/index.js +1 -1
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
- package/src/contracts/Channels/Calls.ts +2 -1
- package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
- package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
- 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/Handlers/Attributes.ts +14 -21
- package/src/contracts/Handlers/JsonContract.ts +8 -216
- package/src/contracts/Locations/Rows.ts +2 -0
- package/src/contracts/Spots/Contracts.ts +10 -1
- package/src/contracts/Spots/ZLinkSpot.ts +3 -3
- package/src/nest-integration.ts +1 -0
- package/src/runtime/abort.ts +12 -0
- package/src/runtime/actors/actor-authority-publication.ts +3 -2
- package/src/runtime/actors/actor-client.ts +100 -85
- package/src/runtime/actors/actor-context.ts +49 -9
- package/src/runtime/actors/actor-handoff.ts +291 -110
- package/src/runtime/actors/actor-join-relocation.ts +3 -0
- package/src/runtime/actors/actor-local-native-join.ts +21 -26
- package/src/runtime/actors/actor-mailbox.ts +40 -2
- package/src/runtime/actors/actor-remote-joiner.ts +6 -1
- package/src/runtime/actors/actor-remote-wire.ts +17 -0
- package/src/runtime/actors/actor-reply.ts +42 -0
- package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
- package/src/runtime/actors/actor-routed-json-request.ts +10 -2
- 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 +60 -32
- package/src/runtime/actors/session-disconnected-wire.ts +66 -0
- package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
- package/src/runtime/admission.ts +69 -21
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
- package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
- package/src/runtime/application-jobs/contracts.ts +16 -1
- package/src/runtime/backend/contracts/index.ts +92 -18
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
- package/src/runtime/backend/mesh-completion-table.ts +160 -57
- package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
- package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
- package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
- package/src/runtime/backend/raw-binding-port.ts +7 -2
- package/src/runtime/backend/runtime-message.ts +6 -0
- package/src/runtime/backend/runtime-values.ts +1 -0
- package/src/runtime/channels/channel-clients.ts +132 -58
- package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
- package/src/runtime/channels/channel-dispatch-services.ts +69 -1
- package/src/runtime/channels/channel-dispatchers.ts +136 -90
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
- package/src/runtime/channels/channel-envelope.ts +225 -31
- package/src/runtime/channels/channel-outbound-operations.ts +22 -8
- package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
- package/src/runtime/channels/channel-runtime-manager.ts +41 -17
- package/src/runtime/channels/channel-transports.ts +171 -112
- 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/channels/local-spot-route-transport.ts +3 -1
- package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
- package/src/runtime/channels/source-spot-router.ts +8 -4
- package/src/runtime/channels/spot-node-route-transport.ts +8 -4
- package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
- 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 +33 -4
- package/src/runtime/execution/state-lane.ts +7 -0
- package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
- package/src/runtime/foundation/durable-service-request.ts +137 -0
- package/src/runtime/foundation/operation-identity.ts +5 -1
- package/src/runtime/foundation/operation-registry.ts +98 -20
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
- 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 +55 -36
- package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
- package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
- 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 +732 -275
- package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
- package/src/runtime/foundation/service-topology-registry.ts +91 -36
- 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 +231 -76
- package/src/runtime/handlers/handler-instance-scope.ts +67 -16
- 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-runtime-options-factory.ts +13 -2
- package/src/runtime/host/actor-transfer-runtime.ts +104 -430
- package/src/runtime/host/application-job-queue.ts +160 -41
- package/src/runtime/host/entry-actor-runtime.ts +4 -0
- package/src/runtime/host/index.ts +473 -271
- 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 +88 -271
- package/src/runtime/host/route-mesh-runtime.ts +12 -6
- package/src/runtime/host/runtime-shutdown.ts +15 -4
- package/src/runtime/host/service-relocation-control.ts +11 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
- package/src/runtime/host/spot-address-transport.ts +4 -2
- package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
- package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
- package/src/runtime/locations/actor-location-claims.ts +52 -30
- 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/lifecycle.ts +8 -26
- 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 +98 -64
- package/src/runtime/messaging/framework-json-v1.ts +5 -325
- package/src/runtime/messaging/packet-name.ts +5 -25
- package/src/runtime/messaging/payload-codec.ts +8 -11
- package/src/runtime/messaging/request-result.ts +62 -0
- package/src/runtime/messaging/submission-result.ts +5 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
- package/src/runtime/spots/index.ts +389 -283
- 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 +198 -96
- 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 +33 -21
- package/src/runtime/spots/spot-handler-registry.ts +56 -12
- 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 +28 -47
- package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
- package/src/runtime/spots/spot-outbound.ts +39 -19
- package/src/runtime/spots/spot-remote-codec.ts +9 -2
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
- package/src/runtime/spots/spot-runtime-ports.ts +1 -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 -4
- package/src/runtime/spots/spot-timer.ts +418 -158
- 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 +13 -34
- package/src/runtime/workers/index.ts +1 -1
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DefaultZLinkSpotManager = exports.ZLinkPublicSpotManager = exports.ZLinkSpotNodeRuntimeManager = exports.createFrameworkEntrySpotId = exports.ZLinkEntrySpotActivation = exports.ZLinkRuntimeSpotPublisherTransport = exports.DefaultZLinkSpotHandlerRegistry = exports.DefaultZLinkSpotOutbound = exports.ZLinkSpotTimerRegistry = exports.ZLinkManagedTimer = exports.ZLinkSpotSerialExecutor = exports.ZLinkSpotSerialTurnExecutor = exports.ZLinkSpotActorAdmissionCoordinator = exports.ZLinkSpotRoutedBoundSessionDispatch = exports.sendToSpotHandle = exports.requestToSpotHandle = exports.resolveSpotHandle = exports.createSpotHandle = void 0;
|
|
3
|
+
exports.DefaultZLinkSpotManager = exports.ZLinkPublicSpotManager = exports.ZLinkSpotNodeRuntimeManager = exports.registrationAcceptsNewActor = exports.createFrameworkEntrySpotId = exports.ZLinkEntrySpotActivation = exports.ZLinkRuntimeSpotPublisherTransport = exports.DefaultZLinkSpotHandlerRegistry = exports.DefaultZLinkSpotOutbound = exports.ZLinkSpotTimerRegistry = exports.ZLinkManagedTimer = exports.ZLinkSpotSerialExecutor = exports.ZLinkSpotSerialTurnExecutor = exports.ZLinkSpotActorAdmissionCoordinator = exports.ZLinkSpotRoutedBoundSessionDispatch = exports.sendToSpotHandle = exports.requestToSpotHandle = exports.resolveSpotHandle = exports.createSpotHandle = void 0;
|
|
4
|
+
const actor_reply_1 = require("../actors/actor-reply");
|
|
5
|
+
const bound_session_response_target_1 = require("../streams/bound-session-response-target");
|
|
6
|
+
const actor_handoff_1 = require("../actors/actor-handoff");
|
|
7
|
+
const routing_id_1 = require("../routing-id");
|
|
4
8
|
const dispatch_error_details_1 = require("../diagnostics/dispatch-error-details");
|
|
5
9
|
var spot_handle_1 = require("./spot-handle");
|
|
6
10
|
Object.defineProperty(exports, "createSpotHandle", { enumerable: true, get: function () { return spot_handle_1.createSpotHandle; } });
|
|
@@ -29,9 +33,9 @@ const payload_codec_1 = require("../messaging/payload-codec");
|
|
|
29
33
|
const channel_envelope_1 = require("../channels/channel-envelope");
|
|
30
34
|
const protocol_1 = require("../streams/protocol");
|
|
31
35
|
const actor_remote_wire_1 = require("../actors/actor-remote-wire");
|
|
32
|
-
const
|
|
36
|
+
const actor_handoff_2 = require("../actors/actor-handoff");
|
|
33
37
|
const spot_remote_codec_1 = require("./spot-remote-codec");
|
|
34
|
-
const
|
|
38
|
+
const routing_id_2 = require("../routing-id");
|
|
35
39
|
const service_wire_constants_generated_1 = require("../foundation/service-wire-constants.generated");
|
|
36
40
|
var spot_serial_turn_executor_1 = require("./spot-serial-turn-executor");
|
|
37
41
|
Object.defineProperty(exports, "ZLinkSpotSerialTurnExecutor", { enumerable: true, get: function () { return spot_serial_turn_executor_1.ZLinkSpotSerialTurnExecutor; } });
|
|
@@ -57,6 +61,7 @@ var spot_entry_activation_1 = require("./spot-entry-activation");
|
|
|
57
61
|
Object.defineProperty(exports, "ZLinkEntrySpotActivation", { enumerable: true, get: function () { return spot_entry_activation_1.ZLinkEntrySpotActivation; } });
|
|
58
62
|
var spot_node_runtime_manager_1 = require("./spot-node-runtime-manager");
|
|
59
63
|
Object.defineProperty(exports, "createFrameworkEntrySpotId", { enumerable: true, get: function () { return spot_node_runtime_manager_1.createFrameworkEntrySpotId; } });
|
|
64
|
+
Object.defineProperty(exports, "registrationAcceptsNewActor", { enumerable: true, get: function () { return spot_node_runtime_manager_1.registrationAcceptsNewActor; } });
|
|
60
65
|
Object.defineProperty(exports, "ZLinkSpotNodeRuntimeManager", { enumerable: true, get: function () { return spot_node_runtime_manager_1.ZLinkSpotNodeRuntimeManager; } });
|
|
61
66
|
var spot_manager_public_1 = require("./spot-manager-public");
|
|
62
67
|
Object.defineProperty(exports, "ZLinkPublicSpotManager", { enumerable: true, get: function () { return spot_manager_public_1.ZLinkPublicSpotManager; } });
|
|
@@ -130,6 +135,7 @@ class DefaultZLinkSpotManager {
|
|
|
130
135
|
nodeRid: options.nodeRid,
|
|
131
136
|
nodeRidProvider: options.nodeRidProvider,
|
|
132
137
|
actorCountProvider: options.actorCountProvider,
|
|
138
|
+
releaseActorMembers: options.releaseActorMembers,
|
|
133
139
|
userSpotExecutionMode: options.userSpotExecutionMode,
|
|
134
140
|
userSpotRelocationCoordinationMode: options.userSpotRelocationCoordinationMode,
|
|
135
141
|
channelClient: options.channelClient,
|
|
@@ -157,9 +163,17 @@ class DefaultZLinkSpotManager {
|
|
|
157
163
|
statefulExecutionAllowed: options.statefulExecution?.admissionOpen,
|
|
158
164
|
leaveActor: (spotId, actor, signal, meshName) => this.actorMembership.leaveActor(spotId, actor, signal, meshName),
|
|
159
165
|
requestContextClose: (activation, objectGeneration, signal) => this.closeFromContext(activation, objectGeneration, signal),
|
|
160
|
-
|
|
161
|
-
this.activations.
|
|
166
|
+
stageActivation: (activation) => {
|
|
167
|
+
this.activations.registerPreparing(activation);
|
|
168
|
+
},
|
|
169
|
+
discardActivation: (activation) => {
|
|
170
|
+
this.activations.finishClose(activation.meshName, activation.spotId);
|
|
171
|
+
},
|
|
172
|
+
registerActivation: async (activation) => {
|
|
173
|
+
const published = this.activations.register(activation);
|
|
162
174
|
this.scheduleIdleSweep();
|
|
175
|
+
if (published?.domain.kind === 'user')
|
|
176
|
+
await published.serialExecutor.finishPreparation();
|
|
163
177
|
},
|
|
164
178
|
// Spec 15 §4.2 relocation temporary queue: production ingress
|
|
165
179
|
// consults the same admission attempts registered on Accepted
|
|
@@ -206,10 +220,10 @@ class DefaultZLinkSpotManager {
|
|
|
206
220
|
resolveRelocationActivation(meshName, spotId) {
|
|
207
221
|
return this.activations.resolve(meshName, spotId);
|
|
208
222
|
}
|
|
209
|
-
async prepareRelocationSpot(meshName, objectKind, stableType, implementation, spotId, objectGeneration, authorityOwnerGeneration, signal) {
|
|
223
|
+
async prepareRelocationSpot(meshName, objectKind, stableType, implementation, spotId, objectGeneration, authorityOwnerGeneration, restoredTimers, signal) {
|
|
210
224
|
this.activations.stage(meshName, spotId);
|
|
211
225
|
try {
|
|
212
|
-
return await this.activationLifecycle.materializeRelocation(meshName, objectKind, stableType, implementation, spotId, objectGeneration, authorityOwnerGeneration, signal);
|
|
226
|
+
return await this.activationLifecycle.materializeRelocation(meshName, objectKind, stableType, implementation, spotId, objectGeneration, authorityOwnerGeneration, restoredTimers, signal);
|
|
213
227
|
}
|
|
214
228
|
catch (error) {
|
|
215
229
|
this.activations.abandonStage(meshName, spotId);
|
|
@@ -217,11 +231,16 @@ class DefaultZLinkSpotManager {
|
|
|
217
231
|
}
|
|
218
232
|
}
|
|
219
233
|
async publishRelocationSpot(activation, beforeAdmission) {
|
|
220
|
-
|
|
234
|
+
// Spot timer §1: OnInitialize before Ready reattaches restored keys; the
|
|
235
|
+
// relocation-ready completion and later callbacks use the ordinary rule.
|
|
236
|
+
await activation.serial.postBarrierTurn(() => activation.timers.runRelocationInitialization(() => activation.spot.onInitialize?.()));
|
|
221
237
|
await beforeAdmission?.();
|
|
222
238
|
this.activations.publish(activation.meshName, activation.spotId);
|
|
239
|
+
await activation.serialExecutor.finishPreparation();
|
|
240
|
+
await activation.timers.publishRelocation();
|
|
223
241
|
}
|
|
224
242
|
async abortRelocationSpot(activation) {
|
|
243
|
+
await this.activationLifecycle.discardPreparation(activation);
|
|
225
244
|
this.activations.detachRelocated(activation.meshName, activation.spotId);
|
|
226
245
|
await activation.timers.dispose();
|
|
227
246
|
await activation.nativeSpot?.dispose();
|
|
@@ -230,7 +249,7 @@ class DefaultZLinkSpotManager {
|
|
|
230
249
|
this.activations.detachRelocated(activation.meshName, activation.spotId);
|
|
231
250
|
await activation.nativeSpot?.dispose();
|
|
232
251
|
}
|
|
233
|
-
async materializeInstance(meshName, instanceType, spotId, objectGeneration, signal) {
|
|
252
|
+
async materializeInstance(meshName, instanceType, spotId, objectGeneration, signal, completion = 'publication') {
|
|
234
253
|
const readyTarget = this.options.instanceSpotApplicationTargetProvider?.(meshName, spotId);
|
|
235
254
|
const existing = this.pendingInstanceMaterializations.get(instanceMaterializationKey(meshName, spotId, objectGeneration));
|
|
236
255
|
if (existing !== undefined) {
|
|
@@ -239,13 +258,13 @@ class DefaultZLinkSpotManager {
|
|
|
239
258
|
}
|
|
240
259
|
const release = await this.options.activationAdmission?.acquire(meshName, signal);
|
|
241
260
|
try {
|
|
242
|
-
await this.materializeInstanceCore(meshName, instanceType, spotId, objectGeneration, readyTarget?.objectGeneration === objectGeneration, signal);
|
|
261
|
+
await this.materializeInstanceCore(meshName, instanceType, spotId, objectGeneration, readyTarget?.objectGeneration === objectGeneration, signal, completion);
|
|
243
262
|
}
|
|
244
263
|
finally {
|
|
245
264
|
release?.();
|
|
246
265
|
}
|
|
247
266
|
}
|
|
248
|
-
async materializeInstanceCore(meshName, instanceType, spotId, objectGeneration, requiresReadyTarget, signal) {
|
|
267
|
+
async materializeInstanceCore(meshName, instanceType, spotId, objectGeneration, requiresReadyTarget, signal, completion) {
|
|
249
268
|
const factory = this.requireInstanceFactory(meshName, instanceType);
|
|
250
269
|
const key = `${meshName}\0${String(spotId)}`;
|
|
251
270
|
const materializationKey = instanceMaterializationKey(meshName, spotId, objectGeneration);
|
|
@@ -271,7 +290,7 @@ class DefaultZLinkSpotManager {
|
|
|
271
290
|
await (0, abort_1.awaitWithAbort)(closing.ready, signal);
|
|
272
291
|
continue;
|
|
273
292
|
}
|
|
274
|
-
const current = this.activations.
|
|
293
|
+
const current = this.activations.activationForClose(meshName, spotId);
|
|
275
294
|
if (current !== undefined) {
|
|
276
295
|
if (current.spotType !== factory) {
|
|
277
296
|
throw new configuration_1.ZLinkConfigurationException(`Instance Spot '${String(spotId)}' is assigned to another type.`);
|
|
@@ -305,14 +324,16 @@ class DefaultZLinkSpotManager {
|
|
|
305
324
|
}
|
|
306
325
|
}
|
|
307
326
|
if (pending === undefined) {
|
|
308
|
-
|
|
327
|
+
if (completion === 'first-terminal')
|
|
328
|
+
this.activations.stage(meshName, spotId);
|
|
309
329
|
pending = this.activationLifecycle
|
|
310
330
|
.materializeInstance(meshName, instanceType, factory, spotId, objectGeneration, signal)
|
|
311
|
-
.then((activation) => {
|
|
312
|
-
|
|
331
|
+
.then(async (activation) => {
|
|
332
|
+
if (completion === 'publication')
|
|
333
|
+
await activation.serialExecutor.finishPreparation();
|
|
313
334
|
return activation;
|
|
314
335
|
}, (error) => {
|
|
315
|
-
|
|
336
|
+
this.activations.abandonStage(meshName, spotId);
|
|
316
337
|
throw error;
|
|
317
338
|
});
|
|
318
339
|
this.pendingInstanceMaterializations.set(materializationKey, pending);
|
|
@@ -352,10 +373,13 @@ class DefaultZLinkSpotManager {
|
|
|
352
373
|
: this.activations.resolve(meshName, spotId);
|
|
353
374
|
if (current !== undefined)
|
|
354
375
|
return current;
|
|
355
|
-
if (meshName !== undefined)
|
|
356
|
-
|
|
376
|
+
if (meshName !== undefined) {
|
|
377
|
+
const closing = this.closeOperations.get(`${meshName}\0${String(spotId)}`);
|
|
378
|
+
return closing?.authority === undefined ? undefined : closing.activation;
|
|
379
|
+
}
|
|
357
380
|
for (const operation of this.closeOperations.values()) {
|
|
358
|
-
if (
|
|
381
|
+
if (operation.authority !== undefined &&
|
|
382
|
+
String(operation.activation.spotId) === String(spotId))
|
|
359
383
|
return operation.activation;
|
|
360
384
|
}
|
|
361
385
|
return undefined;
|
|
@@ -363,6 +387,7 @@ class DefaultZLinkSpotManager {
|
|
|
363
387
|
isInstanceMaterializing(meshName, spotId) {
|
|
364
388
|
const prefix = instanceMaterializationPrefix(meshName, spotId);
|
|
365
389
|
return ((this.pendingInstanceMaterializationsByPrefix.get(prefix)?.size ?? 0) > 0 ||
|
|
390
|
+
this.activations.activationForClose(meshName, spotId)?.serialExecutor.isPreparing === true ||
|
|
366
391
|
this.closeOperations.get(`${meshName}\0${String(spotId)}`)?.authority !== undefined);
|
|
367
392
|
}
|
|
368
393
|
isSpotClosing(meshName, spotId) {
|
|
@@ -373,7 +398,7 @@ class DefaultZLinkSpotManager {
|
|
|
373
398
|
return this.closeOperations.get(`${meshName}\0${String(spotId)}`)?.authorityDecision;
|
|
374
399
|
}
|
|
375
400
|
async discardInstance(meshName, spotId) {
|
|
376
|
-
const activation = this.activations.
|
|
401
|
+
const activation = this.activations.activationForClose(meshName, spotId);
|
|
377
402
|
if (activation === undefined)
|
|
378
403
|
return;
|
|
379
404
|
activation.requestClose();
|
|
@@ -399,6 +424,9 @@ class DefaultZLinkSpotManager {
|
|
|
399
424
|
}
|
|
400
425
|
async completeInstanceTerminal(meshName, spotId, objectGeneration) {
|
|
401
426
|
const key = `${meshName}\0${String(spotId)}`;
|
|
427
|
+
const activation = this.activations.activationForClose(meshName, spotId);
|
|
428
|
+
if (activation?.objectGeneration === objectGeneration)
|
|
429
|
+
await activation.serialExecutor.finishPreparation();
|
|
402
430
|
const pending = this.pendingInstanceTerminals.get(key);
|
|
403
431
|
if (pending === undefined)
|
|
404
432
|
return false;
|
|
@@ -437,6 +465,13 @@ class DefaultZLinkSpotManager {
|
|
|
437
465
|
generations.set(generationKey, (generations.get(generationKey) ?? 0) + 1);
|
|
438
466
|
this.pendingInstanceTerminalGenerations.set(key, generations);
|
|
439
467
|
}
|
|
468
|
+
publishInstance(target, meshName) {
|
|
469
|
+
const activation = this.activations.activationForClose(meshName, target.targetSpotId);
|
|
470
|
+
if (activation?.objectGeneration === target.objectGeneration) {
|
|
471
|
+
const published = this.activations.publish(meshName, target.targetSpotId);
|
|
472
|
+
published?.serialExecutor.openPreparationAdmission();
|
|
473
|
+
}
|
|
474
|
+
}
|
|
440
475
|
deferInstanceAuthorityRelease(key, objectGeneration) {
|
|
441
476
|
const generations = this.deferredInstanceAuthorityReleases.get(key) ?? new Set();
|
|
442
477
|
generations.add(objectGeneration);
|
|
@@ -577,10 +612,12 @@ class DefaultZLinkSpotManager {
|
|
|
577
612
|
.filter(({ spotId }) => !this.isSpotClosing(meshName, spotId));
|
|
578
613
|
}
|
|
579
614
|
async drainForShutdown(meshName, signal, deadline) {
|
|
580
|
-
|
|
615
|
+
// The host bounds observation of the whole Close, including lifecycle admission.
|
|
616
|
+
// The owned operation keeps the gate and scopes until its running turns settle.
|
|
617
|
+
const results = await (0, abort_1.awaitWithAbort)(Promise.allSettled(this.activations
|
|
581
618
|
.activeActivations()
|
|
582
619
|
.filter((activation) => activation.meshName === meshName)
|
|
583
|
-
.map((activation) => this.closeWithReason(meshName, activation.spotId,
|
|
620
|
+
.map((activation) => this.closeWithReason(meshName, activation.spotId, undefined, contracts_1.ZLinkSpotCloseReason.HostShutdown, deadline))), signal);
|
|
584
621
|
const errors = results
|
|
585
622
|
.filter((result) => result.status === 'rejected')
|
|
586
623
|
.map((result) => result.reason);
|
|
@@ -598,7 +635,9 @@ class DefaultZLinkSpotManager {
|
|
|
598
635
|
closeFromContext(activation, objectGeneration, signal) {
|
|
599
636
|
const { meshName, spotId } = activation;
|
|
600
637
|
const operation = this.closeOperations.get(`${meshName}\0${String(spotId)}`);
|
|
601
|
-
const current = operation?.activation ??
|
|
638
|
+
const current = operation?.activation ??
|
|
639
|
+
this.activations.resolve(meshName, spotId) ??
|
|
640
|
+
(activation.serialExecutor.isPreparing ? activation : undefined);
|
|
602
641
|
if (current === undefined) {
|
|
603
642
|
return Promise.resolve(false);
|
|
604
643
|
}
|
|
@@ -608,14 +647,14 @@ class DefaultZLinkSpotManager {
|
|
|
608
647
|
const beginUserAuthority = activation.domain.kind === 'user' && this.options.beginUserClosingAuthority !== undefined
|
|
609
648
|
? (onCommitted) => this.options.beginUserClosingAuthority(meshName, spotId, objectGeneration, onCommitted)
|
|
610
649
|
: undefined;
|
|
611
|
-
return this.closeWithReason(meshName, spotId, signal, contracts_1.ZLinkSpotCloseReason.ExplicitClose, undefined, beginUserAuthority);
|
|
650
|
+
return this.closeWithReason(meshName, spotId, signal, contracts_1.ZLinkSpotCloseReason.ExplicitClose, undefined, beginUserAuthority, activation);
|
|
612
651
|
}
|
|
613
|
-
async closeWithReason(meshName, spotId, signal, reason = contracts_1.ZLinkSpotCloseReason.ExplicitClose, deadline, beginUserAuthority) {
|
|
652
|
+
async closeWithReason(meshName, spotId, signal, reason = contracts_1.ZLinkSpotCloseReason.ExplicitClose, deadline, beginUserAuthority, contextActivation) {
|
|
614
653
|
requireMeshName(meshName);
|
|
615
654
|
const key = `${meshName}\0${String(spotId)}`;
|
|
616
655
|
let operation = this.closeOperations.get(key);
|
|
617
656
|
if (operation === undefined) {
|
|
618
|
-
const activation = this.activations.resolve(meshName, spotId);
|
|
657
|
+
const activation = this.activations.resolve(meshName, spotId) ?? contextActivation;
|
|
619
658
|
if (activation === undefined)
|
|
620
659
|
return false;
|
|
621
660
|
if (activation.domain.kind === 'user' &&
|
|
@@ -665,11 +704,13 @@ class DefaultZLinkSpotManager {
|
|
|
665
704
|
return await operation.ready;
|
|
666
705
|
}
|
|
667
706
|
async runCloseOperation(meshName, spotId, operation, signal, deadline) {
|
|
707
|
+
if (this.activations.resolve(meshName, spotId) !== operation.activation)
|
|
708
|
+
return false;
|
|
668
709
|
const seal = await this.beginCloseAuthority(meshName, spotId, operation, signal);
|
|
669
710
|
if (seal === undefined)
|
|
670
711
|
return false;
|
|
671
712
|
if (seal !== true) {
|
|
672
|
-
await this.activationLifecycle.sealForClose(operation.activation, seal);
|
|
713
|
+
await this.activationLifecycle.sealForClose(operation.activation, seal, signal);
|
|
673
714
|
}
|
|
674
715
|
else {
|
|
675
716
|
await operation.activation.executionBarrier.waitForStartedTurns(signal);
|
|
@@ -799,11 +840,18 @@ class DefaultZLinkSpotManager {
|
|
|
799
840
|
beginUserSpotPublication(meshName, spotId) {
|
|
800
841
|
this.activations.stage(meshName, spotId);
|
|
801
842
|
}
|
|
802
|
-
publishUserSpot(meshName, spotId) {
|
|
803
|
-
this.activations.publish(meshName, spotId);
|
|
843
|
+
async publishUserSpot(meshName, spotId) {
|
|
844
|
+
const published = this.activations.publish(meshName, spotId);
|
|
845
|
+
await published?.serialExecutor.finishPreparation();
|
|
804
846
|
}
|
|
805
|
-
abortUserSpotPublication(meshName, spotId) {
|
|
847
|
+
async abortUserSpotPublication(meshName, spotId) {
|
|
806
848
|
this.activations.abandonStage(meshName, spotId);
|
|
849
|
+
const activation = this.activations.activationForClose(meshName, spotId);
|
|
850
|
+
if (activation?.serialExecutor.isPreparing === true) {
|
|
851
|
+
await this.activationLifecycle.cleanupFailedIncarnation(activation);
|
|
852
|
+
this.activations.finishClose(meshName, spotId);
|
|
853
|
+
await activation.serialExecutor.close();
|
|
854
|
+
}
|
|
807
855
|
}
|
|
808
856
|
resolveLocalSpotRoute(spotId) {
|
|
809
857
|
const activation = this.activations.resolveUnique(spotId);
|
|
@@ -848,9 +896,6 @@ class DefaultZLinkSpotManager {
|
|
|
848
896
|
async commitActorLeaveAfterTransfer(spotId, actorId) {
|
|
849
897
|
await this.actorMembership.commitActorLeaveAfterTransfer(spotId, actorId);
|
|
850
898
|
}
|
|
851
|
-
async restoreActorAfterFailedTransfer(spotId, actor, signal) {
|
|
852
|
-
await this.actorMembership.restoreActorAfterFailedTransfer(spotId, actor, signal);
|
|
853
|
-
}
|
|
854
899
|
async beginActorTransfer(spotId, actorId) {
|
|
855
900
|
await this.actorMembership.beginActorTransfer(spotId, actorId);
|
|
856
901
|
}
|
|
@@ -883,26 +928,41 @@ class DefaultZLinkSpotManager {
|
|
|
883
928
|
}
|
|
884
929
|
return this.activationLifecycle.admitActorPacketPrefix(activation, actorId, records);
|
|
885
930
|
}
|
|
931
|
+
/** Resolves the current Actor FIFO owner for both Entry and User membership. */
|
|
932
|
+
admitSourceActorPacketPrefix(actorId, records) {
|
|
933
|
+
const owner = this.options.actorDispatchOwnerResolver?.(actorId);
|
|
934
|
+
if (owner?.actorRef === undefined) {
|
|
935
|
+
throw new configuration_1.ZLinkConfigurationException(`Actor '${actorId}' has no local FIFO owner.`);
|
|
936
|
+
}
|
|
937
|
+
if (owner.spotId === undefined) {
|
|
938
|
+
if (this.options.admitEntryActorPacketPrefix === undefined) {
|
|
939
|
+
throw new configuration_1.ZLinkConfigurationException(`Actor '${actorId}' has no Entry FIFO port.`);
|
|
940
|
+
}
|
|
941
|
+
return this.options.admitEntryActorPacketPrefix(owner.actorRef.meshName, actorId, records);
|
|
942
|
+
}
|
|
943
|
+
return this.admitRoutedActorPacketPrefix(owner.spotId, actorId, records);
|
|
944
|
+
}
|
|
886
945
|
async dispatchRoutedSpotSend(spotId, packetName, message, context) {
|
|
887
946
|
await this.routedSpotPackets.send(spotId, packetName, message, context);
|
|
888
947
|
}
|
|
889
948
|
async dispatchRoutedSpotRequest(spotId, packetName, request, context) {
|
|
890
949
|
return await this.routedSpotPackets.request(spotId, packetName, request, context);
|
|
891
950
|
}
|
|
892
|
-
async dispatchMeshSpot(meshName, owner, record) {
|
|
951
|
+
async dispatchMeshSpot(meshName, owner, record, admit) {
|
|
893
952
|
const spotId = owner.spotId;
|
|
894
953
|
if (spotId === null) {
|
|
895
954
|
throw new configuration_1.ZLinkConfigurationException('MeshNode Spot record is missing the owner Spot RID.');
|
|
896
955
|
}
|
|
897
956
|
if (record.kind === service_runtime_contracts_1.ReceiveKind.SpotMulticast) {
|
|
898
|
-
const activation = this.activations.
|
|
957
|
+
const activation = this.activations.activationForClose(meshName, spotId);
|
|
899
958
|
if (activation?.actorDispatch === undefined) {
|
|
900
959
|
throw new configuration_1.ZLinkConfigurationException(`MeshNode Spot multicast target '${String(spotId)}' is not active.`);
|
|
901
960
|
}
|
|
902
961
|
if (record.topic === null || record.topic.length === 0) {
|
|
903
962
|
throw new configuration_1.ZLinkConfigurationException('MeshNode Spot multicast record is missing its topic.');
|
|
904
963
|
}
|
|
905
|
-
|
|
964
|
+
const dispatch = () => activation.actorDispatch.dispatchSubscriptionRecord(record.topic, record.parts, record.sourceNodeRid);
|
|
965
|
+
await (admit === undefined ? dispatch() : admit(dispatch));
|
|
906
966
|
return;
|
|
907
967
|
}
|
|
908
968
|
const envelope = (0, channel_envelope_1.decodeChannelEnvelope)(record.parts, undefined, this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true);
|
|
@@ -916,20 +976,25 @@ class DefaultZLinkSpotManager {
|
|
|
916
976
|
contentType: envelope.header.contentType,
|
|
917
977
|
workOptions: (0, serial_work_size_1.zlinkSerialWorkOptions)(envelope.payload.byteLength, record.applicationMetadata?.byteLength ?? (0, serial_work_size_1.zlinkMetadataByteLength)(envelope.header.metadata))
|
|
918
978
|
};
|
|
919
|
-
if (record.kind === service_runtime_contracts_1.ReceiveKind.SpotSend) {
|
|
920
|
-
await this.ensureInstanceApplicationActivation(meshName, spotId);
|
|
921
|
-
await this.routedSpotPackets.sendEncoded(spotId, packetName, decodePayload, context);
|
|
922
|
-
return;
|
|
923
|
-
}
|
|
924
|
-
if (record.kind !== service_runtime_contracts_1.ReceiveKind.SpotRequest) {
|
|
925
|
-
throw new configuration_1.ZLinkConfigurationException(`Unsupported MeshNode Spot record kind '${record.kind}'.`);
|
|
926
|
-
}
|
|
927
979
|
try {
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
980
|
+
const dispatch = async () => {
|
|
981
|
+
if (record.kind === service_runtime_contracts_1.ReceiveKind.SpotSend) {
|
|
982
|
+
await this.ensureInstanceApplicationActivation(meshName, spotId);
|
|
983
|
+
await this.routedSpotPackets.sendEncoded(spotId, packetName, decodePayload, context);
|
|
984
|
+
return;
|
|
985
|
+
}
|
|
986
|
+
if (record.kind !== service_runtime_contracts_1.ReceiveKind.SpotRequest) {
|
|
987
|
+
throw new configuration_1.ZLinkConfigurationException(`Unsupported MeshNode Spot record kind '${record.kind}'.`);
|
|
988
|
+
}
|
|
989
|
+
await this.ensureInstanceApplicationActivation(meshName, spotId);
|
|
990
|
+
const response = await this.routedSpotPackets.requestEncoded(spotId, packetName, decodePayload, context);
|
|
991
|
+
requireMeshSpotReply(record.reply((0, channel_envelope_1.encodeChannelReplyParts)(envelope.header, response, codecs)));
|
|
992
|
+
};
|
|
993
|
+
await (admit === undefined ? dispatch() : admit(dispatch));
|
|
931
994
|
}
|
|
932
995
|
catch (error) {
|
|
996
|
+
if (record.kind !== service_runtime_contracts_1.ReceiveKind.SpotRequest)
|
|
997
|
+
throw error;
|
|
933
998
|
requireMeshSpotReply(record.reply((0, channel_envelope_1.encodeChannelErrorReplyParts)(envelope.header, error)));
|
|
934
999
|
}
|
|
935
1000
|
}
|
|
@@ -953,7 +1018,7 @@ class DefaultZLinkSpotManager {
|
|
|
953
1018
|
target = latest;
|
|
954
1019
|
}
|
|
955
1020
|
}
|
|
956
|
-
async dispatchMeshInstance(meshName, owner, record) {
|
|
1021
|
+
async dispatchMeshInstance(meshName, owner, record, admit) {
|
|
957
1022
|
const spotId = owner.spotId;
|
|
958
1023
|
if (spotId === null) {
|
|
959
1024
|
throw new configuration_1.ZLinkConfigurationException('MeshNode Instance Spot record is missing the owner Spot RID.');
|
|
@@ -964,55 +1029,58 @@ class DefaultZLinkSpotManager {
|
|
|
964
1029
|
const request = record.operationKind === service_runtime_contracts_1.OperationKind.InstanceSpotRequest;
|
|
965
1030
|
this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Received, meshName, spotId, record, envelope, 'activating');
|
|
966
1031
|
try {
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
(0, serial_work_size_1.
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
record.activationRecord
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1032
|
+
const dispatch = async () => {
|
|
1033
|
+
await this.ensureInstanceApplicationActivation(meshName, spotId);
|
|
1034
|
+
const activation = this.resolveApplicationActivation(spotId, meshName);
|
|
1035
|
+
if (activation === undefined || activation.domain.kind !== 'instance') {
|
|
1036
|
+
throw new configuration_1.ZLinkConfigurationException(`MeshNode Instance Spot target '${String(spotId)}' is not active.`);
|
|
1037
|
+
}
|
|
1038
|
+
const target = this.options.instanceSpotApplicationTargetProvider?.(meshName, spotId);
|
|
1039
|
+
if (target !== undefined &&
|
|
1040
|
+
activation.domain.objectGeneration !== target.objectGeneration) {
|
|
1041
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale, `Instance Spot target '${String(spotId)}' application generation is stale.`);
|
|
1042
|
+
}
|
|
1043
|
+
const codecs = this.options.messageSerializers === undefined
|
|
1044
|
+
? undefined
|
|
1045
|
+
: { serializers: this.options.messageSerializers };
|
|
1046
|
+
const decodePayload = () => (0, channel_envelope_1.decodeChannelPayload)(envelope, codecs);
|
|
1047
|
+
const context = {
|
|
1048
|
+
channelName: envelope.header.channelName,
|
|
1049
|
+
contentType: envelope.header.contentType,
|
|
1050
|
+
awaitFirstHandlerTurn: record.kind === service_runtime_contracts_1.ReceiveKind.InstanceSpotActivation,
|
|
1051
|
+
activationRecord: record,
|
|
1052
|
+
onOneWayError: this.options.dispatchErrors?.captureEnabled() === true
|
|
1053
|
+
? (error) => this.reportInstanceDispatchFailure(meshName, spotId, record, envelope, false, error)
|
|
1054
|
+
: undefined,
|
|
1055
|
+
workOptions: (0, serial_work_size_1.zlinkSerialWorkOptions)(envelope.payload.byteLength, record.applicationMetadata?.byteLength ??
|
|
1056
|
+
(0, serial_work_size_1.zlinkMetadataByteLength)(envelope.header.metadata))
|
|
1057
|
+
};
|
|
1058
|
+
// Spot messaging §7 step 3: an Instance intent request that reaches an
|
|
1059
|
+
// incarnation whose Close ended admission is refused before admission
|
|
1060
|
+
// with the owner fence terminal, so its caller re-reads authority.
|
|
1061
|
+
const instanceIntent = record.activationRecord?.activation === 'missing' ||
|
|
1062
|
+
(record.activationRecord?.activation === 'ready' &&
|
|
1063
|
+
record.activationRecord.instanceIntent);
|
|
1064
|
+
const refusal = activation.serial.applicationAdmissionRefusal(instanceIntent === true);
|
|
1065
|
+
if (request && refusal !== undefined && record.replyFailure !== undefined) {
|
|
1066
|
+
this.reportInstanceDispatchFailure(meshName, spotId, record, envelope, request, refusal);
|
|
1067
|
+
const terminal = (0, framework_errors_internal_1.internalFrameworkWireReply)(refusal);
|
|
1068
|
+
requireMeshSpotReply(record.replyFailure(terminal.terminalResult, terminal.failureCode));
|
|
1069
|
+
return;
|
|
1070
|
+
}
|
|
1071
|
+
this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Admitted, meshName, spotId, record, envelope, 'ready', target?.stableType);
|
|
1072
|
+
if (!request) {
|
|
1073
|
+
this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched, meshName, spotId, record, envelope, 'ready', target?.stableType);
|
|
1074
|
+
await this.routedSpotPackets.sendEncoded(spotId, envelope.packetName, decodePayload, context);
|
|
1075
|
+
this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed, meshName, spotId, record, envelope, 'ready', target?.stableType);
|
|
1076
|
+
return;
|
|
1077
|
+
}
|
|
1007
1078
|
this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched, meshName, spotId, record, envelope, 'ready', target?.stableType);
|
|
1008
|
-
await this.routedSpotPackets.
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
const response = await this.routedSpotPackets.requestEncoded(spotId, envelope.packetName, decodePayload, context);
|
|
1014
|
-
requireMeshSpotReply(record.reply((0, channel_envelope_1.encodeChannelReplyParts)(envelope.header, response, codecs)));
|
|
1015
|
-
this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Replied, meshName, spotId, record, envelope, 'ready', target?.stableType);
|
|
1079
|
+
const response = await this.routedSpotPackets.requestEncoded(spotId, envelope.packetName, decodePayload, context);
|
|
1080
|
+
requireMeshSpotReply(record.reply((0, channel_envelope_1.encodeChannelReplyParts)(envelope.header, response, codecs)));
|
|
1081
|
+
this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Replied, meshName, spotId, record, envelope, 'ready', target?.stableType);
|
|
1082
|
+
};
|
|
1083
|
+
await (admit === undefined ? dispatch() : admit(dispatch));
|
|
1016
1084
|
}
|
|
1017
1085
|
catch (error) {
|
|
1018
1086
|
this.reportInstanceDispatchFailure(meshName, spotId, record, envelope, request, error);
|
|
@@ -1071,7 +1139,7 @@ class DefaultZLinkSpotManager {
|
|
|
1071
1139
|
errorReason
|
|
1072
1140
|
});
|
|
1073
1141
|
}
|
|
1074
|
-
async dispatchMeshActor(origin, meshName, owner, record) {
|
|
1142
|
+
async dispatchMeshActor(origin, meshName, owner, record, admit) {
|
|
1075
1143
|
const spotId = owner.spotId;
|
|
1076
1144
|
const entrySpotId = this.options.entryNodeRidProvider?.() ?? this.options.entryNodeRid;
|
|
1077
1145
|
const targetsEntrySpot = spotId === null || (entrySpotId !== undefined && spotId === entrySpotId);
|
|
@@ -1080,12 +1148,15 @@ class DefaultZLinkSpotManager {
|
|
|
1080
1148
|
throw new configuration_1.ZLinkConfigurationException('MeshNode Actor record is missing its Actor owner.');
|
|
1081
1149
|
}
|
|
1082
1150
|
const request = record.kind === service_runtime_contracts_1.ReceiveKind.ActorRequest;
|
|
1083
|
-
const
|
|
1084
|
-
const
|
|
1085
|
-
|
|
1086
|
-
|
|
1151
|
+
const nativeTarget = record.messageFollowOrigin?.target;
|
|
1152
|
+
const ingressActor = nativeTarget?.actor ?? actor;
|
|
1153
|
+
const resolvedActorRef = (nativeTarget === undefined
|
|
1154
|
+
? this.options.actorDispatchOwnerResolver?.(actor.actorId).actorRef
|
|
1155
|
+
: undefined) ?? {
|
|
1156
|
+
actorId: ingressActor.actorId,
|
|
1157
|
+
objectGeneration: ingressActor.generation,
|
|
1087
1158
|
meshName,
|
|
1088
|
-
nodeRid:
|
|
1159
|
+
nodeRid: ingressActor.nodeRid
|
|
1089
1160
|
};
|
|
1090
1161
|
const responseActorRef = record.sourceBindingGeneration > 0n
|
|
1091
1162
|
? {
|
|
@@ -1111,18 +1182,23 @@ class DefaultZLinkSpotManager {
|
|
|
1111
1182
|
})
|
|
1112
1183
|
: undefined;
|
|
1113
1184
|
try {
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1185
|
+
const dispatch = async () => {
|
|
1186
|
+
if (this.formalRemoteTransfers.has(actor.actorId)) {
|
|
1187
|
+
throw new Error(`Actor '${actor.actorId}' target transfer reconciliation is not complete.`);
|
|
1188
|
+
}
|
|
1189
|
+
const response = targetsEntrySpot
|
|
1190
|
+
? await this.options.dispatchEntryActorPacket?.(origin, actor.actorId, record.parts, request, undefined, ownerActorRef, requestTerminal, record.messageFollowOrigin)
|
|
1191
|
+
: await this.dispatchMeshActorPacket(origin, meshName, spotId, actor.actorId, record.parts, request, ownerActorRef, requestTerminal, record.messageFollowOrigin);
|
|
1192
|
+
if (targetsEntrySpot && this.options.dispatchEntryActorPacket === undefined) {
|
|
1193
|
+
throw new configuration_1.ZLinkConfigurationException('MeshNode Entry Spot Actor dispatch is not configured.');
|
|
1194
|
+
}
|
|
1195
|
+
if (response === actor_handoff_1.RELOCATED_REQUEST_OWNED_BY_REQUESTER)
|
|
1196
|
+
return;
|
|
1197
|
+
if (request && !requestTerminalState.submitted) {
|
|
1198
|
+
requireMeshSpotReply(record.reply(this.encodeMeshActorReply(record.parts[0], protocol_1.ZLinkStreamMessageKind.Response, response)));
|
|
1199
|
+
}
|
|
1200
|
+
};
|
|
1201
|
+
await (admit === undefined ? dispatch() : admit(dispatch));
|
|
1126
1202
|
}
|
|
1127
1203
|
catch (error) {
|
|
1128
1204
|
if (!request) {
|
|
@@ -1131,10 +1207,7 @@ class DefaultZLinkSpotManager {
|
|
|
1131
1207
|
if (requestTerminalState.prepared || requestTerminalState.submitted) {
|
|
1132
1208
|
throw error;
|
|
1133
1209
|
}
|
|
1134
|
-
requireMeshSpotReply(record.reply(this.encodeMeshActorReply(record.parts[0], protocol_1.ZLinkStreamMessageKind.Error,
|
|
1135
|
-
message: error instanceof Error ? error.message : String(error),
|
|
1136
|
-
kind: spotActorFailureKind(error)
|
|
1137
|
-
})));
|
|
1210
|
+
requireMeshSpotReply(record.reply(this.encodeMeshActorReply(record.parts[0], protocol_1.ZLinkStreamMessageKind.Error, (0, bound_session_response_target_1.boundSessionErrorPayload)(error))));
|
|
1138
1211
|
}
|
|
1139
1212
|
}
|
|
1140
1213
|
async dispatchMeshActorJoin(meshName, owner, record) {
|
|
@@ -1627,7 +1700,7 @@ class DefaultZLinkSpotManager {
|
|
|
1627
1700
|
if (!sourceLeaveSubmitted) {
|
|
1628
1701
|
throw new Error(`Actor '${entryActor.context.actorId}' source authority commit failed before leave submission.`);
|
|
1629
1702
|
}
|
|
1630
|
-
const handoffResults = await (0,
|
|
1703
|
+
const handoffResults = await (0, actor_handoff_2.replayActorHandoffBacklog)(pendingTransfer.handoffBacklog, async (parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) => {
|
|
1631
1704
|
if (this.options.dispatchEntryActorPacket === undefined) {
|
|
1632
1705
|
throw new Error('Entry Spot saved handoff replay requires its Actor packet runtime.');
|
|
1633
1706
|
}
|
|
@@ -1744,12 +1817,7 @@ class DefaultZLinkSpotManager {
|
|
|
1744
1817
|
const callback = async () => {
|
|
1745
1818
|
await this.options.entrySpotCallbacks?.onLeaveActor(actor, undefined, actorRef, control.previousMembershipEpoch);
|
|
1746
1819
|
};
|
|
1747
|
-
|
|
1748
|
-
await callback();
|
|
1749
|
-
}
|
|
1750
|
-
else {
|
|
1751
|
-
await this.options.actorTransferRuntime.notifyCoreSourceLeave(actor, callback);
|
|
1752
|
-
}
|
|
1820
|
+
await callback();
|
|
1753
1821
|
return;
|
|
1754
1822
|
}
|
|
1755
1823
|
if (spotId === null) {
|
|
@@ -1790,7 +1858,7 @@ class DefaultZLinkSpotManager {
|
|
|
1790
1858
|
};
|
|
1791
1859
|
const completeTargetReady = async () => {
|
|
1792
1860
|
if (pendingTransfer !== undefined) {
|
|
1793
|
-
const handoffResults = await (0,
|
|
1861
|
+
const handoffResults = await (0, actor_handoff_2.replayActorHandoffBacklog)(pendingTransfer.handoffBacklog, (parts, returnResponse, remoteBoundSessionTarget, _fallbackActorRef) => this.dispatchActorPacket('remote', activation, actor.context.actorId, parts, returnResponse, remoteBoundSessionTarget, undefined), (index) => this.options.runtimeEventPublisher?.publish({
|
|
1794
1862
|
sourceName: 'zlink.framework.actor-handoff',
|
|
1795
1863
|
timestamp: new Date(),
|
|
1796
1864
|
marker: 'backlog_enqueued',
|
|
@@ -1807,7 +1875,7 @@ class DefaultZLinkSpotManager {
|
|
|
1807
1875
|
// ingress hold) migrate into the real Actor queue next, in the
|
|
1808
1876
|
// order they parked — after the relayed backlog above, before
|
|
1809
1877
|
// regular ingress opens.
|
|
1810
|
-
|
|
1878
|
+
this.migrateActorJoinPrewarm(activation, actor, pendingTransfer.transferId);
|
|
1811
1879
|
// This registry owns target lifecycle and saved backlog
|
|
1812
1880
|
// reconciliation only. Session route readiness is enforced by
|
|
1813
1881
|
// the Session binding aggregate after this boundary.
|
|
@@ -1870,7 +1938,7 @@ class DefaultZLinkSpotManager {
|
|
|
1870
1938
|
if (sourceJoinedActor === undefined && pendingTransfer === undefined) {
|
|
1871
1939
|
return;
|
|
1872
1940
|
}
|
|
1873
|
-
await
|
|
1941
|
+
await activation.spot.onLeaveActor(actor);
|
|
1874
1942
|
}
|
|
1875
1943
|
activation.commitActorDeparture(actor.context.actorId);
|
|
1876
1944
|
return;
|
|
@@ -1894,7 +1962,7 @@ class DefaultZLinkSpotManager {
|
|
|
1894
1962
|
const outcome = admission.result ?? (await admission.resultTask);
|
|
1895
1963
|
if ('error' in outcome)
|
|
1896
1964
|
throw outcome.error;
|
|
1897
|
-
if (!outcome.accepted || admission.state !== 'admitted') {
|
|
1965
|
+
if (!outcome.accepted || (admission.state !== 'admitted' && admission.state !== 'restoring')) {
|
|
1898
1966
|
throw new Error(`Actor Join relocation '${relocationId}' has no accepted admission.`);
|
|
1899
1967
|
}
|
|
1900
1968
|
const entrySpotId = this.options.entryNodeRidProvider?.() ?? this.options.entryNodeRid;
|
|
@@ -1916,6 +1984,19 @@ class DefaultZLinkSpotManager {
|
|
|
1916
1984
|
}
|
|
1917
1985
|
catch (error) {
|
|
1918
1986
|
lifecycleFailure = { error };
|
|
1987
|
+
const reporter = this.options.dispatchErrors;
|
|
1988
|
+
if (reporter?.captureEnabled() === true) {
|
|
1989
|
+
reporter.report({
|
|
1990
|
+
surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.ActorRelocation,
|
|
1991
|
+
messageKind: ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Control,
|
|
1992
|
+
reason: (0, dispatch_error_details_1.dispatchReasonFromError)(error),
|
|
1993
|
+
action: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.FailCaller,
|
|
1994
|
+
packetName: 'OnJoinedActor',
|
|
1995
|
+
meshName,
|
|
1996
|
+
actorId: actor.context.actorId,
|
|
1997
|
+
error
|
|
1998
|
+
});
|
|
1999
|
+
}
|
|
1919
2000
|
}
|
|
1920
2001
|
if (lifecycleFailure === undefined) {
|
|
1921
2002
|
const sourceLeave = submitSourceLeave(admission.admission.actorRef.nodeRid);
|
|
@@ -1929,7 +2010,7 @@ class DefaultZLinkSpotManager {
|
|
|
1929
2010
|
if (activation === undefined) {
|
|
1930
2011
|
throw new Error(`Actor Join relocation '${relocationId}' target mailbox is missing.`);
|
|
1931
2012
|
}
|
|
1932
|
-
return activation.executeActor(actor.context.actorId, operation);
|
|
2013
|
+
return activation.executeActor(actor.context.actorId, operation, { lane: 'lifecycle' });
|
|
1933
2014
|
};
|
|
1934
2015
|
await this.options.actorTransferRuntime.deliverDeferredJoinCompletion(lifecycleFailure === undefined
|
|
1935
2016
|
? outcome.deferredJoinCompletion
|
|
@@ -1944,6 +2025,20 @@ class DefaultZLinkSpotManager {
|
|
|
1944
2025
|
this.formalRemoteActorAdmissions.markCommitted(relocationId, actor);
|
|
1945
2026
|
return true;
|
|
1946
2027
|
}
|
|
2028
|
+
beginActorJoinRelocation(relocationId) {
|
|
2029
|
+
this.formalRemoteActorAdmissions.beginRestore(relocationId);
|
|
2030
|
+
return () => this.formalRemoteActorAdmissions.finishRestore(relocationId);
|
|
2031
|
+
}
|
|
2032
|
+
/** @internal Transfers accepted ingress after the target Actor becomes visible. */
|
|
2033
|
+
openActorJoinRelocation(meshName, relocationId, actor) {
|
|
2034
|
+
const admission = this.formalRemoteActorAdmissions.get(relocationId);
|
|
2035
|
+
if (admission === undefined)
|
|
2036
|
+
return;
|
|
2037
|
+
const activation = this.activations.resolve(meshName, admission.admission.spotId);
|
|
2038
|
+
if (activation !== undefined) {
|
|
2039
|
+
this.migrateActorJoinPrewarm(activation, actor, relocationId);
|
|
2040
|
+
}
|
|
2041
|
+
}
|
|
1947
2042
|
async restoreCanonicalActorJoinRecovery(recovery, signal) {
|
|
1948
2043
|
(0, abort_1.throwIfAborted)(signal);
|
|
1949
2044
|
const admission = this.formalRemoteActorAdmissions.get(recovery.request.handoffId);
|
|
@@ -1951,14 +2046,16 @@ class DefaultZLinkSpotManager {
|
|
|
1951
2046
|
throw new Error(`Actor Join recovery '${recovery.request.handoffId}' has no canonical command-28 admission.`);
|
|
1952
2047
|
}
|
|
1953
2048
|
const outcome = admission.result ?? (await admission.resultTask);
|
|
1954
|
-
if ('error' in outcome ||
|
|
2049
|
+
if ('error' in outcome ||
|
|
2050
|
+
!outcome.accepted ||
|
|
2051
|
+
(admission.state !== 'admitted' && admission.state !== 'restoring')) {
|
|
1955
2052
|
throw new Error(`Actor Join recovery '${recovery.request.handoffId}' has no accepted admission.`);
|
|
1956
2053
|
}
|
|
1957
2054
|
const admitted = admission.admission;
|
|
1958
2055
|
if (admitted.sourceActorNodeRid === undefined) {
|
|
1959
2056
|
throw new Error(`Actor Join recovery '${recovery.request.handoffId}' lost its command-28 source route.`);
|
|
1960
2057
|
}
|
|
1961
|
-
const admittedNodeBytes = Buffer.from((0,
|
|
2058
|
+
const admittedNodeBytes = Buffer.from((0, routing_id_2.encodeRoutingIdStorageHex)(admitted.sourceActorNodeRid), 'hex');
|
|
1962
2059
|
if (admitted.actorId !== recovery.request.actorId ||
|
|
1963
2060
|
admitted.actorType !== recovery.request.actorType ||
|
|
1964
2061
|
admitted.requestFingerprint !== recovery.request.request.toString('base64') ||
|
|
@@ -1996,33 +2093,7 @@ class DefaultZLinkSpotManager {
|
|
|
1996
2093
|
this.formalRemoteActorAdmissions.attachDeferredJoinCompletion(recovery.request.handoffId, deferred);
|
|
1997
2094
|
}
|
|
1998
2095
|
encodeMeshActorReply(requestHeaderPart, kind, payload) {
|
|
1999
|
-
|
|
2000
|
-
// Off (and skips its validation); when tracing is on the reply preserves
|
|
2001
|
-
// the request's flow pair alongside its correlation.
|
|
2002
|
-
const requestHeader = (0, protocol_1.decodeStreamHeader)(requestHeaderPart.data(), this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true);
|
|
2003
|
-
const encoded = (0, payload_codec_1.encodeFrameworkPayload)(payload, this.options.messageSerializers);
|
|
2004
|
-
try {
|
|
2005
|
-
// encodeStreamHeader returns a fresh, unaliased array; view it without
|
|
2006
|
-
// re-copying. The payload copy stays: encoded.message closes below.
|
|
2007
|
-
const replyHeader = (0, protocol_1.encodeStreamHeader)({
|
|
2008
|
-
kind,
|
|
2009
|
-
codec: (0, protocol_1.streamCodecForContentType)(encoded.contentType),
|
|
2010
|
-
flags: protocol_1.ZLinkStreamHeaderFlags.None,
|
|
2011
|
-
requestSeq: requestHeader.requestSeq,
|
|
2012
|
-
name: '',
|
|
2013
|
-
metadata: new Map(),
|
|
2014
|
-
correlationId: requestHeader.correlationId,
|
|
2015
|
-
flowId: requestHeader.flowId,
|
|
2016
|
-
flowOrigin: requestHeader.flowOrigin
|
|
2017
|
-
});
|
|
2018
|
-
return [
|
|
2019
|
-
Buffer.from(replyHeader.buffer, replyHeader.byteOffset, replyHeader.byteLength),
|
|
2020
|
-
Buffer.from(encoded.message.data())
|
|
2021
|
-
];
|
|
2022
|
-
}
|
|
2023
|
-
finally {
|
|
2024
|
-
encoded.message.close();
|
|
2025
|
-
}
|
|
2096
|
+
return (0, actor_reply_1.encodeActorReply)(requestHeaderPart.data(), kind, payload, this.options.messageSerializers, this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true);
|
|
2026
2097
|
}
|
|
2027
2098
|
async createActivation(meshName, spotType, spotId, request, signal, authority) {
|
|
2028
2099
|
this.requireRegisteredFactory(spotType);
|
|
@@ -2046,9 +2117,11 @@ class DefaultZLinkSpotManager {
|
|
|
2046
2117
|
* either lands in the snapshot or resolves the Actor directly through
|
|
2047
2118
|
* ordinary ingress — never both, never neither.
|
|
2048
2119
|
*/
|
|
2049
|
-
|
|
2120
|
+
migrateActorJoinPrewarm(activation, actor, transferId) {
|
|
2050
2121
|
const drained = this.formalRemoteActorAdmissions.completeMigration(transferId);
|
|
2051
|
-
|
|
2122
|
+
if (drained.length === 0)
|
|
2123
|
+
return;
|
|
2124
|
+
const terminals = drained.map(async (arrival) => {
|
|
2052
2125
|
try {
|
|
2053
2126
|
const response = await this.dispatchActorPacket(arrival.origin, activation, actor.context.actorId, [runtime_message_1.ZLinkBufferMessage.from(arrival.header), runtime_message_1.ZLinkBufferMessage.from(arrival.payload)], arrival.returnResponse, arrival.remoteBoundSessionTarget, arrival.fallbackActorRef, arrival.requestTerminal);
|
|
2054
2127
|
arrival.resolve(response);
|
|
@@ -2056,7 +2129,13 @@ class DefaultZLinkSpotManager {
|
|
|
2056
2129
|
catch (error) {
|
|
2057
2130
|
arrival.reject(error);
|
|
2058
2131
|
}
|
|
2059
|
-
}
|
|
2132
|
+
});
|
|
2133
|
+
// Reserve every retained arrival's FIFO position before ordinary ingress
|
|
2134
|
+
// can resume. Handler terminals must not hold the relocation finalize that
|
|
2135
|
+
// releases an earlier saved-work prefix.
|
|
2136
|
+
this.options.detachedTaskRunner.runDetached(`actor Join ingress migration ${actor.context.actorId}`, async () => {
|
|
2137
|
+
await Promise.all(terminals);
|
|
2138
|
+
});
|
|
2060
2139
|
}
|
|
2061
2140
|
async dispatchMeshActorPacket(origin, meshName, spotId, actorId, parts, returnResponse, fallbackActorRef, requestTerminal, messageFollowOrigin) {
|
|
2062
2141
|
const activation = this.activations.resolve(meshName, spotId);
|
|
@@ -2112,7 +2191,7 @@ function decodeFormalRemoteTransferRequestBytes(bytes) {
|
|
|
2112
2191
|
? payload.requestContentType
|
|
2113
2192
|
: 'application/json',
|
|
2114
2193
|
actorEntryNodeRid: typeof payload.actorEntryNodeRid === 'string'
|
|
2115
|
-
? (0,
|
|
2194
|
+
? (0, routing_id_2.decodeRoutingId)(payload.actorEntryNodeRid, payload.actorEntryNodeRidHex)
|
|
2116
2195
|
: undefined,
|
|
2117
2196
|
sourceSpotId: typeof payload.sourceSpotId === 'string' ? payload.sourceSpotId : undefined,
|
|
2118
2197
|
actorRef: decodeFormalRemoteActorRef(payload),
|
|
@@ -2169,7 +2248,7 @@ function validateRemoteAdmissionCommit(admission, request, actorId, control) {
|
|
|
2169
2248
|
expected.targetSpotGeneration !== (control.currentSpotGeneration ?? 0n) ||
|
|
2170
2249
|
actorRef === undefined ||
|
|
2171
2250
|
actorRef.actorId !== expected.actorRef.actorId ||
|
|
2172
|
-
|
|
2251
|
+
!(0, routing_id_1.routingIdsEqual)(actorRef.nodeRid, expected.actorRef.nodeRid) ||
|
|
2173
2252
|
actorRef.objectGeneration !== expected.actorRef.objectGeneration) {
|
|
2174
2253
|
throw new configuration_1.ZLinkConfigurationException(`Remote Actor '${actorId}' commit does not match its target admission.`);
|
|
2175
2254
|
}
|
|
@@ -2197,17 +2276,3 @@ function isAbortSignal(value) {
|
|
|
2197
2276
|
typeof value.aborted === 'boolean' &&
|
|
2198
2277
|
typeof value.addEventListener === 'function');
|
|
2199
2278
|
}
|
|
2200
|
-
function instanceActivationOutcome(error) {
|
|
2201
|
-
if ((0, abort_1.isAbortError)(error))
|
|
2202
|
-
return 'shutdown';
|
|
2203
|
-
if (error instanceof contracts_1.ZLinkFrameworkException) {
|
|
2204
|
-
if (error.kind === contracts_1.ZLinkFrameworkErrorKind.DeadlineExceeded)
|
|
2205
|
-
return 'timed_out';
|
|
2206
|
-
if (error.kind === contracts_1.ZLinkFrameworkErrorKind.AlreadyExists)
|
|
2207
|
-
return 'conflict';
|
|
2208
|
-
if (error.kind === contracts_1.ZLinkFrameworkErrorKind.InvalidOperation ||
|
|
2209
|
-
error.kind === contracts_1.ZLinkFrameworkErrorKind.Unavailable)
|
|
2210
|
-
return 'fenced';
|
|
2211
|
-
}
|
|
2212
|
-
return 'failed';
|
|
2213
|
-
}
|