@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
|
@@ -9,6 +9,7 @@ import type {
|
|
|
9
9
|
import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
|
|
10
10
|
import type { ZLinkApplicationWorkClaim } from '../admission';
|
|
11
11
|
import { zlinkMessageMetadata } from '../../contracts';
|
|
12
|
+
import { resolveMessageTypeForDecode } from '../../contracts/Common/HandlerMessageType';
|
|
12
13
|
import {
|
|
13
14
|
ZLinkRuntimeDispatchErrorAction as ZLinkDispatchErrorAction,
|
|
14
15
|
ZLinkRuntimeDispatchErrorReason as ZLinkDispatchErrorReason,
|
|
@@ -77,7 +78,7 @@ export class ZLinkRoutedSpotPacketDispatch {
|
|
|
77
78
|
async sendEncoded(
|
|
78
79
|
spotId: RoutingId,
|
|
79
80
|
packetName: string | undefined,
|
|
80
|
-
decodePayload: () => unknown,
|
|
81
|
+
decodePayload: (messageType?: Type) => unknown,
|
|
81
82
|
context: ZLinkRoutedSpotPacketContext
|
|
82
83
|
): Promise<void> {
|
|
83
84
|
await this.dispatch(spotId, packetName, decodePayload, context, false);
|
|
@@ -95,7 +96,7 @@ export class ZLinkRoutedSpotPacketDispatch {
|
|
|
95
96
|
async requestEncoded<TReply>(
|
|
96
97
|
spotId: RoutingId,
|
|
97
98
|
packetName: string | undefined,
|
|
98
|
-
decodePayload: () => unknown,
|
|
99
|
+
decodePayload: (messageType?: Type) => unknown,
|
|
99
100
|
context: ZLinkRoutedSpotPacketContext
|
|
100
101
|
): Promise<TReply> {
|
|
101
102
|
return (await this.dispatch(spotId, packetName, decodePayload, context, true)) as TReply;
|
|
@@ -104,10 +105,11 @@ export class ZLinkRoutedSpotPacketDispatch {
|
|
|
104
105
|
private async dispatch(
|
|
105
106
|
spotId: RoutingId,
|
|
106
107
|
packetName: string | undefined,
|
|
107
|
-
decodePayload: () => unknown,
|
|
108
|
+
decodePayload: (messageType?: Type) => unknown,
|
|
108
109
|
context: ZLinkRoutedSpotPacketContext,
|
|
109
110
|
returnResponse: boolean
|
|
110
111
|
): Promise<unknown> {
|
|
112
|
+
const receivedAt = new Date();
|
|
111
113
|
const activation = this.options.resolveActivation(spotId);
|
|
112
114
|
if (activation === undefined) {
|
|
113
115
|
this.reportMissing(spotId, packetName, context, returnResponse);
|
|
@@ -190,7 +192,9 @@ export class ZLinkRoutedSpotPacketDispatch {
|
|
|
190
192
|
);
|
|
191
193
|
// Decode only after the Spot has acquired both application admission
|
|
192
194
|
// and its execution authority.
|
|
193
|
-
const payload = decodePayload(
|
|
195
|
+
const payload = decodePayload(
|
|
196
|
+
resolveMessageTypeForDecode(currentRegistrations[0]?.messageType)
|
|
197
|
+
);
|
|
194
198
|
for (const registration of currentRegistrations) {
|
|
195
199
|
const handler = await resolveLifecycleHandler(
|
|
196
200
|
current.spot,
|
|
@@ -203,13 +207,15 @@ export class ZLinkRoutedSpotPacketDispatch {
|
|
|
203
207
|
resolveFirstHandlerTurn?.();
|
|
204
208
|
resolveFirstHandlerTurn = undefined;
|
|
205
209
|
context.activationRecord?.onHandlerTurnStarted?.();
|
|
206
|
-
|
|
207
|
-
response = await handler.handle(current.spot, payload, {
|
|
210
|
+
const handlerContext = {
|
|
208
211
|
channelName: context.channelName,
|
|
209
212
|
contentType: context.contentType,
|
|
210
213
|
packetName: packetName!,
|
|
211
|
-
metadata: zlinkMessageMetadata({})
|
|
212
|
-
|
|
214
|
+
metadata: zlinkMessageMetadata({}),
|
|
215
|
+
receivedAt
|
|
216
|
+
};
|
|
217
|
+
releaseApplicationJobPermitBeforeHandler();
|
|
218
|
+
response = await handler.handle(current.spot, payload, handlerContext);
|
|
213
219
|
}
|
|
214
220
|
} catch (error) {
|
|
215
221
|
rejectFirstHandlerTurn?.(error);
|
|
@@ -36,8 +36,11 @@ export interface ZLinkEntryActorRuntime {
|
|
|
36
36
|
parts: readonly Message[],
|
|
37
37
|
returnResponse?: boolean,
|
|
38
38
|
remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget,
|
|
39
|
-
fallbackActorRef?: ActorRef
|
|
40
|
-
|
|
39
|
+
fallbackActorRef?: ActorRef,
|
|
40
|
+
origin?: ApplicationJobOrigin,
|
|
41
|
+
requestTerminal?: import('./spot-actor-packet-dispatch').ZLinkActorRequestTerminal,
|
|
42
|
+
messageFollowOrigin?: ZLinkMessageFollowOrigin
|
|
43
|
+
): { readonly handled: boolean; readonly response?: unknown };
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
export interface ZLinkSpotActorTransferRuntime {
|
|
@@ -28,7 +28,7 @@ export type ZLinkActorPacketTurnDispatch = (
|
|
|
28
28
|
export class ZLinkSpotSerialExecutor {
|
|
29
29
|
private readonly actorSerials = new Map<string, ZLinkSpotSerialTurnExecutor>();
|
|
30
30
|
private readonly timerSerials = new Map<string, ZLinkSpotSerialTurnExecutor>();
|
|
31
|
-
|
|
31
|
+
readonly actorExecutors = new Map<string, ZLinkActorSerialExecutor>();
|
|
32
32
|
private executionBarrier: ZLinkExecutionBarrier | undefined;
|
|
33
33
|
private closing = false;
|
|
34
34
|
private closePromise: Promise<void> | undefined;
|
|
@@ -163,10 +163,10 @@ export class ZLinkSpotSerialTurnExecutor {
|
|
|
163
163
|
async postOneWay(
|
|
164
164
|
operation: () => Promise<unknown> | unknown,
|
|
165
165
|
onError: (error: unknown) => void,
|
|
166
|
-
workOptions
|
|
167
|
-
admission
|
|
166
|
+
workOptions?: ZLinkSerialWorkOptions,
|
|
167
|
+
admission?: {
|
|
168
168
|
readonly signal?: AbortSignal;
|
|
169
|
-
}
|
|
169
|
+
},
|
|
170
170
|
replay?: (failure?: unknown) => Promise<unknown>
|
|
171
171
|
): Promise<void> {
|
|
172
172
|
this.lastActivityAtMs = performance.now();
|
|
@@ -179,17 +179,13 @@ export class ZLinkSpotSerialTurnExecutor {
|
|
|
179
179
|
if (barrierClaim !== undefined && replay !== undefined) {
|
|
180
180
|
Object.assign(barrierClaim, { replay: bindApplicationJobPermit(replay) });
|
|
181
181
|
}
|
|
182
|
-
if (admission
|
|
182
|
+
if (admission?.signal?.aborted === true) {
|
|
183
183
|
throw new DOMException('The operation was aborted.', 'AbortError');
|
|
184
184
|
}
|
|
185
|
-
const options = {
|
|
186
|
-
...workOptions,
|
|
187
|
-
lane: workOptions.lane ?? 'application'
|
|
188
|
-
};
|
|
189
185
|
const boundOperation = bindApplicationJobPermit(operation);
|
|
190
186
|
const submitted = hasApplicationJobPermit()
|
|
191
|
-
? this.scheduler.submitPreAdmitted(boundOperation,
|
|
192
|
-
: this.scheduler.submit(boundOperation,
|
|
187
|
+
? this.scheduler.submitPreAdmitted(boundOperation, workOptions, barrierClaim)
|
|
188
|
+
: this.scheduler.submit(boundOperation, workOptions, barrierClaim);
|
|
193
189
|
void submitted.catch((error) => {
|
|
194
190
|
barrierClaim?.release();
|
|
195
191
|
onError(error);
|
|
@@ -265,7 +261,7 @@ export class ZLinkSpotSerialTurnExecutor {
|
|
|
265
261
|
|
|
266
262
|
private async enqueueApplicationTurn<T>(
|
|
267
263
|
operation: () => Promise<T> | T,
|
|
268
|
-
workOptions
|
|
264
|
+
workOptions?: ZLinkSerialWorkOptions,
|
|
269
265
|
replay?: (failure?: unknown) => Promise<T>,
|
|
270
266
|
retainWhilePreparing = false
|
|
271
267
|
): Promise<T> {
|
|
@@ -300,7 +296,7 @@ export class ZLinkSpotSerialTurnExecutor {
|
|
|
300
296
|
|
|
301
297
|
private async enqueueFrameworkTurn<T>(
|
|
302
298
|
operation: () => Promise<T> | T,
|
|
303
|
-
workOptions
|
|
299
|
+
workOptions?: ZLinkSerialWorkOptions
|
|
304
300
|
): Promise<T> {
|
|
305
301
|
this.lastActivityAtMs = performance.now();
|
|
306
302
|
// Application admission crosses the async barrier boundary before it
|
|
@@ -318,43 +314,39 @@ export class ZLinkSpotSerialTurnExecutor {
|
|
|
318
314
|
|
|
319
315
|
private submitQueuedTurn<T>(
|
|
320
316
|
operation: () => Promise<T> | T,
|
|
321
|
-
workOptions: ZLinkSerialWorkOptions,
|
|
317
|
+
workOptions: ZLinkSerialWorkOptions | undefined,
|
|
322
318
|
barrierClaim?: ZLinkExecutionBarrierClaim | Promise<ZLinkExecutionBarrierClaim>
|
|
323
319
|
): Promise<T> {
|
|
324
|
-
const options = {
|
|
325
|
-
...workOptions,
|
|
326
|
-
lane: workOptions.lane ?? 'application'
|
|
327
|
-
};
|
|
328
320
|
const boundOperation = bindApplicationJobPermit(operation);
|
|
329
321
|
return hasApplicationJobPermit()
|
|
330
|
-
? this.scheduler.submitPreAdmitted(boundOperation,
|
|
331
|
-
: this.scheduler.submit(boundOperation,
|
|
322
|
+
? this.scheduler.submitPreAdmitted(boundOperation, workOptions, barrierClaim)
|
|
323
|
+
: this.scheduler.submit(boundOperation, workOptions, barrierClaim);
|
|
332
324
|
}
|
|
333
325
|
|
|
334
326
|
private runQueuedRecord(record: ZLinkSerialWorkRecord<unknown>): Promise<void> {
|
|
335
327
|
if (record.context instanceof Promise) {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
328
|
+
// Branch-local captures keep the synchronous path free of a V8 function context.
|
|
329
|
+
const executor = this;
|
|
330
|
+
const work = record;
|
|
331
|
+
const pending = record.context;
|
|
332
|
+
return pending.then((claim: ZLinkExecutionBarrierClaim) => {
|
|
333
|
+
Object.assign(work, { context: claim });
|
|
334
|
+
return executor.runQueuedRecord(work);
|
|
339
335
|
});
|
|
340
336
|
}
|
|
341
337
|
const context = record.context as ZLinkSpotApplicationTurnContext | undefined;
|
|
342
338
|
if (context?.replay !== undefined && record.operation === context.replay) {
|
|
343
339
|
context.release();
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
(error) => record.reject(error),
|
|
349
|
-
claim,
|
|
350
|
-
record.release
|
|
351
|
-
)
|
|
340
|
+
const executor = this;
|
|
341
|
+
const work = record;
|
|
342
|
+
return Promise.resolve(executor.executionBarrier?.enter()).then((claim) =>
|
|
343
|
+
executor.runTurn(work.operation, work.resolve, work.reject, claim, work.release)
|
|
352
344
|
);
|
|
353
345
|
}
|
|
354
346
|
return this.runTurn(
|
|
355
347
|
record.operation,
|
|
356
|
-
|
|
357
|
-
|
|
348
|
+
record.resolve,
|
|
349
|
+
record.reject,
|
|
358
350
|
record.context as ZLinkExecutionBarrierClaim | undefined,
|
|
359
351
|
record.release
|
|
360
352
|
);
|
|
@@ -405,14 +397,7 @@ export class ZLinkSpotSerialTurnExecutor {
|
|
|
405
397
|
release?.();
|
|
406
398
|
}
|
|
407
399
|
);
|
|
408
|
-
owner.then(resolve, reject);
|
|
409
|
-
return Promise.race([
|
|
410
|
-
owner.then(
|
|
411
|
-
() => undefined,
|
|
412
|
-
() => undefined
|
|
413
|
-
),
|
|
414
|
-
turn.suspended
|
|
415
|
-
]);
|
|
400
|
+
return Promise.race([owner.then(resolve, reject), turn.suspended]);
|
|
416
401
|
}
|
|
417
402
|
|
|
418
403
|
private postResume(
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
import { createInboundFlow, runWithFlow } from '../diagnostics/flow-context';
|
|
26
26
|
import { resolveLifecycleHandler } from '../handlers/handler-instance-scope';
|
|
27
27
|
import type { ZLinkSpotHandlerRegistration } from './spot-handler-registry';
|
|
28
|
+
import { resolveMessageTypeForDecode } from '../../contracts/Common/HandlerMessageType';
|
|
28
29
|
import { ZLINK_RECV_DONT_WAIT } from './spot-native-flags';
|
|
29
30
|
import type { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
|
|
30
31
|
import { zlinkMetadataByteLength, zlinkSerialWorkOptions } from '../execution/serial-work-size';
|
|
@@ -132,6 +133,7 @@ export class ZLinkSpotSubscriptionDispatch {
|
|
|
132
133
|
readonly parts: readonly Message[];
|
|
133
134
|
readonly routingId: RoutingId | unknown | null;
|
|
134
135
|
}): Promise<void> {
|
|
136
|
+
const receivedAt = new Date();
|
|
135
137
|
if (message.parts.length === 0) {
|
|
136
138
|
this.options.dispatchErrors?.report({
|
|
137
139
|
surface: ZLinkDispatchErrorSurface.SpotSubscription,
|
|
@@ -193,8 +195,12 @@ export class ZLinkSpotSubscriptionDispatch {
|
|
|
193
195
|
runWithFlow(inboundFlow, async () => {
|
|
194
196
|
// Payload deserialization belongs to the Spot serial turn. Queue
|
|
195
197
|
// admission and execution authority therefore precede this work.
|
|
196
|
-
const event = decodeChannelPayload(envelope, this.channelCodecs());
|
|
197
198
|
for (const registration of registrations) {
|
|
199
|
+
const event = decodeChannelPayload(
|
|
200
|
+
envelope,
|
|
201
|
+
this.channelCodecs(),
|
|
202
|
+
resolveMessageTypeForDecode(registration.messageType)
|
|
203
|
+
);
|
|
198
204
|
const handler = await resolveLifecycleHandler(
|
|
199
205
|
spot,
|
|
200
206
|
registration.handlerType as Type<ZLinkSpotSubscriptionHandler<ZLinkSpot, unknown>>,
|
|
@@ -208,7 +214,8 @@ export class ZLinkSpotSubscriptionDispatch {
|
|
|
208
214
|
topic: message.topic,
|
|
209
215
|
source: subSource,
|
|
210
216
|
metadata: zlinkMessageMetadata(envelope.header.metadata),
|
|
211
|
-
correlationId: envelope.header.correlationId ?? undefined
|
|
217
|
+
correlationId: envelope.header.correlationId ?? undefined,
|
|
218
|
+
receivedAt
|
|
212
219
|
});
|
|
213
220
|
} catch (error) {
|
|
214
221
|
this.options.dispatchErrors?.report({
|
|
@@ -522,7 +522,7 @@ export class ZLinkManagedTimer implements ZLinkTimer {
|
|
|
522
522
|
private pendingScheduledIndex: bigint | undefined;
|
|
523
523
|
private timeout: unknown;
|
|
524
524
|
/** The dispatch in flight, from its timer callback until `completeFireCore`. */
|
|
525
|
-
|
|
525
|
+
running: Promise<void> | undefined;
|
|
526
526
|
private dispatchFailure: { readonly cause: unknown } | undefined;
|
|
527
527
|
private finalization: ZLinkTimerFinalization | undefined;
|
|
528
528
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ZLinkStreamHeaderFlags, type ZLinkStreamFrameHeader } from './protocol';
|
|
1
2
|
import {
|
|
2
3
|
ZLinkFrameworkErrorKind,
|
|
3
4
|
ZLinkFrameworkException
|
|
@@ -153,9 +154,9 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
153
154
|
TContext extends ZLinkActorSessionBindingContext<TActor>,
|
|
154
155
|
TActor extends ZLinkActorSessionBindingActor
|
|
155
156
|
> {
|
|
156
|
-
|
|
157
|
+
readonly lane = new ZLinkStateLane();
|
|
157
158
|
private readonly routes = new Map<string, ZLinkActorSessionRoute<TContext, TActor>>();
|
|
158
|
-
|
|
159
|
+
readonly nextActorSlots = new WeakMap<TContext, number>();
|
|
159
160
|
private readonly sealWaiters = new Map<
|
|
160
161
|
string,
|
|
161
162
|
Set<{
|
|
@@ -166,7 +167,7 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
166
167
|
>();
|
|
167
168
|
private readonly activeFrameWaiters = new Map<string, Set<ZLinkActorSessionActiveFrameWaiter>>();
|
|
168
169
|
private readonly relocations = new Map<string, ZLinkActorSessionRelocationQueue>();
|
|
169
|
-
|
|
170
|
+
readonly absentSessionRelocationResults = new Map<
|
|
170
171
|
string,
|
|
171
172
|
{
|
|
172
173
|
readonly result: SessionRelocationResult;
|
|
@@ -409,6 +410,48 @@ export class ZLinkActorSessionBindingRegistry<
|
|
|
409
410
|
return await this.lane.run(() => this.routeCore(actorId));
|
|
410
411
|
}
|
|
411
412
|
|
|
413
|
+
async submitReply<T>(
|
|
414
|
+
context: TContext,
|
|
415
|
+
header: ZLinkStreamFrameHeader,
|
|
416
|
+
submit: (header: ZLinkStreamFrameHeader) => Promise<T>
|
|
417
|
+
): Promise<T> {
|
|
418
|
+
const { submission } = await this.lane.run(() => {
|
|
419
|
+
const current =
|
|
420
|
+
header.actorSlot === undefined ||
|
|
421
|
+
[...this.routes.values()].some(
|
|
422
|
+
(route) => route.context === context && route.actorSlot === header.actorSlot
|
|
423
|
+
);
|
|
424
|
+
return {
|
|
425
|
+
submission: submit(
|
|
426
|
+
current
|
|
427
|
+
? header
|
|
428
|
+
: {
|
|
429
|
+
...header,
|
|
430
|
+
actorSlot: undefined,
|
|
431
|
+
flags: header.flags & ~ZLinkStreamHeaderFlags.HasActorSlot
|
|
432
|
+
}
|
|
433
|
+
)
|
|
434
|
+
};
|
|
435
|
+
});
|
|
436
|
+
return await submission;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/** Registers a current binding's frame in the same turn that can retire its slot. */
|
|
440
|
+
async submitCurrent<T>(
|
|
441
|
+
actorId: string,
|
|
442
|
+
bindingToken: string,
|
|
443
|
+
submit: (route: ZLinkActorSessionRoute<TContext, TActor>) => Promise<T>
|
|
444
|
+
): Promise<T | undefined> {
|
|
445
|
+
const { submission } = await this.lane.run(() => {
|
|
446
|
+
const route = this.routeCore(actorId);
|
|
447
|
+
return {
|
|
448
|
+
submission: route?.bindingToken === bindingToken ? submit(route) : undefined
|
|
449
|
+
};
|
|
450
|
+
});
|
|
451
|
+
// Transport completion must not hold the registry lane.
|
|
452
|
+
return await submission;
|
|
453
|
+
}
|
|
454
|
+
|
|
412
455
|
/** Selects the route only when it is the exact Session binding (§8.1 validation values). */
|
|
413
456
|
async routeForSessionBinding(
|
|
414
457
|
actorId: string,
|
|
@@ -10,6 +10,7 @@ import { flowIfEnabled } from '../diagnostics';
|
|
|
10
10
|
import { encodeFrameworkPayloadMessage } from '../messaging/payload-codec';
|
|
11
11
|
import { ZLinkSubmitStatus, type ZLinkSubmitResult } from '../messaging/submission-result';
|
|
12
12
|
import {
|
|
13
|
+
type ZLinkActorSessionAuthorityFence,
|
|
13
14
|
ZLinkActorSessionBindingRegistry,
|
|
14
15
|
ZLinkActorSessionBindingTermination
|
|
15
16
|
} from './actor-session-binding-registry';
|
|
@@ -38,7 +39,8 @@ export interface ZLinkBoundActorRelaySenderOptions {
|
|
|
38
39
|
readonly notifyDisconnected?: (
|
|
39
40
|
actor: ZLinkSessionActor,
|
|
40
41
|
signal?: AbortSignal,
|
|
41
|
-
binding?: ServiceStreamSessionBinding
|
|
42
|
+
binding?: ServiceStreamSessionBinding,
|
|
43
|
+
authorityFence?: ZLinkActorSessionAuthorityFence
|
|
42
44
|
) => Promise<void>;
|
|
43
45
|
}
|
|
44
46
|
|
|
@@ -269,7 +271,12 @@ export class ZLinkBoundActorRelaySender {
|
|
|
269
271
|
signal
|
|
270
272
|
);
|
|
271
273
|
}
|
|
272
|
-
await this.options.notifyDisconnected?.(
|
|
274
|
+
await this.options.notifyDisconnected?.(
|
|
275
|
+
actor,
|
|
276
|
+
signal,
|
|
277
|
+
detached.binding,
|
|
278
|
+
detached.route.authorityFence
|
|
279
|
+
);
|
|
273
280
|
}
|
|
274
281
|
|
|
275
282
|
async notifyPhysicalDisconnect(context: DefaultZLinkSessionContext): Promise<void> {
|
|
@@ -300,15 +307,19 @@ export class ZLinkBoundActorRelaySender {
|
|
|
300
307
|
actor.bindingToken,
|
|
301
308
|
ZLinkActorSessionBindingTermination.PhysicalDisconnect
|
|
302
309
|
);
|
|
303
|
-
return { binding };
|
|
310
|
+
return { binding, authorityFence: route.authorityFence };
|
|
304
311
|
});
|
|
305
312
|
if (detached === false) return;
|
|
306
313
|
const controller = new AbortController();
|
|
307
314
|
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
308
315
|
try {
|
|
309
316
|
await Promise.race([
|
|
310
|
-
this.options.notifyDisconnected?.(
|
|
311
|
-
|
|
317
|
+
this.options.notifyDisconnected?.(
|
|
318
|
+
actor,
|
|
319
|
+
controller.signal,
|
|
320
|
+
detached.binding,
|
|
321
|
+
detached.authorityFence
|
|
322
|
+
) ?? Promise.resolve(),
|
|
312
323
|
new Promise<never>((_, reject) => {
|
|
313
324
|
controller.signal.addEventListener(
|
|
314
325
|
'abort',
|
|
@@ -125,11 +125,12 @@ export class ZLinkBoundSessionService {
|
|
|
125
125
|
this.actorSlot(route)
|
|
126
126
|
);
|
|
127
127
|
try {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
128
|
+
return (
|
|
129
|
+
(await this.routes.submitCurrent(actorId, route.bindingToken, (current) => {
|
|
130
|
+
throwIfAborted(signal);
|
|
131
|
+
return current.context.stream.submitRaw(frame);
|
|
132
|
+
})) ?? { status: ZLinkSubmitStatus.TargetNotFound }
|
|
133
|
+
);
|
|
133
134
|
} finally {
|
|
134
135
|
frame.close();
|
|
135
136
|
}
|
|
@@ -370,10 +371,12 @@ export class ZLinkBoundSessionService {
|
|
|
370
371
|
this.actorSlot(route)
|
|
371
372
|
);
|
|
372
373
|
try {
|
|
373
|
-
|
|
374
|
+
const result = await this.routes.submitCurrent(actorId, route.bindingToken, (current) =>
|
|
375
|
+
current.context.stream.submitRaw(frame)
|
|
376
|
+
);
|
|
377
|
+
if (result === undefined) {
|
|
374
378
|
return false;
|
|
375
379
|
}
|
|
376
|
-
const result = await route.context.stream.submitRaw(frame);
|
|
377
380
|
if (result.status !== ZLinkSubmitStatus.Submitted) {
|
|
378
381
|
throw new Error(`Actor '${actorId}' local bound session ${operationName} failed.`);
|
|
379
382
|
}
|
|
@@ -60,6 +60,9 @@ import { ZLinkBoundSessionService, type ZLinkBoundSessionTransport } from './bou
|
|
|
60
60
|
import { ZLinkManagedStream } from './managed-stream';
|
|
61
61
|
import {
|
|
62
62
|
messageToBytes,
|
|
63
|
+
decodeStreamFrame,
|
|
64
|
+
decodeStreamHeader,
|
|
65
|
+
encodeStreamFrame,
|
|
63
66
|
ZLinkStreamCodec,
|
|
64
67
|
ZLinkStreamMessageKind,
|
|
65
68
|
type ZLinkStreamFrameHeader,
|
|
@@ -417,7 +420,7 @@ export class ZLinkStreamSessionNodeRuntime extends ZLinkStreamSessionNodeRuntime
|
|
|
417
420
|
}
|
|
418
421
|
|
|
419
422
|
export class ZLinkStreamBindingRuntime {
|
|
420
|
-
|
|
423
|
+
readonly routes: ZLinkActorSessionBindingRegistry<
|
|
421
424
|
DefaultZLinkSessionContext,
|
|
422
425
|
DefaultZLinkSessionActor
|
|
423
426
|
>;
|
|
@@ -808,19 +811,42 @@ export class ZLinkStreamBindingRuntime {
|
|
|
808
811
|
);
|
|
809
812
|
}
|
|
810
813
|
|
|
811
|
-
|
|
814
|
+
async submitReply(
|
|
815
|
+
context: DefaultZLinkSessionContext,
|
|
812
816
|
requestHeader: ZLinkStreamFrameHeader,
|
|
813
817
|
kind: ZLinkStreamReplyMessageKind,
|
|
814
818
|
metadata: ReadonlyMap<string, string>,
|
|
815
819
|
compressed: boolean,
|
|
816
820
|
payload: unknown
|
|
817
|
-
):
|
|
818
|
-
|
|
821
|
+
): Promise<ZLinkSubmitResult> {
|
|
822
|
+
const frame = this.frameMessages.createJsonReplyFrameMessage(
|
|
819
823
|
requestHeader,
|
|
820
824
|
kind,
|
|
821
825
|
metadata,
|
|
822
826
|
compressed,
|
|
823
827
|
payload
|
|
824
828
|
);
|
|
829
|
+
try {
|
|
830
|
+
return await this.routes.submitReply(context, requestHeader, async (header) => {
|
|
831
|
+
if (header === requestHeader) return await context.stream.submitRaw(frame);
|
|
832
|
+
const encoded = decodeStreamFrame(messageToBytes(frame));
|
|
833
|
+
const normalized = this.createBinaryMessage(
|
|
834
|
+
encodeStreamFrame(
|
|
835
|
+
{
|
|
836
|
+
...decodeStreamHeader(encoded.header),
|
|
837
|
+
actorSlot: header.actorSlot
|
|
838
|
+
},
|
|
839
|
+
encoded.payload
|
|
840
|
+
)
|
|
841
|
+
);
|
|
842
|
+
try {
|
|
843
|
+
return await context.stream.submitRaw(normalized);
|
|
844
|
+
} finally {
|
|
845
|
+
normalized.close();
|
|
846
|
+
}
|
|
847
|
+
});
|
|
848
|
+
} finally {
|
|
849
|
+
frame.close();
|
|
850
|
+
}
|
|
825
851
|
}
|
|
826
852
|
}
|
|
@@ -478,7 +478,8 @@ export class ZLinkManagedStream implements ZLinkStream {
|
|
|
478
478
|
throw wireReplyFailureException(
|
|
479
479
|
completion.terminalResult,
|
|
480
480
|
completion.failureErrno,
|
|
481
|
-
|
|
481
|
+
completion.failureMessage ??
|
|
482
|
+
`${operationName} failed with result ${completion.terminalResult} (errno ${completion.failureErrno}).`
|
|
482
483
|
);
|
|
483
484
|
}
|
|
484
485
|
} finally {
|
|
@@ -39,13 +39,13 @@ export interface ZLinkSessionCallContext {
|
|
|
39
39
|
payload: unknown,
|
|
40
40
|
correlationId?: string
|
|
41
41
|
): Message;
|
|
42
|
-
|
|
42
|
+
submitReply(
|
|
43
43
|
requestHeader: ZLinkStreamFrameHeader,
|
|
44
44
|
kind: ZLinkStreamReplyMessageKind,
|
|
45
45
|
metadata: ReadonlyMap<string, string>,
|
|
46
46
|
compressed: boolean,
|
|
47
47
|
payload: unknown
|
|
48
|
-
):
|
|
48
|
+
): Promise<ZLinkSubmitResult>;
|
|
49
49
|
claimReply(requestHeader: ZLinkStreamFrameHeader): void;
|
|
50
50
|
/**
|
|
51
51
|
* Spec 26 §2.2: the STREAM surface records session-connected sends and the
|
|
@@ -168,23 +168,18 @@ export class DefaultZLinkSessionReplyCall implements ZLinkSessionReplyCall {
|
|
|
168
168
|
throw new Error('Reply is only available while handling a request packet.');
|
|
169
169
|
}
|
|
170
170
|
this.context.claimReply(requestHeader);
|
|
171
|
-
const
|
|
171
|
+
const result = await this.context.submitReply(
|
|
172
172
|
requestHeader,
|
|
173
173
|
ZLinkStreamMessageKind.Response,
|
|
174
174
|
new Map<string, string>(),
|
|
175
175
|
this.compressionEnabled,
|
|
176
176
|
this.message
|
|
177
177
|
);
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
requestHeader.correlationId
|
|
185
|
-
);
|
|
186
|
-
} finally {
|
|
187
|
-
message.close();
|
|
188
|
-
}
|
|
178
|
+
requireOneWayCompletion(result, 'STREAM session reply');
|
|
179
|
+
this.context.traceFrameWritten?.(
|
|
180
|
+
ZLinkStreamMessageKind.Response,
|
|
181
|
+
requestHeader.name,
|
|
182
|
+
requestHeader.correlationId
|
|
183
|
+
);
|
|
189
184
|
}
|
|
190
185
|
}
|
|
@@ -65,13 +65,14 @@ interface ZLinkSessionContextRuntime {
|
|
|
65
65
|
payload: unknown,
|
|
66
66
|
correlationId?: string
|
|
67
67
|
): Message;
|
|
68
|
-
|
|
68
|
+
submitReply(
|
|
69
|
+
context: DefaultZLinkSessionContext,
|
|
69
70
|
requestHeader: ZLinkStreamFrameHeader,
|
|
70
71
|
kind: ZLinkStreamReplyMessageKind,
|
|
71
72
|
metadata: ReadonlyMap<string, string>,
|
|
72
73
|
compressed: boolean,
|
|
73
74
|
payload: unknown
|
|
74
|
-
):
|
|
75
|
+
): Promise<ZLinkSubmitResult>;
|
|
75
76
|
decompressPayload(payload: Message): Message;
|
|
76
77
|
bind(
|
|
77
78
|
context: DefaultZLinkSessionContext,
|
|
@@ -267,20 +268,14 @@ export class DefaultZLinkSessionContext implements ZLinkSessionContext {
|
|
|
267
268
|
);
|
|
268
269
|
}
|
|
269
270
|
|
|
270
|
-
|
|
271
|
+
submitReply(
|
|
271
272
|
requestHeader: ZLinkStreamFrameHeader,
|
|
272
273
|
kind: ZLinkStreamReplyMessageKind,
|
|
273
274
|
metadata: ReadonlyMap<string, string>,
|
|
274
275
|
compressed: boolean,
|
|
275
276
|
payload: unknown
|
|
276
|
-
):
|
|
277
|
-
return this.runtime.
|
|
278
|
-
requestHeader,
|
|
279
|
-
kind,
|
|
280
|
-
metadata,
|
|
281
|
-
compressed,
|
|
282
|
-
payload
|
|
283
|
-
);
|
|
277
|
+
): Promise<ZLinkSubmitResult> {
|
|
278
|
+
return this.runtime.submitReply(this, requestHeader, kind, metadata, compressed, payload);
|
|
284
279
|
}
|
|
285
280
|
|
|
286
281
|
enterDispatch(header: ZLinkStreamFrameHeader): void {
|