@zlink-systems/framework 0.30.3 → 0.32.0
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/Actors/ZLinkActor.d.ts +2 -0
- package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
- package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
- package/dist/contracts/Actors/index.d.ts +1 -0
- package/dist/contracts/Actors/index.js +1 -0
- package/dist/contracts/Common/CoreTypes.d.ts +1 -0
- package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
- package/dist/contracts/Common/HandlerMessageType.js +41 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
- package/dist/contracts/Common/ZLinkMessage.js +11 -7
- package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
- package/dist/contracts/Common/encoded-payload-storage.js +4 -16
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/payload-slab.d.ts +4 -0
- package/dist/contracts/Common/payload-slab.js +30 -0
- package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
- package/dist/contracts/Handlers/Contexts.d.ts +1 -0
- package/dist/contracts/Locations/Authority.d.ts +2 -0
- package/dist/internal.d.ts +9 -0
- package/dist/internal.js +23 -1
- package/dist/nest-integration.d.ts +1 -0
- package/dist/nest-integration.js +3 -1
- package/dist/runtime/actors/actor-client.d.ts +6 -2
- package/dist/runtime/actors/actor-client.js +120 -82
- package/dist/runtime/actors/actor-context.js +16 -5
- package/dist/runtime/actors/actor-execution-context.js +2 -2
- package/dist/runtime/actors/actor-handoff.d.ts +12 -1
- package/dist/runtime/actors/actor-handoff.js +79 -34
- package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
- package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
- package/dist/runtime/actors/actor-local-native-join.js +19 -17
- package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
- package/dist/runtime/actors/actor-remote-joiner.js +4 -4
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
- package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
- package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
- package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
- package/dist/runtime/admission.d.ts +6 -4
- package/dist/runtime/admission.js +21 -10
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
- package/dist/runtime/backend/contracts/index.d.ts +26 -10
- package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
- package/dist/runtime/backend/mesh-completion-table.js +84 -20
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
- package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
- package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
- package/dist/runtime/channels/channel-clients.js +3 -3
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
- package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
- package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
- package/dist/runtime/channels/channel-dispatch-services.js +7 -6
- package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
- package/dist/runtime/channels/channel-dispatchers.js +57 -36
- package/dist/runtime/channels/channel-envelope.d.ts +2 -2
- package/dist/runtime/channels/channel-envelope.js +609 -83
- package/dist/runtime/channels/channel-multipart.d.ts +1 -0
- package/dist/runtime/channels/channel-multipart.js +10 -6
- package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
- package/dist/runtime/channels/channel-outbound-operations.js +107 -105
- package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
- package/dist/runtime/channels/channel-receive-loops.js +126 -90
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
- package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
- package/dist/runtime/channels/channel-runtime-manager.js +32 -14
- package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
- package/dist/runtime/channels/channel-socket-registry.js +9 -1
- package/dist/runtime/channels/channel-transports.d.ts +23 -16
- package/dist/runtime/channels/channel-transports.js +139 -119
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
- package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
- package/dist/runtime/channels/local-spot-route-transport.js +15 -18
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
- package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
- package/dist/runtime/channels/source-spot-router.d.ts +6 -3
- package/dist/runtime/channels/source-spot-router.js +34 -23
- package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
- package/dist/runtime/channels/spot-node-route-transport.js +23 -17
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
- package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
- package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
- package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
- package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
- package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
- package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
- package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
- package/dist/runtime/diagnostics/message-flow-record.js +228 -0
- package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
- package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
- package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
- package/dist/runtime/diagnostics/message-flow.js +42 -290
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
- package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
- package/dist/runtime/execution/index.d.ts +1 -0
- package/dist/runtime/execution/index.js +6 -3
- package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
- package/dist/runtime/execution/serial-execution-queue.js +75 -71
- package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
- package/dist/runtime/foundation/durable-service-request.js +158 -73
- package/dist/runtime/foundation/operation-registry.d.ts +33 -3
- package/dist/runtime/foundation/operation-registry.js +272 -33
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
- package/dist/runtime/foundation/request-runtime.d.ts +17 -0
- package/dist/runtime/foundation/request-runtime.js +163 -0
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +6 -0
- package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
- package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
- package/dist/runtime/foundation/service-mailbox.js +4 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
- package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
- package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
- package/dist/runtime/foundation/service-stateful-registry.js +38 -17
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
- package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
- package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
- package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-topology-registry.js +13 -3
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
- package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
- package/dist/runtime/host/actor-packet-relay.js +58 -57
- package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
- package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
- package/dist/runtime/host/application-job-queue.d.ts +7 -5
- package/dist/runtime/host/application-job-queue.js +33 -21
- package/dist/runtime/host/bound-session-relay.js +0 -1
- package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
- package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
- package/dist/runtime/host/entry-actor-runtime.js +2 -2
- package/dist/runtime/host/index.d.ts +106 -37
- package/dist/runtime/host/index.js +303 -151
- package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
- package/dist/runtime/host/location-runtime-owner.js +1 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
- package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
- package/dist/runtime/host/spot-address-transport.d.ts +3 -0
- package/dist/runtime/host/spot-address-transport.js +73 -76
- package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
- package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
- package/dist/runtime/internal-observation.d.ts +1 -0
- package/dist/runtime/internal-observation.js +5 -0
- package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
- package/dist/runtime/locations/actor-location-claims.js +15 -6
- package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
- package/dist/runtime/locations/auto-connect-loop.js +25 -19
- package/dist/runtime/locations/auto-connect-planner.js +2 -5
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
- package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.js +15 -5
- package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
- package/dist/runtime/locations/in-memory-location-store.js +1 -38
- package/dist/runtime/locations/lifecycle.d.ts +1 -1
- package/dist/runtime/locations/lifecycle.js +2 -2
- package/dist/runtime/locations/location-store-repository.d.ts +0 -1
- package/dist/runtime/locations/location-store-repository.js +163 -246
- package/dist/runtime/locations/resolvers.d.ts +8 -1
- package/dist/runtime/locations/resolvers.js +16 -2
- package/dist/runtime/locations/runtime.d.ts +3 -3
- package/dist/runtime/locations/runtime.js +12 -16
- package/dist/runtime/messaging/creation-payload-codec.js +8 -7
- package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
- package/dist/runtime/messaging/framework-json-v1.js +6 -2
- package/dist/runtime/messaging/payload-codec.js +21 -35
- package/dist/runtime/messaging/request-deadline.d.ts +4 -2
- package/dist/runtime/messaging/request-deadline.js +40 -25
- package/dist/runtime/messaging/request-result.d.ts +14 -1
- package/dist/runtime/messaging/request-result.js +74 -13
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
- package/dist/runtime/spots/index.d.ts +28 -7
- package/dist/runtime/spots/index.js +31 -6
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
- package/dist/runtime/spots/spot-activation-registry.js +13 -8
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
- package/dist/runtime/spots/spot-activation-state.js +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
- package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
- package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
- package/dist/runtime/spots/spot-actor-membership.js +3 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
- package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
- package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
- package/dist/runtime/spots/spot-entry-activation.js +7 -12
- package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
- package/dist/runtime/spots/spot-handler-registry.js +31 -15
- package/dist/runtime/spots/spot-manager-public.js +3 -2
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
- package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
- package/dist/runtime/spots/spot-outbound.d.ts +8 -2
- package/dist/runtime/spots/spot-outbound.js +5 -5
- package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
- package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
- package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
- package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
- package/dist/runtime/spots/spot-timer.d.ts +1 -1
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
- package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
- package/dist/runtime/streams/bound-session-service.js +6 -7
- package/dist/runtime/streams/index.d.ts +3 -3
- package/dist/runtime/streams/index.js +22 -2
- package/dist/runtime/streams/managed-stream.js +2 -1
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +3 -9
- package/dist/runtime/streams/session-context.d.ts +2 -2
- package/dist/runtime/streams/session-context.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
- package/dist/runtime/streams/stream-session-runtime.js +64 -33
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActor.ts +6 -0
- package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
- package/src/contracts/Actors/index.ts +1 -0
- package/src/contracts/Common/CoreTypes.ts +1 -0
- package/src/contracts/Common/HandlerMessageType.ts +50 -0
- package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
- package/src/contracts/Common/ZLinkMessage.ts +11 -7
- package/src/contracts/Common/encoded-payload-storage.ts +4 -16
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Common/payload-slab.ts +29 -0
- package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
- package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
- package/src/contracts/Handlers/Contexts.ts +1 -0
- package/src/contracts/Locations/Authority.ts +7 -1
- package/src/internal.ts +17 -0
- package/src/nest-integration.ts +1 -0
- package/src/runtime/actors/actor-client.ts +257 -163
- package/src/runtime/actors/actor-context.ts +26 -14
- package/src/runtime/actors/actor-execution-context.ts +2 -2
- package/src/runtime/actors/actor-handoff.ts +86 -51
- package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
- package/src/runtime/actors/actor-local-native-join.ts +38 -17
- package/src/runtime/actors/actor-mailbox.ts +1 -1
- package/src/runtime/actors/actor-remote-joiner.ts +8 -4
- package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
- package/src/runtime/actors/actor-routed-json-request.ts +3 -0
- package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
- package/src/runtime/actors/actor-runtime-state.ts +1 -1
- package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
- package/src/runtime/admission.ts +42 -15
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
- package/src/runtime/backend/contracts/index.ts +77 -10
- package/src/runtime/backend/mesh-completion-table.ts +106 -15
- package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
- package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
- package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
- package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
- package/src/runtime/backend/raw-binding-port.ts +13 -5
- package/src/runtime/channels/channel-clients.ts +26 -11
- package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
- package/src/runtime/channels/channel-dispatch-services.ts +7 -12
- package/src/runtime/channels/channel-dispatchers.ts +93 -39
- package/src/runtime/channels/channel-envelope.ts +680 -144
- package/src/runtime/channels/channel-multipart.ts +17 -13
- package/src/runtime/channels/channel-outbound-operations.ts +204 -178
- package/src/runtime/channels/channel-receive-loops.ts +160 -107
- package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
- package/src/runtime/channels/channel-runtime-manager.ts +74 -27
- package/src/runtime/channels/channel-socket-registry.ts +20 -5
- package/src/runtime/channels/channel-transports.ts +414 -287
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
- package/src/runtime/channels/local-spot-route-transport.ts +27 -29
- package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
- package/src/runtime/channels/source-spot-router.ts +75 -38
- package/src/runtime/channels/spot-node-route-transport.ts +67 -37
- package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
- package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
- package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
- package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
- package/src/runtime/diagnostics/message-flow-record.ts +295 -0
- package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
- package/src/runtime/diagnostics/message-flow.ts +49 -362
- package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
- package/src/runtime/execution/index.ts +6 -0
- package/src/runtime/execution/serial-execution-queue.ts +94 -96
- package/src/runtime/foundation/durable-service-request.ts +212 -89
- package/src/runtime/foundation/operation-registry.ts +287 -38
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
- package/src/runtime/foundation/request-runtime.ts +227 -0
- package/src/runtime/foundation/service-discovery-registry.ts +7 -0
- package/src/runtime/foundation/service-liveness-registry.ts +1 -1
- package/src/runtime/foundation/service-mailbox.ts +7 -2
- package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
- package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
- package/src/runtime/foundation/service-stateful-registry.ts +52 -19
- package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
- package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
- package/src/runtime/foundation/service-topology-registry.ts +21 -3
- package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
- package/src/runtime/host/actor-packet-relay.ts +160 -156
- package/src/runtime/host/actor-placement-coordinator.ts +1 -1
- package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
- package/src/runtime/host/actor-transfer-runtime.ts +3 -3
- package/src/runtime/host/application-job-queue.ts +56 -27
- package/src/runtime/host/bound-session-relay.ts +0 -1
- package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
- package/src/runtime/host/entry-actor-runtime.ts +14 -6
- package/src/runtime/host/index.ts +388 -113
- package/src/runtime/host/location-runtime-owner.ts +3 -3
- package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
- package/src/runtime/host/spot-address-transport.ts +110 -95
- package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
- package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
- package/src/runtime/internal-observation.ts +2 -0
- package/src/runtime/locations/actor-location-claims.ts +42 -16
- package/src/runtime/locations/auto-connect-loop.ts +24 -16
- package/src/runtime/locations/auto-connect-planner.ts +2 -5
- package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
- package/src/runtime/locations/in-memory-authority-store.ts +27 -7
- package/src/runtime/locations/in-memory-location-store.ts +1 -74
- package/src/runtime/locations/lifecycle.ts +4 -2
- package/src/runtime/locations/location-store-repository.ts +228 -308
- package/src/runtime/locations/resolvers.ts +20 -8
- package/src/runtime/locations/runtime.ts +16 -28
- package/src/runtime/messaging/creation-payload-codec.ts +12 -10
- package/src/runtime/messaging/framework-json-v1.ts +10 -1
- package/src/runtime/messaging/payload-codec.ts +50 -75
- package/src/runtime/messaging/request-deadline.ts +47 -39
- package/src/runtime/messaging/request-result.ts +88 -17
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/index.ts +57 -10
- package/src/runtime/spots/spot-activation-registry.ts +12 -8
- package/src/runtime/spots/spot-activation-state.ts +2 -0
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
- package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
- package/src/runtime/spots/spot-actor-membership.ts +8 -5
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
- package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
- package/src/runtime/spots/spot-entry-activation.ts +25 -35
- package/src/runtime/spots/spot-handler-registry.ts +72 -15
- package/src/runtime/spots/spot-manager-public.ts +4 -2
- package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
- package/src/runtime/spots/spot-outbound.ts +26 -10
- package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
- package/src/runtime/spots/spot-runtime-ports.ts +5 -2
- package/src/runtime/spots/spot-serial-executor.ts +1 -1
- package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
- package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
- package/src/runtime/spots/spot-timer.ts +1 -1
- package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
- package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
- package/src/runtime/streams/bound-session-service.ts +10 -7
- package/src/runtime/streams/index.ts +30 -4
- package/src/runtime/streams/managed-stream.ts +2 -1
- package/src/runtime/streams/session-calls.ts +9 -14
- package/src/runtime/streams/session-context.ts +6 -11
- package/src/runtime/streams/stream-session-runtime.ts +79 -40
- package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
- package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
- package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
|
@@ -5398,7 +5398,7 @@ function writeRelocationControlData(input: RelocationControlData, writer: Writer
|
|
|
5398
5398
|
export function decodeRelocationControlData(bytes: Uint8Array, context: ServiceWireDecoderContext): RelocationControlData { const reader = new Reader(bytes); const value = readRelocationControlData(reader, context, {}, 0); reader.done("relocation-control-data"); return value; }
|
|
5399
5399
|
export function encodeRelocationControlData(value: RelocationControlData, context: ServiceWireDecoderContext): Uint8Array { const writer = new Writer(); writeRelocationControlData(value, writer, context, {}, 0); return writer.result(); }
|
|
5400
5400
|
|
|
5401
|
-
export type RequestSpecificTail = { readonly originalOperationKind: "actorLookup"; readonly terminalResult: "ok"; readonly actor: ActorRef; readonly spotId: Text8; readonly spotGeneration: NonzeroU64; readonly membershipEpoch: NonzeroU64; readonly authorityOwnerGeneration: NonzeroU64 } | { readonly originalOperationKind: "actorJoin"; readonly terminalResult: "ok"; readonly join: ActorJoinReplyTail } | { readonly originalOperationKind: "streamBind"; readonly terminalResult: "ok"; readonly bindingGeneration: NonzeroU64; readonly authorityOwnerGeneration: NonzeroU64 } | { readonly originalOperationKind: "userSpotCreate"; readonly terminalResult: "ok"; readonly createResult: UserSpotCreateResult; readonly spot: SpotRef } | { readonly originalOperationKind: "userSpotClose"; readonly terminalResult: "ok"; readonly closed: Bool8 } | { readonly originalOperationKind: "actorCreate"; readonly terminalResult: "ok"; readonly creation: ActorCreateTerminal } | { readonly originalOperationKind: MeshOperationKind; readonly terminalResult: RequestTerminalResult };
|
|
5401
|
+
export type RequestSpecificTail = { readonly originalOperationKind: "actorLookup"; readonly terminalResult: "ok"; readonly actor: ActorRef; readonly spotId: Text8; readonly spotGeneration: NonzeroU64; readonly membershipEpoch: NonzeroU64; readonly authorityOwnerGeneration: NonzeroU64 } | { readonly originalOperationKind: "actorJoin"; readonly terminalResult: "ok"; readonly join: ActorJoinReplyTail } | { readonly originalOperationKind: "streamBind"; readonly terminalResult: "ok"; readonly bindingGeneration: NonzeroU64; readonly authorityOwnerGeneration: NonzeroU64 } | { readonly originalOperationKind: "streamBind"; readonly terminalResult: "rejected"; readonly rejectionMessage: NonemptyText16 } | { readonly originalOperationKind: "userSpotCreate"; readonly terminalResult: "ok"; readonly createResult: UserSpotCreateResult; readonly spot: SpotRef } | { readonly originalOperationKind: "userSpotClose"; readonly terminalResult: "ok"; readonly closed: Bool8 } | { readonly originalOperationKind: "actorCreate"; readonly terminalResult: "ok"; readonly creation: ActorCreateTerminal } | { readonly originalOperationKind: MeshOperationKind; readonly terminalResult: RequestTerminalResult };
|
|
5402
5402
|
|
|
5403
5403
|
function readRequestSpecificTail(reader: Reader, context: ServiceWireDecoderContext, enclosing: any, flags: number): RequestSpecificTail {
|
|
5404
5404
|
void context; void enclosing; void flags;
|
|
@@ -5433,6 +5433,10 @@ function readRequestSpecificTail(reader: Reader, context: ServiceWireDecoderCont
|
|
|
5433
5433
|
value["authorityOwnerGeneration"] = readNonzeroU64(body, context, value, flags);
|
|
5434
5434
|
|
|
5435
5435
|
|
|
5436
|
+
} else if (same(value["originalOperationKind"], "streamBind") && same(value["terminalResult"], "rejected")) {
|
|
5437
|
+
value["rejectionMessage"] = readNonemptyText16(body, context, value, flags);
|
|
5438
|
+
|
|
5439
|
+
|
|
5436
5440
|
} else if (same(value["originalOperationKind"], "userSpotCreate") && same(value["terminalResult"], "ok")) {
|
|
5437
5441
|
value["createResult"] = readUserSpotCreateResult(body, context, value, flags);
|
|
5438
5442
|
|
|
@@ -5462,7 +5466,7 @@ function writeRequestSpecificTail(input: RequestSpecificTail, writer: Writer, co
|
|
|
5462
5466
|
|
|
5463
5467
|
const body = writer;
|
|
5464
5468
|
if (same(value["originalOperationKind"], "actorLookup") && same(value["terminalResult"], "ok")) {
|
|
5465
|
-
if (value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5469
|
+
if (value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5466
5470
|
if (value["actor"] === undefined) fail("actor required");
|
|
5467
5471
|
|
|
5468
5472
|
|
|
@@ -5484,13 +5488,13 @@ function writeRequestSpecificTail(input: RequestSpecificTail, writer: Writer, co
|
|
|
5484
5488
|
|
|
5485
5489
|
writeNonzeroU64(numeric(value["authorityOwnerGeneration"]), body, context, value, flags);
|
|
5486
5490
|
} else if (same(value["originalOperationKind"], "actorJoin") && same(value["terminalResult"], "ok")) {
|
|
5487
|
-
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5491
|
+
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5488
5492
|
if (value["join"] === undefined) fail("join required");
|
|
5489
5493
|
|
|
5490
5494
|
|
|
5491
5495
|
writeActorJoinReplyTail(value["join"], body, context, value, flags);
|
|
5492
5496
|
} else if (same(value["originalOperationKind"], "streamBind") && same(value["terminalResult"], "ok")) {
|
|
5493
|
-
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["join"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5497
|
+
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["join"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5494
5498
|
if (value["bindingGeneration"] === undefined) fail("bindingGeneration required");
|
|
5495
5499
|
|
|
5496
5500
|
|
|
@@ -5499,8 +5503,14 @@ function writeRequestSpecificTail(input: RequestSpecificTail, writer: Writer, co
|
|
|
5499
5503
|
|
|
5500
5504
|
|
|
5501
5505
|
writeNonzeroU64(numeric(value["authorityOwnerGeneration"]), body, context, value, flags);
|
|
5506
|
+
} else if (same(value["originalOperationKind"], "streamBind") && same(value["terminalResult"], "rejected")) {
|
|
5507
|
+
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5508
|
+
if (value["rejectionMessage"] === undefined) fail("rejectionMessage required");
|
|
5509
|
+
|
|
5510
|
+
|
|
5511
|
+
writeNonemptyText16(value["rejectionMessage"], body, context, value, flags);
|
|
5502
5512
|
} else if (same(value["originalOperationKind"], "userSpotCreate") && same(value["terminalResult"], "ok")) {
|
|
5503
|
-
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5513
|
+
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5504
5514
|
if (value["createResult"] === undefined) fail("createResult required");
|
|
5505
5515
|
|
|
5506
5516
|
|
|
@@ -5510,19 +5520,19 @@ function writeRequestSpecificTail(input: RequestSpecificTail, writer: Writer, co
|
|
|
5510
5520
|
|
|
5511
5521
|
writeSpotRef(value["spot"], body, context, value, flags);
|
|
5512
5522
|
} else if (same(value["originalOperationKind"], "userSpotClose") && same(value["terminalResult"], "ok")) {
|
|
5513
|
-
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5523
|
+
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5514
5524
|
if (value["closed"] === undefined) fail("closed required");
|
|
5515
5525
|
|
|
5516
5526
|
|
|
5517
5527
|
writeBool8(value["closed"], body, context, value, flags);
|
|
5518
5528
|
} else if (same(value["originalOperationKind"], "actorCreate") && same(value["terminalResult"], "ok")) {
|
|
5519
|
-
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5529
|
+
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5520
5530
|
if (value["creation"] === undefined) fail("creation required");
|
|
5521
5531
|
|
|
5522
5532
|
|
|
5523
5533
|
writeActorCreateTerminal(value["creation"], body, context, value, flags);
|
|
5524
5534
|
} else {
|
|
5525
|
-
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5535
|
+
if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
|
|
5526
5536
|
|
|
5527
5537
|
}
|
|
5528
5538
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// <auto-generated> DO NOT EDIT. schema-sha256:
|
|
1
|
+
// <auto-generated> DO NOT EDIT. schema-sha256: 1a066261b5770782bf4027d3d08723669d4092a085699963afb214872f27d710
|
|
2
2
|
export interface ServiceWireRouteFence { readonly id: string; readonly generation: bigint; readonly targetNodeRid: Uint8Array; readonly targetNodeGeneration: bigint; readonly expectedAuthorityOwnerGeneration: bigint; readonly expectedOwnerLeaseGeneration: bigint; }
|
|
3
3
|
export interface ApplicationPayloadEnvelopeV1 { readonly packetName: string; readonly contentType: string; readonly payload: Uint8Array; }
|
|
4
4
|
export interface ActorJoin28 { readonly correlation: bigint; readonly actor: ServiceWireRouteFence; readonly entry: boolean; readonly targetSpot: ServiceWireRouteFence; readonly payload?: ApplicationPayloadEnvelopeV1; }
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { inspectRuntime } from '../internal-observation';
|
|
2
|
+
import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
|
|
1
3
|
import { encodeActorReply } from '../actors/actor-reply';
|
|
2
4
|
import { boundSessionErrorPayload } from '../streams/bound-session-response-target';
|
|
3
5
|
import { RELOCATED_REQUEST_OWNED_BY_REQUESTER } from '../actors/actor-handoff';
|
|
@@ -164,6 +166,7 @@ export {
|
|
|
164
166
|
export { ZLinkPublicSpotManager, type ZLinkPublicSpotManagerOptions } from './spot-manager-public';
|
|
165
167
|
|
|
166
168
|
export interface ZLinkSpotManagerOptions {
|
|
169
|
+
readonly defaultRequestTimeoutMs?: number;
|
|
167
170
|
readonly spotFactories: readonly Type<ZLinkSpot>[];
|
|
168
171
|
readonly instanceSpotFactories?: ReadonlyMap<
|
|
169
172
|
string,
|
|
@@ -334,15 +337,23 @@ interface ZLinkTargetSpotCloseOperation {
|
|
|
334
337
|
}
|
|
335
338
|
|
|
336
339
|
export class DefaultZLinkSpotManager {
|
|
340
|
+
[inspectRuntime]() {
|
|
341
|
+
return Object.freeze({
|
|
342
|
+
activeActivationCount: this.activations.activeActivations().length,
|
|
343
|
+
hasCloseableActivation: (meshName: string, spotId: RoutingId) =>
|
|
344
|
+
this.activations.activationForClose(meshName, spotId) !== undefined
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
|
|
337
348
|
private readonly factories: ReadonlySet<Type<ZLinkSpot>>;
|
|
338
|
-
|
|
349
|
+
readonly activations: ZLinkSpotActivationRegistry;
|
|
339
350
|
private readonly workerRuntime: ZLinkWorkerRuntime;
|
|
340
351
|
private readonly locationClaim: ZLinkSpotLocationClaim;
|
|
341
352
|
private readonly routedSpotPackets: ZLinkRoutedSpotPacketDispatch;
|
|
342
353
|
private readonly actorMembership: ZLinkSpotActorMembership;
|
|
343
354
|
private readonly activationLifecycle: ZLinkSpotActivationLifecycle;
|
|
344
355
|
private readonly formalRemoteTransfers = new ZLinkFormalRemoteActorTransferRegistry();
|
|
345
|
-
|
|
356
|
+
readonly formalRemoteActorAdmissions = new ZLinkFormalRemoteActorAdmissionRegistry();
|
|
346
357
|
private readonly pendingInstanceMaterializations = new Map<
|
|
347
358
|
string,
|
|
348
359
|
Promise<ZLinkSpotActivation>
|
|
@@ -354,7 +365,7 @@ export class DefaultZLinkSpotManager {
|
|
|
354
365
|
string,
|
|
355
366
|
Map<string, Promise<ZLinkSpotActivation>>
|
|
356
367
|
>();
|
|
357
|
-
|
|
368
|
+
readonly closeOperations = new Map<string, ZLinkTargetSpotCloseOperation>();
|
|
358
369
|
private readonly pendingInstanceTerminals = new Map<string, number>();
|
|
359
370
|
private readonly pendingInstanceTerminalGenerations = new Map<string, Map<string, number>>();
|
|
360
371
|
private readonly deferredInstanceAuthorityReleases = new Map<string, Set<bigint>>();
|
|
@@ -1159,14 +1170,15 @@ export class DefaultZLinkSpotManager {
|
|
|
1159
1170
|
beginAuthority: (
|
|
1160
1171
|
onCommitted: () => void
|
|
1161
1172
|
) => Promise<import('../locations/spot-location-claims').ZLinkInstanceClosingAuthority>,
|
|
1162
|
-
signal?: AbortSignal
|
|
1173
|
+
signal?: AbortSignal,
|
|
1174
|
+
deadline?: Date
|
|
1163
1175
|
): Promise<boolean> {
|
|
1164
1176
|
return await this.closeWithReason(
|
|
1165
1177
|
meshName,
|
|
1166
1178
|
spotId,
|
|
1167
1179
|
signal,
|
|
1168
1180
|
ZLinkSpotCloseReason.ExplicitClose,
|
|
1169
|
-
|
|
1181
|
+
deadline,
|
|
1170
1182
|
beginAuthority
|
|
1171
1183
|
);
|
|
1172
1184
|
}
|
|
@@ -1222,6 +1234,11 @@ export class DefaultZLinkSpotManager {
|
|
|
1222
1234
|
>,
|
|
1223
1235
|
contextActivation?: ZLinkSpotActivation
|
|
1224
1236
|
): Promise<boolean> {
|
|
1237
|
+
if (reason === ZLinkSpotCloseReason.ExplicitClose) {
|
|
1238
|
+
deadline ??= new Date(
|
|
1239
|
+
Date.now() + (this.options.defaultRequestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS)
|
|
1240
|
+
);
|
|
1241
|
+
}
|
|
1225
1242
|
requireMeshName(meshName);
|
|
1226
1243
|
const key = `${meshName}\0${String(spotId)}`;
|
|
1227
1244
|
let operation = this.closeOperations.get(key);
|
|
@@ -1590,7 +1607,9 @@ export class DefaultZLinkSpotManager {
|
|
|
1590
1607
|
parts: readonly Message[],
|
|
1591
1608
|
returnResponse = false,
|
|
1592
1609
|
remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget,
|
|
1593
|
-
fallbackActorRef?: ActorRef
|
|
1610
|
+
fallbackActorRef?: ActorRef,
|
|
1611
|
+
requestTerminal?: (response: unknown) => Promise<void> | void,
|
|
1612
|
+
messageFollowOrigin?: ZLinkMessageFollowOrigin
|
|
1594
1613
|
): Promise<unknown> {
|
|
1595
1614
|
const activation = this.activations.resolveUnique(spotId);
|
|
1596
1615
|
if (activation === undefined) {
|
|
@@ -1603,7 +1622,9 @@ export class DefaultZLinkSpotManager {
|
|
|
1603
1622
|
parts,
|
|
1604
1623
|
returnResponse,
|
|
1605
1624
|
remoteBoundSessionTarget,
|
|
1606
|
-
fallbackActorRef
|
|
1625
|
+
fallbackActorRef,
|
|
1626
|
+
requestTerminal,
|
|
1627
|
+
messageFollowOrigin
|
|
1607
1628
|
);
|
|
1608
1629
|
}
|
|
1609
1630
|
|
|
@@ -1663,6 +1684,30 @@ export class DefaultZLinkSpotManager {
|
|
|
1663
1684
|
return this.admitRoutedActorPacketPrefix(owner.spotId, actorId, records);
|
|
1664
1685
|
}
|
|
1665
1686
|
|
|
1687
|
+
/** Runs an owner-side lifecycle decision in the Actor's existing execution gate. */
|
|
1688
|
+
executeActorTurn<T>(
|
|
1689
|
+
meshName: string,
|
|
1690
|
+
spotId: RoutingId | undefined,
|
|
1691
|
+
actorId: string,
|
|
1692
|
+
operation: () => Promise<T>
|
|
1693
|
+
): Promise<T> {
|
|
1694
|
+
if (spotId === undefined) {
|
|
1695
|
+
if (this.options.executeEntryActor === undefined) {
|
|
1696
|
+
throw new ZLinkConfigurationException(
|
|
1697
|
+
`Entry Spot Actor '${actorId}' has no execution gate for MeshNode '${meshName}'.`
|
|
1698
|
+
);
|
|
1699
|
+
}
|
|
1700
|
+
return this.options.executeEntryActor(meshName, actorId, operation);
|
|
1701
|
+
}
|
|
1702
|
+
const activation = this.resolveApplicationActivation(spotId, meshName);
|
|
1703
|
+
if (activation === undefined) {
|
|
1704
|
+
throw new ZLinkConfigurationException(
|
|
1705
|
+
`Actor '${actorId}' has no active Spot execution gate for '${String(spotId)}'.`
|
|
1706
|
+
);
|
|
1707
|
+
}
|
|
1708
|
+
return activation.executeActor(actorId, operation);
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1666
1711
|
async dispatchRoutedSpotSend(
|
|
1667
1712
|
spotId: RoutingId,
|
|
1668
1713
|
packetName: string | undefined,
|
|
@@ -1735,7 +1780,8 @@ export class DefaultZLinkSpotManager {
|
|
|
1735
1780
|
this.options.messageSerializers === undefined
|
|
1736
1781
|
? undefined
|
|
1737
1782
|
: { serializers: this.options.messageSerializers };
|
|
1738
|
-
const decodePayload = () =>
|
|
1783
|
+
const decodePayload = (messageType?: Type) =>
|
|
1784
|
+
decodeChannelPayload(envelope, codecs, messageType);
|
|
1739
1785
|
const context = {
|
|
1740
1786
|
channelName: envelope.header.channelName,
|
|
1741
1787
|
contentType: envelope.header.contentType,
|
|
@@ -1857,7 +1903,8 @@ export class DefaultZLinkSpotManager {
|
|
|
1857
1903
|
this.options.messageSerializers === undefined
|
|
1858
1904
|
? undefined
|
|
1859
1905
|
: { serializers: this.options.messageSerializers };
|
|
1860
|
-
const decodePayload = () =>
|
|
1906
|
+
const decodePayload = (messageType?: Type) =>
|
|
1907
|
+
decodeChannelPayload(envelope, codecs, messageType);
|
|
1861
1908
|
const context = {
|
|
1862
1909
|
channelName: envelope.header.channelName,
|
|
1863
1910
|
contentType: envelope.header.contentType,
|
|
@@ -2231,7 +2278,7 @@ export class DefaultZLinkSpotManager {
|
|
|
2231
2278
|
}
|
|
2232
2279
|
}
|
|
2233
2280
|
|
|
2234
|
-
|
|
2281
|
+
async dispatchMeshActorJoinCore(
|
|
2235
2282
|
meshName: string,
|
|
2236
2283
|
owner: ReadyRecord,
|
|
2237
2284
|
record: ReceiveRecord,
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
createInternalFrameworkException
|
|
14
14
|
} from '../framework-errors-internal';
|
|
15
15
|
import type { ZLinkSpotActivation } from './spot-activation-state';
|
|
16
|
-
import { ZLinkSpotLifecycleMetrics } from './spot-lifecycle-metrics';
|
|
17
16
|
import type { ZLinkLocalSpotCreateResult } from './spot-manager-internal-contracts';
|
|
18
17
|
const DEFAULT_ACTIVE_ACTIVATION_BATCH_SIZE = 64;
|
|
19
18
|
|
|
@@ -44,11 +43,12 @@ export class ZLinkSpotActivationRegistry {
|
|
|
44
43
|
private readonly closing = new Map<string, ZLinkSpotCloseOperation>();
|
|
45
44
|
private readonly failedClose = new Set<string>();
|
|
46
45
|
private readonly emptyWaiters = new Set<() => void>();
|
|
47
|
-
private readonly lifecycleMetrics: ZLinkSpotLifecycleMetrics;
|
|
48
46
|
private activeScan: Iterator<ZLinkSpotActivation> | undefined;
|
|
49
47
|
|
|
50
|
-
constructor(metrics?: import('../diagnostics').ZLinkRuntimeMetrics) {
|
|
51
|
-
|
|
48
|
+
constructor(private readonly metrics?: import('../diagnostics').ZLinkRuntimeMetrics) {}
|
|
49
|
+
|
|
50
|
+
private recordPopulation(activation: ZLinkSpotActivation, delta: number): void {
|
|
51
|
+
this.metrics?.recordSpotCount(activation.meshName, activation.domain.kind, delta);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
allocateSpotId(meshName: string): RoutingId {
|
|
@@ -99,7 +99,11 @@ export class ZLinkSpotActivationRegistry {
|
|
|
99
99
|
|
|
100
100
|
finishClose(meshName: string, spotId: RoutingId): void {
|
|
101
101
|
const key = spotActivationKey(meshName, spotId);
|
|
102
|
-
|
|
102
|
+
const activation = this.activations.get(key);
|
|
103
|
+
if (activation !== undefined) {
|
|
104
|
+
this.activations.delete(key);
|
|
105
|
+
this.recordPopulation(activation, -1);
|
|
106
|
+
}
|
|
103
107
|
this.staged.delete(key);
|
|
104
108
|
this.failedClose.delete(key);
|
|
105
109
|
this.resolveEmptyWaiters();
|
|
@@ -172,7 +176,7 @@ export class ZLinkSpotActivationRegistry {
|
|
|
172
176
|
}
|
|
173
177
|
if (existing === undefined) {
|
|
174
178
|
this.activations.set(key, activation);
|
|
175
|
-
this.
|
|
179
|
+
this.recordPopulation(activation, 1);
|
|
176
180
|
}
|
|
177
181
|
return this.staged.has(key) ? undefined : activation;
|
|
178
182
|
}
|
|
@@ -197,7 +201,7 @@ export class ZLinkSpotActivationRegistry {
|
|
|
197
201
|
this.activations.delete(key);
|
|
198
202
|
this.staged.delete(key);
|
|
199
203
|
this.failedClose.delete(key);
|
|
200
|
-
this.
|
|
204
|
+
this.recordPopulation(activation, -1);
|
|
201
205
|
this.resolveEmptyWaiters();
|
|
202
206
|
return activation;
|
|
203
207
|
}
|
|
@@ -240,7 +244,7 @@ export class ZLinkSpotActivationRegistry {
|
|
|
240
244
|
if (completed || resourcesReleased(activation)) {
|
|
241
245
|
this.activations.delete(key);
|
|
242
246
|
this.staged.delete(key);
|
|
243
|
-
this.
|
|
247
|
+
this.recordPopulation(activation, -1);
|
|
244
248
|
this.failedClose.delete(key);
|
|
245
249
|
} else {
|
|
246
250
|
this.failedClose.add(key);
|
|
@@ -19,6 +19,7 @@ import { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
|
|
|
19
19
|
import { ZLinkSpotSerialExecutor, type ZLinkActorPacketTurnDispatch } from './spot-serial-executor';
|
|
20
20
|
import type { ZLinkSpotTimerRegistry } from './spot-timer';
|
|
21
21
|
import type { ZLinkSpotActorJoinDispatch } from './spot-actor-join-dispatch';
|
|
22
|
+
import type { ZLinkSpotActorPacketDispatch } from './spot-actor-packet-dispatch';
|
|
22
23
|
import { ZLinkExecutionBarrier, type ZLinkExecutionBarrierSeal } from '../execution';
|
|
23
24
|
import type { ZLinkTimerRelocationState } from './spot-timer';
|
|
24
25
|
|
|
@@ -71,6 +72,7 @@ export class ZLinkSpotActivation {
|
|
|
71
72
|
readonly nativeSpot?: ZLinkBackendSpot;
|
|
72
73
|
readonly executionBarrier: ZLinkExecutionBarrier;
|
|
73
74
|
actorDispatch?: ZLinkSpotActorJoinDispatch;
|
|
75
|
+
actorPacketDispatch?: ZLinkSpotActorPacketDispatch;
|
|
74
76
|
|
|
75
77
|
private readonly joinedActors = new Map<string, ZLinkActor>();
|
|
76
78
|
private readonly departedActorIds = new Set<string>();
|
|
@@ -16,6 +16,7 @@ import { routingIdsEqual } from '../routing-id';
|
|
|
16
16
|
import type { ZLinkSpotActivationLifecycleOptions } from './spot-activation';
|
|
17
17
|
import { ZLinkSpotActivation } from './spot-activation-state';
|
|
18
18
|
import { ZLinkSpotActorJoinDispatch } from './spot-actor-join-dispatch';
|
|
19
|
+
import type { ZLinkActorPacketExecution } from './spot-actor-packet-dispatch';
|
|
19
20
|
import { ZLinkSpotActorPacketDispatch } from './spot-actor-packet-dispatch';
|
|
20
21
|
import type { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
|
|
21
22
|
|
|
@@ -51,26 +52,23 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
51
52
|
requestTerminal?: (response: unknown) => Promise<void> | void,
|
|
52
53
|
messageFollowOrigin?: ZLinkMessageFollowOrigin
|
|
53
54
|
): Promise<unknown> {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
remoteBoundSessionTarget,
|
|
72
|
-
fallbackActorRef,
|
|
73
|
-
requestTerminal
|
|
55
|
+
return dispatchActorPacketInMailbox<ZLinkSpotSerialTurnExecutor>(
|
|
56
|
+
(operation) => activation.executeActor(actorId, operation),
|
|
57
|
+
(serial) =>
|
|
58
|
+
this.actorPacketDispatch(activation).admitDelivery(
|
|
59
|
+
serial,
|
|
60
|
+
{
|
|
61
|
+
origin,
|
|
62
|
+
actorId,
|
|
63
|
+
parts,
|
|
64
|
+
returnResponse,
|
|
65
|
+
remoteBoundSessionTarget,
|
|
66
|
+
fallbackActorRef,
|
|
67
|
+
requestTerminal,
|
|
68
|
+
messageFollowOrigin
|
|
69
|
+
},
|
|
70
|
+
this.options.actorHandoffRuntime
|
|
71
|
+
)
|
|
74
72
|
);
|
|
75
73
|
}
|
|
76
74
|
|
|
@@ -87,7 +85,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
87
85
|
),
|
|
88
86
|
serial: activation.serial,
|
|
89
87
|
actors: {
|
|
90
|
-
resolveActor: (actorId) => this.
|
|
88
|
+
resolveActor: (actorId) => this.resolveLifecycleActor(activation, actorId),
|
|
91
89
|
getTarget: () => activation.spot,
|
|
92
90
|
defaultAccept: false,
|
|
93
91
|
transfer:
|
|
@@ -110,7 +108,9 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
110
108
|
delivery.parts,
|
|
111
109
|
delivery.returnResponse,
|
|
112
110
|
delivery.remoteBoundSessionTarget,
|
|
113
|
-
delivery.fallbackActorRef
|
|
111
|
+
delivery.fallbackActorRef,
|
|
112
|
+
delivery.requestTerminal,
|
|
113
|
+
delivery.messageFollowOrigin
|
|
114
114
|
),
|
|
115
115
|
bindRemoteSession: (actor, sourceNodeRid, sourceSessionRid) => {
|
|
116
116
|
const node = this.options.nativeSpotNodeProvider?.(activation.meshName);
|
|
@@ -202,13 +202,30 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
202
202
|
fallbackActorRef?: ActorRef,
|
|
203
203
|
requestTerminal?: (response: unknown) => Promise<void> | void
|
|
204
204
|
): Promise<unknown> {
|
|
205
|
-
return
|
|
205
|
+
return this.actorPacketDispatch(activation).dispatch(
|
|
206
|
+
actorSerial,
|
|
207
|
+
origin,
|
|
208
|
+
actorId,
|
|
209
|
+
parts,
|
|
210
|
+
returnResponse,
|
|
211
|
+
remoteBoundSessionTarget,
|
|
212
|
+
fallbackActorRef,
|
|
213
|
+
requestTerminal
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
private actorPacketDispatch(activation: ZLinkSpotActivation): ZLinkSpotActorPacketDispatch {
|
|
218
|
+
if (activation.actorPacketDispatch !== undefined) return activation.actorPacketDispatch;
|
|
219
|
+
activation.actorPacketDispatch = new ZLinkSpotActorPacketDispatch({
|
|
220
|
+
admission: this.options.admission,
|
|
206
221
|
spot: activation.spot,
|
|
207
222
|
spotId: () => String(activation.spotId),
|
|
208
223
|
registry: activation.actorHandlers,
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
224
|
+
resolveActor: (targetActorId) =>
|
|
225
|
+
this.options.actorResolver === undefined
|
|
226
|
+
? activation.resolveJoinedActor(targetActorId)
|
|
227
|
+
: this.options.actorResolver(targetActorId),
|
|
228
|
+
hasDepartedActor: (targetActorId) => activation.hasDepartedActor(targetActorId),
|
|
212
229
|
onDisconnectActor: (actor) =>
|
|
213
230
|
activation.serial.execute(() => activation.spot.onDisconnectActor?.(actor)),
|
|
214
231
|
actorResponseSender: this.options.boundSessionRuntime?.sendActorResponse.bind(
|
|
@@ -221,18 +238,15 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
221
238
|
messageSerializers: this.options.messageSerializers,
|
|
222
239
|
dispatchErrors: this.options.dispatchErrors,
|
|
223
240
|
routeToActorJoinPrewarm: this.options.routeToActorJoinPrewarm
|
|
224
|
-
})
|
|
225
|
-
|
|
226
|
-
actorId,
|
|
227
|
-
parts,
|
|
228
|
-
returnResponse,
|
|
229
|
-
remoteBoundSessionTarget,
|
|
230
|
-
fallbackActorRef,
|
|
231
|
-
requestTerminal
|
|
232
|
-
);
|
|
241
|
+
});
|
|
242
|
+
return activation.actorPacketDispatch;
|
|
233
243
|
}
|
|
234
244
|
|
|
235
|
-
|
|
245
|
+
/** Resolves native lifecycle records; messages use resolveActorIngress. */
|
|
246
|
+
private resolveLifecycleActor(
|
|
247
|
+
activation: ZLinkSpotActivation,
|
|
248
|
+
actorId: string
|
|
249
|
+
): ZLinkActor | undefined {
|
|
236
250
|
if (activation.hasDepartedActor(actorId)) return undefined;
|
|
237
251
|
// The manager owns relocation visibility. Membership alone cannot publish
|
|
238
252
|
// a staged Actor; resolver absence supports standalone Spot runtimes.
|
|
@@ -241,7 +255,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
|
|
|
241
255
|
: this.options.actorResolver(actorId);
|
|
242
256
|
}
|
|
243
257
|
|
|
244
|
-
|
|
258
|
+
async commitTransferredActorTransaction(
|
|
245
259
|
activation: ZLinkSpotActivation,
|
|
246
260
|
actor: ZLinkActor,
|
|
247
261
|
backlog: readonly ZLinkActorHandoffPacket[],
|
|
@@ -315,3 +329,14 @@ function requireBackendValueFactory<T>(factory: (() => T) | undefined, valueName
|
|
|
315
329
|
return factory();
|
|
316
330
|
};
|
|
317
331
|
}
|
|
332
|
+
|
|
333
|
+
/** Releases the Actor FIFO before awaiting a transferred admission terminal. */
|
|
334
|
+
export async function dispatchActorPacketInMailbox<TSerial>(
|
|
335
|
+
enqueue: (
|
|
336
|
+
operation: (serial: TSerial) => Promise<ZLinkActorPacketExecution>
|
|
337
|
+
) => Promise<ZLinkActorPacketExecution>,
|
|
338
|
+
dispatch: (serial: TSerial) => Promise<ZLinkActorPacketExecution>
|
|
339
|
+
): Promise<unknown> {
|
|
340
|
+
const result = await enqueue(dispatch);
|
|
341
|
+
return 'terminal' in result ? await result.terminal : result.response;
|
|
342
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { actorMessageFollowContext } from '../actors/actor-message-follow-context';
|
|
2
|
+
import type { ActorRef, ZLinkActor } from '../../contracts';
|
|
3
|
+
import type { Message } from '../../contracts/Common/Message';
|
|
4
|
+
import type {
|
|
5
|
+
ZLinkActorPacketDelivery,
|
|
6
|
+
ZLinkActorRequestTerminal
|
|
7
|
+
} from './spot-actor-packet-dispatch';
|
|
8
|
+
import type { ZLinkRemoteBoundSessionTarget } from '../actors';
|
|
9
|
+
import type { ApplicationJobOrigin } from '../application-jobs/contracts';
|
|
10
|
+
import type { ZLinkSpotActorHandoffRuntime } from './spot-runtime-ports';
|
|
11
|
+
import {
|
|
12
|
+
ZLinkFrameworkInternalErrorKind,
|
|
13
|
+
createInternalFrameworkException
|
|
14
|
+
} from '../framework-errors-internal';
|
|
15
|
+
|
|
16
|
+
/** Parks an exact Actor incarnation while its accepted Join prepares the target. */
|
|
17
|
+
export type ZLinkRouteToActorJoinPrewarm = (
|
|
18
|
+
actorId: string,
|
|
19
|
+
objectGeneration: bigint,
|
|
20
|
+
arrival: {
|
|
21
|
+
readonly origin: ApplicationJobOrigin;
|
|
22
|
+
readonly header: Buffer;
|
|
23
|
+
readonly payload: Buffer;
|
|
24
|
+
readonly returnResponse: boolean;
|
|
25
|
+
readonly remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget;
|
|
26
|
+
readonly fallbackActorRef?: ActorRef;
|
|
27
|
+
readonly requestTerminal?: ZLinkActorRequestTerminal;
|
|
28
|
+
readonly resolve: (value: unknown) => void;
|
|
29
|
+
readonly reject: (reason: unknown) => void;
|
|
30
|
+
}
|
|
31
|
+
) => 'parked' | 'not-found';
|
|
32
|
+
|
|
33
|
+
export type ZLinkActorIngressRoute = (
|
|
34
|
+
delivery: ZLinkActorPacketDelivery
|
|
35
|
+
) => { readonly handled: boolean; readonly response?: unknown } | undefined;
|
|
36
|
+
|
|
37
|
+
export type ZLinkActorIngressAdmission =
|
|
38
|
+
| { readonly kind: 'local'; readonly actor: ZLinkActor }
|
|
39
|
+
| { readonly kind: 'follow' | 'prewarm'; readonly terminal: Promise<unknown> }
|
|
40
|
+
| { readonly kind: 'stale'; readonly error: ReturnType<typeof createInternalFrameworkException> };
|
|
41
|
+
|
|
42
|
+
/** Fixes one packet owner synchronously at the Actor FIFO head. */
|
|
43
|
+
export function resolveActorIngress(
|
|
44
|
+
delivery: ZLinkActorPacketDelivery,
|
|
45
|
+
request: boolean,
|
|
46
|
+
options: {
|
|
47
|
+
readonly handoffRuntime?: ZLinkSpotActorHandoffRuntime;
|
|
48
|
+
readonly routeBeforeLocal?: ZLinkActorIngressRoute;
|
|
49
|
+
readonly resolveActor: (actorId: string) => ZLinkActor | undefined;
|
|
50
|
+
readonly hasDepartedActor?: (actorId: string) => boolean;
|
|
51
|
+
readonly routeToActorJoinPrewarm?: ZLinkRouteToActorJoinPrewarm;
|
|
52
|
+
}
|
|
53
|
+
): ZLinkActorIngressAdmission {
|
|
54
|
+
const handoff = options.handoffRuntime?.capture(
|
|
55
|
+
delivery.origin,
|
|
56
|
+
delivery.actorId,
|
|
57
|
+
delivery.parts,
|
|
58
|
+
delivery.returnResponse,
|
|
59
|
+
delivery.remoteBoundSessionTarget,
|
|
60
|
+
delivery.fallbackActorRef,
|
|
61
|
+
undefined,
|
|
62
|
+
delivery.messageFollowOrigin
|
|
63
|
+
);
|
|
64
|
+
if (handoff !== undefined) return { kind: 'follow', terminal: handoff };
|
|
65
|
+
const route = options.routeBeforeLocal?.(delivery);
|
|
66
|
+
if (route?.handled === true) return { kind: 'follow', terminal: Promise.resolve(route.response) };
|
|
67
|
+
const actor =
|
|
68
|
+
options.hasDepartedActor?.(delivery.actorId) === true
|
|
69
|
+
? undefined
|
|
70
|
+
: options.resolveActor(delivery.actorId);
|
|
71
|
+
if (actor !== undefined) return { kind: 'local', actor };
|
|
72
|
+
if (
|
|
73
|
+
options.routeToActorJoinPrewarm !== undefined &&
|
|
74
|
+
delivery.fallbackActorRef !== undefined &&
|
|
75
|
+
(!request || delivery.returnResponse || delivery.requestTerminal !== undefined)
|
|
76
|
+
) {
|
|
77
|
+
const parked = parkForActorJoinPrewarm(
|
|
78
|
+
delivery.origin,
|
|
79
|
+
options.routeToActorJoinPrewarm,
|
|
80
|
+
delivery.actorId,
|
|
81
|
+
delivery.parts,
|
|
82
|
+
request,
|
|
83
|
+
delivery.returnResponse,
|
|
84
|
+
delivery.remoteBoundSessionTarget,
|
|
85
|
+
delivery.fallbackActorRef,
|
|
86
|
+
delivery.requestTerminal
|
|
87
|
+
);
|
|
88
|
+
if (parked !== undefined) return { kind: 'prewarm', terminal: parked };
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
kind: 'stale',
|
|
92
|
+
error: createInternalFrameworkException(
|
|
93
|
+
actorMessageFollowContext(delivery.fallbackActorRef) === undefined
|
|
94
|
+
? ZLinkFrameworkInternalErrorKind.ActorRouteNotFound
|
|
95
|
+
: ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
96
|
+
`SPOT actor is not registered locally: ${delivery.actorId}`
|
|
97
|
+
)
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function parkForActorJoinPrewarm(
|
|
102
|
+
origin: ApplicationJobOrigin,
|
|
103
|
+
routeToActorJoinPrewarm: ZLinkRouteToActorJoinPrewarm,
|
|
104
|
+
actorId: string,
|
|
105
|
+
parts: readonly Message[],
|
|
106
|
+
isRequest: boolean,
|
|
107
|
+
returnResponse: boolean,
|
|
108
|
+
remoteBoundSessionTarget: ZLinkRemoteBoundSessionTarget | undefined,
|
|
109
|
+
fallbackActorRef: ActorRef,
|
|
110
|
+
requestTerminal: ZLinkActorRequestTerminal | undefined
|
|
111
|
+
): Promise<unknown> | undefined {
|
|
112
|
+
let resolve: (value: unknown) => void = () => undefined;
|
|
113
|
+
let reject: (reason: unknown) => void = () => undefined;
|
|
114
|
+
const result = new Promise<unknown>((res, rej) => {
|
|
115
|
+
resolve = res;
|
|
116
|
+
reject = rej;
|
|
117
|
+
});
|
|
118
|
+
// A Request's real reply must still travel through the exact mailbox
|
|
119
|
+
// correlation the original caller captured in `requestTerminal` — not
|
|
120
|
+
// through this method's own return value, which the caller only uses
|
|
121
|
+
// to decide whether it still owes a reply itself. Wrapping keeps that
|
|
122
|
+
// reply route intact across the (possibly much later) redelivery at
|
|
123
|
+
// migration time while also releasing the original caller once the
|
|
124
|
+
// real reply has gone out, so it never sends a premature empty one.
|
|
125
|
+
const wrappedRequestTerminal: ZLinkActorRequestTerminal | undefined =
|
|
126
|
+
requestTerminal === undefined
|
|
127
|
+
? undefined
|
|
128
|
+
: Object.assign(
|
|
129
|
+
async (response: unknown, preparedReply?: unknown) => {
|
|
130
|
+
try {
|
|
131
|
+
await requestTerminal(response, preparedReply);
|
|
132
|
+
resolve(undefined);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
reject(error);
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
{ prepare: requestTerminal.prepare }
|
|
139
|
+
);
|
|
140
|
+
const route = routeToActorJoinPrewarm(actorId, fallbackActorRef.objectGeneration, {
|
|
141
|
+
origin,
|
|
142
|
+
header: Buffer.from(parts[0].data()),
|
|
143
|
+
payload: Buffer.from(parts[1].data()),
|
|
144
|
+
returnResponse,
|
|
145
|
+
remoteBoundSessionTarget,
|
|
146
|
+
fallbackActorRef,
|
|
147
|
+
requestTerminal: wrappedRequestTerminal,
|
|
148
|
+
resolve,
|
|
149
|
+
reject
|
|
150
|
+
});
|
|
151
|
+
if (route !== 'parked') return undefined;
|
|
152
|
+
// A Send has no reply to wait for: the migrated redelivery still runs
|
|
153
|
+
// in order later, but this caller's own await is done once parking is
|
|
154
|
+
// confirmed.
|
|
155
|
+
if (!isRequest) resolve(undefined);
|
|
156
|
+
return result;
|
|
157
|
+
}
|