@zlink-systems/framework 0.30.1 → 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/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
- 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/Locations/Rows.d.ts +2 -0
- package/dist/contracts/Spots/Contracts.d.ts +4 -0
- package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
- 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 +0 -1
- package/dist/runtime/actors/actor-client.js +38 -45
- 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 +7 -3
- package/dist/runtime/actors/actor-handoff.js +212 -88
- package/dist/runtime/actors/actor-join-relocation.d.ts +2 -0
- package/dist/runtime/actors/actor-local-native-join.js +4 -0
- package/dist/runtime/actors/actor-mailbox.js +27 -1
- package/dist/runtime/actors/actor-remote-joiner.js +3 -1
- package/dist/runtime/actors/actor-reply.d.ts +4 -0
- package/dist/runtime/actors/actor-reply.js +29 -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 +6 -2
- package/dist/runtime/actors/index.js +37 -21
- package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
- package/dist/runtime/actors/session-disconnected-wire.js +48 -0
- package/dist/runtime/admission.d.ts +9 -1
- package/dist/runtime/admission.js +55 -32
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +13 -0
- package/dist/runtime/application-jobs/application-job-queue-scope.js +27 -1
- package/dist/runtime/application-jobs/contracts.d.ts +2 -0
- package/dist/runtime/backend/contracts/index.d.ts +19 -3
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
- package/dist/runtime/backend/mesh-completion-table.js +5 -0
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +26 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +193 -107
- package/dist/runtime/backend/node/node-raw-binding-port.js +90 -58
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +33 -8
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +142 -143
- package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +5 -5
- package/dist/runtime/channels/channel-clients.d.ts +1 -0
- package/dist/runtime/channels/channel-clients.js +20 -5
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +22 -3
- package/dist/runtime/channels/channel-dispatch-pipeline.js +103 -57
- package/dist/runtime/channels/channel-dispatchers.d.ts +3 -2
- package/dist/runtime/channels/channel-dispatchers.js +44 -37
- package/dist/runtime/channels/channel-envelope.d.ts +1 -0
- package/dist/runtime/channels/channel-envelope.js +74 -31
- 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 +3 -2
- package/dist/runtime/channels/channel-runtime-manager.js +4 -4
- package/dist/runtime/channels/channel-transports.d.ts +0 -1
- package/dist/runtime/channels/channel-transports.js +35 -33
- 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/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 +4 -0
- package/dist/runtime/execution/serial-execution-queue.js +21 -2
- package/dist/runtime/execution/state-lane.d.ts +2 -0
- package/dist/runtime/execution/state-lane.js +5 -0
- 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 +39 -3
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +151 -55
- 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 +2 -3
- package/dist/runtime/foundation/service-relocation-object-owner.js +48 -35
- package/dist/runtime/foundation/service-relocation-runtime.js +7 -3
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +8 -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 +72 -6
- package/dist/runtime/foundation/service-stateful-runtime.js +444 -117
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -1
- package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -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 +10 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +166 -53
- 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-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 +24 -3
- package/dist/runtime/host/application-job-queue.js +28 -41
- package/dist/runtime/host/index.d.ts +5 -1
- package/dist/runtime/host/index.js +171 -97
- 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 +71 -190
- package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
- package/dist/runtime/host/route-mesh-runtime.js +5 -3
- 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-host-runtime.d.ts +17 -7
- package/dist/runtime/host/service-relocation-host-runtime.js +550 -367
- package/dist/runtime/host/spot-runtime-options-factory.js +15 -7
- package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
- 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/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 +6 -2
- package/dist/runtime/locations/runtime.js +37 -30
- 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.js +29 -26
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +19 -1
- package/dist/runtime/protocol/service_wire_codec.generated.js +85 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +7 -1
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +23 -7
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +3 -2
- package/dist/runtime/spots/index.d.ts +18 -11
- package/dist/runtime/spots/index.js +234 -176
- 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 +6 -3
- package/dist/runtime/spots/spot-activation.js +123 -44
- 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 +14 -9
- package/dist/runtime/spots/spot-handler-registry.d.ts +4 -3
- package/dist/runtime/spots/spot-handler-registry.js +6 -2
- 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 +18 -39
- 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.js +3 -3
- package/dist/runtime/spots/spot-remote-codec.js +5 -1
- package/dist/runtime/spots/spot-runtime-ports.d.ts +0 -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 -1
- package/dist/runtime/spots/spot-timer.d.ts +57 -5
- package/dist/runtime/spots/spot-timer.js +287 -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.js +1 -4
- package/dist/runtime/workers/index.js +1 -1
- package/package.json +3 -3
- package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
- 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/Locations/Rows.ts +2 -0
- package/src/contracts/Spots/Contracts.ts +8 -0
- package/src/contracts/Spots/ZLinkSpot.ts +3 -3
- package/src/runtime/abort.ts +12 -0
- package/src/runtime/actors/actor-authority-publication.ts +3 -2
- package/src/runtime/actors/actor-client.ts +61 -70
- package/src/runtime/actors/actor-context.ts +49 -9
- package/src/runtime/actors/actor-handoff.ts +282 -106
- package/src/runtime/actors/actor-join-relocation.ts +2 -0
- package/src/runtime/actors/actor-local-native-join.ts +4 -0
- package/src/runtime/actors/actor-mailbox.ts +40 -2
- package/src/runtime/actors/actor-remote-joiner.ts +6 -1
- package/src/runtime/actors/actor-reply.ts +42 -0
- 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 +41 -27
- package/src/runtime/actors/session-disconnected-wire.ts +66 -0
- package/src/runtime/admission.ts +69 -34
- package/src/runtime/application-jobs/application-job-queue-scope.ts +33 -1
- package/src/runtime/application-jobs/contracts.ts +2 -0
- package/src/runtime/backend/contracts/index.ts +39 -4
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
- package/src/runtime/backend/mesh-completion-table.ts +4 -0
- package/src/runtime/backend/mesh-dispatch-pump.ts +223 -124
- package/src/runtime/backend/node/node-raw-binding-port.ts +106 -70
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +221 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -5
- package/src/runtime/channels/channel-clients.ts +49 -24
- package/src/runtime/channels/channel-dispatch-pipeline.ts +173 -124
- package/src/runtime/channels/channel-dispatchers.ts +116 -72
- package/src/runtime/channels/channel-envelope.ts +105 -36
- package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
- package/src/runtime/channels/channel-runtime-manager.ts +12 -5
- package/src/runtime/channels/channel-transports.ts +49 -58
- 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/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 +31 -4
- package/src/runtime/execution/state-lane.ts +7 -0
- package/src/runtime/foundation/operation-registry.ts +98 -20
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +244 -67
- 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 +54 -37
- package/src/runtime/foundation/service-relocation-runtime.ts +7 -3
- package/src/runtime/foundation/service-runtime-contracts.ts +12 -1
- 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 +667 -152
- package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -11
- 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 +187 -51
- 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-transfer-runtime.ts +104 -430
- package/src/runtime/host/application-job-queue.ts +29 -44
- package/src/runtime/host/index.ts +286 -129
- 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 +86 -248
- package/src/runtime/host/route-mesh-runtime.ts +11 -5
- package/src/runtime/host/runtime-shutdown.ts +15 -4
- package/src/runtime/host/service-relocation-host-runtime.ts +784 -475
- package/src/runtime/host/spot-runtime-options-factory.ts +18 -7
- package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
- 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/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 +70 -40
- package/src/runtime/messaging/payload-codec.ts +8 -11
- package/src/runtime/messaging/request-result.ts +33 -29
- package/src/runtime/protocol/service_wire_codec.generated.ts +87 -4
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +13 -10
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +3 -2
- package/src/runtime/spots/index.ts +375 -281
- 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 +170 -86
- 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 +24 -19
- package/src/runtime/spots/spot-handler-registry.ts +15 -4
- 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 +22 -45
- package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
- package/src/runtime/spots/spot-outbound.ts +3 -3
- package/src/runtime/spots/spot-remote-codec.ts +9 -2
- package/src/runtime/spots/spot-runtime-ports.ts +0 -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 -1
- package/src/runtime/spots/spot-timer.ts +413 -157
- 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 +1 -5
- package/src/runtime/workers/index.ts +1 -1
|
@@ -20,7 +20,6 @@ export interface ZLinkMeshDispatchFailureContext {
|
|
|
20
20
|
export declare class ZLinkMeshDispatchPump {
|
|
21
21
|
private readonly node;
|
|
22
22
|
private readonly options;
|
|
23
|
-
private readonly dispatchOwnedRecord;
|
|
24
23
|
private pendingDomains;
|
|
25
24
|
private infrastructureScheduled;
|
|
26
25
|
private disposed;
|
|
@@ -30,15 +29,28 @@ export declare class ZLinkMeshDispatchPump {
|
|
|
30
29
|
private readonly capacityStop;
|
|
31
30
|
private recordsSinceYield;
|
|
32
31
|
private yieldStartedAtMs;
|
|
32
|
+
/** Drains in progress; the batch budget begins when work starts on an idle pump. */
|
|
33
|
+
private draining;
|
|
34
|
+
/** The macrotask boundary every drain waits for once the shared budget is spent. */
|
|
35
|
+
private pendingYield?;
|
|
33
36
|
constructor(node: ZLinkBackendMeshNode, options: ZLinkMeshDispatchPumpOptions);
|
|
34
37
|
start(): void;
|
|
35
|
-
dispose(): Promise<void>;
|
|
38
|
+
dispose(signal?: AbortSignal): Promise<void>;
|
|
36
39
|
private markReady;
|
|
37
40
|
private wakeApplicationWorker;
|
|
38
41
|
private startApplicationWorker;
|
|
39
42
|
private runApplicationWorker;
|
|
40
43
|
private waitForApplicationReady;
|
|
44
|
+
/**
|
|
45
|
+
* Starts one record in this worker's turn; a permit's scope covers the
|
|
46
|
+
* synchronous dispatch. Returns `false` when the dispatch threw (already
|
|
47
|
+
* reported), `true` when it returned synchronously, or the handler's pending
|
|
48
|
+
* completion, which the draining turn awaits itself before
|
|
49
|
+
* {@link finishRecord}.
|
|
50
|
+
*/
|
|
41
51
|
private dispatchRecord;
|
|
52
|
+
private failRecord;
|
|
53
|
+
/** Runs the record's terminal completion, then releases its permit turn. */
|
|
42
54
|
private finishRecord;
|
|
43
55
|
private reportDispatchError;
|
|
44
56
|
/**
|
|
@@ -51,6 +63,18 @@ export declare class ZLinkMeshDispatchPump {
|
|
|
51
63
|
private scheduleInfrastructure;
|
|
52
64
|
private drainInfrastructure;
|
|
53
65
|
private drainDomain;
|
|
66
|
+
/**
|
|
67
|
+
* Time the pump spent idle is not batch work: when work starts on an idle
|
|
68
|
+
* pump, its batch budget starts with it (spec 08 §6).
|
|
69
|
+
*/
|
|
70
|
+
private beginDrain;
|
|
71
|
+
/** Drains one claimed owner in this worker's turn, in claim order. */
|
|
72
|
+
private drainClaim;
|
|
73
|
+
/**
|
|
74
|
+
* The batch budget is shared by every drain of this pump, so once it is
|
|
75
|
+
* spent every drain waits for the same macrotask boundary; one drain that
|
|
76
|
+
* keeps running would otherwise hold the event loop the yield was for.
|
|
77
|
+
*/
|
|
54
78
|
private yieldIfNeeded;
|
|
55
79
|
private nowMs;
|
|
56
80
|
private acquirePermit;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkMeshDispatchPump = void 0;
|
|
4
4
|
const node_async_hooks_1 = require("node:async_hooks");
|
|
5
|
+
const abort_1 = require("../abort");
|
|
5
6
|
const node_os_1 = require("node:os");
|
|
6
7
|
const application_job_queue_scope_1 = require("../application-jobs/application-job-queue-scope");
|
|
7
8
|
const execution_1 = require("../execution");
|
|
@@ -24,7 +25,6 @@ const detachedMeshDispatchScope = node_async_hooks_1.AsyncLocalStorage.snapshot(
|
|
|
24
25
|
class ZLinkMeshDispatchPump {
|
|
25
26
|
node;
|
|
26
27
|
options;
|
|
27
|
-
dispatchOwnedRecord = this.dispatchRecord.bind(this);
|
|
28
28
|
pendingDomains = service_runtime_contracts_1.ReadyDomain.None;
|
|
29
29
|
infrastructureScheduled = false;
|
|
30
30
|
disposed = false;
|
|
@@ -34,6 +34,10 @@ class ZLinkMeshDispatchPump {
|
|
|
34
34
|
capacityStop = new AbortController();
|
|
35
35
|
recordsSinceYield = 0;
|
|
36
36
|
yieldStartedAtMs = 0;
|
|
37
|
+
/** Drains in progress; the batch budget begins when work starts on an idle pump. */
|
|
38
|
+
draining = 0;
|
|
39
|
+
/** The macrotask boundary every drain waits for once the shared budget is spent. */
|
|
40
|
+
pendingYield;
|
|
37
41
|
constructor(node, options) {
|
|
38
42
|
this.node = node;
|
|
39
43
|
this.options = options;
|
|
@@ -49,7 +53,7 @@ class ZLinkMeshDispatchPump {
|
|
|
49
53
|
return domains;
|
|
50
54
|
});
|
|
51
55
|
}
|
|
52
|
-
async dispose() {
|
|
56
|
+
async dispose(signal) {
|
|
53
57
|
if (this.disposed) {
|
|
54
58
|
return;
|
|
55
59
|
}
|
|
@@ -60,7 +64,7 @@ class ZLinkMeshDispatchPump {
|
|
|
60
64
|
wake();
|
|
61
65
|
this.idleApplicationWorkers.clear();
|
|
62
66
|
while (this.activeDrains.size > 0) {
|
|
63
|
-
await Promise.all([...this.activeDrains]);
|
|
67
|
+
await (0, abort_1.awaitWithAbort)(Promise.all([...this.activeDrains]), signal);
|
|
64
68
|
}
|
|
65
69
|
}
|
|
66
70
|
markReady(domains) {
|
|
@@ -117,14 +121,37 @@ class ZLinkMeshDispatchPump {
|
|
|
117
121
|
try {
|
|
118
122
|
for (;;) {
|
|
119
123
|
await this.waitForApplicationReady();
|
|
120
|
-
|
|
121
|
-
return;
|
|
124
|
+
this.beginDrain();
|
|
122
125
|
try {
|
|
123
|
-
|
|
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
|
+
}
|
|
124
145
|
}
|
|
125
146
|
catch (error) {
|
|
126
147
|
this.reportDispatchError(error);
|
|
127
148
|
}
|
|
149
|
+
finally {
|
|
150
|
+
readyBatch.reset();
|
|
151
|
+
this.draining -= 1;
|
|
152
|
+
}
|
|
153
|
+
if (this.disposed)
|
|
154
|
+
return;
|
|
128
155
|
}
|
|
129
156
|
}
|
|
130
157
|
finally {
|
|
@@ -141,30 +168,50 @@ class ZLinkMeshDispatchPump {
|
|
|
141
168
|
}
|
|
142
169
|
return new Promise((resolve) => this.idleApplicationWorkers.add(resolve));
|
|
143
170
|
}
|
|
144
|
-
|
|
171
|
+
/**
|
|
172
|
+
* Starts one record in this worker's turn; a permit's scope covers the
|
|
173
|
+
* synchronous dispatch. Returns `false` when the dispatch threw (already
|
|
174
|
+
* reported), `true` when it returned synchronously, or the handler's pending
|
|
175
|
+
* completion, which the draining turn awaits itself before
|
|
176
|
+
* {@link finishRecord}.
|
|
177
|
+
*/
|
|
178
|
+
dispatchRecord(owner, record, permit) {
|
|
179
|
+
const previous = permit === undefined ? undefined : (0, application_job_queue_scope_1.enterApplicationJobPermitScope)(permit);
|
|
145
180
|
let result;
|
|
146
181
|
try {
|
|
147
182
|
result = this.options.dispatch(owner, record);
|
|
148
183
|
}
|
|
149
184
|
catch (error) {
|
|
150
|
-
this.
|
|
151
|
-
return;
|
|
185
|
+
this.failRecord(error, record, permit);
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
if (permit !== undefined)
|
|
190
|
+
(0, application_job_queue_scope_1.leaveApplicationJobPermitScope)(previous);
|
|
152
191
|
}
|
|
153
|
-
return result
|
|
154
|
-
? this.finishRecord(record)
|
|
155
|
-
: Promise.resolve(result).then(() => this.finishRecord(record), (error) => this.reportDispatchError(error, meshDispatchFailureContext(record)));
|
|
192
|
+
return result ?? true;
|
|
156
193
|
}
|
|
157
|
-
|
|
158
|
-
|
|
194
|
+
failRecord(error, record, permit) {
|
|
195
|
+
(0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
|
|
196
|
+
this.reportDispatchError(error, meshDispatchFailureContext(record));
|
|
197
|
+
}
|
|
198
|
+
/** Runs the record's terminal completion, then releases its permit turn. */
|
|
199
|
+
finishRecord(record, permit) {
|
|
200
|
+
let result = undefined;
|
|
159
201
|
try {
|
|
160
202
|
result = record.onTerminalCompletion?.();
|
|
161
203
|
}
|
|
162
204
|
catch (error) {
|
|
163
205
|
this.reportDispatchError(error, meshDispatchFailureContext(record));
|
|
206
|
+
}
|
|
207
|
+
if (result === undefined) {
|
|
208
|
+
(0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
|
|
164
209
|
return;
|
|
165
210
|
}
|
|
166
|
-
|
|
167
|
-
|
|
211
|
+
return Promise.resolve(result).then(() => (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit), (error) => {
|
|
212
|
+
this.reportDispatchError(error, meshDispatchFailureContext(record));
|
|
213
|
+
(0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
|
|
214
|
+
});
|
|
168
215
|
}
|
|
169
216
|
reportDispatchError(error, context) {
|
|
170
217
|
this.options.reportError?.(error, context);
|
|
@@ -204,7 +251,7 @@ class ZLinkMeshDispatchPump {
|
|
|
204
251
|
if ((this.pendingDomains & service_runtime_contracts_1.ReadyDomain.Application) !== 0) {
|
|
205
252
|
setImmediate(() => this.wakeApplicationWorker());
|
|
206
253
|
}
|
|
207
|
-
const lifecycleBudgetExhausted = await this.drainDomain(
|
|
254
|
+
const lifecycleBudgetExhausted = await this.drainDomain(readyBatch);
|
|
208
255
|
if (lifecycleBudgetExhausted) {
|
|
209
256
|
this.pendingDomains |= service_runtime_contracts_1.ReadyDomain.Infrastructure;
|
|
210
257
|
await yieldToEventLoop();
|
|
@@ -215,111 +262,34 @@ class ZLinkMeshDispatchPump {
|
|
|
215
262
|
readyBatch.close();
|
|
216
263
|
}
|
|
217
264
|
}
|
|
218
|
-
async drainDomain(
|
|
265
|
+
async drainDomain(readyBatch) {
|
|
219
266
|
let claimsDrained = 0;
|
|
267
|
+
this.beginDrain();
|
|
220
268
|
try {
|
|
221
269
|
while (!this.disposed) {
|
|
222
|
-
if (
|
|
270
|
+
if (claimsDrained >= MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET) {
|
|
223
271
|
// Lifecycle work has priority, but a bounded turn lets application
|
|
224
272
|
// work make progress when lifecycle records keep arriving.
|
|
225
273
|
return true;
|
|
226
274
|
}
|
|
227
275
|
readyBatch.reset();
|
|
228
|
-
const drained = this.node.drainReady(
|
|
276
|
+
const drained = this.node.drainReady(service_runtime_contracts_1.ReadyDomain.Infrastructure, readyBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
|
|
229
277
|
if (!drained.ok || drained.records.length === 0) {
|
|
230
278
|
return false;
|
|
231
279
|
}
|
|
232
|
-
if (domain === service_runtime_contracts_1.ReadyDomain.Application && drained.hasResidue) {
|
|
233
|
-
this.markReady(service_runtime_contracts_1.ReadyDomain.Application);
|
|
234
|
-
}
|
|
235
280
|
for (let index = 0; index < drained.records.length; index += 1) {
|
|
236
281
|
const claim = readyBatch.takeClaim(index);
|
|
237
282
|
claimsDrained += 1;
|
|
238
283
|
const owner = drained.records[index];
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
let claimPermit = owner.terminalCompletion === true ||
|
|
247
|
-
owner.ordinaryIngressPreAdmitted === true ||
|
|
248
|
-
domain === service_runtime_contracts_1.ReadyDomain.Infrastructure
|
|
249
|
-
? undefined
|
|
250
|
-
: await this.acquirePermit();
|
|
251
|
-
try {
|
|
252
|
-
if (this.capacityStop.signal.aborted)
|
|
253
|
-
return;
|
|
254
|
-
ownerReceiveBatch.reset(capacity);
|
|
255
|
-
const received = claim.recvBatch(ownerReceiveBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
|
|
256
|
-
if (received.ok) {
|
|
257
|
-
// The bounded batch stays in claim order until its records finish.
|
|
258
|
-
try {
|
|
259
|
-
for (const record of received.records) {
|
|
260
|
-
if (this.disposed)
|
|
261
|
-
break;
|
|
262
|
-
const permit = record.applicationJobPermit ?? claimPermit;
|
|
263
|
-
if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
|
|
264
|
-
throw new Error('Pre-admitted raw ingress record lost its Application Job Queue permit.');
|
|
265
|
-
}
|
|
266
|
-
this.recordsSinceYield += 1;
|
|
267
|
-
if (permit === undefined) {
|
|
268
|
-
const dispatched = this.dispatchRecord(owner, record);
|
|
269
|
-
if (dispatched !== undefined)
|
|
270
|
-
await dispatched;
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
if (domain === service_runtime_contracts_1.ReadyDomain.Application &&
|
|
274
|
-
record.applicationJobPermit === undefined)
|
|
275
|
-
permit.markApplicationQueued();
|
|
276
|
-
// The scope now owns this reservation, including failure
|
|
277
|
-
// and detached handler handoff. Only unused permits remain
|
|
278
|
-
// owned by the receive attempt's finally block.
|
|
279
|
-
if (permit === claimPermit)
|
|
280
|
-
claimPermit = undefined;
|
|
281
|
-
const dispatched = (0, application_job_queue_scope_1.runWithApplicationJobPermit)(permit, this.dispatchOwnedRecord, owner, record);
|
|
282
|
-
if (dispatched !== undefined)
|
|
283
|
-
await dispatched;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
finally {
|
|
288
|
-
// Batch ownership includes records whose dispatch never began,
|
|
289
|
-
// including on failure or shutdown in the middle of the batch.
|
|
290
|
-
for (const record of received.records) {
|
|
291
|
-
for (const part of record.parts)
|
|
292
|
-
part.close();
|
|
293
|
-
record.releaseRetainedIngress?.();
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
finally {
|
|
299
|
-
claimPermit?.releaseAfterInternalProcessing();
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
finally {
|
|
303
|
-
claim.release();
|
|
304
|
-
if (receiveBatch === undefined)
|
|
305
|
-
ownerReceiveBatch?.close();
|
|
306
|
-
}
|
|
307
|
-
const yieldTurn = this.yieldIfNeeded();
|
|
308
|
-
if (yieldTurn !== undefined)
|
|
309
|
-
await yieldTurn;
|
|
310
|
-
};
|
|
311
|
-
// An application worker drains the one owner it claimed. Infrastructure owners
|
|
312
|
-
// drain independently, so a suspended owner does not hold the other claims.
|
|
313
|
-
if (receiveBatch !== undefined) {
|
|
314
|
-
await drainClaim();
|
|
315
|
-
}
|
|
316
|
-
else {
|
|
317
|
-
const drain = drainClaim().catch((error) => this.reportDispatchError(error));
|
|
318
|
-
this.activeDrains.add(drain);
|
|
319
|
-
void drain.finally(() => this.activeDrains.delete(drain));
|
|
320
|
-
}
|
|
284
|
+
this.beginDrain();
|
|
285
|
+
const drain = this.drainClaim(service_runtime_contracts_1.ReadyDomain.Infrastructure, owner, claim, undefined).catch((error) => this.reportDispatchError(error));
|
|
286
|
+
this.activeDrains.add(drain);
|
|
287
|
+
void drain.finally(() => {
|
|
288
|
+
this.draining -= 1;
|
|
289
|
+
this.activeDrains.delete(drain);
|
|
290
|
+
});
|
|
321
291
|
}
|
|
322
|
-
if (
|
|
292
|
+
if (claimsDrained >= MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET) {
|
|
323
293
|
this.wakeApplicationWorker();
|
|
324
294
|
return true;
|
|
325
295
|
}
|
|
@@ -334,17 +304,133 @@ class ZLinkMeshDispatchPump {
|
|
|
334
304
|
}
|
|
335
305
|
finally {
|
|
336
306
|
readyBatch.reset();
|
|
307
|
+
this.draining -= 1;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Time the pump spent idle is not batch work: when work starts on an idle
|
|
312
|
+
* pump, its batch budget starts with it (spec 08 §6).
|
|
313
|
+
*/
|
|
314
|
+
beginDrain() {
|
|
315
|
+
if (this.draining === 0) {
|
|
316
|
+
this.recordsSinceYield = 0;
|
|
317
|
+
this.yieldStartedAtMs = this.nowMs();
|
|
318
|
+
}
|
|
319
|
+
this.draining += 1;
|
|
320
|
+
}
|
|
321
|
+
/** Drains one claimed owner in this worker's turn, in claim order. */
|
|
322
|
+
async drainClaim(domain, owner, claim, receiveBatch) {
|
|
323
|
+
let ownerReceiveBatch = receiveBatch;
|
|
324
|
+
try {
|
|
325
|
+
ownerReceiveBatch ??= this.node.createReceiveBatch(MESH_DISPATCH_RECEIVE_CAPACITY, this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY);
|
|
326
|
+
const capacity = owner.ordinaryIngressPreAdmitted === true ? MESH_DISPATCH_RECEIVE_CAPACITY : 1;
|
|
327
|
+
let claimPermit = owner.terminalCompletion === true ||
|
|
328
|
+
owner.ordinaryIngressPreAdmitted === true ||
|
|
329
|
+
domain === service_runtime_contracts_1.ReadyDomain.Infrastructure
|
|
330
|
+
? undefined
|
|
331
|
+
: await this.acquirePermit();
|
|
332
|
+
try {
|
|
333
|
+
if (this.capacityStop.signal.aborted)
|
|
334
|
+
return;
|
|
335
|
+
ownerReceiveBatch.reset(capacity);
|
|
336
|
+
const received = claim.recvBatch(ownerReceiveBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
|
|
337
|
+
if (received.ok) {
|
|
338
|
+
// The bounded batch stays in claim order until its records finish.
|
|
339
|
+
try {
|
|
340
|
+
for (const record of received.records) {
|
|
341
|
+
if (this.disposed)
|
|
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
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
finally {
|
|
403
|
+
claimPermit?.releaseAfterInternalProcessing();
|
|
404
|
+
}
|
|
337
405
|
}
|
|
406
|
+
finally {
|
|
407
|
+
claim.release();
|
|
408
|
+
if (receiveBatch === undefined)
|
|
409
|
+
ownerReceiveBatch?.close();
|
|
410
|
+
}
|
|
411
|
+
const yieldTurn = this.yieldIfNeeded();
|
|
412
|
+
if (yieldTurn !== undefined)
|
|
413
|
+
await yieldTurn;
|
|
338
414
|
}
|
|
415
|
+
/**
|
|
416
|
+
* The batch budget is shared by every drain of this pump, so once it is
|
|
417
|
+
* spent every drain waits for the same macrotask boundary; one drain that
|
|
418
|
+
* keeps running would otherwise hold the event loop the yield was for.
|
|
419
|
+
*/
|
|
339
420
|
yieldIfNeeded() {
|
|
421
|
+
if (this.pendingYield !== undefined)
|
|
422
|
+
return this.pendingYield;
|
|
340
423
|
const nowMs = this.nowMs();
|
|
341
424
|
if (this.recordsSinceYield < MESH_DISPATCH_YIELD_RECORDS &&
|
|
342
425
|
nowMs - this.yieldStartedAtMs < MESH_DISPATCH_YIELD_INTERVAL_MS)
|
|
343
426
|
return undefined;
|
|
344
427
|
this.recordsSinceYield = 0;
|
|
345
|
-
|
|
428
|
+
const pendingYield = yieldToTimers().then(() => {
|
|
429
|
+
this.pendingYield = undefined;
|
|
346
430
|
this.yieldStartedAtMs = this.nowMs();
|
|
347
431
|
});
|
|
432
|
+
this.pendingYield = pendingYield;
|
|
433
|
+
return pendingYield;
|
|
348
434
|
}
|
|
349
435
|
nowMs() {
|
|
350
436
|
return this.options.monotonicNowMs?.() ?? performance.now();
|