@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
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
ZLinkRuntimeDispatchErrorAction,
|
|
18
18
|
ZLinkRuntimeDispatchErrorReason
|
|
19
19
|
} from '../../contracts/Dispatch/ZLinkDispatchOptions';
|
|
20
|
-
import { throwIfAborted } from '../abort';
|
|
20
|
+
import { awaitWithAbort, throwIfAborted } from '../abort';
|
|
21
21
|
import { ZLINK_ACTOR_JOIN_ENTRY_SPOT_RUNTIME, ZLinkSpotActorDispatcher } from '../actors';
|
|
22
22
|
import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
|
|
23
23
|
import { ZLinkDispatchErrorReporter } from '../channels';
|
|
@@ -124,8 +124,10 @@ export class ZLinkSpotActorMembership {
|
|
|
124
124
|
): Promise<void> {
|
|
125
125
|
throwIfAborted(signal);
|
|
126
126
|
const activation = this.requireActivation(spotId, meshName);
|
|
127
|
-
await this.runLifecycleOperation(
|
|
128
|
-
|
|
127
|
+
await this.runLifecycleOperation(
|
|
128
|
+
activation,
|
|
129
|
+
() => this.leaveActorCore(activation, actor, undefined, meshName),
|
|
130
|
+
signal
|
|
129
131
|
);
|
|
130
132
|
}
|
|
131
133
|
|
|
@@ -261,9 +263,10 @@ export class ZLinkSpotActorMembership {
|
|
|
261
263
|
|
|
262
264
|
private async runLifecycleOperation<T>(
|
|
263
265
|
activation: ZLinkSpotActivation,
|
|
264
|
-
operation: () => Promise<T> | T
|
|
266
|
+
operation: () => Promise<T> | T,
|
|
267
|
+
signal?: AbortSignal
|
|
265
268
|
): Promise<T> {
|
|
266
|
-
const pending = activation.serial.executeLifecycleOperation(operation);
|
|
269
|
+
const pending = awaitWithAbort(activation.serial.executeLifecycleOperation(operation), signal);
|
|
267
270
|
return activation.serial.isCurrentTurn
|
|
268
271
|
? await activation.serial.currentTurn!.yieldFrameworkPromise(pending)
|
|
269
272
|
: await pending;
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
resolveActorIngress,
|
|
3
|
+
type ZLinkRouteToActorJoinPrewarm,
|
|
4
|
+
type ZLinkActorIngressRoute
|
|
5
|
+
} from './spot-actor-ingress-admission';
|
|
6
|
+
import type { ZLinkSpotActorHandoffRuntime } from './spot-runtime-ports';
|
|
2
7
|
import { DefaultZLinkActorContext } from '../actors/actor-context';
|
|
3
8
|
import { decodeSessionDisconnected } from '../actors/session-disconnected-wire';
|
|
4
9
|
import { routingIdsEqual } from '../routing-id';
|
|
5
10
|
import type { ApplicationJobOrigin } from '../application-jobs/contracts';
|
|
6
11
|
import {
|
|
7
12
|
ZLinkFrameworkInternalErrorKind,
|
|
8
|
-
createInternalFrameworkException
|
|
9
|
-
internalFrameworkErrorKind
|
|
13
|
+
createInternalFrameworkException
|
|
10
14
|
} from '../framework-errors-internal';
|
|
11
15
|
import type {
|
|
12
16
|
ActorRef,
|
|
13
17
|
RoutingId,
|
|
18
|
+
Type,
|
|
14
19
|
ZLinkActor,
|
|
15
20
|
ZLinkMessageSerializer,
|
|
16
21
|
ZLinkSpot
|
|
@@ -31,6 +36,7 @@ import {
|
|
|
31
36
|
ZLinkDispatchMessageKind
|
|
32
37
|
} from '../../contracts/Dispatch/ZLinkDispatchOptions';
|
|
33
38
|
import { flowIfEnabled } from '../diagnostics';
|
|
39
|
+
import { dispatchReasonFromError } from '../diagnostics/dispatch-error-details';
|
|
34
40
|
import { createInboundFlow, currentFlowContext, runWithFlow } from '../diagnostics/flow-context';
|
|
35
41
|
import { streamSessionIdFromRoutingId } from '../streams/managed-stream';
|
|
36
42
|
import type { ZLinkRemoteBoundSessionTarget } from '../actors';
|
|
@@ -73,6 +79,7 @@ export interface ZLinkActorRequestTerminal {
|
|
|
73
79
|
/** One admitted Actor packet and the routing context that must move with it. */
|
|
74
80
|
export interface ZLinkActorPacketDelivery {
|
|
75
81
|
readonly origin: ApplicationJobOrigin;
|
|
82
|
+
readonly receivedAt?: Date;
|
|
76
83
|
readonly actorId: string;
|
|
77
84
|
readonly parts: readonly Message[];
|
|
78
85
|
readonly returnResponse: boolean;
|
|
@@ -83,43 +90,15 @@ export interface ZLinkActorPacketDelivery {
|
|
|
83
90
|
readonly sourceSessionRid?: RoutingId;
|
|
84
91
|
}
|
|
85
92
|
|
|
86
|
-
|
|
87
|
-
* Spec 15 §4.2 relocation temporary queue: consulted when {@code
|
|
88
|
-
* resolveActor} finds nothing for an arrival that carries an exact object
|
|
89
|
-
* identity. Parks the arrival if an Actor Join admission attempt is in
|
|
90
|
-
* flight for {@code (actorId, objectGeneration)}, or reports not-found so
|
|
91
|
-
* the caller falls through to its existing missing-actor handling
|
|
92
|
-
* unchanged.
|
|
93
|
-
*/
|
|
94
|
-
export type ZLinkRouteToActorJoinPrewarm = (
|
|
95
|
-
actorId: string,
|
|
96
|
-
objectGeneration: bigint,
|
|
97
|
-
arrival: {
|
|
98
|
-
readonly origin: ApplicationJobOrigin;
|
|
99
|
-
readonly header: Buffer;
|
|
100
|
-
readonly payload: Buffer;
|
|
101
|
-
readonly returnResponse: boolean;
|
|
102
|
-
readonly remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget;
|
|
103
|
-
readonly fallbackActorRef?: ActorRef;
|
|
104
|
-
readonly requestTerminal?: ZLinkActorRequestTerminal;
|
|
105
|
-
readonly resolve: (value: unknown) => void;
|
|
106
|
-
readonly reject: (reason: unknown) => void;
|
|
107
|
-
}
|
|
108
|
-
) => 'parked' | 'not-found';
|
|
109
|
-
|
|
93
|
+
export type { ZLinkRouteToActorJoinPrewarm } from './spot-actor-ingress-admission';
|
|
110
94
|
interface ZLinkSpotActorPacketDispatchOptions {
|
|
95
|
+
readonly admission?: import('../admission').ZLinkRuntimeAdmissionGate;
|
|
111
96
|
readonly spot: ZLinkSpot | (() => ZLinkSpot);
|
|
112
97
|
readonly spotId: () => string;
|
|
113
98
|
readonly registry: ZLinkSpotActorHandlerRegistryRuntime;
|
|
114
|
-
readonly serial?: ZLinkSpotSerialTurnExecutor;
|
|
115
99
|
readonly resolveActor: (actorId: string) => ZLinkActor | undefined;
|
|
116
|
-
readonly
|
|
117
|
-
readonly routeBeforeLocal?:
|
|
118
|
-
delivery: ZLinkActorPacketDelivery
|
|
119
|
-
) =>
|
|
120
|
-
| Promise<{ readonly handled: boolean; readonly response?: unknown } | undefined>
|
|
121
|
-
| { readonly handled: boolean; readonly response?: unknown }
|
|
122
|
-
| undefined;
|
|
100
|
+
readonly hasDepartedActor?: (actorId: string) => boolean;
|
|
101
|
+
readonly routeBeforeLocal?: ZLinkActorIngressRoute;
|
|
123
102
|
readonly onDisconnectActor: (actor: ZLinkActor) => Promise<void>;
|
|
124
103
|
readonly actorResponseSender?: (
|
|
125
104
|
actor: ZLinkActor,
|
|
@@ -146,10 +125,14 @@ interface ZLinkSpotActorPacketDispatchOptions {
|
|
|
146
125
|
readonly routeToActorJoinPrewarm?: ZLinkRouteToActorJoinPrewarm;
|
|
147
126
|
}
|
|
148
127
|
|
|
128
|
+
export type ZLinkActorPacketExecution =
|
|
129
|
+
{ readonly terminal: Promise<unknown> } | { readonly response: unknown };
|
|
130
|
+
|
|
149
131
|
export class ZLinkSpotActorPacketDispatch {
|
|
150
132
|
constructor(private readonly options: ZLinkSpotActorPacketDispatchOptions) {}
|
|
151
133
|
|
|
152
134
|
dispatch(
|
|
135
|
+
serial: ZLinkSpotSerialTurnExecutor | undefined,
|
|
153
136
|
origin: ApplicationJobOrigin,
|
|
154
137
|
actorId: string,
|
|
155
138
|
parts: readonly Message[],
|
|
@@ -158,8 +141,9 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
158
141
|
fallbackActorRef?: ActorRef,
|
|
159
142
|
requestTerminal?: ZLinkActorRequestTerminal
|
|
160
143
|
): Promise<unknown> {
|
|
161
|
-
return this.dispatchDelivery({
|
|
144
|
+
return this.dispatchDelivery(serial, {
|
|
162
145
|
origin,
|
|
146
|
+
receivedAt: new Date(),
|
|
163
147
|
actorId,
|
|
164
148
|
parts,
|
|
165
149
|
returnResponse,
|
|
@@ -169,18 +153,32 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
169
153
|
});
|
|
170
154
|
}
|
|
171
155
|
|
|
172
|
-
async dispatchDelivery(
|
|
156
|
+
async dispatchDelivery(
|
|
157
|
+
serial: ZLinkSpotSerialTurnExecutor | undefined,
|
|
158
|
+
delivery: ZLinkActorPacketDelivery
|
|
159
|
+
): Promise<unknown> {
|
|
160
|
+
const result = await this.admitDelivery(serial, delivery);
|
|
161
|
+
return 'terminal' in result ? await result.terminal : result.response;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async admitDelivery(
|
|
165
|
+
serial: ZLinkSpotSerialTurnExecutor | undefined,
|
|
166
|
+
delivery: ZLinkActorPacketDelivery,
|
|
167
|
+
handoffRuntime?: ZLinkSpotActorHandoffRuntime
|
|
168
|
+
): Promise<ZLinkActorPacketExecution> {
|
|
173
169
|
const {
|
|
174
170
|
actorId,
|
|
175
171
|
parts,
|
|
176
172
|
returnResponse,
|
|
173
|
+
receivedAt: deliveryReceivedAt,
|
|
177
174
|
remoteBoundSessionTarget,
|
|
178
175
|
fallbackActorRef,
|
|
179
176
|
requestTerminal
|
|
180
177
|
} = delivery;
|
|
178
|
+
const receivedAt = deliveryReceivedAt ?? new Date();
|
|
181
179
|
if (parts.length < 2) {
|
|
182
180
|
this.reportInvalidFrame(actorId, ZLinkDispatchMessageKind.ActorSend);
|
|
183
|
-
return undefined;
|
|
181
|
+
return { response: undefined };
|
|
184
182
|
}
|
|
185
183
|
// Spec 26 §4.1: one level read per processing point — the same gate value
|
|
186
184
|
// drives both the decode and the flow-context install.
|
|
@@ -223,28 +221,32 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
223
221
|
disconnected && header.kind === ZLinkStreamMessageKind.Request
|
|
224
222
|
? emptyDisconnectedReply
|
|
225
223
|
: undefined;
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
224
|
+
const admitted = resolveActorIngress(
|
|
225
|
+
delivery,
|
|
226
|
+
messageKind === ZLinkDispatchMessageKind.ActorRequest,
|
|
227
|
+
{
|
|
228
|
+
handoffRuntime,
|
|
229
|
+
routeBeforeLocal: this.options.routeBeforeLocal,
|
|
230
|
+
resolveActor: this.options.resolveActor,
|
|
231
|
+
hasDepartedActor: this.options.hasDepartedActor,
|
|
232
|
+
routeToActorJoinPrewarm: this.options.routeToActorJoinPrewarm
|
|
233
|
+
}
|
|
234
|
+
);
|
|
235
|
+
if ('terminal' in admitted) return { terminal: admitted.terminal };
|
|
236
|
+
if (admitted.kind === 'stale')
|
|
237
|
+
return {
|
|
238
|
+
response: await this.dispatchUnavailableActor(
|
|
239
|
+
admitted.error,
|
|
240
|
+
actorId,
|
|
241
|
+
header,
|
|
242
|
+
messageKind,
|
|
243
|
+
action,
|
|
244
|
+
returnResponse,
|
|
245
|
+
remoteBoundSessionTarget,
|
|
246
|
+
fallbackActorRef
|
|
247
|
+
)
|
|
248
|
+
};
|
|
249
|
+
const actor = admitted.actor;
|
|
248
250
|
if (disconnected) {
|
|
249
251
|
const identity = decodeSessionDisconnected(messageToBytes(parts[1]));
|
|
250
252
|
if (identity === undefined) {
|
|
@@ -258,7 +260,7 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
258
260
|
),
|
|
259
261
|
'warning'
|
|
260
262
|
);
|
|
261
|
-
return disconnectedReply;
|
|
263
|
+
return { response: disconnectedReply };
|
|
262
264
|
}
|
|
263
265
|
const current =
|
|
264
266
|
actor.context instanceof DefaultZLinkActorContext
|
|
@@ -270,85 +272,68 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
270
272
|
current.sessionOwnerNodeGeneration !== identity.sessionOwnerNodeGeneration ||
|
|
271
273
|
current.bindingGeneration !== identity.bindingGeneration)
|
|
272
274
|
)
|
|
273
|
-
return disconnectedReply;
|
|
275
|
+
return { response: disconnectedReply };
|
|
274
276
|
await this.options.onDisconnectActor(actor);
|
|
275
|
-
|
|
277
|
+
this.trace(
|
|
278
|
+
messageKind === ZLinkDispatchMessageKind.ActorRequest
|
|
279
|
+
? ZLinkMessageFlowOutcome.Replied
|
|
280
|
+
: ZLinkMessageFlowOutcome.Completed,
|
|
281
|
+
actorId,
|
|
282
|
+
header,
|
|
283
|
+
messageKind
|
|
284
|
+
);
|
|
285
|
+
return { response: disconnectedReply };
|
|
276
286
|
}
|
|
277
287
|
const decodePayload = this.createPayloadDecoder(parts[1], header);
|
|
278
|
-
return
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
288
|
+
return {
|
|
289
|
+
response: await this.dispatchActorPacket(
|
|
290
|
+
actor,
|
|
291
|
+
actorId,
|
|
292
|
+
decodePayload,
|
|
293
|
+
header,
|
|
294
|
+
messageKind,
|
|
295
|
+
action,
|
|
296
|
+
returnResponse,
|
|
297
|
+
remoteBoundSessionTarget,
|
|
298
|
+
fallbackActorRef,
|
|
299
|
+
requestTerminal,
|
|
300
|
+
requestDeadlineUnixMs,
|
|
301
|
+
serial,
|
|
302
|
+
zlinkSerialWorkOptions(
|
|
303
|
+
parts[1].data().byteLength,
|
|
304
|
+
zlinkMetadataByteLength(header.metadata)
|
|
305
|
+
),
|
|
306
|
+
receivedAt
|
|
293
307
|
)
|
|
294
|
-
|
|
308
|
+
};
|
|
295
309
|
}
|
|
296
310
|
);
|
|
297
311
|
}
|
|
298
312
|
|
|
299
|
-
private async
|
|
300
|
-
|
|
313
|
+
private async dispatchUnavailableActor(
|
|
314
|
+
missingActorError: unknown,
|
|
301
315
|
actorId: string,
|
|
302
|
-
parts: readonly Message[],
|
|
303
316
|
header: ReturnType<typeof decodeStreamHeader>,
|
|
304
317
|
messageKind: ZLinkDispatchMessageKind,
|
|
305
318
|
action: ZLinkDispatchErrorAction,
|
|
306
319
|
returnResponse: boolean,
|
|
307
320
|
fallbackBoundSessionTarget: ZLinkRemoteBoundSessionTarget | undefined,
|
|
308
|
-
fallbackActorRef: ActorRef | undefined
|
|
309
|
-
requestTerminal: ZLinkActorRequestTerminal | undefined
|
|
321
|
+
fallbackActorRef: ActorRef | undefined
|
|
310
322
|
): Promise<unknown> {
|
|
311
|
-
if (
|
|
312
|
-
this.options.routeToActorJoinPrewarm !== undefined &&
|
|
313
|
-
fallbackActorRef !== undefined &&
|
|
314
|
-
parts.length >= 2 &&
|
|
315
|
-
// A Request without a terminal has no way to complete once
|
|
316
|
-
// migrated later — parking it would leave the caller hanging
|
|
317
|
-
// forever with no reply route. Fall through to the existing
|
|
318
|
-
// missing-actor handling for that shape instead.
|
|
319
|
-
(messageKind !== ZLinkDispatchMessageKind.ActorRequest || requestTerminal !== undefined)
|
|
320
|
-
) {
|
|
321
|
-
const parked = this.parkForActorJoinPrewarm(
|
|
322
|
-
origin,
|
|
323
|
-
actorId,
|
|
324
|
-
parts,
|
|
325
|
-
messageKind,
|
|
326
|
-
returnResponse,
|
|
327
|
-
fallbackBoundSessionTarget,
|
|
328
|
-
fallbackActorRef,
|
|
329
|
-
requestTerminal
|
|
330
|
-
);
|
|
331
|
-
if (parked !== undefined) return parked;
|
|
332
|
-
}
|
|
333
323
|
this.options.dispatchErrors?.report({
|
|
334
324
|
surface: ZLinkDispatchErrorSurface.SpotActor,
|
|
335
325
|
messageKind,
|
|
336
|
-
reason:
|
|
326
|
+
reason: dispatchReasonFromError(missingActorError),
|
|
337
327
|
action,
|
|
338
328
|
packetName: header.name,
|
|
339
329
|
spotId: this.options.spotId(),
|
|
340
330
|
actorId,
|
|
341
|
-
correlationId: header.correlationId ?? header.requestSeq?.toString()
|
|
331
|
+
correlationId: header.correlationId ?? header.requestSeq?.toString(),
|
|
332
|
+
error: missingActorError
|
|
342
333
|
});
|
|
343
334
|
if (messageKind !== ZLinkDispatchMessageKind.ActorRequest) {
|
|
344
335
|
return undefined;
|
|
345
336
|
}
|
|
346
|
-
const missingActorError = createInternalFrameworkException(
|
|
347
|
-
actorMessageFollowContext(fallbackActorRef) === undefined
|
|
348
|
-
? ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound
|
|
349
|
-
: ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
350
|
-
`SPOT actor is not registered locally: ${actorId}`
|
|
351
|
-
);
|
|
352
337
|
if (
|
|
353
338
|
header.requestSeq !== undefined &&
|
|
354
339
|
!returnResponse &&
|
|
@@ -368,87 +353,15 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
368
353
|
throw missingActorError;
|
|
369
354
|
}
|
|
370
355
|
|
|
371
|
-
/**
|
|
372
|
-
* Spec 15 §4.2 relocation temporary queue: parks one arrival for a
|
|
373
|
-
* missing Actor that carries an exact object identity, instead of
|
|
374
|
-
* dropping it (Send) or replying HandlerNotFound (Request). Returns
|
|
375
|
-
* {@code undefined} when no admission attempt owns this object — the
|
|
376
|
-
* caller falls through to its existing missing-actor handling unchanged.
|
|
377
|
-
* Header/payload are copied to owned buffers before parking so the
|
|
378
|
-
* arrival survives independently of the original {@link Message}
|
|
379
|
-
* lifetime.
|
|
380
|
-
*/
|
|
381
|
-
private parkForActorJoinPrewarm(
|
|
382
|
-
origin: ApplicationJobOrigin,
|
|
383
|
-
actorId: string,
|
|
384
|
-
parts: readonly Message[],
|
|
385
|
-
messageKind: ZLinkDispatchMessageKind,
|
|
386
|
-
returnResponse: boolean,
|
|
387
|
-
remoteBoundSessionTarget: ZLinkRemoteBoundSessionTarget | undefined,
|
|
388
|
-
fallbackActorRef: ActorRef,
|
|
389
|
-
requestTerminal: ZLinkActorRequestTerminal | undefined
|
|
390
|
-
): Promise<unknown> | undefined {
|
|
391
|
-
const isRequest = messageKind === ZLinkDispatchMessageKind.ActorRequest;
|
|
392
|
-
let resolve: (value: unknown) => void = () => undefined;
|
|
393
|
-
let reject: (reason: unknown) => void = () => undefined;
|
|
394
|
-
const result = new Promise<unknown>((res, rej) => {
|
|
395
|
-
resolve = res;
|
|
396
|
-
reject = rej;
|
|
397
|
-
});
|
|
398
|
-
// A Request's real reply must still travel through the exact mailbox
|
|
399
|
-
// correlation the original caller captured in `requestTerminal` — not
|
|
400
|
-
// through this method's own return value, which the caller only uses
|
|
401
|
-
// to decide whether it still owes a reply itself. Wrapping keeps that
|
|
402
|
-
// reply route intact across the (possibly much later) redelivery at
|
|
403
|
-
// migration time while also releasing the original caller once the
|
|
404
|
-
// real reply has gone out, so it never sends a premature empty one.
|
|
405
|
-
const wrappedRequestTerminal: ZLinkActorRequestTerminal | undefined =
|
|
406
|
-
requestTerminal === undefined
|
|
407
|
-
? undefined
|
|
408
|
-
: Object.assign(
|
|
409
|
-
async (response: unknown, preparedReply?: unknown) => {
|
|
410
|
-
try {
|
|
411
|
-
await requestTerminal(response, preparedReply);
|
|
412
|
-
resolve(undefined);
|
|
413
|
-
} catch (error) {
|
|
414
|
-
reject(error);
|
|
415
|
-
throw error;
|
|
416
|
-
}
|
|
417
|
-
},
|
|
418
|
-
{ prepare: requestTerminal.prepare }
|
|
419
|
-
);
|
|
420
|
-
const route = this.options.routeToActorJoinPrewarm!(
|
|
421
|
-
actorId,
|
|
422
|
-
fallbackActorRef.objectGeneration,
|
|
423
|
-
{
|
|
424
|
-
origin,
|
|
425
|
-
header: Buffer.from(parts[0].data()),
|
|
426
|
-
payload: Buffer.from(parts[1].data()),
|
|
427
|
-
returnResponse,
|
|
428
|
-
remoteBoundSessionTarget,
|
|
429
|
-
fallbackActorRef,
|
|
430
|
-
requestTerminal: wrappedRequestTerminal,
|
|
431
|
-
resolve,
|
|
432
|
-
reject
|
|
433
|
-
}
|
|
434
|
-
);
|
|
435
|
-
if (route !== 'parked') return undefined;
|
|
436
|
-
// A Send has no reply to wait for: the migrated redelivery still runs
|
|
437
|
-
// in order later, but this caller's own await is done once parking is
|
|
438
|
-
// confirmed.
|
|
439
|
-
if (!isRequest) resolve(undefined);
|
|
440
|
-
return result;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
356
|
private createPayloadDecoder(
|
|
444
357
|
message: Message,
|
|
445
358
|
header: ReturnType<typeof decodeStreamHeader>
|
|
446
|
-
): () => unknown {
|
|
447
|
-
return () =>
|
|
359
|
+
): (messageType?: Type) => unknown {
|
|
360
|
+
return (messageType) =>
|
|
448
361
|
decodeFrameworkTypedPayloadMessage(
|
|
449
362
|
message,
|
|
450
363
|
this.options.messageSerializers,
|
|
451
|
-
|
|
364
|
+
messageType,
|
|
452
365
|
streamCodecContentType(header.codec),
|
|
453
366
|
header.name
|
|
454
367
|
);
|
|
@@ -466,18 +379,26 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
466
379
|
fallbackActorRef: ActorRef | undefined,
|
|
467
380
|
requestTerminal: ZLinkActorRequestTerminal | undefined,
|
|
468
381
|
requestDeadlineUnixMs: number | undefined,
|
|
469
|
-
|
|
382
|
+
serial: ZLinkSpotSerialTurnExecutor | undefined,
|
|
383
|
+
workOptions: ZLinkSerialWorkOptions,
|
|
384
|
+
receivedAt: Date
|
|
470
385
|
): Promise<unknown> {
|
|
471
386
|
const spot = typeof this.options.spot === 'function' ? this.options.spot() : this.options.spot;
|
|
472
387
|
const dispatcher = new ZLinkSpotActorDispatcher({
|
|
473
388
|
registry: this.options.registry,
|
|
474
389
|
spot,
|
|
475
390
|
providerResolver: this.options.providerResolver,
|
|
476
|
-
serial
|
|
391
|
+
serial,
|
|
477
392
|
serialWorkOptions: workOptions,
|
|
478
393
|
messageSerializers: this.options.messageSerializers,
|
|
479
394
|
onAdmitted: () => this.trace(ZLinkMessageFlowOutcome.Admitted, actorId, header, messageKind),
|
|
480
395
|
onHandlerStart: () => {
|
|
396
|
+
if (this.options.admission?.ownerAdmissionOpen() === false) {
|
|
397
|
+
throw createInternalFrameworkException(
|
|
398
|
+
ZLinkFrameworkInternalErrorKind.RequestRejected,
|
|
399
|
+
'Actor handler was rejected because Location owner admission is closed.'
|
|
400
|
+
);
|
|
401
|
+
}
|
|
481
402
|
// A transferred backlog is returned to the Actor queue as one FIFO
|
|
482
403
|
// prefix. Check the request deadline when its owner turn actually
|
|
483
404
|
// starts, not when that prefix is admitted.
|
|
@@ -491,8 +412,8 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
491
412
|
`Actor request '${actorId}' expired before handler admission.`
|
|
492
413
|
);
|
|
493
414
|
}
|
|
494
|
-
releaseApplicationJobPermitBeforeHandler();
|
|
495
415
|
this.trace(ZLinkMessageFlowOutcome.Dispatched, actorId, header, messageKind);
|
|
416
|
+
releaseApplicationJobPermitBeforeHandler();
|
|
496
417
|
}
|
|
497
418
|
});
|
|
498
419
|
try {
|
|
@@ -500,7 +421,8 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
500
421
|
await dispatcher.dispatchSendDecoded(actor, header.name, decodePayload, {
|
|
501
422
|
meshName: spot.context.meshName,
|
|
502
423
|
metadata: zlinkMessageMetadata(header.metadata),
|
|
503
|
-
correlationId: header.correlationId ?? undefined
|
|
424
|
+
correlationId: header.correlationId ?? undefined,
|
|
425
|
+
receivedAt
|
|
504
426
|
});
|
|
505
427
|
this.trace(
|
|
506
428
|
ZLinkMessageFlowOutcome.Completed,
|
|
@@ -533,7 +455,8 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
533
455
|
{
|
|
534
456
|
meshName: spot.context.meshName,
|
|
535
457
|
metadata: zlinkMessageMetadata(header.metadata),
|
|
536
|
-
correlationId: header.correlationId ?? header.requestSeq.toString()
|
|
458
|
+
correlationId: header.correlationId ?? header.requestSeq.toString(),
|
|
459
|
+
receivedAt
|
|
537
460
|
},
|
|
538
461
|
async (response) => {
|
|
539
462
|
this.trace(
|
|
@@ -561,7 +484,8 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
561
484
|
{
|
|
562
485
|
meshName: spot.context.meshName,
|
|
563
486
|
metadata: zlinkMessageMetadata(header.metadata),
|
|
564
|
-
correlationId: header.correlationId ?? header.requestSeq.toString()
|
|
487
|
+
correlationId: header.correlationId ?? header.requestSeq.toString(),
|
|
488
|
+
receivedAt
|
|
565
489
|
}
|
|
566
490
|
);
|
|
567
491
|
this.trace(
|
|
@@ -579,7 +503,8 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
579
503
|
{
|
|
580
504
|
meshName: spot.context.meshName,
|
|
581
505
|
metadata: zlinkMessageMetadata(header.metadata),
|
|
582
|
-
correlationId: header.correlationId ?? header.requestSeq.toString()
|
|
506
|
+
correlationId: header.correlationId ?? header.requestSeq.toString(),
|
|
507
|
+
receivedAt
|
|
583
508
|
},
|
|
584
509
|
async (response, replyOptions) => {
|
|
585
510
|
this.trace(
|
|
@@ -605,16 +530,7 @@ export class ZLinkSpotActorPacketDispatch {
|
|
|
605
530
|
this.options.dispatchErrors?.report({
|
|
606
531
|
surface: ZLinkDispatchErrorSurface.SpotActor,
|
|
607
532
|
messageKind,
|
|
608
|
-
reason:
|
|
609
|
-
error instanceof ZLinkFrameworkException &&
|
|
610
|
-
internalFrameworkErrorKind(error) ===
|
|
611
|
-
ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound
|
|
612
|
-
? ZLinkDispatchErrorReason.HandlerMissing
|
|
613
|
-
: error instanceof ZLinkFrameworkException &&
|
|
614
|
-
internalFrameworkErrorKind(error) ===
|
|
615
|
-
ZLinkFrameworkInternalErrorKind.PayloadDecodeFailed
|
|
616
|
-
? ZLinkDispatchErrorReason.PayloadDecodeFailed
|
|
617
|
-
: ZLinkDispatchErrorReason.HandlerException,
|
|
533
|
+
reason: dispatchReasonFromError(error),
|
|
618
534
|
action,
|
|
619
535
|
packetName: header.name,
|
|
620
536
|
spotId: this.options.spotId(),
|
|
@@ -37,14 +37,16 @@ interface ZLinkSpotActorPacketDrainOptions {
|
|
|
37
37
|
) => void;
|
|
38
38
|
readonly waitIdle: () => Promise<void>;
|
|
39
39
|
readonly flowEnabled?: () => boolean;
|
|
40
|
+
readonly receivedAtClock?: () => Date;
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
const ZLINK_SPOT_ACTOR_RECV_INFO_NO_BIND = 1;
|
|
44
|
+
const systemReceivedAtClock = (): Date => new Date();
|
|
43
45
|
|
|
44
46
|
export class ZLinkSpotActorPacketDrain {
|
|
45
47
|
private readonly continuations = new Map<
|
|
46
48
|
string,
|
|
47
|
-
{ readonly owner: string; readonly parts: Message[] }
|
|
49
|
+
{ readonly owner: string; readonly parts: Message[]; readonly receivedAt: Date }
|
|
48
50
|
>();
|
|
49
51
|
|
|
50
52
|
constructor(private readonly options: ZLinkSpotActorPacketDrainOptions) {}
|
|
@@ -60,6 +62,7 @@ export class ZLinkSpotActorPacketDrain {
|
|
|
60
62
|
let requestId: bigint | undefined;
|
|
61
63
|
let flags: number | undefined;
|
|
62
64
|
let packetKey: string | undefined;
|
|
65
|
+
let receivedAt: Date | undefined;
|
|
63
66
|
try {
|
|
64
67
|
for (;;) {
|
|
65
68
|
const part = info.recvActorPart(ZLINK_RECV_DONT_WAIT);
|
|
@@ -67,7 +70,8 @@ export class ZLinkSpotActorPacketDrain {
|
|
|
67
70
|
if (parts.length > 0 && packetKey !== undefined) {
|
|
68
71
|
this.continuations.set(packetKey, {
|
|
69
72
|
owner: continuationOwner(parts[0], this.flowEnabled()),
|
|
70
|
-
parts: parts.splice(0)
|
|
73
|
+
parts: parts.splice(0),
|
|
74
|
+
receivedAt: receivedAt ?? (this.options.receivedAtClock ?? systemReceivedAtClock)()
|
|
71
75
|
});
|
|
72
76
|
return;
|
|
73
77
|
}
|
|
@@ -78,6 +82,8 @@ export class ZLinkSpotActorPacketDrain {
|
|
|
78
82
|
if (packetKey === undefined) {
|
|
79
83
|
packetKey = currentPacketKey;
|
|
80
84
|
const pending = this.continuations.get(currentPacketKey);
|
|
85
|
+
receivedAt =
|
|
86
|
+
pending?.receivedAt ?? (this.options.receivedAtClock ?? systemReceivedAtClock)();
|
|
81
87
|
if (pending !== undefined) {
|
|
82
88
|
if (isStreamHeaderMessage(part.message, this.flowEnabled())) {
|
|
83
89
|
closeMessages(pending.parts);
|
|
@@ -125,7 +131,13 @@ export class ZLinkSpotActorPacketDrain {
|
|
|
125
131
|
return;
|
|
126
132
|
}
|
|
127
133
|
if (noBindInfo !== undefined) {
|
|
128
|
-
await this.dispatchNoBindActorRequest(
|
|
134
|
+
await this.dispatchNoBindActorRequest(
|
|
135
|
+
noBindInfo,
|
|
136
|
+
actorId,
|
|
137
|
+
parts,
|
|
138
|
+
actorRef,
|
|
139
|
+
receivedAt ?? (this.options.receivedAtClock ?? systemReceivedAtClock)()
|
|
140
|
+
);
|
|
129
141
|
} else {
|
|
130
142
|
await this.options.actorPacketHandler({
|
|
131
143
|
origin: 'remote',
|
|
@@ -133,7 +145,8 @@ export class ZLinkSpotActorPacketDrain {
|
|
|
133
145
|
parts,
|
|
134
146
|
returnResponse: false,
|
|
135
147
|
sourceSessionRid,
|
|
136
|
-
fallbackActorRef: actorRef as unknown as ActorRef | undefined
|
|
148
|
+
fallbackActorRef: actorRef as unknown as ActorRef | undefined,
|
|
149
|
+
receivedAt
|
|
137
150
|
});
|
|
138
151
|
}
|
|
139
152
|
} finally {
|
|
@@ -188,7 +201,8 @@ export class ZLinkSpotActorPacketDrain {
|
|
|
188
201
|
info: ZLinkBackendActorRecvInfo,
|
|
189
202
|
actorId: string,
|
|
190
203
|
parts: readonly Message[],
|
|
191
|
-
actorRef: ZLinkBackendActorRef | undefined
|
|
204
|
+
actorRef: ZLinkBackendActorRef | undefined,
|
|
205
|
+
receivedAt: Date
|
|
192
206
|
): Promise<void> {
|
|
193
207
|
try {
|
|
194
208
|
const response = await this.options.actorPacketHandler?.({
|
|
@@ -197,7 +211,8 @@ export class ZLinkSpotActorPacketDrain {
|
|
|
197
211
|
parts,
|
|
198
212
|
returnResponse: true,
|
|
199
213
|
sourceSessionRid: info.sourceSessionRid,
|
|
200
|
-
fallbackActorRef: actorRef as unknown as ActorRef | undefined
|
|
214
|
+
fallbackActorRef: actorRef as unknown as ActorRef | undefined,
|
|
215
|
+
receivedAt
|
|
201
216
|
});
|
|
202
217
|
this.options.replyActorNoBind?.(
|
|
203
218
|
info,
|