@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
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkMeshDispatchPump = void 0;
|
|
4
|
-
const node_async_hooks_1 = require("node:async_hooks");
|
|
5
4
|
const abort_1 = require("../abort");
|
|
6
5
|
const node_os_1 = require("node:os");
|
|
7
6
|
const application_job_queue_scope_1 = require("../application-jobs/application-job-queue-scope");
|
|
@@ -17,11 +16,6 @@ const MESH_DISPATCH_YIELD_INTERVAL_MS = 2;
|
|
|
17
16
|
const MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET = 4;
|
|
18
17
|
const MESH_DISPATCH_RECEIVE_CAPACITY = 64;
|
|
19
18
|
const MESH_DISPATCH_MAX_APPLICATION_WORKERS = Math.max(2, (0, node_os_1.availableParallelism)());
|
|
20
|
-
// Captured while the runtime module is loaded, before any application owner
|
|
21
|
-
// exists. A ready callback may run inside a Spot turn; the shared Mesh pump
|
|
22
|
-
// must enter like an independent receive-loop task, without inheriting that
|
|
23
|
-
// owner's AsyncLocalStorage identity.
|
|
24
|
-
const detachedMeshDispatchScope = node_async_hooks_1.AsyncLocalStorage.snapshot();
|
|
25
19
|
class ZLinkMeshDispatchPump {
|
|
26
20
|
node;
|
|
27
21
|
options;
|
|
@@ -29,7 +23,7 @@ class ZLinkMeshDispatchPump {
|
|
|
29
23
|
infrastructureScheduled = false;
|
|
30
24
|
disposed = false;
|
|
31
25
|
activeDrains = new Set();
|
|
32
|
-
idleApplicationWorkers =
|
|
26
|
+
idleApplicationWorkers = [];
|
|
33
27
|
applicationWorkerCount = 0;
|
|
34
28
|
capacityStop = new AbortController();
|
|
35
29
|
recordsSinceYield = 0;
|
|
@@ -62,7 +56,7 @@ class ZLinkMeshDispatchPump {
|
|
|
62
56
|
this.pendingDomains = service_runtime_contracts_1.ReadyDomain.None;
|
|
63
57
|
for (const wake of this.idleApplicationWorkers)
|
|
64
58
|
wake();
|
|
65
|
-
this.idleApplicationWorkers.
|
|
59
|
+
this.idleApplicationWorkers.length = 0;
|
|
66
60
|
while (this.activeDrains.size > 0) {
|
|
67
61
|
await (0, abort_1.awaitWithAbort)(Promise.all([...this.activeDrains]), signal);
|
|
68
62
|
}
|
|
@@ -83,19 +77,21 @@ class ZLinkMeshDispatchPump {
|
|
|
83
77
|
this.scheduleInfrastructure();
|
|
84
78
|
if (startApplication) {
|
|
85
79
|
if ((domains & service_runtime_contracts_1.ReadyDomain.Infrastructure) !== 0) {
|
|
86
|
-
|
|
80
|
+
this.scheduleApplicationWorker();
|
|
87
81
|
}
|
|
88
82
|
else {
|
|
89
83
|
this.wakeApplicationWorker();
|
|
90
84
|
}
|
|
91
85
|
}
|
|
92
86
|
}
|
|
87
|
+
scheduleApplicationWorker() {
|
|
88
|
+
setImmediate(() => this.wakeApplicationWorker());
|
|
89
|
+
}
|
|
93
90
|
wakeApplicationWorker() {
|
|
94
91
|
if (this.disposed || (this.pendingDomains & service_runtime_contracts_1.ReadyDomain.Application) === 0)
|
|
95
92
|
return;
|
|
96
|
-
const idle = this.idleApplicationWorkers.
|
|
93
|
+
const idle = this.idleApplicationWorkers.shift();
|
|
97
94
|
if (idle !== undefined) {
|
|
98
|
-
this.idleApplicationWorkers.delete(idle);
|
|
99
95
|
this.pendingDomains &= ~service_runtime_contracts_1.ReadyDomain.Application;
|
|
100
96
|
idle();
|
|
101
97
|
return;
|
|
@@ -107,58 +103,12 @@ class ZLinkMeshDispatchPump {
|
|
|
107
103
|
startApplicationWorker() {
|
|
108
104
|
this.applicationWorkerCount += 1;
|
|
109
105
|
let worker;
|
|
110
|
-
worker = detachedMeshDispatchScope(() => (0, execution_1.runZLinkExecutionArea)('application', () => this.runApplicationWorker())).finally(() => {
|
|
106
|
+
worker = (0, execution_1.detachedMeshDispatchScope)(() => (0, execution_1.runZLinkExecutionArea)('application', () => this.runApplicationWorker())).finally(() => {
|
|
111
107
|
this.applicationWorkerCount -= 1;
|
|
112
108
|
this.activeDrains.delete(worker);
|
|
113
109
|
});
|
|
114
110
|
this.activeDrains.add(worker);
|
|
115
111
|
}
|
|
116
|
-
async runApplicationWorker() {
|
|
117
|
-
// A worker claims one owner at a time so a suspended handler cannot hold
|
|
118
|
-
// unrelated owners. Each owner may supply up to 64 pre-admitted records.
|
|
119
|
-
const readyBatch = this.node.createReadyBatch(1);
|
|
120
|
-
const receiveBatch = this.node.createReceiveBatch(MESH_DISPATCH_RECEIVE_CAPACITY, this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY);
|
|
121
|
-
try {
|
|
122
|
-
for (;;) {
|
|
123
|
-
await this.waitForApplicationReady();
|
|
124
|
-
this.beginDrain();
|
|
125
|
-
try {
|
|
126
|
-
while (!this.disposed) {
|
|
127
|
-
readyBatch.reset();
|
|
128
|
-
const drained = this.node.drainReady(service_runtime_contracts_1.ReadyDomain.Application, readyBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
|
|
129
|
-
if (!drained.ok || drained.records.length === 0)
|
|
130
|
-
break;
|
|
131
|
-
if (drained.hasResidue)
|
|
132
|
-
this.markReady(service_runtime_contracts_1.ReadyDomain.Application);
|
|
133
|
-
for (let index = 0; index < drained.records.length; index += 1) {
|
|
134
|
-
const claim = readyBatch.takeClaim(index);
|
|
135
|
-
// Raw ingress already attached one host permit to each record.
|
|
136
|
-
// A claim reserving admission may receive only that permit's record.
|
|
137
|
-
await this.drainClaim(service_runtime_contracts_1.ReadyDomain.Application, drained.records[index], claim, receiveBatch);
|
|
138
|
-
}
|
|
139
|
-
// Empty ready claims count toward the shared pump budget too.
|
|
140
|
-
this.recordsSinceYield += 1;
|
|
141
|
-
const yieldTurn = this.yieldIfNeeded();
|
|
142
|
-
if (yieldTurn !== undefined)
|
|
143
|
-
await yieldTurn;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
this.reportDispatchError(error);
|
|
148
|
-
}
|
|
149
|
-
finally {
|
|
150
|
-
readyBatch.reset();
|
|
151
|
-
this.draining -= 1;
|
|
152
|
-
}
|
|
153
|
-
if (this.disposed)
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
finally {
|
|
158
|
-
receiveBatch.close();
|
|
159
|
-
readyBatch.close();
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
112
|
waitForApplicationReady() {
|
|
163
113
|
if (this.disposed)
|
|
164
114
|
return Promise.resolve();
|
|
@@ -166,16 +116,38 @@ class ZLinkMeshDispatchPump {
|
|
|
166
116
|
this.pendingDomains &= ~service_runtime_contracts_1.ReadyDomain.Application;
|
|
167
117
|
return Promise.resolve();
|
|
168
118
|
}
|
|
169
|
-
return new Promise((resolve) => this.idleApplicationWorkers.
|
|
119
|
+
return new Promise((resolve) => this.idleApplicationWorkers.push(resolve));
|
|
170
120
|
}
|
|
171
121
|
/**
|
|
172
122
|
* Starts one record in this worker's turn; a permit's scope covers the
|
|
173
|
-
* synchronous dispatch. Returns `false` when
|
|
174
|
-
* reported), `true` when
|
|
175
|
-
*
|
|
123
|
+
* synchronous dispatch. Returns `false` when preparation rejects the record,
|
|
124
|
+
* shutdown starts, or dispatch throws (already reported), `true` when dispatch
|
|
125
|
+
* returns synchronously, or the pending preparation/handler completion,
|
|
126
|
+
* which the draining turn awaits itself before
|
|
176
127
|
* {@link finishRecord}.
|
|
177
128
|
*/
|
|
178
129
|
dispatchRecord(owner, record, permit) {
|
|
130
|
+
if (record.prepareDispatch === undefined)
|
|
131
|
+
return this.invokeRecord(owner, record, permit);
|
|
132
|
+
try {
|
|
133
|
+
const preparation = record.prepareDispatch(this.capacityStop.signal);
|
|
134
|
+
return preparation instanceof Promise
|
|
135
|
+
? this.continuePreparingRecord(owner, record, permit, preparation)
|
|
136
|
+
: this.invokeRecord(owner, record, permit, preparation);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
this.failRecord(error, record, permit);
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
continuePreparingRecord(owner, record, permit, preparation) {
|
|
144
|
+
return preparation.then((accepted) => this.invokeRecord(owner, record, permit, accepted));
|
|
145
|
+
}
|
|
146
|
+
invokeRecord(owner, record, permit, accepted = true) {
|
|
147
|
+
if (!accepted || this.capacityStop.signal.aborted) {
|
|
148
|
+
(0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
179
151
|
const previous = permit === undefined ? undefined : (0, application_job_queue_scope_1.enterApplicationJobPermitScope)(permit);
|
|
180
152
|
let result;
|
|
181
153
|
try {
|
|
@@ -208,6 +180,9 @@ class ZLinkMeshDispatchPump {
|
|
|
208
180
|
(0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
|
|
209
181
|
return;
|
|
210
182
|
}
|
|
183
|
+
return this.finishPendingRecord(result, record, permit);
|
|
184
|
+
}
|
|
185
|
+
finishPendingRecord(result, record, permit) {
|
|
211
186
|
return Promise.resolve(result).then(() => (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit), (error) => {
|
|
212
187
|
this.reportDispatchError(error, meshDispatchFailureContext(record));
|
|
213
188
|
(0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
|
|
@@ -229,7 +204,7 @@ class ZLinkMeshDispatchPump {
|
|
|
229
204
|
}
|
|
230
205
|
this.infrastructureScheduled = true;
|
|
231
206
|
const drain = (startTurn ?? this.yieldIfNeeded() ?? Promise.resolve())
|
|
232
|
-
.then(() => detachedMeshDispatchScope(() => (0, execution_1.runZLinkExecutionArea)('infrastructure', () => this.drainInfrastructure())))
|
|
207
|
+
.then(() => (0, execution_1.detachedMeshDispatchScope)(() => (0, execution_1.runZLinkExecutionArea)('infrastructure', () => this.drainInfrastructure())))
|
|
233
208
|
.catch((error) => this.reportDispatchError(error));
|
|
234
209
|
this.activeDrains.add(drain);
|
|
235
210
|
void drain.finally(() => {
|
|
@@ -249,7 +224,7 @@ class ZLinkMeshDispatchPump {
|
|
|
249
224
|
}
|
|
250
225
|
this.pendingDomains &= ~service_runtime_contracts_1.ReadyDomain.Infrastructure;
|
|
251
226
|
if ((this.pendingDomains & service_runtime_contracts_1.ReadyDomain.Application) !== 0) {
|
|
252
|
-
|
|
227
|
+
this.scheduleApplicationWorker();
|
|
253
228
|
}
|
|
254
229
|
const lifecycleBudgetExhausted = await this.drainDomain(readyBatch);
|
|
255
230
|
if (lifecycleBudgetExhausted) {
|
|
@@ -282,7 +257,7 @@ class ZLinkMeshDispatchPump {
|
|
|
282
257
|
claimsDrained += 1;
|
|
283
258
|
const owner = drained.records[index];
|
|
284
259
|
this.beginDrain();
|
|
285
|
-
const drain = this.drainClaim(service_runtime_contracts_1.ReadyDomain.Infrastructure, owner, claim
|
|
260
|
+
const drain = this.drainClaim(service_runtime_contracts_1.ReadyDomain.Infrastructure, owner, claim);
|
|
286
261
|
this.activeDrains.add(drain);
|
|
287
262
|
void drain.finally(() => {
|
|
288
263
|
this.draining -= 1;
|
|
@@ -318,99 +293,217 @@ class ZLinkMeshDispatchPump {
|
|
|
318
293
|
}
|
|
319
294
|
this.draining += 1;
|
|
320
295
|
}
|
|
321
|
-
/**
|
|
296
|
+
/** Each worker owns claim continuations for its entire lifetime. */
|
|
297
|
+
async runApplicationWorker() {
|
|
298
|
+
const readyBatch = this.node.createReadyBatch(1);
|
|
299
|
+
const receiveBatch = this.node.createReceiveBatch(MESH_DISPATCH_RECEIVE_CAPACITY, this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY);
|
|
300
|
+
const claimDrain = this.createClaimDrain(receiveBatch);
|
|
301
|
+
try {
|
|
302
|
+
for (;;) {
|
|
303
|
+
// This boundary also keeps the first handler off the receive stack.
|
|
304
|
+
await this.waitForApplicationReady();
|
|
305
|
+
this.beginDrain();
|
|
306
|
+
try {
|
|
307
|
+
while (!this.disposed) {
|
|
308
|
+
readyBatch.reset();
|
|
309
|
+
const drained = this.node.drainReady(service_runtime_contracts_1.ReadyDomain.Application, readyBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
|
|
310
|
+
if (!drained.ok || drained.records.length === 0)
|
|
311
|
+
break;
|
|
312
|
+
if (drained.hasResidue)
|
|
313
|
+
this.markReady(service_runtime_contracts_1.ReadyDomain.Application);
|
|
314
|
+
const pending = this.dispatchClaim(service_runtime_contracts_1.ReadyDomain.Application, drained.records[0], readyBatch.takeClaim(0), claimDrain);
|
|
315
|
+
if (pending !== undefined)
|
|
316
|
+
await pending;
|
|
317
|
+
// Returning a claim remains an asynchronous worker boundary without
|
|
318
|
+
// allocating a separate async drain task for a synchronous claim.
|
|
319
|
+
await this.yieldIfNeeded();
|
|
320
|
+
// Empty ready claims count toward the shared pump budget too.
|
|
321
|
+
this.recordsSinceYield += 1;
|
|
322
|
+
const nextTurn = this.yieldIfNeeded();
|
|
323
|
+
if (nextTurn !== undefined)
|
|
324
|
+
await nextTurn;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
this.reportDispatchError(error);
|
|
329
|
+
}
|
|
330
|
+
finally {
|
|
331
|
+
readyBatch.reset();
|
|
332
|
+
this.draining -= 1;
|
|
333
|
+
}
|
|
334
|
+
if (this.disposed)
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
finally {
|
|
339
|
+
receiveBatch.close();
|
|
340
|
+
readyBatch.close();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
322
343
|
async drainClaim(domain, owner, claim, receiveBatch) {
|
|
323
|
-
let ownerReceiveBatch = receiveBatch;
|
|
324
344
|
try {
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
345
|
+
const pending = this.dispatchClaim(domain, owner, claim, this.createClaimDrain(receiveBatch));
|
|
346
|
+
if (pending !== undefined)
|
|
347
|
+
await pending;
|
|
348
|
+
await this.yieldIfNeeded();
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
this.reportDispatchError(error);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
createClaimDrain(suppliedReceiveBatch) {
|
|
355
|
+
const state = {
|
|
356
|
+
suppliedReceiveBatch,
|
|
357
|
+
receiveBatch: suppliedReceiveBatch,
|
|
358
|
+
domain: service_runtime_contracts_1.ReadyDomain.None,
|
|
359
|
+
owner: undefined,
|
|
360
|
+
claim: undefined,
|
|
361
|
+
claimPermit: undefined,
|
|
362
|
+
records: undefined,
|
|
363
|
+
index: 0,
|
|
364
|
+
receive: (permit) => this.receiveClaim(state, permit),
|
|
365
|
+
dispatchRecords: () => this.dispatchClaimRecords(state),
|
|
366
|
+
finish: () => this.finishClaim(state)
|
|
367
|
+
};
|
|
368
|
+
return state;
|
|
369
|
+
}
|
|
370
|
+
/** A synchronous claim finishes without an async wrapper or a Promise. */
|
|
371
|
+
dispatchClaim(domain, owner, claim, state = this.createClaimDrain()) {
|
|
372
|
+
state.domain = domain;
|
|
373
|
+
state.owner = owner;
|
|
374
|
+
state.claim = claim;
|
|
375
|
+
state.index = 0;
|
|
376
|
+
let pending;
|
|
377
|
+
try {
|
|
378
|
+
state.receiveBatch ??= this.node.createReceiveBatch(MESH_DISPATCH_RECEIVE_CAPACITY, this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY);
|
|
379
|
+
pending =
|
|
380
|
+
owner.terminalCompletion === true ||
|
|
381
|
+
owner.ordinaryIngressPreAdmitted === true ||
|
|
382
|
+
domain === service_runtime_contracts_1.ReadyDomain.Infrastructure
|
|
383
|
+
? state.receive()
|
|
384
|
+
: this.acquirePermit().then(state.receive);
|
|
385
|
+
if (pending !== undefined)
|
|
386
|
+
return pending.finally(state.finish);
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
finally {
|
|
390
|
+
if (pending === undefined)
|
|
391
|
+
state.finish();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
receiveClaim(state, permit) {
|
|
395
|
+
state.claimPermit = permit;
|
|
396
|
+
if (this.capacityStop.signal.aborted)
|
|
397
|
+
return undefined;
|
|
398
|
+
const capacity = state.owner.ordinaryIngressPreAdmitted === true ? MESH_DISPATCH_RECEIVE_CAPACITY : 1;
|
|
399
|
+
state.receiveBatch.reset(capacity);
|
|
400
|
+
const received = state.claim.recvBatch(state.receiveBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
|
|
401
|
+
if (!received.ok)
|
|
402
|
+
return undefined;
|
|
403
|
+
state.records = received.records;
|
|
404
|
+
return this.dispatchClaimRecords(state);
|
|
405
|
+
}
|
|
406
|
+
dispatchClaimRecords(state) {
|
|
407
|
+
const records = state.records;
|
|
408
|
+
const owner = state.owner;
|
|
409
|
+
while (state.index < records.length && !this.disposed) {
|
|
410
|
+
const record = records[state.index++];
|
|
411
|
+
const permit = record.applicationJobPermit ?? state.claimPermit;
|
|
412
|
+
if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
|
|
413
|
+
throw new Error('Pre-admitted raw ingress record lost its Application Job Queue permit.');
|
|
414
|
+
}
|
|
415
|
+
this.recordsSinceYield += 1;
|
|
416
|
+
if (permit !== undefined) {
|
|
417
|
+
if (state.domain === service_runtime_contracts_1.ReadyDomain.Application && record.applicationJobPermit === undefined)
|
|
418
|
+
permit.markApplicationQueued();
|
|
419
|
+
// Only reservations not transferred to a record remain claim-owned.
|
|
420
|
+
if (permit === state.claimPermit)
|
|
421
|
+
state.claimPermit = undefined;
|
|
422
|
+
}
|
|
423
|
+
const dispatched = this.dispatchRecord(owner, record, permit);
|
|
424
|
+
if (dispatched === false) {
|
|
425
|
+
if (isNodeOrChannelRecord(record))
|
|
426
|
+
this.releaseRecord(record);
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
let terminal;
|
|
430
|
+
if (dispatched === true) {
|
|
431
|
+
const finished = this.finishRecord(record, permit);
|
|
432
|
+
if (finished === undefined) {
|
|
433
|
+
if (isNodeOrChannelRecord(record))
|
|
434
|
+
this.releaseRecord(record);
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
terminal = finished;
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
terminal = this.continuePendingClaim(dispatched, record, permit);
|
|
441
|
+
}
|
|
442
|
+
if (isNodeOrChannelRecord(record)) {
|
|
443
|
+
// Return the receive claim for the next batch; the existing terminal observer owns record lifetime.
|
|
444
|
+
this.observeRecordTerminal(terminal, record);
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
return terminal.then(state.dispatchRecords);
|
|
448
|
+
}
|
|
449
|
+
return undefined;
|
|
450
|
+
}
|
|
451
|
+
observeRecordTerminal(terminal, record) {
|
|
452
|
+
const tracked = terminal.finally(() => this.releaseRecord(record));
|
|
453
|
+
this.activeDrains.add(tracked);
|
|
454
|
+
void tracked.then(() => this.activeDrains.delete(tracked), (error) => {
|
|
455
|
+
this.activeDrains.delete(tracked);
|
|
456
|
+
this.reportDispatchError(error, meshDispatchFailureContext(record));
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
continuePendingClaim(dispatched, record, permit) {
|
|
460
|
+
return Promise.resolve(dispatched).then((accepted) => {
|
|
461
|
+
if (accepted !== false)
|
|
462
|
+
return this.finishRecord(record, permit);
|
|
463
|
+
}, (error) => this.failRecord(error, record, permit));
|
|
464
|
+
}
|
|
465
|
+
releaseRecord(record) {
|
|
466
|
+
for (let index = 0; index < record.parts.length; index++)
|
|
467
|
+
record.parts[index].close();
|
|
468
|
+
record.releaseRetainedIngress?.();
|
|
469
|
+
}
|
|
470
|
+
finishClaim(state) {
|
|
471
|
+
try {
|
|
332
472
|
try {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
break;
|
|
343
|
-
const permit = record.applicationJobPermit ?? claimPermit;
|
|
344
|
-
if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
|
|
345
|
-
throw new Error('Pre-admitted raw ingress record lost its Application Job Queue permit.');
|
|
346
|
-
}
|
|
347
|
-
this.recordsSinceYield += 1;
|
|
348
|
-
if (permit !== undefined) {
|
|
349
|
-
if (domain === service_runtime_contracts_1.ReadyDomain.Application && record.applicationJobPermit === undefined)
|
|
350
|
-
permit.markApplicationQueued();
|
|
351
|
-
// The scope now owns this reservation, including failure
|
|
352
|
-
// and detached handler handoff. Only unused permits remain
|
|
353
|
-
// owned by the receive attempt's finally block.
|
|
354
|
-
if (permit === claimPermit)
|
|
355
|
-
claimPermit = undefined;
|
|
356
|
-
}
|
|
357
|
-
// The record's terminal and the permit turn release follow the
|
|
358
|
-
// handler in this turn's own continuation.
|
|
359
|
-
if (record.prepareDispatch !== undefined) {
|
|
360
|
-
try {
|
|
361
|
-
const stopSignal = this.capacityStop.signal;
|
|
362
|
-
const preparation = record.prepareDispatch(stopSignal);
|
|
363
|
-
const accepted = preparation instanceof Promise ? await preparation : preparation;
|
|
364
|
-
if (!accepted || stopSignal.aborted) {
|
|
365
|
-
(0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
|
|
366
|
-
continue;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
catch (error) {
|
|
370
|
-
this.failRecord(error, record, permit);
|
|
371
|
-
continue;
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
const dispatched = this.dispatchRecord(owner, record, permit);
|
|
375
|
-
if (dispatched === false)
|
|
376
|
-
continue;
|
|
377
|
-
if (dispatched !== true) {
|
|
378
|
-
try {
|
|
379
|
-
await dispatched;
|
|
380
|
-
}
|
|
381
|
-
catch (error) {
|
|
382
|
-
this.failRecord(error, record, permit);
|
|
383
|
-
continue;
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
const finished = this.finishRecord(record, permit);
|
|
387
|
-
if (finished !== undefined)
|
|
388
|
-
await finished;
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
finally {
|
|
392
|
-
// Batch ownership includes records whose dispatch never began,
|
|
393
|
-
// including on failure or shutdown in the middle of the batch.
|
|
394
|
-
for (const record of received.records) {
|
|
395
|
-
for (const part of record.parts)
|
|
396
|
-
part.close();
|
|
397
|
-
record.releaseRetainedIngress?.();
|
|
398
|
-
}
|
|
473
|
+
// Ownership includes records whose dispatch never began on failure or shutdown.
|
|
474
|
+
const records = state.records;
|
|
475
|
+
if (records !== undefined) {
|
|
476
|
+
for (let recordIndex = 0; recordIndex < records.length; recordIndex += 1) {
|
|
477
|
+
const record = records[recordIndex];
|
|
478
|
+
// Started Node and Channel records are cleaned up at their own terminals.
|
|
479
|
+
if (recordIndex < state.index && isNodeOrChannelRecord(record))
|
|
480
|
+
continue;
|
|
481
|
+
this.releaseRecord(record);
|
|
399
482
|
}
|
|
400
483
|
}
|
|
401
484
|
}
|
|
402
485
|
finally {
|
|
403
|
-
claimPermit?.releaseAfterInternalProcessing();
|
|
486
|
+
state.claimPermit?.releaseAfterInternalProcessing();
|
|
404
487
|
}
|
|
405
488
|
}
|
|
406
489
|
finally {
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
490
|
+
try {
|
|
491
|
+
state.claim.release();
|
|
492
|
+
}
|
|
493
|
+
finally {
|
|
494
|
+
try {
|
|
495
|
+
if (state.suppliedReceiveBatch === undefined)
|
|
496
|
+
state.receiveBatch?.close();
|
|
497
|
+
}
|
|
498
|
+
finally {
|
|
499
|
+
// An idle worker must not retain the previous claim's payload or owner.
|
|
500
|
+
state.records = undefined;
|
|
501
|
+
state.owner = undefined;
|
|
502
|
+
state.claim = undefined;
|
|
503
|
+
state.claimPermit = undefined;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
410
506
|
}
|
|
411
|
-
const yieldTurn = this.yieldIfNeeded();
|
|
412
|
-
if (yieldTurn !== undefined)
|
|
413
|
-
await yieldTurn;
|
|
414
507
|
}
|
|
415
508
|
/**
|
|
416
509
|
* The batch budget is shared by every drain of this pump, so once it is
|
|
@@ -474,3 +567,9 @@ function yieldToEventLoop() {
|
|
|
474
567
|
function yieldToTimers() {
|
|
475
568
|
return new Promise((resolve) => setTimeout(resolve, 0));
|
|
476
569
|
}
|
|
570
|
+
function isNodeOrChannelRecord(record) {
|
|
571
|
+
return (record.kind === service_runtime_contracts_1.ReceiveKind.NodeSend ||
|
|
572
|
+
record.kind === service_runtime_contracts_1.ReceiveKind.NodeRequest ||
|
|
573
|
+
record.kind === service_runtime_contracts_1.ReceiveKind.ChannelSend ||
|
|
574
|
+
record.kind === service_runtime_contracts_1.ReceiveKind.ChannelRequest);
|
|
575
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { PendingOperation } from '../../foundation/operation-registry';
|
|
1
2
|
export type ZLinkBindingModule = typeof import('@zlink-systems/zlink');
|
|
2
3
|
export declare const zlink: ZLinkBindingModule;
|
|
3
4
|
export type ZLinkBindingOperation = {
|
|
@@ -40,8 +41,8 @@ export declare function submitBindingReply(operation: ZLinkBindingReplyOperation
|
|
|
40
41
|
export declare function submitBindingAsyncSend(operation: ZLinkBindingAsyncSendOperation, payload: unknown): Promise<void>;
|
|
41
42
|
export declare function submitBindingSend(operation: ZLinkBindingAsyncSendOperation, payload: unknown): import('../raw-binding-port').ZLinkRawSendSubmission;
|
|
42
43
|
export declare function submitBindingSyncSend(operation: ZLinkBindingAsyncSendOperation, payload: unknown): void;
|
|
43
|
-
export declare function submitBindingRequest(operation: ZLinkBindingRequestOperation, payload: unknown, timeoutMs: number | undefined, recordReceived
|
|
44
|
-
export declare function bindingRequestReply(submission: import('@zlink-systems/zlink').RequestSubmission,
|
|
44
|
+
export declare function submitBindingRequest(operation: ZLinkBindingRequestOperation, payload: unknown, timeoutMs: number | undefined, recordReceived: (() => void) | undefined, onAdmitted: (() => void) | undefined, pending: PendingOperation<unknown>, receiver: import('../../foundation/operation-registry').OperationObserver<unknown, unknown>): void;
|
|
45
|
+
export declare function bindingRequestReply(submission: import('@zlink-systems/zlink').RequestSubmission, receiver: import('../../foundation/operation-registry').OperationObserver<unknown, unknown>, pending: PendingOperation<unknown>, recordReceived?: () => void, onAdmitted?: () => void): void;
|
|
45
46
|
export declare function closeBindingReply(replies: readonly import('@zlink-systems/zlink').Message[]): void;
|
|
46
47
|
/**
|
|
47
48
|
* Closes a binding handle once. An already closed or terminated handle counts as
|
|
@@ -126,8 +126,7 @@ function submitBindingSyncSend(operation, payload) {
|
|
|
126
126
|
throw translateBindingResultError(error);
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
|
-
|
|
130
|
-
const deadlineMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
|
|
129
|
+
function submitBindingRequest(operation, payload, timeoutMs, recordReceived, onAdmitted, pending, receiver) {
|
|
131
130
|
try {
|
|
132
131
|
let current;
|
|
133
132
|
if (Array.isArray(payload)) {
|
|
@@ -142,34 +141,43 @@ async function submitBindingRequest(operation, payload, timeoutMs, recordReceive
|
|
|
142
141
|
}
|
|
143
142
|
current ??= operation.message(Buffer.alloc(0));
|
|
144
143
|
if (timeoutMs !== undefined) {
|
|
145
|
-
current = current.timeout(timeoutMs);
|
|
144
|
+
current = current.timeout(Math.min(timeoutMs, (0, request_deadline_1.remainingRequestTimeout)('Request', pending.deadlineMs) ?? timeoutMs));
|
|
146
145
|
}
|
|
147
|
-
|
|
146
|
+
bindingRequestReply(current.submit(), receiver, pending, recordReceived, onAdmitted);
|
|
148
147
|
}
|
|
149
148
|
catch (error) {
|
|
150
|
-
|
|
149
|
+
receiver.operationFailed(pending.id, translateBindingResultError(error), undefined);
|
|
151
150
|
}
|
|
152
151
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
152
|
+
function bindingRequestReply(submission, receiver, pending, recordReceived, onAdmitted) {
|
|
153
|
+
// The physical receiver remains reachable independently of admission failure.
|
|
154
|
+
void submission.reply.then((replies) => {
|
|
156
155
|
try {
|
|
157
|
-
const [, replies] = await (0, request_deadline_1.waitRequestReply)(Promise.all([submission.admitted.then(() => onAdmitted?.()), reply]), 'Request', deadlineMs);
|
|
158
156
|
recordReceived?.();
|
|
159
|
-
return replies;
|
|
160
157
|
}
|
|
161
158
|
catch (error) {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
159
|
+
receiver.operationFailed(pending.id, error, undefined);
|
|
160
|
+
}
|
|
161
|
+
receiver.operationCompleted(pending.id, replies, undefined);
|
|
162
|
+
}, (error) => receiver.operationFailed(pending.id, translateBindingResultError(error), undefined));
|
|
163
|
+
if (submission.result === runtime_values_1.SubmitResult.Backpressured) {
|
|
164
|
+
void submission.admitted.then(() => {
|
|
165
|
+
try {
|
|
166
|
+
onAdmitted?.();
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
receiver.operationFailed(pending.id, error, undefined);
|
|
170
|
+
}
|
|
171
|
+
}, (error) => receiver.operationFailed(pending.id, error, undefined));
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
try {
|
|
175
|
+
onAdmitted?.();
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
receiver.operationFailed(pending.id, error, undefined);
|
|
167
179
|
}
|
|
168
180
|
}
|
|
169
|
-
onAdmitted?.();
|
|
170
|
-
const replies = await reply;
|
|
171
|
-
recordReceived?.();
|
|
172
|
-
return replies;
|
|
173
181
|
}
|
|
174
182
|
function closeBindingReply(replies) {
|
|
175
183
|
for (const reply of replies)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { RequestRuntime } from '../../foundation/request-runtime';
|
|
2
|
+
import { type ZLinkRequestResult } from '../../messaging/request-result';
|
|
1
3
|
import type { DealerSocket, Message, PubSocket } from '@zlink-systems/zlink';
|
|
2
4
|
import { type ZLinkSubmitResult } from '../../messaging/submission-result';
|
|
3
5
|
import type { ZLinkChannelClientTransport } from '../../channels/channel-transports';
|
|
@@ -5,9 +7,10 @@ import type { ZLinkChannelClientTransport } from '../../channels/channel-transpo
|
|
|
5
7
|
export declare class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTransport {
|
|
6
8
|
private readonly dealer;
|
|
7
9
|
private readonly publisher?;
|
|
8
|
-
|
|
10
|
+
private readonly requests;
|
|
11
|
+
constructor(dealer: DealerSocket, publisher?: PubSocket | undefined, requests?: RequestRuntime);
|
|
9
12
|
send(channelName: string, packetName: string | undefined, message: Message, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
|
|
10
|
-
request<TReply>(channelName: string, packetName: string | undefined, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void):
|
|
13
|
+
request<TReply>(channelName: string, packetName: string | undefined, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): ZLinkRequestResult<TReply>;
|
|
11
14
|
tryPublish(channelName: string, topic: string, packetName: string | undefined, event: Message, metadata?: ReadonlyMap<string, string>): ZLinkSubmitResult;
|
|
12
15
|
publish(channelName: string, topic: string, packetName: string | undefined, event: Message, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
|
|
13
16
|
}
|