@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
|
@@ -42,7 +42,7 @@ class ZLinkSerialExecutionQueue {
|
|
|
42
42
|
if (sharedOwner === undefined)
|
|
43
43
|
this.consumer = { running: false, scheduled: false };
|
|
44
44
|
}
|
|
45
|
-
submit(operation, options
|
|
45
|
+
submit(operation, options, context) {
|
|
46
46
|
try {
|
|
47
47
|
return this.admit(operation, options, context);
|
|
48
48
|
}
|
|
@@ -50,7 +50,7 @@ class ZLinkSerialExecutionQueue {
|
|
|
50
50
|
return Promise.reject(error);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
submitDetached(operation, onError, options
|
|
53
|
+
submitDetached(operation, onError, options, context) {
|
|
54
54
|
void this.submit(operation, options, context).catch(onError);
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
@@ -58,7 +58,7 @@ class ZLinkSerialExecutionQueue {
|
|
|
58
58
|
*/
|
|
59
59
|
submitContinuation(operation, context) {
|
|
60
60
|
try {
|
|
61
|
-
return this.admit(operation,
|
|
61
|
+
return this.admit(operation, undefined, context);
|
|
62
62
|
}
|
|
63
63
|
catch (error) {
|
|
64
64
|
return Promise.reject(error);
|
|
@@ -70,14 +70,14 @@ class ZLinkSerialExecutionQueue {
|
|
|
70
70
|
*
|
|
71
71
|
* @internal
|
|
72
72
|
*/
|
|
73
|
-
admitDurablePrefix(operation, options
|
|
73
|
+
admitDurablePrefix(operation, options, context, preparation) {
|
|
74
74
|
return this.admit(operation, { ...options, lane: 'application' }, context, preparation);
|
|
75
75
|
}
|
|
76
76
|
/**
|
|
77
77
|
* Enqueues work that already owns the host-wide application job permit.
|
|
78
78
|
* It remains held through handler terminal completion.
|
|
79
79
|
*/
|
|
80
|
-
submitPreAdmitted(operation, options
|
|
80
|
+
submitPreAdmitted(operation, options, context) {
|
|
81
81
|
return this.admit(operation, options, context);
|
|
82
82
|
}
|
|
83
83
|
/** Holds lifecycle FIFO through an operation result while its application turns can run. */
|
|
@@ -88,7 +88,8 @@ class ZLinkSerialExecutionQueue {
|
|
|
88
88
|
return this.activeLifecycle?.context !== undefined;
|
|
89
89
|
}
|
|
90
90
|
visitPendingApplication(visitor) {
|
|
91
|
-
for (
|
|
91
|
+
for (let index = 0; index < this.application.records.length; index++) {
|
|
92
|
+
const record = this.application.records[index];
|
|
92
93
|
if (record.mailbox === undefined)
|
|
93
94
|
visitor(record);
|
|
94
95
|
}
|
|
@@ -125,9 +126,8 @@ class ZLinkSerialExecutionQueue {
|
|
|
125
126
|
admit(operation, options, context, preparation, operationEnvelope = false) {
|
|
126
127
|
if (this.closed)
|
|
127
128
|
throw new Error('The serial execution queue is closed.');
|
|
128
|
-
const lane = options
|
|
129
|
+
const lane = options?.lane ?? 'application';
|
|
129
130
|
const target = lane === 'application' ? this.application : this.lifecycle;
|
|
130
|
-
let settled = false;
|
|
131
131
|
let released = false;
|
|
132
132
|
let resolveResult;
|
|
133
133
|
let rejectResult;
|
|
@@ -149,18 +149,6 @@ class ZLinkSerialExecutionQueue {
|
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
};
|
|
152
|
-
const resolve = (value) => {
|
|
153
|
-
if (settled)
|
|
154
|
-
return;
|
|
155
|
-
settled = true;
|
|
156
|
-
resolveResult(value);
|
|
157
|
-
};
|
|
158
|
-
const reject = (reason) => {
|
|
159
|
-
if (settled)
|
|
160
|
-
return;
|
|
161
|
-
settled = true;
|
|
162
|
-
rejectResult(reason);
|
|
163
|
-
};
|
|
164
152
|
const record = {
|
|
165
153
|
acceptedSequence: 0n,
|
|
166
154
|
lane,
|
|
@@ -169,11 +157,11 @@ class ZLinkSerialExecutionQueue {
|
|
|
169
157
|
context,
|
|
170
158
|
preparation,
|
|
171
159
|
preparationState: preparation === undefined ? 'ready' : 'idle',
|
|
172
|
-
resolve,
|
|
173
|
-
reject,
|
|
160
|
+
resolve: resolveResult,
|
|
161
|
+
reject: rejectResult,
|
|
174
162
|
release,
|
|
175
163
|
fail: (reason) => {
|
|
176
|
-
|
|
164
|
+
rejectResult(reason);
|
|
177
165
|
release();
|
|
178
166
|
}
|
|
179
167
|
};
|
|
@@ -189,15 +177,16 @@ class ZLinkSerialExecutionQueue {
|
|
|
189
177
|
release();
|
|
190
178
|
throw error;
|
|
191
179
|
}
|
|
192
|
-
options
|
|
193
|
-
options
|
|
180
|
+
options?.onAdmitted?.();
|
|
181
|
+
options?.onWithdrawable?.(() => {
|
|
194
182
|
const index = target.records.indexOf(record);
|
|
195
183
|
if (index < 0)
|
|
196
184
|
return false;
|
|
197
|
-
target.records.
|
|
185
|
+
target.records.copyWithin(index, index + 1);
|
|
186
|
+
target.records.length -= 1;
|
|
198
187
|
record.preparationController?.abort(new Error('Durable record transferred to another handoff.'));
|
|
199
188
|
record.preparation?.cancel();
|
|
200
|
-
|
|
189
|
+
resolveResult(undefined);
|
|
201
190
|
release();
|
|
202
191
|
return true;
|
|
203
192
|
});
|
|
@@ -211,17 +200,26 @@ class ZLinkSerialExecutionQueue {
|
|
|
211
200
|
// Ready membership in the existing owner queue is the only notification state.
|
|
212
201
|
if (this.ownerMembership !== undefined)
|
|
213
202
|
return;
|
|
214
|
-
|
|
203
|
+
{
|
|
204
|
+
// Block-scoped captures keep early returns free of a V8 function context.
|
|
205
|
+
const mailbox = this;
|
|
206
|
+
mailbox.enqueueMailboxTurn(() => mailbox.consumeMailbox());
|
|
207
|
+
}
|
|
215
208
|
return;
|
|
216
209
|
}
|
|
217
210
|
const consumer = this.consumer;
|
|
218
211
|
if (consumer.scheduled || consumer.running)
|
|
219
212
|
return;
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
213
|
+
{
|
|
214
|
+
// Same block-scoped capture as the mailbox branch above.
|
|
215
|
+
const queue = this;
|
|
216
|
+
const scheduledConsumer = consumer;
|
|
217
|
+
scheduledConsumer.scheduled = true;
|
|
218
|
+
(0, state_lane_1.startOutsideStateLane)(() => queueMicrotask(() => {
|
|
219
|
+
scheduledConsumer.scheduled = false;
|
|
220
|
+
void queue.drain();
|
|
221
|
+
}));
|
|
222
|
+
}
|
|
225
223
|
}
|
|
226
224
|
/** Notifications carry no payload, admission sequence, result Promise, or host permit. */
|
|
227
225
|
enqueueMailboxTurn(operation) {
|
|
@@ -244,16 +242,15 @@ class ZLinkSerialExecutionQueue {
|
|
|
244
242
|
}
|
|
245
243
|
/** Called only by the shared scheduler's consumer, never by a producer. */
|
|
246
244
|
consumeMailbox() {
|
|
247
|
-
const
|
|
248
|
-
if (
|
|
245
|
+
const record = this.selectNext();
|
|
246
|
+
if (record === undefined) {
|
|
249
247
|
if (!this.hasPendingWork)
|
|
250
248
|
this.resolveIdleWaiters();
|
|
251
249
|
return;
|
|
252
250
|
}
|
|
253
|
-
|
|
254
|
-
if (!this.prepareSelected(selection))
|
|
251
|
+
if (!this.prepareSelected(record))
|
|
255
252
|
return;
|
|
256
|
-
this.takeSelected(
|
|
253
|
+
this.takeSelected(record);
|
|
257
254
|
if (record.preparationState === 'failed') {
|
|
258
255
|
record.preparation?.cancel();
|
|
259
256
|
record.fail(record.preparationError);
|
|
@@ -270,11 +267,11 @@ class ZLinkSerialExecutionQueue {
|
|
|
270
267
|
catch (error) {
|
|
271
268
|
terminal = Promise.reject(error);
|
|
272
269
|
}
|
|
273
|
-
void terminal.then((value) => this.finishMailbox(record,
|
|
270
|
+
void terminal.then((value) => this.finishMailbox(record, record.resolve, value), (error) => this.finishMailbox(record, record.reject, error));
|
|
274
271
|
}
|
|
275
|
-
finishMailbox(record, settle) {
|
|
272
|
+
finishMailbox(record, settle, value) {
|
|
276
273
|
this.enqueueMailboxTurn(() => {
|
|
277
|
-
settle();
|
|
274
|
+
settle(value);
|
|
278
275
|
record.release();
|
|
279
276
|
record.preparation?.cancel();
|
|
280
277
|
this.activeRecord = undefined;
|
|
@@ -292,15 +289,14 @@ class ZLinkSerialExecutionQueue {
|
|
|
292
289
|
let waitingForPreparation = false;
|
|
293
290
|
try {
|
|
294
291
|
for (;;) {
|
|
295
|
-
const
|
|
296
|
-
if (
|
|
292
|
+
const record = this.selectNext();
|
|
293
|
+
if (record === undefined)
|
|
297
294
|
break;
|
|
298
|
-
|
|
299
|
-
if (!this.prepareSelected(selection)) {
|
|
295
|
+
if (!this.prepareSelected(record)) {
|
|
300
296
|
waitingForPreparation = true;
|
|
301
297
|
break;
|
|
302
298
|
}
|
|
303
|
-
this.takeSelected(
|
|
299
|
+
this.takeSelected(record);
|
|
304
300
|
if (record.preparationState === 'failed') {
|
|
305
301
|
record.preparation?.cancel();
|
|
306
302
|
record.fail(record.preparationError);
|
|
@@ -357,45 +353,48 @@ class ZLinkSerialExecutionQueue {
|
|
|
357
353
|
}
|
|
358
354
|
}
|
|
359
355
|
}
|
|
360
|
-
prepareSelected(
|
|
361
|
-
if (
|
|
356
|
+
prepareSelected(record) {
|
|
357
|
+
if (record.lane === 'lifecycle' &&
|
|
362
358
|
this.application.records.length > 0 &&
|
|
363
359
|
!this.cancelPreparationForRearbitration(this.application.records[0]))
|
|
364
360
|
return false;
|
|
365
|
-
const record = selection.record;
|
|
366
361
|
if (record.preparationState === 'idle')
|
|
367
362
|
this.startPreparation(record);
|
|
368
363
|
return record.preparationState !== 'pending' && record.preparationState !== 'canceling';
|
|
369
364
|
}
|
|
370
365
|
selectNext() {
|
|
371
366
|
const lifecycleOwner = this.activeLifecycle?.context;
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
367
|
+
let applicationRecord;
|
|
368
|
+
if (lifecycleOwner === undefined) {
|
|
369
|
+
applicationRecord = this.application.records[0];
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
// Capture only inside the lifecycle branch; the common path allocates no context.
|
|
373
|
+
const owner = lifecycleOwner;
|
|
374
|
+
applicationRecord = this.application.records.find((record) => owner.canExecuteApplication(record));
|
|
375
|
+
}
|
|
375
376
|
const applicationReady = applicationRecord !== undefined;
|
|
376
377
|
const lifecycleReady = this.activeLifecycle === undefined && this.lifecycle.records.length > 0;
|
|
377
378
|
if (!applicationReady && !lifecycleReady)
|
|
378
379
|
return undefined;
|
|
379
380
|
if (!applicationReady) {
|
|
380
|
-
return
|
|
381
|
+
return this.lifecycle.records[0];
|
|
381
382
|
}
|
|
382
383
|
if (!lifecycleReady) {
|
|
383
|
-
return
|
|
384
|
+
return applicationRecord;
|
|
384
385
|
}
|
|
385
386
|
if (!this.lifecycleDebt && this.lifecycleStreak < this.lifecycleBurstLimit) {
|
|
386
|
-
return
|
|
387
|
+
return this.lifecycle.records[0];
|
|
387
388
|
}
|
|
388
|
-
return
|
|
389
|
+
return applicationRecord;
|
|
389
390
|
}
|
|
390
|
-
takeSelected(
|
|
391
|
-
const record =
|
|
392
|
-
|
|
393
|
-
: this.takeApplication(selection.record);
|
|
394
|
-
if (record !== selection.record) {
|
|
391
|
+
takeSelected(selected) {
|
|
392
|
+
const record = selected.lane === 'lifecycle' ? this.takeLifecycle() : this.takeApplication(selected);
|
|
393
|
+
if (record !== selected) {
|
|
395
394
|
throw new Error('The selected serial work record changed before owner claim.');
|
|
396
395
|
}
|
|
397
|
-
if (
|
|
398
|
-
|
|
396
|
+
if (selected.mailbox !== undefined)
|
|
397
|
+
selected.mailbox.ownerMembership = undefined;
|
|
399
398
|
return record;
|
|
400
399
|
}
|
|
401
400
|
takeLifecycle() {
|
|
@@ -413,7 +412,11 @@ class ZLinkSerialExecutionQueue {
|
|
|
413
412
|
if (this.application.records[0] === selected)
|
|
414
413
|
return this.application.records.shift();
|
|
415
414
|
const index = this.application.records.indexOf(selected);
|
|
416
|
-
|
|
415
|
+
// A missing record (index -1) still reaches the owner-claim fence in takeSelected.
|
|
416
|
+
const record = this.application.records.at(index);
|
|
417
|
+
this.application.records.copyWithin(index, index + 1);
|
|
418
|
+
this.application.records.length = Math.max(0, this.application.records.length - 1);
|
|
419
|
+
return record;
|
|
417
420
|
}
|
|
418
421
|
startPreparation(record) {
|
|
419
422
|
const preparation = record.preparation;
|
|
@@ -471,26 +474,27 @@ class ZLinkSerialExecutionQueue {
|
|
|
471
474
|
return performance.now() - (this.claimStartedAt ?? performance.now()) >= this.ownerTimeBudget;
|
|
472
475
|
}
|
|
473
476
|
resolveIdleWaiters() {
|
|
474
|
-
for (
|
|
475
|
-
|
|
477
|
+
for (let index = 0; index < this.idleWaiters.length; index++)
|
|
478
|
+
this.idleWaiters[index]();
|
|
479
|
+
this.idleWaiters.length = 0;
|
|
476
480
|
}
|
|
477
481
|
}
|
|
478
482
|
exports.ZLinkSerialExecutionQueue = ZLinkSerialExecutionQueue;
|
|
479
483
|
if ((0, state_lane_1.isStructuralGuardEnabled)()) {
|
|
480
484
|
const submit = ZLinkSerialExecutionQueue.prototype.submit;
|
|
481
|
-
ZLinkSerialExecutionQueue.prototype.submit = function (operation, options
|
|
482
|
-
return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(submit.call(this, operation, options, context), `serial ${options
|
|
485
|
+
ZLinkSerialExecutionQueue.prototype.submit = function (operation, options, context) {
|
|
486
|
+
return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(submit.call(this, operation, options, context), `serial ${options?.lane ?? 'application'} ${(0, state_lane_1.diagnosticWorkName)(operation)}`), 'serial completion');
|
|
483
487
|
};
|
|
484
488
|
const submitPreAdmitted = ZLinkSerialExecutionQueue.prototype.submitPreAdmitted;
|
|
485
|
-
ZLinkSerialExecutionQueue.prototype.submitPreAdmitted = function (operation, options
|
|
486
|
-
return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(submitPreAdmitted.call(this, operation, options, context), `serial ${options
|
|
489
|
+
ZLinkSerialExecutionQueue.prototype.submitPreAdmitted = function (operation, options, context) {
|
|
490
|
+
return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(submitPreAdmitted.call(this, operation, options, context), `serial ${options?.lane ?? 'application'} ${(0, state_lane_1.diagnosticWorkName)(operation)}`), 'serial completion');
|
|
487
491
|
};
|
|
488
492
|
const submitContinuation = ZLinkSerialExecutionQueue.prototype.submitContinuation;
|
|
489
493
|
ZLinkSerialExecutionQueue.prototype.submitContinuation = function (operation, context) {
|
|
490
494
|
return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(submitContinuation.call(this, operation, context), `serial continuation ${(0, state_lane_1.diagnosticWorkName)(operation)}`), 'serial completion');
|
|
491
495
|
};
|
|
492
496
|
const admitDurablePrefix = ZLinkSerialExecutionQueue.prototype.admitDurablePrefix;
|
|
493
|
-
ZLinkSerialExecutionQueue.prototype.admitDurablePrefix = function (operation, options
|
|
497
|
+
ZLinkSerialExecutionQueue.prototype.admitDurablePrefix = function (operation, options, context, preparation) {
|
|
494
498
|
return (0, state_lane_1.guardStateLaneCompletion)((0, state_lane_1.trackDiagnosticCompletion)(admitDurablePrefix.call(this, operation, options, context, preparation), `serial durable ${(0, state_lane_1.diagnosticWorkName)(operation)}`), 'serial completion');
|
|
495
499
|
};
|
|
496
500
|
const submitLifecycleOperation = ZLinkSerialExecutionQueue.prototype.submitLifecycleOperation;
|
|
@@ -1,14 +1,23 @@
|
|
|
1
|
+
import { type ConnectionAttempt } from '@zlink-systems/zlink';
|
|
2
|
+
import type { OperationHandle, PendingOperation } from './operation-registry';
|
|
1
3
|
export interface PeerRouteObservation {
|
|
2
4
|
readonly generation?: bigint;
|
|
3
5
|
readonly ready: boolean;
|
|
6
|
+
readonly selected?: boolean;
|
|
7
|
+
readonly lifecycleGeneration?: bigint;
|
|
8
|
+
readonly endpoint?: string;
|
|
9
|
+
/** Immutable socket snapshot; admission selects this target endpoint only while waiting. */
|
|
10
|
+
readonly connectionAttempts?: readonly ConnectionAttempt[];
|
|
4
11
|
}
|
|
5
12
|
export interface DurableServiceRequestPort {
|
|
6
13
|
readonly requestStopSignal?: AbortSignal;
|
|
7
14
|
observePeerRoute(target: string): PeerRouteObservation;
|
|
8
15
|
observePeerRouteChanged(listener: (target: string) => void): () => void;
|
|
9
16
|
observePeerConnectionIntentRemoved(listener: (target: string) => void): () => void;
|
|
10
|
-
requestService(target: string, parts: readonly Uint8Array[], timeoutMs: number, onAdmitted?: () => void): Promise<readonly Buffer[]>;
|
|
17
|
+
requestService(target: string, parts: readonly Uint8Array[], timeoutMs: number, onAdmitted?: () => void, existing?: Pick<PendingOperation<unknown>, 'id' | 'deadlineMs'>, receiver?: undefined, onSubmitted?: () => void): Promise<readonly Buffer[]>;
|
|
11
18
|
}
|
|
12
|
-
/**
|
|
13
|
-
export declare function
|
|
19
|
+
/** Submit §5: one admission decision for application and lifecycle requests. */
|
|
20
|
+
export declare function admitServiceRequest(port: Pick<DurableServiceRequestPort, 'requestStopSignal' | 'observePeerRoute' | 'observePeerRouteChanged' | 'observePeerConnectionIntentRemoved'>, target: string, pending: OperationHandle<unknown>, start: (remainingMs: number, finished: () => void) => void, failed: (error: unknown) => void, operationKind?: string): void;
|
|
21
|
+
/** The lifecycle adapter preserves its physical reply decoder and sender operation. */
|
|
22
|
+
export declare function requestDurableService(port: DurableServiceRequestPort, target: string, parts: readonly Uint8Array[], pending: PendingOperation<unknown>, operationKind: string, signal?: AbortSignal, onSubmitted?: (signal: AbortSignal) => Promise<void>, onAdmitted?: () => void): Promise<readonly Buffer[]>;
|
|
14
23
|
export declare function durableRequestCanReplay(error: unknown): boolean;
|
|
@@ -1,90 +1,175 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.admitServiceRequest = admitServiceRequest;
|
|
3
4
|
exports.requestDurableService = requestDurableService;
|
|
4
5
|
exports.durableRequestCanReplay = durableRequestCanReplay;
|
|
5
|
-
const
|
|
6
|
+
const zlink_1 = require("@zlink-systems/zlink");
|
|
7
|
+
const request_deadline_1 = require("../messaging/request-deadline");
|
|
6
8
|
const runtime_values_1 = require("../backend/runtime-values");
|
|
7
9
|
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
let
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
10
|
+
/** Submit §5: one admission decision for application and lifecycle requests. */
|
|
11
|
+
function admitServiceRequest(port, target, pending, start, failed, operationKind = 'Request') {
|
|
12
|
+
let baseline;
|
|
13
|
+
let submitted = false;
|
|
14
|
+
let disposed = false;
|
|
15
|
+
let unobserveRoute = () => { };
|
|
16
|
+
let unobserveIntent = () => { };
|
|
17
|
+
const cleanup = () => {
|
|
18
|
+
if (disposed)
|
|
19
|
+
return;
|
|
20
|
+
disposed = true;
|
|
21
|
+
unobserveRoute();
|
|
22
|
+
unobserveIntent();
|
|
23
|
+
port.requestStopSignal?.removeEventListener('abort', stopped);
|
|
24
|
+
if (pending.promise === undefined)
|
|
25
|
+
pending.clearFailureDispatcher(cleanup);
|
|
26
|
+
};
|
|
27
|
+
const fail = (error) => {
|
|
28
|
+
if (disposed)
|
|
29
|
+
return;
|
|
30
|
+
cleanup();
|
|
31
|
+
failed(error);
|
|
32
|
+
};
|
|
33
|
+
const lifecycleFailure = (error) => {
|
|
34
|
+
if (!submitted)
|
|
35
|
+
fail(error);
|
|
36
|
+
else {
|
|
37
|
+
cleanup();
|
|
38
|
+
pending.fail(error);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const unavailable = (message) => lifecycleFailure((0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, message, true));
|
|
42
|
+
const stopped = () => {
|
|
43
|
+
const error = port.requestStopSignal?.reason;
|
|
44
|
+
lifecycleFailure(error);
|
|
45
|
+
pending.fail(error);
|
|
46
|
+
};
|
|
47
|
+
const check = () => {
|
|
48
|
+
if (disposed || submitted)
|
|
49
|
+
return true;
|
|
50
|
+
if (port.requestStopSignal?.aborted === true) {
|
|
51
|
+
stopped();
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
if (!pending.isPending()) {
|
|
55
|
+
cleanup();
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const remaining = (0, request_deadline_1.remainingRequestTimeout)(operationKind, pending.deadlineMs);
|
|
60
|
+
const observation = port.observePeerRoute(target);
|
|
61
|
+
const attempts = baseline !== undefined || !observation.ready
|
|
62
|
+
? observation.connectionAttempts?.filter((attempt) => attempt.endpoint === observation.endpoint)
|
|
63
|
+
: undefined;
|
|
64
|
+
if (baseline !== undefined &&
|
|
65
|
+
((baseline.lifecycleGeneration !== undefined &&
|
|
66
|
+
baseline.lifecycleGeneration !== observation.lifecycleGeneration) ||
|
|
67
|
+
(baseline.endpoint !== undefined && baseline.endpoint !== observation.endpoint))) {
|
|
68
|
+
unavailable('Request target descriptor changed.');
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
// Compare the waiting request's tokens before accepting a recovered route.
|
|
72
|
+
if (baseline !== undefined &&
|
|
73
|
+
(baseline.connectionAttempts ?? []).some((previous) => attempts?.some((current) => current.intentId === previous.intentId &&
|
|
74
|
+
current.lastFailureId === previous.lastFailureId) !== true)) {
|
|
75
|
+
unavailable('Request connection intent ended, changed, or failed.');
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
if (baseline !== undefined &&
|
|
79
|
+
(baseline.connectionAttempts ?? []).length === 0 &&
|
|
80
|
+
attempts?.some((attempt) => attempt.lastFailureId !== 0n) === true) {
|
|
81
|
+
unavailable('Request first connection observation contains a failure.');
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
if (observation.ready) {
|
|
85
|
+
submitted = true;
|
|
86
|
+
unobserveRoute();
|
|
87
|
+
start(remaining, cleanup);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
if (observation.selected !== true &&
|
|
91
|
+
attempts?.some((attempt) => attempt.state === zlink_1.ConnectionAttemptState.AttemptFailed) === true) {
|
|
92
|
+
unavailable('Request connection attempt failed.');
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
if (baseline === undefined || (baseline.connectionAttempts ?? []).length === 0)
|
|
96
|
+
baseline = { ...observation, connectionAttempts: attempts };
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
fail(error);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
};
|
|
104
|
+
if (check())
|
|
105
|
+
return;
|
|
106
|
+
unobserveRoute = port.observePeerRouteChanged((rid) => {
|
|
17
107
|
if (rid === target)
|
|
18
|
-
|
|
108
|
+
check();
|
|
19
109
|
});
|
|
110
|
+
unobserveIntent = port.observePeerConnectionIntentRemoved((rid) => {
|
|
111
|
+
if (rid === target)
|
|
112
|
+
unavailable('Request target node lifecycle ended.');
|
|
113
|
+
});
|
|
114
|
+
if (pending.promise === undefined)
|
|
115
|
+
pending.setFailureDispatcher(cleanup);
|
|
116
|
+
else
|
|
117
|
+
void pending.promise.then(cleanup, (error) => {
|
|
118
|
+
if (!submitted)
|
|
119
|
+
fail(error);
|
|
120
|
+
else
|
|
121
|
+
cleanup();
|
|
122
|
+
});
|
|
123
|
+
port.requestStopSignal?.addEventListener('abort', stopped, { once: true });
|
|
124
|
+
if (port.requestStopSignal?.aborted === true)
|
|
125
|
+
stopped();
|
|
126
|
+
else
|
|
127
|
+
check();
|
|
128
|
+
}
|
|
129
|
+
/** The lifecycle adapter preserves its physical reply decoder and sender operation. */
|
|
130
|
+
function requestDurableService(port, target, parts, pending, operationKind, signal, onSubmitted, onAdmitted) {
|
|
131
|
+
const stop = new AbortController();
|
|
20
132
|
const cancellation = AbortSignal.any([
|
|
21
133
|
stop.signal,
|
|
22
134
|
...(signal === undefined ? [] : [signal]),
|
|
23
135
|
...(port.requestStopSignal === undefined ? [] : [port.requestStopSignal])
|
|
24
136
|
]);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const attemptSignal = AbortSignal.any([cancellation, attemptStop.signal]);
|
|
38
|
-
const unobserveRoute = port.observePeerRouteChanged((rid) => {
|
|
39
|
-
if (rid !== target)
|
|
40
|
-
return;
|
|
41
|
-
const route = port.observePeerRoute(target);
|
|
42
|
-
if (submittedGeneration === undefined
|
|
43
|
-
? route.ready
|
|
44
|
-
: route.generation !== undefined && route.generation !== submittedGeneration) {
|
|
45
|
-
changed();
|
|
46
|
-
attemptStop.abort();
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
try {
|
|
50
|
-
const route = port.observePeerRoute(target);
|
|
51
|
-
if (!route.ready) {
|
|
52
|
-
await (0, abort_1.awaitWithAbort)(transition, cancellation);
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
submittedGeneration = route.generation;
|
|
56
|
-
const reply = port.requestService(target, parts, remainingMs, () => {
|
|
57
|
-
wasAdmitted = true;
|
|
58
|
-
});
|
|
59
|
-
const request = onSubmitted === undefined
|
|
60
|
-
? reply
|
|
61
|
-
: Promise.race([
|
|
62
|
-
reply,
|
|
63
|
-
Promise.resolve()
|
|
64
|
-
.then(() => onSubmitted(attemptSignal))
|
|
65
|
-
.then(() => reply)
|
|
66
|
-
]);
|
|
67
|
-
const result = await (0, abort_1.awaitWithAbort)(Promise.race([request.then((parts) => ({ parts })), transition.then(() => undefined)]), cancellation);
|
|
68
|
-
if (result !== undefined)
|
|
69
|
-
return result.parts;
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
cancellation.throwIfAborted();
|
|
73
|
-
if (!durableRequestCanReplay(error))
|
|
74
|
-
throw error;
|
|
75
|
-
if ((0, runtime_values_1.isZLinkBackendResultError)(error) && error.operation === 'request')
|
|
76
|
-
wasAdmitted = true;
|
|
77
|
-
}
|
|
78
|
-
finally {
|
|
79
|
-
attemptStop.abort();
|
|
80
|
-
unobserveRoute();
|
|
81
|
-
}
|
|
137
|
+
const cancelled = () => pending.fail(cancellation.reason);
|
|
138
|
+
cancellation.addEventListener('abort', cancelled, { once: true });
|
|
139
|
+
const complete = () => {
|
|
140
|
+
cancellation.removeEventListener('abort', cancelled);
|
|
141
|
+
stop.abort();
|
|
142
|
+
};
|
|
143
|
+
void pending.promise.then(complete, complete);
|
|
144
|
+
return new Promise((resolve, reject) => {
|
|
145
|
+
if (cancellation.aborted) {
|
|
146
|
+
cancelled();
|
|
147
|
+
reject(cancellation.reason);
|
|
148
|
+
return;
|
|
82
149
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
150
|
+
admitServiceRequest(port, target, pending, (remaining, finished) => {
|
|
151
|
+
const reply = port.requestService(target, parts, remaining, onAdmitted, pending, undefined, onSubmitted === undefined
|
|
152
|
+
? undefined
|
|
153
|
+
: () => {
|
|
154
|
+
try {
|
|
155
|
+
void onSubmitted(cancellation).catch((error) => pending.fail(error));
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
pending.fail(error);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
void reply.then((value) => {
|
|
162
|
+
finished();
|
|
163
|
+
resolve(value);
|
|
164
|
+
}, (error) => {
|
|
165
|
+
finished();
|
|
166
|
+
reject(error);
|
|
167
|
+
});
|
|
168
|
+
}, (error) => {
|
|
169
|
+
pending.fail(error);
|
|
170
|
+
reject(error);
|
|
171
|
+
}, operationKind);
|
|
172
|
+
});
|
|
88
173
|
}
|
|
89
174
|
function durableRequestCanReplay(error) {
|
|
90
175
|
if (!(0, runtime_values_1.isZLinkBackendResultError)(error))
|