@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,14 +9,50 @@ const application_job_queue_scope_1 = require("../application-jobs/application-j
|
|
|
9
9
|
const serial_execution_queue_1 = require("../execution/serial-execution-queue");
|
|
10
10
|
function createChannelApplicationDispatchQueue() {
|
|
11
11
|
return new serial_execution_queue_1.ZLinkSerialExecutionQueue(async (record) => {
|
|
12
|
+
const permit = record.context;
|
|
13
|
+
const previousPermit = (0, application_job_queue_scope_1.enterApplicationJobPermitScope)(permit);
|
|
12
14
|
try {
|
|
13
|
-
|
|
15
|
+
void Promise.resolve(record.operation()).then((value) => {
|
|
16
|
+
try {
|
|
17
|
+
record.resolve(value);
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
try {
|
|
21
|
+
record.release();
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
(0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}, (error) => {
|
|
28
|
+
try {
|
|
29
|
+
record.reject(error);
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
try {
|
|
33
|
+
record.release();
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
(0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
14
40
|
}
|
|
15
41
|
catch (error) {
|
|
16
|
-
|
|
42
|
+
try {
|
|
43
|
+
record.reject(error);
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
try {
|
|
47
|
+
record.release();
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
(0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
17
53
|
}
|
|
18
54
|
finally {
|
|
19
|
-
|
|
55
|
+
(0, application_job_queue_scope_1.leaveApplicationJobPermitScope)(previousPermit);
|
|
20
56
|
}
|
|
21
57
|
});
|
|
22
58
|
}
|
|
@@ -118,6 +154,7 @@ class ZLinkChannelReceiveLoop {
|
|
|
118
154
|
applicationJobQueue;
|
|
119
155
|
roundRobin;
|
|
120
156
|
applicationDispatchQueue;
|
|
157
|
+
receivedAtClock;
|
|
121
158
|
// The loop awaits between the two reads and stop() can land in that gap.
|
|
122
159
|
// Reading through a method keeps the second check honest; a field read stays
|
|
123
160
|
// narrowed to false across the await and is treated as dead code.
|
|
@@ -130,7 +167,7 @@ class ZLinkChannelReceiveLoop {
|
|
|
130
167
|
receiveOwner;
|
|
131
168
|
rawReceiveReservations;
|
|
132
169
|
capacityStop = new AbortController();
|
|
133
|
-
constructor(channelName, router, dispatcher, spotRouteBridge, infrastructureHandler, poller, applicationJobQueue, reportError, roundRobin, applicationDispatchQueue = createChannelApplicationDispatchQueue()) {
|
|
170
|
+
constructor(channelName, router, dispatcher, spotRouteBridge, infrastructureHandler, poller, applicationJobQueue, reportError, roundRobin, applicationDispatchQueue = createChannelApplicationDispatchQueue(), receivedAtClock = () => new Date()) {
|
|
134
171
|
this.channelName = channelName;
|
|
135
172
|
this.router = router;
|
|
136
173
|
this.dispatcher = dispatcher;
|
|
@@ -140,6 +177,7 @@ class ZLinkChannelReceiveLoop {
|
|
|
140
177
|
this.applicationJobQueue = applicationJobQueue;
|
|
141
178
|
this.roundRobin = roundRobin;
|
|
142
179
|
this.applicationDispatchQueue = applicationDispatchQueue;
|
|
180
|
+
this.receivedAtClock = receivedAtClock;
|
|
143
181
|
this.inFlight = new channel_receive_task_tracker_1.ZLinkReceiveTaskTracker(reportError);
|
|
144
182
|
this.receiveOwner = roundRobin?.register() ?? Symbol('channel-receive-owner');
|
|
145
183
|
this.rawReceiveReservations = new ZLinkRawReceiveReservationPool(exports.ZLINK_CHANNEL_RAW_RECEIVE_RESERVATION_LIMIT);
|
|
@@ -161,87 +199,89 @@ class ZLinkChannelReceiveLoop {
|
|
|
161
199
|
}
|
|
162
200
|
async runLoop(signal) {
|
|
163
201
|
const batch = new ZLinkReceiveBatchBudget();
|
|
202
|
+
const rotation = this.applicationJobQueue.createReceiveRotation(RECEIVE_BATCH_MESSAGE_LIMIT, 'remote');
|
|
164
203
|
const capacitySignal = signal === undefined
|
|
165
204
|
? this.capacityStop.signal
|
|
166
205
|
: AbortSignal.any([signal, this.capacityStop.signal]);
|
|
167
|
-
while (!this.isStopped() &&
|
|
206
|
+
while (!this.isStopped() && !signalAborted(capacitySignal)) {
|
|
168
207
|
if (!this.poller.wait(0)) {
|
|
169
208
|
this.roundRobin?.setReady(this.receiveOwner, false);
|
|
170
|
-
this.roundRobin?.release(this.receiveOwner);
|
|
171
|
-
batch.reset();
|
|
172
|
-
if (!(await this.poller.waitForReadable(capacitySignal)))
|
|
173
|
-
break;
|
|
174
|
-
continue;
|
|
175
|
-
}
|
|
176
|
-
const applicationJobPermit = await this.acquirePermit(capacitySignal);
|
|
177
|
-
if (applicationJobPermit === undefined)
|
|
178
|
-
break;
|
|
179
|
-
// Readiness can become stale while admission waits. The nonblocking
|
|
180
|
-
// recv below owns the empty-result check and returns the permit then.
|
|
181
|
-
this.roundRobin?.setReady(this.receiveOwner, true);
|
|
182
|
-
if (this.roundRobin?.tryAcquire(this.receiveOwner) === false) {
|
|
183
|
-
applicationJobPermit.releaseAfterInternalProcessing();
|
|
184
|
-
await waitReceiveLoopTurn();
|
|
185
|
-
continue;
|
|
186
|
-
}
|
|
187
|
-
const releaseRawReceive = this.roundRobin === undefined
|
|
188
|
-
? this.rawReceiveReservations.tryAcquire()
|
|
189
|
-
: this.roundRobin.tryAcquireRawReceiveReservation();
|
|
190
|
-
if (releaseRawReceive === undefined) {
|
|
191
|
-
applicationJobPermit.releaseAfterInternalProcessing();
|
|
192
|
-
this.roundRobin?.release(this.receiveOwner);
|
|
193
|
-
await waitReceiveLoopTurn();
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
const received = this.router.recv(1);
|
|
197
|
-
if (received == null) {
|
|
198
|
-
this.poller.markDrained();
|
|
199
|
-
applicationJobPermit.releaseAfterInternalProcessing();
|
|
200
|
-
releaseRawReceive();
|
|
201
|
-
this.roundRobin?.setReady(this.receiveOwner, false);
|
|
202
|
-
this.roundRobin?.release(this.receiveOwner);
|
|
203
|
-
batch.reset();
|
|
204
209
|
if (!(await this.poller.waitForReadable(capacitySignal)))
|
|
205
210
|
break;
|
|
206
211
|
continue;
|
|
207
212
|
}
|
|
208
|
-
const receivedBytes = messageBytes(received.parts);
|
|
209
|
-
let classification;
|
|
210
213
|
try {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
214
|
+
await rotation.acquire(capacitySignal);
|
|
215
|
+
this.roundRobin?.setReady(this.receiveOwner, true);
|
|
216
|
+
if (this.roundRobin?.tryAcquire(this.receiveOwner) !== false) {
|
|
217
|
+
batch.reset();
|
|
218
|
+
while (!this.isStopped() && !signalAborted(capacitySignal)) {
|
|
219
|
+
const applicationJobPermit = rotation.take();
|
|
220
|
+
if (applicationJobPermit === undefined)
|
|
221
|
+
break;
|
|
222
|
+
const releaseRawReceive = this.roundRobin === undefined
|
|
223
|
+
? this.rawReceiveReservations.tryAcquire()
|
|
224
|
+
: this.roundRobin.tryAcquireRawReceiveReservation();
|
|
225
|
+
if (releaseRawReceive === undefined) {
|
|
226
|
+
applicationJobPermit.releaseAfterInternalProcessing();
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
// Readiness can become stale during admission; recv owns no_data.
|
|
231
|
+
const received = this.router.recv(1);
|
|
232
|
+
if (received == null) {
|
|
233
|
+
this.poller.markDrained();
|
|
234
|
+
this.roundRobin?.setReady(this.receiveOwner, false);
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
const receivedAt = this.receivedAtClock();
|
|
238
|
+
const receivedBytes = messageBytes(received.parts);
|
|
239
|
+
let classification;
|
|
240
|
+
try {
|
|
241
|
+
classification = this.classify(received);
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
received.close();
|
|
245
|
+
this.inFlight.track(Promise.reject(error));
|
|
246
|
+
if (batch.record(receivedBytes))
|
|
247
|
+
break;
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (classification.kind === 'consumed') {
|
|
251
|
+
applicationJobPermit.releaseAfterInternalProcessing();
|
|
252
|
+
if (classification.closeReceived)
|
|
253
|
+
received.close();
|
|
254
|
+
}
|
|
255
|
+
else if (this.isStopped() || signalAborted(capacitySignal)) {
|
|
256
|
+
received.close();
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
applicationJobPermit.markApplicationQueued();
|
|
261
|
+
const task = this.applicationDispatchQueue.submitPreAdmitted(() => this.dispatchAndClose(received, signal, classification.decodedHeader, true, undefined, receivedAt), undefined, applicationJobPermit);
|
|
262
|
+
this.inFlight.track(task);
|
|
263
|
+
}
|
|
264
|
+
if (batch.record(receivedBytes))
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
releaseRawReceive();
|
|
269
|
+
// A queued record owns its lease until its dispatch turn ends.
|
|
270
|
+
// Reserved leases (no_data, control, failure, stop) return here.
|
|
271
|
+
applicationJobPermit.releaseUnqueued();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
228
274
|
}
|
|
229
|
-
continue;
|
|
230
275
|
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
received.close();
|
|
235
|
-
break;
|
|
276
|
+
catch (error) {
|
|
277
|
+
if (!this.isStopped() && !signalAborted(capacitySignal))
|
|
278
|
+
throw error;
|
|
236
279
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
releaseRawReceive();
|
|
240
|
-
this.inFlight.track(task);
|
|
241
|
-
if (batch.record(receivedBytes)) {
|
|
280
|
+
finally {
|
|
281
|
+
rotation.releaseUnused();
|
|
242
282
|
this.roundRobin?.release(this.receiveOwner);
|
|
243
|
-
await batch.yieldAndReset();
|
|
244
283
|
}
|
|
284
|
+
await waitReceiveLoopTurn();
|
|
245
285
|
}
|
|
246
286
|
}
|
|
247
287
|
async stop() {
|
|
@@ -256,17 +296,7 @@ class ZLinkChannelReceiveLoop {
|
|
|
256
296
|
this.poller.dispose();
|
|
257
297
|
}
|
|
258
298
|
}
|
|
259
|
-
async
|
|
260
|
-
try {
|
|
261
|
-
return await this.applicationJobQueue.acquire(signal, 'remote');
|
|
262
|
-
}
|
|
263
|
-
catch (error) {
|
|
264
|
-
if (this.isStopped() || signal.aborted)
|
|
265
|
-
return undefined;
|
|
266
|
-
throw error;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
async dispatchAndClose(received, signal, decodedHeader, infrastructureChecked = false, releaseRawReceive) {
|
|
299
|
+
async dispatchAndClose(received, signal, decodedHeader, infrastructureChecked = false, releaseRawReceive, receivedAt = this.receivedAtClock()) {
|
|
270
300
|
let closeReceived = true;
|
|
271
301
|
try {
|
|
272
302
|
if (!infrastructureChecked) {
|
|
@@ -277,7 +307,7 @@ class ZLinkChannelReceiveLoop {
|
|
|
277
307
|
}
|
|
278
308
|
decodedHeader = classification.decodedHeader;
|
|
279
309
|
}
|
|
280
|
-
const consumed = await this.dispatcher.dispatch(received, this.router, signal, decodedHeader);
|
|
310
|
+
const consumed = await this.dispatcher.dispatch(received, this.router, signal, decodedHeader, receivedAt);
|
|
281
311
|
if (consumed === true) {
|
|
282
312
|
closeReceived = false;
|
|
283
313
|
}
|
|
@@ -310,6 +340,7 @@ class ZLinkSubscriberReceiveLoop {
|
|
|
310
340
|
infrastructureHandler;
|
|
311
341
|
roundRobin;
|
|
312
342
|
applicationDispatchQueue;
|
|
343
|
+
receivedAtClock;
|
|
313
344
|
// The loop awaits between the two reads and stop() can land in that gap.
|
|
314
345
|
// Reading through a method keeps the second check honest; a field read stays
|
|
315
346
|
// narrowed to false across the await and is treated as dead code.
|
|
@@ -322,7 +353,7 @@ class ZLinkSubscriberReceiveLoop {
|
|
|
322
353
|
receiveOwner;
|
|
323
354
|
rawReceiveReservations;
|
|
324
355
|
capacityStop = new AbortController();
|
|
325
|
-
constructor(adapter, subscriber, dispatcher, applicationJobQueue, infrastructureHandler, roundRobin, reportError, applicationDispatchQueue = createChannelApplicationDispatchQueue()) {
|
|
356
|
+
constructor(adapter, subscriber, dispatcher, applicationJobQueue, infrastructureHandler, roundRobin, reportError, applicationDispatchQueue = createChannelApplicationDispatchQueue(), receivedAtClock = () => new Date()) {
|
|
326
357
|
this.adapter = adapter;
|
|
327
358
|
this.subscriber = subscriber;
|
|
328
359
|
this.dispatcher = dispatcher;
|
|
@@ -330,6 +361,7 @@ class ZLinkSubscriberReceiveLoop {
|
|
|
330
361
|
this.infrastructureHandler = infrastructureHandler;
|
|
331
362
|
this.roundRobin = roundRobin;
|
|
332
363
|
this.applicationDispatchQueue = applicationDispatchQueue;
|
|
364
|
+
this.receivedAtClock = receivedAtClock;
|
|
333
365
|
this.inFlight = new channel_receive_task_tracker_1.ZLinkReceiveTaskTracker(reportError);
|
|
334
366
|
this.poller = adapter.createReadablePoller(subscriber);
|
|
335
367
|
this.receiveOwner = roundRobin?.register() ?? Symbol('subscriber-receive-owner');
|
|
@@ -396,6 +428,7 @@ class ZLinkSubscriberReceiveLoop {
|
|
|
396
428
|
break;
|
|
397
429
|
continue;
|
|
398
430
|
}
|
|
431
|
+
const receivedAt = this.receivedAtClock();
|
|
399
432
|
const receivedBytes = messageBytes(topicMessage.parts);
|
|
400
433
|
let classification;
|
|
401
434
|
try {
|
|
@@ -425,7 +458,7 @@ class ZLinkSubscriberReceiveLoop {
|
|
|
425
458
|
break;
|
|
426
459
|
}
|
|
427
460
|
applicationJobPermit.markApplicationQueued();
|
|
428
|
-
const task =
|
|
461
|
+
const task = this.applicationDispatchQueue.submitPreAdmitted(() => this.dispatchAndClose(topicMessage, signal, classification.decodedHeader, true, undefined, receivedAt), undefined, applicationJobPermit);
|
|
429
462
|
releaseRawReceive();
|
|
430
463
|
this.inFlight.track(task);
|
|
431
464
|
if (batch.record(receivedBytes)) {
|
|
@@ -456,7 +489,7 @@ class ZLinkSubscriberReceiveLoop {
|
|
|
456
489
|
throw error;
|
|
457
490
|
}
|
|
458
491
|
}
|
|
459
|
-
async dispatchAndClose(topicMessage, signal, decodedHeader, infrastructureChecked = false, releaseRawReceive) {
|
|
492
|
+
async dispatchAndClose(topicMessage, signal, decodedHeader, infrastructureChecked = false, releaseRawReceive, receivedAt = this.receivedAtClock()) {
|
|
460
493
|
try {
|
|
461
494
|
if (!infrastructureChecked) {
|
|
462
495
|
const classification = this.classify(topicMessage);
|
|
@@ -464,7 +497,7 @@ class ZLinkSubscriberReceiveLoop {
|
|
|
464
497
|
return;
|
|
465
498
|
decodedHeader = classification.decodedHeader;
|
|
466
499
|
}
|
|
467
|
-
await this.dispatcher.dispatch(topicMessage, signal, decodedHeader);
|
|
500
|
+
await this.dispatcher.dispatch(topicMessage, signal, decodedHeader, receivedAt);
|
|
468
501
|
}
|
|
469
502
|
finally {
|
|
470
503
|
releaseRawReceive?.();
|
|
@@ -489,6 +522,7 @@ class ZLinkRouteReceiveLoop {
|
|
|
489
522
|
applicationJobQueue;
|
|
490
523
|
roundRobin;
|
|
491
524
|
applicationDispatchQueue;
|
|
525
|
+
receivedAtClock;
|
|
492
526
|
// The loop awaits between the two reads and stop() can land in that gap.
|
|
493
527
|
// Reading through a method keeps the second check honest; a field read stays
|
|
494
528
|
// narrowed to false across the await and is treated as dead code.
|
|
@@ -501,13 +535,14 @@ class ZLinkRouteReceiveLoop {
|
|
|
501
535
|
receiveOwner;
|
|
502
536
|
rawReceiveReservations;
|
|
503
537
|
capacityStop = new AbortController();
|
|
504
|
-
constructor(router, dispatcher, poller, applicationJobQueue, roundRobin, reportError, applicationDispatchQueue = createChannelApplicationDispatchQueue()) {
|
|
538
|
+
constructor(router, dispatcher, poller, applicationJobQueue, roundRobin, reportError, applicationDispatchQueue = createChannelApplicationDispatchQueue(), receivedAtClock = () => new Date()) {
|
|
505
539
|
this.router = router;
|
|
506
540
|
this.dispatcher = dispatcher;
|
|
507
541
|
this.poller = poller;
|
|
508
542
|
this.applicationJobQueue = applicationJobQueue;
|
|
509
543
|
this.roundRobin = roundRobin;
|
|
510
544
|
this.applicationDispatchQueue = applicationDispatchQueue;
|
|
545
|
+
this.receivedAtClock = receivedAtClock;
|
|
511
546
|
this.inFlight = new channel_receive_task_tracker_1.ZLinkReceiveTaskTracker(reportError);
|
|
512
547
|
this.receiveOwner = roundRobin?.register() ?? Symbol('route-receive-owner');
|
|
513
548
|
this.rawReceiveReservations = new ZLinkRawReceiveReservationPool(exports.ZLINK_CHANNEL_RAW_RECEIVE_RESERVATION_LIMIT);
|
|
@@ -565,6 +600,7 @@ class ZLinkRouteReceiveLoop {
|
|
|
565
600
|
break;
|
|
566
601
|
continue;
|
|
567
602
|
}
|
|
603
|
+
const receivedAt = this.receivedAtClock();
|
|
568
604
|
const receivedBytes = messageBytes(received.parts);
|
|
569
605
|
let infrastructure;
|
|
570
606
|
try {
|
|
@@ -617,7 +653,7 @@ class ZLinkRouteReceiveLoop {
|
|
|
617
653
|
break;
|
|
618
654
|
}
|
|
619
655
|
applicationJobPermit.markApplicationQueued();
|
|
620
|
-
const task =
|
|
656
|
+
const task = this.applicationDispatchQueue.submitPreAdmitted(() => this.dispatchAndClose(received, signal, true, undefined, receivedAt), undefined, applicationJobPermit);
|
|
621
657
|
releaseRawReceive();
|
|
622
658
|
this.inFlight.track(task);
|
|
623
659
|
if (batch.record(receivedBytes)) {
|
|
@@ -648,10 +684,10 @@ class ZLinkRouteReceiveLoop {
|
|
|
648
684
|
throw error;
|
|
649
685
|
}
|
|
650
686
|
}
|
|
651
|
-
async dispatchAndClose(received, signal, infrastructureChecked = false, releaseRawReceive) {
|
|
687
|
+
async dispatchAndClose(received, signal, infrastructureChecked = false, releaseRawReceive, receivedAt = this.receivedAtClock()) {
|
|
652
688
|
let closeReceived = true;
|
|
653
689
|
try {
|
|
654
|
-
const consumed = await this.dispatcher.dispatch(received, this.router, signal, (0, channel_envelope_inspection_1.tryDecodeChannelHeader)(received.parts, this.dispatcher.flowEnabled?.() ?? true), infrastructureChecked);
|
|
690
|
+
const consumed = await this.dispatcher.dispatch(received, this.router, signal, (0, channel_envelope_inspection_1.tryDecodeChannelHeader)(received.parts, this.dispatcher.flowEnabled?.() ?? true), infrastructureChecked, receivedAt);
|
|
655
691
|
if (consumed === true) {
|
|
656
692
|
closeReceived = false;
|
|
657
693
|
}
|
|
@@ -7,12 +7,30 @@ import { ZLinkLocationRuntime, type ZLinkLocationEventSink, type ZLinkLocationRu
|
|
|
7
7
|
import type { Message } from '../../contracts/Common/Message';
|
|
8
8
|
import type { ReceiveRecord } from '../foundation/service-runtime-contracts';
|
|
9
9
|
import type { RoutingId } from '../../contracts';
|
|
10
|
-
import { type ZLinkRouteRuntimeRequestHandler, type ZLinkRouteRuntimeSendHandler } from './channel-dispatchers';
|
|
10
|
+
import { ZLinkChannelPublishDispatcher, type ZLinkRouteRuntimeRequestHandler, type ZLinkRouteRuntimeSendHandler } from './channel-dispatchers';
|
|
11
|
+
import { ZLinkSubscriberReceiveLoop } from './channel-receive-loops';
|
|
11
12
|
import { ZLinkChannelDispatchServices } from './channel-dispatch-services';
|
|
12
13
|
import type { ZLinkChannelEnvelopeCodecRegistry } from './channel-envelope';
|
|
13
14
|
import { ZLinkChannelSocketRegistry } from './channel-socket-registry';
|
|
14
15
|
import { ZLinkSpotRouteDispatchStrategy } from './spot-route-dispatch-strategy';
|
|
15
16
|
import type { ApplicationJobQueue } from '../host/application-job-queue';
|
|
17
|
+
interface ManualFanoutSubscriberState {
|
|
18
|
+
readonly channelName: string;
|
|
19
|
+
readonly endpoint: string;
|
|
20
|
+
readonly index: number;
|
|
21
|
+
readonly connectionId: string;
|
|
22
|
+
readonly taskRunner: ZLinkRuntimeTaskRunner;
|
|
23
|
+
readonly dispatcher: ZLinkChannelPublishDispatcher;
|
|
24
|
+
desired: boolean;
|
|
25
|
+
transition: Promise<void>;
|
|
26
|
+
openingToken?: symbol;
|
|
27
|
+
active?: ManualFanoutSubscriberActive;
|
|
28
|
+
stopping?: ManualFanoutSubscriberActive;
|
|
29
|
+
}
|
|
30
|
+
interface ManualFanoutSubscriberActive {
|
|
31
|
+
readonly token: symbol;
|
|
32
|
+
readonly loop: ZLinkSubscriberReceiveLoop;
|
|
33
|
+
}
|
|
16
34
|
export interface ZLinkChannelRuntimeLifecycleOptions {
|
|
17
35
|
readonly registration: ZLinkFrameworkRegistration;
|
|
18
36
|
readonly adapter: ZLinkChannelBackendAdapter;
|
|
@@ -31,10 +49,9 @@ export declare class ZLinkChannelRuntimeLifecycle {
|
|
|
31
49
|
private readonly receiveRoundRobin;
|
|
32
50
|
private readonly channelReceiveLoops;
|
|
33
51
|
private readonly subscriberReceiveLoops;
|
|
34
|
-
|
|
52
|
+
readonly manualFanoutSubscribers: Map<string, ManualFanoutSubscriberState>;
|
|
35
53
|
private readonly manualFanoutSubscriberOwners;
|
|
36
54
|
private readonly routeReceiveLoops;
|
|
37
|
-
private readonly applicationDispatchQueues;
|
|
38
55
|
private readonly meshChannelDispatchers;
|
|
39
56
|
private readonly meshRouteDispatchers;
|
|
40
57
|
private nextManualFanoutIndex;
|
|
@@ -50,7 +67,7 @@ export declare class ZLinkChannelRuntimeLifecycle {
|
|
|
50
67
|
lifecycleGeneration: bigint;
|
|
51
68
|
descriptorRevision: bigint;
|
|
52
69
|
advertisedEndpoint: string;
|
|
53
|
-
state: "error" | "preparing" | "serving" | "
|
|
70
|
+
state: "error" | "preparing" | "serving" | "retiring" | "stopped";
|
|
54
71
|
}[] | undefined;
|
|
55
72
|
configureLocationAutoConnect(runtime: ZLinkLocationRuntime, stores: ZLinkLocationRuntimeStores, options: ZLinkLocationOptionOverrides, events?: ZLinkLocationEventSink): void;
|
|
56
73
|
private beginLocationAutoConnectCore;
|
|
@@ -68,12 +85,11 @@ export declare class ZLinkChannelRuntimeLifecycle {
|
|
|
68
85
|
dispose(signal?: AbortSignal): Promise<void>;
|
|
69
86
|
private disposeCore;
|
|
70
87
|
private beginDisposeCore;
|
|
71
|
-
private applicationDispatchQueue;
|
|
72
88
|
private openOutboundSockets;
|
|
73
89
|
private startChannelReceivers;
|
|
74
90
|
private startSubscriberReceivers;
|
|
75
91
|
private getOrCreateManualFanoutSubscriber;
|
|
76
|
-
|
|
92
|
+
requestManualFanoutConnect(channelName: string, endpoint: string, taskRunner: ZLinkRuntimeTaskRunner, dispatcher: ZLinkChannelPublishDispatcher): void;
|
|
77
93
|
private requestManualFanoutDisconnect;
|
|
78
94
|
private enqueueManualFanoutTransition;
|
|
79
95
|
private openManualFanoutSubscriber;
|
|
@@ -87,3 +103,4 @@ export declare class ZLinkChannelRuntimeLifecycle {
|
|
|
87
103
|
private startRouteReceivers;
|
|
88
104
|
private createSpotRouteBridgeForRouter;
|
|
89
105
|
}
|
|
106
|
+
export {};
|
|
@@ -20,7 +20,6 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
20
20
|
manualFanoutSubscribers = new Map();
|
|
21
21
|
manualFanoutSubscriberOwners = new Set();
|
|
22
22
|
routeReceiveLoops = [];
|
|
23
|
-
applicationDispatchQueues = new Map();
|
|
24
23
|
meshChannelDispatchers = new Map();
|
|
25
24
|
meshRouteDispatchers = new Map();
|
|
26
25
|
nextManualFanoutIndex = 0;
|
|
@@ -120,11 +119,13 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
120
119
|
...(mesh.routeSendHandlers ?? []).map((registration) => ({
|
|
121
120
|
kind: 'send',
|
|
122
121
|
packetName: registration.packetName,
|
|
122
|
+
messageType: registration.messageType,
|
|
123
123
|
handler: this.options.dispatchServices.routeSendHandler(registration.handlerType)
|
|
124
124
|
})),
|
|
125
125
|
...(mesh.routeRequestHandlers ?? []).map((registration) => ({
|
|
126
126
|
kind: 'request',
|
|
127
127
|
packetName: registration.packetName,
|
|
128
|
+
messageType: registration.messageType,
|
|
128
129
|
handler: this.options.dispatchServices.routeRequestHandler(registration.handlerType)
|
|
129
130
|
})),
|
|
130
131
|
...[...(this.options.internalRouteSendHandlers?.entries() ?? [])].map(([packetName, handler]) => ({
|
|
@@ -159,17 +160,28 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
159
160
|
routeMesh: true,
|
|
160
161
|
codecs: this.options.codecs,
|
|
161
162
|
dispatchErrors: this.options.dispatchServices.dispatchErrorReporter(taskRunner.errorSink),
|
|
162
|
-
handlers: new Map(channel.requestHandlers?.map((handler) =>
|
|
163
|
-
handler.
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
163
|
+
handlers: new Map(channel.requestHandlers?.map((handler) => {
|
|
164
|
+
const configuredHandler = handler.handler;
|
|
165
|
+
return [
|
|
166
|
+
handler.packetName,
|
|
167
|
+
{
|
|
168
|
+
messageType: handler.messageType,
|
|
169
|
+
handler: configuredHandler ??
|
|
170
|
+
adaptRouteRequestHandler(this.options.dispatchServices.routeRequestHandler(handler.handlerType))
|
|
171
|
+
}
|
|
172
|
+
];
|
|
173
|
+
})),
|
|
174
|
+
sendHandlers: new Map(channel.sendHandlers?.map((handler) => {
|
|
175
|
+
const configuredHandler = handler.handler;
|
|
176
|
+
return [
|
|
177
|
+
handler.packetName,
|
|
178
|
+
{
|
|
179
|
+
messageType: handler.messageType,
|
|
180
|
+
handler: configuredHandler ??
|
|
181
|
+
adaptRouteSendHandler(this.options.dispatchServices.routeSendHandler(handler.handlerType))
|
|
182
|
+
}
|
|
183
|
+
];
|
|
184
|
+
})),
|
|
173
185
|
filters: this.options.dispatchServices.handlerFilters(),
|
|
174
186
|
unhandled: this.options.registration.dispatch?.unhandled
|
|
175
187
|
}));
|
|
@@ -215,7 +227,6 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
215
227
|
...work.routeLoops.map((loop) => loop.stop()),
|
|
216
228
|
...work.manualTransitions
|
|
217
229
|
]));
|
|
218
|
-
const applicationStopped = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled(work.applicationDispatchQueues.map((queue) => queue.close())));
|
|
219
230
|
const descriptorStopped = work.clientServerLocation === undefined
|
|
220
231
|
? []
|
|
221
232
|
: await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([work.clientServerLocation?.stop(signal)]));
|
|
@@ -228,7 +239,6 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
228
239
|
]));
|
|
229
240
|
const errors = [
|
|
230
241
|
...transportStopped,
|
|
231
|
-
...applicationStopped,
|
|
232
242
|
...descriptorStopped,
|
|
233
243
|
...fanoutDescriptorStopped,
|
|
234
244
|
...cleanup
|
|
@@ -245,7 +255,6 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
245
255
|
this.channelReceiveLoops.length = 0;
|
|
246
256
|
this.subscriberReceiveLoops.length = 0;
|
|
247
257
|
this.routeReceiveLoops.length = 0;
|
|
248
|
-
this.applicationDispatchQueues.clear();
|
|
249
258
|
this.clientServerLocation = undefined;
|
|
250
259
|
this.fanoutLocation = undefined;
|
|
251
260
|
this.taskRunner = undefined;
|
|
@@ -268,7 +277,6 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
268
277
|
const subscriberLoops = [...this.subscriberReceiveLoops].filter((loop) => !manualLoops.has(loop));
|
|
269
278
|
const manualTransitions = manualStates.map((state) => this.drainManualFanoutSubscriberCore(state));
|
|
270
279
|
const routeLoops = [...this.routeReceiveLoops];
|
|
271
|
-
const applicationDispatchQueues = [...this.applicationDispatchQueues.values()];
|
|
272
280
|
const clientServerLocation = this.clientServerLocation;
|
|
273
281
|
const fanoutLocation = this.fanoutLocation;
|
|
274
282
|
const spotRouteBridges = [...this.options.spotRouteBridges.values()];
|
|
@@ -277,20 +285,11 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
277
285
|
subscriberLoops,
|
|
278
286
|
manualTransitions,
|
|
279
287
|
routeLoops,
|
|
280
|
-
applicationDispatchQueues,
|
|
281
288
|
clientServerLocation,
|
|
282
289
|
fanoutLocation,
|
|
283
290
|
spotRouteBridges
|
|
284
291
|
};
|
|
285
292
|
}
|
|
286
|
-
applicationDispatchQueue(channelName) {
|
|
287
|
-
let queue = this.applicationDispatchQueues.get(channelName);
|
|
288
|
-
if (queue === undefined) {
|
|
289
|
-
queue = (0, channel_receive_loops_1.createChannelApplicationDispatchQueue)();
|
|
290
|
-
this.applicationDispatchQueues.set(channelName, queue);
|
|
291
|
-
}
|
|
292
|
-
return queue;
|
|
293
|
-
}
|
|
294
293
|
openOutboundSockets() {
|
|
295
294
|
// The process-local Server is an independent peer source. Location Store
|
|
296
295
|
// discovery may later alias the same admitted identity, but startup and
|
|
@@ -318,20 +317,26 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
318
317
|
dispatchErrors: this.options.dispatchServices.dispatchErrorReporter(taskRunner.errorSink),
|
|
319
318
|
handlers: new Map(channel.requestHandlers?.map((handler) => [
|
|
320
319
|
handler.packetName,
|
|
321
|
-
|
|
322
|
-
|
|
320
|
+
{
|
|
321
|
+
messageType: handler.messageType,
|
|
322
|
+
handler: handler.handler ??
|
|
323
|
+
this.options.dispatchServices.channelRequestHandler(requireChannelHandlerType(handler.handlerType, channelName, handler.packetName))
|
|
324
|
+
}
|
|
323
325
|
])),
|
|
324
326
|
sendHandlers: new Map(channel.sendHandlers?.map((handler) => [
|
|
325
327
|
handler.packetName,
|
|
326
|
-
|
|
327
|
-
|
|
328
|
+
{
|
|
329
|
+
messageType: handler.messageType,
|
|
330
|
+
handler: handler.handler ??
|
|
331
|
+
this.options.dispatchServices.channelSendHandler(requireChannelHandlerType(handler.handlerType, channelName, handler.packetName))
|
|
332
|
+
}
|
|
328
333
|
])),
|
|
329
334
|
filters: this.options.dispatchServices.handlerFilters(),
|
|
330
335
|
unhandled: this.options.registration.dispatch?.unhandled
|
|
331
336
|
});
|
|
332
337
|
const spotRouteBridge = this.createSpotRouteBridgeForRouter(channelName, router);
|
|
333
338
|
const serverPeers = this.options.sockets.clientServerServerPeersForChannel(channelName);
|
|
334
|
-
const loop = new channel_receive_loops_1.ZLinkChannelReceiveLoop(channelName, router, dispatcher, spotRouteBridge, (received, socket) => this.options.sockets.tryHandleClientServerControl(channelName, received, socket, serverPeers), this.options.adapter.createReadablePoller(router), this.options.applicationJobQueue, (error) => taskRunner.errorSink.reportRuntimeTaskException(`channel:${channelName}:dispatch`, error), this.receiveRoundRobin
|
|
339
|
+
const loop = new channel_receive_loops_1.ZLinkChannelReceiveLoop(channelName, router, dispatcher, spotRouteBridge, (received, socket) => this.options.sockets.tryHandleClientServerControl(channelName, received, socket, serverPeers), this.options.adapter.createReadablePoller(router), this.options.applicationJobQueue, (error) => taskRunner.errorSink.reportRuntimeTaskException(`channel:${channelName}:dispatch`, error), this.receiveRoundRobin);
|
|
335
340
|
this.channelReceiveLoops.push(loop);
|
|
336
341
|
tasks.push(taskRunner.run(`channel:${channelName}`, (signal) => loop.run(signal)));
|
|
337
342
|
}
|
|
@@ -350,7 +355,10 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
350
355
|
channelName,
|
|
351
356
|
codecs: this.options.codecs,
|
|
352
357
|
dispatchErrors: this.options.dispatchServices.dispatchErrorReporter(taskRunner.errorSink),
|
|
353
|
-
handlers: new Map(channel.publishHandlers?.map((handler) => [
|
|
358
|
+
handlers: new Map(channel.publishHandlers?.map((handler) => [
|
|
359
|
+
handler.packetName,
|
|
360
|
+
{ handler: handler.handler, messageType: handler.messageType }
|
|
361
|
+
])),
|
|
354
362
|
filters: this.options.dispatchServices.handlerFilters(),
|
|
355
363
|
unhandled: this.options.registration.dispatch?.unhandled,
|
|
356
364
|
metrics: this.options.dispatchServices.metrics()
|
|
@@ -463,7 +471,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
463
471
|
});
|
|
464
472
|
}
|
|
465
473
|
});
|
|
466
|
-
loop = new channel_receive_loops_1.ZLinkSubscriberReceiveLoop(this.options.adapter, subscriber, dispatcher, this.options.applicationJobQueue, (message) => this.options.sockets.handleFanoutInboundResult(connectionId, message, subscriber), this.receiveRoundRobin, (error) => taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${state.channelName}:manual:${state.index}:dispatch`, error)
|
|
474
|
+
loop = new channel_receive_loops_1.ZLinkSubscriberReceiveLoop(this.options.adapter, subscriber, dispatcher, this.options.applicationJobQueue, (message) => this.options.sockets.handleFanoutInboundResult(connectionId, message, subscriber), this.receiveRoundRobin, (error) => taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${state.channelName}:manual:${state.index}:dispatch`, error));
|
|
467
475
|
state.openingToken = undefined;
|
|
468
476
|
state.active = { token, loop };
|
|
469
477
|
this.subscriberReceiveLoops.push(loop);
|
|
@@ -535,12 +543,15 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
535
543
|
channelName,
|
|
536
544
|
codecs: this.options.codecs,
|
|
537
545
|
dispatchErrors: this.options.dispatchServices.dispatchErrorReporter(taskRunner.errorSink),
|
|
538
|
-
handlers: new Map(channel.publishHandlers?.map((handler) => [
|
|
546
|
+
handlers: new Map(channel.publishHandlers?.map((handler) => [
|
|
547
|
+
handler.packetName,
|
|
548
|
+
{ handler: handler.handler, messageType: handler.messageType }
|
|
549
|
+
])),
|
|
539
550
|
filters: this.options.dispatchServices.handlerFilters(),
|
|
540
551
|
unhandled: this.options.registration.dispatch?.unhandled,
|
|
541
552
|
metrics: this.options.dispatchServices.metrics()
|
|
542
553
|
});
|
|
543
|
-
const loop = new channel_receive_loops_1.ZLinkSubscriberReceiveLoop(this.options.adapter, subscriber, dispatcher, this.options.applicationJobQueue, (message) => this.options.sockets.handleFanoutInboundResult(connectionId, message, subscriber), undefined, (error) => taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${channelName}:automatic:${connectionId}:dispatch`, error)
|
|
554
|
+
const loop = new channel_receive_loops_1.ZLinkSubscriberReceiveLoop(this.options.adapter, subscriber, dispatcher, this.options.applicationJobQueue, (message) => this.options.sockets.handleFanoutInboundResult(connectionId, message, subscriber), undefined, (error) => taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${channelName}:automatic:${connectionId}:dispatch`, error));
|
|
544
555
|
this.subscriberReceiveLoops.push(loop);
|
|
545
556
|
void taskRunner.run(`subscriber:${channelName}:automatic:${connectionId}`, (signal) => loop.run(signal));
|
|
546
557
|
return async () => {
|
|
@@ -586,7 +597,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
586
597
|
unhandled: this.options.registration.dispatch?.unhandled,
|
|
587
598
|
spotRouteBridge
|
|
588
599
|
});
|
|
589
|
-
const loop = new channel_receive_loops_1.ZLinkRouteReceiveLoop(router, dispatcher, this.options.adapter.createReadablePoller(router), this.options.applicationJobQueue, this.receiveRoundRobin, (error) => taskRunner.errorSink.reportRuntimeTaskException(`route:${routeChannel.routerChannelId}:dispatch`, error)
|
|
600
|
+
const loop = new channel_receive_loops_1.ZLinkRouteReceiveLoop(router, dispatcher, this.options.adapter.createReadablePoller(router), this.options.applicationJobQueue, this.receiveRoundRobin, (error) => taskRunner.errorSink.reportRuntimeTaskException(`route:${routeChannel.routerChannelId}:dispatch`, error));
|
|
590
601
|
this.routeReceiveLoops.push(loop);
|
|
591
602
|
tasks.push(taskRunner.run(`route:${routeChannel.routerChannelId}`, (signal) => loop.run(signal)));
|
|
592
603
|
}
|
|
@@ -607,9 +618,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
607
618
|
}
|
|
608
619
|
exports.ZLinkChannelRuntimeLifecycle = ZLinkChannelRuntimeLifecycle;
|
|
609
620
|
function adaptRouteRequestHandler(handler) {
|
|
610
|
-
return {
|
|
611
|
-
handle: async (payload, context) => handler.handle(payload, context)
|
|
612
|
-
};
|
|
621
|
+
return { handle: async (payload, context) => handler.handle(payload, context) };
|
|
613
622
|
}
|
|
614
623
|
function adaptRouteSendHandler(handler) {
|
|
615
624
|
return {
|