@zlink-systems/framework 0.30.3 → 0.32.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/Actors/ZLinkActor.d.ts +2 -0
- package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
- package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
- package/dist/contracts/Actors/index.d.ts +1 -0
- package/dist/contracts/Actors/index.js +1 -0
- package/dist/contracts/Common/CoreTypes.d.ts +1 -0
- package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
- package/dist/contracts/Common/HandlerMessageType.js +41 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
- package/dist/contracts/Common/ZLinkMessage.js +11 -7
- package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
- package/dist/contracts/Common/encoded-payload-storage.js +4 -16
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/payload-slab.d.ts +4 -0
- package/dist/contracts/Common/payload-slab.js +30 -0
- package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
- package/dist/contracts/Handlers/Contexts.d.ts +1 -0
- package/dist/contracts/Locations/Authority.d.ts +2 -0
- package/dist/internal.d.ts +9 -0
- package/dist/internal.js +23 -1
- package/dist/nest-integration.d.ts +1 -0
- package/dist/nest-integration.js +3 -1
- package/dist/runtime/actors/actor-client.d.ts +6 -2
- package/dist/runtime/actors/actor-client.js +120 -82
- package/dist/runtime/actors/actor-context.js +16 -5
- package/dist/runtime/actors/actor-execution-context.js +2 -2
- package/dist/runtime/actors/actor-handoff.d.ts +12 -1
- package/dist/runtime/actors/actor-handoff.js +79 -34
- package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
- package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
- package/dist/runtime/actors/actor-local-native-join.js +19 -17
- package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
- package/dist/runtime/actors/actor-remote-joiner.js +4 -4
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
- package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
- package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
- package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
- package/dist/runtime/admission.d.ts +6 -4
- package/dist/runtime/admission.js +21 -10
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
- package/dist/runtime/backend/contracts/index.d.ts +26 -10
- package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
- package/dist/runtime/backend/mesh-completion-table.js +84 -20
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
- package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
- package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
- package/dist/runtime/channels/channel-clients.js +3 -3
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
- package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
- package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
- package/dist/runtime/channels/channel-dispatch-services.js +7 -6
- package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
- package/dist/runtime/channels/channel-dispatchers.js +57 -36
- package/dist/runtime/channels/channel-envelope.d.ts +2 -2
- package/dist/runtime/channels/channel-envelope.js +609 -83
- package/dist/runtime/channels/channel-multipart.d.ts +1 -0
- package/dist/runtime/channels/channel-multipart.js +10 -6
- package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
- package/dist/runtime/channels/channel-outbound-operations.js +107 -105
- package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
- package/dist/runtime/channels/channel-receive-loops.js +126 -90
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
- package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
- package/dist/runtime/channels/channel-runtime-manager.js +32 -14
- package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
- package/dist/runtime/channels/channel-socket-registry.js +9 -1
- package/dist/runtime/channels/channel-transports.d.ts +23 -16
- package/dist/runtime/channels/channel-transports.js +139 -119
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
- package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
- package/dist/runtime/channels/local-spot-route-transport.js +15 -18
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
- package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
- package/dist/runtime/channels/source-spot-router.d.ts +6 -3
- package/dist/runtime/channels/source-spot-router.js +34 -23
- package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
- package/dist/runtime/channels/spot-node-route-transport.js +23 -17
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
- package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
- package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
- package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
- package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
- package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
- package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
- package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
- package/dist/runtime/diagnostics/message-flow-record.js +228 -0
- package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
- package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
- package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
- package/dist/runtime/diagnostics/message-flow.js +42 -290
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
- package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
- package/dist/runtime/execution/index.d.ts +1 -0
- package/dist/runtime/execution/index.js +6 -3
- package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
- package/dist/runtime/execution/serial-execution-queue.js +75 -71
- package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
- package/dist/runtime/foundation/durable-service-request.js +158 -73
- package/dist/runtime/foundation/operation-registry.d.ts +33 -3
- package/dist/runtime/foundation/operation-registry.js +272 -33
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
- package/dist/runtime/foundation/request-runtime.d.ts +17 -0
- package/dist/runtime/foundation/request-runtime.js +163 -0
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +6 -0
- package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
- package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
- package/dist/runtime/foundation/service-mailbox.js +4 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
- package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
- package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
- package/dist/runtime/foundation/service-stateful-registry.js +38 -17
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
- package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
- package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
- package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-topology-registry.js +13 -3
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
- package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
- package/dist/runtime/host/actor-packet-relay.js +58 -57
- package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
- package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
- package/dist/runtime/host/application-job-queue.d.ts +7 -5
- package/dist/runtime/host/application-job-queue.js +33 -21
- package/dist/runtime/host/bound-session-relay.js +0 -1
- package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
- package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
- package/dist/runtime/host/entry-actor-runtime.js +2 -2
- package/dist/runtime/host/index.d.ts +106 -37
- package/dist/runtime/host/index.js +303 -151
- package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
- package/dist/runtime/host/location-runtime-owner.js +1 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
- package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
- package/dist/runtime/host/spot-address-transport.d.ts +3 -0
- package/dist/runtime/host/spot-address-transport.js +73 -76
- package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
- package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
- package/dist/runtime/internal-observation.d.ts +1 -0
- package/dist/runtime/internal-observation.js +5 -0
- package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
- package/dist/runtime/locations/actor-location-claims.js +15 -6
- package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
- package/dist/runtime/locations/auto-connect-loop.js +25 -19
- package/dist/runtime/locations/auto-connect-planner.js +2 -5
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
- package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.js +15 -5
- package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
- package/dist/runtime/locations/in-memory-location-store.js +1 -38
- package/dist/runtime/locations/lifecycle.d.ts +1 -1
- package/dist/runtime/locations/lifecycle.js +2 -2
- package/dist/runtime/locations/location-store-repository.d.ts +0 -1
- package/dist/runtime/locations/location-store-repository.js +163 -246
- package/dist/runtime/locations/resolvers.d.ts +8 -1
- package/dist/runtime/locations/resolvers.js +16 -2
- package/dist/runtime/locations/runtime.d.ts +3 -3
- package/dist/runtime/locations/runtime.js +12 -16
- package/dist/runtime/messaging/creation-payload-codec.js +8 -7
- package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
- package/dist/runtime/messaging/framework-json-v1.js +6 -2
- package/dist/runtime/messaging/payload-codec.js +21 -35
- package/dist/runtime/messaging/request-deadline.d.ts +4 -2
- package/dist/runtime/messaging/request-deadline.js +40 -25
- package/dist/runtime/messaging/request-result.d.ts +14 -1
- package/dist/runtime/messaging/request-result.js +74 -13
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
- package/dist/runtime/spots/index.d.ts +28 -7
- package/dist/runtime/spots/index.js +31 -6
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
- package/dist/runtime/spots/spot-activation-registry.js +13 -8
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
- package/dist/runtime/spots/spot-activation-state.js +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
- package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
- package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
- package/dist/runtime/spots/spot-actor-membership.js +3 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
- package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
- package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
- package/dist/runtime/spots/spot-entry-activation.js +7 -12
- package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
- package/dist/runtime/spots/spot-handler-registry.js +31 -15
- package/dist/runtime/spots/spot-manager-public.js +3 -2
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
- package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
- package/dist/runtime/spots/spot-outbound.d.ts +8 -2
- package/dist/runtime/spots/spot-outbound.js +5 -5
- package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
- package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
- package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
- package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
- package/dist/runtime/spots/spot-timer.d.ts +1 -1
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
- package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
- package/dist/runtime/streams/bound-session-service.js +6 -7
- package/dist/runtime/streams/index.d.ts +3 -3
- package/dist/runtime/streams/index.js +22 -2
- package/dist/runtime/streams/managed-stream.js +2 -1
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +3 -9
- package/dist/runtime/streams/session-context.d.ts +2 -2
- package/dist/runtime/streams/session-context.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
- package/dist/runtime/streams/stream-session-runtime.js +64 -33
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActor.ts +6 -0
- package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
- package/src/contracts/Actors/index.ts +1 -0
- package/src/contracts/Common/CoreTypes.ts +1 -0
- package/src/contracts/Common/HandlerMessageType.ts +50 -0
- package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
- package/src/contracts/Common/ZLinkMessage.ts +11 -7
- package/src/contracts/Common/encoded-payload-storage.ts +4 -16
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Common/payload-slab.ts +29 -0
- package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
- package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
- package/src/contracts/Handlers/Contexts.ts +1 -0
- package/src/contracts/Locations/Authority.ts +7 -1
- package/src/internal.ts +17 -0
- package/src/nest-integration.ts +1 -0
- package/src/runtime/actors/actor-client.ts +257 -163
- package/src/runtime/actors/actor-context.ts +26 -14
- package/src/runtime/actors/actor-execution-context.ts +2 -2
- package/src/runtime/actors/actor-handoff.ts +86 -51
- package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
- package/src/runtime/actors/actor-local-native-join.ts +38 -17
- package/src/runtime/actors/actor-mailbox.ts +1 -1
- package/src/runtime/actors/actor-remote-joiner.ts +8 -4
- package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
- package/src/runtime/actors/actor-routed-json-request.ts +3 -0
- package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
- package/src/runtime/actors/actor-runtime-state.ts +1 -1
- package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
- package/src/runtime/admission.ts +42 -15
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
- package/src/runtime/backend/contracts/index.ts +77 -10
- package/src/runtime/backend/mesh-completion-table.ts +106 -15
- package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
- package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
- package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
- package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
- package/src/runtime/backend/raw-binding-port.ts +13 -5
- package/src/runtime/channels/channel-clients.ts +26 -11
- package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
- package/src/runtime/channels/channel-dispatch-services.ts +7 -12
- package/src/runtime/channels/channel-dispatchers.ts +93 -39
- package/src/runtime/channels/channel-envelope.ts +680 -144
- package/src/runtime/channels/channel-multipart.ts +17 -13
- package/src/runtime/channels/channel-outbound-operations.ts +204 -178
- package/src/runtime/channels/channel-receive-loops.ts +160 -107
- package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
- package/src/runtime/channels/channel-runtime-manager.ts +74 -27
- package/src/runtime/channels/channel-socket-registry.ts +20 -5
- package/src/runtime/channels/channel-transports.ts +414 -287
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
- package/src/runtime/channels/local-spot-route-transport.ts +27 -29
- package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
- package/src/runtime/channels/source-spot-router.ts +75 -38
- package/src/runtime/channels/spot-node-route-transport.ts +67 -37
- package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
- package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
- package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
- package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
- package/src/runtime/diagnostics/message-flow-record.ts +295 -0
- package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
- package/src/runtime/diagnostics/message-flow.ts +49 -362
- package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
- package/src/runtime/execution/index.ts +6 -0
- package/src/runtime/execution/serial-execution-queue.ts +94 -96
- package/src/runtime/foundation/durable-service-request.ts +212 -89
- package/src/runtime/foundation/operation-registry.ts +287 -38
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
- package/src/runtime/foundation/request-runtime.ts +227 -0
- package/src/runtime/foundation/service-discovery-registry.ts +7 -0
- package/src/runtime/foundation/service-liveness-registry.ts +1 -1
- package/src/runtime/foundation/service-mailbox.ts +7 -2
- package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
- package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
- package/src/runtime/foundation/service-stateful-registry.ts +52 -19
- package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
- package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
- package/src/runtime/foundation/service-topology-registry.ts +21 -3
- package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
- package/src/runtime/host/actor-packet-relay.ts +160 -156
- package/src/runtime/host/actor-placement-coordinator.ts +1 -1
- package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
- package/src/runtime/host/actor-transfer-runtime.ts +3 -3
- package/src/runtime/host/application-job-queue.ts +56 -27
- package/src/runtime/host/bound-session-relay.ts +0 -1
- package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
- package/src/runtime/host/entry-actor-runtime.ts +14 -6
- package/src/runtime/host/index.ts +388 -113
- package/src/runtime/host/location-runtime-owner.ts +3 -3
- package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
- package/src/runtime/host/spot-address-transport.ts +110 -95
- package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
- package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
- package/src/runtime/internal-observation.ts +2 -0
- package/src/runtime/locations/actor-location-claims.ts +42 -16
- package/src/runtime/locations/auto-connect-loop.ts +24 -16
- package/src/runtime/locations/auto-connect-planner.ts +2 -5
- package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
- package/src/runtime/locations/in-memory-authority-store.ts +27 -7
- package/src/runtime/locations/in-memory-location-store.ts +1 -74
- package/src/runtime/locations/lifecycle.ts +4 -2
- package/src/runtime/locations/location-store-repository.ts +228 -308
- package/src/runtime/locations/resolvers.ts +20 -8
- package/src/runtime/locations/runtime.ts +16 -28
- package/src/runtime/messaging/creation-payload-codec.ts +12 -10
- package/src/runtime/messaging/framework-json-v1.ts +10 -1
- package/src/runtime/messaging/payload-codec.ts +50 -75
- package/src/runtime/messaging/request-deadline.ts +47 -39
- package/src/runtime/messaging/request-result.ts +88 -17
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/index.ts +57 -10
- package/src/runtime/spots/spot-activation-registry.ts +12 -8
- package/src/runtime/spots/spot-activation-state.ts +2 -0
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
- package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
- package/src/runtime/spots/spot-actor-membership.ts +8 -5
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
- package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
- package/src/runtime/spots/spot-entry-activation.ts +25 -35
- package/src/runtime/spots/spot-handler-registry.ts +72 -15
- package/src/runtime/spots/spot-manager-public.ts +4 -2
- package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
- package/src/runtime/spots/spot-outbound.ts +26 -10
- package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
- package/src/runtime/spots/spot-runtime-ports.ts +5 -2
- package/src/runtime/spots/spot-serial-executor.ts +1 -1
- package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
- package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
- package/src/runtime/spots/spot-timer.ts +1 -1
- package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
- package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
- package/src/runtime/streams/bound-session-service.ts +10 -7
- package/src/runtime/streams/index.ts +30 -4
- package/src/runtime/streams/managed-stream.ts +2 -1
- package/src/runtime/streams/session-calls.ts +9 -14
- package/src/runtime/streams/session-context.ts +6 -11
- package/src/runtime/streams/stream-session-runtime.ts +79 -40
- package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
- package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
- package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkLocationStoreRepository = void 0;
|
|
4
|
+
const abort_1 = require("../abort");
|
|
4
5
|
const routing_id_1 = require("../routing-id");
|
|
5
6
|
const service_relocation_runtime_1 = require("../foundation/service-relocation-runtime");
|
|
6
7
|
const service_authority_payload_codec_1 = require("../foundation/service-authority-payload-codec");
|
|
@@ -36,7 +37,6 @@ const MAX_GENERATION = 0x7fffffffffffffffn;
|
|
|
36
37
|
const MAX_U64 = stream_wire_1.UINT64_MAX;
|
|
37
38
|
const CREATION_TERMINAL_RETENTION_MS = 5 * 60 * 1000;
|
|
38
39
|
const MAX_DESCRIPTOR_WRITE_RETRIES = 3;
|
|
39
|
-
const MAX_OWNER_CLEANUP_BATCH_ROWS = 2_047;
|
|
40
40
|
/**
|
|
41
41
|
* Maps framework domain records to the minimal provider SPI.
|
|
42
42
|
*
|
|
@@ -215,8 +215,10 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
215
215
|
],
|
|
216
216
|
mutations: [{ kind: 'put', key: rowKey, bytes: encodeAuthorityRecord(nextRecord) }]
|
|
217
217
|
}, signal);
|
|
218
|
-
if (result.kind === 'conflict')
|
|
218
|
+
if (result.kind === 'conflict') {
|
|
219
|
+
await (0, abort_1.macrotaskBoundary)();
|
|
219
220
|
continue;
|
|
221
|
+
}
|
|
220
222
|
const storeVersion = result.putVersions.find((entry) => entry.key.value === rowKey.value)?.version;
|
|
221
223
|
if (storeVersion === undefined) {
|
|
222
224
|
throw new Error('Authority lease rebind did not return a row version.');
|
|
@@ -278,8 +280,12 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
278
280
|
leaseGeneration: record.snapshot.ownerLeaseGeneration
|
|
279
281
|
})
|
|
280
282
|
: [];
|
|
281
|
-
if (membershipConditions
|
|
282
|
-
return {
|
|
283
|
+
if (!Array.isArray(membershipConditions))
|
|
284
|
+
return {
|
|
285
|
+
kind: 'conflict',
|
|
286
|
+
current: snapshot,
|
|
287
|
+
membershipFailure: membershipConditions.failureKind
|
|
288
|
+
};
|
|
283
289
|
const result = await this.provider.write({
|
|
284
290
|
conditions: [
|
|
285
291
|
{ kind: 'version', key: rowKey, expected: current.value.version },
|
|
@@ -334,8 +340,10 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
334
340
|
])
|
|
335
341
|
]
|
|
336
342
|
}, signal);
|
|
337
|
-
if (result.kind === 'conflict')
|
|
343
|
+
if (result.kind === 'conflict') {
|
|
344
|
+
await (0, abort_1.macrotaskBoundary)();
|
|
338
345
|
continue;
|
|
346
|
+
}
|
|
339
347
|
const storeVersion = result.putVersions.find((entry) => entry.key.value === rowKey.value)?.version;
|
|
340
348
|
if (mutation.kind === 'delete') {
|
|
341
349
|
return {
|
|
@@ -807,7 +815,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
807
815
|
if (membershipConditions.some((condition) => condition.key.value === authorityKey(spotKey.value).value))
|
|
808
816
|
continue;
|
|
809
817
|
const conditions = await this.userSpotMembershipConditions(actor.currentSpotId, actor.currentSpotGeneration, signal, aggregate.targetOwner);
|
|
810
|
-
if (conditions
|
|
818
|
+
if (!Array.isArray(conditions))
|
|
811
819
|
return { kind: 'stale' };
|
|
812
820
|
membershipConditions.push(...conditions.filter((condition) => !membershipConditions.some((existing) => existing.key.value === condition.key.value)));
|
|
813
821
|
}
|
|
@@ -915,137 +923,151 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
915
923
|
async releaseEndedReservation(key, expectedStoreVersion, signal, request) {
|
|
916
924
|
return this.observeStore('release', () => this.releaseEndedReservationRequest(key, expectedStoreVersion, signal, request));
|
|
917
925
|
}
|
|
918
|
-
async releaseEndedReservationRequest(key, expectedStoreVersion, signal, request) {
|
|
919
|
-
return ((await this.tryReleaseEndedReservation(key, expectedStoreVersion, signal, request)) ===
|
|
920
|
-
'reclaimed');
|
|
926
|
+
async releaseEndedReservationRequest(key, expectedStoreVersion, signal, request, requiredOwner) {
|
|
927
|
+
return ((await this.tryReleaseEndedReservation(key, expectedStoreVersion, signal, request, undefined, requiredOwner)) === 'reclaimed');
|
|
921
928
|
}
|
|
922
|
-
async tryReleaseEndedReservation(key, expectedStoreVersion, signal, request) {
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
this.provider.read(leaseKey, signal),
|
|
938
|
-
this.provider.read(descriptorKey, signal),
|
|
939
|
-
this.provider.read(capacityRowKey, signal)
|
|
940
|
-
]);
|
|
941
|
-
const ownerLive = sameLiveOwner(lease, snapshot);
|
|
942
|
-
let members = [];
|
|
943
|
-
if (snapshot.allocation.state === 'active') {
|
|
944
|
-
if (ownerLive)
|
|
929
|
+
async tryReleaseEndedReservation(key, expectedStoreVersion, signal, request, deadlineUnixMs, requiredOwner) {
|
|
930
|
+
for (;;) {
|
|
931
|
+
throwIfOperationExpired(signal, deadlineUnixMs);
|
|
932
|
+
const rowKey = authorityKey(key.value);
|
|
933
|
+
const current = await this.provider.read(rowKey, signal);
|
|
934
|
+
if (current.kind === 'missing')
|
|
935
|
+
return 'conflict';
|
|
936
|
+
const record = decodeAuthorityRecord(current.value.bytes);
|
|
937
|
+
if (current.value.version.value !== expectedStoreVersion &&
|
|
938
|
+
record.visibleStoreVersion !== expectedStoreVersion)
|
|
939
|
+
return 'conflict';
|
|
940
|
+
const snapshot = record.snapshot;
|
|
941
|
+
if (snapshot.allocation.state === 'active'
|
|
942
|
+
? request === undefined
|
|
943
|
+
: snapshot.pendingCreation === undefined)
|
|
945
944
|
return 'notReclaimable';
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
const mutations = [
|
|
978
|
-
{ kind: 'delete', key: rowKey }
|
|
979
|
-
];
|
|
980
|
-
const owners = new Map([[snapshot.ownerId, lease]]);
|
|
981
|
-
for (const member of members) {
|
|
982
|
-
let memberLease = owners.get(member.ownerId);
|
|
983
|
-
if (memberLease === undefined) {
|
|
984
|
-
memberLease = await this.provider.read(ownerKey(member.ownerId), signal);
|
|
985
|
-
owners.set(member.ownerId, memberLease);
|
|
986
|
-
}
|
|
987
|
-
if (memberLease.kind === 'found' &&
|
|
988
|
-
matchesLiveOwnerLease(memberLease, member.ownerId, member.leaseGeneration))
|
|
989
|
-
throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'User Spot still has a member with a live owner lease.');
|
|
990
|
-
conditions.push({ kind: 'version', key: member.key, expected: member.version });
|
|
991
|
-
mutations.push({ kind: 'delete', key: member.key });
|
|
992
|
-
}
|
|
993
|
-
for (const [ownerId, read] of owners)
|
|
994
|
-
conditions.push(conditionFor(ownerKey(ownerId), read));
|
|
995
|
-
const capacities = new Map([
|
|
996
|
-
[capacityRowKey.value, { read: capacity }]
|
|
997
|
-
]);
|
|
998
|
-
const releases = [
|
|
999
|
-
{ allocation: snapshot.allocation },
|
|
1000
|
-
...members.map((member) => ({ allocation: member.allocation }))
|
|
1001
|
-
];
|
|
1002
|
-
try {
|
|
1003
|
-
for (const { allocation } of releases) {
|
|
1004
|
-
const key = capacityKey(allocation.descriptor.meshName, String(allocation.descriptor.rid));
|
|
1005
|
-
let entry = capacities.get(key.value);
|
|
1006
|
-
if (entry === undefined) {
|
|
1007
|
-
entry = { read: await this.provider.read(key, signal) };
|
|
1008
|
-
capacities.set(key.value, entry);
|
|
945
|
+
const leaseKey = ownerKey(snapshot.ownerId);
|
|
946
|
+
const descriptorKey = meshKey(snapshot.allocation.descriptor.meshName, snapshot.allocation.descriptor.rid);
|
|
947
|
+
const capacityRowKey = capacityKey(snapshot.allocation.descriptor.meshName, String(snapshot.allocation.descriptor.rid));
|
|
948
|
+
const [lease, descriptor, capacity] = await Promise.all([
|
|
949
|
+
this.provider.read(leaseKey, signal),
|
|
950
|
+
this.provider.read(descriptorKey, signal),
|
|
951
|
+
this.provider.read(capacityRowKey, signal)
|
|
952
|
+
]);
|
|
953
|
+
const ownerLive = sameLiveOwner(lease, snapshot);
|
|
954
|
+
if (requiredOwner !== undefined &&
|
|
955
|
+
(!ownerLive ||
|
|
956
|
+
requiredOwner.ownerId !== snapshot.ownerId ||
|
|
957
|
+
requiredOwner.leaseGeneration !== snapshot.ownerLeaseGeneration))
|
|
958
|
+
return 'notReclaimable';
|
|
959
|
+
let members = [];
|
|
960
|
+
if (snapshot.allocation.state === 'active') {
|
|
961
|
+
if (ownerLive)
|
|
962
|
+
return 'notReclaimable';
|
|
963
|
+
let unavailable = record.aggregate !== undefined || hasRelocationAuthority(snapshot.payload);
|
|
964
|
+
if (snapshot.allocation.objectKind !== 'actor') {
|
|
965
|
+
const spot = (0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)(snapshot.payload);
|
|
966
|
+
unavailable ||=
|
|
967
|
+
spot === undefined ||
|
|
968
|
+
spot.kind !== request?.key.kind ||
|
|
969
|
+
spot.stableType !== request.intent.stableType ||
|
|
970
|
+
spot.spotId !== request.key.globalId ||
|
|
971
|
+
spot.activationRecovery !== undefined;
|
|
972
|
+
if (spot?.kind === 'user_spot' &&
|
|
973
|
+
!unavailable &&
|
|
974
|
+
request?.actorRelocationPolicy === 'disabled')
|
|
975
|
+
members = await this.readEndedSpotMembers(spot.spotId, snapshot.objectGeneration, signal);
|
|
1009
976
|
}
|
|
1010
|
-
if (
|
|
1011
|
-
|
|
1012
|
-
const stored = entry.next ?? decodeJson(entry.read.value.bytes);
|
|
1013
|
-
entry.next = {
|
|
1014
|
-
active: allocation.state === 'active'
|
|
1015
|
-
? subtractCapacity(stored.active, allocation.capacity)
|
|
1016
|
-
: stored.active,
|
|
1017
|
-
pending: allocation.state === 'reserved'
|
|
1018
|
-
? subtractCapacity(stored.pending, allocation.capacity)
|
|
1019
|
-
: stored.pending
|
|
1020
|
-
};
|
|
977
|
+
if (unavailable || request?.actorRelocationPolicy !== 'disabled')
|
|
978
|
+
throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'Object owner lease is unavailable.');
|
|
1021
979
|
}
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
980
|
+
else if (ownerLive &&
|
|
981
|
+
descriptor.kind === 'found' &&
|
|
982
|
+
reviveMeshDescriptor(decodeCanonicalDescriptorRecord(descriptor.value.bytes)
|
|
983
|
+
.descriptor).lifecycleGeneration === snapshot.allocation.descriptorLifecycleGeneration)
|
|
984
|
+
return 'notReclaimable';
|
|
985
|
+
if (snapshot.allocation.state !== 'active' &&
|
|
986
|
+
(record.aggregate !== undefined || hasRelocationAuthority(snapshot.payload)))
|
|
987
|
+
return 'notReclaimable';
|
|
988
|
+
// Location runtime §6.1: the authority and every ended-owner member are released in
|
|
989
|
+
// one conditional batch. Each member is fenced by its row version and the observed
|
|
990
|
+
// (invalid) state of its own owner lease; member capacity is returned like the Spot's.
|
|
991
|
+
const conditions = [
|
|
992
|
+
{ kind: 'version', key: rowKey, expected: current.value.version },
|
|
993
|
+
conditionFor(descriptorKey, descriptor)
|
|
994
|
+
];
|
|
995
|
+
const mutations = [
|
|
996
|
+
{ kind: 'delete', key: rowKey }
|
|
997
|
+
];
|
|
998
|
+
const owners = new Map([[snapshot.ownerId, lease]]);
|
|
999
|
+
for (const member of members) {
|
|
1000
|
+
let memberLease = owners.get(member.ownerId);
|
|
1001
|
+
if (memberLease === undefined) {
|
|
1002
|
+
memberLease = await this.provider.read(ownerKey(member.ownerId), signal);
|
|
1003
|
+
owners.set(member.ownerId, memberLease);
|
|
1004
|
+
}
|
|
1005
|
+
if (memberLease.kind === 'found' &&
|
|
1006
|
+
matchesLiveOwnerLease(memberLease, member.ownerId, member.leaseGeneration))
|
|
1007
|
+
throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'User Spot still has a member with a live owner lease.');
|
|
1008
|
+
conditions.push({ kind: 'version', key: member.key, expected: member.version });
|
|
1009
|
+
mutations.push({ kind: 'delete', key: member.key });
|
|
1010
|
+
}
|
|
1011
|
+
for (const [ownerId, read] of owners)
|
|
1012
|
+
conditions.push(conditionFor(ownerKey(ownerId), read));
|
|
1013
|
+
const capacities = new Map([
|
|
1014
|
+
[capacityRowKey.value, { read: capacity }]
|
|
1015
|
+
]);
|
|
1016
|
+
const releases = [
|
|
1017
|
+
{ allocation: snapshot.allocation },
|
|
1018
|
+
...members.map((member) => ({ allocation: member.allocation }))
|
|
1019
|
+
];
|
|
1020
|
+
try {
|
|
1021
|
+
for (const { allocation } of releases) {
|
|
1022
|
+
const key = capacityKey(allocation.descriptor.meshName, String(allocation.descriptor.rid));
|
|
1023
|
+
let entry = capacities.get(key.value);
|
|
1024
|
+
if (entry === undefined) {
|
|
1025
|
+
entry = { read: await this.provider.read(key, signal) };
|
|
1026
|
+
capacities.set(key.value, entry);
|
|
1027
|
+
}
|
|
1028
|
+
if (entry.read.kind !== 'found')
|
|
1029
|
+
continue;
|
|
1030
|
+
const stored = entry.next ?? decodeJson(entry.read.value.bytes);
|
|
1031
|
+
entry.next = {
|
|
1032
|
+
active: allocation.state === 'active'
|
|
1033
|
+
? subtractCapacity(stored.active, allocation.capacity)
|
|
1034
|
+
: stored.active,
|
|
1035
|
+
pending: allocation.state === 'reserved'
|
|
1036
|
+
? subtractCapacity(stored.pending, allocation.capacity)
|
|
1037
|
+
: stored.pending
|
|
1038
|
+
};
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
catch (error) {
|
|
1042
|
+
if (!(error instanceof contracts_2.ZLinkFrameworkException) ||
|
|
1043
|
+
error.kind !== contracts_2.ZLinkFrameworkErrorKind.DataLost)
|
|
1044
|
+
throw error;
|
|
1045
|
+
for (const authority of [{ key: rowKey, version: current.value.version }, ...members]) {
|
|
1046
|
+
const observed = await this.provider.read(authority.key, signal);
|
|
1047
|
+
if (observed.kind === 'missing' ||
|
|
1048
|
+
observed.value.version.value !== authority.version.value)
|
|
1049
|
+
return 'conflict';
|
|
1050
|
+
}
|
|
1026
1051
|
throw error;
|
|
1027
|
-
for (const authority of [{ key: rowKey, version: current.value.version }, ...members]) {
|
|
1028
|
-
const observed = await this.provider.read(authority.key, signal);
|
|
1029
|
-
if (observed.kind === 'missing' || observed.value.version.value !== authority.version.value)
|
|
1030
|
-
return 'conflict';
|
|
1031
1052
|
}
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1053
|
+
for (const [key, entry] of capacities) {
|
|
1054
|
+
conditions.push(conditionFor((0, in_memory_provider_location_store_1.storeKey)(key), entry.read));
|
|
1055
|
+
if (entry.next !== undefined)
|
|
1056
|
+
mutations.push({
|
|
1057
|
+
kind: 'put',
|
|
1058
|
+
key: (0, in_memory_provider_location_store_1.storeKey)(key),
|
|
1059
|
+
bytes: encodeJson(entry.next)
|
|
1060
|
+
});
|
|
1061
|
+
}
|
|
1062
|
+
// Every mutated key is also a condition key, so the condition count is the batch's
|
|
1063
|
+
// unique key count. A release beyond the provider bound changes nothing.
|
|
1064
|
+
if (conditions.length > Stores_1.ZLINK_PROVIDER_MAX_WRITE_KEYS)
|
|
1065
|
+
throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'User Spot member release exceeds one Location Store batch.');
|
|
1066
|
+
const result = await this.provider.write({ conditions, mutations }, signal);
|
|
1067
|
+
if (result.kind === 'applied')
|
|
1068
|
+
return 'reclaimed';
|
|
1069
|
+
await (0, abort_1.macrotaskBoundary)();
|
|
1042
1070
|
}
|
|
1043
|
-
// Every mutated key is also a condition key, so the condition count is the batch's
|
|
1044
|
-
// unique key count. A release beyond the provider bound changes nothing.
|
|
1045
|
-
if (conditions.length > Stores_1.ZLINK_PROVIDER_MAX_WRITE_KEYS)
|
|
1046
|
-
throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'User Spot member release exceeds one Location Store batch.');
|
|
1047
|
-
const result = await this.provider.write({ conditions, mutations }, signal);
|
|
1048
|
-
return result.kind === 'applied' ? 'reclaimed' : 'conflict';
|
|
1049
1071
|
}
|
|
1050
1072
|
/**
|
|
1051
1073
|
* Reads every Actor membership of one User Spot incarnation from complete snapshot scans
|
|
@@ -1116,7 +1138,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
1116
1138
|
}
|
|
1117
1139
|
if (reclaimVersion !== undefined && snapshot.storeVersion.value !== reclaimVersion)
|
|
1118
1140
|
return { kind: 'conflict', current: snapshot };
|
|
1119
|
-
const reclaim = await this.tryReleaseEndedReservation(encodedAuthorityKey, current.value.version.value, signal, request);
|
|
1141
|
+
const reclaim = await this.tryReleaseEndedReservation(encodedAuthorityKey, current.value.version.value, signal, request, deadlineUnixMs);
|
|
1120
1142
|
if (reclaim === 'notReclaimable')
|
|
1121
1143
|
return snapshot.allocation.state === 'active'
|
|
1122
1144
|
? { kind: 'alreadyExists', current: snapshot }
|
|
@@ -1417,7 +1439,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
1417
1439
|
const membershipConditions = actor?.currentSpotKind === contracts_1.ZLinkSpotKind.User
|
|
1418
1440
|
? await this.userSpotMembershipConditions(actor.currentSpotId, actor.currentSpotGeneration, signal, request.target.owner)
|
|
1419
1441
|
: [];
|
|
1420
|
-
if (membershipConditions
|
|
1442
|
+
if (!Array.isArray(membershipConditions))
|
|
1421
1443
|
return { kind: 'stale' };
|
|
1422
1444
|
const mutations = request.completion.kind === 'created'
|
|
1423
1445
|
? [
|
|
@@ -1889,45 +1911,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
1889
1911
|
const lease = await this.provider.read(leaseKey, signal);
|
|
1890
1912
|
if (liveOwnerLeaseGeneration(lease) !== owner.leaseGeneration)
|
|
1891
1913
|
return 0n;
|
|
1892
|
-
|
|
1893
|
-
const candidates = [];
|
|
1894
|
-
for (const prefix of [
|
|
1895
|
-
'mesh-node\0',
|
|
1896
|
-
'client-server\0',
|
|
1897
|
-
'fanout-publisher\0',
|
|
1898
|
-
`${PREFIX}spot:`,
|
|
1899
|
-
`${PREFIX}actor:`,
|
|
1900
|
-
`${PREFIX}route:`
|
|
1901
|
-
]) {
|
|
1902
|
-
for (;;) {
|
|
1903
|
-
const prefixCandidates = [];
|
|
1904
|
-
let cursor;
|
|
1905
|
-
let expired = false;
|
|
1906
|
-
do {
|
|
1907
|
-
const result = await this.provider.scan({ prefix, cursor, limit: 1_000 }, signal);
|
|
1908
|
-
if (result.kind === 'expired') {
|
|
1909
|
-
expired = true;
|
|
1910
|
-
break;
|
|
1911
|
-
}
|
|
1912
|
-
for (const item of result.value.items) {
|
|
1913
|
-
prefixCandidates.push({ key: item.key, scanVersion: item.value.version });
|
|
1914
|
-
}
|
|
1915
|
-
cursor = result.value.nextCursor;
|
|
1916
|
-
} while (cursor !== undefined);
|
|
1917
|
-
if (expired) {
|
|
1918
|
-
// Snapshot scan expiry invalidates every page from this prefix.
|
|
1919
|
-
// Restart from its first page instead of silently leaving rows
|
|
1920
|
-
// behind after a partial scan.
|
|
1921
|
-
continue;
|
|
1922
|
-
}
|
|
1923
|
-
candidates.push(...prefixCandidates);
|
|
1924
|
-
break;
|
|
1925
|
-
}
|
|
1926
|
-
}
|
|
1927
|
-
for (let offset = 0; offset < candidates.length; offset += MAX_OWNER_CLEANUP_BATCH_ROWS) {
|
|
1928
|
-
removed += await this.removeOwnerCleanupBatch(owner, leaseKey, candidates.slice(offset, offset + MAX_OWNER_CLEANUP_BATCH_ROWS), signal);
|
|
1929
|
-
}
|
|
1930
|
-
return removed + (await super.removeAllByOwner(owner));
|
|
1914
|
+
return this.removeOwnedAuthorities(owner, signal);
|
|
1931
1915
|
}
|
|
1932
1916
|
async removeOwnedAuthorities(owner, signal) {
|
|
1933
1917
|
const candidates = [];
|
|
@@ -1995,65 +1979,12 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
1995
1979
|
}, signal);
|
|
1996
1980
|
if (aborted.kind === 'aborted')
|
|
1997
1981
|
removed += 1n;
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
async removeOwnerCleanupBatch(owner, leaseKey, candidates, signal) {
|
|
2002
|
-
if (candidates.length === 0)
|
|
2003
|
-
return 0n;
|
|
2004
|
-
const currentRows = await Promise.all(candidates.map((candidate) => this.provider.read(candidate.key, signal)));
|
|
2005
|
-
const unchangedOwnedRows = [];
|
|
2006
|
-
for (let index = 0; index < candidates.length; index += 1) {
|
|
2007
|
-
const candidate = candidates[index];
|
|
2008
|
-
const current = currentRows[index];
|
|
2009
|
-
if (current.kind === 'missing' ||
|
|
2010
|
-
current.value.version.value !== candidate.scanVersion.value) {
|
|
2011
|
-
continue;
|
|
2012
|
-
}
|
|
2013
|
-
const record = decodeJson(current.value.bytes);
|
|
2014
|
-
const descriptor = record.descriptor;
|
|
2015
|
-
if (descriptor.ownerId !== owner.ownerId ||
|
|
2016
|
-
descriptorOwnerLeaseGeneration(descriptor) !== owner.leaseGeneration) {
|
|
2017
|
-
continue;
|
|
1982
|
+
else if (aborted.kind === 'stale') {
|
|
1983
|
+
if (await this.releaseEndedReservationRequest({ value: encodedAuthority }, current.value.version.value, signal, undefined, owner))
|
|
1984
|
+
removed += 1n;
|
|
2018
1985
|
}
|
|
2019
|
-
unchangedOwnedRows.push({
|
|
2020
|
-
key: candidate.key,
|
|
2021
|
-
scanVersion: current.value.version
|
|
2022
|
-
});
|
|
2023
|
-
}
|
|
2024
|
-
if (unchangedOwnedRows.length === 0)
|
|
2025
|
-
return 0n;
|
|
2026
|
-
const currentLease = await this.provider.read(leaseKey, signal);
|
|
2027
|
-
if (currentLease.kind === 'missing' ||
|
|
2028
|
-
liveOwnerLeaseGeneration(currentLease) !== owner.leaseGeneration) {
|
|
2029
|
-
return 0n;
|
|
2030
1986
|
}
|
|
2031
|
-
|
|
2032
|
-
conditions: [
|
|
2033
|
-
{ kind: 'version', key: leaseKey, expected: currentLease.value.version },
|
|
2034
|
-
...unchangedOwnedRows.map((row) => ({
|
|
2035
|
-
kind: 'version',
|
|
2036
|
-
key: row.key,
|
|
2037
|
-
expected: row.scanVersion
|
|
2038
|
-
}))
|
|
2039
|
-
],
|
|
2040
|
-
mutations: unchangedOwnedRows.map((row) => ({
|
|
2041
|
-
kind: 'delete',
|
|
2042
|
-
key: row.key
|
|
2043
|
-
}))
|
|
2044
|
-
}, signal);
|
|
2045
|
-
if (result.kind === 'applied')
|
|
2046
|
-
return BigInt(unchangedOwnedRows.length);
|
|
2047
|
-
// A row may have changed while the page was being prepared. Split the
|
|
2048
|
-
// bounded batch so unaffected rows can still be removed atomically, while
|
|
2049
|
-
// the changed row is discarded by the next version re-read. A changed
|
|
2050
|
-
// owner lease causes every recursive branch to stop at the fence above.
|
|
2051
|
-
if (unchangedOwnedRows.length === 1)
|
|
2052
|
-
return 0n;
|
|
2053
|
-
const midpoint = Math.ceil(unchangedOwnedRows.length / 2);
|
|
2054
|
-
const left = await this.removeOwnerCleanupBatch(owner, leaseKey, unchangedOwnedRows.slice(0, midpoint), signal);
|
|
2055
|
-
const right = await this.removeOwnerCleanupBatch(owner, leaseKey, unchangedOwnedRows.slice(midpoint), signal);
|
|
2056
|
-
return left + right;
|
|
1987
|
+
return removed;
|
|
2057
1988
|
}
|
|
2058
1989
|
async updateDescriptor(rowKey, descriptor, intent, revive, same, canRenew, signal) {
|
|
2059
1990
|
const leaseKey = ownerKey(descriptor.ownerId);
|
|
@@ -2171,7 +2102,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
2171
2102
|
const key = authorityKey((0, authority_key_codec_1.encodeAuthorityKey)('user_spot', spotId).value);
|
|
2172
2103
|
const read = await this.provider.read(key, signal);
|
|
2173
2104
|
if (read.kind === 'missing')
|
|
2174
|
-
return
|
|
2105
|
+
return { failureKind: contracts_2.ZLinkFrameworkErrorKind.NotFound };
|
|
2175
2106
|
const record = decodeAuthorityRecord(read.value.bytes);
|
|
2176
2107
|
const snapshot = record.snapshot;
|
|
2177
2108
|
if (record.aggregate !== undefined ||
|
|
@@ -2179,11 +2110,11 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
2179
2110
|
snapshot.allocation.state !== 'active' ||
|
|
2180
2111
|
snapshot.objectGeneration !== objectGeneration ||
|
|
2181
2112
|
(0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)(snapshot.payload)?.kind !== 'user_spot')
|
|
2182
|
-
return
|
|
2113
|
+
return { failureKind: contracts_2.ZLinkFrameworkErrorKind.Unavailable };
|
|
2183
2114
|
const leaseKey = ownerKey(snapshot.ownerId);
|
|
2184
2115
|
const lease = await this.provider.read(leaseKey, signal);
|
|
2185
2116
|
if (!sameLiveOwner(lease, snapshot))
|
|
2186
|
-
return
|
|
2117
|
+
return { failureKind: contracts_2.ZLinkFrameworkErrorKind.Unavailable };
|
|
2187
2118
|
return [
|
|
2188
2119
|
{ kind: 'version', key, expected: read.value.version },
|
|
2189
2120
|
...(conditionedOwner?.ownerId === snapshot.ownerId &&
|
|
@@ -2251,7 +2182,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
|
|
|
2251
2182
|
BigInt(previousMembership.spotGeneration) !== membership.spotGeneration)
|
|
2252
2183
|
? await this.userSpotMembershipConditions(String(membership.spotId), membership.spotGeneration, signal, { ownerId: location.ownerId, leaseGeneration: locationOwnerGeneration(location) })
|
|
2253
2184
|
: [];
|
|
2254
|
-
if (membershipConditions
|
|
2185
|
+
if (!Array.isArray(membershipConditions))
|
|
2255
2186
|
return rejected(lease.value.storeNow);
|
|
2256
2187
|
const result = await this.provider.write({
|
|
2257
2188
|
conditions: [
|
|
@@ -3527,20 +3458,6 @@ function matchesRoute(value, filter) {
|
|
|
3527
3458
|
function locationOwnerGeneration(value) {
|
|
3528
3459
|
return value.leaseGeneration;
|
|
3529
3460
|
}
|
|
3530
|
-
function descriptorOwnerLeaseGeneration(value) {
|
|
3531
|
-
if ('leaseGeneration' in value) {
|
|
3532
|
-
return typeof value.leaseGeneration === 'bigint'
|
|
3533
|
-
? value.leaseGeneration
|
|
3534
|
-
: BigInt(value.leaseGeneration);
|
|
3535
|
-
}
|
|
3536
|
-
if ('generation' in value) {
|
|
3537
|
-
return typeof value.generation === 'bigint' ? value.generation : BigInt(value.generation);
|
|
3538
|
-
}
|
|
3539
|
-
return undefined;
|
|
3540
|
-
}
|
|
3541
|
-
// Location runtime §10: a write whose result was lost is confirmed by reading
|
|
3542
|
-
// the same key. The stored row already is this write when it differs only in
|
|
3543
|
-
// the time the Store stamped, as for every other descriptor kind.
|
|
3544
3461
|
function sameMeshDescriptor(left, right) {
|
|
3545
3462
|
return descriptorFingerprint(left, ['updatedAt']) === descriptorFingerprint(right, ['updatedAt']);
|
|
3546
3463
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { PendingOperation } from '../foundation/operation-registry';
|
|
2
|
+
import { inspectRuntime } from '../internal-observation';
|
|
1
3
|
import type { ActorRef, RoutingId, SpotId } from '../../contracts/Common';
|
|
2
4
|
import { type SpotHandle, type ZLinkActorSpotHandleResolver, type ZLinkSpotHandleResolver, type ResolvedSpotHandle } from '../spots/spot-handle';
|
|
3
5
|
import type { ZLinkSpotRouteResolver, ZLinkSpotRouteTarget, ZLinkInstanceReactivationRoute } from '../spots/spot-routing-internal';
|
|
@@ -67,6 +69,11 @@ export interface ZLinkSpotRouteInvalidationFence {
|
|
|
67
69
|
}
|
|
68
70
|
export declare class ZLinkStoreLocationResolvers implements ZLinkPeerLocationResolver, ZLinkSpotHandleResolver, ZLinkActorSpotHandleResolver {
|
|
69
71
|
private readonly options;
|
|
72
|
+
[inspectRuntime](): Readonly<{
|
|
73
|
+
spotRouteKeys: readonly string[];
|
|
74
|
+
actorRouteKeys: readonly string[];
|
|
75
|
+
directActorRouteKeys: readonly string[];
|
|
76
|
+
}>;
|
|
70
77
|
private readonly lane;
|
|
71
78
|
private readonly liveRows;
|
|
72
79
|
private readonly monotonicNowMs;
|
|
@@ -91,7 +98,7 @@ export declare class ZLinkStoreLocationResolvers implements ZLinkPeerLocationRes
|
|
|
91
98
|
resolveSpotHandle(meshName: string, spotId: RoutingId, signal?: AbortSignal): Promise<SpotHandle | undefined>;
|
|
92
99
|
resolveActorSpotRef(meshName: string, actorId: string, signal?: AbortSignal): Promise<ResolvedSpotHandle | undefined>;
|
|
93
100
|
resolveActorRef(actorId: string, signal?: AbortSignal): Promise<ActorRef | undefined>;
|
|
94
|
-
resolveDirectActorRoute(actorId: string, signal?: AbortSignal, deadlineMs?: number): Promise<ZLinkDirectActorRouteResolution>;
|
|
101
|
+
resolveDirectActorRoute(actorId: string, signal?: AbortSignal, deadlineMs?: number, requestOperation?: PendingOperation<unknown>): Promise<ZLinkDirectActorRouteResolution>;
|
|
95
102
|
private resolveUncachedDirectActorRoute;
|
|
96
103
|
private cacheDirectActorRoute;
|
|
97
104
|
observeActorAuthorityVersion(actorId: string, storeVersion: string): void;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkAuthoritySpotRouteResolver = exports.ZLinkLocationSpotRouteResolver = exports.DefaultZLinkLocationReadiness = exports.ZLinkStoreLocationResolvers = void 0;
|
|
4
|
+
const abort_1 = require("../abort");
|
|
5
|
+
const internal_observation_1 = require("../internal-observation");
|
|
4
6
|
const location_store_pages_1 = require("./location-store-pages");
|
|
5
7
|
const Errors_1 = require("../../contracts/Errors");
|
|
6
8
|
const Options_1 = require("../../contracts/Locations/Options");
|
|
@@ -54,6 +56,13 @@ function projectCanonicalActorRoute(snapshot, actorId) {
|
|
|
54
56
|
}
|
|
55
57
|
class ZLinkStoreLocationResolvers {
|
|
56
58
|
options;
|
|
59
|
+
[internal_observation_1.inspectRuntime]() {
|
|
60
|
+
return Object.freeze({
|
|
61
|
+
spotRouteKeys: Object.freeze([...this.spotRoutes.keys()]),
|
|
62
|
+
actorRouteKeys: Object.freeze([...this.actorRoutes.keys()]),
|
|
63
|
+
directActorRouteKeys: Object.freeze([...this.directActorRoutes.keys()])
|
|
64
|
+
});
|
|
65
|
+
}
|
|
57
66
|
lane = new state_lane_1.ZLinkStateLane();
|
|
58
67
|
liveRows;
|
|
59
68
|
monotonicNowMs;
|
|
@@ -195,11 +204,16 @@ class ZLinkStoreLocationResolvers {
|
|
|
195
204
|
}
|
|
196
205
|
return (await this.resolveActorRow({ meshName: '', actorId }, signal))?.actorRef;
|
|
197
206
|
}
|
|
198
|
-
async resolveDirectActorRoute(actorId, signal, deadlineMs) {
|
|
207
|
+
async resolveDirectActorRoute(actorId, signal, deadlineMs, requestOperation) {
|
|
199
208
|
const cached = await this.lane.run(() => this.getCachedCore(this.directActorRoutes, actorId));
|
|
200
209
|
if (cached !== undefined)
|
|
201
210
|
return { kind: 'ready', route: cached };
|
|
202
|
-
|
|
211
|
+
const resolving = this.resolveUncachedDirectActorRoute(actorId, signal);
|
|
212
|
+
if (requestOperation === undefined) {
|
|
213
|
+
(0, actor_request_deadline_1.remainingActorRequestTimeout)(actorId, deadlineMs);
|
|
214
|
+
return await (0, abort_1.awaitWithAbort)(resolving, signal);
|
|
215
|
+
}
|
|
216
|
+
return await resolving;
|
|
203
217
|
}
|
|
204
218
|
async resolveUncachedDirectActorRoute(actorId, signal) {
|
|
205
219
|
const current = await this.options.stores.authorityStore.readAuthority((0, authority_key_codec_1.encodeAuthorityKey)('actor', actorId), signal);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
|
|
2
2
|
import type { RoutingId } from '../../contracts/Common';
|
|
3
|
-
import { ZLinkLocationAutoConnectType, ZLinkLocationWriteIntent, ZLinkLocationWriteStatus, type ZLinkLocationRuntimeQuery, type ZLinkLocationOwnerToken, type ZLinkOwnerLeaseRenewed, type ZLinkActorLocation, type ZLinkActorLocationFilter, type ZLinkActorLocationKey, type ZLinkLocationKey, type ZLinkLocationPage, type ZLinkLocationRuntimeStatus, type ZLinkLocationServiceSummary, type ZLinkLocationServiceSummaryFilter, type ZLinkMeshNodeDescriptor, type ZLinkLocationTopologyEntry, type ZLinkLocationTopologyFilter, type ZLinkLocationWriteResult, type ZLinkPageRequest, type ZLinkPeerLocation, type ZLinkPeerLocationFilter, type ZLinkPeerLocationKey, type ZLinkRouteLocation, type ZLinkRouteLocationFilter, type ZLinkRouteLocationKey, type ZLinkSpotLocation, type ZLinkSpotLocationFilter, type ZLinkSpotLocationKey } from './internal-location-contracts';
|
|
3
|
+
import { ZLinkLocationAutoConnectType, ZLinkLocationKind, ZLinkLocationWriteIntent, ZLinkLocationWriteStatus, type ZLinkLocationRuntimeQuery, type ZLinkLocationOwnerToken, type ZLinkOwnerLeaseRenewed, type ZLinkActorLocation, type ZLinkActorLocationFilter, type ZLinkActorLocationKey, type ZLinkLocationKey, type ZLinkLocationPage, type ZLinkLocationRuntimeStatus, type ZLinkLocationServiceSummary, type ZLinkLocationServiceSummaryFilter, type ZLinkMeshNodeDescriptor, type ZLinkLocationTopologyEntry, type ZLinkLocationTopologyFilter, type ZLinkLocationWriteResult, type ZLinkPageRequest, type ZLinkPeerLocation, type ZLinkPeerLocationFilter, type ZLinkPeerLocationKey, type ZLinkRouteLocation, type ZLinkRouteLocationFilter, type ZLinkRouteLocationKey, type ZLinkSpotLocation, type ZLinkSpotLocationFilter, type ZLinkSpotLocationKey } from './internal-location-contracts';
|
|
4
4
|
import type { ZLinkLocationObjectEntry, ZLinkLocationObjectFilter } from '../../contracts/Locations/RuntimeQuery';
|
|
5
5
|
import type { ZLinkActorLocationStore, ZLinkAuthorityStore, ZLinkClientServerLocationStore, ZLinkFanoutLocationStore, ZLinkOwnerLeaseStore, ZLinkPeerLocationStore, ZLinkRouteLocationStore, ZLinkSpotLocationStore } from './internal-store-contracts';
|
|
6
6
|
import type { ZLinkDomainLocationStore } from './domain-store-contract';
|
|
@@ -95,7 +95,7 @@ export declare class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
95
95
|
get isStarted(): boolean;
|
|
96
96
|
get nodeRid(): RoutingId | undefined;
|
|
97
97
|
get currentOwnerToken(): ZLinkLocationOwnerToken | undefined;
|
|
98
|
-
/** Location runtime §5: a
|
|
98
|
+
/** Location runtime §5: a descriptor publication ends within the renew timeout. */
|
|
99
99
|
writeDescriptor<T>(action: (signal?: AbortSignal) => Promise<T>, signal?: AbortSignal): Promise<T>;
|
|
100
100
|
closeOwnerLeaseAdmission(error: unknown): void;
|
|
101
101
|
reclaimOwnerAuthorities(signal?: AbortSignal): Promise<void>;
|
|
@@ -149,7 +149,7 @@ export declare class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
149
149
|
private scheduleHeartbeat;
|
|
150
150
|
private guardWrite;
|
|
151
151
|
private guardStatusWrite;
|
|
152
|
-
|
|
152
|
+
notifyIfStale(result: ZLinkLocationWriteResult, kind: ZLinkLocationKind, key: string): void;
|
|
153
153
|
private notifyIfStaleStatus;
|
|
154
154
|
private recordFailure;
|
|
155
155
|
private recordOwnerLeaseRenewFailure;
|