@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
|
@@ -6,6 +6,7 @@ const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOp
|
|
|
6
6
|
const channel_envelope_1 = require("../channels/channel-envelope");
|
|
7
7
|
const flow_context_1 = require("../diagnostics/flow-context");
|
|
8
8
|
const handler_instance_scope_1 = require("../handlers/handler-instance-scope");
|
|
9
|
+
const HandlerMessageType_1 = require("../../contracts/Common/HandlerMessageType");
|
|
9
10
|
const spot_native_flags_1 = require("./spot-native-flags");
|
|
10
11
|
const serial_work_size_1 = require("../execution/serial-work-size");
|
|
11
12
|
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
@@ -85,6 +86,7 @@ class ZLinkSpotSubscriptionDispatch {
|
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
async dispatch(message) {
|
|
89
|
+
const receivedAt = new Date();
|
|
88
90
|
if (message.parts.length === 0) {
|
|
89
91
|
this.options.dispatchErrors?.report({
|
|
90
92
|
surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.SpotSubscription,
|
|
@@ -133,8 +135,8 @@ class ZLinkSpotSubscriptionDispatch {
|
|
|
133
135
|
await this.options.serial.post(() => (0, flow_context_1.runWithFlow)(inboundFlow, async () => {
|
|
134
136
|
// Payload deserialization belongs to the Spot serial turn. Queue
|
|
135
137
|
// admission and execution authority therefore precede this work.
|
|
136
|
-
const event = (0, channel_envelope_1.decodeChannelPayload)(envelope, this.channelCodecs());
|
|
137
138
|
for (const registration of registrations) {
|
|
139
|
+
const event = (0, channel_envelope_1.decodeChannelPayload)(envelope, this.channelCodecs(), (0, HandlerMessageType_1.resolveMessageTypeForDecode)(registration.messageType));
|
|
138
140
|
const handler = await (0, handler_instance_scope_1.resolveLifecycleHandler)(spot, registration.handlerType, this.options.providerResolver);
|
|
139
141
|
try {
|
|
140
142
|
await handler.handle(spot, event, {
|
|
@@ -144,7 +146,8 @@ class ZLinkSpotSubscriptionDispatch {
|
|
|
144
146
|
topic: message.topic,
|
|
145
147
|
source: subSource,
|
|
146
148
|
metadata: (0, contracts_1.zlinkMessageMetadata)(envelope.header.metadata),
|
|
147
|
-
correlationId: envelope.header.correlationId ?? undefined
|
|
149
|
+
correlationId: envelope.header.correlationId ?? undefined,
|
|
150
|
+
receivedAt
|
|
148
151
|
});
|
|
149
152
|
}
|
|
150
153
|
catch (error) {
|
|
@@ -123,7 +123,7 @@ export declare class ZLinkManagedTimer implements ZLinkTimer {
|
|
|
123
123
|
private pendingScheduledIndex;
|
|
124
124
|
private timeout;
|
|
125
125
|
/** The dispatch in flight, from its timer callback until `completeFireCore`. */
|
|
126
|
-
|
|
126
|
+
running: Promise<void> | undefined;
|
|
127
127
|
private dispatchFailure;
|
|
128
128
|
private finalization;
|
|
129
129
|
constructor(name: string, periodMs: number, options: Required<ZLinkTimerOptions>, onTick: (tick: ZLinkTimerTick) => Promise<void>, onFailure?: ZLinkTimerFailureReporter | undefined, shouldWaitForRunningOnCancel?: () => boolean, clock?: ZLinkTimerClock, start?: ZLinkManagedTimerStart);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type ZLinkStreamFrameHeader } from './protocol';
|
|
2
|
+
import { ZLinkStateLane } from '../execution/state-lane';
|
|
1
3
|
import type { RoutingId } from '../../contracts';
|
|
2
4
|
import { type ServiceSessionRelocationRoute, type ServiceSessionRelocationSeal, type ServiceSessionRelocationSealed } from '../foundation/service-stateful-wire-codec';
|
|
3
5
|
export interface ZLinkPreparedSessionRelocationSeal {
|
|
@@ -100,13 +102,16 @@ export declare class ZLinkActorSessionBindingRegistry<TContext extends ZLinkActo
|
|
|
100
102
|
private readonly terminalRelocationCapacity;
|
|
101
103
|
private readonly sealWaitTimeoutMs;
|
|
102
104
|
private readonly errorSink?;
|
|
103
|
-
|
|
105
|
+
readonly lane: ZLinkStateLane;
|
|
104
106
|
private readonly routes;
|
|
105
|
-
|
|
107
|
+
readonly nextActorSlots: WeakMap<TContext, number>;
|
|
106
108
|
private readonly sealWaiters;
|
|
107
109
|
private readonly activeFrameWaiters;
|
|
108
110
|
private readonly relocations;
|
|
109
|
-
|
|
111
|
+
readonly absentSessionRelocationResults: Map<string, {
|
|
112
|
+
readonly result: SessionRelocationResult;
|
|
113
|
+
readonly expiry: ReturnType<typeof setTimeout>;
|
|
114
|
+
}>;
|
|
110
115
|
private readonly terminalRelocations;
|
|
111
116
|
constructor(terminalRelocationCapacity?: number, sealWaitTimeoutMs?: number, errorSink?: (() => {
|
|
112
117
|
reportRuntimeTaskException(taskName: string, error: unknown): void;
|
|
@@ -120,6 +125,9 @@ export declare class ZLinkActorSessionBindingRegistry<TContext extends ZLinkActo
|
|
|
120
125
|
find(actorId: string): Promise<TActor | undefined>;
|
|
121
126
|
private findCore;
|
|
122
127
|
route(actorId: string): Promise<ZLinkActorSessionRoute<TContext, TActor> | undefined>;
|
|
128
|
+
submitReply<T>(context: TContext, header: ZLinkStreamFrameHeader, submit: (header: ZLinkStreamFrameHeader) => Promise<T>): Promise<T>;
|
|
129
|
+
/** Registers a current binding's frame in the same turn that can retire its slot. */
|
|
130
|
+
submitCurrent<T>(actorId: string, bindingToken: string, submit: (route: ZLinkActorSessionRoute<TContext, TActor>) => Promise<T>): Promise<T | undefined>;
|
|
123
131
|
/** Selects the route only when it is the exact Session binding (§8.1 validation values). */
|
|
124
132
|
routeForSessionBinding(actorId: string, sessionRid: RoutingId, bindingGeneration?: bigint): Promise<ZLinkActorSessionRoute<TContext, TActor> | undefined>;
|
|
125
133
|
private routeCore;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkActorSessionBindingRegistry = exports.ZLinkActorSessionBindingTermination = exports.DEFAULT_TERMINAL_RELOCATION_CAPACITY = void 0;
|
|
4
|
+
const protocol_1 = require("./protocol");
|
|
4
5
|
const ZLinkFrameworkException_1 = require("../../contracts/Errors/ZLinkFrameworkException");
|
|
5
6
|
const Options_1 = require("../../contracts/Locations/Options");
|
|
6
7
|
const abort_1 = require("../abort");
|
|
@@ -139,6 +140,33 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
139
140
|
async route(actorId) {
|
|
140
141
|
return await this.lane.run(() => this.routeCore(actorId));
|
|
141
142
|
}
|
|
143
|
+
async submitReply(context, header, submit) {
|
|
144
|
+
const { submission } = await this.lane.run(() => {
|
|
145
|
+
const current = header.actorSlot === undefined ||
|
|
146
|
+
[...this.routes.values()].some((route) => route.context === context && route.actorSlot === header.actorSlot);
|
|
147
|
+
return {
|
|
148
|
+
submission: submit(current
|
|
149
|
+
? header
|
|
150
|
+
: {
|
|
151
|
+
...header,
|
|
152
|
+
actorSlot: undefined,
|
|
153
|
+
flags: header.flags & ~protocol_1.ZLinkStreamHeaderFlags.HasActorSlot
|
|
154
|
+
})
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
return await submission;
|
|
158
|
+
}
|
|
159
|
+
/** Registers a current binding's frame in the same turn that can retire its slot. */
|
|
160
|
+
async submitCurrent(actorId, bindingToken, submit) {
|
|
161
|
+
const { submission } = await this.lane.run(() => {
|
|
162
|
+
const route = this.routeCore(actorId);
|
|
163
|
+
return {
|
|
164
|
+
submission: route?.bindingToken === bindingToken ? submit(route) : undefined
|
|
165
|
+
};
|
|
166
|
+
});
|
|
167
|
+
// Transport completion must not hold the registry lane.
|
|
168
|
+
return await submission;
|
|
169
|
+
}
|
|
142
170
|
/** Selects the route only when it is the exact Session binding (§8.1 validation values). */
|
|
143
171
|
async routeForSessionBinding(actorId, sessionRid, bindingGeneration) {
|
|
144
172
|
return await this.lane.run(() => {
|
|
@@ -2,7 +2,7 @@ import type { ZLinkMessage, ZLinkMessageSerializer, ZLinkSessionActor } from '..
|
|
|
2
2
|
import type { Message } from '../../contracts/Common/Message';
|
|
3
3
|
import type { ZLinkDispatchErrorReporter } from '../channels';
|
|
4
4
|
import { type ZLinkSubmitResult } from '../messaging/submission-result';
|
|
5
|
-
import { ZLinkActorSessionBindingRegistry } from './actor-session-binding-registry';
|
|
5
|
+
import { type ZLinkActorSessionAuthorityFence, ZLinkActorSessionBindingRegistry } from './actor-session-binding-registry';
|
|
6
6
|
import { ZLinkActorSessionLifecycleCoordinator } from './actor-session-lifecycle-coordinator';
|
|
7
7
|
import { type ZLinkStreamFrameHeader } from './protocol';
|
|
8
8
|
import { DefaultZLinkSessionActor, DefaultZLinkSessionContext } from './session-context';
|
|
@@ -14,7 +14,7 @@ export interface ZLinkBoundActorRelaySenderOptions {
|
|
|
14
14
|
readonly actorBindTimeoutMs?: number;
|
|
15
15
|
readonly messageSerializers?: ReadonlyMap<string, ZLinkMessageSerializer>;
|
|
16
16
|
readonly relay?: (actor: ZLinkSessionActor, header: ZLinkStreamFrameHeader, payload: Message) => Promise<boolean>;
|
|
17
|
-
readonly notifyDisconnected?: (actor: ZLinkSessionActor, signal?: AbortSignal, binding?: ServiceStreamSessionBinding) => Promise<void>;
|
|
17
|
+
readonly notifyDisconnected?: (actor: ZLinkSessionActor, signal?: AbortSignal, binding?: ServiceStreamSessionBinding, authorityFence?: ZLinkActorSessionAuthorityFence) => Promise<void>;
|
|
18
18
|
}
|
|
19
19
|
export declare class ZLinkBoundActorRelaySender {
|
|
20
20
|
private readonly routes;
|
|
@@ -170,7 +170,7 @@ class ZLinkBoundActorRelaySender {
|
|
|
170
170
|
detached.route.context.stream instanceof managed_stream_1.ZLinkManagedStream) {
|
|
171
171
|
await detached.route.context.stream.unbindActor(actor.actorId, this.options.actorBindTimeoutMs ?? exports.DEFAULT_RELAY_ACTOR_BIND_TIMEOUT_MS, signal);
|
|
172
172
|
}
|
|
173
|
-
await this.options.notifyDisconnected?.(actor, signal, detached.binding);
|
|
173
|
+
await this.options.notifyDisconnected?.(actor, signal, detached.binding, detached.route.authorityFence);
|
|
174
174
|
}
|
|
175
175
|
async notifyPhysicalDisconnect(context) {
|
|
176
176
|
const snapshot = [...context.boundActors];
|
|
@@ -191,7 +191,7 @@ class ZLinkBoundActorRelaySender {
|
|
|
191
191
|
? context.stream.actorBinding(actor.actorId)
|
|
192
192
|
: undefined;
|
|
193
193
|
await this.routes.unbind(actor.actorId, context, actor.bindingToken, actor_session_binding_registry_1.ZLinkActorSessionBindingTermination.PhysicalDisconnect);
|
|
194
|
-
return { binding };
|
|
194
|
+
return { binding, authorityFence: route.authorityFence };
|
|
195
195
|
});
|
|
196
196
|
if (detached === false)
|
|
197
197
|
return;
|
|
@@ -199,8 +199,7 @@ class ZLinkBoundActorRelaySender {
|
|
|
199
199
|
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
200
200
|
try {
|
|
201
201
|
await Promise.race([
|
|
202
|
-
this.options.notifyDisconnected?.(actor, controller.signal, detached.binding) ??
|
|
203
|
-
Promise.resolve(),
|
|
202
|
+
this.options.notifyDisconnected?.(actor, controller.signal, detached.binding, detached.authorityFence) ?? Promise.resolve(),
|
|
204
203
|
new Promise((_, reject) => {
|
|
205
204
|
controller.signal.addEventListener('abort', () => reject(new Error(`Actor '${actor.actorId}' disconnect notification exceeded ${timeoutMs} ms.`)), { once: true });
|
|
206
205
|
})
|
|
@@ -43,11 +43,10 @@ class ZLinkBoundSessionService {
|
|
|
43
43
|
}
|
|
44
44
|
const frame = this.frameMessages.createJsonFrameMessage(protocol_1.ZLinkStreamMessageKind.Send, (0, protocol_1.resolvePacketName)(message, packetName), metadata, false, undefined, message, undefined, this.actorSlot(route));
|
|
45
45
|
try {
|
|
46
|
-
(
|
|
47
|
-
|
|
48
|
-
return
|
|
49
|
-
}
|
|
50
|
-
return await route.context.stream.submitRaw(frame);
|
|
46
|
+
return ((await this.routes.submitCurrent(actorId, route.bindingToken, (current) => {
|
|
47
|
+
(0, abort_1.throwIfAborted)(signal);
|
|
48
|
+
return current.context.stream.submitRaw(frame);
|
|
49
|
+
})) ?? { status: submission_result_1.ZLinkSubmitStatus.TargetNotFound });
|
|
51
50
|
}
|
|
52
51
|
finally {
|
|
53
52
|
frame.close();
|
|
@@ -131,10 +130,10 @@ class ZLinkBoundSessionService {
|
|
|
131
130
|
async writeLocalBoundSessionFrame(actorId, route, kind, packetName, metadata, compressPayload, requestSeq, payload, operationName) {
|
|
132
131
|
const frame = this.frameMessages.createJsonFrameMessage(kind, packetName, metadata, compressPayload, requestSeq, payload, undefined, this.actorSlot(route));
|
|
133
132
|
try {
|
|
134
|
-
|
|
133
|
+
const result = await this.routes.submitCurrent(actorId, route.bindingToken, (current) => current.context.stream.submitRaw(frame));
|
|
134
|
+
if (result === undefined) {
|
|
135
135
|
return false;
|
|
136
136
|
}
|
|
137
|
-
const result = await route.context.stream.submitRaw(frame);
|
|
138
137
|
if (result.status !== submission_result_1.ZLinkSubmitStatus.Submitted) {
|
|
139
138
|
throw new Error(`Actor '${actorId}' local bound session ${operationName} failed.`);
|
|
140
139
|
}
|
|
@@ -8,7 +8,7 @@ import { type ZLinkFrameworkRegistration } from '../configuration';
|
|
|
8
8
|
import type { ZLinkListenerRecords } from '../foundation/listener-records';
|
|
9
9
|
import { ApplicationJobQueue } from '../host/application-job-queue';
|
|
10
10
|
import type { ZLinkSubmitResult } from '../messaging/submission-result';
|
|
11
|
-
import { type ZLinkActorSessionAuthorityFence } from './actor-session-binding-registry';
|
|
11
|
+
import { ZLinkActorSessionBindingRegistry, type ZLinkActorSessionAuthorityFence } from './actor-session-binding-registry';
|
|
12
12
|
import { type ZLinkBoundActorRelaySenderOptions } from './bound-actor-relay-sender';
|
|
13
13
|
import { type ZLinkBoundSessionResponseTarget } from './bound-session-response-target';
|
|
14
14
|
import { type ZLinkBoundSessionTransport } from './bound-session-service';
|
|
@@ -100,7 +100,7 @@ export declare class ZLinkStreamSessionNodeRuntime extends ZLinkStreamSessionNod
|
|
|
100
100
|
constructor(options: ZLinkStreamSessionNodeRuntimeOptions);
|
|
101
101
|
}
|
|
102
102
|
export declare class ZLinkStreamBindingRuntime {
|
|
103
|
-
|
|
103
|
+
readonly routes: ZLinkActorSessionBindingRegistry<DefaultZLinkSessionContext, DefaultZLinkSessionActor>;
|
|
104
104
|
private readonly frameMessages;
|
|
105
105
|
private readonly compressionCodec;
|
|
106
106
|
private readonly boundSessions;
|
|
@@ -149,5 +149,5 @@ export declare class ZLinkStreamBindingRuntime {
|
|
|
149
149
|
createBinaryMessage(payload: Uint8Array): Message;
|
|
150
150
|
decompressPayload(payload: Message): Message;
|
|
151
151
|
createJsonFrameMessage(kind: ZLinkStreamMessageKind, packetName: string, metadata: ReadonlyMap<string, string>, compressed: boolean, requestSeq: bigint | undefined, payload: unknown, correlationId?: string): Message;
|
|
152
|
-
|
|
152
|
+
submitReply(context: DefaultZLinkSessionContext, requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Promise<ZLinkSubmitResult>;
|
|
153
153
|
}
|
|
@@ -348,8 +348,28 @@ class ZLinkStreamBindingRuntime {
|
|
|
348
348
|
createJsonFrameMessage(kind, packetName, metadata, compressed, requestSeq, payload, correlationId) {
|
|
349
349
|
return this.frameMessages.createJsonFrameMessage(kind, packetName, metadata, compressed, requestSeq, payload, correlationId);
|
|
350
350
|
}
|
|
351
|
-
|
|
352
|
-
|
|
351
|
+
async submitReply(context, requestHeader, kind, metadata, compressed, payload) {
|
|
352
|
+
const frame = this.frameMessages.createJsonReplyFrameMessage(requestHeader, kind, metadata, compressed, payload);
|
|
353
|
+
try {
|
|
354
|
+
return await this.routes.submitReply(context, requestHeader, async (header) => {
|
|
355
|
+
if (header === requestHeader)
|
|
356
|
+
return await context.stream.submitRaw(frame);
|
|
357
|
+
const encoded = (0, protocol_1.decodeStreamFrame)((0, protocol_1.messageToBytes)(frame));
|
|
358
|
+
const normalized = this.createBinaryMessage((0, protocol_1.encodeStreamFrame)({
|
|
359
|
+
...(0, protocol_1.decodeStreamHeader)(encoded.header),
|
|
360
|
+
actorSlot: header.actorSlot
|
|
361
|
+
}, encoded.payload));
|
|
362
|
+
try {
|
|
363
|
+
return await context.stream.submitRaw(normalized);
|
|
364
|
+
}
|
|
365
|
+
finally {
|
|
366
|
+
normalized.close();
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
finally {
|
|
371
|
+
frame.close();
|
|
372
|
+
}
|
|
353
373
|
}
|
|
354
374
|
}
|
|
355
375
|
exports.ZLinkStreamBindingRuntime = ZLinkStreamBindingRuntime;
|
|
@@ -297,7 +297,8 @@ class ZLinkManagedStream {
|
|
|
297
297
|
try {
|
|
298
298
|
if (completion.terminalResult !== 0 &&
|
|
299
299
|
!acceptedTerminalResults.has(completion.terminalResult)) {
|
|
300
|
-
throw (0, framework_errors_internal_1.wireReplyFailureException)(completion.terminalResult, completion.failureErrno,
|
|
300
|
+
throw (0, framework_errors_internal_1.wireReplyFailureException)(completion.terminalResult, completion.failureErrno, completion.failureMessage ??
|
|
301
|
+
`${operationName} failed with result ${completion.terminalResult} (errno ${completion.failureErrno}).`);
|
|
301
302
|
}
|
|
302
303
|
}
|
|
303
304
|
finally {
|
|
@@ -12,7 +12,7 @@ export interface ZLinkSessionCallContext {
|
|
|
12
12
|
};
|
|
13
13
|
readonly dispatchHeader: ZLinkStreamFrameHeader | undefined;
|
|
14
14
|
createJsonFrameMessage(kind: ZLinkStreamMessageKind, packetName: string, metadata: ReadonlyMap<string, string>, compressed: boolean, requestSeq: bigint | undefined, payload: unknown, correlationId?: string): Message;
|
|
15
|
-
|
|
15
|
+
submitReply(requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Promise<ZLinkSubmitResult>;
|
|
16
16
|
claimReply(requestHeader: ZLinkStreamFrameHeader): void;
|
|
17
17
|
/**
|
|
18
18
|
* Spec 26 §2.2: the STREAM surface records session-connected sends and the
|
|
@@ -93,15 +93,9 @@ class DefaultZLinkSessionReplyCall {
|
|
|
93
93
|
throw new Error('Reply is only available while handling a request packet.');
|
|
94
94
|
}
|
|
95
95
|
this.context.claimReply(requestHeader);
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
(0, submission_result_1.requireOneWayCompletion)(result, 'STREAM session reply');
|
|
100
|
-
this.context.traceFrameWritten?.(protocol_1.ZLinkStreamMessageKind.Response, requestHeader.name, requestHeader.correlationId);
|
|
101
|
-
}
|
|
102
|
-
finally {
|
|
103
|
-
message.close();
|
|
104
|
-
}
|
|
96
|
+
const result = await this.context.submitReply(requestHeader, protocol_1.ZLinkStreamMessageKind.Response, new Map(), this.compressionEnabled, this.message);
|
|
97
|
+
(0, submission_result_1.requireOneWayCompletion)(result, 'STREAM session reply');
|
|
98
|
+
this.context.traceFrameWritten?.(protocol_1.ZLinkStreamMessageKind.Response, requestHeader.name, requestHeader.correlationId);
|
|
105
99
|
}
|
|
106
100
|
}
|
|
107
101
|
exports.DefaultZLinkSessionReplyCall = DefaultZLinkSessionReplyCall;
|
|
@@ -17,7 +17,7 @@ interface ZLinkSessionContextRuntime {
|
|
|
17
17
|
createTextMessage(payload: string): Message;
|
|
18
18
|
createBinaryMessage(payload: Uint8Array): Message;
|
|
19
19
|
createJsonFrameMessage(kind: ZLinkStreamMessageKind, packetName: string, metadata: ReadonlyMap<string, string>, compressed: boolean, requestSeq: bigint | undefined, payload: unknown, correlationId?: string): Message;
|
|
20
|
-
|
|
20
|
+
submitReply(context: DefaultZLinkSessionContext, requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Promise<ZLinkSubmitResult>;
|
|
21
21
|
decompressPayload(payload: Message): Message;
|
|
22
22
|
bind(context: DefaultZLinkSessionContext, actor: ZLinkActor | ActorRef, signal?: AbortSignal): Promise<DefaultZLinkSessionActor>;
|
|
23
23
|
bindOrGet(context: DefaultZLinkSessionContext, actorRef: ActorRef, signal?: AbortSignal): Promise<DefaultZLinkSessionActor>;
|
|
@@ -64,7 +64,7 @@ export declare class DefaultZLinkSessionContext implements ZLinkSessionContext {
|
|
|
64
64
|
createTextMessage(payload: string): Message;
|
|
65
65
|
createBinaryMessage(payload: Uint8Array): Message;
|
|
66
66
|
createJsonFrameMessage(kind: ZLinkStreamMessageKind, packetName: string, metadata: ReadonlyMap<string, string>, compressed: boolean, requestSeq: bigint | undefined, payload: unknown, correlationId?: string): Message;
|
|
67
|
-
|
|
67
|
+
submitReply(requestHeader: ZLinkStreamFrameHeader, kind: ZLinkStreamReplyMessageKind, metadata: ReadonlyMap<string, string>, compressed: boolean, payload: unknown): Promise<ZLinkSubmitResult>;
|
|
68
68
|
enterDispatch(header: ZLinkStreamFrameHeader): void;
|
|
69
69
|
exitDispatch(): void;
|
|
70
70
|
get dispatchHeader(): ZLinkStreamFrameHeader | undefined;
|
|
@@ -105,8 +105,8 @@ class DefaultZLinkSessionContext {
|
|
|
105
105
|
createJsonFrameMessage(kind, packetName, metadata, compressed, requestSeq, payload, correlationId) {
|
|
106
106
|
return this.runtime.createJsonFrameMessage(kind, packetName, metadata, compressed, requestSeq, payload, correlationId);
|
|
107
107
|
}
|
|
108
|
-
|
|
109
|
-
return this.runtime.
|
|
108
|
+
submitReply(requestHeader, kind, metadata, compressed, payload) {
|
|
109
|
+
return this.runtime.submitReply(this, requestHeader, kind, metadata, compressed, payload);
|
|
110
110
|
}
|
|
111
111
|
enterDispatch(header) {
|
|
112
112
|
if (this.closingForActorReplacement) {
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkStreamSessionNodeRuntime = exports.ZLinkStreamSessionRuntime = void 0;
|
|
4
|
+
const submission_result_1 = require("../messaging/submission-result");
|
|
5
|
+
const api_logs_1 = require("@opentelemetry/api-logs");
|
|
6
|
+
const stream_wire_1 = require("@zlink-systems/stream-wire");
|
|
4
7
|
const Registration_1 = require("../../contracts/Configuration/Registration");
|
|
5
8
|
const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
|
|
6
9
|
const abort_1 = require("../abort");
|
|
@@ -8,6 +11,7 @@ const admission_1 = require("../admission");
|
|
|
8
11
|
const application_job_queue_scope_1 = require("../application-jobs/application-job-queue-scope");
|
|
9
12
|
const channels_1 = require("../channels");
|
|
10
13
|
const diagnostics_1 = require("../diagnostics");
|
|
14
|
+
const message_flow_record_1 = require("../diagnostics/message-flow-record");
|
|
11
15
|
const flow_context_1 = require("../diagnostics/flow-context");
|
|
12
16
|
const internal_event_contracts_1 = require("../diagnostics/internal-event-contracts");
|
|
13
17
|
const runtime_metrics_1 = require("../diagnostics/runtime-metrics");
|
|
@@ -20,7 +24,6 @@ const session_context_1 = require("./session-context");
|
|
|
20
24
|
const session_serial_executor_1 = require("./session-serial-executor");
|
|
21
25
|
const stream_message_utils_1 = require("./stream-message-utils");
|
|
22
26
|
const RegistrationNormalizers_1 = require("../../contracts/Configuration/RegistrationNormalizers");
|
|
23
|
-
const ZLINK_SEND_DONT_WAIT = 1;
|
|
24
27
|
const ZLINK_RECV_DONT_WAIT = 1;
|
|
25
28
|
const ZLINK_STREAM_RECEIVE_FRAME_BATCH_LIMIT = 64;
|
|
26
29
|
const ZLINK_STREAM_ACTOR_BINDING_REPLACEMENT_CLOSE_DELAY_MS = 100;
|
|
@@ -28,6 +31,7 @@ const ZLINK_STREAM_MONITOR_IDLE_MIN_DELAY_MS = 1;
|
|
|
28
31
|
const ZLINK_STREAM_MONITOR_IDLE_MAX_DELAY_MS = 20;
|
|
29
32
|
const ZLINK_STREAM_MONITOR_IDLE_MAX_STEPS = 7;
|
|
30
33
|
const MAX_TIMER_DELAY_MS = 2_147_483_647;
|
|
34
|
+
const STREAM_RUNTIME_LOGGER = api_logs_1.logs.getLogger(message_flow_record_1.TELEMETRY_INSTRUMENTATION_NAME);
|
|
31
35
|
const systemLivenessClock = {
|
|
32
36
|
now: () => performance.now(),
|
|
33
37
|
setTimer: (callback, delayMs) => setTimeout(callback, Math.min(delayMs, MAX_TIMER_DELAY_MS)),
|
|
@@ -324,7 +328,6 @@ class ZLinkStreamSessionRuntime {
|
|
|
324
328
|
correlationId: streamCorr,
|
|
325
329
|
sourceRid: this.context.routingId === undefined ? undefined : String(this.context.routingId)
|
|
326
330
|
});
|
|
327
|
-
(0, application_job_queue_scope_1.releaseApplicationJobPermitBeforeHandler)();
|
|
328
331
|
(0, diagnostics_1.flowIfEnabled)(this.options.dispatchErrors?.flow, ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched)?.trace({
|
|
329
332
|
outcome: ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched,
|
|
330
333
|
surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.StreamSession,
|
|
@@ -333,7 +336,12 @@ class ZLinkStreamSessionRuntime {
|
|
|
333
336
|
correlationId: streamCorr,
|
|
334
337
|
sourceRid: this.context.routingId === undefined ? undefined : String(this.context.routingId)
|
|
335
338
|
});
|
|
336
|
-
|
|
339
|
+
if (session.onDispatch !== undefined) {
|
|
340
|
+
const sessionDispatchContext = (0, session_context_1.createSessionDispatchContext)(inboundHeader, dispatchActor);
|
|
341
|
+
const frameworkPayload = (0, payload_codec_1.wrapFrameworkPayloadMessage)(dispatchPayload, this.options.messageSerializers, (0, protocol_1.streamCodecContentType)(inboundHeader.codec), inboundHeader.name);
|
|
342
|
+
(0, application_job_queue_scope_1.releaseApplicationJobPermitBeforeHandler)();
|
|
343
|
+
await session.onDispatch(sessionDispatchContext, frameworkPayload);
|
|
344
|
+
}
|
|
337
345
|
if (streamKind === ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Send) {
|
|
338
346
|
(0, diagnostics_1.flowIfEnabled)(this.options.dispatchErrors?.flow, ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed)?.trace({
|
|
339
347
|
outcome: ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed,
|
|
@@ -380,19 +388,45 @@ class ZLinkStreamSessionRuntime {
|
|
|
380
388
|
}
|
|
381
389
|
}
|
|
382
390
|
async handleControl(header, payload) {
|
|
383
|
-
|
|
384
|
-
|
|
391
|
+
const payloadBytes = (0, protocol_1.messageToBytes)(payload);
|
|
392
|
+
if (header.name === protocol_1.ZLINK_STREAM_HEARTBEAT_PING) {
|
|
393
|
+
if (payloadBytes.length !== 0) {
|
|
394
|
+
this.logIgnoredControl(header.name, payloadBytes.length);
|
|
395
|
+
}
|
|
396
|
+
await this.stream.writeControl(protocol_1.ZLINK_STREAM_HEARTBEAT_PONG);
|
|
385
397
|
return;
|
|
386
398
|
}
|
|
387
399
|
if (header.name === protocol_1.ZLINK_STREAM_HEARTBEAT_PONG) {
|
|
400
|
+
if (payloadBytes.length !== 0) {
|
|
401
|
+
this.logIgnoredControl(header.name, payloadBytes.length);
|
|
402
|
+
}
|
|
388
403
|
return;
|
|
389
404
|
}
|
|
390
|
-
if (header.name ===
|
|
391
|
-
|
|
405
|
+
if (header.name === stream_wire_1.ZlinkStreamControlPacket.ActorBound ||
|
|
406
|
+
header.name === stream_wire_1.ZlinkStreamControlPacket.ActorUnbound) {
|
|
407
|
+
await this.closeForLiveness(protocol_1.ZLinkStreamCloseReasonCode.ProtocolError, 'protocol_error', `Unexpected stream actor control frame: ${header.name}`);
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
if (header.name.startsWith('$zlink.')) {
|
|
411
|
+
this.logIgnoredControl(header.name, payloadBytes.length);
|
|
392
412
|
return;
|
|
393
413
|
}
|
|
394
414
|
await this.closeForLiveness(protocol_1.ZLinkStreamCloseReasonCode.ProtocolError, 'protocol_error', `Unknown stream control frame: ${header.name}`);
|
|
395
415
|
}
|
|
416
|
+
logIgnoredControl(name, payloadLength) {
|
|
417
|
+
STREAM_RUNTIME_LOGGER.emit({
|
|
418
|
+
eventName: 'zlink.stream.control_ignored',
|
|
419
|
+
timestamp: new Date(),
|
|
420
|
+
severityNumber: api_logs_1.SeverityNumber.DEBUG,
|
|
421
|
+
severityText: 'DEBUG',
|
|
422
|
+
body: `Ignored STREAM control name=${name} payloadBytes=${payloadLength} peerSessionRid=${this.stream.sessionId}`,
|
|
423
|
+
attributes: {
|
|
424
|
+
control_name: name,
|
|
425
|
+
payload_bytes: payloadLength,
|
|
426
|
+
peer_session_rid: this.stream.sessionId
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
}
|
|
396
430
|
scheduleLivenessCheck() {
|
|
397
431
|
if (this.disposed || this.disconnected || this.livenessTimer !== undefined) {
|
|
398
432
|
return;
|
|
@@ -435,9 +469,11 @@ class ZLinkStreamSessionRuntime {
|
|
|
435
469
|
this.closeReason = closeReason;
|
|
436
470
|
this.stopLivenessChecks();
|
|
437
471
|
await this.stream.closeForReason(reason, diagnostic);
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
472
|
+
const bindingsCleanup = this.context.cleanupBindings();
|
|
473
|
+
void Promise.all([
|
|
474
|
+
bindingsCleanup,
|
|
475
|
+
this.serial.executeFinal(async () => this.complete(undefined, true, bindingsCleanup))
|
|
476
|
+
]).catch((error) => this.options.onError?.(error));
|
|
441
477
|
}
|
|
442
478
|
stopLivenessChecks() {
|
|
443
479
|
if (this.livenessTimer !== undefined) {
|
|
@@ -455,19 +491,14 @@ class ZLinkStreamSessionRuntime {
|
|
|
455
491
|
// record (spec 26 §2.2) and confuse the peer's reply matching.
|
|
456
492
|
return;
|
|
457
493
|
}
|
|
458
|
-
const message = this.context.createJsonReplyFrameMessage(header, protocol_1.ZLinkStreamMessageKind.Error, new Map(), false, (0, bound_session_response_target_1.boundSessionErrorPayload)(error));
|
|
459
494
|
try {
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
}
|
|
495
|
+
const result = await this.context.submitReply(header, protocol_1.ZLinkStreamMessageKind.Error, new Map(), false, (0, bound_session_response_target_1.boundSessionErrorPayload)(error));
|
|
496
|
+
(0, submission_result_1.requireOneWayCompletion)(result, 'Client stream error reply');
|
|
463
497
|
this.traceFrameWritten(protocol_1.ZLinkStreamMessageKind.Error, header.name, header.correlationId);
|
|
464
498
|
}
|
|
465
499
|
catch (replyError) {
|
|
466
500
|
this.options.onError?.(replyError);
|
|
467
501
|
}
|
|
468
|
-
finally {
|
|
469
|
-
message.close();
|
|
470
|
-
}
|
|
471
502
|
}
|
|
472
503
|
/**
|
|
473
504
|
* Spec 26 §2.1/§2.2: a successful session write is the surface's terminal
|
|
@@ -492,7 +523,7 @@ class ZLinkStreamSessionRuntime {
|
|
|
492
523
|
streamSessionId: this.stream.sessionId
|
|
493
524
|
});
|
|
494
525
|
}
|
|
495
|
-
async complete(error, notifyDisconnected) {
|
|
526
|
+
async complete(error, notifyDisconnected, bindingsCleanup) {
|
|
496
527
|
try {
|
|
497
528
|
if (error !== undefined && this.closeReason !== 'server_drain') {
|
|
498
529
|
this.closeReason = 'transport_error';
|
|
@@ -510,7 +541,7 @@ class ZLinkStreamSessionRuntime {
|
|
|
510
541
|
}
|
|
511
542
|
}
|
|
512
543
|
finally {
|
|
513
|
-
await this.cleanup();
|
|
544
|
+
await this.cleanup(bindingsCleanup);
|
|
514
545
|
}
|
|
515
546
|
}
|
|
516
547
|
queueDisconnect(error) {
|
|
@@ -518,20 +549,20 @@ class ZLinkStreamSessionRuntime {
|
|
|
518
549
|
return;
|
|
519
550
|
this.disconnectQueued = true;
|
|
520
551
|
this.stopLivenessChecks();
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
552
|
+
this.stream.markTransportClosed();
|
|
553
|
+
const bindingsCleanup = this.context.cleanupBindings();
|
|
554
|
+
void Promise.all([
|
|
555
|
+
bindingsCleanup,
|
|
556
|
+
this.serial.executeFinal(async () => {
|
|
557
|
+
this.disconnectQueued = false;
|
|
558
|
+
if (this.disconnected)
|
|
559
|
+
return;
|
|
560
|
+
this.disconnected = true;
|
|
561
|
+
await this.complete(error, true, bindingsCleanup);
|
|
562
|
+
})
|
|
563
|
+
]).catch((failure) => this.options.onError?.(failure));
|
|
533
564
|
}
|
|
534
|
-
async cleanup() {
|
|
565
|
+
async cleanup(bindingsCleanup) {
|
|
535
566
|
if (this.connected && !this.metricsClosed) {
|
|
536
567
|
this.metricsClosed = true;
|
|
537
568
|
this.options.metrics?.change(runtime_metrics_1.METRIC_NAMES.StreamConnectionsActive, -1, { transport: 'tcp' });
|
|
@@ -540,7 +571,7 @@ class ZLinkStreamSessionRuntime {
|
|
|
540
571
|
close_reason: normalizeStreamCloseReason(this.closeReason)
|
|
541
572
|
});
|
|
542
573
|
}
|
|
543
|
-
await this.context.cleanupBindings();
|
|
574
|
+
await (bindingsCleanup ?? this.context.cleanupBindings());
|
|
544
575
|
this.removeSession(this.stream.sessionId, this);
|
|
545
576
|
}
|
|
546
577
|
enqueueControl(work, onRejected, onShutdownRejected) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zlink-systems/framework",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@opentelemetry/api": "^1.9.1",
|
|
21
21
|
"@opentelemetry/api-logs": "^0.221.0",
|
|
22
|
-
"@zlink-systems/stream-wire": "0.
|
|
23
|
-
"@zlink-systems/zlink": "1.
|
|
22
|
+
"@zlink-systems/stream-wire": "0.32.0",
|
|
23
|
+
"@zlink-systems/zlink": "1.23.0"
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import type { ZLinkActorContext } from './ZLinkActorContext';
|
|
2
2
|
import type { ZLinkActorJoinCompletion } from './ZLinkActorFactory';
|
|
3
|
+
import type { ZLinkSessionBindingIdentity } from './ZLinkSessionBindingIdentity';
|
|
3
4
|
|
|
4
5
|
export interface ZLinkActor {
|
|
5
6
|
readonly context: ZLinkActorContext;
|
|
6
7
|
configure?(): void;
|
|
7
8
|
onJoinCompleted?(completion: ZLinkActorJoinCompletion): Promise<void>;
|
|
9
|
+
onDuplicateBind?(
|
|
10
|
+
current: ZLinkSessionBindingIdentity,
|
|
11
|
+
incoming: ZLinkSessionBindingIdentity,
|
|
12
|
+
signal: AbortSignal
|
|
13
|
+
): Promise<string | undefined>;
|
|
8
14
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type Type<T = unknown> = new (...args: never[]) => T;
|
|
2
|
+
export type ZLinkMessageTypeResolver<T = unknown> = Type<T> | (() => Type<T>);
|
|
2
3
|
export type RoutingId = string;
|
|
3
4
|
/** Global logical Actor identity. It does not encode a Mesh or owner route. */
|
|
4
5
|
export type ActorId = string;
|