@zlink-systems/framework 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +15 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +1 -2
- package/dist/runtime/activation-admission.js +2 -6
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +13 -11
- package/dist/runtime/actors/actor-handoff.d.ts +4 -4
- package/dist/runtime/actors/actor-handoff.js +8 -8
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +83 -105
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.js +5 -9
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
- package/dist/runtime/actors/deferred-join-completion.js +1 -0
- package/dist/runtime/actors/index.d.ts +9 -7
- package/dist/runtime/actors/index.js +87 -69
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +2 -0
- package/dist/runtime/admission.js +7 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +6 -23
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
- package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -8
- package/dist/runtime/channels/channel-clients.js +68 -52
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -10
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.js +5 -2
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
- package/dist/runtime/channels/channel-socket-registry.js +248 -174
- package/dist/runtime/channels/channel-transports.d.ts +11 -17
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +130 -72
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +12 -9
- package/dist/runtime/execution/index.js +58 -14
- package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
- package/dist/runtime/execution/serial-execution-queue.js +54 -15
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
- package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
- package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
- package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
- package/dist/runtime/foundation/service-topology-registry.js +17 -32
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
- package/dist/runtime/host/actor-transfer-runtime.js +143 -176
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +14 -13
- package/dist/runtime/host/index.js +190 -157
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +7 -20
- package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
- package/dist/runtime/host/route-mesh-runtime.js +171 -252
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
- package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
- package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
- package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +4 -9
- package/dist/runtime/locations/lifecycle.js +2 -31
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +37 -28
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
- package/dist/runtime/locations/spot-location-claims.js +42 -1
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
- package/dist/runtime/spots/index.d.ts +14 -20
- package/dist/runtime/spots/index.js +302 -176
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
- package/dist/runtime/spots/spot-activation-registry.js +14 -50
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +2 -2
- package/dist/runtime/spots/spot-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-activation.js +49 -32
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
- package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
- package/dist/runtime/spots/spot-actor-membership.js +22 -45
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +9 -20
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +5 -4
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +9 -8
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
- package/dist/runtime/spots/spot-serial-executor.js +2 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
- package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +11 -1
- package/dist/runtime/streams/index.d.ts +14 -15
- package/dist/runtime/streams/index.js +20 -21
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +14 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +2 -8
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +39 -33
- package/src/runtime/actors/actor-handoff.ts +24 -22
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +172 -174
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +9 -11
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +10 -6
- package/src/runtime/actors/index.ts +100 -79
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +8 -1
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +13 -29
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
- package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
- package/src/runtime/backend/raw-binding-port.ts +1 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -85
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -23
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +6 -2
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +301 -192
- package/src/runtime/channels/channel-transports.ts +161 -112
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +172 -91
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +60 -20
- package/src/runtime/execution/serial-execution-queue.ts +131 -18
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
- package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
- package/src/runtime/foundation/service-topology-registry.ts +23 -32
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +180 -260
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +327 -296
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +8 -41
- package/src/runtime/host/route-mesh-runtime.ts +228 -271
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
- package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +13 -43
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +75 -49
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +58 -1
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
- package/src/runtime/spots/index.ts +433 -229
- package/src/runtime/spots/spot-activation-registry.ts +30 -69
- package/src/runtime/spots/spot-activation-state.ts +2 -2
- package/src/runtime/spots/spot-activation.ts +67 -37
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
- package/src/runtime/spots/spot-actor-membership.ts +40 -72
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -30
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +21 -17
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
- package/src/runtime/spots/spot-outbound.ts +45 -23
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +5 -27
- package/src/runtime/spots/spot-serial-executor.ts +2 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +21 -1
- package/src/runtime/streams/index.ts +76 -64
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
import { macrotaskBoundary } from '../abort';
|
|
2
|
+
import {
|
|
3
|
+
diagnosticWorkName,
|
|
4
|
+
guardStateLaneCompletion,
|
|
5
|
+
isStructuralGuardEnabled,
|
|
6
|
+
trackDiagnosticCompletion
|
|
7
|
+
} from './state-lane';
|
|
8
|
+
|
|
1
9
|
export type ZLinkSerialWorkLane = 'application' | 'lifecycle';
|
|
2
10
|
|
|
3
11
|
export interface ZLinkSerialWorkOptions {
|
|
@@ -21,7 +29,7 @@ export const ZLINK_DEFAULT_SERIAL_SCHEDULER_OPTIONS: Required<ZLinkSerialSchedul
|
|
|
21
29
|
export interface ZLinkSerialWorkRecord<T> {
|
|
22
30
|
readonly acceptedSequence: bigint;
|
|
23
31
|
readonly lane: ZLinkSerialWorkLane;
|
|
24
|
-
|
|
32
|
+
operation: () => Promise<T> | T;
|
|
25
33
|
readonly context?: unknown;
|
|
26
34
|
resolve(value: T): void;
|
|
27
35
|
reject(reason: unknown): void;
|
|
@@ -30,6 +38,11 @@ export interface ZLinkSerialWorkRecord<T> {
|
|
|
30
38
|
fail(reason: unknown): void;
|
|
31
39
|
}
|
|
32
40
|
|
|
41
|
+
/** The active lifecycle owner decides which existing application records can run. */
|
|
42
|
+
export interface ZLinkSerialLifecycleContext {
|
|
43
|
+
canExecuteApplication(record: ZLinkSerialWorkRecord<unknown>): boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
33
46
|
/** Readiness work that must complete without claiming the serial owner. */
|
|
34
47
|
export interface ZLinkSerialWorkPreparation {
|
|
35
48
|
prepare(signal: AbortSignal): Promise<void>;
|
|
@@ -141,8 +154,15 @@ export class ZLinkSerialExecutionQueue {
|
|
|
141
154
|
}
|
|
142
155
|
|
|
143
156
|
/** Holds lifecycle FIFO through an operation result while its application turns can run. */
|
|
144
|
-
submitLifecycleOperation<T>(
|
|
145
|
-
|
|
157
|
+
submitLifecycleOperation<T>(
|
|
158
|
+
operation: () => Promise<T> | T,
|
|
159
|
+
context?: ZLinkSerialLifecycleContext
|
|
160
|
+
): Promise<T> {
|
|
161
|
+
return this.admit(operation, { lane: 'lifecycle' }, context, undefined, true);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
visitPendingApplication(visitor: (record: ZLinkSerialWorkRecord<unknown>) => void): void {
|
|
165
|
+
for (const record of this.application.records) visitor(record);
|
|
146
166
|
}
|
|
147
167
|
|
|
148
168
|
get hasPendingWork(): boolean {
|
|
@@ -170,6 +190,10 @@ export class ZLinkSerialExecutionQueue {
|
|
|
170
190
|
this.closed = true;
|
|
171
191
|
}
|
|
172
192
|
|
|
193
|
+
get admissionClosed(): boolean {
|
|
194
|
+
return this.closed;
|
|
195
|
+
}
|
|
196
|
+
|
|
173
197
|
private admit<T>(
|
|
174
198
|
operation: () => Promise<T> | T,
|
|
175
199
|
options: ZLinkSerialWorkOptions,
|
|
@@ -318,11 +342,7 @@ export class ZLinkSerialExecutionQueue {
|
|
|
318
342
|
} finally {
|
|
319
343
|
this.draining = false;
|
|
320
344
|
this.claimStartedAt = undefined;
|
|
321
|
-
if (
|
|
322
|
-
!waitingForPreparation &&
|
|
323
|
-
(this.application.records.length > 0 ||
|
|
324
|
-
(this.activeLifecycle === undefined && this.lifecycle.records.length > 0))
|
|
325
|
-
) {
|
|
345
|
+
if (!waitingForPreparation && this.selectNext() !== undefined) {
|
|
326
346
|
this.scheduleDrain();
|
|
327
347
|
} else {
|
|
328
348
|
if (!this.hasPendingWork) {
|
|
@@ -338,26 +358,34 @@ export class ZLinkSerialExecutionQueue {
|
|
|
338
358
|
readonly record: SerialWorkRecord<unknown>;
|
|
339
359
|
}
|
|
340
360
|
| undefined {
|
|
341
|
-
const
|
|
361
|
+
const lifecycleOwner = this.activeLifecycle?.context as ZLinkSerialLifecycleContext | undefined;
|
|
362
|
+
const applicationRecord =
|
|
363
|
+
lifecycleOwner === undefined
|
|
364
|
+
? this.application.records[0]
|
|
365
|
+
: this.application.records.find((record) => lifecycleOwner.canExecuteApplication(record));
|
|
366
|
+
const applicationReady = applicationRecord !== undefined;
|
|
342
367
|
const lifecycleReady = this.activeLifecycle === undefined && this.lifecycle.records.length > 0;
|
|
343
368
|
if (!applicationReady && !lifecycleReady) return undefined;
|
|
344
369
|
if (!applicationReady) {
|
|
345
370
|
return { lane: 'lifecycle', record: this.lifecycle.records[0]! };
|
|
346
371
|
}
|
|
347
372
|
if (!lifecycleReady) {
|
|
348
|
-
return { lane: 'application', record:
|
|
373
|
+
return { lane: 'application', record: applicationRecord! };
|
|
349
374
|
}
|
|
350
375
|
if (!this.lifecycleDebt && this.lifecycleStreak < this.lifecycleBurstLimit) {
|
|
351
376
|
return { lane: 'lifecycle', record: this.lifecycle.records[0]! };
|
|
352
377
|
}
|
|
353
|
-
return { lane: 'application', record:
|
|
378
|
+
return { lane: 'application', record: applicationRecord! };
|
|
354
379
|
}
|
|
355
380
|
|
|
356
381
|
private takeSelected(selection: {
|
|
357
382
|
readonly lane: ZLinkSerialWorkLane;
|
|
358
383
|
readonly record: SerialWorkRecord<unknown>;
|
|
359
384
|
}): ZLinkSerialWorkRecord<unknown> {
|
|
360
|
-
const record =
|
|
385
|
+
const record =
|
|
386
|
+
selection.lane === 'lifecycle'
|
|
387
|
+
? this.takeLifecycle()
|
|
388
|
+
: this.takeApplication(selection.record);
|
|
361
389
|
if (record !== selection.record) {
|
|
362
390
|
throw new Error('The selected serial work record changed before owner claim.');
|
|
363
391
|
}
|
|
@@ -374,10 +402,12 @@ export class ZLinkSerialExecutionQueue {
|
|
|
374
402
|
return record;
|
|
375
403
|
}
|
|
376
404
|
|
|
377
|
-
private takeApplication(): ZLinkSerialWorkRecord<unknown> {
|
|
405
|
+
private takeApplication(selected: SerialWorkRecord<unknown>): ZLinkSerialWorkRecord<unknown> {
|
|
378
406
|
this.lifecycleStreak = 0;
|
|
379
407
|
this.lifecycleDebt = false;
|
|
380
|
-
return this.application.records.shift()!;
|
|
408
|
+
if (this.application.records[0] === selected) return this.application.records.shift()!;
|
|
409
|
+
const index = this.application.records.indexOf(selected);
|
|
410
|
+
return this.application.records.splice(index, 1)[0]!;
|
|
381
411
|
}
|
|
382
412
|
|
|
383
413
|
private startPreparation(record: SerialWorkRecord<unknown>): void {
|
|
@@ -442,6 +472,93 @@ export class ZLinkSerialExecutionQueue {
|
|
|
442
472
|
}
|
|
443
473
|
}
|
|
444
474
|
|
|
475
|
+
if (isStructuralGuardEnabled()) {
|
|
476
|
+
const submit = ZLinkSerialExecutionQueue.prototype.submit;
|
|
477
|
+
ZLinkSerialExecutionQueue.prototype.submit = function <T>(
|
|
478
|
+
this: ZLinkSerialExecutionQueue,
|
|
479
|
+
operation: () => Promise<T> | T,
|
|
480
|
+
options: ZLinkSerialWorkOptions = {},
|
|
481
|
+
context?: unknown
|
|
482
|
+
): Promise<T> {
|
|
483
|
+
return guardStateLaneCompletion(
|
|
484
|
+
trackDiagnosticCompletion(
|
|
485
|
+
submit.call(this, operation, options, context) as Promise<T>,
|
|
486
|
+
`serial ${options.lane ?? 'application'} ${diagnosticWorkName(operation)}`
|
|
487
|
+
),
|
|
488
|
+
'serial completion'
|
|
489
|
+
);
|
|
490
|
+
};
|
|
491
|
+
|
|
492
|
+
const submitPreAdmitted = ZLinkSerialExecutionQueue.prototype.submitPreAdmitted;
|
|
493
|
+
ZLinkSerialExecutionQueue.prototype.submitPreAdmitted = function <T>(
|
|
494
|
+
this: ZLinkSerialExecutionQueue,
|
|
495
|
+
operation: () => Promise<T> | T,
|
|
496
|
+
options: ZLinkSerialWorkOptions = {},
|
|
497
|
+
context?: unknown
|
|
498
|
+
): Promise<T> {
|
|
499
|
+
return guardStateLaneCompletion(
|
|
500
|
+
trackDiagnosticCompletion(
|
|
501
|
+
submitPreAdmitted.call(this, operation, options, context) as Promise<T>,
|
|
502
|
+
`serial ${options.lane ?? 'application'} ${diagnosticWorkName(operation)}`
|
|
503
|
+
),
|
|
504
|
+
'serial completion'
|
|
505
|
+
);
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
const submitContinuation = ZLinkSerialExecutionQueue.prototype.submitContinuation;
|
|
509
|
+
ZLinkSerialExecutionQueue.prototype.submitContinuation = function <T>(
|
|
510
|
+
this: ZLinkSerialExecutionQueue,
|
|
511
|
+
operation: () => Promise<T> | T,
|
|
512
|
+
context?: unknown
|
|
513
|
+
): Promise<T> {
|
|
514
|
+
return guardStateLaneCompletion(
|
|
515
|
+
trackDiagnosticCompletion(
|
|
516
|
+
submitContinuation.call(this, operation, context) as Promise<T>,
|
|
517
|
+
`serial continuation ${diagnosticWorkName(operation)}`
|
|
518
|
+
),
|
|
519
|
+
'serial completion'
|
|
520
|
+
);
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
const admitDurablePrefix = ZLinkSerialExecutionQueue.prototype.admitDurablePrefix;
|
|
524
|
+
ZLinkSerialExecutionQueue.prototype.admitDurablePrefix = function <T>(
|
|
525
|
+
this: ZLinkSerialExecutionQueue,
|
|
526
|
+
operation: () => Promise<T> | T,
|
|
527
|
+
options: ZLinkSerialWorkOptions = {},
|
|
528
|
+
context?: unknown,
|
|
529
|
+
preparation?: ZLinkSerialWorkPreparation
|
|
530
|
+
): Promise<T> {
|
|
531
|
+
return guardStateLaneCompletion(
|
|
532
|
+
trackDiagnosticCompletion(
|
|
533
|
+
admitDurablePrefix.call(this, operation, options, context, preparation) as Promise<T>,
|
|
534
|
+
`serial durable ${diagnosticWorkName(operation)}`
|
|
535
|
+
),
|
|
536
|
+
'serial completion'
|
|
537
|
+
);
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
const submitLifecycleOperation = ZLinkSerialExecutionQueue.prototype.submitLifecycleOperation;
|
|
541
|
+
ZLinkSerialExecutionQueue.prototype.submitLifecycleOperation = function <T>(
|
|
542
|
+
this: ZLinkSerialExecutionQueue,
|
|
543
|
+
operation: () => Promise<T> | T
|
|
544
|
+
): Promise<T> {
|
|
545
|
+
return guardStateLaneCompletion(
|
|
546
|
+
trackDiagnosticCompletion(
|
|
547
|
+
submitLifecycleOperation.call(this, operation) as Promise<T>,
|
|
548
|
+
`serial lifecycle ${diagnosticWorkName(operation)}`
|
|
549
|
+
),
|
|
550
|
+
'serial completion'
|
|
551
|
+
);
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
const whenIdle = ZLinkSerialExecutionQueue.prototype.whenIdle;
|
|
555
|
+
ZLinkSerialExecutionQueue.prototype.whenIdle = function (
|
|
556
|
+
this: ZLinkSerialExecutionQueue
|
|
557
|
+
): Promise<void> {
|
|
558
|
+
return guardStateLaneCompletion(whenIdle.call(this), 'serial completion');
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
|
|
445
562
|
function createLane(): ZLinkSerialAdmissionLane {
|
|
446
563
|
return {
|
|
447
564
|
records: []
|
|
@@ -459,7 +576,3 @@ function validateNonNegative(value: number, field: string): void {
|
|
|
459
576
|
throw new RangeError(`${field} must be a non-negative safe integer.`);
|
|
460
577
|
}
|
|
461
578
|
}
|
|
462
|
-
|
|
463
|
-
function macrotaskBoundary(): Promise<void> {
|
|
464
|
-
return new Promise((resolve) => setImmediate(resolve));
|
|
465
|
-
}
|
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
const UNKNOWN_DIAGNOSTIC_CALLER = '<unknown caller>';
|
|
2
3
|
|
|
3
4
|
type ZLinkStateLaneWork<T> = () => Promise<T> | T;
|
|
4
5
|
|
|
6
|
+
interface ZLinkStateLaneTurn {
|
|
7
|
+
readonly lane: ZLinkStateLane;
|
|
8
|
+
active: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function isStructuralGuardEnabled(): boolean {
|
|
12
|
+
return process.env.ZLINK_NODE_STRUCTURAL_GUARD === '1' || process.env.NODE_ENV === 'test';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const currentLaneStorage = new AsyncLocalStorage<ZLinkStateLane>();
|
|
16
|
+
const diagnosticPending = isStructuralGuardEnabled() ? new Map<number, string>() : undefined;
|
|
17
|
+
let nextDiagnosticWork = 0;
|
|
18
|
+
const diagnosticTurnStorage =
|
|
19
|
+
diagnosticPending === undefined ? undefined : new AsyncLocalStorage<ZLinkStateLaneTurn>();
|
|
20
|
+
|
|
5
21
|
/**
|
|
6
22
|
* Single-owner execution lane for a component's mutable state.
|
|
7
23
|
*
|
|
@@ -10,15 +26,13 @@ type ZLinkStateLaneWork<T> = () => Promise<T> | T;
|
|
|
10
26
|
* Actor serial executors, which also own lifecycle and relocation concerns.
|
|
11
27
|
*/
|
|
12
28
|
export class ZLinkStateLane {
|
|
13
|
-
private static readonly currentLaneStorage = new AsyncLocalStorage<ZLinkStateLane>();
|
|
14
|
-
|
|
15
29
|
private readonly mailbox: Array<() => Promise<void>> = [];
|
|
16
30
|
private draining = false;
|
|
17
31
|
private drainPromise: Promise<void> | undefined;
|
|
18
32
|
private closed = false;
|
|
19
33
|
|
|
20
34
|
static get current(): ZLinkStateLane | undefined {
|
|
21
|
-
return
|
|
35
|
+
return currentLaneStorage.getStore();
|
|
22
36
|
}
|
|
23
37
|
|
|
24
38
|
get isOnLane(): boolean {
|
|
@@ -100,7 +114,7 @@ export class ZLinkStateLane {
|
|
|
100
114
|
return;
|
|
101
115
|
}
|
|
102
116
|
try {
|
|
103
|
-
await
|
|
117
|
+
await currentLaneStorage.run(this, work);
|
|
104
118
|
} catch {
|
|
105
119
|
// Posted callbacks own their errors. One failure must not strand later work.
|
|
106
120
|
}
|
|
@@ -114,3 +128,127 @@ export class ZLinkStateLane {
|
|
|
114
128
|
}
|
|
115
129
|
}
|
|
116
130
|
}
|
|
131
|
+
|
|
132
|
+
// Install the structural check only in diagnostic processes. The release run()
|
|
133
|
+
// method and its returned Promise are left untouched.
|
|
134
|
+
if (isStructuralGuardEnabled()) {
|
|
135
|
+
Object.defineProperty(ZLinkStateLane, 'current', {
|
|
136
|
+
configurable: true,
|
|
137
|
+
get: () => {
|
|
138
|
+
const turn = diagnosticTurnStorage?.getStore();
|
|
139
|
+
return turn?.active === true ? turn.lane : undefined;
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const run = ZLinkStateLane.prototype.run;
|
|
144
|
+
ZLinkStateLane.prototype.run = function <T>(
|
|
145
|
+
this: ZLinkStateLane,
|
|
146
|
+
work: ZLinkStateLaneWork<T>
|
|
147
|
+
): Promise<T> {
|
|
148
|
+
const completion = run.call(this, () => runDiagnosticTurn(this, work)) as Promise<T>;
|
|
149
|
+
return guardStateLaneCompletion(
|
|
150
|
+
trackDiagnosticCompletion(completion, `state lane ${diagnosticWorkName(work)}`),
|
|
151
|
+
'another state lane completion',
|
|
152
|
+
this
|
|
153
|
+
);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const tryPost = ZLinkStateLane.prototype.tryPost;
|
|
157
|
+
ZLinkStateLane.prototype.tryPost = function (
|
|
158
|
+
this: ZLinkStateLane,
|
|
159
|
+
work: ZLinkStateLaneWork<void>
|
|
160
|
+
): boolean {
|
|
161
|
+
const release = registerDiagnosticWork(`state lane post ${diagnosticWorkName(work)}`);
|
|
162
|
+
const accepted = tryPost.call(this, () => {
|
|
163
|
+
try {
|
|
164
|
+
const result = runDiagnosticTurn(this, work);
|
|
165
|
+
if (result instanceof Promise) return result.finally(release);
|
|
166
|
+
release();
|
|
167
|
+
return result;
|
|
168
|
+
} catch (error) {
|
|
169
|
+
release();
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
if (!accepted) release();
|
|
174
|
+
return accepted;
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function runDiagnosticTurn<T>(lane: ZLinkStateLane, work: ZLinkStateLaneWork<T>): Promise<T> | T {
|
|
179
|
+
const turn: ZLinkStateLaneTurn = { lane, active: true };
|
|
180
|
+
return diagnosticTurnStorage!.run(turn, () => {
|
|
181
|
+
try {
|
|
182
|
+
const result = work();
|
|
183
|
+
if (result instanceof Promise) {
|
|
184
|
+
return result.finally(() => {
|
|
185
|
+
turn.active = false;
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
turn.active = false;
|
|
189
|
+
return result;
|
|
190
|
+
} catch (error) {
|
|
191
|
+
turn.active = false;
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** Applied only by debug-installed wrappers; release completions keep their original identity. */
|
|
198
|
+
export function guardStateLaneCompletion<T>(
|
|
199
|
+
completion: Promise<T>,
|
|
200
|
+
label: string,
|
|
201
|
+
owner?: ZLinkStateLane
|
|
202
|
+
): Promise<T> {
|
|
203
|
+
return new Proxy(completion, {
|
|
204
|
+
get(target, property) {
|
|
205
|
+
if (property === 'then') {
|
|
206
|
+
return (onFulfilled: (value: T) => unknown, onRejected: (error: unknown) => unknown) => {
|
|
207
|
+
const current = ZLinkStateLane.current;
|
|
208
|
+
if (current !== undefined && current !== owner) {
|
|
209
|
+
throw new Error(`A state lane turn cannot wait for ${label}.`);
|
|
210
|
+
}
|
|
211
|
+
return target.then(onFulfilled, onRejected);
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
if (property === 'catch') {
|
|
215
|
+
return (onRejected: (error: unknown) => unknown) =>
|
|
216
|
+
guardStateLaneCompletion(target.catch(onRejected), label, owner);
|
|
217
|
+
}
|
|
218
|
+
if (property === 'finally') {
|
|
219
|
+
return (onFinally: () => void) =>
|
|
220
|
+
guardStateLaneCompletion(target.finally(onFinally), label, owner);
|
|
221
|
+
}
|
|
222
|
+
const value = Reflect.get(target, property, target) as unknown;
|
|
223
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export function trackDiagnosticCompletion<T>(completion: Promise<T>, name: string): Promise<T> {
|
|
229
|
+
const release = registerDiagnosticWork(name);
|
|
230
|
+
void completion.then(release, release);
|
|
231
|
+
return completion;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function debugPendingWorkNames(): string[] {
|
|
235
|
+
return [...(diagnosticPending?.values() ?? [])];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export function diagnosticWorkName(work: { readonly name: string }): string {
|
|
239
|
+
return work.name.length > 0 ? work.name : '<anonymous>';
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function registerDiagnosticWork(name: string): () => void {
|
|
243
|
+
if (diagnosticPending === undefined) return () => undefined;
|
|
244
|
+
const id = ++nextDiagnosticWork;
|
|
245
|
+
const frames = new Error().stack?.split('\n').slice(2) ?? [];
|
|
246
|
+
const caller =
|
|
247
|
+
frames
|
|
248
|
+
.find((frame) => !frame.includes('state-lane.') && !frame.includes('serial-execution-queue.'))
|
|
249
|
+
?.trim() ?? UNKNOWN_DIAGNOSTIC_CALLER;
|
|
250
|
+
diagnosticPending.set(id, `${name} ${caller}`);
|
|
251
|
+
return () => {
|
|
252
|
+
diagnosticPending.delete(id);
|
|
253
|
+
};
|
|
254
|
+
}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { UINT64_MAX } from '@zlink-systems/stream-wire';
|
|
1
2
|
import { createHash } from 'node:crypto';
|
|
2
3
|
import type { RoutingId, ZLinkActorJoinOperationId } from '../../contracts';
|
|
3
|
-
import { decodeRoutingId, encodeRoutingIdStorageHex } from '../routing-id';
|
|
4
4
|
import {
|
|
5
5
|
decodeZljrRecordV1 as decodeGeneratedZljrRecordV1,
|
|
6
6
|
encodeZljrRecordV1 as encodeGeneratedZljrRecordV1
|
|
7
7
|
} from '../protocol/service_wire_pilot_codec.generated';
|
|
8
|
+
import { decodeRoutingId, encodeRoutingIdStorageHex } from '../routing-id';
|
|
8
9
|
import { decodeServiceWireFrozenRecord } from './service-stateful-wire-codec';
|
|
10
|
+
const ACTOR_ID_DIGEST_MAX_BYTES = 0xffff;
|
|
11
|
+
|
|
12
|
+
export const SHA256_DIGEST_BYTES = 32;
|
|
9
13
|
|
|
10
14
|
const RECOVERY_PACKET_NAME = '__zlink.actor.routed_join.recovery';
|
|
11
15
|
const RECOVERY_CONTENT_TYPE = 'application/x-zlink-actor-routed-join-recovery-v1';
|
|
@@ -13,8 +17,8 @@ const MAXIMUM_METADATA_BYTES = 256 * 1024;
|
|
|
13
17
|
const FRAMEWORK_METADATA_UPPER_BOUND_BYTES = 64 * 1024;
|
|
14
18
|
const ACCEPTED_JOURNAL_UPPER_BOUND_BYTES = 16 * 1024 * 1024;
|
|
15
19
|
const SNAPSHOT_APPLICATION_STATE_RESERVATION_BYTES = 64 * 1024 * 1024;
|
|
16
|
-
const RECREATE_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.recreate';
|
|
17
|
-
const SNAPSHOT_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.snapshot';
|
|
20
|
+
export const RECREATE_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.recreate';
|
|
21
|
+
export const SNAPSHOT_RELOCATION_CONTENT_TYPE = 'application/vnd.zlink.actor-relocation.snapshot';
|
|
18
22
|
|
|
19
23
|
export interface CanonicalActorJoinRecoveryRequest {
|
|
20
24
|
readonly actorId: string;
|
|
@@ -87,7 +91,8 @@ export function canonicalActorJoinHandoffId(input: {
|
|
|
87
91
|
readonly correlation: bigint;
|
|
88
92
|
}): string {
|
|
89
93
|
const actor = textBytes(input.actorId, 'actorId');
|
|
90
|
-
if (actor.byteLength >
|
|
94
|
+
if (actor.byteLength > ACTOR_ID_DIGEST_MAX_BYTES)
|
|
95
|
+
throw new RangeError('Actor id exceeds u16 bytes.');
|
|
91
96
|
const digest = createHash('sha256')
|
|
92
97
|
.update(
|
|
93
98
|
Buffer.concat([
|
|
@@ -139,7 +144,7 @@ export function encodeCanonicalActorJoinRecoverySavedWork(
|
|
|
139
144
|
RelocationChecksumCrc32c: 0,
|
|
140
145
|
RelocationAggregateId: canonicalUuid(input.relocationId),
|
|
141
146
|
RelocationAggregateGeneration: 1n,
|
|
142
|
-
RelocationInventoryDigest: Buffer.alloc(
|
|
147
|
+
RelocationInventoryDigest: Buffer.alloc(SHA256_DIGEST_BYTES).toString('base64'),
|
|
143
148
|
RequestContentType: requireText(input.requestContentType, 'Actor Join request content type'),
|
|
144
149
|
Request: '',
|
|
145
150
|
HandoffFrames: [],
|
|
@@ -423,7 +428,7 @@ function requireText(value: string | undefined, name: string): string {
|
|
|
423
428
|
}
|
|
424
429
|
|
|
425
430
|
function nonZeroU64(value: bigint, name: string): bigint {
|
|
426
|
-
if (value < 1n || value >
|
|
431
|
+
if (value < 1n || value > UINT64_MAX) throw new RangeError(`${name} is invalid.`);
|
|
427
432
|
return value;
|
|
428
433
|
}
|
|
429
434
|
|
|
@@ -435,7 +440,7 @@ function u16(value: number): Buffer {
|
|
|
435
440
|
}
|
|
436
441
|
|
|
437
442
|
function u64(value: bigint): Buffer {
|
|
438
|
-
if (value < 0n || value >
|
|
443
|
+
if (value < 0n || value > UINT64_MAX) throw new RangeError('u64');
|
|
439
444
|
const result = Buffer.alloc(8);
|
|
440
445
|
result.writeBigUInt64BE(value);
|
|
441
446
|
return result;
|
|
@@ -461,7 +466,7 @@ function integer(value: unknown, name: string): bigint {
|
|
|
461
466
|
if (typeof value !== 'string' || !/^\d+$/u.test(value))
|
|
462
467
|
throw new TypeError(`${name} is invalid.`);
|
|
463
468
|
const parsed = BigInt(value);
|
|
464
|
-
if (parsed >
|
|
469
|
+
if (parsed > UINT64_MAX) throw new TypeError(`${name} exceeds u64.`);
|
|
465
470
|
return parsed;
|
|
466
471
|
}
|
|
467
472
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { runZLinkExecutionArea } from '../execution';
|
|
2
|
-
|
|
3
1
|
export interface CloseableResource {
|
|
4
2
|
close(): void | Promise<void>;
|
|
5
3
|
}
|
|
@@ -23,7 +21,7 @@ export class EventLoopResourceStack {
|
|
|
23
21
|
}
|
|
24
22
|
}
|
|
25
23
|
|
|
26
|
-
async function closeResources(resources: readonly CloseableResource[]): Promise<void> {
|
|
24
|
+
export async function closeResources(resources: readonly CloseableResource[]): Promise<void> {
|
|
27
25
|
const failures: unknown[] = [];
|
|
28
26
|
for (const resource of resources) {
|
|
29
27
|
try {
|
|
@@ -32,126 +30,11 @@ async function closeResources(resources: readonly CloseableResource[]): Promise<
|
|
|
32
30
|
failures.push(error);
|
|
33
31
|
}
|
|
34
32
|
}
|
|
35
|
-
|
|
36
|
-
throw new AggregateError(failures, 'Event-loop resource cleanup failed.');
|
|
37
|
-
}
|
|
33
|
+
finishResourceCleanup(failures);
|
|
38
34
|
}
|
|
39
35
|
|
|
40
|
-
export
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
export class EventLoopWorkQueues {
|
|
44
|
-
private readonly infrastructure: Array<EventLoopTask | undefined> = [];
|
|
45
|
-
private infrastructureHead = 0;
|
|
46
|
-
private infrastructureCount = 0;
|
|
47
|
-
private readonly application: Array<EventLoopTask | undefined> = [];
|
|
48
|
-
private applicationHead = 0;
|
|
49
|
-
private applicationCount = 0;
|
|
50
|
-
private infrastructureScheduled = false;
|
|
51
|
-
private applicationScheduled = false;
|
|
52
|
-
private accepting = true;
|
|
53
|
-
|
|
54
|
-
submitInfrastructure(task: EventLoopTask): boolean {
|
|
55
|
-
if (!this.accepting) return false;
|
|
56
|
-
this.infrastructure.push(task);
|
|
57
|
-
this.infrastructureCount += 1;
|
|
58
|
-
this.scheduleInfrastructure();
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
submitApplication(task: EventLoopTask): boolean {
|
|
63
|
-
if (!this.accepting) return false;
|
|
64
|
-
this.application.push(task);
|
|
65
|
-
this.applicationCount += 1;
|
|
66
|
-
this.scheduleApplication();
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
stopAdmission(): void {
|
|
71
|
-
this.accepting = false;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
private scheduleInfrastructure(): void {
|
|
75
|
-
if (this.infrastructureScheduled) return;
|
|
76
|
-
this.infrastructureScheduled = true;
|
|
77
|
-
queueMicrotask(() => this.drainInfrastructure());
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
private drainInfrastructure(): void {
|
|
81
|
-
this.infrastructureScheduled = false;
|
|
82
|
-
const task = this.takeInfrastructure();
|
|
83
|
-
if (task === undefined) return;
|
|
84
|
-
try {
|
|
85
|
-
const result = runZLinkExecutionArea('infrastructure', task);
|
|
86
|
-
if (result instanceof Promise) void result.catch(() => undefined);
|
|
87
|
-
} finally {
|
|
88
|
-
if (this.infrastructureCount > 0) this.scheduleInfrastructure();
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
private scheduleApplication(): void {
|
|
93
|
-
if (this.applicationScheduled) return;
|
|
94
|
-
this.applicationScheduled = true;
|
|
95
|
-
queueMicrotask(() => void this.drainApplication());
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
private async drainApplication(): Promise<void> {
|
|
99
|
-
try {
|
|
100
|
-
const task = this.takeApplication();
|
|
101
|
-
if (task !== undefined) {
|
|
102
|
-
await runZLinkExecutionArea('application', task);
|
|
103
|
-
}
|
|
104
|
-
} catch {
|
|
105
|
-
// Handler failure is reported by the dispatch owner; it does not stop this queue.
|
|
106
|
-
} finally {
|
|
107
|
-
this.applicationScheduled = false;
|
|
108
|
-
if (this.applicationCount > 0) this.scheduleApplication();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
private takeInfrastructure(): EventLoopTask | undefined {
|
|
113
|
-
const task = this.infrastructure[this.infrastructureHead];
|
|
114
|
-
if (task === undefined) return undefined;
|
|
115
|
-
this.infrastructure[this.infrastructureHead] = undefined;
|
|
116
|
-
this.infrastructureHead += 1;
|
|
117
|
-
this.infrastructureCount -= 1;
|
|
118
|
-
this.compactInfrastructure();
|
|
119
|
-
return task;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
private takeApplication(): EventLoopTask | undefined {
|
|
123
|
-
const task = this.application[this.applicationHead];
|
|
124
|
-
if (task === undefined) return undefined;
|
|
125
|
-
this.application[this.applicationHead] = undefined;
|
|
126
|
-
this.applicationHead += 1;
|
|
127
|
-
this.applicationCount -= 1;
|
|
128
|
-
this.compactApplication();
|
|
129
|
-
return task;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
private compactInfrastructure(): void {
|
|
133
|
-
if (this.infrastructureCount === 0) {
|
|
134
|
-
this.infrastructure.length = 0;
|
|
135
|
-
this.infrastructureHead = 0;
|
|
136
|
-
} else if (
|
|
137
|
-
this.infrastructureHead >= 1024 &&
|
|
138
|
-
this.infrastructureHead * 2 >= this.infrastructure.length
|
|
139
|
-
) {
|
|
140
|
-
this.infrastructure.splice(0, this.infrastructureHead);
|
|
141
|
-
this.infrastructureHead = 0;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
private compactApplication(): void {
|
|
146
|
-
if (this.applicationCount === 0) {
|
|
147
|
-
this.application.length = 0;
|
|
148
|
-
this.applicationHead = 0;
|
|
149
|
-
} else if (
|
|
150
|
-
this.applicationHead >= 1024 &&
|
|
151
|
-
this.applicationHead * 2 >= this.application.length
|
|
152
|
-
) {
|
|
153
|
-
this.application.splice(0, this.applicationHead);
|
|
154
|
-
this.applicationHead = 0;
|
|
155
|
-
}
|
|
36
|
+
export function finishResourceCleanup(failures: readonly unknown[]): void {
|
|
37
|
+
if (failures.length > 0) {
|
|
38
|
+
throw new AggregateError(failures, 'Event-loop resource cleanup failed.');
|
|
156
39
|
}
|
|
157
40
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import { UINT64_BYTES, UINT64_MAX } from '@zlink-systems/stream-wire';
|
|
1
2
|
import { randomBytes } from 'node:crypto';
|
|
3
|
+
export const OPERATION_IDENTITY_BYTES = 16;
|
|
4
|
+
|
|
5
|
+
export const ZLINK_NATIVE_CORRELATION_OPERATION_NAMESPACE = 2n;
|
|
2
6
|
|
|
3
7
|
export interface ZLinkOperationIdentity128 {
|
|
4
8
|
readonly high: bigint;
|
|
@@ -27,13 +31,15 @@ export function createRandomOperationIdentity(
|
|
|
27
31
|
source: (size: number) => Buffer = randomBytes
|
|
28
32
|
): ZLinkOperationIdentity128 {
|
|
29
33
|
for (;;) {
|
|
30
|
-
const bytes = source(
|
|
31
|
-
if (bytes.length !==
|
|
32
|
-
throw new RangeError(
|
|
34
|
+
const bytes = source(OPERATION_IDENTITY_BYTES);
|
|
35
|
+
if (bytes.length !== OPERATION_IDENTITY_BYTES) {
|
|
36
|
+
throw new RangeError(
|
|
37
|
+
`Operation identity entropy source must return exactly ${OPERATION_IDENTITY_BYTES} bytes.`
|
|
38
|
+
);
|
|
33
39
|
}
|
|
34
40
|
const operationId = {
|
|
35
41
|
high: bytes.readBigUInt64BE(0),
|
|
36
|
-
low: bytes.readBigUInt64BE(
|
|
42
|
+
low: bytes.readBigUInt64BE(UINT64_BYTES)
|
|
37
43
|
};
|
|
38
44
|
if (operationId.high !== 0n || operationId.low !== 0n) {
|
|
39
45
|
return operationId;
|
|
@@ -42,7 +48,7 @@ export function createRandomOperationIdentity(
|
|
|
42
48
|
}
|
|
43
49
|
|
|
44
50
|
function requireUnsigned64(value: bigint, name: string): void {
|
|
45
|
-
if (typeof value !== 'bigint' || value < 0n || value >
|
|
51
|
+
if (typeof value !== 'bigint' || value < 0n || value > UINT64_MAX) {
|
|
46
52
|
throw new RangeError(`${name} must be an unsigned 64-bit integer.`);
|
|
47
53
|
}
|
|
48
54
|
}
|