@zlink-systems/framework 0.25.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/Channels/IZLinkFanoutClient.d.ts +0 -6
- 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/RouteMesh/RuntimeTopology.d.ts +8 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.js +16 -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 +28 -0
- package/dist/runtime/activation-admission.js +57 -0
- 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 +19 -17
- package/dist/runtime/actors/actor-handoff.d.ts +13 -7
- package/dist/runtime/actors/actor-handoff.js +36 -25
- 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 +85 -123
- 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 +3 -3
- package/dist/runtime/actors/actor-remote-joiner.js +11 -17
- 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-contracts.d.ts +4 -2
- 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/actor-source-transfer.d.ts +5 -5
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
- package/dist/runtime/actors/deferred-join-completion.js +21 -0
- package/dist/runtime/actors/index.d.ts +10 -8
- package/dist/runtime/actors/index.js +101 -73
- 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 +7 -1
- package/dist/runtime/admission.js +11 -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 +8 -33
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
- 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-factory.d.ts +1 -2
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
- package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
- package/dist/runtime/backend/raw-binding-port.d.ts +13 -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 -9
- package/dist/runtime/channels/channel-clients.js +68 -60
- 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 -18
- 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.d.ts +2 -5
- package/dist/runtime/channels/channel-runtime-manager.js +4 -12
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
- package/dist/runtime/channels/channel-socket-registry.js +296 -235
- package/dist/runtime/channels/channel-transports.d.ts +11 -20
- 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 +133 -81
- 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 +22 -9
- package/dist/runtime/execution/index.js +107 -37
- package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
- package/dist/runtime/execution/serial-execution-queue.js +99 -26
- 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/listener-records.d.ts +11 -0
- package/dist/runtime/foundation/listener-records.js +20 -0
- 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 +18 -26
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
- 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.d.ts +1 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +30 -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 +23 -8
- 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-coordinator.d.ts +9 -0
- package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
- package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
- 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 -19
- 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 +28 -24
- package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
- package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
- package/dist/runtime/foundation/service-topology-registry.js +22 -61
- 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 +28 -28
- package/dist/runtime/host/actor-transfer-runtime.js +210 -256
- 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 +19 -14
- package/dist/runtime/host/index.js +234 -175
- 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 +11 -23
- package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
- package/dist/runtime/host/route-mesh-runtime.js +178 -257
- 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 +71 -38
- package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
- 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 -7
- package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
- package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
- package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
- 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 +79 -27
- 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 +5 -10
- package/dist/runtime/locations/lifecycle.js +4 -33
- 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 +44 -30
- 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 +8 -2
- package/dist/runtime/locations/spot-location-claims.js +40 -23
- 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 +2 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
- package/dist/runtime/spots/index.d.ts +29 -29
- package/dist/runtime/spots/index.js +441 -313
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
- package/dist/runtime/spots/spot-activation-registry.js +27 -60
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
- package/dist/runtime/spots/spot-activation-state.js +4 -17
- package/dist/runtime/spots/spot-activation.d.ts +10 -9
- package/dist/runtime/spots/spot-activation.js +103 -81
- 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 +5 -55
- package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
- package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
- package/dist/runtime/spots/spot-actor-membership.js +44 -53
- 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 +3 -4
- package/dist/runtime/spots/spot-entry-activation.js +9 -21
- 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 +6 -5
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
- package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +10 -37
- 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 -2
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
- 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 +4 -20
- package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
- package/dist/runtime/spots/spot-serial-executor.js +9 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
- package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
- package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
- 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 +12 -19
- package/dist/runtime/streams/index.d.ts +15 -14
- package/dist/runtime/streams/index.js +38 -39
- 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/session-serial-executor.js +2 -2
- 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/Channels/IZLinkFanoutClient.ts +0 -7
- 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/RouteMesh/RuntimeTopology.ts +10 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +15 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +72 -0
- 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 +45 -39
- package/src/runtime/actors/actor-handoff.ts +55 -45
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +174 -215
- 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 +15 -36
- 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-contracts.ts +4 -10
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/actor-source-transfer.ts +5 -18
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +44 -0
- package/src/runtime/actors/index.ts +122 -88
- 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 +13 -2
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +15 -42
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
- package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
- package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
- package/src/runtime/backend/raw-binding-port.ts +14 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -96
- 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 -31
- 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 +8 -15
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +369 -262
- package/src/runtime/channels/channel-transports.ts +161 -115
- 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 +175 -106
- 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 +116 -38
- package/src/runtime/execution/serial-execution-queue.ts +179 -34
- 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/listener-records.ts +21 -0
- 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 +170 -571
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +41 -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 +30 -19
- 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-coordinator.ts +13 -0
- package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
- 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 -25
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
- package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
- package/src/runtime/foundation/service-topology-registry.ts +30 -79
- 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 +266 -418
- 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 +408 -312
- 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 +12 -44
- package/src/runtime/host/route-mesh-runtime.ts +236 -275
- 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 +1161 -904
- 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 +92 -30
- package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
- package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
- 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 +110 -31
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +16 -45
- 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 +90 -58
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +54 -26
- 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 +27 -10
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
- package/src/runtime/spots/index.ts +687 -437
- package/src/runtime/spots/spot-activation-registry.ts +42 -71
- package/src/runtime/spots/spot-activation-state.ts +4 -16
- package/src/runtime/spots/spot-activation.ts +167 -115
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
- package/src/runtime/spots/spot-actor-membership.ts +107 -75
- 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 -33
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +29 -21
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
- package/src/runtime/spots/spot-outbound.ts +47 -68
- 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 -6
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +10 -43
- package/src/runtime/spots/spot-serial-executor.ts +10 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +23 -37
- package/src/runtime/streams/index.ts +102 -88
- 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/session-serial-executor.ts +2 -2
- 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/deferred-join-accepted-journal.d.ts +0 -47
- package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
- 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/deferred-join-accepted-journal.ts +0 -1346
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -2,23 +2,31 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ServiceStatefulRuntime = exports.ServiceInstanceActivationRedirectError = void 0;
|
|
4
4
|
exports.statefulMailboxData = statefulMailboxData;
|
|
5
|
+
const stream_wire_1 = require("@zlink-systems/stream-wire");
|
|
5
6
|
const node_async_hooks_1 = require("node:async_hooks");
|
|
7
|
+
const contracts_1 = require("../../contracts");
|
|
8
|
+
const service_authority_payload_codec_1 = require("./service-authority-payload-codec");
|
|
9
|
+
const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
|
|
6
10
|
const abort_1 = require("../abort");
|
|
11
|
+
const admission_1 = require("../admission");
|
|
12
|
+
const runtime_values_1 = require("../backend/runtime-values");
|
|
13
|
+
const message_flow_1 = require("../diagnostics/message-flow");
|
|
7
14
|
const execution_1 = require("../execution");
|
|
8
15
|
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
16
|
+
const service_wire_pilot_codec_generated_1 = require("../protocol/service_wire_pilot_codec.generated");
|
|
17
|
+
const actor_join_recovery_codec_1 = require("./actor-join-recovery-codec");
|
|
18
|
+
const operation_registry_1 = require("./operation-registry");
|
|
12
19
|
const message_follow_suppression_registry_1 = require("./message-follow-suppression-registry");
|
|
20
|
+
const operation_identity_1 = require("./operation-identity");
|
|
21
|
+
const service_metadata_codec_1 = require("./service-metadata-codec");
|
|
22
|
+
const service_runtime_contracts_1 = require("./service-runtime-contracts");
|
|
13
23
|
const service_stateful_registry_1 = require("./service-stateful-registry");
|
|
14
24
|
const service_stateful_wire_codec_1 = require("./service-stateful-wire-codec");
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const actor_join_recovery_codec_1 = require("./actor-join-recovery-codec");
|
|
25
|
+
const service_wire_binary_primitives_1 = require("./service-wire-binary-primitives");
|
|
26
|
+
const service_wire_constants_generated_1 = require("./service-wire-constants.generated");
|
|
18
27
|
const service_wire_m6a_codec_1 = require("./service-wire-m6a-codec");
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const ACTOR_ROUTE_STALE = 21;
|
|
28
|
+
const STATEFUL_OPERATION_RETRY_TICK_MS = 20;
|
|
29
|
+
const MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;
|
|
22
30
|
const SPOT_MOVING = 34;
|
|
23
31
|
const USER_SPOT_OPERATION_CAPACITY = 65_536;
|
|
24
32
|
const USER_SPOT_OPERATION_REPLAY_RETENTION_MS = 5 * 60_000;
|
|
@@ -46,7 +54,7 @@ class ServiceStatefulRuntime {
|
|
|
46
54
|
// behaves exactly like a frame arriving from the receive pump.
|
|
47
55
|
static detachedIngressScope = node_async_hooks_1.AsyncLocalStorage.snapshot();
|
|
48
56
|
registry;
|
|
49
|
-
operations
|
|
57
|
+
operations;
|
|
50
58
|
sessionDeliveries = new Map();
|
|
51
59
|
/**
|
|
52
60
|
* A local Actor owner can replace its own session binding before the
|
|
@@ -58,7 +66,6 @@ class ServiceStatefulRuntime {
|
|
|
58
66
|
subscriptions = new Map();
|
|
59
67
|
instanceIntents = new Map();
|
|
60
68
|
admittedInstanceOperations = new Map();
|
|
61
|
-
pendingInstanceTerminals = new Map();
|
|
62
69
|
pendingInstanceAuthorityTerminals = new Map();
|
|
63
70
|
instanceApplicationWaiters = new Map();
|
|
64
71
|
canonicalActorJoinHandoffs = new Map();
|
|
@@ -87,10 +94,11 @@ class ServiceStatefulRuntime {
|
|
|
87
94
|
admittedUserSpotOperations = new Map();
|
|
88
95
|
pendingInstanceActivations = new Map();
|
|
89
96
|
closed = false;
|
|
90
|
-
constructor(raw, nodeRid, nodeGeneration) {
|
|
97
|
+
constructor(raw, nodeRid, nodeGeneration, onPendingOperationsChanged) {
|
|
91
98
|
this.raw = raw;
|
|
92
99
|
this.nodeRid = nodeRid;
|
|
93
100
|
this.nodeGeneration = nodeGeneration;
|
|
101
|
+
this.operations = new service_stateful_registry_1.ServiceTerminalOperationRegistry(new operation_registry_1.OperationRegistry(undefined, onPendingOperationsChanged));
|
|
94
102
|
this.registry = new service_stateful_registry_1.ServiceStatefulRegistry(nodeRid, nodeGeneration);
|
|
95
103
|
this.registry.createEntrySpot(nodeRid);
|
|
96
104
|
raw.setServiceIngress((record) => this.ingress(record));
|
|
@@ -356,6 +364,7 @@ class ServiceStatefulRuntime {
|
|
|
356
364
|
...(envelope.replyRouteId === undefined ? {} : { replyRouteId: envelope.replyRouteId })
|
|
357
365
|
};
|
|
358
366
|
const applicationJobOwner = await this.raw.reserveLocalIngress();
|
|
367
|
+
const terminal = this.activationTerminalCompletion(target, route);
|
|
359
368
|
try {
|
|
360
369
|
const admitted = this.enqueueActivatedInstanceSpot({
|
|
361
370
|
command: service_stateful_wire_codec_1.M6bServiceWireCommand.instanceSpot,
|
|
@@ -365,9 +374,9 @@ class ServiceStatefulRuntime {
|
|
|
365
374
|
(0, service_stateful_wire_codec_1.encodeInstanceSpotActivationHeader)(target, envelope.sourceNodeGeneration, envelope.sourceNodeRid, envelope.sourceSpotId, envelope.operationKind, envelope.operation, envelope.deadlineUnixMs, envelope.replyRouteId, envelope.metadataFrame !== undefined)
|
|
366
375
|
],
|
|
367
376
|
applicationJobOwner
|
|
368
|
-
}, record, Buffer.from(envelope.applicationPayloadFrame), spot, undefined,
|
|
377
|
+
}, record, Buffer.from(envelope.applicationPayloadFrame), spot, undefined, terminal.onTerminalCompletion, envelope.metadataFrame === undefined
|
|
369
378
|
? undefined
|
|
370
|
-
: (0, service_metadata_codec_1.validateServiceMetadataFrame)(envelope.metadataFrame),
|
|
379
|
+
: (0, service_metadata_codec_1.validateServiceMetadataFrame)(envelope.metadataFrame), terminal.onHandlerTurnStarted, this.instanceApplicationTarget(record, route.objectGeneration));
|
|
371
380
|
if (admitted !== 'application') {
|
|
372
381
|
throw new Error('Recovered Instance activation was not admitted to the local queue.');
|
|
373
382
|
}
|
|
@@ -436,10 +445,10 @@ class ServiceStatefulRuntime {
|
|
|
436
445
|
}
|
|
437
446
|
return released;
|
|
438
447
|
}
|
|
448
|
+
/** Resolves once every first terminal record of an activated Instance message is durable. */
|
|
439
449
|
waitForInstanceApplicationQuiescence(spotId, signal) {
|
|
440
450
|
const key = String(spotId);
|
|
441
|
-
if ((this.
|
|
442
|
-
(this.pendingInstanceAuthorityTerminals.get(key) ?? 0) === 0) {
|
|
451
|
+
if ((this.pendingInstanceAuthorityTerminals.get(key) ?? 0) === 0) {
|
|
443
452
|
return Promise.resolve();
|
|
444
453
|
}
|
|
445
454
|
if (signal?.aborted === true) {
|
|
@@ -653,7 +662,11 @@ class ServiceStatefulRuntime {
|
|
|
653
662
|
reporter.report({
|
|
654
663
|
surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.SpotRoute,
|
|
655
664
|
messageKind: ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Send,
|
|
656
|
-
reason:
|
|
665
|
+
reason: this.closed
|
|
666
|
+
? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.Shutdown
|
|
667
|
+
: this.raw.isPeerRouteReady(target.descriptor.nodeRoutingId)
|
|
668
|
+
? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.Backpressure
|
|
669
|
+
: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.StaleTarget,
|
|
657
670
|
action: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop,
|
|
658
671
|
meshName: this.dispatchErrorMeshName,
|
|
659
672
|
channelName,
|
|
@@ -669,20 +682,23 @@ class ServiceStatefulRuntime {
|
|
|
669
682
|
if (target === undefined) {
|
|
670
683
|
return runtime_values_1.SubmitResult.NotFound;
|
|
671
684
|
}
|
|
672
|
-
const header = (0, service_stateful_wire_codec_1.encodeSpotHeader)('spotSend', sourceSpotId, target
|
|
685
|
+
const header = (0, service_stateful_wire_codec_1.encodeSpotHeader)('spotSend', sourceSpotId, target, undefined, {
|
|
686
|
+
high: this.nodeGeneration,
|
|
687
|
+
low: this.nextMessageFollowOperation++
|
|
688
|
+
});
|
|
673
689
|
return this.submitOneWay(target.targetNodeRid, [header, (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)]);
|
|
674
690
|
}
|
|
675
691
|
requestToSpot(sourceSpotId, requested, payload, timeoutMs) {
|
|
676
692
|
const pending = this.operations.register(timeoutMs);
|
|
677
693
|
const target = this.acceptSpotAuthority(requested);
|
|
678
694
|
if (target === undefined) {
|
|
679
|
-
this.operations.reply(pending.id,
|
|
680
|
-
terminalResult: runtime_values_1.RequestResult.NotFound,
|
|
681
|
-
failureCode: ACTOR_ROUTE_STALE
|
|
682
|
-
});
|
|
695
|
+
this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
|
|
683
696
|
return pending;
|
|
684
697
|
}
|
|
685
|
-
const header = (0, service_stateful_wire_codec_1.encodeSpotHeader)('spotRequest', sourceSpotId, target, pending.id
|
|
698
|
+
const header = (0, service_stateful_wire_codec_1.encodeSpotHeader)('spotRequest', sourceSpotId, target, pending.id, {
|
|
699
|
+
high: this.nodeGeneration,
|
|
700
|
+
low: this.nextMessageFollowOperation++
|
|
701
|
+
});
|
|
686
702
|
this.submitRequest(pending, target.targetNodeRid, [header, (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)], timeoutMs, 'spotRequest');
|
|
687
703
|
return pending;
|
|
688
704
|
}
|
|
@@ -695,17 +711,14 @@ class ServiceStatefulRuntime {
|
|
|
695
711
|
: {
|
|
696
712
|
...boundSession,
|
|
697
713
|
sequence: this.nextSessionSequence++
|
|
698
|
-
});
|
|
714
|
+
}, { high: this.nodeGeneration, low: this.nextMessageFollowOperation++ });
|
|
699
715
|
return this.submitOneWay(target.nodeRid, [header, (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)]);
|
|
700
716
|
}
|
|
701
717
|
requestToActor(target, _targetNodeGeneration, _authorityOwnerGeneration, payload, timeoutMs, sourceActor, boundSession) {
|
|
702
718
|
const pending = this.operations.register(timeoutMs);
|
|
703
719
|
const route = this.tryActorFence(target);
|
|
704
720
|
if (route === undefined) {
|
|
705
|
-
this.operations.reply(pending.id,
|
|
706
|
-
terminalResult: runtime_values_1.RequestResult.NotFound,
|
|
707
|
-
failureCode: ACTOR_ROUTE_STALE
|
|
708
|
-
});
|
|
721
|
+
this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
|
|
709
722
|
return pending;
|
|
710
723
|
}
|
|
711
724
|
const header = (0, service_stateful_wire_codec_1.encodeActorHeader)('actorRequest', route, pending.id, sourceActor, boundSession === undefined
|
|
@@ -713,13 +726,13 @@ class ServiceStatefulRuntime {
|
|
|
713
726
|
: {
|
|
714
727
|
...boundSession,
|
|
715
728
|
sequence: this.nextSessionSequence++
|
|
716
|
-
});
|
|
729
|
+
}, { high: this.nodeGeneration, low: this.nextMessageFollowOperation++ });
|
|
717
730
|
this.submitRequest(pending, target.nodeRid, [header, (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)], timeoutMs, 'actorRequest');
|
|
718
731
|
return pending;
|
|
719
732
|
}
|
|
720
|
-
async sendToInstanceSpot(route, payload, sourceSpotId, metadataFrame) {
|
|
733
|
+
async sendToInstanceSpot(route, payload, sourceSpotId, metadataFrame, instanceIntent = false) {
|
|
721
734
|
return this.submitOneWay(route.targetNodeRid, instanceOperationParts([
|
|
722
|
-
(0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'send', { high: 0n, low: 0n }, undefined, metadataFrame !== undefined),
|
|
735
|
+
(0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'send', { high: 0n, low: 0n }, undefined, metadataFrame !== undefined, instanceIntent),
|
|
723
736
|
(0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)
|
|
724
737
|
], metadataFrame));
|
|
725
738
|
}
|
|
@@ -733,10 +746,10 @@ class ServiceStatefulRuntime {
|
|
|
733
746
|
payloadFrame
|
|
734
747
|
], metadataFrame));
|
|
735
748
|
}
|
|
736
|
-
requestToInstanceSpot(route, payload, timeoutMs, sourceSpotId, metadataFrame) {
|
|
749
|
+
requestToInstanceSpot(route, payload, timeoutMs, sourceSpotId, metadataFrame, instanceIntent = false) {
|
|
737
750
|
const pending = this.operations.register(timeoutMs);
|
|
738
751
|
this.submitRequest(pending, route.targetNodeRid, instanceOperationParts([
|
|
739
|
-
(0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'request', { high:
|
|
752
|
+
(0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'request', { high: operation_identity_1.ZLINK_NATIVE_CORRELATION_OPERATION_NAMESPACE, low: pending.id }, pending.id, metadataFrame !== undefined, instanceIntent),
|
|
740
753
|
(0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)
|
|
741
754
|
], metadataFrame), timeoutMs, 'instanceSpotRequest');
|
|
742
755
|
return pending;
|
|
@@ -841,7 +854,7 @@ class ServiceStatefulRuntime {
|
|
|
841
854
|
});
|
|
842
855
|
return pending;
|
|
843
856
|
}
|
|
844
|
-
bindSession(sessionRid, actor, timeoutMs, deliver, onBindingReplaced,
|
|
857
|
+
bindSession(sessionRid, actor, timeoutMs, deliver, onBindingReplaced, actorAuthority) {
|
|
845
858
|
const deadlineMs = performance.now() + timeoutMs;
|
|
846
859
|
const pending = this.operations.register(timeoutMs, 'sender');
|
|
847
860
|
const generation = this.nextSessionSequence++;
|
|
@@ -858,7 +871,6 @@ class ServiceStatefulRuntime {
|
|
|
858
871
|
const delivery = {
|
|
859
872
|
binding: localBinding,
|
|
860
873
|
deliver,
|
|
861
|
-
...(bindingIngress === undefined ? {} : { bindingIngress }),
|
|
862
874
|
...(onBindingReplaced === undefined ? {} : { onBindingReplaced })
|
|
863
875
|
};
|
|
864
876
|
const deliveryKey = actorKey(actor);
|
|
@@ -966,10 +978,7 @@ class ServiceStatefulRuntime {
|
|
|
966
978
|
if (delivery === undefined ||
|
|
967
979
|
delivery.binding.sessionRid !== sessionRid ||
|
|
968
980
|
delivery.binding.bindingGeneration !== expectedBindingGeneration) {
|
|
969
|
-
this.operations.reply(pending.id,
|
|
970
|
-
terminalResult: runtime_values_1.RequestResult.NotFound,
|
|
971
|
-
failureCode: ACTOR_ROUTE_STALE
|
|
972
|
-
});
|
|
981
|
+
this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
|
|
973
982
|
return pending;
|
|
974
983
|
}
|
|
975
984
|
this.sessionDeliveries.delete(actorKey(actor));
|
|
@@ -993,7 +1002,16 @@ class ServiceStatefulRuntime {
|
|
|
993
1002
|
sessionBindings(sessionRid) {
|
|
994
1003
|
return [...this.sessionDeliveries.values()]
|
|
995
1004
|
.map((value) => value.binding)
|
|
996
|
-
.filter((binding) => binding.sessionRid === sessionRid)
|
|
1005
|
+
.filter((binding) => binding.sessionRid === sessionRid)
|
|
1006
|
+
.map((binding) => {
|
|
1007
|
+
const owner = requireSessionOwnerIdentity(binding);
|
|
1008
|
+
return {
|
|
1009
|
+
...binding,
|
|
1010
|
+
sessionOwnerNodeGeneration: owner.nodeGeneration,
|
|
1011
|
+
sessionOwnerId: owner.ownerId,
|
|
1012
|
+
sessionOwnerLeaseGeneration: owner.leaseGeneration
|
|
1013
|
+
};
|
|
1014
|
+
});
|
|
997
1015
|
}
|
|
998
1016
|
allSessionBindings() {
|
|
999
1017
|
return [...this.sessionDeliveries.values()].map((value) => value.binding);
|
|
@@ -1008,15 +1026,21 @@ class ServiceStatefulRuntime {
|
|
|
1008
1026
|
bindingGeneration: delivery.binding.bindingGeneration
|
|
1009
1027
|
});
|
|
1010
1028
|
}
|
|
1011
|
-
async sendBoundSession(actor, expectedBindingGeneration, payload
|
|
1029
|
+
async sendBoundSession(actor, expectedBindingGeneration, payload) {
|
|
1030
|
+
// Session–Actor binding §3 item 3: the source sends by binding identity to
|
|
1031
|
+
// the registered route. The header's owner lifecycle fields are this node's
|
|
1032
|
+
// current route values, not send conditions; the Session owner alone
|
|
1033
|
+
// decides whether the binding is current.
|
|
1012
1034
|
let binding;
|
|
1013
1035
|
try {
|
|
1014
1036
|
binding = this.registry.validateBoundSession(actor, expectedBindingGeneration);
|
|
1015
1037
|
}
|
|
1016
|
-
catch {
|
|
1017
|
-
|
|
1038
|
+
catch (error) {
|
|
1039
|
+
if (error instanceof service_stateful_registry_1.ServiceStaleGenerationError)
|
|
1040
|
+
return runtime_values_1.SubmitResult.NotFound;
|
|
1041
|
+
throw error;
|
|
1018
1042
|
}
|
|
1019
|
-
const actorFence = this.
|
|
1043
|
+
const actorFence = this.tryActorFence(actor);
|
|
1020
1044
|
if (actorFence === undefined)
|
|
1021
1045
|
return runtime_values_1.SubmitResult.InvalidState;
|
|
1022
1046
|
const header = (0, service_stateful_wire_codec_1.encodeBoundSessionSendHeader)(actorFence, expectedBindingGeneration);
|
|
@@ -1025,26 +1049,21 @@ class ServiceStatefulRuntime {
|
|
|
1025
1049
|
(0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)
|
|
1026
1050
|
]);
|
|
1027
1051
|
}
|
|
1052
|
+
expireOperations(nowMs, turnDeadlineMs) {
|
|
1053
|
+
return this.operations.expire(nowMs, turnDeadlineMs);
|
|
1054
|
+
}
|
|
1055
|
+
get pendingOperationCount() {
|
|
1056
|
+
return this.operations.size;
|
|
1057
|
+
}
|
|
1028
1058
|
close() {
|
|
1029
1059
|
if (this.closed)
|
|
1030
1060
|
return;
|
|
1031
1061
|
this.closed = true;
|
|
1032
1062
|
this.operations.close();
|
|
1033
|
-
const clearedActors = new Set();
|
|
1034
|
-
for (const deliveries of [this.sessionDeliveries, this.retiredSessionDeliveries]) {
|
|
1035
|
-
for (const delivery of deliveries.values()) {
|
|
1036
|
-
const actorId = delivery.binding.actor.actorId;
|
|
1037
|
-
if (clearedActors.has(actorId))
|
|
1038
|
-
continue;
|
|
1039
|
-
clearedActors.add(actorId);
|
|
1040
|
-
delivery.bindingIngress?.clearOutbound(actorId, new Error(`Actor '${actorId}' Session service closed with retained outbound delivery.`));
|
|
1041
|
-
}
|
|
1042
|
-
}
|
|
1043
1063
|
this.sessionDeliveries.clear();
|
|
1044
1064
|
this.retiredSessionDeliveries.clear();
|
|
1045
1065
|
this.appliedReplacementNotices.clear();
|
|
1046
1066
|
this.instanceIntents.clear();
|
|
1047
|
-
this.pendingInstanceTerminals.clear();
|
|
1048
1067
|
this.pendingInstanceAuthorityTerminals.clear();
|
|
1049
1068
|
for (const waiters of this.instanceApplicationWaiters.values()) {
|
|
1050
1069
|
for (const waiter of waiters)
|
|
@@ -1094,7 +1113,8 @@ class ServiceStatefulRuntime {
|
|
|
1094
1113
|
decoded = statefulActorJoinFromCanonical(canonicalActorJoin);
|
|
1095
1114
|
}
|
|
1096
1115
|
else {
|
|
1097
|
-
|
|
1116
|
+
const metadata = (record.flags & service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !== 0;
|
|
1117
|
+
decoded = (0, service_stateful_wire_codec_1.decodeStatefulHeader)(record.parts[0], record.parts[metadata ? 2 : 1], metadata ? record.parts[1] : undefined);
|
|
1098
1118
|
}
|
|
1099
1119
|
const hasPayload = [
|
|
1100
1120
|
'spotSend',
|
|
@@ -1106,19 +1126,26 @@ class ServiceStatefulRuntime {
|
|
|
1106
1126
|
'boundSessionSend'
|
|
1107
1127
|
].includes(decoded.kind);
|
|
1108
1128
|
const instanceMetadata = decoded.kind === 'instanceSpot' && (record.flags & service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !== 0;
|
|
1129
|
+
const statefulMetadata = (decoded.kind === 'spotSend' ||
|
|
1130
|
+
decoded.kind === 'spotRequest' ||
|
|
1131
|
+
decoded.kind === 'actorSend' ||
|
|
1132
|
+
decoded.kind === 'actorRequest') &&
|
|
1133
|
+
(record.flags & service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !== 0;
|
|
1109
1134
|
const userSpotInfrastructure = decoded.kind === 'userSpotCreate' ||
|
|
1110
1135
|
decoded.kind === 'userSpotClose' ||
|
|
1111
1136
|
decoded.kind === 'actorCreate' ||
|
|
1112
1137
|
decoded.kind === 'messageFollow' ||
|
|
1113
1138
|
decoded.kind === 'boundSessionReplaced';
|
|
1114
1139
|
if (record.parts.length < 1 ||
|
|
1115
|
-
record.parts.length > (instanceMetadata ? 3 : 2) ||
|
|
1116
|
-
(hasPayload &&
|
|
1140
|
+
record.parts.length > (instanceMetadata || statefulMetadata ? 3 : 2) ||
|
|
1141
|
+
(hasPayload &&
|
|
1142
|
+
decoded.kind !== 'actorJoin' &&
|
|
1143
|
+
record.parts.length !== ((record.flags & service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !== 0 ? 3 : 2)) ||
|
|
1117
1144
|
(decoded.kind === 'instanceSpot' && record.parts.length !== (instanceMetadata ? 3 : 2)) ||
|
|
1118
1145
|
(userSpotInfrastructure && record.parts.length !== 1)) {
|
|
1119
1146
|
return 'protocolError';
|
|
1120
1147
|
}
|
|
1121
|
-
const metadataFrame = instanceMetadata
|
|
1148
|
+
const metadataFrame = instanceMetadata || statefulMetadata
|
|
1122
1149
|
? (0, service_metadata_codec_1.validateServiceMetadataFrame)(record.parts[1])
|
|
1123
1150
|
: undefined;
|
|
1124
1151
|
const canonicalPayload = canonicalActorJoin?.payload === undefined
|
|
@@ -1150,6 +1177,21 @@ class ServiceStatefulRuntime {
|
|
|
1150
1177
|
if (kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound ||
|
|
1151
1178
|
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving ||
|
|
1152
1179
|
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale) {
|
|
1180
|
+
const reporter = this.dispatchErrors;
|
|
1181
|
+
if (decoded.kind === 'instanceSpot' && reporter?.captureEnabled() === true) {
|
|
1182
|
+
reporter.report({
|
|
1183
|
+
surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.InstanceSpot,
|
|
1184
|
+
messageKind: ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Send,
|
|
1185
|
+
reason: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.StaleTarget,
|
|
1186
|
+
action: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop,
|
|
1187
|
+
meshName: this.dispatchErrorMeshName,
|
|
1188
|
+
sourceRid: decoded.sourceNodeRid,
|
|
1189
|
+
spotId: decoded.activation === 'ready'
|
|
1190
|
+
? decoded.route.targetSpotId
|
|
1191
|
+
: decoded.target.targetSpotId,
|
|
1192
|
+
error
|
|
1193
|
+
});
|
|
1194
|
+
}
|
|
1153
1195
|
return 'protocolError';
|
|
1154
1196
|
}
|
|
1155
1197
|
}
|
|
@@ -1319,15 +1361,9 @@ class ServiceStatefulRuntime {
|
|
|
1319
1361
|
targetSpotId: record.route.targetSpotId,
|
|
1320
1362
|
stableType: intent.instanceType
|
|
1321
1363
|
};
|
|
1322
|
-
// A close seals execution only after the current application count reaches
|
|
1323
|
-
// zero. A new Instance message must wait for that close even while the old
|
|
1324
|
-
// activation is still materialized; otherwise it can be admitted after
|
|
1325
|
-
// the close quiescence check and be removed with the old activation.
|
|
1326
|
-
if (lifecycle.isClosing?.(applicationTarget) === true)
|
|
1327
|
-
return true;
|
|
1328
1364
|
return !lifecycle.isMaterialized(applicationTarget);
|
|
1329
1365
|
}
|
|
1330
|
-
enqueueActivatedInstanceSpot(ingress, record, payloadFrame, spot, localReply, onTerminalCompletion, metadataFrame,
|
|
1366
|
+
enqueueActivatedInstanceSpot(ingress, record, payloadFrame, spot, localReply, onTerminalCompletion, metadataFrame, onHandlerTurnStarted, applicationTargetOverride) {
|
|
1331
1367
|
let operationKey;
|
|
1332
1368
|
if (record.activation === 'missing') {
|
|
1333
1369
|
const now = BigInt(Date.now());
|
|
@@ -1354,10 +1390,6 @@ class ServiceStatefulRuntime {
|
|
|
1354
1390
|
const terminalCompletion = onTerminalCompletion === undefined
|
|
1355
1391
|
? undefined
|
|
1356
1392
|
: async () => {
|
|
1357
|
-
// The application turn has returned before authority cleanup starts.
|
|
1358
|
-
// Mark it quiescent first so a close requested by that turn can finish
|
|
1359
|
-
// its local cleanup and release the exact authority fence below.
|
|
1360
|
-
this.completeInstanceApplicationOperation(applicationTarget.targetSpotId);
|
|
1361
1393
|
try {
|
|
1362
1394
|
await onTerminalCompletion();
|
|
1363
1395
|
}
|
|
@@ -1373,8 +1405,11 @@ class ServiceStatefulRuntime {
|
|
|
1373
1405
|
...(record.operationKind === 'request' ? { correlation: record.replyRouteId } : {}),
|
|
1374
1406
|
...(record.sourceSpotId === undefined ? {} : { sourceSpotId: record.sourceSpotId }),
|
|
1375
1407
|
targetSpot: spot.ref,
|
|
1408
|
+
activationRecord: record,
|
|
1409
|
+
...(record.activation === 'missing' ? { deadlineUnixMs: record.deadlineUnixMs } : {}),
|
|
1376
1410
|
...(metadataFrame === undefined ? {} : { applicationMetadata: metadataFrame }),
|
|
1377
1411
|
...(terminalCompletion === undefined ? {} : { onTerminalCompletion: terminalCompletion }),
|
|
1412
|
+
...(onHandlerTurnStarted === undefined ? {} : { onHandlerTurnStarted }),
|
|
1378
1413
|
...(record.operationKind === 'request'
|
|
1379
1414
|
? {
|
|
1380
1415
|
reply: onTerminalCompletion === undefined
|
|
@@ -1390,10 +1425,6 @@ class ServiceStatefulRuntime {
|
|
|
1390
1425
|
this.admittedInstanceOperations.set(operationKey, record.deadlineUnixMs);
|
|
1391
1426
|
}
|
|
1392
1427
|
if (onTerminalCompletion !== undefined && result === 'application') {
|
|
1393
|
-
this.beginInstanceApplicationOperation(applicationTarget.targetSpotId);
|
|
1394
|
-
if (activationTerminal) {
|
|
1395
|
-
this.beginInstanceAuthorityOperation(applicationTarget.targetSpotId);
|
|
1396
|
-
}
|
|
1397
1428
|
this.instanceApplicationLifecycle?.beginTerminal(applicationTarget);
|
|
1398
1429
|
}
|
|
1399
1430
|
return result;
|
|
@@ -1404,7 +1435,8 @@ class ServiceStatefulRuntime {
|
|
|
1404
1435
|
const activation = await this.activateMissingInstanceAsync(record, payloadFrame, metadataFrame);
|
|
1405
1436
|
if (this.closed)
|
|
1406
1437
|
return;
|
|
1407
|
-
const
|
|
1438
|
+
const terminal = this.activationTerminalCompletion(record.target, activation.route);
|
|
1439
|
+
const admitted = this.enqueueActivatedInstanceSpot(ingress, record, payloadFrame, activation.spot, localReply, terminal.onTerminalCompletion, metadataFrame, terminal.onHandlerTurnStarted, this.instanceApplicationTarget(record, activation.route.objectGeneration));
|
|
1408
1440
|
if (admitted !== 'application') {
|
|
1409
1441
|
throw new Error('Activated Instance message was not admitted to the local queue.');
|
|
1410
1442
|
}
|
|
@@ -1454,7 +1486,7 @@ class ServiceStatefulRuntime {
|
|
|
1454
1486
|
? { ...record, route: latestRoute }
|
|
1455
1487
|
: record;
|
|
1456
1488
|
const spot = this.requireInstanceActivation(ingress, refreshedRecord);
|
|
1457
|
-
const admitted = this.enqueueActivatedInstanceSpot(ingress,
|
|
1489
|
+
const admitted = this.enqueueActivatedInstanceSpot(ingress, record, payloadFrame, spot, undefined, this.instanceApplicationTerminalCompletion(this.instanceApplicationTarget(refreshedRecord)), metadataFrame, undefined, this.instanceApplicationTarget(refreshedRecord));
|
|
1458
1490
|
if (admitted !== 'application') {
|
|
1459
1491
|
throw new Error('Rematerialized Instance message was not admitted to the local queue.');
|
|
1460
1492
|
}
|
|
@@ -1466,19 +1498,33 @@ class ServiceStatefulRuntime {
|
|
|
1466
1498
|
this.replyWire(ingress, record.replyRouteId, result.terminalResult, result.failureCode);
|
|
1467
1499
|
}
|
|
1468
1500
|
}
|
|
1501
|
+
/**
|
|
1502
|
+
* Spot messaging §4 step 12 with §7 step 1: a Close waits for the first terminal
|
|
1503
|
+
* record only of a message whose handler turn started before it; a message queued
|
|
1504
|
+
* behind that Close is not counted, so it cannot hold the Close it follows.
|
|
1505
|
+
*/
|
|
1469
1506
|
activationTerminalCompletion(target, route) {
|
|
1470
1507
|
let completion;
|
|
1508
|
+
let started = false;
|
|
1471
1509
|
const applicationTarget = {
|
|
1472
1510
|
targetSpotId: target.targetSpotId,
|
|
1473
1511
|
stableType: target.stableType,
|
|
1474
1512
|
objectGeneration: route.objectGeneration
|
|
1475
1513
|
};
|
|
1476
|
-
|
|
1477
|
-
|
|
1514
|
+
const onHandlerTurnStarted = () => {
|
|
1515
|
+
if (started || completion !== undefined)
|
|
1516
|
+
return;
|
|
1517
|
+
started = true;
|
|
1518
|
+
this.beginInstanceAuthorityOperation(target.targetSpotId);
|
|
1519
|
+
};
|
|
1520
|
+
const onTerminalCompletion = () => (completion ??= (async () => {
|
|
1521
|
+
let authorityCompletionSignaled = !started;
|
|
1478
1522
|
try {
|
|
1479
1523
|
const released = await this.asyncInstanceAuthority?.complete(target, route);
|
|
1480
|
-
|
|
1481
|
-
|
|
1524
|
+
if (!authorityCompletionSignaled) {
|
|
1525
|
+
this.completeInstanceAuthorityOperation(target.targetSpotId);
|
|
1526
|
+
authorityCompletionSignaled = true;
|
|
1527
|
+
}
|
|
1482
1528
|
if (released !== undefined) {
|
|
1483
1529
|
const authorityReleased = (await this.instanceApplicationLifecycle?.completeTerminal(applicationTarget)) ??
|
|
1484
1530
|
false;
|
|
@@ -1496,6 +1542,7 @@ class ServiceStatefulRuntime {
|
|
|
1496
1542
|
}
|
|
1497
1543
|
}
|
|
1498
1544
|
})());
|
|
1545
|
+
return { onTerminalCompletion, onHandlerTurnStarted };
|
|
1499
1546
|
}
|
|
1500
1547
|
instanceApplicationTerminalCompletion(target) {
|
|
1501
1548
|
return async () => {
|
|
@@ -1530,24 +1577,10 @@ class ServiceStatefulRuntime {
|
|
|
1530
1577
|
objectGeneration: record.route.objectGeneration
|
|
1531
1578
|
};
|
|
1532
1579
|
}
|
|
1533
|
-
beginInstanceApplicationOperation(spotId) {
|
|
1534
|
-
const key = String(spotId);
|
|
1535
|
-
this.pendingInstanceTerminals.set(key, (this.pendingInstanceTerminals.get(key) ?? 0) + 1);
|
|
1536
|
-
}
|
|
1537
1580
|
beginInstanceAuthorityOperation(spotId) {
|
|
1538
1581
|
const key = String(spotId);
|
|
1539
1582
|
this.pendingInstanceAuthorityTerminals.set(key, (this.pendingInstanceAuthorityTerminals.get(key) ?? 0) + 1);
|
|
1540
1583
|
}
|
|
1541
|
-
completeInstanceApplicationOperation(spotId) {
|
|
1542
|
-
const key = String(spotId);
|
|
1543
|
-
const pending = this.pendingInstanceTerminals.get(key);
|
|
1544
|
-
if (pending === undefined || pending <= 1) {
|
|
1545
|
-
this.pendingInstanceTerminals.delete(key);
|
|
1546
|
-
this.completeInstanceApplicationWaitersIfQuiescent(key);
|
|
1547
|
-
return;
|
|
1548
|
-
}
|
|
1549
|
-
this.pendingInstanceTerminals.set(key, pending - 1);
|
|
1550
|
-
}
|
|
1551
1584
|
completeInstanceAuthorityOperation(spotId) {
|
|
1552
1585
|
const key = String(spotId);
|
|
1553
1586
|
const pending = this.pendingInstanceAuthorityTerminals.get(key);
|
|
@@ -1559,8 +1592,7 @@ class ServiceStatefulRuntime {
|
|
|
1559
1592
|
this.pendingInstanceAuthorityTerminals.set(key, pending - 1);
|
|
1560
1593
|
}
|
|
1561
1594
|
completeInstanceApplicationWaitersIfQuiescent(key) {
|
|
1562
|
-
if ((this.
|
|
1563
|
-
(this.pendingInstanceAuthorityTerminals.get(key) ?? 0) !== 0)
|
|
1595
|
+
if ((this.pendingInstanceAuthorityTerminals.get(key) ?? 0) !== 0)
|
|
1564
1596
|
return;
|
|
1565
1597
|
const waiters = this.instanceApplicationWaiters.get(key);
|
|
1566
1598
|
if (waiters === undefined)
|
|
@@ -1637,8 +1669,8 @@ class ServiceStatefulRuntime {
|
|
|
1637
1669
|
// activation continuation can publish its in-memory intent. If the
|
|
1638
1670
|
// local ready projection already carries the exact object and owner
|
|
1639
1671
|
// fence from the received route, publish that validated projection
|
|
1640
|
-
// instead of
|
|
1641
|
-
//
|
|
1672
|
+
// instead of rejecting a following request while publication finishes.
|
|
1673
|
+
// An absent Ready projection cannot validate the received owner fence.
|
|
1642
1674
|
const local = this.registry.spot(record.route.targetSpotId);
|
|
1643
1675
|
if (local?.kind === 'instance' &&
|
|
1644
1676
|
local.state === 'ready' &&
|
|
@@ -1648,7 +1680,7 @@ class ServiceStatefulRuntime {
|
|
|
1648
1680
|
}
|
|
1649
1681
|
}
|
|
1650
1682
|
if (intent === undefined) {
|
|
1651
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.
|
|
1683
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Instance Spot '${record.route.targetSpotId}' has no current Ready authority.`);
|
|
1652
1684
|
}
|
|
1653
1685
|
const current = intent.route;
|
|
1654
1686
|
if (current.objectGeneration < record.route.objectGeneration) {
|
|
@@ -1754,6 +1786,40 @@ class ServiceStatefulRuntime {
|
|
|
1754
1786
|
}
|
|
1755
1787
|
const local = this.registry.spot(target.targetSpotId);
|
|
1756
1788
|
const current = await authority.read(target);
|
|
1789
|
+
if (current.kind === 'creating' &&
|
|
1790
|
+
current.authority?.allocation.state === 'active' &&
|
|
1791
|
+
this.instanceApplicationLifecycle?.isMaterializing?.(target) === true) {
|
|
1792
|
+
return {
|
|
1793
|
+
spot: { ref: { spotId: target.targetSpotId, generation: current.objectGeneration } },
|
|
1794
|
+
route: {
|
|
1795
|
+
targetSpotId: target.targetSpotId,
|
|
1796
|
+
targetNodeRid: this.nodeRid,
|
|
1797
|
+
targetNodeGeneration: this.nodeGeneration,
|
|
1798
|
+
objectGeneration: current.objectGeneration,
|
|
1799
|
+
authorityOwnerGeneration: current.authorityOwnerGeneration,
|
|
1800
|
+
ownerId: current.authority.ownerId,
|
|
1801
|
+
leaseGeneration: current.authority.ownerLeaseGeneration,
|
|
1802
|
+
storeVersion: current.authority.storeVersion.value
|
|
1803
|
+
}
|
|
1804
|
+
};
|
|
1805
|
+
}
|
|
1806
|
+
if (current.kind === 'ready' &&
|
|
1807
|
+
current.authority !== undefined &&
|
|
1808
|
+
(0, service_authority_payload_codec_1.decodeServiceClosingSpotAuthority)(current.authority.payload) !== undefined) {
|
|
1809
|
+
if (current.route.targetNodeRid !== this.nodeRid) {
|
|
1810
|
+
throw new ServiceInstanceActivationRedirectError(current.route);
|
|
1811
|
+
}
|
|
1812
|
+
if (current.route.targetNodeGeneration !== this.nodeGeneration ||
|
|
1813
|
+
(local !== undefined &&
|
|
1814
|
+
!routeMatchesLocal(current.route, local, this.nodeRid, this.nodeGeneration)) ||
|
|
1815
|
+
(local === undefined && this.instanceApplicationLifecycle?.isMaterialized(target) !== true)) {
|
|
1816
|
+
throw new service_stateful_registry_1.ServiceStaleGenerationError('spot', target.targetSpotId);
|
|
1817
|
+
}
|
|
1818
|
+
return {
|
|
1819
|
+
spot: { ref: { spotId: target.targetSpotId, generation: current.route.objectGeneration } },
|
|
1820
|
+
route: current.route
|
|
1821
|
+
};
|
|
1822
|
+
}
|
|
1757
1823
|
if (!this.acceptsLocalMissingInstancePlacement()) {
|
|
1758
1824
|
if (current.kind === 'ready' && current.route.targetNodeRid !== this.nodeRid) {
|
|
1759
1825
|
throw new ServiceInstanceActivationRedirectError(current.route);
|
|
@@ -1781,7 +1847,6 @@ class ServiceStatefulRuntime {
|
|
|
1781
1847
|
}
|
|
1782
1848
|
if (local !== undefined) {
|
|
1783
1849
|
const lifecycle = this.instanceApplicationLifecycle;
|
|
1784
|
-
const closing = lifecycle?.isClosing?.(target) === true;
|
|
1785
1850
|
let materialized = lifecycle === undefined ? undefined : lifecycle.isMaterialized(target);
|
|
1786
1851
|
const materializing = lifecycle?.isMaterializing?.(target) === true;
|
|
1787
1852
|
if (local.kind !== 'instance' || local.stableType !== target.stableType) {
|
|
@@ -1790,9 +1855,7 @@ class ServiceStatefulRuntime {
|
|
|
1790
1855
|
const joinsCreating = current.kind === 'creating' &&
|
|
1791
1856
|
local.ref.generation === current.objectGeneration &&
|
|
1792
1857
|
local.authorityOwnerGeneration === current.authorityOwnerGeneration;
|
|
1793
|
-
const replacesClosingProjection = current.kind === 'creating' && closing;
|
|
1794
1858
|
if (current.kind === 'missing' &&
|
|
1795
|
-
!closing &&
|
|
1796
1859
|
!materializing &&
|
|
1797
1860
|
materialized === true &&
|
|
1798
1861
|
lifecycle !== undefined) {
|
|
@@ -1814,23 +1877,30 @@ class ServiceStatefulRuntime {
|
|
|
1814
1877
|
// failure.
|
|
1815
1878
|
// If disposal did not remove an orphaned materialization, keep fencing
|
|
1816
1879
|
// it instead of admitting work into two application generations.
|
|
1817
|
-
if ((!joinsCreating &&
|
|
1818
|
-
(!joinsCreating &&
|
|
1880
|
+
if ((!joinsCreating && current.kind !== 'missing') ||
|
|
1881
|
+
(!joinsCreating && materialized !== false && !materializing)) {
|
|
1819
1882
|
throw new service_stateful_registry_1.ServiceStaleGenerationError('spot', target.targetSpotId);
|
|
1820
1883
|
}
|
|
1821
1884
|
}
|
|
1822
|
-
const
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1885
|
+
const deadline = operationDeadline(record.deadlineUnixMs);
|
|
1886
|
+
let reserved;
|
|
1887
|
+
try {
|
|
1888
|
+
reserved = await authority.reserve({
|
|
1889
|
+
target,
|
|
1890
|
+
sourceNodeRid: record.sourceNodeRid,
|
|
1891
|
+
sourceNodeGeneration: record.sourceNodeGeneration,
|
|
1892
|
+
...(record.sourceSpotId === undefined ? {} : { sourceSpotId: record.sourceSpotId }),
|
|
1893
|
+
operationKind: record.operationKind,
|
|
1894
|
+
operation: record.operation,
|
|
1895
|
+
...(record.replyRouteId === undefined ? {} : { replyRouteId: record.replyRouteId }),
|
|
1896
|
+
deadlineUnixMs: record.deadlineUnixMs,
|
|
1897
|
+
...(metadataFrame === undefined ? {} : { metadataFrame }),
|
|
1898
|
+
applicationPayloadFrame: payloadFrame
|
|
1899
|
+
}, deadline.signal);
|
|
1900
|
+
}
|
|
1901
|
+
finally {
|
|
1902
|
+
deadline.close();
|
|
1903
|
+
}
|
|
1834
1904
|
if (reserved.kind === 'ready') {
|
|
1835
1905
|
throw new ServiceInstanceActivationRedirectError(reserved.route);
|
|
1836
1906
|
}
|
|
@@ -1850,7 +1920,7 @@ class ServiceStatefulRuntime {
|
|
|
1850
1920
|
}
|
|
1851
1921
|
let committed;
|
|
1852
1922
|
try {
|
|
1853
|
-
committed = await authority.commit(target, reserved.reservation, activation.spot);
|
|
1923
|
+
committed = await authority.commit(target, reserved.reservation, activation.spot, record.deadlineUnixMs);
|
|
1854
1924
|
}
|
|
1855
1925
|
catch (error) {
|
|
1856
1926
|
if (activation.created)
|
|
@@ -2203,7 +2273,15 @@ class ServiceStatefulRuntime {
|
|
|
2203
2273
|
const accepted = this.raw.mailbox.tryEnqueue({
|
|
2204
2274
|
owner: `actor:${actor.actorId}\0${actor.generation}`,
|
|
2205
2275
|
domain: 'infrastructure',
|
|
2206
|
-
parts: [
|
|
2276
|
+
parts: [
|
|
2277
|
+
Buffer.from([
|
|
2278
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0],
|
|
2279
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1],
|
|
2280
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
|
|
2281
|
+
service_stateful_wire_codec_1.M6bServiceWireCommand.boundSessionBind,
|
|
2282
|
+
0
|
|
2283
|
+
])
|
|
2284
|
+
],
|
|
2207
2285
|
sourceRoutingId: binding.sessionOwnerNodeRid,
|
|
2208
2286
|
stateful: {
|
|
2209
2287
|
receiveKind: service_runtime_contracts_1.ReceiveKind.ActorBinding,
|
|
@@ -2232,63 +2310,26 @@ class ServiceStatefulRuntime {
|
|
|
2232
2310
|
return accepted;
|
|
2233
2311
|
}
|
|
2234
2312
|
async deliverBoundSession(ingress, record, payloadFrame) {
|
|
2313
|
+
// Session–Actor binding §3 item 3, §8.1: this Session owner's binding
|
|
2314
|
+
// record alone decides whether command 36 names the current binding
|
|
2315
|
+
// (ActorId, ObjectGeneration, binding generation; SessionRid is the
|
|
2316
|
+
// record's own). The transport boundary has already authenticated the
|
|
2317
|
+
// source peer, and the header's route fields are not compared here.
|
|
2318
|
+
if (payloadFrame === undefined)
|
|
2319
|
+
return 'protocolError';
|
|
2235
2320
|
const delivery = this.sessionDeliveries.get(actorKey(record.actor.actor));
|
|
2236
2321
|
if (delivery === undefined ||
|
|
2237
|
-
delivery.binding.bindingGeneration !== record.expectedBindingGeneration
|
|
2238
|
-
|
|
2239
|
-
ingress.sourceNodeGeneration === undefined ||
|
|
2240
|
-
!(0, routing_id_1.routingIdsEqual)(ingress.sourceRoutingId, record.actor.actor.nodeRid) ||
|
|
2241
|
-
ingress.sourceNodeGeneration !== record.actor.targetNodeGeneration) {
|
|
2322
|
+
delivery.binding.bindingGeneration !== record.expectedBindingGeneration) {
|
|
2323
|
+
this.traceRejectedBoundSessionSend(ingress, record, payloadFrame);
|
|
2242
2324
|
return 'protocolError';
|
|
2243
2325
|
}
|
|
2244
2326
|
const sessionRid = delivery.binding.sessionRid;
|
|
2245
|
-
let retainedPayload = payloadFrame;
|
|
2246
|
-
let settled = false;
|
|
2247
|
-
const settle = () => {
|
|
2248
|
-
if (settled)
|
|
2249
|
-
return false;
|
|
2250
|
-
settled = true;
|
|
2251
|
-
retainedPayload = undefined;
|
|
2252
|
-
return true;
|
|
2253
|
-
};
|
|
2254
|
-
const operation = {
|
|
2255
|
-
deliver: async () => {
|
|
2256
|
-
if (settled || retainedPayload === undefined)
|
|
2257
|
-
return false;
|
|
2258
|
-
const delivered = await delivery.deliver(sessionRid, retainedPayload);
|
|
2259
|
-
if (delivered)
|
|
2260
|
-
settle();
|
|
2261
|
-
return delivered;
|
|
2262
|
-
},
|
|
2263
|
-
fail: (_error) => {
|
|
2264
|
-
settle();
|
|
2265
|
-
}
|
|
2266
|
-
};
|
|
2267
|
-
const decision = await delivery.bindingIngress?.retainOutbound({
|
|
2268
|
-
actorId: record.actor.actor.actorId,
|
|
2269
|
-
objectGeneration: record.actor.actor.generation,
|
|
2270
|
-
actorNodeRid: record.actor.actor.nodeRid,
|
|
2271
|
-
actorNodeGeneration: record.actor.targetNodeGeneration,
|
|
2272
|
-
authorityOwnerGeneration: record.actor.authorityOwnerGeneration,
|
|
2273
|
-
ownerLeaseGeneration: record.actor.ownerLeaseGeneration,
|
|
2274
|
-
producerNodeRid: ingress.sourceRoutingId,
|
|
2275
|
-
producerNodeGeneration: ingress.sourceNodeGeneration,
|
|
2276
|
-
sessionIdentity: sessionRid,
|
|
2277
|
-
bindingGeneration: record.expectedBindingGeneration
|
|
2278
|
-
}, operation);
|
|
2279
|
-
if (decision === 'retained')
|
|
2280
|
-
return 'application';
|
|
2281
|
-
if (decision === 'rejected') {
|
|
2282
|
-
return 'protocolError';
|
|
2283
|
-
}
|
|
2284
2327
|
try {
|
|
2285
|
-
const delivered = await delivery.deliver(sessionRid,
|
|
2286
|
-
settle();
|
|
2328
|
+
const delivered = await delivery.deliver(sessionRid, payloadFrame);
|
|
2287
2329
|
if (!delivered)
|
|
2288
2330
|
return 'protocolError';
|
|
2289
2331
|
}
|
|
2290
2332
|
catch (error) {
|
|
2291
|
-
operation.fail(error);
|
|
2292
2333
|
// Remote command 36 is one-way: its source transport admission has
|
|
2293
2334
|
// already completed, so a later client delivery terminal is local to
|
|
2294
2335
|
// this session owner. Local fast paths still preserve the typed result.
|
|
@@ -2301,6 +2342,35 @@ class ServiceStatefulRuntime {
|
|
|
2301
2342
|
}
|
|
2302
2343
|
return 'application';
|
|
2303
2344
|
}
|
|
2345
|
+
// Session–Actor binding §3 item 4: a push refused as not current is
|
|
2346
|
+
// recorded with the closed flow vocabulary (dropped, stream_session, send,
|
|
2347
|
+
// stale_target) instead of disappearing. Nothing is built while tracing is
|
|
2348
|
+
// off.
|
|
2349
|
+
traceRejectedBoundSessionSend(ingress, record, payloadFrame) {
|
|
2350
|
+
const tracePoint = (0, message_flow_1.flowIfEnabled)(this.dispatchErrors?.flow, ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dropped);
|
|
2351
|
+
if (tracePoint === undefined)
|
|
2352
|
+
return;
|
|
2353
|
+
let packetName;
|
|
2354
|
+
try {
|
|
2355
|
+
packetName = (0, service_wire_m6a_codec_1.decodeApplicationPayloadView)(payloadFrame).packetName;
|
|
2356
|
+
}
|
|
2357
|
+
catch (error) {
|
|
2358
|
+
// A malformed payload is still a refused push; it is traced without a
|
|
2359
|
+
// packet name.
|
|
2360
|
+
if (!(error instanceof service_wire_m6a_codec_1.ServiceWireProtocolError))
|
|
2361
|
+
throw error;
|
|
2362
|
+
}
|
|
2363
|
+
tracePoint.trace({
|
|
2364
|
+
outcome: ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dropped,
|
|
2365
|
+
surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.StreamSession,
|
|
2366
|
+
messageKind: ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Send,
|
|
2367
|
+
...(packetName === undefined ? {} : { packetName }),
|
|
2368
|
+
...(this.dispatchErrorMeshName === undefined ? {} : { meshName: this.dispatchErrorMeshName }),
|
|
2369
|
+
sourceRid: ingress.sourceRoutingId,
|
|
2370
|
+
actorId: record.actor.actor.actorId,
|
|
2371
|
+
errorReason: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.StaleTarget
|
|
2372
|
+
});
|
|
2373
|
+
}
|
|
2304
2374
|
enqueueApplicationFrame(ingress, owner, payloadFrame, stateful) {
|
|
2305
2375
|
return this.enqueueFrame('application', ingress, owner, payloadFrame, stateful);
|
|
2306
2376
|
}
|
|
@@ -2378,7 +2448,13 @@ class ServiceStatefulRuntime {
|
|
|
2378
2448
|
}
|
|
2379
2449
|
}
|
|
2380
2450
|
enqueueActorControl(spotId, control, onTerminalCompletion) {
|
|
2381
|
-
const header = Buffer.from([
|
|
2451
|
+
const header = Buffer.from([
|
|
2452
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0],
|
|
2453
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1],
|
|
2454
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
|
|
2455
|
+
service_stateful_wire_codec_1.M6bServiceWireCommand.actorJoined,
|
|
2456
|
+
0
|
|
2457
|
+
]);
|
|
2382
2458
|
let terminalAttempted = false;
|
|
2383
2459
|
void (async () => {
|
|
2384
2460
|
const applicationJobOwner = await this.raw.reserveLocalIngress();
|
|
@@ -2421,7 +2497,13 @@ class ServiceStatefulRuntime {
|
|
|
2421
2497
|
enqueueActorBindingControl(ingress, binding, actorAuthority, reply) {
|
|
2422
2498
|
const actor = binding.actor;
|
|
2423
2499
|
const sessionOwner = requireSessionOwnerIdentity(binding);
|
|
2424
|
-
const header = Buffer.from([
|
|
2500
|
+
const header = Buffer.from([
|
|
2501
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0],
|
|
2502
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1],
|
|
2503
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
|
|
2504
|
+
service_stateful_wire_codec_1.M6bServiceWireCommand.boundSessionBind,
|
|
2505
|
+
0
|
|
2506
|
+
]);
|
|
2425
2507
|
const applicationJob = requireApplicationJobOwner(ingress).takeInitial('infrastructure');
|
|
2426
2508
|
const accepted = this.raw.mailbox.tryEnqueue({
|
|
2427
2509
|
owner: `actor:${actor.actorId}\0${actor.generation}`,
|
|
@@ -2561,7 +2643,7 @@ class ServiceStatefulRuntime {
|
|
|
2561
2643
|
}
|
|
2562
2644
|
}
|
|
2563
2645
|
async executeUserSpotOperation(handler, record) {
|
|
2564
|
-
const deadline =
|
|
2646
|
+
const deadline = operationDeadline(record.deadlineUnixMs);
|
|
2565
2647
|
try {
|
|
2566
2648
|
const result = record.kind === 'userSpotCreate'
|
|
2567
2649
|
? await handler.create(record, deadline.signal)
|
|
@@ -2640,7 +2722,7 @@ class ServiceStatefulRuntime {
|
|
|
2640
2722
|
throw error;
|
|
2641
2723
|
if (durableRequestWasAdmitted(error))
|
|
2642
2724
|
wasAdmitted = true;
|
|
2643
|
-
const retryDelayMs = Math.min(
|
|
2725
|
+
const retryDelayMs = Math.min(STATEFUL_OPERATION_RETRY_TICK_MS, deadlineMs - performance.now());
|
|
2644
2726
|
if (retryDelayMs <= 0) {
|
|
2645
2727
|
throw durableOperationExhausted(operationKind, wasAdmitted, error);
|
|
2646
2728
|
}
|
|
@@ -2689,8 +2771,8 @@ class ServiceStatefulRuntime {
|
|
|
2689
2771
|
const applicationJobOwner = await this.raw.reserveLocalIngress();
|
|
2690
2772
|
try {
|
|
2691
2773
|
const result = await this.ingress({
|
|
2692
|
-
command: header[
|
|
2693
|
-
flags: header[
|
|
2774
|
+
command: header[service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
|
|
2775
|
+
flags: header[service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
|
|
2694
2776
|
sourceRoutingId: this.nodeRid,
|
|
2695
2777
|
requestSequence,
|
|
2696
2778
|
reply: finish,
|
|
@@ -2723,8 +2805,8 @@ class ServiceStatefulRuntime {
|
|
|
2723
2805
|
void ServiceStatefulRuntime.detachedIngressScope(async () => {
|
|
2724
2806
|
try {
|
|
2725
2807
|
await this.ingress({
|
|
2726
|
-
command: parts[0][
|
|
2727
|
-
flags: parts[0][
|
|
2808
|
+
command: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
|
|
2809
|
+
flags: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
|
|
2728
2810
|
sourceRoutingId: this.nodeRid,
|
|
2729
2811
|
sourceNodeGeneration: this.nodeGeneration,
|
|
2730
2812
|
parts,
|
|
@@ -2744,8 +2826,8 @@ class ServiceStatefulRuntime {
|
|
|
2744
2826
|
}
|
|
2745
2827
|
try {
|
|
2746
2828
|
const result = await this.ingress({
|
|
2747
|
-
command: parts[0][
|
|
2748
|
-
flags: parts[0][
|
|
2829
|
+
command: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
|
|
2830
|
+
flags: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
|
|
2749
2831
|
sourceRoutingId: this.nodeRid,
|
|
2750
2832
|
sourceNodeGeneration: this.nodeGeneration,
|
|
2751
2833
|
parts,
|
|
@@ -2772,18 +2854,22 @@ class ServiceStatefulRuntime {
|
|
|
2772
2854
|
submitRequest(pending, targetNodeRid, parts, timeoutMs, operationKind, actor) {
|
|
2773
2855
|
if (targetNodeRid === this.nodeRid) {
|
|
2774
2856
|
const deadlineUnixMs = BigInt(Date.now() + Math.max(0, timeoutMs));
|
|
2857
|
+
const capacityStop = new AbortController();
|
|
2858
|
+
void pending.promise.then(() => capacityStop.abort(), () => capacityStop.abort());
|
|
2775
2859
|
void (async () => {
|
|
2776
|
-
const applicationJobOwner = await this.raw.reserveLocalIngress();
|
|
2777
|
-
const localIngress = {
|
|
2778
|
-
command: parts[0][3],
|
|
2779
|
-
flags: parts[0][4],
|
|
2780
|
-
sourceRoutingId: this.nodeRid,
|
|
2781
|
-
requestSequence: pending.id,
|
|
2782
|
-
parts,
|
|
2783
|
-
applicationJobOwner
|
|
2784
|
-
};
|
|
2860
|
+
const applicationJobOwner = await this.raw.reserveLocalIngress(capacityStop.signal);
|
|
2785
2861
|
try {
|
|
2786
|
-
this.
|
|
2862
|
+
if (!this.operations.isPending(pending.id))
|
|
2863
|
+
return;
|
|
2864
|
+
const localIngress = {
|
|
2865
|
+
command: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
|
|
2866
|
+
flags: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
|
|
2867
|
+
sourceRoutingId: this.nodeRid,
|
|
2868
|
+
requestSequence: pending.id,
|
|
2869
|
+
parts,
|
|
2870
|
+
applicationJobOwner
|
|
2871
|
+
};
|
|
2872
|
+
await this.submitLocalRequest(localIngress, pending, operationKind, actor, deadlineUnixMs);
|
|
2787
2873
|
}
|
|
2788
2874
|
catch (error) {
|
|
2789
2875
|
this.operations.reply(pending.id, failure(error));
|
|
@@ -2801,10 +2887,7 @@ class ServiceStatefulRuntime {
|
|
|
2801
2887
|
? this.tryActorFence(actor)
|
|
2802
2888
|
: this.acceptCanonicalActorFence(actor, canonical.actorFence);
|
|
2803
2889
|
if (target === undefined || actorRoute === undefined) {
|
|
2804
|
-
this.operations.reply(pending.id,
|
|
2805
|
-
terminalResult: runtime_values_1.RequestResult.NotFound,
|
|
2806
|
-
failureCode: ACTOR_ROUTE_STALE
|
|
2807
|
-
});
|
|
2890
|
+
this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
|
|
2808
2891
|
return;
|
|
2809
2892
|
}
|
|
2810
2893
|
if (canonical !== undefined) {
|
|
@@ -2854,7 +2937,7 @@ class ServiceStatefulRuntime {
|
|
|
2854
2937
|
this.operations.fail(pending.id, error);
|
|
2855
2938
|
});
|
|
2856
2939
|
}
|
|
2857
|
-
submitLocalRequest(ingress, pending, operationKind, actor, deadlineUnixMs) {
|
|
2940
|
+
async submitLocalRequest(ingress, pending, operationKind, actor, deadlineUnixMs) {
|
|
2858
2941
|
const canonicalActorJoin = operationKind === 'actorJoin' ? (0, service_wire_pilot_codec_generated_1.decodeActorJoin28)(ingress.parts) : undefined;
|
|
2859
2942
|
const decoded = canonicalActorJoin === undefined
|
|
2860
2943
|
? (0, service_stateful_wire_codec_1.decodeStatefulHeader)(ingress.parts[0])
|
|
@@ -2911,7 +2994,9 @@ class ServiceStatefulRuntime {
|
|
|
2911
2994
|
operationKind: service_runtime_contracts_1.OperationKind.ActorRequest,
|
|
2912
2995
|
correlation: decoded.correlation,
|
|
2913
2996
|
targetActor: current.ref,
|
|
2914
|
-
...(decoded.sourceActor === undefined
|
|
2997
|
+
...(decoded.sourceActor === undefined
|
|
2998
|
+
? {}
|
|
2999
|
+
: { sourceActor: { ...decoded.sourceActor, nodeRid: ingress.sourceRoutingId } }),
|
|
2915
3000
|
...(decoded.boundSession === undefined
|
|
2916
3001
|
? {}
|
|
2917
3002
|
: { sourceBindingGeneration: decoded.boundSession.bindingGeneration }),
|
|
@@ -3147,6 +3232,10 @@ class ServiceStatefulRuntime {
|
|
|
3147
3232
|
return spot;
|
|
3148
3233
|
}
|
|
3149
3234
|
validateDirectSpotFence(fence) {
|
|
3235
|
+
if (fence.targetNodeRid !== this.nodeRid ||
|
|
3236
|
+
fence.targetNodeGeneration !== this.nodeGeneration) {
|
|
3237
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Spot '${fence.spot.spotId}' targets an unavailable owner route.`);
|
|
3238
|
+
}
|
|
3150
3239
|
const spot = this.registry.spot(fence.spot.spotId);
|
|
3151
3240
|
if (spot === undefined) {
|
|
3152
3241
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound, `Spot '${fence.spot.spotId}' has no current Ready authority.`);
|
|
@@ -3154,10 +3243,6 @@ class ServiceStatefulRuntime {
|
|
|
3154
3243
|
if (spot.state !== 'ready') {
|
|
3155
3244
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Spot '${fence.spot.spotId}' is not Ready.`);
|
|
3156
3245
|
}
|
|
3157
|
-
if (fence.targetNodeRid !== this.nodeRid ||
|
|
3158
|
-
fence.targetNodeGeneration !== this.nodeGeneration) {
|
|
3159
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Spot '${fence.spot.spotId}' targets an unavailable owner route.`);
|
|
3160
|
-
}
|
|
3161
3246
|
if (spot.kind === 'entry') {
|
|
3162
3247
|
if (!isEntrySpotFence(fence)) {
|
|
3163
3248
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Entry Spot '${fence.spot.spotId}' has an invalid owner fence.`);
|
|
@@ -3179,7 +3264,7 @@ class ServiceStatefulRuntime {
|
|
|
3179
3264
|
}
|
|
3180
3265
|
holdOrRelaySpotMessage(ingress, wire) {
|
|
3181
3266
|
const state = this.spotMessageFollow.get(spotKey(wire.target.spot));
|
|
3182
|
-
if (state === undefined || !
|
|
3267
|
+
if (state === undefined || !sameDirectSpotRouteIdentity(state.source, wire.target)) {
|
|
3183
3268
|
return undefined;
|
|
3184
3269
|
}
|
|
3185
3270
|
if (state.expiresAtMs !== undefined && state.expiresAtMs <= performance.now()) {
|
|
@@ -3224,9 +3309,13 @@ class ServiceStatefulRuntime {
|
|
|
3224
3309
|
}
|
|
3225
3310
|
const current = this.peekSpotMessageFollow(state);
|
|
3226
3311
|
try {
|
|
3312
|
+
const metadata = (current.ingress.parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET] &
|
|
3313
|
+
service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !==
|
|
3314
|
+
0;
|
|
3227
3315
|
const parts = [
|
|
3228
|
-
(0, service_stateful_wire_codec_1.encodeSpotHeader)(current.wire.kind, current.wire.sourceSpotId, state.target, current.wire.correlation),
|
|
3229
|
-
current.ingress.parts[1]
|
|
3316
|
+
(0, service_stateful_wire_codec_1.encodeSpotHeader)(current.wire.kind, current.wire.sourceSpotId, state.target, current.wire.correlation, current.wire.operation, current.wire.messageFollowHopCount + 1, metadata ? current.ingress.parts[1] : undefined),
|
|
3317
|
+
...(metadata ? [current.ingress.parts[1]] : []),
|
|
3318
|
+
current.ingress.parts[metadata ? 2 : 1]
|
|
3230
3319
|
];
|
|
3231
3320
|
if (current.wire.kind === 'spotSend') {
|
|
3232
3321
|
if (!(await this.raw.sendService(state.target.targetNodeRid, parts)))
|
|
@@ -3330,7 +3419,7 @@ class ServiceStatefulRuntime {
|
|
|
3330
3419
|
state.queued.length = 0;
|
|
3331
3420
|
state.queuedHead = 0;
|
|
3332
3421
|
}
|
|
3333
|
-
else if (
|
|
3422
|
+
else if ((0, admission_1.shouldCompactBackingArray)(state.queuedHead, state.queued.length)) {
|
|
3334
3423
|
state.queued.splice(0, state.queuedHead);
|
|
3335
3424
|
state.queuedHead = 0;
|
|
3336
3425
|
}
|
|
@@ -3341,26 +3430,6 @@ class ServiceStatefulRuntime {
|
|
|
3341
3430
|
throw new service_stateful_registry_1.ServiceStaleGenerationError('actor', actor.actorId);
|
|
3342
3431
|
return route;
|
|
3343
3432
|
}
|
|
3344
|
-
tryBoundSessionSendFence(actor, senderFence) {
|
|
3345
|
-
if (senderFence === undefined ||
|
|
3346
|
-
senderFence.targetNodeGeneration !== this.nodeGeneration ||
|
|
3347
|
-
senderFence.authorityOwnerGeneration <= 0n ||
|
|
3348
|
-
senderFence.ownerLeaseGeneration <= 0n) {
|
|
3349
|
-
return undefined;
|
|
3350
|
-
}
|
|
3351
|
-
const local = actor.nodeRid === this.nodeRid ? this.registry.actor(actor.actorId) : undefined;
|
|
3352
|
-
if (local === undefined ||
|
|
3353
|
-
!sameActorRef(local.ref, actor) ||
|
|
3354
|
-
local.authorityOwnerGeneration !== senderFence.authorityOwnerGeneration) {
|
|
3355
|
-
return undefined;
|
|
3356
|
-
}
|
|
3357
|
-
return {
|
|
3358
|
-
actor,
|
|
3359
|
-
targetNodeGeneration: senderFence.targetNodeGeneration,
|
|
3360
|
-
authorityOwnerGeneration: senderFence.authorityOwnerGeneration,
|
|
3361
|
-
ownerLeaseGeneration: senderFence.ownerLeaseGeneration
|
|
3362
|
-
};
|
|
3363
|
-
}
|
|
3364
3433
|
tryActorFence(actor) {
|
|
3365
3434
|
const local = actor.nodeRid === this.nodeRid ? this.registry.actor(actor.actorId) : undefined;
|
|
3366
3435
|
if (local !== undefined && sameActorRef(local.ref, actor)) {
|
|
@@ -3536,35 +3605,19 @@ class ServiceStatefulRuntime {
|
|
|
3536
3605
|
}
|
|
3537
3606
|
}
|
|
3538
3607
|
exports.ServiceStatefulRuntime = ServiceStatefulRuntime;
|
|
3539
|
-
function serviceSpotPublishFailureReason(result, routeReady, closed) {
|
|
3540
|
-
if (closed || result === runtime_values_1.SubmitResult.Terminated)
|
|
3541
|
-
return 'shutdown';
|
|
3542
|
-
switch (result) {
|
|
3543
|
-
case runtime_values_1.SubmitResult.Backpressured:
|
|
3544
|
-
return 'backpressure';
|
|
3545
|
-
case runtime_values_1.SubmitResult.NotAdmitted:
|
|
3546
|
-
case runtime_values_1.SubmitResult.NotConnected:
|
|
3547
|
-
case runtime_values_1.SubmitResult.NotFound:
|
|
3548
|
-
case runtime_values_1.SubmitResult.InvalidHandle:
|
|
3549
|
-
return 'stale_target';
|
|
3550
|
-
default:
|
|
3551
|
-
// RawServiceMeshRuntime exposes failed Core submissions as false. A
|
|
3552
|
-
// ready route therefore identifies queue admission failure; a route
|
|
3553
|
-
// that became unready after selection is a stale target.
|
|
3554
|
-
return routeReady ? 'backpressure' : 'stale_target';
|
|
3555
|
-
}
|
|
3556
|
-
}
|
|
3557
3608
|
function isEntrySpotFence(fence) {
|
|
3558
3609
|
return (fence.spot.spotId === fence.targetNodeRid &&
|
|
3559
3610
|
fence.spot.generation === fence.targetNodeGeneration &&
|
|
3560
3611
|
fence.authorityOwnerGeneration === fence.targetNodeGeneration &&
|
|
3561
|
-
fence.ownerLeaseGeneration === fence.targetNodeGeneration
|
|
3562
|
-
fence.storeVersion === `entry:${fence.targetNodeGeneration}`);
|
|
3612
|
+
fence.ownerLeaseGeneration === fence.targetNodeGeneration);
|
|
3563
3613
|
}
|
|
3564
|
-
function
|
|
3614
|
+
function operationDeadline(deadlineUnixMs) {
|
|
3565
3615
|
const controller = new AbortController();
|
|
3566
3616
|
const delay = Number(deadlineUnixMs - BigInt(Date.now()));
|
|
3567
|
-
const
|
|
3617
|
+
const expire = () => controller.abort((0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded, 'Operation deadline exceeded.'));
|
|
3618
|
+
const timeout = delay <= 0
|
|
3619
|
+
? (expire(), undefined)
|
|
3620
|
+
: setTimeout(expire, Math.min(delay, MAX_NODE_TIMER_DELAY_MS));
|
|
3568
3621
|
return {
|
|
3569
3622
|
signal: controller.signal,
|
|
3570
3623
|
close: () => clearTimeout(timeout)
|
|
@@ -3620,12 +3673,12 @@ function actorLocation(actor) {
|
|
|
3620
3673
|
}
|
|
3621
3674
|
function failure(error) {
|
|
3622
3675
|
if (error instanceof service_stateful_registry_1.ServiceStaleGenerationError) {
|
|
3623
|
-
return
|
|
3676
|
+
return (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale);
|
|
3624
3677
|
}
|
|
3625
3678
|
if (error instanceof contracts_1.ZLinkFrameworkException) {
|
|
3626
3679
|
return (0, framework_errors_internal_1.internalFrameworkWireReply)(error);
|
|
3627
3680
|
}
|
|
3628
|
-
return
|
|
3681
|
+
return (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestFailed);
|
|
3629
3682
|
}
|
|
3630
3683
|
function actorKey(actor) {
|
|
3631
3684
|
return `${actor.actorId}\0${actor.generation}`;
|
|
@@ -3870,7 +3923,7 @@ function topicMatches(filter, topic) {
|
|
|
3870
3923
|
function emptyPayload() {
|
|
3871
3924
|
return {
|
|
3872
3925
|
packetName: 'ZLinkFrameworkEmpty',
|
|
3873
|
-
contentType:
|
|
3926
|
+
contentType: stream_wire_1.ZlinkStreamContentType.Raw,
|
|
3874
3927
|
payload: Buffer.alloc(0)
|
|
3875
3928
|
};
|
|
3876
3929
|
}
|