@zlink-systems/framework 0.30.0 → 0.30.2
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/LICENSE +150 -68
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
- package/dist/contracts/Channels/Calls.d.ts +2 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
- package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
- package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
- package/dist/contracts/Common/encoded-payload-storage.js +5 -2
- package/dist/contracts/Configuration/Builders.d.ts +1 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
- package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
- package/dist/contracts/Handlers/Attributes.d.ts +5 -13
- package/dist/contracts/Handlers/Attributes.js +7 -11
- package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
- package/dist/contracts/Handlers/JsonContract.js +4 -153
- package/dist/contracts/Locations/Rows.d.ts +2 -0
- package/dist/contracts/Spots/Contracts.d.ts +6 -1
- package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
- package/dist/nest-integration.d.ts +1 -1
- package/dist/nest-integration.js +2 -1
- package/dist/runtime/abort.d.ts +5 -0
- package/dist/runtime/abort.js +10 -0
- package/dist/runtime/actors/actor-authority-publication.js +3 -2
- package/dist/runtime/actors/actor-client.d.ts +1 -2
- package/dist/runtime/actors/actor-client.js +52 -57
- package/dist/runtime/actors/actor-context.d.ts +2 -0
- package/dist/runtime/actors/actor-context.js +46 -9
- package/dist/runtime/actors/actor-handoff.d.ts +8 -4
- package/dist/runtime/actors/actor-handoff.js +219 -92
- package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
- package/dist/runtime/actors/actor-local-native-join.js +13 -12
- package/dist/runtime/actors/actor-mailbox.js +27 -1
- package/dist/runtime/actors/actor-remote-joiner.js +3 -1
- package/dist/runtime/actors/actor-remote-wire.js +15 -0
- package/dist/runtime/actors/actor-reply.d.ts +4 -0
- package/dist/runtime/actors/actor-reply.js +29 -0
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
- package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-state.js +2 -20
- package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
- package/dist/runtime/actors/index.d.ts +8 -3
- package/dist/runtime/actors/index.js +55 -27
- package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
- package/dist/runtime/actors/session-disconnected-wire.js +48 -0
- package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
- package/dist/runtime/admission.d.ts +9 -1
- package/dist/runtime/admission.js +56 -23
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
- package/dist/runtime/application-jobs/contracts.d.ts +12 -1
- package/dist/runtime/backend/contracts/index.d.ts +37 -12
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
- package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
- package/dist/runtime/backend/mesh-completion-table.js +154 -49
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
- package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
- package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
- package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
- package/dist/runtime/backend/runtime-message.d.ts +1 -0
- package/dist/runtime/backend/runtime-message.js +5 -0
- package/dist/runtime/backend/runtime-values.d.ts +1 -0
- package/dist/runtime/backend/runtime-values.js +2 -1
- package/dist/runtime/channels/channel-clients.d.ts +2 -0
- package/dist/runtime/channels/channel-clients.js +75 -23
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
- package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
- package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
- package/dist/runtime/channels/channel-dispatch-services.js +45 -0
- package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
- package/dist/runtime/channels/channel-dispatchers.js +62 -54
- package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
- package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
- package/dist/runtime/channels/channel-envelope.d.ts +2 -0
- package/dist/runtime/channels/channel-envelope.js +146 -28
- package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
- package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
- package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
- package/dist/runtime/channels/channel-runtime-manager.js +16 -16
- package/dist/runtime/channels/channel-transports.d.ts +18 -16
- package/dist/runtime/channels/channel-transports.js +77 -58
- package/dist/runtime/channels/client-server-location-runtime.js +5 -4
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/fanout-location-runtime.js +3 -3
- package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.js +2 -1
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
- package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
- package/dist/runtime/channels/source-spot-router.d.ts +2 -2
- package/dist/runtime/channels/source-spot-router.js +4 -4
- package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-node-route-transport.js +4 -4
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
- package/dist/runtime/diagnostics/flow-context.js +19 -7
- package/dist/runtime/diagnostics/index.js +4 -9
- package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
- package/dist/runtime/diagnostics/message-flow.js +35 -5
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
- package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
- package/dist/runtime/execution/index.d.ts +4 -2
- package/dist/runtime/execution/index.js +33 -10
- package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
- package/dist/runtime/execution/serial-execution-queue.js +22 -2
- package/dist/runtime/execution/state-lane.d.ts +2 -0
- package/dist/runtime/execution/state-lane.js +5 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
- package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
- package/dist/runtime/foundation/durable-service-request.js +98 -0
- package/dist/runtime/foundation/operation-identity.d.ts +1 -0
- package/dist/runtime/foundation/operation-identity.js +5 -1
- package/dist/runtime/foundation/operation-registry.d.ts +25 -1
- package/dist/runtime/foundation/operation-registry.js +86 -18
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
- package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
- package/dist/runtime/foundation/service-liveness-registry.js +38 -0
- package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
- package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
- package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
- package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
- package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
- package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
- package/dist/runtime/foundation/service-stateful-registry.js +24 -26
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
- package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
- package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
- package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
- package/dist/runtime/foundation/service-topology-registry.js +61 -27
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
- package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
- package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
- package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
- package/dist/runtime/handlers/handler-instance-scope.js +54 -11
- package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
- package/dist/runtime/host/actor-packet-relay.js +59 -72
- package/dist/runtime/host/actor-placement-coordinator.js +25 -8
- package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
- package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
- package/dist/runtime/host/actor-transfer-runtime.js +85 -331
- package/dist/runtime/host/application-job-queue.d.ts +40 -7
- package/dist/runtime/host/application-job-queue.js +137 -42
- package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
- package/dist/runtime/host/entry-actor-runtime.js +3 -0
- package/dist/runtime/host/index.d.ts +12 -2
- package/dist/runtime/host/index.js +300 -202
- package/dist/runtime/host/location-runtime-owner.js +2 -6
- package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
- package/dist/runtime/host/mesh-router-resolver.js +14 -6
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
- package/dist/runtime/host/remote-bound-session-relay.js +73 -208
- package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
- package/dist/runtime/host/route-mesh-runtime.js +6 -4
- package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
- package/dist/runtime/host/runtime-shutdown.js +3 -2
- package/dist/runtime/host/service-relocation-control.d.ts +1 -0
- package/dist/runtime/host/service-relocation-control.js +10 -4
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
- package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
- package/dist/runtime/host/spot-address-transport.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
- package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
- package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
- package/dist/runtime/locations/actor-location-claims.js +34 -19
- package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
- package/dist/runtime/locations/auto-connect-loop.js +22 -14
- package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
- package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
- package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
- package/dist/runtime/locations/descriptor-publication.js +11 -0
- package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
- package/dist/runtime/locations/in-memory-authority-store.js +56 -19
- package/dist/runtime/locations/in-memory-location-store.js +1 -10
- package/dist/runtime/locations/index.d.ts +1 -0
- package/dist/runtime/locations/index.js +1 -0
- package/dist/runtime/locations/lease-tracker.js +1 -6
- package/dist/runtime/locations/lifecycle.d.ts +1 -2
- package/dist/runtime/locations/lifecycle.js +2 -5
- package/dist/runtime/locations/location-store-repository.d.ts +51 -1
- package/dist/runtime/locations/location-store-repository.js +363 -139
- package/dist/runtime/locations/relocation-blob.d.ts +18 -1
- package/dist/runtime/locations/relocation-blob.js +52 -1
- package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
- package/dist/runtime/locations/request-source-resolver.js +80 -0
- package/dist/runtime/locations/resolvers.js +1 -1
- package/dist/runtime/locations/runtime.d.ts +7 -3
- package/dist/runtime/locations/runtime.js +61 -53
- package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
- package/dist/runtime/messaging/framework-json-v1.js +38 -294
- package/dist/runtime/messaging/packet-name.d.ts +1 -1
- package/dist/runtime/messaging/packet-name.js +8 -24
- package/dist/runtime/messaging/payload-codec.d.ts +7 -1
- package/dist/runtime/messaging/payload-codec.js +7 -6
- package/dist/runtime/messaging/request-result.d.ts +2 -0
- package/dist/runtime/messaging/request-result.js +57 -0
- package/dist/runtime/messaging/submission-result.d.ts +1 -0
- package/dist/runtime/messaging/submission-result.js +5 -2
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
- package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
- package/dist/runtime/spots/index.d.ts +21 -11
- package/dist/runtime/spots/index.js +243 -178
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
- package/dist/runtime/spots/spot-activation-registry.js +21 -11
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +7 -7
- package/dist/runtime/spots/spot-activation.d.ts +7 -3
- package/dist/runtime/spots/spot-activation.js +140 -52
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
- package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-membership.js +0 -8
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
- package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
- package/dist/runtime/spots/spot-entry-activation.js +20 -11
- package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
- package/dist/runtime/spots/spot-handler-registry.js +24 -10
- package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
- package/dist/runtime/spots/spot-manager-public.js +2 -2
- package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
- package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
- package/dist/runtime/spots/spot-outbound.d.ts +3 -0
- package/dist/runtime/spots/spot-outbound.js +27 -18
- package/dist/runtime/spots/spot-remote-codec.js +5 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
- package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
- package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
- package/dist/runtime/spots/spot-serial-executor.js +61 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
- package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
- package/dist/runtime/spots/spot-timer.d.ts +57 -5
- package/dist/runtime/spots/spot-timer.js +288 -103
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
- package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
- package/dist/runtime/streams/bound-session-service.d.ts +1 -1
- package/dist/runtime/streams/bound-session-service.js +6 -11
- package/dist/runtime/streams/index.d.ts +3 -2
- package/dist/runtime/streams/index.js +6 -4
- package/dist/runtime/streams/managed-stream.js +3 -2
- package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
- package/dist/runtime/streams/session-actor-coordinator.js +15 -32
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
- package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
- package/dist/runtime/streams/stream-session-runtime.js +14 -31
- package/dist/runtime/workers/index.js +1 -1
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
- package/src/contracts/Channels/Calls.ts +2 -1
- package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
- package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
- package/src/contracts/Common/encoded-payload-storage.ts +6 -3
- package/src/contracts/Configuration/Builders.ts +4 -1
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
- package/src/contracts/Handlers/Attributes.ts +14 -21
- package/src/contracts/Handlers/JsonContract.ts +8 -216
- package/src/contracts/Locations/Rows.ts +2 -0
- package/src/contracts/Spots/Contracts.ts +10 -1
- package/src/contracts/Spots/ZLinkSpot.ts +3 -3
- package/src/nest-integration.ts +1 -0
- package/src/runtime/abort.ts +12 -0
- package/src/runtime/actors/actor-authority-publication.ts +3 -2
- package/src/runtime/actors/actor-client.ts +100 -85
- package/src/runtime/actors/actor-context.ts +49 -9
- package/src/runtime/actors/actor-handoff.ts +291 -110
- package/src/runtime/actors/actor-join-relocation.ts +3 -0
- package/src/runtime/actors/actor-local-native-join.ts +21 -26
- package/src/runtime/actors/actor-mailbox.ts +40 -2
- package/src/runtime/actors/actor-remote-joiner.ts +6 -1
- package/src/runtime/actors/actor-remote-wire.ts +17 -0
- package/src/runtime/actors/actor-reply.ts +42 -0
- package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
- package/src/runtime/actors/actor-routed-json-request.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
- package/src/runtime/actors/actor-runtime-state.ts +2 -20
- package/src/runtime/actors/actor-source-transfer.ts +1 -34
- package/src/runtime/actors/index.ts +60 -32
- package/src/runtime/actors/session-disconnected-wire.ts +66 -0
- package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
- package/src/runtime/admission.ts +69 -21
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
- package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
- package/src/runtime/application-jobs/contracts.ts +16 -1
- package/src/runtime/backend/contracts/index.ts +92 -18
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
- package/src/runtime/backend/mesh-completion-table.ts +160 -57
- package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
- package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
- package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
- package/src/runtime/backend/raw-binding-port.ts +7 -2
- package/src/runtime/backend/runtime-message.ts +6 -0
- package/src/runtime/backend/runtime-values.ts +1 -0
- package/src/runtime/channels/channel-clients.ts +132 -58
- package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
- package/src/runtime/channels/channel-dispatch-services.ts +69 -1
- package/src/runtime/channels/channel-dispatchers.ts +136 -90
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
- package/src/runtime/channels/channel-envelope.ts +225 -31
- package/src/runtime/channels/channel-outbound-operations.ts +22 -8
- package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
- package/src/runtime/channels/channel-runtime-manager.ts +41 -17
- package/src/runtime/channels/channel-transports.ts +171 -112
- package/src/runtime/channels/client-server-location-runtime.ts +11 -10
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
- package/src/runtime/channels/fanout-location-runtime.ts +17 -9
- package/src/runtime/channels/local-spot-route-transport.ts +3 -1
- package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
- package/src/runtime/channels/source-spot-router.ts +8 -4
- package/src/runtime/channels/spot-node-route-transport.ts +8 -4
- package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
- package/src/runtime/diagnostics/flow-context.ts +20 -7
- package/src/runtime/diagnostics/index.ts +1 -7
- package/src/runtime/diagnostics/message-flow.ts +47 -9
- package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
- package/src/runtime/execution/index.ts +40 -14
- package/src/runtime/execution/serial-execution-queue.ts +33 -4
- package/src/runtime/execution/state-lane.ts +7 -0
- package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
- package/src/runtime/foundation/durable-service-request.ts +137 -0
- package/src/runtime/foundation/operation-identity.ts +5 -1
- package/src/runtime/foundation/operation-registry.ts +98 -20
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
- package/src/runtime/foundation/service-liveness-registry.ts +39 -0
- package/src/runtime/foundation/service-mailbox.ts +8 -0
- package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
- package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
- package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
- package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
- package/src/runtime/foundation/service-stateful-registry.ts +38 -35
- package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
- package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
- package/src/runtime/foundation/service-topology-registry.ts +91 -36
- package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
- package/src/runtime/handlers/handler-instance-scope.ts +67 -16
- package/src/runtime/host/actor-packet-relay.ts +113 -94
- package/src/runtime/host/actor-placement-coordinator.ts +31 -8
- package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
- package/src/runtime/host/actor-transfer-runtime.ts +104 -430
- package/src/runtime/host/application-job-queue.ts +160 -41
- package/src/runtime/host/entry-actor-runtime.ts +4 -0
- package/src/runtime/host/index.ts +473 -271
- package/src/runtime/host/location-runtime-owner.ts +2 -6
- package/src/runtime/host/mesh-router-resolver.ts +13 -5
- package/src/runtime/host/remote-bound-session-relay.ts +88 -271
- package/src/runtime/host/route-mesh-runtime.ts +12 -6
- package/src/runtime/host/runtime-shutdown.ts +15 -4
- package/src/runtime/host/service-relocation-control.ts +11 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
- package/src/runtime/host/spot-address-transport.ts +4 -2
- package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
- package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
- package/src/runtime/locations/actor-location-claims.ts +52 -30
- package/src/runtime/locations/auto-connect-loop.ts +22 -14
- package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
- package/src/runtime/locations/auto-connect-types.ts +0 -1
- package/src/runtime/locations/descriptor-publication.ts +7 -0
- package/src/runtime/locations/domain-store-contract.ts +5 -0
- package/src/runtime/locations/in-memory-authority-store.ts +85 -23
- package/src/runtime/locations/in-memory-location-store.ts +1 -12
- package/src/runtime/locations/index.ts +1 -0
- package/src/runtime/locations/lease-tracker.ts +2 -9
- package/src/runtime/locations/lifecycle.ts +8 -26
- package/src/runtime/locations/location-store-repository.ts +628 -152
- package/src/runtime/locations/relocation-blob.ts +75 -1
- package/src/runtime/locations/request-source-resolver.ts +138 -0
- package/src/runtime/locations/resolvers.ts +2 -2
- package/src/runtime/locations/runtime.ts +98 -64
- package/src/runtime/messaging/framework-json-v1.ts +5 -325
- package/src/runtime/messaging/packet-name.ts +5 -25
- package/src/runtime/messaging/payload-codec.ts +8 -11
- package/src/runtime/messaging/request-result.ts +62 -0
- package/src/runtime/messaging/submission-result.ts +5 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
- package/src/runtime/spots/index.ts +389 -283
- package/src/runtime/spots/spot-activation-registry.ts +25 -13
- package/src/runtime/spots/spot-activation-state.ts +12 -19
- package/src/runtime/spots/spot-activation.ts +198 -96
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
- package/src/runtime/spots/spot-actor-membership.ts +0 -15
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
- package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
- package/src/runtime/spots/spot-entry-activation.ts +33 -21
- package/src/runtime/spots/spot-handler-registry.ts +56 -12
- package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
- package/src/runtime/spots/spot-manager-public.ts +2 -2
- package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
- package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
- package/src/runtime/spots/spot-outbound.ts +39 -19
- package/src/runtime/spots/spot-remote-codec.ts +9 -2
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
- package/src/runtime/spots/spot-runtime-ports.ts +1 -1
- package/src/runtime/spots/spot-serial-executor.ts +97 -25
- package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
- package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
- package/src/runtime/spots/spot-timer.ts +418 -158
- package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
- package/src/runtime/streams/bound-session-service.ts +7 -10
- package/src/runtime/streams/index.ts +12 -6
- package/src/runtime/streams/managed-stream.ts +4 -2
- package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
- package/src/runtime/streams/session-actor-coordinator.ts +39 -88
- package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
- package/src/runtime/streams/stream-session-runtime.ts +13 -34
- package/src/runtime/workers/index.ts +1 -1
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import { awaitWithAbort } from '../abort';
|
|
2
3
|
import { availableParallelism } from 'node:os';
|
|
3
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
enterApplicationJobPermitScope,
|
|
6
|
+
leaveApplicationJobPermitScope,
|
|
7
|
+
releaseApplicationJobPermitTurn
|
|
8
|
+
} from '../application-jobs/application-job-queue-scope';
|
|
4
9
|
import type {
|
|
5
10
|
ApplicationJobPermitPort,
|
|
6
11
|
ApplicationJobQueuePort
|
|
@@ -8,6 +13,7 @@ import type {
|
|
|
8
13
|
import { runZLinkExecutionArea } from '../execution';
|
|
9
14
|
import {
|
|
10
15
|
ReadyDomain,
|
|
16
|
+
type Claim,
|
|
11
17
|
type ReadyBatch,
|
|
12
18
|
type ReadyRecord,
|
|
13
19
|
type ReceiveBatch,
|
|
@@ -67,6 +73,10 @@ export class ZLinkMeshDispatchPump {
|
|
|
67
73
|
private readonly capacityStop = new AbortController();
|
|
68
74
|
private recordsSinceYield = 0;
|
|
69
75
|
private yieldStartedAtMs = 0;
|
|
76
|
+
/** Drains in progress; the batch budget begins when work starts on an idle pump. */
|
|
77
|
+
private draining = 0;
|
|
78
|
+
/** The macrotask boundary every drain waits for once the shared budget is spent. */
|
|
79
|
+
private pendingYield?: Promise<void>;
|
|
70
80
|
|
|
71
81
|
constructor(
|
|
72
82
|
private readonly node: ZLinkBackendMeshNode,
|
|
@@ -84,7 +94,7 @@ export class ZLinkMeshDispatchPump {
|
|
|
84
94
|
});
|
|
85
95
|
}
|
|
86
96
|
|
|
87
|
-
async dispose(): Promise<void> {
|
|
97
|
+
async dispose(signal?: AbortSignal): Promise<void> {
|
|
88
98
|
if (this.disposed) {
|
|
89
99
|
return;
|
|
90
100
|
}
|
|
@@ -94,7 +104,7 @@ export class ZLinkMeshDispatchPump {
|
|
|
94
104
|
for (const wake of this.idleApplicationWorkers) wake();
|
|
95
105
|
this.idleApplicationWorkers.clear();
|
|
96
106
|
while (this.activeDrains.size > 0) {
|
|
97
|
-
await Promise.all([...this.activeDrains]);
|
|
107
|
+
await awaitWithAbort(Promise.all([...this.activeDrains]), signal);
|
|
98
108
|
}
|
|
99
109
|
}
|
|
100
110
|
|
|
@@ -158,12 +168,40 @@ export class ZLinkMeshDispatchPump {
|
|
|
158
168
|
try {
|
|
159
169
|
for (;;) {
|
|
160
170
|
await this.waitForApplicationReady();
|
|
161
|
-
|
|
171
|
+
this.beginDrain();
|
|
162
172
|
try {
|
|
163
|
-
|
|
173
|
+
while (!this.disposed) {
|
|
174
|
+
readyBatch.reset();
|
|
175
|
+
const drained = this.node.drainReady(
|
|
176
|
+
ReadyDomain.Application,
|
|
177
|
+
readyBatch,
|
|
178
|
+
ZLINK_BACKEND_RECV_DONT_WAIT
|
|
179
|
+
);
|
|
180
|
+
if (!drained.ok || drained.records.length === 0) break;
|
|
181
|
+
if (drained.hasResidue) this.markReady(ReadyDomain.Application);
|
|
182
|
+
for (let index = 0; index < drained.records.length; index += 1) {
|
|
183
|
+
const claim = readyBatch.takeClaim(index);
|
|
184
|
+
// Raw ingress already attached one host permit to each record.
|
|
185
|
+
// A claim reserving admission may receive only that permit's record.
|
|
186
|
+
await this.drainClaim(
|
|
187
|
+
ReadyDomain.Application,
|
|
188
|
+
drained.records[index]!,
|
|
189
|
+
claim,
|
|
190
|
+
receiveBatch
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
// Empty ready claims count toward the shared pump budget too.
|
|
194
|
+
this.recordsSinceYield += 1;
|
|
195
|
+
const yieldTurn = this.yieldIfNeeded();
|
|
196
|
+
if (yieldTurn !== undefined) await yieldTurn;
|
|
197
|
+
}
|
|
164
198
|
} catch (error) {
|
|
165
199
|
this.reportDispatchError(error);
|
|
200
|
+
} finally {
|
|
201
|
+
readyBatch.reset();
|
|
202
|
+
this.draining -= 1;
|
|
166
203
|
}
|
|
204
|
+
if (this.disposed) return;
|
|
167
205
|
}
|
|
168
206
|
} finally {
|
|
169
207
|
receiveBatch.close();
|
|
@@ -180,6 +218,64 @@ export class ZLinkMeshDispatchPump {
|
|
|
180
218
|
return new Promise((resolve) => this.idleApplicationWorkers.add(resolve));
|
|
181
219
|
}
|
|
182
220
|
|
|
221
|
+
/**
|
|
222
|
+
* Starts one record in this worker's turn; a permit's scope covers the
|
|
223
|
+
* synchronous dispatch. Returns `false` when the dispatch threw (already
|
|
224
|
+
* reported), `true` when it returned synchronously, or the handler's pending
|
|
225
|
+
* completion, which the draining turn awaits itself before
|
|
226
|
+
* {@link finishRecord}.
|
|
227
|
+
*/
|
|
228
|
+
private dispatchRecord(
|
|
229
|
+
owner: ReadyRecord,
|
|
230
|
+
record: ReceiveRecord,
|
|
231
|
+
permit: ApplicationJobPermitPort | undefined
|
|
232
|
+
): boolean | PromiseLike<void> {
|
|
233
|
+
const previous = permit === undefined ? undefined : enterApplicationJobPermitScope(permit);
|
|
234
|
+
let result: void | PromiseLike<void>;
|
|
235
|
+
try {
|
|
236
|
+
result = this.options.dispatch(owner, record);
|
|
237
|
+
} catch (error) {
|
|
238
|
+
this.failRecord(error, record, permit);
|
|
239
|
+
return false;
|
|
240
|
+
} finally {
|
|
241
|
+
if (permit !== undefined) leaveApplicationJobPermitScope(previous);
|
|
242
|
+
}
|
|
243
|
+
return result ?? true;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
private failRecord(
|
|
247
|
+
error: unknown,
|
|
248
|
+
record: ReceiveRecord,
|
|
249
|
+
permit: ApplicationJobPermitPort | undefined
|
|
250
|
+
): void {
|
|
251
|
+
releaseApplicationJobPermitTurn(permit);
|
|
252
|
+
this.reportDispatchError(error, meshDispatchFailureContext(record));
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/** Runs the record's terminal completion, then releases its permit turn. */
|
|
256
|
+
private finishRecord(
|
|
257
|
+
record: ReceiveRecord,
|
|
258
|
+
permit: ApplicationJobPermitPort | undefined
|
|
259
|
+
): void | Promise<void> {
|
|
260
|
+
let result: void | Promise<void> = undefined;
|
|
261
|
+
try {
|
|
262
|
+
result = record.onTerminalCompletion?.();
|
|
263
|
+
} catch (error) {
|
|
264
|
+
this.reportDispatchError(error, meshDispatchFailureContext(record));
|
|
265
|
+
}
|
|
266
|
+
if (result === undefined) {
|
|
267
|
+
releaseApplicationJobPermitTurn(permit);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
return Promise.resolve(result).then(
|
|
271
|
+
() => releaseApplicationJobPermitTurn(permit),
|
|
272
|
+
(error) => {
|
|
273
|
+
this.reportDispatchError(error, meshDispatchFailureContext(record));
|
|
274
|
+
releaseApplicationJobPermitTurn(permit);
|
|
275
|
+
}
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
|
|
183
279
|
private reportDispatchError(error: unknown, context?: ZLinkMeshDispatchFailureContext): void {
|
|
184
280
|
this.options.reportError?.(error, context);
|
|
185
281
|
}
|
|
@@ -229,12 +325,7 @@ export class ZLinkMeshDispatchPump {
|
|
|
229
325
|
if ((this.pendingDomains & ReadyDomain.Application) !== 0) {
|
|
230
326
|
setImmediate(() => this.wakeApplicationWorker());
|
|
231
327
|
}
|
|
232
|
-
const lifecycleBudgetExhausted = await this.drainDomain(
|
|
233
|
-
ReadyDomain.Infrastructure,
|
|
234
|
-
readyBatch,
|
|
235
|
-
undefined,
|
|
236
|
-
MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET
|
|
237
|
-
);
|
|
328
|
+
const lifecycleBudgetExhausted = await this.drainDomain(readyBatch);
|
|
238
329
|
if (lifecycleBudgetExhausted) {
|
|
239
330
|
this.pendingDomains |= ReadyDomain.Infrastructure;
|
|
240
331
|
await yieldToEventLoop();
|
|
@@ -245,118 +336,40 @@ export class ZLinkMeshDispatchPump {
|
|
|
245
336
|
}
|
|
246
337
|
}
|
|
247
338
|
|
|
248
|
-
private async drainDomain(
|
|
249
|
-
domain: number,
|
|
250
|
-
readyBatch: ReadyBatch,
|
|
251
|
-
receiveBatch: ReceiveBatch | undefined,
|
|
252
|
-
claimBudget?: number
|
|
253
|
-
): Promise<boolean> {
|
|
339
|
+
private async drainDomain(readyBatch: ReadyBatch): Promise<boolean> {
|
|
254
340
|
let claimsDrained = 0;
|
|
341
|
+
this.beginDrain();
|
|
255
342
|
try {
|
|
256
343
|
while (!this.disposed) {
|
|
257
|
-
if (
|
|
344
|
+
if (claimsDrained >= MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET) {
|
|
258
345
|
// Lifecycle work has priority, but a bounded turn lets application
|
|
259
346
|
// work make progress when lifecycle records keep arriving.
|
|
260
347
|
return true;
|
|
261
348
|
}
|
|
262
349
|
readyBatch.reset();
|
|
263
|
-
const drained = this.node.drainReady(
|
|
350
|
+
const drained = this.node.drainReady(
|
|
351
|
+
ReadyDomain.Infrastructure,
|
|
352
|
+
readyBatch,
|
|
353
|
+
ZLINK_BACKEND_RECV_DONT_WAIT
|
|
354
|
+
);
|
|
264
355
|
if (!drained.ok || drained.records.length === 0) {
|
|
265
356
|
return false;
|
|
266
357
|
}
|
|
267
|
-
if (domain === ReadyDomain.Application && drained.hasResidue) {
|
|
268
|
-
this.markReady(ReadyDomain.Application);
|
|
269
|
-
}
|
|
270
358
|
for (let index = 0; index < drained.records.length; index += 1) {
|
|
271
359
|
const claim = readyBatch.takeClaim(index);
|
|
272
360
|
claimsDrained += 1;
|
|
273
361
|
const owner = drained.records[index]!;
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
const capacity =
|
|
284
|
-
owner.ordinaryIngressPreAdmitted === true ? MESH_DISPATCH_RECEIVE_CAPACITY : 1;
|
|
285
|
-
let claimPermit =
|
|
286
|
-
owner.terminalCompletion === true ||
|
|
287
|
-
owner.ordinaryIngressPreAdmitted === true ||
|
|
288
|
-
domain === ReadyDomain.Infrastructure
|
|
289
|
-
? undefined
|
|
290
|
-
: await this.acquirePermit();
|
|
291
|
-
try {
|
|
292
|
-
if (this.capacityStop.signal.aborted) return;
|
|
293
|
-
ownerReceiveBatch.reset(capacity);
|
|
294
|
-
const received = claim.recvBatch(ownerReceiveBatch, ZLINK_BACKEND_RECV_DONT_WAIT);
|
|
295
|
-
if (received.ok) {
|
|
296
|
-
// The bounded batch stays in claim order until its records finish.
|
|
297
|
-
try {
|
|
298
|
-
for (const record of received.records) {
|
|
299
|
-
if (this.disposed) break;
|
|
300
|
-
const permit = record.applicationJobPermit ?? claimPermit;
|
|
301
|
-
if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
|
|
302
|
-
throw new Error(
|
|
303
|
-
'Pre-admitted raw ingress record lost its Application Job Queue permit.'
|
|
304
|
-
);
|
|
305
|
-
}
|
|
306
|
-
this.recordsSinceYield += 1;
|
|
307
|
-
const dispatch = async () => {
|
|
308
|
-
try {
|
|
309
|
-
await this.options.dispatch(owner, record);
|
|
310
|
-
await record.onTerminalCompletion?.();
|
|
311
|
-
} catch (error) {
|
|
312
|
-
this.reportDispatchError(error, meshDispatchFailureContext(record));
|
|
313
|
-
}
|
|
314
|
-
};
|
|
315
|
-
if (permit === undefined) {
|
|
316
|
-
await dispatch();
|
|
317
|
-
} else {
|
|
318
|
-
if (
|
|
319
|
-
domain === ReadyDomain.Application &&
|
|
320
|
-
record.applicationJobPermit === undefined
|
|
321
|
-
)
|
|
322
|
-
permit.markApplicationQueued();
|
|
323
|
-
// The scope now owns this reservation, including failure
|
|
324
|
-
// and detached handler handoff. Only unused permits remain
|
|
325
|
-
// owned by the receive attempt's finally block.
|
|
326
|
-
if (permit === claimPermit) claimPermit = undefined;
|
|
327
|
-
await runWithApplicationJobPermit(permit, dispatch);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
} finally {
|
|
331
|
-
// Batch ownership includes records whose dispatch never began,
|
|
332
|
-
// including on failure or shutdown in the middle of the batch.
|
|
333
|
-
for (const record of received.records) {
|
|
334
|
-
for (const part of record.parts) part.close();
|
|
335
|
-
record.releaseRetainedIngress?.();
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
} finally {
|
|
340
|
-
claimPermit?.releaseAfterInternalProcessing();
|
|
341
|
-
}
|
|
342
|
-
} finally {
|
|
343
|
-
claim.release();
|
|
344
|
-
if (receiveBatch === undefined) ownerReceiveBatch?.close();
|
|
345
|
-
}
|
|
346
|
-
const yieldTurn = this.yieldIfNeeded();
|
|
347
|
-
if (yieldTurn !== undefined) await yieldTurn;
|
|
348
|
-
};
|
|
349
|
-
// An application worker drains the one owner it claimed. Infrastructure owners
|
|
350
|
-
// drain independently, so a suspended owner does not hold the other claims.
|
|
351
|
-
if (receiveBatch !== undefined) {
|
|
352
|
-
await drainClaim();
|
|
353
|
-
} else {
|
|
354
|
-
const drain = drainClaim().catch((error) => this.reportDispatchError(error));
|
|
355
|
-
this.activeDrains.add(drain);
|
|
356
|
-
void drain.finally(() => this.activeDrains.delete(drain));
|
|
357
|
-
}
|
|
362
|
+
this.beginDrain();
|
|
363
|
+
const drain = this.drainClaim(ReadyDomain.Infrastructure, owner, claim, undefined).catch(
|
|
364
|
+
(error) => this.reportDispatchError(error)
|
|
365
|
+
);
|
|
366
|
+
this.activeDrains.add(drain);
|
|
367
|
+
void drain.finally(() => {
|
|
368
|
+
this.draining -= 1;
|
|
369
|
+
this.activeDrains.delete(drain);
|
|
370
|
+
});
|
|
358
371
|
}
|
|
359
|
-
if (
|
|
372
|
+
if (claimsDrained >= MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET) {
|
|
360
373
|
this.wakeApplicationWorker();
|
|
361
374
|
return true;
|
|
362
375
|
}
|
|
@@ -369,10 +382,123 @@ export class ZLinkMeshDispatchPump {
|
|
|
369
382
|
return false;
|
|
370
383
|
} finally {
|
|
371
384
|
readyBatch.reset();
|
|
385
|
+
this.draining -= 1;
|
|
372
386
|
}
|
|
373
387
|
}
|
|
374
388
|
|
|
389
|
+
/**
|
|
390
|
+
* Time the pump spent idle is not batch work: when work starts on an idle
|
|
391
|
+
* pump, its batch budget starts with it (spec 08 §6).
|
|
392
|
+
*/
|
|
393
|
+
private beginDrain(): void {
|
|
394
|
+
if (this.draining === 0) {
|
|
395
|
+
this.recordsSinceYield = 0;
|
|
396
|
+
this.yieldStartedAtMs = this.nowMs();
|
|
397
|
+
}
|
|
398
|
+
this.draining += 1;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/** Drains one claimed owner in this worker's turn, in claim order. */
|
|
402
|
+
private async drainClaim(
|
|
403
|
+
domain: number,
|
|
404
|
+
owner: ReadyRecord,
|
|
405
|
+
claim: Claim,
|
|
406
|
+
receiveBatch: ReceiveBatch | undefined
|
|
407
|
+
): Promise<void> {
|
|
408
|
+
let ownerReceiveBatch = receiveBatch;
|
|
409
|
+
try {
|
|
410
|
+
ownerReceiveBatch ??= this.node.createReceiveBatch(
|
|
411
|
+
MESH_DISPATCH_RECEIVE_CAPACITY,
|
|
412
|
+
this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY
|
|
413
|
+
);
|
|
414
|
+
const capacity =
|
|
415
|
+
owner.ordinaryIngressPreAdmitted === true ? MESH_DISPATCH_RECEIVE_CAPACITY : 1;
|
|
416
|
+
let claimPermit =
|
|
417
|
+
owner.terminalCompletion === true ||
|
|
418
|
+
owner.ordinaryIngressPreAdmitted === true ||
|
|
419
|
+
domain === ReadyDomain.Infrastructure
|
|
420
|
+
? undefined
|
|
421
|
+
: await this.acquirePermit();
|
|
422
|
+
try {
|
|
423
|
+
if (this.capacityStop.signal.aborted) return;
|
|
424
|
+
ownerReceiveBatch.reset(capacity);
|
|
425
|
+
const received = claim.recvBatch(ownerReceiveBatch, ZLINK_BACKEND_RECV_DONT_WAIT);
|
|
426
|
+
if (received.ok) {
|
|
427
|
+
// The bounded batch stays in claim order until its records finish.
|
|
428
|
+
try {
|
|
429
|
+
for (const record of received.records) {
|
|
430
|
+
if (this.disposed) break;
|
|
431
|
+
const permit = record.applicationJobPermit ?? claimPermit;
|
|
432
|
+
if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
|
|
433
|
+
throw new Error(
|
|
434
|
+
'Pre-admitted raw ingress record lost its Application Job Queue permit.'
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
this.recordsSinceYield += 1;
|
|
438
|
+
if (permit !== undefined) {
|
|
439
|
+
if (domain === ReadyDomain.Application && record.applicationJobPermit === undefined)
|
|
440
|
+
permit.markApplicationQueued();
|
|
441
|
+
// The scope now owns this reservation, including failure
|
|
442
|
+
// and detached handler handoff. Only unused permits remain
|
|
443
|
+
// owned by the receive attempt's finally block.
|
|
444
|
+
if (permit === claimPermit) claimPermit = undefined;
|
|
445
|
+
}
|
|
446
|
+
// The record's terminal and the permit turn release follow the
|
|
447
|
+
// handler in this turn's own continuation.
|
|
448
|
+
if (record.prepareDispatch !== undefined) {
|
|
449
|
+
try {
|
|
450
|
+
const stopSignal = this.capacityStop.signal;
|
|
451
|
+
const preparation = record.prepareDispatch(stopSignal);
|
|
452
|
+
const accepted = preparation instanceof Promise ? await preparation : preparation;
|
|
453
|
+
if (!accepted || stopSignal.aborted) {
|
|
454
|
+
releaseApplicationJobPermitTurn(permit);
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
} catch (error) {
|
|
458
|
+
this.failRecord(error, record, permit);
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
const dispatched = this.dispatchRecord(owner, record, permit);
|
|
463
|
+
if (dispatched === false) continue;
|
|
464
|
+
if (dispatched !== true) {
|
|
465
|
+
try {
|
|
466
|
+
await dispatched;
|
|
467
|
+
} catch (error) {
|
|
468
|
+
this.failRecord(error, record, permit);
|
|
469
|
+
continue;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
const finished = this.finishRecord(record, permit);
|
|
473
|
+
if (finished !== undefined) await finished;
|
|
474
|
+
}
|
|
475
|
+
} finally {
|
|
476
|
+
// Batch ownership includes records whose dispatch never began,
|
|
477
|
+
// including on failure or shutdown in the middle of the batch.
|
|
478
|
+
for (const record of received.records) {
|
|
479
|
+
for (const part of record.parts) part.close();
|
|
480
|
+
record.releaseRetainedIngress?.();
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
} finally {
|
|
485
|
+
claimPermit?.releaseAfterInternalProcessing();
|
|
486
|
+
}
|
|
487
|
+
} finally {
|
|
488
|
+
claim.release();
|
|
489
|
+
if (receiveBatch === undefined) ownerReceiveBatch?.close();
|
|
490
|
+
}
|
|
491
|
+
const yieldTurn = this.yieldIfNeeded();
|
|
492
|
+
if (yieldTurn !== undefined) await yieldTurn;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* The batch budget is shared by every drain of this pump, so once it is
|
|
497
|
+
* spent every drain waits for the same macrotask boundary; one drain that
|
|
498
|
+
* keeps running would otherwise hold the event loop the yield was for.
|
|
499
|
+
*/
|
|
375
500
|
private yieldIfNeeded(): Promise<void> | undefined {
|
|
501
|
+
if (this.pendingYield !== undefined) return this.pendingYield;
|
|
376
502
|
const nowMs = this.nowMs();
|
|
377
503
|
if (
|
|
378
504
|
this.recordsSinceYield < MESH_DISPATCH_YIELD_RECORDS &&
|
|
@@ -380,9 +506,12 @@ export class ZLinkMeshDispatchPump {
|
|
|
380
506
|
)
|
|
381
507
|
return undefined;
|
|
382
508
|
this.recordsSinceYield = 0;
|
|
383
|
-
|
|
509
|
+
const pendingYield = yieldToTimers().then(() => {
|
|
510
|
+
this.pendingYield = undefined;
|
|
384
511
|
this.yieldStartedAtMs = this.nowMs();
|
|
385
512
|
});
|
|
513
|
+
this.pendingYield = pendingYield;
|
|
514
|
+
return pendingYield;
|
|
386
515
|
}
|
|
387
516
|
|
|
388
517
|
private nowMs(): number {
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
import { loadBinding } from '../node-backend-adapter';
|
|
8
8
|
import { SubmitResult, ZLinkBackendResultError } from '../runtime-values';
|
|
9
9
|
const nativeErrnoValues = osConstants.errno;
|
|
10
|
+
const completedSend: Promise<void> = Promise.resolve();
|
|
10
11
|
|
|
11
12
|
export type ZLinkBindingModule = typeof import('@zlink-systems/zlink');
|
|
12
13
|
export const zlink = loadBinding() as ZLinkBindingModule;
|
|
@@ -119,12 +120,16 @@ export function submitBindingReply(operation: ZLinkBindingReplyOperation, payloa
|
|
|
119
120
|
}
|
|
120
121
|
}
|
|
121
122
|
|
|
122
|
-
export
|
|
123
|
+
export function submitBindingAsyncSend(
|
|
123
124
|
operation: ZLinkBindingAsyncSendOperation,
|
|
124
125
|
payload: unknown
|
|
125
126
|
): Promise<void> {
|
|
126
|
-
|
|
127
|
-
|
|
127
|
+
try {
|
|
128
|
+
const submission = submitBindingSend(operation, payload);
|
|
129
|
+
return submission.result === SubmitResult.Backpressured ? submission.admitted : completedSend;
|
|
130
|
+
} catch (error) {
|
|
131
|
+
return Promise.reject(error);
|
|
132
|
+
}
|
|
128
133
|
}
|
|
129
134
|
|
|
130
135
|
export function submitBindingSend(
|
|
@@ -152,7 +157,8 @@ export function submitBindingSend(
|
|
|
152
157
|
})
|
|
153
158
|
};
|
|
154
159
|
}
|
|
155
|
-
|
|
160
|
+
// Binding SendSubmission is the closed OK | BACKPRESSURED snapshot.
|
|
161
|
+
return submission as import('../raw-binding-port').ZLinkRawSendSubmission;
|
|
156
162
|
}
|
|
157
163
|
|
|
158
164
|
export function submitBindingSyncSend(
|
|
@@ -177,7 +183,8 @@ export async function submitBindingRequest(
|
|
|
177
183
|
operation: ZLinkBindingRequestOperation,
|
|
178
184
|
payload: unknown,
|
|
179
185
|
timeoutMs: number | undefined,
|
|
180
|
-
recordReceived?: () => void
|
|
186
|
+
recordReceived?: () => void,
|
|
187
|
+
onAdmitted?: () => void
|
|
181
188
|
): Promise<readonly unknown[]> {
|
|
182
189
|
const deadlineMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
|
|
183
190
|
try {
|
|
@@ -195,7 +202,7 @@ export async function submitBindingRequest(
|
|
|
195
202
|
if (timeoutMs !== undefined) {
|
|
196
203
|
current = current.timeout(timeoutMs);
|
|
197
204
|
}
|
|
198
|
-
return await bindingRequestReply(current.submit(), deadlineMs, recordReceived);
|
|
205
|
+
return await bindingRequestReply(current.submit(), deadlineMs, recordReceived, onAdmitted);
|
|
199
206
|
} catch (error) {
|
|
200
207
|
throw translateBindingResultError(error);
|
|
201
208
|
}
|
|
@@ -204,13 +211,14 @@ export async function submitBindingRequest(
|
|
|
204
211
|
export async function bindingRequestReply(
|
|
205
212
|
submission: import('@zlink-systems/zlink').RequestSubmission,
|
|
206
213
|
deadlineMs: number | undefined,
|
|
207
|
-
recordReceived?: () => void
|
|
214
|
+
recordReceived?: () => void,
|
|
215
|
+
onAdmitted?: () => void
|
|
208
216
|
): Promise<import('@zlink-systems/zlink').Message[]> {
|
|
209
217
|
const reply = submission.reply;
|
|
210
218
|
if (submission.result === SubmitResult.Backpressured) {
|
|
211
219
|
try {
|
|
212
220
|
const [, replies] = await waitRequestReply(
|
|
213
|
-
Promise.all([submission.admitted, reply]),
|
|
221
|
+
Promise.all([submission.admitted.then(() => onAdmitted?.()), reply]),
|
|
214
222
|
'Request',
|
|
215
223
|
deadlineMs
|
|
216
224
|
);
|
|
@@ -227,6 +235,7 @@ export async function bindingRequestReply(
|
|
|
227
235
|
throw error;
|
|
228
236
|
}
|
|
229
237
|
}
|
|
238
|
+
onAdmitted?.();
|
|
230
239
|
const replies = await reply;
|
|
231
240
|
recordReceived?.();
|
|
232
241
|
return replies;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bindingRequestReply } from './node-backend-adapter-support';
|
|
1
2
|
import type { DealerSocket, Message, PubSocket } from '@zlink-systems/zlink';
|
|
2
3
|
import { ZLinkConfigurationException } from '../../configuration';
|
|
3
4
|
import { ZLinkSubmitStatus, type ZLinkSubmitResult } from '../../messaging/submission-result';
|
|
@@ -56,7 +57,8 @@ export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTran
|
|
|
56
57
|
request: Message,
|
|
57
58
|
timeoutMs: number | undefined,
|
|
58
59
|
signal?: AbortSignal,
|
|
59
|
-
metadata: ReadonlyMap<string, string> = EMPTY_METADATA
|
|
60
|
+
metadata: ReadonlyMap<string, string> = EMPTY_METADATA,
|
|
61
|
+
onAdmitted?: () => void
|
|
60
62
|
): Promise<TReply> {
|
|
61
63
|
throwIfAborted(signal);
|
|
62
64
|
const operation = runWithOutboundFlow(true, () =>
|
|
@@ -78,7 +80,15 @@ export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTran
|
|
|
78
80
|
);
|
|
79
81
|
if (timeoutMs !== undefined) operation.timeout(timeoutMs);
|
|
80
82
|
const reply = await submitRequestOperation(
|
|
81
|
-
{
|
|
83
|
+
{
|
|
84
|
+
submit: () =>
|
|
85
|
+
bindingRequestReply(
|
|
86
|
+
operation.submit(),
|
|
87
|
+
timeoutMs === undefined ? undefined : performance.now() + timeoutMs,
|
|
88
|
+
undefined,
|
|
89
|
+
onAdmitted
|
|
90
|
+
)
|
|
91
|
+
},
|
|
82
92
|
'channel request'
|
|
83
93
|
);
|
|
84
94
|
try {
|