@zlink-systems/framework 0.30.3 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Actors/ZLinkActor.d.ts +2 -0
- package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
- package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
- package/dist/contracts/Actors/index.d.ts +1 -0
- package/dist/contracts/Actors/index.js +1 -0
- package/dist/contracts/Common/CoreTypes.d.ts +1 -0
- package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
- package/dist/contracts/Common/HandlerMessageType.js +41 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
- package/dist/contracts/Common/ZLinkMessage.js +11 -7
- package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
- package/dist/contracts/Common/encoded-payload-storage.js +4 -16
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/payload-slab.d.ts +4 -0
- package/dist/contracts/Common/payload-slab.js +30 -0
- package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
- package/dist/contracts/Handlers/Contexts.d.ts +1 -0
- package/dist/contracts/Locations/Authority.d.ts +2 -0
- package/dist/internal.d.ts +9 -0
- package/dist/internal.js +23 -1
- package/dist/nest-integration.d.ts +1 -0
- package/dist/nest-integration.js +3 -1
- package/dist/runtime/actors/actor-client.d.ts +6 -2
- package/dist/runtime/actors/actor-client.js +120 -82
- package/dist/runtime/actors/actor-context.js +16 -5
- package/dist/runtime/actors/actor-execution-context.js +2 -2
- package/dist/runtime/actors/actor-handoff.d.ts +12 -1
- package/dist/runtime/actors/actor-handoff.js +79 -34
- package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
- package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
- package/dist/runtime/actors/actor-local-native-join.js +19 -17
- package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
- package/dist/runtime/actors/actor-remote-joiner.js +4 -4
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
- package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
- package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
- package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
- package/dist/runtime/admission.d.ts +6 -4
- package/dist/runtime/admission.js +21 -10
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
- package/dist/runtime/backend/contracts/index.d.ts +26 -10
- package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
- package/dist/runtime/backend/mesh-completion-table.js +84 -20
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
- package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
- package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
- package/dist/runtime/channels/channel-clients.js +3 -3
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
- package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
- package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
- package/dist/runtime/channels/channel-dispatch-services.js +7 -6
- package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
- package/dist/runtime/channels/channel-dispatchers.js +57 -36
- package/dist/runtime/channels/channel-envelope.d.ts +2 -2
- package/dist/runtime/channels/channel-envelope.js +609 -83
- package/dist/runtime/channels/channel-multipart.d.ts +1 -0
- package/dist/runtime/channels/channel-multipart.js +10 -6
- package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
- package/dist/runtime/channels/channel-outbound-operations.js +107 -105
- package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
- package/dist/runtime/channels/channel-receive-loops.js +126 -90
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
- package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
- package/dist/runtime/channels/channel-runtime-manager.js +32 -14
- package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
- package/dist/runtime/channels/channel-socket-registry.js +9 -1
- package/dist/runtime/channels/channel-transports.d.ts +23 -16
- package/dist/runtime/channels/channel-transports.js +139 -119
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
- package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
- package/dist/runtime/channels/local-spot-route-transport.js +15 -18
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
- package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
- package/dist/runtime/channels/source-spot-router.d.ts +6 -3
- package/dist/runtime/channels/source-spot-router.js +34 -23
- package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
- package/dist/runtime/channels/spot-node-route-transport.js +23 -17
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
- package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
- package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
- package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
- package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
- package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
- package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
- package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
- package/dist/runtime/diagnostics/message-flow-record.js +228 -0
- package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
- package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
- package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
- package/dist/runtime/diagnostics/message-flow.js +42 -290
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
- package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
- package/dist/runtime/execution/index.d.ts +1 -0
- package/dist/runtime/execution/index.js +6 -3
- package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
- package/dist/runtime/execution/serial-execution-queue.js +75 -71
- package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
- package/dist/runtime/foundation/durable-service-request.js +158 -73
- package/dist/runtime/foundation/operation-registry.d.ts +33 -3
- package/dist/runtime/foundation/operation-registry.js +272 -33
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
- package/dist/runtime/foundation/request-runtime.d.ts +17 -0
- package/dist/runtime/foundation/request-runtime.js +163 -0
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +6 -0
- package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
- package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
- package/dist/runtime/foundation/service-mailbox.js +4 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
- package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
- package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
- package/dist/runtime/foundation/service-stateful-registry.js +38 -17
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
- package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
- package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
- package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-topology-registry.js +13 -3
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
- package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
- package/dist/runtime/host/actor-packet-relay.js +58 -57
- package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
- package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
- package/dist/runtime/host/application-job-queue.d.ts +7 -5
- package/dist/runtime/host/application-job-queue.js +33 -21
- package/dist/runtime/host/bound-session-relay.js +0 -1
- package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
- package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
- package/dist/runtime/host/entry-actor-runtime.js +2 -2
- package/dist/runtime/host/index.d.ts +106 -37
- package/dist/runtime/host/index.js +303 -151
- package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
- package/dist/runtime/host/location-runtime-owner.js +1 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
- package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
- package/dist/runtime/host/spot-address-transport.d.ts +3 -0
- package/dist/runtime/host/spot-address-transport.js +73 -76
- package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
- package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
- package/dist/runtime/internal-observation.d.ts +1 -0
- package/dist/runtime/internal-observation.js +5 -0
- package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
- package/dist/runtime/locations/actor-location-claims.js +15 -6
- package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
- package/dist/runtime/locations/auto-connect-loop.js +25 -19
- package/dist/runtime/locations/auto-connect-planner.js +2 -5
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
- package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.js +15 -5
- package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
- package/dist/runtime/locations/in-memory-location-store.js +1 -38
- package/dist/runtime/locations/lifecycle.d.ts +1 -1
- package/dist/runtime/locations/lifecycle.js +2 -2
- package/dist/runtime/locations/location-store-repository.d.ts +0 -1
- package/dist/runtime/locations/location-store-repository.js +163 -246
- package/dist/runtime/locations/resolvers.d.ts +8 -1
- package/dist/runtime/locations/resolvers.js +16 -2
- package/dist/runtime/locations/runtime.d.ts +3 -3
- package/dist/runtime/locations/runtime.js +12 -16
- package/dist/runtime/messaging/creation-payload-codec.js +8 -7
- package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
- package/dist/runtime/messaging/framework-json-v1.js +6 -2
- package/dist/runtime/messaging/payload-codec.js +21 -35
- package/dist/runtime/messaging/request-deadline.d.ts +4 -2
- package/dist/runtime/messaging/request-deadline.js +40 -25
- package/dist/runtime/messaging/request-result.d.ts +14 -1
- package/dist/runtime/messaging/request-result.js +74 -13
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
- package/dist/runtime/spots/index.d.ts +28 -7
- package/dist/runtime/spots/index.js +31 -6
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
- package/dist/runtime/spots/spot-activation-registry.js +13 -8
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
- package/dist/runtime/spots/spot-activation-state.js +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
- package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
- package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
- package/dist/runtime/spots/spot-actor-membership.js +3 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
- package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
- package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
- package/dist/runtime/spots/spot-entry-activation.js +7 -12
- package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
- package/dist/runtime/spots/spot-handler-registry.js +31 -15
- package/dist/runtime/spots/spot-manager-public.js +3 -2
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
- package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
- package/dist/runtime/spots/spot-outbound.d.ts +8 -2
- package/dist/runtime/spots/spot-outbound.js +5 -5
- package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
- package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
- package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
- package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
- package/dist/runtime/spots/spot-timer.d.ts +1 -1
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
- package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
- package/dist/runtime/streams/bound-session-service.js +6 -7
- package/dist/runtime/streams/index.d.ts +3 -3
- package/dist/runtime/streams/index.js +22 -2
- package/dist/runtime/streams/managed-stream.js +2 -1
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +3 -9
- package/dist/runtime/streams/session-context.d.ts +2 -2
- package/dist/runtime/streams/session-context.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
- package/dist/runtime/streams/stream-session-runtime.js +64 -33
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActor.ts +6 -0
- package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
- package/src/contracts/Actors/index.ts +1 -0
- package/src/contracts/Common/CoreTypes.ts +1 -0
- package/src/contracts/Common/HandlerMessageType.ts +50 -0
- package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
- package/src/contracts/Common/ZLinkMessage.ts +11 -7
- package/src/contracts/Common/encoded-payload-storage.ts +4 -16
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Common/payload-slab.ts +29 -0
- package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
- package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
- package/src/contracts/Handlers/Contexts.ts +1 -0
- package/src/contracts/Locations/Authority.ts +7 -1
- package/src/internal.ts +17 -0
- package/src/nest-integration.ts +1 -0
- package/src/runtime/actors/actor-client.ts +257 -163
- package/src/runtime/actors/actor-context.ts +26 -14
- package/src/runtime/actors/actor-execution-context.ts +2 -2
- package/src/runtime/actors/actor-handoff.ts +86 -51
- package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
- package/src/runtime/actors/actor-local-native-join.ts +38 -17
- package/src/runtime/actors/actor-mailbox.ts +1 -1
- package/src/runtime/actors/actor-remote-joiner.ts +8 -4
- package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
- package/src/runtime/actors/actor-routed-json-request.ts +3 -0
- package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
- package/src/runtime/actors/actor-runtime-state.ts +1 -1
- package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
- package/src/runtime/admission.ts +42 -15
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
- package/src/runtime/backend/contracts/index.ts +77 -10
- package/src/runtime/backend/mesh-completion-table.ts +106 -15
- package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
- package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
- package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
- package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
- package/src/runtime/backend/raw-binding-port.ts +13 -5
- package/src/runtime/channels/channel-clients.ts +26 -11
- package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
- package/src/runtime/channels/channel-dispatch-services.ts +7 -12
- package/src/runtime/channels/channel-dispatchers.ts +93 -39
- package/src/runtime/channels/channel-envelope.ts +680 -144
- package/src/runtime/channels/channel-multipart.ts +17 -13
- package/src/runtime/channels/channel-outbound-operations.ts +204 -178
- package/src/runtime/channels/channel-receive-loops.ts +160 -107
- package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
- package/src/runtime/channels/channel-runtime-manager.ts +74 -27
- package/src/runtime/channels/channel-socket-registry.ts +20 -5
- package/src/runtime/channels/channel-transports.ts +414 -287
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
- package/src/runtime/channels/local-spot-route-transport.ts +27 -29
- package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
- package/src/runtime/channels/source-spot-router.ts +75 -38
- package/src/runtime/channels/spot-node-route-transport.ts +67 -37
- package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
- package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
- package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
- package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
- package/src/runtime/diagnostics/message-flow-record.ts +295 -0
- package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
- package/src/runtime/diagnostics/message-flow.ts +49 -362
- package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
- package/src/runtime/execution/index.ts +6 -0
- package/src/runtime/execution/serial-execution-queue.ts +94 -96
- package/src/runtime/foundation/durable-service-request.ts +212 -89
- package/src/runtime/foundation/operation-registry.ts +287 -38
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
- package/src/runtime/foundation/request-runtime.ts +227 -0
- package/src/runtime/foundation/service-discovery-registry.ts +7 -0
- package/src/runtime/foundation/service-liveness-registry.ts +1 -1
- package/src/runtime/foundation/service-mailbox.ts +7 -2
- package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
- package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
- package/src/runtime/foundation/service-stateful-registry.ts +52 -19
- package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
- package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
- package/src/runtime/foundation/service-topology-registry.ts +21 -3
- package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
- package/src/runtime/host/actor-packet-relay.ts +160 -156
- package/src/runtime/host/actor-placement-coordinator.ts +1 -1
- package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
- package/src/runtime/host/actor-transfer-runtime.ts +3 -3
- package/src/runtime/host/application-job-queue.ts +56 -27
- package/src/runtime/host/bound-session-relay.ts +0 -1
- package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
- package/src/runtime/host/entry-actor-runtime.ts +14 -6
- package/src/runtime/host/index.ts +388 -113
- package/src/runtime/host/location-runtime-owner.ts +3 -3
- package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
- package/src/runtime/host/spot-address-transport.ts +110 -95
- package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
- package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
- package/src/runtime/internal-observation.ts +2 -0
- package/src/runtime/locations/actor-location-claims.ts +42 -16
- package/src/runtime/locations/auto-connect-loop.ts +24 -16
- package/src/runtime/locations/auto-connect-planner.ts +2 -5
- package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
- package/src/runtime/locations/in-memory-authority-store.ts +27 -7
- package/src/runtime/locations/in-memory-location-store.ts +1 -74
- package/src/runtime/locations/lifecycle.ts +4 -2
- package/src/runtime/locations/location-store-repository.ts +228 -308
- package/src/runtime/locations/resolvers.ts +20 -8
- package/src/runtime/locations/runtime.ts +16 -28
- package/src/runtime/messaging/creation-payload-codec.ts +12 -10
- package/src/runtime/messaging/framework-json-v1.ts +10 -1
- package/src/runtime/messaging/payload-codec.ts +50 -75
- package/src/runtime/messaging/request-deadline.ts +47 -39
- package/src/runtime/messaging/request-result.ts +88 -17
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/index.ts +57 -10
- package/src/runtime/spots/spot-activation-registry.ts +12 -8
- package/src/runtime/spots/spot-activation-state.ts +2 -0
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
- package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
- package/src/runtime/spots/spot-actor-membership.ts +8 -5
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
- package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
- package/src/runtime/spots/spot-entry-activation.ts +25 -35
- package/src/runtime/spots/spot-handler-registry.ts +72 -15
- package/src/runtime/spots/spot-manager-public.ts +4 -2
- package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
- package/src/runtime/spots/spot-outbound.ts +26 -10
- package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
- package/src/runtime/spots/spot-runtime-ports.ts +5 -2
- package/src/runtime/spots/spot-serial-executor.ts +1 -1
- package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
- package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
- package/src/runtime/spots/spot-timer.ts +1 -1
- package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
- package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
- package/src/runtime/streams/bound-session-service.ts +10 -7
- package/src/runtime/streams/index.ts +30 -4
- package/src/runtime/streams/managed-stream.ts +2 -1
- package/src/runtime/streams/session-calls.ts +9 -14
- package/src/runtime/streams/session-context.ts +6 -11
- package/src/runtime/streams/stream-session-runtime.ts +79 -40
- package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
- package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
- package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { awaitWithAbort } from '../abort';
|
|
2
|
+
import type { PendingOperation } from '../foundation/operation-registry';
|
|
3
|
+
import { inspectRuntime } from '../internal-observation';
|
|
1
4
|
import { listAllMeshNodeDescriptors } from './location-store-pages';
|
|
2
5
|
import type { ActorRef, RoutingId, SpotId } from '../../contracts/Common';
|
|
3
6
|
import { ZLinkFrameworkErrorKind, ZLinkFrameworkException } from '../../contracts/Errors';
|
|
4
7
|
import { zlinkDefaultLocationOptions } from '../../contracts/Locations/Options';
|
|
5
8
|
import { ZLinkSpotKind } from '../../contracts/Spots';
|
|
6
9
|
import { decodeActorAuthorityIdentity } from '../actors/actor-authority-publication';
|
|
7
|
-
import {
|
|
10
|
+
import { remainingActorRequestTimeout } from '../actors/actor-request-deadline';
|
|
8
11
|
import { emitActorOwnerLeaseObservation, isRelocationDebugEnabled } from '../diagnostics';
|
|
9
12
|
import { ZLinkStateLane } from '../execution/state-lane';
|
|
10
13
|
import {
|
|
@@ -177,6 +180,14 @@ export interface ZLinkSpotRouteInvalidationFence {
|
|
|
177
180
|
export class ZLinkStoreLocationResolvers
|
|
178
181
|
implements ZLinkPeerLocationResolver, ZLinkSpotHandleResolver, ZLinkActorSpotHandleResolver
|
|
179
182
|
{
|
|
183
|
+
[inspectRuntime]() {
|
|
184
|
+
return Object.freeze({
|
|
185
|
+
spotRouteKeys: Object.freeze([...this.spotRoutes.keys()]),
|
|
186
|
+
actorRouteKeys: Object.freeze([...this.actorRoutes.keys()]),
|
|
187
|
+
directActorRouteKeys: Object.freeze([...this.directActorRoutes.keys()])
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
180
191
|
private readonly lane = new ZLinkStateLane();
|
|
181
192
|
private readonly liveRows: ZLinkLiveRowFilter;
|
|
182
193
|
private readonly monotonicNowMs: () => number;
|
|
@@ -416,16 +427,17 @@ export class ZLinkStoreLocationResolvers
|
|
|
416
427
|
async resolveDirectActorRoute(
|
|
417
428
|
actorId: string,
|
|
418
429
|
signal?: AbortSignal,
|
|
419
|
-
deadlineMs?: number
|
|
430
|
+
deadlineMs?: number,
|
|
431
|
+
requestOperation?: PendingOperation<unknown>
|
|
420
432
|
): Promise<ZLinkDirectActorRouteResolution> {
|
|
421
433
|
const cached = await this.lane.run(() => this.getCachedCore(this.directActorRoutes, actorId));
|
|
422
434
|
if (cached !== undefined) return { kind: 'ready', route: cached };
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
actorId,
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
435
|
+
const resolving = this.resolveUncachedDirectActorRoute(actorId, signal);
|
|
436
|
+
if (requestOperation === undefined) {
|
|
437
|
+
remainingActorRequestTimeout(actorId, deadlineMs);
|
|
438
|
+
return await awaitWithAbort(resolving, signal);
|
|
439
|
+
}
|
|
440
|
+
return await resolving;
|
|
429
441
|
}
|
|
430
442
|
|
|
431
443
|
private async resolveUncachedDirectActorRoute(
|
|
@@ -220,7 +220,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
220
220
|
return this.ownerToken;
|
|
221
221
|
}
|
|
222
222
|
|
|
223
|
-
/** Location runtime §5: a
|
|
223
|
+
/** Location runtime §5: a descriptor publication ends within the renew timeout. */
|
|
224
224
|
async writeDescriptor<T>(
|
|
225
225
|
action: (signal?: AbortSignal) => Promise<T>,
|
|
226
226
|
signal?: AbortSignal
|
|
@@ -386,7 +386,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
386
386
|
async cleanupOwner(signal?: AbortSignal): Promise<void> {
|
|
387
387
|
const pending = this.heartbeatRenewal;
|
|
388
388
|
try {
|
|
389
|
-
await
|
|
389
|
+
await (pending ?? Promise.resolve());
|
|
390
390
|
} catch (error) {
|
|
391
391
|
if (!isAbortError(error)) throw error;
|
|
392
392
|
} finally {
|
|
@@ -396,25 +396,14 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
396
396
|
return;
|
|
397
397
|
}
|
|
398
398
|
try {
|
|
399
|
-
const owner = this.ownerToken ??
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
const currentLease = await this.stores.ownerLeaseStore.readOwnerLease(
|
|
408
|
-
this.ownerId,
|
|
409
|
-
cleanupSignal
|
|
410
|
-
);
|
|
411
|
-
if (currentLease.kind === 'found') {
|
|
412
|
-
await this.stores.ownerLeaseStore.releaseOwnerLease(currentLease.token, cleanupSignal);
|
|
413
|
-
}
|
|
414
|
-
},
|
|
415
|
-
undefined,
|
|
416
|
-
signal
|
|
417
|
-
);
|
|
399
|
+
const owner = this.ownerToken ?? this.lastOwnerToken;
|
|
400
|
+
signal?.throwIfAborted();
|
|
401
|
+
if (owner !== undefined) {
|
|
402
|
+
await this.stores.locationStore.removeAllByOwner(owner, signal);
|
|
403
|
+
signal?.throwIfAborted();
|
|
404
|
+
await this.stores.ownerLeaseStore.releaseOwnerLease(owner, signal);
|
|
405
|
+
signal?.throwIfAborted();
|
|
406
|
+
}
|
|
418
407
|
this.ownerToken = undefined;
|
|
419
408
|
this.lastOwnerToken = undefined;
|
|
420
409
|
this.ownerCleanupComplete = true;
|
|
@@ -516,7 +505,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
516
505
|
}
|
|
517
506
|
try {
|
|
518
507
|
if (!this.started) {
|
|
519
|
-
|
|
508
|
+
this.lastOwnerToken = claim.token;
|
|
520
509
|
return false;
|
|
521
510
|
}
|
|
522
511
|
this.lastOwnerToken = this.ownerToken;
|
|
@@ -765,7 +754,10 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
765
754
|
const normalizedEndpoint = normalizeEndpoint(peer.endpoint);
|
|
766
755
|
const stamped = { ...peer, endpoint: normalizedEndpoint, ownerId: this.ownerId };
|
|
767
756
|
const result = await this.guardWrite(() =>
|
|
768
|
-
this.
|
|
757
|
+
this.writeDescriptor(
|
|
758
|
+
(writeSignal) => this.stores.peerStore.updatePeer(stamped, intent, writeSignal),
|
|
759
|
+
signal
|
|
760
|
+
)
|
|
769
761
|
);
|
|
770
762
|
const key: ZLinkPeerLocationKey = {
|
|
771
763
|
autoConnectType: peer.autoConnectType,
|
|
@@ -1353,11 +1345,7 @@ export class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
|
|
|
1353
1345
|
}
|
|
1354
1346
|
}
|
|
1355
1347
|
|
|
1356
|
-
|
|
1357
|
-
result: ZLinkLocationWriteResult,
|
|
1358
|
-
kind: ZLinkLocationKind,
|
|
1359
|
-
key: string
|
|
1360
|
-
): void {
|
|
1348
|
+
notifyIfStale(result: ZLinkLocationWriteResult, kind: ZLinkLocationKind, key: string): void {
|
|
1361
1349
|
if (result.status !== ZLinkLocationWriteStatus.IgnoredStale) {
|
|
1362
1350
|
return;
|
|
1363
1351
|
}
|
|
@@ -5,12 +5,13 @@ import {
|
|
|
5
5
|
import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
|
|
6
6
|
import type { ZLinkMessageSerializer } from '../../contracts';
|
|
7
7
|
import {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
decodeApplicationPayloadView,
|
|
9
|
+
encodeOwnedApplicationPayload
|
|
10
10
|
} from '../foundation/service-wire-m6a-codec';
|
|
11
11
|
import {
|
|
12
12
|
decodeFrameworkPayloadMessage,
|
|
13
|
-
|
|
13
|
+
encodeFrameworkPayloadMessage,
|
|
14
|
+
frameworkPayloadContentType,
|
|
14
15
|
type ZLinkSerializerRegistryLike
|
|
15
16
|
} from './payload-codec';
|
|
16
17
|
|
|
@@ -20,15 +21,15 @@ export function encodeFrameworkCreationPayload(
|
|
|
20
21
|
payload: unknown,
|
|
21
22
|
registry?: ZLinkSerializerRegistryLike | ReadonlyMap<string, ZLinkMessageSerializer>
|
|
22
23
|
): Buffer {
|
|
23
|
-
const
|
|
24
|
+
const message = encodeFrameworkPayloadMessage(payload ?? null, registry);
|
|
24
25
|
try {
|
|
25
|
-
return
|
|
26
|
+
return encodeOwnedApplicationPayload({
|
|
26
27
|
packetName: CREATION_PACKET_NAME,
|
|
27
|
-
contentType:
|
|
28
|
-
payload:
|
|
28
|
+
contentType: frameworkPayloadContentType(message),
|
|
29
|
+
payload: message.data()
|
|
29
30
|
});
|
|
30
31
|
} finally {
|
|
31
|
-
|
|
32
|
+
message.close();
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
35
|
|
|
@@ -37,11 +38,12 @@ export function decodeFrameworkCreationPayload<T>(
|
|
|
37
38
|
registry?: ZLinkSerializerRegistryLike | ReadonlyMap<string, ZLinkMessageSerializer>
|
|
38
39
|
): T {
|
|
39
40
|
try {
|
|
40
|
-
const application =
|
|
41
|
+
const application = decodeApplicationPayloadView(payload);
|
|
41
42
|
if (application.packetName !== CREATION_PACKET_NAME) {
|
|
42
43
|
throw new RangeError('Creation payload has an unexpected packet name.');
|
|
43
44
|
}
|
|
44
|
-
|
|
45
|
+
// Creation frames use owned storage and stay alive through synchronous decode.
|
|
46
|
+
const message = RuntimeMessage.fromOwned(application.payload as Buffer);
|
|
45
47
|
try {
|
|
46
48
|
return decodeFrameworkPayloadMessage<T>(
|
|
47
49
|
message,
|
|
@@ -2,5 +2,14 @@ import * as profile from '@zlink-systems/stream-wire/internal/json';
|
|
|
2
2
|
|
|
3
3
|
export const FRAMEWORK_JSON_V1_PROFILE = profile.FRAMEWORK_JSON_V1_PROFILE;
|
|
4
4
|
export const stringifyFrameworkJsonV1 = profile.stringifyFrameworkJsonV1;
|
|
5
|
-
|
|
5
|
+
const DEFAULT_PARSE_OPTIONS = Object.freeze({});
|
|
6
|
+
|
|
7
|
+
export function parseFrameworkJsonV1(
|
|
8
|
+
text: string,
|
|
9
|
+
options: profile.FrameworkJsonParseOptions = DEFAULT_PARSE_OPTIONS,
|
|
10
|
+
schema?: Parameters<typeof profile.parseFrameworkJsonV1>[2],
|
|
11
|
+
reviver?: Parameters<typeof profile.parseFrameworkJsonV1>[3]
|
|
12
|
+
): unknown {
|
|
13
|
+
return profile.parseFrameworkJsonV1(text, options, schema, reviver);
|
|
14
|
+
}
|
|
6
15
|
export type { FrameworkJsonParseOptions } from '@zlink-systems/stream-wire/internal/json';
|
|
@@ -74,25 +74,13 @@ export function encodeFrameworkPayloadMessage(
|
|
|
74
74
|
packetName?: string,
|
|
75
75
|
contractPart: 'payload' | 'reply' = 'payload'
|
|
76
76
|
): Message {
|
|
77
|
-
return encodeFrameworkPayload(payload, registry, packetName, contractPart).message;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export function encodeFrameworkPayload(
|
|
81
|
-
payload: unknown,
|
|
82
|
-
registry?: ZLinkSerializerRegistryLike | ReadonlyMap<string, ZLinkMessageSerializer>,
|
|
83
|
-
packetName?: string,
|
|
84
|
-
contractPart: 'payload' | 'reply' = 'payload'
|
|
85
|
-
): ZLinkEncodedFrameworkPayload {
|
|
86
77
|
let declaredType: Type | undefined;
|
|
87
78
|
if (isZLinkMessage(payload)) {
|
|
88
79
|
if (payload.isEncoded()) {
|
|
89
|
-
return
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
),
|
|
94
|
-
contentType: ZlinkStreamContentType.Raw
|
|
95
|
-
};
|
|
80
|
+
return rememberContentType(
|
|
81
|
+
toRuntimeMessage(payload.toEncodedPayload()),
|
|
82
|
+
ZlinkStreamContentType.Raw
|
|
83
|
+
);
|
|
96
84
|
}
|
|
97
85
|
declaredType = readZLinkMessageDeclaredType(payload);
|
|
98
86
|
payload = payload.decode();
|
|
@@ -110,32 +98,36 @@ export function encodeFrameworkPayload(
|
|
|
110
98
|
|
|
111
99
|
const selected = selectSerializerWithContentType(payload, registry, declaredType);
|
|
112
100
|
if (selected !== undefined) {
|
|
113
|
-
return
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
),
|
|
118
|
-
contentType: selected.contentType
|
|
119
|
-
};
|
|
101
|
+
return rememberContentType(
|
|
102
|
+
toRuntimeMessage(selected.serializer.serialize(payload)),
|
|
103
|
+
selected.contentType
|
|
104
|
+
);
|
|
120
105
|
}
|
|
121
106
|
|
|
122
|
-
return
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
]
|
|
132
|
-
)
|
|
107
|
+
return rememberContentType(
|
|
108
|
+
RuntimeMessage.fromOwned(
|
|
109
|
+
Buffer.from(
|
|
110
|
+
stringifyFrameworkJsonV1(
|
|
111
|
+
payload,
|
|
112
|
+
(resolveFrameworkPacketJsonContract(payload, packetName) ??
|
|
113
|
+
(packetName === undefined ? undefined : readZLinkPacketJsonContract(packetName)))?.[
|
|
114
|
+
contractPart
|
|
115
|
+
]
|
|
133
116
|
)
|
|
134
|
-
)
|
|
135
|
-
JSON_CONTENT_TYPE
|
|
117
|
+
)
|
|
136
118
|
),
|
|
137
|
-
|
|
138
|
-
|
|
119
|
+
JSON_CONTENT_TYPE
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function encodeFrameworkPayload(
|
|
124
|
+
payload: unknown,
|
|
125
|
+
registry?: ZLinkSerializerRegistryLike | ReadonlyMap<string, ZLinkMessageSerializer>,
|
|
126
|
+
packetName?: string,
|
|
127
|
+
contractPart: 'payload' | 'reply' = 'payload'
|
|
128
|
+
): ZLinkEncodedFrameworkPayload {
|
|
129
|
+
const message = encodeFrameworkPayloadMessage(payload, registry, packetName, contractPart);
|
|
130
|
+
return { message, contentType: frameworkPayloadContentType(message) };
|
|
139
131
|
}
|
|
140
132
|
|
|
141
133
|
export function frameworkPayloadContentType(message: Message): string {
|
|
@@ -180,16 +172,19 @@ function decodeFrameworkPayload<T>(
|
|
|
180
172
|
|
|
181
173
|
if (message.isEmpty()) return undefined as T;
|
|
182
174
|
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
175
|
+
const schema = schemaForDecode(type, packetName, contractPart);
|
|
176
|
+
let value: unknown;
|
|
177
|
+
try {
|
|
178
|
+
value = parseFrameworkJsonV1(message.getString('utf8'), undefined, schema);
|
|
179
|
+
} catch (error) {
|
|
180
|
+
throw createInternalFrameworkException(
|
|
181
|
+
ZLinkFrameworkInternalErrorKind.PayloadDecodeFailed,
|
|
182
|
+
'PayloadDecodeFailed: framework payload is not valid JSON.',
|
|
183
|
+
false,
|
|
184
|
+
error
|
|
185
|
+
);
|
|
186
186
|
}
|
|
187
|
-
|
|
188
|
-
ZLinkFrameworkInternalErrorKind.PayloadDecodeFailed,
|
|
189
|
-
'PayloadDecodeFailed: framework payload is not valid JSON.',
|
|
190
|
-
false,
|
|
191
|
-
parsedPayload.error
|
|
192
|
-
);
|
|
187
|
+
return materializeZLinkMessageValue(value as T, type);
|
|
193
188
|
}
|
|
194
189
|
|
|
195
190
|
export function wrapFrameworkPayloadMessage(
|
|
@@ -222,7 +217,7 @@ function decodeFrameworkEncodedPayload<T>(
|
|
|
222
217
|
const text = payload.getString('utf8');
|
|
223
218
|
try {
|
|
224
219
|
return materializeZLinkMessageValue(
|
|
225
|
-
parseFrameworkJsonV1(text,
|
|
220
|
+
parseFrameworkJsonV1(text, undefined, schemaForDecode(type, packetName, contractPart)) as T,
|
|
226
221
|
type
|
|
227
222
|
);
|
|
228
223
|
} catch (error) {
|
|
@@ -291,11 +286,12 @@ function serializerSelectionPlanOf(
|
|
|
291
286
|
if (serializers === undefined || serializers.size === 0) {
|
|
292
287
|
return undefined;
|
|
293
288
|
}
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
289
|
+
return serializerSelectionPlans.get(serializers) ?? prepareSerializerSelectionPlan(serializers);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function prepareSerializerSelectionPlan(
|
|
293
|
+
serializers: ReadonlyMap<string, ZLinkMessageSerializer>
|
|
294
|
+
): ZLinkSerializerSelectionPlan {
|
|
299
295
|
const entries: ZLinkSerializerSelectionEntry[] = [];
|
|
300
296
|
const registeredSelections = codecSerializerSelectionsOf(serializers);
|
|
301
297
|
for (const [contentType, serializer] of serializers) {
|
|
@@ -331,7 +327,7 @@ function serializerSelectionPlanOf(
|
|
|
331
327
|
return selected;
|
|
332
328
|
}
|
|
333
329
|
};
|
|
334
|
-
serializerSelectionPlans.set(
|
|
330
|
+
serializerSelectionPlans.set(serializers, plan);
|
|
335
331
|
return plan;
|
|
336
332
|
}
|
|
337
333
|
|
|
@@ -386,27 +382,6 @@ function unsupportedContentType(contentType: string): Error {
|
|
|
386
382
|
);
|
|
387
383
|
}
|
|
388
384
|
|
|
389
|
-
function parseJsonPayload(
|
|
390
|
-
message: Message,
|
|
391
|
-
schema?: ZLinkJsonSchema
|
|
392
|
-
):
|
|
393
|
-
| {
|
|
394
|
-
readonly valid: true;
|
|
395
|
-
readonly value: unknown;
|
|
396
|
-
readonly error?: undefined;
|
|
397
|
-
}
|
|
398
|
-
| {
|
|
399
|
-
readonly valid: false;
|
|
400
|
-
readonly value?: undefined;
|
|
401
|
-
readonly error: unknown;
|
|
402
|
-
} {
|
|
403
|
-
try {
|
|
404
|
-
return { valid: true, value: parseFrameworkJsonV1(message.getString('utf8'), {}, schema) };
|
|
405
|
-
} catch (error) {
|
|
406
|
-
return { valid: false, error };
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
|
|
410
385
|
function serializerMapOf(
|
|
411
386
|
registry: ZLinkSerializerRegistryLike | ReadonlyMap<string, ZLinkMessageSerializer> | undefined
|
|
412
387
|
): ReadonlyMap<string, ZLinkMessageSerializer> | undefined {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isZLinkBackendResultError, RequestResult } from '../backend/runtime-values';
|
|
2
|
+
import { createAbortError, isAbortError } from '../abort';
|
|
3
|
+
import { OperationTimeoutError, type PendingOperation } from '../foundation/operation-registry';
|
|
2
4
|
import {
|
|
3
5
|
createInternalFrameworkException,
|
|
4
6
|
ZLinkFrameworkInternalErrorKind
|
|
@@ -10,49 +12,55 @@ export function remainingRequestTimeout(
|
|
|
10
12
|
): number | undefined {
|
|
11
13
|
if (deadlineMs === undefined) return undefined;
|
|
12
14
|
const remaining = deadlineMs - performance.now();
|
|
13
|
-
if (remaining <= 0)
|
|
14
|
-
throw createInternalFrameworkException(
|
|
15
|
-
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
16
|
-
`${operation} exceeded its deadline.`
|
|
17
|
-
);
|
|
18
|
-
}
|
|
15
|
+
if (remaining <= 0) throw requestTimeout(operation);
|
|
19
16
|
return Math.max(1, Math.ceil(remaining));
|
|
20
17
|
}
|
|
21
18
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
export function requestTerminalError(operation: string, error: unknown): unknown {
|
|
20
|
+
return error instanceof OperationTimeoutError ||
|
|
21
|
+
(isZLinkBackendResultError(error) &&
|
|
22
|
+
error.operation === 'request' &&
|
|
23
|
+
error.result === RequestResult.TimedOut)
|
|
24
|
+
? requestTimeout(operation)
|
|
25
|
+
: error;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function requestTimeout(operation: string): Error {
|
|
29
|
+
return createInternalFrameworkException(
|
|
30
|
+
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
31
|
+
`${operation} exceeded its deadline.`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Observes a stage without registering or completing the logical request. */
|
|
36
|
+
export function waitRequestReply<T>(
|
|
37
|
+
stage: Promise<T>,
|
|
25
38
|
operation: string,
|
|
26
|
-
|
|
27
|
-
signal?: AbortSignal,
|
|
39
|
+
pending: PendingOperation<unknown>,
|
|
28
40
|
endWait?: () => void,
|
|
29
41
|
discardLateReply?: (reply: T) => void
|
|
30
42
|
): Promise<T> {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
throw error;
|
|
55
|
-
} finally {
|
|
56
|
-
clearTimeout(timer);
|
|
57
|
-
}
|
|
43
|
+
return new Promise<T>((resolve, reject) => {
|
|
44
|
+
const fail = (error: unknown): void => {
|
|
45
|
+
endWait?.();
|
|
46
|
+
if (discardLateReply !== undefined) void stage.then(discardLateReply, () => undefined);
|
|
47
|
+
reject(isAbortError(error) ? createAbortError() : requestTerminalError(operation, error));
|
|
48
|
+
};
|
|
49
|
+
pending.setFailureDispatcher(fail);
|
|
50
|
+
void stage.then(
|
|
51
|
+
(value) => {
|
|
52
|
+
pending.clearFailureDispatcher(fail);
|
|
53
|
+
resolve(value);
|
|
54
|
+
},
|
|
55
|
+
(error) => {
|
|
56
|
+
const terminal = requestTerminalError(operation, error);
|
|
57
|
+
if (terminal !== error) {
|
|
58
|
+
if (!pending.fail(terminal)) void pending.promise.then(() => fail(terminal), fail);
|
|
59
|
+
} else {
|
|
60
|
+
pending.clearFailureDispatcher(fail);
|
|
61
|
+
fail(error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
});
|
|
58
66
|
}
|
|
@@ -1,7 +1,47 @@
|
|
|
1
|
+
import type { PendingOperation } from '../foundation/operation-registry';
|
|
2
|
+
import { currentFlowContext, runWithFlow } from '../diagnostics/flow-context';
|
|
1
3
|
import type { ZLinkRequest } from '../../contracts/Handlers/Attributes';
|
|
2
4
|
|
|
3
5
|
const completedAdmission = Promise.resolve();
|
|
4
6
|
const ignoreAdmissionFailure = (): void => {};
|
|
7
|
+
const REQUEST_ADMISSION = Symbol('zlink.requestAdmission');
|
|
8
|
+
// Every public request shares this getter. A getter closure per request gives
|
|
9
|
+
// each reply Promise its own hidden class, and V8 then keeps its properties in
|
|
10
|
+
// a per-request dictionary.
|
|
11
|
+
const ADMITTED_PROPERTY: PropertyDescriptor = {
|
|
12
|
+
get(this: { readonly [REQUEST_ADMISSION]: RequestAdmission }): Promise<void> {
|
|
13
|
+
return this[REQUEST_ADMISSION].observe();
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/** Transport preparation is separate from typed result delivery. */
|
|
18
|
+
export interface ZLinkRequestResult<TReply> {
|
|
19
|
+
readonly operation?: PendingOperation<TReply>;
|
|
20
|
+
readonly pending: Promise<unknown>;
|
|
21
|
+
decode(value: unknown): TReply;
|
|
22
|
+
readonly mapFailure: (error: unknown) => unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const identityRequestReply = <TReply>(value: TReply): TReply => value;
|
|
26
|
+
|
|
27
|
+
export function prepareZLinkRequestReply<TSource, TReply>(
|
|
28
|
+
pending: Promise<TSource>,
|
|
29
|
+
decode: (value: TSource) => TReply,
|
|
30
|
+
mapFailure: (error: unknown) => unknown = identityRequestReply
|
|
31
|
+
): ZLinkRequestResult<TReply> {
|
|
32
|
+
const flow = currentFlowContext();
|
|
33
|
+
if (flow === undefined) return { pending, decode, mapFailure };
|
|
34
|
+
// The completion reaction is registered after the outbound flow scope returns.
|
|
35
|
+
return {
|
|
36
|
+
pending,
|
|
37
|
+
decode: (value: TSource) => runWithFlow(flow, () => decode(value)),
|
|
38
|
+
mapFailure: (error: unknown) => runWithFlow(flow, () => mapFailure(error))
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function rejectZLinkRequestReply<TReply>(error: unknown): ZLinkRequestResult<TReply> {
|
|
43
|
+
return prepareZLinkRequestReply(Promise.reject<TReply>(error), identityRequestReply);
|
|
44
|
+
}
|
|
5
45
|
|
|
6
46
|
class RequestAdmission {
|
|
7
47
|
private admitted: Promise<void> | undefined;
|
|
@@ -33,30 +73,61 @@ class RequestAdmission {
|
|
|
33
73
|
}
|
|
34
74
|
}
|
|
35
75
|
|
|
76
|
+
function requestFailure<TReply>(result: ZLinkRequestResult<TReply>, error: unknown): unknown {
|
|
77
|
+
try {
|
|
78
|
+
return result.mapFailure(error);
|
|
79
|
+
} catch (mappedError) {
|
|
80
|
+
return mappedError;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Yield applies the same transport decoding without public admission. */
|
|
85
|
+
export function mapZLinkRequestReply<TReply>(result: ZLinkRequestResult<TReply>): Promise<TReply> {
|
|
86
|
+
if (
|
|
87
|
+
result.operation !== undefined &&
|
|
88
|
+
result.operation.mapCaller(result.decode, (error) => requestFailure(result, error))
|
|
89
|
+
)
|
|
90
|
+
return result.operation.promise;
|
|
91
|
+
return result.pending.then(
|
|
92
|
+
(value) => result.decode(value),
|
|
93
|
+
(error: unknown) => {
|
|
94
|
+
throw requestFailure(result, error);
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
36
99
|
export function createZLinkRequest<TReply>(
|
|
37
|
-
start: (onAdmitted: () => void) =>
|
|
100
|
+
start: (onAdmitted: () => void) => ZLinkRequestResult<TReply>,
|
|
38
101
|
deliverReply?: (reply: Promise<TReply>) => Promise<TReply>
|
|
39
102
|
): ZLinkRequest<TReply> {
|
|
40
103
|
const admission = new RequestAdmission();
|
|
104
|
+
const confirm = (): void => admission.confirm();
|
|
41
105
|
let pending: Promise<TReply>;
|
|
42
106
|
try {
|
|
43
|
-
|
|
107
|
+
const result = start(confirm);
|
|
108
|
+
const onValue = (value: unknown): TReply => {
|
|
109
|
+
try {
|
|
110
|
+
const reply = result.decode(value);
|
|
111
|
+
admission.confirm();
|
|
112
|
+
return reply;
|
|
113
|
+
} catch (error) {
|
|
114
|
+
admission.fail(error);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const onFailure = (error: unknown): never => {
|
|
119
|
+
const failure = requestFailure(result, error);
|
|
120
|
+
admission.fail(failure);
|
|
121
|
+
throw failure;
|
|
122
|
+
};
|
|
123
|
+
if (result.operation !== undefined && result.operation.mapCaller(onValue, onFailure)) {
|
|
124
|
+
pending = result.operation.promise;
|
|
125
|
+
} else pending = result.pending.then(onValue, onFailure);
|
|
44
126
|
} catch (error) {
|
|
127
|
+
admission.fail(error);
|
|
45
128
|
pending = Promise.reject(error);
|
|
46
129
|
}
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
admission.confirm();
|
|
51
|
-
return value;
|
|
52
|
-
},
|
|
53
|
-
(error: unknown) => {
|
|
54
|
-
admission.fail(error);
|
|
55
|
-
throw error;
|
|
56
|
-
}
|
|
57
|
-
);
|
|
58
|
-
const reply = deliverReply?.(observed) ?? observed;
|
|
59
|
-
return Object.defineProperty(reply, 'admitted', {
|
|
60
|
-
get: () => admission.observe()
|
|
61
|
-
}) as ZLinkRequest<TReply>;
|
|
130
|
+
const reply = deliverReply?.(pending) ?? pending;
|
|
131
|
+
Object.defineProperty(reply, REQUEST_ADMISSION, { value: admission });
|
|
132
|
+
return Object.defineProperty(reply, 'admitted', ADMITTED_PROPERTY) as ZLinkRequest<TReply>;
|
|
62
133
|
}
|