@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
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { requestTerminalError } from '../messaging/request-deadline';
|
|
2
|
+
import { ZLinkFrameworkException, ZLinkFrameworkErrorKind } from '../../contracts';
|
|
3
|
+
import {
|
|
4
|
+
OperationRegistry,
|
|
5
|
+
OperationCancelledError,
|
|
6
|
+
type OperationHandle,
|
|
7
|
+
type OperationObserver,
|
|
8
|
+
type PendingOperation
|
|
9
|
+
} from './operation-registry';
|
|
10
|
+
import { createAbortError } from '../abort';
|
|
11
|
+
import {
|
|
12
|
+
identityRequestReply,
|
|
13
|
+
rejectZLinkRequestReply,
|
|
14
|
+
type ZLinkRequestResult
|
|
15
|
+
} from '../messaging/request-result';
|
|
16
|
+
|
|
17
|
+
/** Owns the request entries and deadline visits of one runtime instance. */
|
|
18
|
+
export class RequestRuntime {
|
|
19
|
+
readonly registry = new OperationRegistry<unknown, unknown>(
|
|
20
|
+
undefined,
|
|
21
|
+
() => this.schedule(),
|
|
22
|
+
(reason) => requestTerminalError('Request', reason)
|
|
23
|
+
);
|
|
24
|
+
private timer?: NodeJS.Timeout;
|
|
25
|
+
private dueMs = Number.POSITIVE_INFINITY;
|
|
26
|
+
|
|
27
|
+
begin<T>(
|
|
28
|
+
timeoutMs: number | undefined,
|
|
29
|
+
signal?: AbortSignal,
|
|
30
|
+
existing?: PendingOperation<unknown>,
|
|
31
|
+
absoluteDeadlineMs?: number
|
|
32
|
+
): PendingOperation<T> {
|
|
33
|
+
if (existing !== undefined) return existing as PendingOperation<T>;
|
|
34
|
+
const operation = this.registry.register(
|
|
35
|
+
timeoutMs ?? 0,
|
|
36
|
+
timeoutMs === undefined ? 'sender' : 'registry',
|
|
37
|
+
undefined,
|
|
38
|
+
absoluteDeadlineMs
|
|
39
|
+
);
|
|
40
|
+
operation.setSignal(signal);
|
|
41
|
+
return operation as PendingOperation<T>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
run<T>(
|
|
45
|
+
pending: PendingOperation<unknown>,
|
|
46
|
+
start: (receiver: OperationObserver<unknown, unknown>) => void,
|
|
47
|
+
decode: (raw: unknown) => T,
|
|
48
|
+
mapFailure: (error: unknown) => unknown,
|
|
49
|
+
destination?: OperationObserver<unknown, unknown>
|
|
50
|
+
): Promise<T> {
|
|
51
|
+
if (!pending.isPending()) return pending.promise as Promise<T>;
|
|
52
|
+
pending.deferCompletion();
|
|
53
|
+
const receiver: OperationObserver<unknown, unknown> = {
|
|
54
|
+
operationCompleted: (_id, raw) => {
|
|
55
|
+
try {
|
|
56
|
+
const value = decode(raw);
|
|
57
|
+
if (destination !== undefined)
|
|
58
|
+
destination.operationCompleted(pending.id, value, undefined);
|
|
59
|
+
else pending.complete(value);
|
|
60
|
+
} catch (error) {
|
|
61
|
+
if (destination !== undefined) destination.operationFailed(pending.id, error, undefined);
|
|
62
|
+
else pending.fail(error);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
operationFailed: (_id, error) => {
|
|
66
|
+
let failure = error;
|
|
67
|
+
try {
|
|
68
|
+
failure = mapFailure(error);
|
|
69
|
+
} catch (mapped) {
|
|
70
|
+
failure = mapped;
|
|
71
|
+
}
|
|
72
|
+
if (destination !== undefined) destination.operationFailed(pending.id, failure, undefined);
|
|
73
|
+
else pending.fail(failure);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
try {
|
|
77
|
+
start(receiver);
|
|
78
|
+
} catch (error) {
|
|
79
|
+
receiver.operationFailed(pending.id, error, undefined);
|
|
80
|
+
}
|
|
81
|
+
return pending.promise as Promise<T>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
request<T>(
|
|
85
|
+
timeoutMs: number | undefined,
|
|
86
|
+
signal: AbortSignal | undefined,
|
|
87
|
+
work: (pending: PendingOperation<unknown>) => Promise<T>,
|
|
88
|
+
existing?: PendingOperation<unknown>,
|
|
89
|
+
discardLateResult?: (value: T) => void
|
|
90
|
+
): Promise<T> {
|
|
91
|
+
if (existing !== undefined) {
|
|
92
|
+
if (!existing.isPending())
|
|
93
|
+
return existing.promise.then<T>(() => {
|
|
94
|
+
throw new OperationCancelledError(existing.id, 'Request is already terminal.');
|
|
95
|
+
});
|
|
96
|
+
return work(existing);
|
|
97
|
+
}
|
|
98
|
+
const pending = this.begin(timeoutMs, signal, existing);
|
|
99
|
+
return this.run(
|
|
100
|
+
pending,
|
|
101
|
+
(receiver) => {
|
|
102
|
+
void work(pending).then(
|
|
103
|
+
(value) => receiver.operationCompleted(pending.id, value, undefined),
|
|
104
|
+
(error) => receiver.operationFailed(pending.id, error, undefined)
|
|
105
|
+
);
|
|
106
|
+
},
|
|
107
|
+
(value) => {
|
|
108
|
+
if (!pending.isPending()) discardLateResult?.(value as T);
|
|
109
|
+
return value as T;
|
|
110
|
+
},
|
|
111
|
+
identityRequestReply
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
prepare<T>(
|
|
116
|
+
timeoutMs: number | undefined,
|
|
117
|
+
signal: AbortSignal | undefined,
|
|
118
|
+
start: (
|
|
119
|
+
pending: PendingOperation<unknown>,
|
|
120
|
+
receiver: OperationObserver<unknown, unknown>
|
|
121
|
+
) => void,
|
|
122
|
+
decode: (raw: unknown) => T,
|
|
123
|
+
mapFailure: (error: unknown) => unknown,
|
|
124
|
+
existing?: PendingOperation<unknown>,
|
|
125
|
+
destination?: OperationObserver<unknown, unknown>
|
|
126
|
+
): ZLinkRequestResult<T> {
|
|
127
|
+
if (signal?.aborted === true && destination === undefined)
|
|
128
|
+
return rejectZLinkRequestReply(signal.reason ?? createAbortError());
|
|
129
|
+
const operation = this.begin(timeoutMs, signal, existing);
|
|
130
|
+
if (signal?.aborted === true && destination !== undefined)
|
|
131
|
+
destination.operationFailed(operation.id, signal.reason ?? createAbortError(), undefined);
|
|
132
|
+
const pending =
|
|
133
|
+
signal?.aborted === true
|
|
134
|
+
? operation.promise
|
|
135
|
+
: this.run(
|
|
136
|
+
operation,
|
|
137
|
+
(receiver) => start(operation, receiver),
|
|
138
|
+
decode,
|
|
139
|
+
mapFailure,
|
|
140
|
+
destination
|
|
141
|
+
);
|
|
142
|
+
return {
|
|
143
|
+
pending,
|
|
144
|
+
decode: identityRequestReply<T>,
|
|
145
|
+
mapFailure: identityRequestReply,
|
|
146
|
+
operation: operation as PendingOperation<T>
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
observe<T, R = T>(
|
|
151
|
+
timeoutMs: number,
|
|
152
|
+
submit: (entry: OperationHandle<T>, receiver: OperationObserver<T, unknown>) => void,
|
|
153
|
+
onReply: (value: T) => R,
|
|
154
|
+
onFailed: (error: unknown) => R
|
|
155
|
+
): Promise<R> {
|
|
156
|
+
return new Promise<R>((resolve, reject) => {
|
|
157
|
+
const observer: OperationObserver<T, unknown> = {
|
|
158
|
+
operationCompleted: (_id, value) => {
|
|
159
|
+
try {
|
|
160
|
+
resolve(onReply(value));
|
|
161
|
+
} catch (error) {
|
|
162
|
+
reject(error);
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
operationFailed: (_id, reason) => {
|
|
166
|
+
try {
|
|
167
|
+
resolve(onFailed(requestTerminalError('Request', reason)));
|
|
168
|
+
} catch (error) {
|
|
169
|
+
reject(error);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
const id = this.registry.registerObserved(timeoutMs, observer);
|
|
174
|
+
const entry = this.registry.handle(id) as OperationHandle<T>;
|
|
175
|
+
try {
|
|
176
|
+
submit(entry, {
|
|
177
|
+
operationCompleted: (_id, value) => {
|
|
178
|
+
if (!entry.complete(value)) observer.operationCompleted(id, value, undefined);
|
|
179
|
+
},
|
|
180
|
+
operationFailed: (_id, error) => entry.fail(error)
|
|
181
|
+
});
|
|
182
|
+
} catch (error) {
|
|
183
|
+
entry.fail(error);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
operations<T, Context = unknown>(): OperationRegistry<T, Context> {
|
|
189
|
+
return this.registry as unknown as OperationRegistry<T, Context>;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
close(
|
|
193
|
+
reason: unknown = new ZLinkFrameworkException(
|
|
194
|
+
ZLinkFrameworkErrorKind.ShuttingDown,
|
|
195
|
+
'Request runtime closed.'
|
|
196
|
+
)
|
|
197
|
+
): void {
|
|
198
|
+
this.registry.clear(reason);
|
|
199
|
+
this.schedule();
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private schedule(): void {
|
|
203
|
+
const next = this.registry.nextDeadlineMs();
|
|
204
|
+
if (next < this.dueMs) {
|
|
205
|
+
clearTimeout(this.timer);
|
|
206
|
+
this.timer = undefined;
|
|
207
|
+
this.dueMs = next;
|
|
208
|
+
if (Number.isFinite(next))
|
|
209
|
+
this.timer = setTimeout(
|
|
210
|
+
this.visit,
|
|
211
|
+
Math.min(0x7fff_ffff, Math.ceil(next - performance.now()))
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
if (this.timer !== undefined) {
|
|
215
|
+
if (this.registry.size === 0) this.timer.unref();
|
|
216
|
+
else this.timer.ref();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private readonly visit = (): void => {
|
|
221
|
+
this.timer = undefined;
|
|
222
|
+
this.dueMs = Number.POSITIVE_INFINITY;
|
|
223
|
+
const now = performance.now();
|
|
224
|
+
this.registry.expire(now, now + 1);
|
|
225
|
+
this.schedule();
|
|
226
|
+
};
|
|
227
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { inspectRuntime } from '../internal-observation';
|
|
1
2
|
import {
|
|
2
3
|
isValidPublicWeight,
|
|
3
4
|
ZLINK_MAX_PUBLIC_WEIGHT
|
|
@@ -36,6 +37,12 @@ export interface SelectedClientServer {
|
|
|
36
37
|
|
|
37
38
|
/** Dedicated discovery state; fanout publishers never reuse RouteMesh peer rows. */
|
|
38
39
|
export class ServiceDiscoveryRegistry {
|
|
40
|
+
[inspectRuntime]() {
|
|
41
|
+
return Object.freeze({
|
|
42
|
+
clientServerObservers: this.clientServerChanged.size
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
39
46
|
private readonly clientServerChanged = new Set<(error?: Error) => void>();
|
|
40
47
|
|
|
41
48
|
onClientServerChanged(listener: (error?: Error) => void): () => void {
|
|
@@ -60,7 +60,7 @@ const NO_LIVENESS_WORK: ServiceLivenessTick = Object.freeze({
|
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
export class ServiceLivenessRegistry {
|
|
63
|
-
|
|
63
|
+
readonly peers = new Map<string, ServiceLivenessConnection>();
|
|
64
64
|
private nextProbeId = 1n;
|
|
65
65
|
/**
|
|
66
66
|
* The earliest probe or timeout among admitted peers. Received traffic only
|
|
@@ -9,6 +9,7 @@ export interface ServiceMailboxDispatchOwner {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export interface ServiceMailboxRecord {
|
|
12
|
+
receivedAt?: Date;
|
|
12
13
|
readonly sourcePreparationOwner?: ServiceMailboxDispatchOwner;
|
|
13
14
|
readonly ingress?: RawServiceIngressRecord;
|
|
14
15
|
readonly owner: string;
|
|
@@ -18,7 +19,7 @@ export interface ServiceMailboxRecord {
|
|
|
18
19
|
readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
|
|
19
20
|
readonly sourceRoute?: Uint8Array;
|
|
20
21
|
readonly requestSequence?: bigint;
|
|
21
|
-
readonly reply?: (parts: readonly Uint8Array[]) => void;
|
|
22
|
+
readonly reply?: (parts: readonly (Uint8Array | string)[]) => void;
|
|
22
23
|
readonly correlation?: bigint;
|
|
23
24
|
readonly localReply?: (
|
|
24
25
|
terminalResult: number,
|
|
@@ -82,7 +83,10 @@ export class ServiceMailbox {
|
|
|
82
83
|
private nextRelocationSerial = 1n;
|
|
83
84
|
private closed = false;
|
|
84
85
|
|
|
85
|
-
constructor(
|
|
86
|
+
constructor(
|
|
87
|
+
private readonly onReady?: (domain: ServiceMailboxDomain) => void,
|
|
88
|
+
private readonly receivedAtClock: () => Date = () => new Date()
|
|
89
|
+
) {
|
|
86
90
|
// Host ApplicationJobQueue permits own ordinary-record admission. The
|
|
87
91
|
// Framework-owned payload lifetime does not retain Core HWM credit. A
|
|
88
92
|
// second mailbox cap would reject already-admitted work before the shared
|
|
@@ -105,6 +109,7 @@ export class ServiceMailbox {
|
|
|
105
109
|
const target = this.domain(record.domain);
|
|
106
110
|
const bytes = retainedBytes(record);
|
|
107
111
|
if (this.closed) return false;
|
|
112
|
+
record.receivedAt ??= this.receivedAtClock();
|
|
108
113
|
if (record.domain === 'application') {
|
|
109
114
|
if (this.relocatedOwners.has(record.owner)) return false;
|
|
110
115
|
const relocation = this.relocationSeals.get(record.owner);
|
|
@@ -31,7 +31,7 @@ export interface ServiceRelocationCaptureUnit {
|
|
|
31
31
|
seal(signal?: AbortSignal): Promise<ServiceRelocationSealedWork>;
|
|
32
32
|
captureApplicationState(signal?: AbortSignal): Promise<Uint8Array>;
|
|
33
33
|
commitSeal(followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>): Promise<void> | void;
|
|
34
|
-
abortSeal(): Promise<void> | void;
|
|
34
|
+
abortSeal(onCleanupError?: (error: unknown) => void): Promise<void> | void;
|
|
35
35
|
/** Expired-owner terminal: pending requests fail once and dispatch stays closed. */
|
|
36
36
|
discardSeal?(reason: unknown): Promise<void> | void;
|
|
37
37
|
}
|
|
@@ -55,13 +55,13 @@ export class ServiceCapturedObjectRelocation {
|
|
|
55
55
|
this.terminal = 'committed';
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
async abortSource(): Promise<void> {
|
|
58
|
+
async abortSource(onCleanupError?: (error: unknown) => void): Promise<void> {
|
|
59
59
|
if (this.terminal === 'aborted') return;
|
|
60
60
|
if (this.terminal !== 'open') {
|
|
61
61
|
throw new Error(`A ${this.terminal} relocation source capture cannot be aborted.`);
|
|
62
62
|
}
|
|
63
63
|
try {
|
|
64
|
-
await abortSourceSeals(this.units);
|
|
64
|
+
await abortSourceSeals(this.units, onCleanupError);
|
|
65
65
|
} finally {
|
|
66
66
|
this.terminal = 'aborted';
|
|
67
67
|
}
|
|
@@ -218,17 +218,32 @@ export class ServiceRelocationObjectCaptureOwner {
|
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
-
async function abortSourceSeals(
|
|
221
|
+
async function abortSourceSeals(
|
|
222
|
+
units: readonly ServiceRelocationCaptureUnit[],
|
|
223
|
+
onCleanupError?: (error: unknown) => void
|
|
224
|
+
): Promise<void> {
|
|
222
225
|
const failures: unknown[] = [];
|
|
226
|
+
const cleanupFailures: unknown[] = [];
|
|
223
227
|
for (const unit of [...units].reverse()) {
|
|
224
228
|
try {
|
|
225
|
-
await unit.abortSeal();
|
|
229
|
+
await unit.abortSeal((error) => cleanupFailures.push(error));
|
|
226
230
|
} catch (error) {
|
|
227
231
|
failures.push(error);
|
|
228
232
|
}
|
|
229
233
|
}
|
|
230
234
|
if (failures.length !== 0) {
|
|
231
|
-
throw new AggregateError(
|
|
235
|
+
throw new AggregateError(
|
|
236
|
+
[...failures, ...cleanupFailures],
|
|
237
|
+
'Relocation source rollback was incomplete.'
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
if (cleanupFailures.length !== 0) {
|
|
241
|
+
const cleanup = new AggregateError(
|
|
242
|
+
cleanupFailures,
|
|
243
|
+
'Relocation source rollback was incomplete.'
|
|
244
|
+
);
|
|
245
|
+
if (onCleanupError === undefined) throw cleanup;
|
|
246
|
+
onCleanupError(cleanup);
|
|
232
247
|
}
|
|
233
248
|
}
|
|
234
249
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { PendingOperation } from './operation-registry';
|
|
1
2
|
import type { RoutingId } from '../../contracts';
|
|
2
3
|
import type { Message } from '../../contracts/Common/Message';
|
|
3
4
|
import type { ApplicationJobPermitPort } from '../application-jobs/contracts';
|
|
@@ -252,6 +253,7 @@ export interface ZLinkMessageFollowOrigin {
|
|
|
252
253
|
}
|
|
253
254
|
|
|
254
255
|
export interface ReceiveRecord {
|
|
256
|
+
readonly receivedAt?: Date;
|
|
255
257
|
/** Resolve record prerequisites in owner order, outside an application handler turn. */
|
|
256
258
|
readonly prepareDispatch?: (
|
|
257
259
|
this: ReceiveRecord,
|
|
@@ -275,6 +277,7 @@ export interface ReceiveRecord {
|
|
|
275
277
|
readonly kindData: ReceiveKindData | null;
|
|
276
278
|
readonly terminalResult: number;
|
|
277
279
|
readonly failureErrno: number;
|
|
280
|
+
readonly failureMessage?: string;
|
|
278
281
|
readonly parts: Message[];
|
|
279
282
|
/** Returns whether the local operation can still accept a lifecycle reply. */
|
|
280
283
|
readonly isPending?: () => boolean;
|
|
@@ -298,7 +301,11 @@ export interface ReceiveRecord {
|
|
|
298
301
|
replyContentType?: string
|
|
299
302
|
): SubmitResult;
|
|
300
303
|
/** Emits a typed command-20 terminal for a lifecycle request before admission. */
|
|
301
|
-
replyFailure?(
|
|
304
|
+
replyFailure?(
|
|
305
|
+
terminalResult: number,
|
|
306
|
+
failureCode: number,
|
|
307
|
+
tail?: import('./service-stateful-wire-codec').ServiceStatefulReplyTail
|
|
308
|
+
): SubmitResult;
|
|
302
309
|
}
|
|
303
310
|
|
|
304
311
|
export interface ClaimReceiveResult {
|
|
@@ -436,6 +443,7 @@ export interface ServiceSpot {
|
|
|
436
443
|
options?: {
|
|
437
444
|
flags?: number;
|
|
438
445
|
timeoutMs?: number;
|
|
446
|
+
readonly requestOperation?: PendingOperation<unknown>;
|
|
439
447
|
applicationMetadata?: Buffer;
|
|
440
448
|
onAdmitted?: () => void;
|
|
441
449
|
}
|
|
@@ -459,11 +467,13 @@ export interface ServiceSpot {
|
|
|
459
467
|
options?: {
|
|
460
468
|
flags?: number;
|
|
461
469
|
timeoutMs?: number;
|
|
470
|
+
readonly requestOperation?: PendingOperation<unknown>;
|
|
462
471
|
applicationMetadata?: Buffer;
|
|
463
472
|
routeFence?: ServiceDirectSpotRouteFence;
|
|
464
473
|
onAdmitted?: () => void;
|
|
465
474
|
entrySpot?: boolean;
|
|
466
|
-
}
|
|
475
|
+
},
|
|
476
|
+
completion?: import('../backend/mesh-completion-table').ZLinkMeshCompletionHandler
|
|
467
477
|
): MeshOperationId;
|
|
468
478
|
publish(
|
|
469
479
|
channelName: string,
|
|
@@ -62,6 +62,11 @@ export interface ServiceSessionBinding {
|
|
|
62
62
|
readonly membershipEpoch: bigint;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
interface ServiceSessionBindingEntry {
|
|
66
|
+
readonly binding: ServiceSessionBinding;
|
|
67
|
+
lastAcceptedSequence: bigint;
|
|
68
|
+
}
|
|
69
|
+
|
|
65
70
|
export interface ServiceObjectReservation {
|
|
66
71
|
readonly id: bigint;
|
|
67
72
|
readonly objectKind: 'actor' | 'userSpot' | 'instanceSpot';
|
|
@@ -112,7 +117,7 @@ export class ServiceStatefulRegistry {
|
|
|
112
117
|
>();
|
|
113
118
|
private readonly actors = new Map<string, ServiceActorState>();
|
|
114
119
|
private readonly actorTypes = new Map<string, string>();
|
|
115
|
-
private readonly bindings = new Map<string,
|
|
120
|
+
private readonly bindings = new Map<string, ServiceSessionBindingEntry>();
|
|
116
121
|
private readonly reservations = new Map<string, ServiceObjectReservation>();
|
|
117
122
|
private readonly spotGenerations = new Map<string, bigint>();
|
|
118
123
|
private readonly actorGenerations = new Map<string, bigint>();
|
|
@@ -408,7 +413,7 @@ export class ServiceStatefulRegistry {
|
|
|
408
413
|
);
|
|
409
414
|
requireText(binding.sessionOwnerNodeRid, 'sessionOwnerNodeRid');
|
|
410
415
|
requirePositive(binding.bindingGeneration, 'bindingGeneration');
|
|
411
|
-
const current = this.bindings.get(actorKey(binding.actor));
|
|
416
|
+
const current = this.bindings.get(actorKey(binding.actor))?.binding;
|
|
412
417
|
if (
|
|
413
418
|
current !== undefined &&
|
|
414
419
|
current.sessionOwnerNodeRid === binding.sessionOwnerNodeRid &&
|
|
@@ -423,7 +428,7 @@ export class ServiceStatefulRegistry {
|
|
|
423
428
|
throw new ServiceStaleGenerationError('binding', binding.actor.actorId);
|
|
424
429
|
}
|
|
425
430
|
const accepted = Object.freeze({ ...binding });
|
|
426
|
-
this.bindings.set(actorKey(binding.actor), accepted);
|
|
431
|
+
this.bindings.set(actorKey(binding.actor), { binding: accepted, lastAcceptedSequence: 0n });
|
|
427
432
|
return accepted;
|
|
428
433
|
}
|
|
429
434
|
|
|
@@ -432,10 +437,29 @@ export class ServiceStatefulRegistry {
|
|
|
432
437
|
}
|
|
433
438
|
|
|
434
439
|
private bindingCore(actor: ServiceActorRef): ServiceSessionBinding | undefined {
|
|
435
|
-
const binding = this.bindings.get(actorKey(actor));
|
|
440
|
+
const binding = this.bindings.get(actorKey(actor))?.binding;
|
|
436
441
|
return binding?.actor.generation === actor.generation ? binding : undefined;
|
|
437
442
|
}
|
|
438
443
|
|
|
444
|
+
/** The Actor owner admits each relayed Session sequence once per binding. */
|
|
445
|
+
acceptBoundSessionSequence(
|
|
446
|
+
actor: ServiceActorRef,
|
|
447
|
+
expectedBindingGeneration: bigint,
|
|
448
|
+
sequence: bigint
|
|
449
|
+
): boolean {
|
|
450
|
+
const entry = this.bindings.get(actorKey(actor));
|
|
451
|
+
if (
|
|
452
|
+
entry === undefined ||
|
|
453
|
+
entry.binding.actor.generation !== actor.generation ||
|
|
454
|
+
entry.binding.bindingGeneration !== expectedBindingGeneration ||
|
|
455
|
+
sequence <= entry.lastAcceptedSequence
|
|
456
|
+
) {
|
|
457
|
+
return false;
|
|
458
|
+
}
|
|
459
|
+
entry.lastAcceptedSequence = sequence;
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
|
|
439
463
|
unbindSession(
|
|
440
464
|
actor: ServiceActorRef,
|
|
441
465
|
expectedBindingGeneration: bigint,
|
|
@@ -443,8 +467,9 @@ export class ServiceStatefulRegistry {
|
|
|
443
467
|
expectedSessionOwnerNodeRid?: string
|
|
444
468
|
): boolean {
|
|
445
469
|
const key = actorKey(actor);
|
|
446
|
-
const
|
|
447
|
-
if (
|
|
470
|
+
const entry = this.bindings.get(key);
|
|
471
|
+
if (entry === undefined) return false;
|
|
472
|
+
const binding = entry.binding;
|
|
448
473
|
if (
|
|
449
474
|
binding.bindingGeneration !== expectedBindingGeneration ||
|
|
450
475
|
(expectedSessionRid !== undefined &&
|
|
@@ -577,16 +602,16 @@ export class ServiceStatefulRegistry {
|
|
|
577
602
|
|
|
578
603
|
private updateBindingMembership(actor: ServiceActorState): void {
|
|
579
604
|
const key = actorKey(actor.ref);
|
|
580
|
-
const
|
|
581
|
-
if (
|
|
582
|
-
this.bindings.set(
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
...binding,
|
|
605
|
+
const entry = this.bindings.get(key);
|
|
606
|
+
if (entry === undefined) return;
|
|
607
|
+
this.bindings.set(key, {
|
|
608
|
+
binding: Object.freeze({
|
|
609
|
+
...entry.binding,
|
|
586
610
|
actor: actor.ref,
|
|
587
611
|
membershipEpoch: actor.membershipEpoch
|
|
588
|
-
})
|
|
589
|
-
|
|
612
|
+
}),
|
|
613
|
+
lastAcceptedSequence: entry.lastAcceptedSequence
|
|
614
|
+
});
|
|
590
615
|
}
|
|
591
616
|
}
|
|
592
617
|
|
|
@@ -619,20 +644,28 @@ export const RELOCATION_REPLY_RETENTION_MS = 24 * 60 * 60 * 1_000;
|
|
|
619
644
|
export class ServiceTerminalOperationRegistry<T, Context = unknown> {
|
|
620
645
|
private readonly operations: OperationRegistry<T, Context>;
|
|
621
646
|
|
|
622
|
-
constructor(
|
|
647
|
+
constructor(
|
|
648
|
+
operations = new OperationRegistry<T, Context>(),
|
|
649
|
+
private readonly release = () => operations.close('Stateful runtime closed.')
|
|
650
|
+
) {
|
|
623
651
|
this.operations = operations;
|
|
624
652
|
}
|
|
625
653
|
|
|
626
654
|
register(
|
|
627
655
|
timeoutMs: number,
|
|
628
656
|
timeoutOwner: 'registry' | 'sender' = 'registry',
|
|
629
|
-
context?: Context
|
|
657
|
+
context?: Context,
|
|
658
|
+
absoluteDeadlineMs?: number
|
|
630
659
|
): PendingOperation<T> {
|
|
631
|
-
return this.operations.register(timeoutMs, timeoutOwner, context);
|
|
660
|
+
return this.operations.register(timeoutMs, timeoutOwner, context, absoluteDeadlineMs);
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
setContext(id: bigint, context: Context): void {
|
|
664
|
+
this.operations.setContext(id, context);
|
|
632
665
|
}
|
|
633
666
|
|
|
634
667
|
reply(id: bigint, value: T, terminalContextRetentionMs = 0): boolean {
|
|
635
|
-
return this.operations.
|
|
668
|
+
return this.operations.reply(id, value, terminalContextRetentionMs);
|
|
636
669
|
}
|
|
637
670
|
|
|
638
671
|
fail(id: bigint, error: unknown): boolean {
|
|
@@ -664,7 +697,7 @@ export class ServiceTerminalOperationRegistry<T, Context = unknown> {
|
|
|
664
697
|
}
|
|
665
698
|
|
|
666
699
|
close(): void {
|
|
667
|
-
this.
|
|
700
|
+
this.release();
|
|
668
701
|
}
|
|
669
702
|
|
|
670
703
|
failAll(reason: unknown): void {
|