@zlink-systems/framework 0.21.0 → 0.22.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/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +24 -18
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +158 -124
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +116 -113
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +10 -18
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +43 -33
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -7
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +47 -39
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -23
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +136 -136
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.js +416 -438
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.js +96 -95
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +244 -227
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +208 -219
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +23 -20
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +74 -85
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +16 -14
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +5 -5
- package/dist/runtime/spots/spot-timer.js +25 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +98 -107
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +18 -16
- package/dist/runtime/streams/bound-session-service.js +8 -9
- package/dist/runtime/streams/index.js +20 -19
- package/dist/runtime/streams/managed-stream.js +32 -30
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.js +29 -18
- package/dist/runtime/streams/session-actor-coordinator.js +34 -37
- package/dist/runtime/streams/session-context.js +30 -28
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.js +11 -5
- package/dist/runtime/streams/stream-session-runtime.js +70 -66
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +2 -2
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +0 -1
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +138 -130
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +5 -4
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +351 -320
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +73 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +335 -383
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +40 -42
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +215 -197
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +11 -8
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/flow-context.ts +12 -3
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +95 -76
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -51
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +312 -385
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +1 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1174 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +157 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +593 -563
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +184 -153
- package/src/runtime/spots/spot-actor-packet-drain.ts +54 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +230 -221
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +128 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +11 -17
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +56 -46
- package/src/runtime/spots/spot-timer.ts +98 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +277 -235
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +7 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +53 -51
- package/src/runtime/streams/bound-session-response-target.ts +29 -8
- package/src/runtime/streams/bound-session-service.ts +39 -39
- package/src/runtime/streams/index.ts +176 -100
- package/src/runtime/streams/managed-stream.ts +98 -87
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +73 -43
- package/src/runtime/streams/session-actor-coordinator.ts +97 -89
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +66 -48
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +55 -38
- package/src/runtime/streams/stream-session-runtime.ts +268 -210
- package/src/runtime/workers/index.ts +68 -29
|
@@ -39,8 +39,7 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
|
|
|
39
39
|
|
|
40
40
|
constructor(
|
|
41
41
|
private readonly runtime: RuntimeAccessor,
|
|
42
|
-
private readonly hostState: HostStateAccessor =
|
|
43
|
-
() => ZLinkFrameworkRuntimeState.Serving
|
|
42
|
+
private readonly hostState: HostStateAccessor = () => ZLinkFrameworkRuntimeState.Serving
|
|
44
43
|
) {}
|
|
45
44
|
|
|
46
45
|
snapshot(channelName: string): ZLinkClientServerStatus {
|
|
@@ -50,23 +49,30 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
|
|
|
50
49
|
private snapshotCore(channelName: string): ZLinkClientServerStatus {
|
|
51
50
|
const topology = this.requireRuntime().clientServerTopology(channelName);
|
|
52
51
|
if (topology.localRole === undefined) {
|
|
53
|
-
throw new ZLinkConfigurationException(
|
|
52
|
+
throw new ZLinkConfigurationException(
|
|
53
|
+
`ClientServer channel '${channelName}' is not registered.`
|
|
54
|
+
);
|
|
54
55
|
}
|
|
55
56
|
const targets = topology.descriptors.map((descriptor): ZLinkClientServerTargetStatus => ({
|
|
56
57
|
nodeRid: descriptor.serverRoutingId,
|
|
57
58
|
weight: descriptor.weight,
|
|
58
|
-
state:
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
59
|
+
state:
|
|
60
|
+
descriptor.state === 'serving'
|
|
61
|
+
? ZLinkPeerState.Ready
|
|
62
|
+
: descriptor.state === 'retiring'
|
|
63
|
+
? ZLinkPeerState.Draining
|
|
64
|
+
: descriptor.state === 'preparing'
|
|
65
|
+
? ZLinkPeerState.Connecting
|
|
66
|
+
: ZLinkPeerState.NotConnected,
|
|
67
|
+
unavailableReason:
|
|
68
|
+
descriptor.state === 'serving' && descriptor.weight > 0
|
|
69
|
+
? undefined
|
|
70
|
+
: descriptor.state === 'retiring'
|
|
71
|
+
? ZLinkTopologyReason.Draining
|
|
72
|
+
: ZLinkTopologyReason.NoReadyTarget
|
|
67
73
|
}));
|
|
68
74
|
const readyTargetCount = targets.filter(
|
|
69
|
-
target => target.state === ZLinkPeerState.Ready && target.weight > 0
|
|
75
|
+
(target) => target.state === ZLinkPeerState.Ready && target.weight > 0
|
|
70
76
|
).length;
|
|
71
77
|
const hostState = this.hostState();
|
|
72
78
|
const isReady = topologyRuntimeIsReady(hostState, readyTargetCount);
|
|
@@ -110,13 +116,16 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
|
|
|
110
116
|
} catch {
|
|
111
117
|
// The last complete projection remains valid after native teardown.
|
|
112
118
|
}
|
|
113
|
-
queue.seal(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
queue.seal(
|
|
120
|
+
{
|
|
121
|
+
...current,
|
|
122
|
+
state: ZLinkTopologyState.Stopped,
|
|
123
|
+
isReady: false,
|
|
124
|
+
sequence: this.sequence,
|
|
125
|
+
observedAt: new Date()
|
|
126
|
+
},
|
|
127
|
+
channelName
|
|
128
|
+
);
|
|
120
129
|
}
|
|
121
130
|
};
|
|
122
131
|
this.hostObservers.add(hostObserver);
|
|
@@ -154,7 +163,8 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
|
|
|
154
163
|
|
|
155
164
|
private requireRuntime(): ZLinkChannelRuntimeManager {
|
|
156
165
|
const runtime = this.runtime();
|
|
157
|
-
if (runtime === undefined)
|
|
166
|
+
if (runtime === undefined)
|
|
167
|
+
throw new ZLinkConfigurationException('ClientServer runtime has not started.');
|
|
158
168
|
return runtime;
|
|
159
169
|
}
|
|
160
170
|
}
|
|
@@ -165,8 +175,7 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
|
|
|
165
175
|
|
|
166
176
|
constructor(
|
|
167
177
|
private readonly runtime: RuntimeAccessor,
|
|
168
|
-
private readonly hostState: HostStateAccessor =
|
|
169
|
-
() => ZLinkFrameworkRuntimeState.Serving
|
|
178
|
+
private readonly hostState: HostStateAccessor = () => ZLinkFrameworkRuntimeState.Serving
|
|
170
179
|
) {}
|
|
171
180
|
|
|
172
181
|
snapshot(channelName: string): ZLinkFanoutStatus {
|
|
@@ -174,21 +183,27 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
|
|
|
174
183
|
}
|
|
175
184
|
|
|
176
185
|
private snapshotCore(channelName: string): ZLinkFanoutStatus {
|
|
177
|
-
const publishers = this.requireRuntime()
|
|
178
|
-
.
|
|
186
|
+
const publishers = this.requireRuntime()
|
|
187
|
+
.fanoutTopology(channelName)
|
|
188
|
+
.descriptors.map((descriptor): ZLinkPeerStatus => ({
|
|
179
189
|
nodeRid: descriptor.publisherRoutingId,
|
|
180
|
-
state:
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
190
|
+
state:
|
|
191
|
+
descriptor.state === 'serving'
|
|
192
|
+
? ZLinkPeerState.Ready
|
|
193
|
+
: descriptor.state === 'retiring'
|
|
194
|
+
? ZLinkPeerState.Draining
|
|
195
|
+
: descriptor.state === 'preparing'
|
|
196
|
+
? ZLinkPeerState.Connecting
|
|
197
|
+
: ZLinkPeerState.NotConnected,
|
|
198
|
+
unavailableReason:
|
|
199
|
+
descriptor.state === 'serving'
|
|
200
|
+
? undefined
|
|
201
|
+
: descriptor.state === 'retiring'
|
|
202
|
+
? ZLinkTopologyReason.Draining
|
|
203
|
+
: ZLinkTopologyReason.NoReadyTarget
|
|
189
204
|
}));
|
|
190
205
|
const readyPublisherCount = publishers.filter(
|
|
191
|
-
publisher => publisher.state === ZLinkPeerState.Ready
|
|
206
|
+
(publisher) => publisher.state === ZLinkPeerState.Ready
|
|
192
207
|
).length;
|
|
193
208
|
const hostState = this.hostState();
|
|
194
209
|
const hostReady = runtimeStateIsReady(hostState);
|
|
@@ -235,13 +250,16 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
|
|
|
235
250
|
} catch {
|
|
236
251
|
// The last complete projection remains valid after native teardown.
|
|
237
252
|
}
|
|
238
|
-
queue.seal(
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
253
|
+
queue.seal(
|
|
254
|
+
{
|
|
255
|
+
...current,
|
|
256
|
+
state: ZLinkTopologyState.Stopped,
|
|
257
|
+
isReady: false,
|
|
258
|
+
sequence: this.sequence,
|
|
259
|
+
observedAt: new Date()
|
|
260
|
+
},
|
|
261
|
+
channelName
|
|
262
|
+
);
|
|
245
263
|
}
|
|
246
264
|
};
|
|
247
265
|
this.hostObservers.add(hostObserver);
|
|
@@ -275,7 +293,8 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
|
|
|
275
293
|
|
|
276
294
|
private requireRuntime(): ZLinkChannelRuntimeManager {
|
|
277
295
|
const runtime = this.runtime();
|
|
278
|
-
if (runtime === undefined)
|
|
296
|
+
if (runtime === undefined)
|
|
297
|
+
throw new ZLinkConfigurationException('Fanout runtime has not started.');
|
|
279
298
|
return runtime;
|
|
280
299
|
}
|
|
281
300
|
}
|
|
@@ -32,10 +32,7 @@ export type ZLinkExecutionArea = 'application' | 'infrastructure';
|
|
|
32
32
|
|
|
33
33
|
const executionAreaStorage = new AsyncLocalStorage<ZLinkExecutionArea>();
|
|
34
34
|
|
|
35
|
-
export function runZLinkExecutionArea<T>(
|
|
36
|
-
area: ZLinkExecutionArea,
|
|
37
|
-
operation: () => T
|
|
38
|
-
): T {
|
|
35
|
+
export function runZLinkExecutionArea<T>(area: ZLinkExecutionArea, operation: () => T): T {
|
|
39
36
|
return executionAreaStorage.run(area, operation);
|
|
40
37
|
}
|
|
41
38
|
|
|
@@ -140,7 +137,10 @@ export class ZLinkSpotSerialTurn {
|
|
|
140
137
|
return;
|
|
141
138
|
}
|
|
142
139
|
await Promise.race([
|
|
143
|
-
owner.then(
|
|
140
|
+
owner.then(
|
|
141
|
+
() => undefined,
|
|
142
|
+
() => undefined
|
|
143
|
+
),
|
|
144
144
|
this.suspended
|
|
145
145
|
]);
|
|
146
146
|
}
|
|
@@ -169,12 +169,8 @@ export function runZLinkSpotSerialTurn<T>(
|
|
|
169
169
|
turn: ZLinkSpotSerialTurn,
|
|
170
170
|
operation: () => Promise<T> | T
|
|
171
171
|
): Promise<T> {
|
|
172
|
-
return runZLinkExecutionArea(
|
|
173
|
-
|
|
174
|
-
() => spotSerialTurnStorage.run(
|
|
175
|
-
{ executor, turnId, turn },
|
|
176
|
-
async () => operation()
|
|
177
|
-
)
|
|
172
|
+
return runZLinkExecutionArea('application', () =>
|
|
173
|
+
spotSerialTurnStorage.run({ executor, turnId, turn }, async () => operation())
|
|
178
174
|
);
|
|
179
175
|
}
|
|
180
176
|
|
|
@@ -194,18 +190,13 @@ export function captureZLinkSpotSerialTurn(
|
|
|
194
190
|
/** Returns the physical Spot owner only while its captured turn owns the gate. */
|
|
195
191
|
export function currentZLinkSpotSerialSourceId(): unknown {
|
|
196
192
|
const current = spotSerialTurnStorage.getStore();
|
|
197
|
-
if (
|
|
198
|
-
current === undefined
|
|
199
|
-
|| !current.executor.isActiveTurn(current.turn, current.turnId)
|
|
200
|
-
) {
|
|
193
|
+
if (current === undefined || !current.executor.isActiveTurn(current.turn, current.turnId)) {
|
|
201
194
|
return undefined;
|
|
202
195
|
}
|
|
203
196
|
return current.executor.sourceSpotId;
|
|
204
197
|
}
|
|
205
198
|
|
|
206
|
-
export function requireZLinkYieldTurn(
|
|
207
|
-
capturedTurn?: ZLinkSpotSerialTurn
|
|
208
|
-
): ZLinkSpotSerialTurn {
|
|
199
|
+
export function requireZLinkYieldTurn(capturedTurn?: ZLinkSpotSerialTurn): ZLinkSpotSerialTurn {
|
|
209
200
|
const turn = capturedTurn ?? captureZLinkSpotSerialTurn();
|
|
210
201
|
if (turn === undefined || !turn.yieldAllowed) {
|
|
211
202
|
throw new ZLinkConfigurationException(
|
|
@@ -227,15 +218,19 @@ export function captureZLinkExecutionTurn(): ZLinkCapturedExecutionTurn | undefi
|
|
|
227
218
|
}
|
|
228
219
|
return {
|
|
229
220
|
yieldPromise: <T>(pending: Promise<T>) => current.turn.yieldPromise(pending),
|
|
230
|
-
post: (callback: () => void) => {
|
|
221
|
+
post: (callback: () => void) => {
|
|
222
|
+
void current.executor.post(callback);
|
|
223
|
+
}
|
|
231
224
|
};
|
|
232
225
|
}
|
|
233
226
|
|
|
234
227
|
export function isCurrentZLinkSpotSerialTurn(executor: ZLinkSpotSerialTurnExecutorLike): boolean {
|
|
235
228
|
const current = spotSerialTurnStorage.getStore();
|
|
236
|
-
return
|
|
237
|
-
|
|
238
|
-
|
|
229
|
+
return (
|
|
230
|
+
current !== undefined &&
|
|
231
|
+
current.executor === executor &&
|
|
232
|
+
executor.isActiveTurn(current.turn, current.turnId)
|
|
233
|
+
);
|
|
239
234
|
}
|
|
240
235
|
|
|
241
236
|
export interface ZLinkExecutionBarrierSeal {
|
|
@@ -306,10 +301,7 @@ export class ZLinkExecutionBarrier {
|
|
|
306
301
|
return seal;
|
|
307
302
|
}
|
|
308
303
|
|
|
309
|
-
async waitForQuiescence(
|
|
310
|
-
seal: ZLinkExecutionBarrierSeal,
|
|
311
|
-
signal?: AbortSignal
|
|
312
|
-
): Promise<void> {
|
|
304
|
+
async waitForQuiescence(seal: ZLinkExecutionBarrierSeal, signal?: AbortSignal): Promise<void> {
|
|
313
305
|
this.requireCurrent(seal);
|
|
314
306
|
if (this.activeClaims === 0) return;
|
|
315
307
|
if (signal?.aborted === true) throw signal.reason;
|
|
@@ -12,10 +12,11 @@ export interface ZLinkSerialSchedulerOptions {
|
|
|
12
12
|
readonly lifecycleBurstLimit?: number;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export const ZLINK_DEFAULT_SERIAL_SCHEDULER_OPTIONS: Required<ZLinkSerialSchedulerOptions> =
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
export const ZLINK_DEFAULT_SERIAL_SCHEDULER_OPTIONS: Required<ZLinkSerialSchedulerOptions> =
|
|
16
|
+
Object.freeze({
|
|
17
|
+
ownerTimeBudget: 10,
|
|
18
|
+
lifecycleBurstLimit: 8
|
|
19
|
+
});
|
|
19
20
|
|
|
20
21
|
export interface ZLinkSerialWorkRecord<T> {
|
|
21
22
|
readonly acceptedSequence: bigint;
|
|
@@ -102,10 +103,7 @@ export class ZLinkSerialExecutionQueue {
|
|
|
102
103
|
/**
|
|
103
104
|
* Enqueues a continuation for an already-admitted owner turn.
|
|
104
105
|
*/
|
|
105
|
-
submitContinuation<T>(
|
|
106
|
-
operation: () => Promise<T> | T,
|
|
107
|
-
context?: unknown
|
|
108
|
-
): Promise<T> {
|
|
106
|
+
submitContinuation<T>(operation: () => Promise<T> | T, context?: unknown): Promise<T> {
|
|
109
107
|
try {
|
|
110
108
|
return this.admit(operation, { lane: 'application' }, context);
|
|
111
109
|
} catch (error) {
|
|
@@ -125,12 +123,7 @@ export class ZLinkSerialExecutionQueue {
|
|
|
125
123
|
context?: unknown,
|
|
126
124
|
preparation?: ZLinkSerialWorkPreparation
|
|
127
125
|
): Promise<T> {
|
|
128
|
-
return this.admit(
|
|
129
|
-
operation,
|
|
130
|
-
{ ...options, lane: 'application' },
|
|
131
|
-
context,
|
|
132
|
-
preparation
|
|
133
|
-
);
|
|
126
|
+
return this.admit(operation, { ...options, lane: 'application' }, context, preparation);
|
|
134
127
|
}
|
|
135
128
|
|
|
136
129
|
/**
|
|
@@ -160,14 +153,14 @@ export class ZLinkSerialExecutionQueue {
|
|
|
160
153
|
}
|
|
161
154
|
|
|
162
155
|
get hasPendingWork(): boolean {
|
|
163
|
-
return
|
|
164
|
-
|| this.application.records.length > 0
|
|
165
|
-
|
|
156
|
+
return (
|
|
157
|
+
this.draining || this.application.records.length > 0 || this.lifecycle.records.length > 0
|
|
158
|
+
);
|
|
166
159
|
}
|
|
167
160
|
|
|
168
161
|
whenIdle(): Promise<void> {
|
|
169
162
|
if (!this.hasPendingWork) return Promise.resolve();
|
|
170
|
-
return new Promise(resolve => this.idleWaiters.push(resolve));
|
|
163
|
+
return new Promise((resolve) => this.idleWaiters.push(resolve));
|
|
171
164
|
}
|
|
172
165
|
|
|
173
166
|
/** Stops new submissions while allowing the accepted FIFO to finish. */
|
|
@@ -257,8 +250,10 @@ export class ZLinkSerialExecutionQueue {
|
|
|
257
250
|
const record = selection.record;
|
|
258
251
|
if (selection.lane === 'lifecycle') {
|
|
259
252
|
const applicationHead = this.application.records[0]!;
|
|
260
|
-
if (
|
|
261
|
-
|
|
253
|
+
if (
|
|
254
|
+
this.application.records.length > 0 &&
|
|
255
|
+
!this.cancelPreparationForRearbitration(applicationHead)
|
|
256
|
+
) {
|
|
262
257
|
waitingForPreparation = true;
|
|
263
258
|
break;
|
|
264
259
|
}
|
|
@@ -268,8 +263,7 @@ export class ZLinkSerialExecutionQueue {
|
|
|
268
263
|
waitingForPreparation = true;
|
|
269
264
|
break;
|
|
270
265
|
}
|
|
271
|
-
if (record.preparationState === 'pending'
|
|
272
|
-
|| record.preparationState === 'canceling') {
|
|
266
|
+
if (record.preparationState === 'pending' || record.preparationState === 'canceling') {
|
|
273
267
|
waitingForPreparation = true;
|
|
274
268
|
break;
|
|
275
269
|
}
|
|
@@ -295,8 +289,10 @@ export class ZLinkSerialExecutionQueue {
|
|
|
295
289
|
} finally {
|
|
296
290
|
this.draining = false;
|
|
297
291
|
this.claimStartedAt = undefined;
|
|
298
|
-
if (
|
|
299
|
-
|
|
292
|
+
if (
|
|
293
|
+
!waitingForPreparation &&
|
|
294
|
+
(this.application.records.length > 0 || this.lifecycle.records.length > 0)
|
|
295
|
+
) {
|
|
300
296
|
this.scheduleDrain();
|
|
301
297
|
} else {
|
|
302
298
|
if (this.application.records.length === 0 && this.lifecycle.records.length === 0) {
|
|
@@ -306,10 +302,12 @@ export class ZLinkSerialExecutionQueue {
|
|
|
306
302
|
}
|
|
307
303
|
}
|
|
308
304
|
|
|
309
|
-
private selectNext():
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
305
|
+
private selectNext():
|
|
306
|
+
| {
|
|
307
|
+
readonly lane: ZLinkSerialWorkLane;
|
|
308
|
+
readonly record: SerialWorkRecord<unknown>;
|
|
309
|
+
}
|
|
310
|
+
| undefined {
|
|
313
311
|
const applicationReady = this.application.records.length > 0;
|
|
314
312
|
const lifecycleReady = this.lifecycle.records.length > 0;
|
|
315
313
|
if (!applicationReady && !lifecycleReady) return undefined;
|
|
@@ -329,9 +327,7 @@ export class ZLinkSerialExecutionQueue {
|
|
|
329
327
|
readonly lane: ZLinkSerialWorkLane;
|
|
330
328
|
readonly record: SerialWorkRecord<unknown>;
|
|
331
329
|
}): ZLinkSerialWorkRecord<unknown> {
|
|
332
|
-
const record = selection.lane === 'lifecycle'
|
|
333
|
-
? this.takeLifecycle()
|
|
334
|
-
: this.takeApplication();
|
|
330
|
+
const record = selection.lane === 'lifecycle' ? this.takeLifecycle() : this.takeApplication();
|
|
335
331
|
if (record !== selection.record) {
|
|
336
332
|
throw new Error('The selected serial work record changed before owner claim.');
|
|
337
333
|
}
|
|
@@ -340,10 +336,7 @@ export class ZLinkSerialExecutionQueue {
|
|
|
340
336
|
|
|
341
337
|
private takeLifecycle(): ZLinkSerialWorkRecord<unknown> {
|
|
342
338
|
this.lifecycleStreak += 1;
|
|
343
|
-
if (
|
|
344
|
-
this.application.records.length > 0
|
|
345
|
-
&& this.lifecycleStreak >= this.lifecycleBurstLimit
|
|
346
|
-
) {
|
|
339
|
+
if (this.application.records.length > 0 && this.lifecycleStreak >= this.lifecycleBurstLimit) {
|
|
347
340
|
this.lifecycleDebt = true;
|
|
348
341
|
}
|
|
349
342
|
return this.lifecycle.records.shift()!;
|
|
@@ -375,7 +368,7 @@ export class ZLinkSerialExecutionQueue {
|
|
|
375
368
|
record.preparationController = undefined;
|
|
376
369
|
this.scheduleDrain();
|
|
377
370
|
},
|
|
378
|
-
error => {
|
|
371
|
+
(error) => {
|
|
379
372
|
if (record.preparationState === 'canceling' || controller.signal.aborted) {
|
|
380
373
|
preparation.cancel();
|
|
381
374
|
record.preparationState = 'idle';
|
|
@@ -390,9 +383,7 @@ export class ZLinkSerialExecutionQueue {
|
|
|
390
383
|
}
|
|
391
384
|
|
|
392
385
|
/** Returns false while an outstanding readiness attempt is being canceled. */
|
|
393
|
-
private cancelPreparationForRearbitration(
|
|
394
|
-
record: SerialWorkRecord<unknown>
|
|
395
|
-
): boolean {
|
|
386
|
+
private cancelPreparationForRearbitration(record: SerialWorkRecord<unknown>): boolean {
|
|
396
387
|
if (record.preparation === undefined || record.preparationState === 'idle') return true;
|
|
397
388
|
if (record.preparationState === 'ready') {
|
|
398
389
|
record.preparation.cancel();
|
|
@@ -438,5 +429,5 @@ function validateNonNegative(value: number, field: string): void {
|
|
|
438
429
|
}
|
|
439
430
|
|
|
440
431
|
function macrotaskBoundary(): Promise<void> {
|
|
441
|
-
return new Promise(resolve => setImmediate(resolve));
|
|
432
|
+
return new Promise((resolve) => setImmediate(resolve));
|
|
442
433
|
}
|
|
@@ -66,8 +66,8 @@ export class ZLinkStateLane {
|
|
|
66
66
|
throwIfReentrant(): void {
|
|
67
67
|
if (this.isOnLane) {
|
|
68
68
|
throw new Error(
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
"This code already runs on the state lane it is trying to enter. Call the component's " +
|
|
70
|
+
'private state method directly instead of re-entering its public surface.'
|
|
71
71
|
);
|
|
72
72
|
}
|
|
73
73
|
}
|
|
@@ -89,17 +89,28 @@ export function canonicalActorJoinHandoffId(input: {
|
|
|
89
89
|
}): string {
|
|
90
90
|
const actor = textBytes(input.actorId, 'actorId');
|
|
91
91
|
if (actor.byteLength > 0xffff) throw new RangeError('Actor id exceeds u16 bytes.');
|
|
92
|
-
const digest = createHash('sha256')
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
92
|
+
const digest = createHash('sha256')
|
|
93
|
+
.update(
|
|
94
|
+
Buffer.concat([
|
|
95
|
+
Buffer.from(input.sourceActorNodeRid),
|
|
96
|
+
u16(actor.byteLength),
|
|
97
|
+
actor,
|
|
98
|
+
u64(input.actorGeneration),
|
|
99
|
+
u64(input.sourceActorNodeGeneration),
|
|
100
|
+
u64(input.correlation)
|
|
101
|
+
])
|
|
102
|
+
)
|
|
103
|
+
.digest()
|
|
104
|
+
.subarray(0, 16);
|
|
100
105
|
return Buffer.from([
|
|
101
|
-
digest[3]!,
|
|
102
|
-
digest[
|
|
106
|
+
digest[3]!,
|
|
107
|
+
digest[2]!,
|
|
108
|
+
digest[1]!,
|
|
109
|
+
digest[0]!,
|
|
110
|
+
digest[5]!,
|
|
111
|
+
digest[4]!,
|
|
112
|
+
digest[7]!,
|
|
113
|
+
digest[6]!,
|
|
103
114
|
...digest.subarray(8)
|
|
104
115
|
]).toString('hex');
|
|
105
116
|
}
|
|
@@ -116,10 +127,10 @@ export function encodeCanonicalActorJoinRecoverySavedWork(
|
|
|
116
127
|
if (request.byteLength > MAXIMUM_MESSAGE_BYTES || reply.byteLength > MAXIMUM_MESSAGE_BYTES) {
|
|
117
128
|
throw new RangeError('Actor Join recovery message exceeds 1 MiB.');
|
|
118
129
|
}
|
|
119
|
-
const replyContentType =
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
130
|
+
const replyContentType =
|
|
131
|
+
operationId === undefined
|
|
132
|
+
? null
|
|
133
|
+
: requireText(input.replyContentType, 'Actor Join reply content type');
|
|
123
134
|
const metadata = encodeMetadataJson({
|
|
124
135
|
Request: {
|
|
125
136
|
ActorId: requireText(input.actorId, 'Actor id'),
|
|
@@ -209,21 +220,23 @@ export function encodeCanonicalActorJoinRecoverySavedWork(
|
|
|
209
220
|
if (metadata.byteLength > MAXIMUM_METADATA_BYTES) {
|
|
210
221
|
throw new RangeError('Actor Join recovery metadata exceeds 256 KiB.');
|
|
211
222
|
}
|
|
212
|
-
return Buffer.from(
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
223
|
+
return Buffer.from(
|
|
224
|
+
encodeGeneratedZljrRecordV1({
|
|
225
|
+
source: {
|
|
226
|
+
nodeRid: Buffer.from(encodeRoutingIdStorageHex(input.sourceNodeRid), 'utf8'),
|
|
227
|
+
nodeGeneration: nonZeroU64(input.actorNodeGeneration, 'source node generation'),
|
|
228
|
+
ownerId: input.coordinator.ownerId,
|
|
229
|
+
ownerLeaseGeneration: nonZeroU64(
|
|
230
|
+
input.coordinator.leaseGeneration,
|
|
231
|
+
'source owner lease generation'
|
|
232
|
+
)
|
|
233
|
+
},
|
|
234
|
+
operation: { high: 0n, low: 0n },
|
|
235
|
+
metadata,
|
|
236
|
+
request,
|
|
237
|
+
reply
|
|
238
|
+
})
|
|
239
|
+
);
|
|
227
240
|
}
|
|
228
241
|
|
|
229
242
|
export function decodeCanonicalActorJoinRecoverySavedWork(
|
|
@@ -241,17 +254,20 @@ export function decodeCanonicalActorJoinRecoverySavedWork(
|
|
|
241
254
|
}
|
|
242
255
|
const payload = frozen.applicationPayload;
|
|
243
256
|
if (
|
|
244
|
-
frozen.recordKind !== 1
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
257
|
+
frozen.recordKind !== 1 ||
|
|
258
|
+
frozen.sourceKind !== 1 ||
|
|
259
|
+
payload?.packetName !== RECOVERY_PACKET_NAME ||
|
|
260
|
+
payload.contentType !== RECOVERY_CONTENT_TYPE
|
|
248
261
|
) {
|
|
249
262
|
return undefined;
|
|
250
263
|
}
|
|
251
264
|
throw error;
|
|
252
265
|
}
|
|
253
266
|
const metadataBytes = Buffer.from(record.metadata);
|
|
254
|
-
const metadata = JSON.parse(quoteJsonIntegers(metadataBytes.toString('utf8'))) as Record<
|
|
267
|
+
const metadata = JSON.parse(quoteJsonIntegers(metadataBytes.toString('utf8'))) as Record<
|
|
268
|
+
string,
|
|
269
|
+
unknown
|
|
270
|
+
>;
|
|
255
271
|
const requestValue = object(metadata.Request, 'Request');
|
|
256
272
|
const handoffId = text(requestValue.HandoffId, 'Request.HandoffId');
|
|
257
273
|
const relocationAggregateId = canonicalUuid(
|
|
@@ -262,10 +278,7 @@ export function decodeCanonicalActorJoinRecoverySavedWork(
|
|
|
262
278
|
requestValue.ReservedPayloadBytes,
|
|
263
279
|
'Request.ReservedPayloadBytes'
|
|
264
280
|
);
|
|
265
|
-
if (
|
|
266
|
-
canonicalUuid(handoffId) !== relocationAggregateId
|
|
267
|
-
|| reservationToken !== handoffId
|
|
268
|
-
) {
|
|
281
|
+
if (canonicalUuid(handoffId) !== relocationAggregateId || reservationToken !== handoffId) {
|
|
269
282
|
throw new TypeError('Canonical Actor Join recovery reservation identity changed.');
|
|
270
283
|
}
|
|
271
284
|
const request = Buffer.from(record.request);
|
|
@@ -329,9 +342,9 @@ export function routingIdBytes(value: RoutingId): Buffer {
|
|
|
329
342
|
|
|
330
343
|
function encodeMetadataJson(value: unknown): Buffer {
|
|
331
344
|
const marker = '__zlink_u64__:';
|
|
332
|
-
const encoded = JSON.stringify(value, (_key, item) =>
|
|
333
|
-
? `${marker}${item.toString()}`
|
|
334
|
-
|
|
345
|
+
const encoded = JSON.stringify(value, (_key, item) =>
|
|
346
|
+
typeof item === 'bigint' ? `${marker}${item.toString()}` : item
|
|
347
|
+
);
|
|
335
348
|
return Buffer.from(encoded.replace(new RegExp(`"${marker}(\\d+)"`, 'gu'), '$1'), 'utf8');
|
|
336
349
|
}
|
|
337
350
|
|
|
@@ -373,8 +386,10 @@ function canonicalUuid(value: string): string {
|
|
|
373
386
|
if (!/^[0-9a-f]{32}$/u.test(hex) || /^0+$/u.test(hex)) {
|
|
374
387
|
throw new TypeError('Actor Join relocation id is invalid.');
|
|
375
388
|
}
|
|
376
|
-
return
|
|
377
|
-
|
|
389
|
+
return (
|
|
390
|
+
`${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}` +
|
|
391
|
+
`-${hex.slice(16, 20)}-${hex.slice(20)}`
|
|
392
|
+
);
|
|
378
393
|
}
|
|
379
394
|
|
|
380
395
|
function predictedRelocationPayloadBytes(
|
|
@@ -385,17 +400,19 @@ function predictedRelocationPayloadBytes(
|
|
|
385
400
|
throw new RangeError('Actor Join request size is invalid.');
|
|
386
401
|
}
|
|
387
402
|
if (
|
|
388
|
-
relocationContentType !== RECREATE_RELOCATION_CONTENT_TYPE
|
|
389
|
-
|
|
403
|
+
relocationContentType !== RECREATE_RELOCATION_CONTENT_TYPE &&
|
|
404
|
+
relocationContentType !== SNAPSHOT_RELOCATION_CONTENT_TYPE
|
|
390
405
|
) {
|
|
391
406
|
throw new TypeError('Actor Join relocation content type is invalid.');
|
|
392
407
|
}
|
|
393
|
-
return
|
|
394
|
-
+
|
|
395
|
-
+
|
|
396
|
-
+
|
|
408
|
+
return (
|
|
409
|
+
FRAMEWORK_METADATA_UPPER_BOUND_BYTES +
|
|
410
|
+
ACCEPTED_JOURNAL_UPPER_BOUND_BYTES +
|
|
411
|
+
requestBytes +
|
|
412
|
+
(relocationContentType === SNAPSHOT_RELOCATION_CONTENT_TYPE
|
|
397
413
|
? SNAPSHOT_APPLICATION_STATE_RESERVATION_BYTES
|
|
398
|
-
: 0)
|
|
414
|
+
: 0)
|
|
415
|
+
);
|
|
399
416
|
}
|
|
400
417
|
|
|
401
418
|
function textBytes(value: string, name: string): Buffer {
|
|
@@ -445,7 +462,8 @@ function nullableText(value: unknown, name: string): string | undefined {
|
|
|
445
462
|
}
|
|
446
463
|
|
|
447
464
|
function integer(value: unknown, name: string): bigint {
|
|
448
|
-
if (typeof value !== 'string' || !/^\d+$/u.test(value))
|
|
465
|
+
if (typeof value !== 'string' || !/^\d+$/u.test(value))
|
|
466
|
+
throw new TypeError(`${name} is invalid.`);
|
|
449
467
|
const parsed = BigInt(value);
|
|
450
468
|
if (parsed > 0xffff_ffff_ffff_ffffn) throw new TypeError(`${name} exceeds u64.`);
|
|
451
469
|
return parsed;
|
|
@@ -133,8 +133,10 @@ export class EventLoopWorkQueues {
|
|
|
133
133
|
if (this.infrastructureCount === 0) {
|
|
134
134
|
this.infrastructure.length = 0;
|
|
135
135
|
this.infrastructureHead = 0;
|
|
136
|
-
} else if (
|
|
137
|
-
|
|
136
|
+
} else if (
|
|
137
|
+
this.infrastructureHead >= 1024 &&
|
|
138
|
+
this.infrastructureHead * 2 >= this.infrastructure.length
|
|
139
|
+
) {
|
|
138
140
|
this.infrastructure.splice(0, this.infrastructureHead);
|
|
139
141
|
this.infrastructureHead = 0;
|
|
140
142
|
}
|
|
@@ -144,8 +146,10 @@ export class EventLoopWorkQueues {
|
|
|
144
146
|
if (this.applicationCount === 0) {
|
|
145
147
|
this.application.length = 0;
|
|
146
148
|
this.applicationHead = 0;
|
|
147
|
-
} else if (
|
|
148
|
-
|
|
149
|
+
} else if (
|
|
150
|
+
this.applicationHead >= 1024 &&
|
|
151
|
+
this.applicationHead * 2 >= this.application.length
|
|
152
|
+
) {
|
|
149
153
|
this.application.splice(0, this.applicationHead);
|
|
150
154
|
this.applicationHead = 0;
|
|
151
155
|
}
|