@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,3 +1,10 @@
|
|
|
1
|
+
import { RequestRuntime } from '../../foundation/request-runtime';
|
|
2
|
+
import {
|
|
3
|
+
prepareZLinkRequestReply,
|
|
4
|
+
identityRequestReply,
|
|
5
|
+
rejectZLinkRequestReply,
|
|
6
|
+
type ZLinkRequestResult
|
|
7
|
+
} from '../../messaging/request-result';
|
|
1
8
|
import { bindingRequestReply } from './node-backend-adapter-support';
|
|
2
9
|
import type { DealerSocket, Message, PubSocket } from '@zlink-systems/zlink';
|
|
3
10
|
import { ZLinkConfigurationException } from '../../configuration';
|
|
@@ -8,7 +15,7 @@ import {
|
|
|
8
15
|
ZLinkChannelMessageKind
|
|
9
16
|
} from '../../channels/channel-envelope';
|
|
10
17
|
import { throwIfAborted } from '../../abort';
|
|
11
|
-
import { appendParts,
|
|
18
|
+
import { appendParts, mapRequestFailure } from '../../channels/channel-multipart';
|
|
12
19
|
import type { ZLinkChannelClientTransport } from '../../channels/channel-transports';
|
|
13
20
|
import { runWithOutboundFlow } from '../../diagnostics/flow-context';
|
|
14
21
|
|
|
@@ -18,7 +25,8 @@ const EMPTY_METADATA: ReadonlyMap<string, string> = new Map();
|
|
|
18
25
|
export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTransport {
|
|
19
26
|
constructor(
|
|
20
27
|
private readonly dealer: DealerSocket,
|
|
21
|
-
private readonly publisher?: PubSocket
|
|
28
|
+
private readonly publisher?: PubSocket,
|
|
29
|
+
private readonly requests = new RequestRuntime()
|
|
22
30
|
) {}
|
|
23
31
|
|
|
24
32
|
async send(
|
|
@@ -51,7 +59,7 @@ export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTran
|
|
|
51
59
|
return { status: ZLinkSubmitStatus.Submitted };
|
|
52
60
|
}
|
|
53
61
|
|
|
54
|
-
|
|
62
|
+
request<TReply>(
|
|
55
63
|
channelName: string,
|
|
56
64
|
packetName: string | undefined,
|
|
57
65
|
request: Message,
|
|
@@ -59,42 +67,87 @@ export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTran
|
|
|
59
67
|
signal?: AbortSignal,
|
|
60
68
|
metadata: ReadonlyMap<string, string> = EMPTY_METADATA,
|
|
61
69
|
onAdmitted?: () => void
|
|
62
|
-
):
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
70
|
+
): ZLinkRequestResult<TReply> {
|
|
71
|
+
try {
|
|
72
|
+
throwIfAborted(signal);
|
|
73
|
+
} catch (error) {
|
|
74
|
+
return rejectZLinkRequestReply(error);
|
|
75
|
+
}
|
|
76
|
+
const requestOperation = this.requests.begin(timeoutMs, signal);
|
|
77
|
+
try {
|
|
78
|
+
throwIfAborted(signal);
|
|
79
|
+
const operation = runWithOutboundFlow(true, () =>
|
|
80
|
+
appendParts(
|
|
81
|
+
this.dealer.request(),
|
|
82
|
+
encodeChannelEnvelopeParts(
|
|
83
|
+
ZLinkChannelMessageKind.Request,
|
|
84
|
+
channelName,
|
|
85
|
+
packetName,
|
|
86
|
+
request,
|
|
87
|
+
timeoutMs,
|
|
88
|
+
undefined,
|
|
89
|
+
undefined,
|
|
90
|
+
undefined,
|
|
91
|
+
true,
|
|
92
|
+
metadata
|
|
93
|
+
)
|
|
78
94
|
)
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
95
|
+
);
|
|
96
|
+
if (timeoutMs !== undefined) operation.timeout(timeoutMs);
|
|
97
|
+
const decode = (raw: unknown): TReply => {
|
|
98
|
+
const reply = raw as readonly Message[];
|
|
99
|
+
try {
|
|
100
|
+
return decodeChannelReply<TReply>(reply);
|
|
101
|
+
} finally {
|
|
102
|
+
closeReply(reply);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
requestOperation.mapCaller(decode, identityRequestReply);
|
|
106
|
+
if (requestOperation.isPending()) {
|
|
107
|
+
const receiver = {
|
|
108
|
+
operationCompleted: (_id: bigint, raw: unknown) => {
|
|
109
|
+
if (requestOperation.complete(raw)) return;
|
|
110
|
+
try {
|
|
111
|
+
requestOperation.resolveCaller(decode(raw));
|
|
112
|
+
} catch (error) {
|
|
113
|
+
requestOperation.rejectCaller(error);
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
operationFailed: (_id: bigint, error: unknown) => {
|
|
117
|
+
let failure = error;
|
|
118
|
+
try {
|
|
119
|
+
failure = mapRequestFailure(error, 'channel request');
|
|
120
|
+
} catch (mapped) {
|
|
121
|
+
failure = mapped;
|
|
122
|
+
}
|
|
123
|
+
requestOperation.fail(failure);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
try {
|
|
85
127
|
bindingRequestReply(
|
|
86
128
|
operation.submit(),
|
|
87
|
-
|
|
129
|
+
receiver,
|
|
130
|
+
requestOperation,
|
|
88
131
|
undefined,
|
|
89
132
|
onAdmitted
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return
|
|
96
|
-
|
|
97
|
-
|
|
133
|
+
);
|
|
134
|
+
} catch (error) {
|
|
135
|
+
receiver.operationFailed(requestOperation.id, error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
pending: requestOperation.promise,
|
|
140
|
+
decode: identityRequestReply<TReply>,
|
|
141
|
+
mapFailure: identityRequestReply,
|
|
142
|
+
operation:
|
|
143
|
+
requestOperation as import('../../foundation/operation-registry').PendingOperation<TReply>
|
|
144
|
+
};
|
|
145
|
+
} catch (error) {
|
|
146
|
+
requestOperation.fail(error);
|
|
147
|
+
return prepareZLinkRequestReply(
|
|
148
|
+
requestOperation.promise as Promise<TReply>,
|
|
149
|
+
identityRequestReply
|
|
150
|
+
);
|
|
98
151
|
}
|
|
99
152
|
}
|
|
100
153
|
|
|
@@ -140,3 +193,7 @@ export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTran
|
|
|
140
193
|
return this.tryPublish(channelName, topic, packetName, event, metadata);
|
|
141
194
|
}
|
|
142
195
|
}
|
|
196
|
+
|
|
197
|
+
function closeReply(parts: readonly { close(): void }[]): void {
|
|
198
|
+
for (const part of parts) part.close();
|
|
199
|
+
}
|
|
@@ -9,13 +9,17 @@ import { zlink } from './node-backend-adapter-support';
|
|
|
9
9
|
export class ZLinkNodeEventLoopPoller {
|
|
10
10
|
private readonly poller = zlink.createPoller();
|
|
11
11
|
private readonly events = zlink.createPollEvents(1);
|
|
12
|
-
private readableHandler: (
|
|
12
|
+
private readableHandler: (
|
|
13
|
+
receiveReady: boolean,
|
|
14
|
+
routeReady: boolean,
|
|
15
|
+
connectReady: boolean
|
|
16
|
+
) => void;
|
|
13
17
|
private disposed = false;
|
|
14
18
|
|
|
15
19
|
constructor(
|
|
16
20
|
socket: Socket,
|
|
17
21
|
pollCompletion: boolean,
|
|
18
|
-
readableHandler: (receiveReady: boolean, routeReady: boolean) => void,
|
|
22
|
+
readableHandler: (receiveReady: boolean, routeReady: boolean, connectReady: boolean) => void,
|
|
19
23
|
pollRoute = false
|
|
20
24
|
) {
|
|
21
25
|
this.readableHandler = readableHandler;
|
|
@@ -24,7 +28,8 @@ export class ZLinkNodeEventLoopPoller {
|
|
|
24
28
|
if (pollCompletion) pollEvents.push(zlink.PollEventFlag.PollCompletion);
|
|
25
29
|
// A ROUTER selected-route change (Core ROUTER §10.1) wakes the same
|
|
26
30
|
// handler, whose owner is the socket's one route observer.
|
|
27
|
-
if (pollRoute)
|
|
31
|
+
if (pollRoute)
|
|
32
|
+
pollEvents.push(zlink.PollEventFlag.PollRoute, zlink.PollEventFlag.PollConnect);
|
|
28
33
|
this.poller.add(socket as BaseSocket, pollEvents, 0);
|
|
29
34
|
socket.setReadableHandler(this.onReady);
|
|
30
35
|
} catch (error) {
|
|
@@ -34,7 +39,9 @@ export class ZLinkNodeEventLoopPoller {
|
|
|
34
39
|
}
|
|
35
40
|
}
|
|
36
41
|
|
|
37
|
-
setReadableHandler(
|
|
42
|
+
setReadableHandler(
|
|
43
|
+
handler: (receiveReady: boolean, routeReady: boolean, connectReady: boolean) => void
|
|
44
|
+
): void {
|
|
38
45
|
this.readableHandler = handler;
|
|
39
46
|
}
|
|
40
47
|
|
|
@@ -50,6 +57,8 @@ export class ZLinkNodeEventLoopPoller {
|
|
|
50
57
|
const ready = this.poller.wait(this.events, 0);
|
|
51
58
|
const receiveReady = ready === 0 || this.events.hasEvent(0, zlink.PollEventFlag.PollIn);
|
|
52
59
|
const routeReady = ready > 0 && this.events.hasEvent(0, zlink.PollEventFlag.PollRoute);
|
|
53
|
-
|
|
60
|
+
const connectReady = ready > 0 && this.events.hasEvent(0, zlink.PollEventFlag.PollConnect);
|
|
61
|
+
if (receiveReady || routeReady || connectReady)
|
|
62
|
+
this.readableHandler(receiveReady, routeReady, connectReady);
|
|
54
63
|
};
|
|
55
64
|
}
|
|
@@ -26,7 +26,11 @@ export class ZLinkNodeMeshBackendAdapter implements ZLinkMeshBackendAdapter {
|
|
|
26
26
|
return new ZLinkNodeRawMeshBackend(
|
|
27
27
|
options.meshName,
|
|
28
28
|
options.routingId,
|
|
29
|
-
new ZLinkNodeRawBindingPort(bindingContext,
|
|
29
|
+
new ZLinkNodeRawBindingPort(bindingContext, {
|
|
30
|
+
sendHighWaterMark: options.sendHighWaterMark,
|
|
31
|
+
receiveHighWaterMark: options.receiveHighWaterMark,
|
|
32
|
+
receiveTimeoutMs: options.receiveTimeoutMs
|
|
33
|
+
}),
|
|
30
34
|
options.applicationJobQueue,
|
|
31
35
|
options.applicationJobReceiveFlowFailureSink,
|
|
32
36
|
options.peerAdmissionSealed,
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { RequestRuntime } from '../../foundation/request-runtime';
|
|
2
|
+
import type { OperationHandle } from '../../foundation/operation-registry';
|
|
3
|
+
import { remainingRequestTimeout } from '../../messaging/request-deadline';
|
|
1
4
|
import {
|
|
2
5
|
Message,
|
|
3
6
|
Received,
|
|
@@ -21,7 +24,6 @@ import {
|
|
|
21
24
|
} from '@zlink-systems/zlink';
|
|
22
25
|
import {
|
|
23
26
|
translateBindingResultError,
|
|
24
|
-
bindingRequestReply,
|
|
25
27
|
submitBindingAsyncSend,
|
|
26
28
|
submitBindingSend
|
|
27
29
|
} from './node-backend-adapter-support';
|
|
@@ -40,6 +42,13 @@ import type {
|
|
|
40
42
|
ZLinkRawRouterRoute,
|
|
41
43
|
ZLinkRawSocketPort
|
|
42
44
|
} from '../raw-binding-port';
|
|
45
|
+
|
|
46
|
+
interface ZLinkNodeRawRouterSocketOptions {
|
|
47
|
+
readonly sendHighWaterMark?: number;
|
|
48
|
+
readonly receiveHighWaterMark?: number;
|
|
49
|
+
readonly receiveTimeoutMs?: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
43
52
|
export type {
|
|
44
53
|
ZLinkRawBindingPort,
|
|
45
54
|
ZLinkRawDealerPort,
|
|
@@ -55,14 +64,14 @@ export type {
|
|
|
55
64
|
export class ZLinkNodeRawBindingPort implements ZLinkRawBindingPort {
|
|
56
65
|
constructor(
|
|
57
66
|
private readonly sharedContext?: Context,
|
|
58
|
-
private readonly
|
|
67
|
+
private readonly routerSocketOptions?: ZLinkNodeRawRouterSocketOptions
|
|
59
68
|
) {}
|
|
60
69
|
|
|
61
70
|
createHost(): ZLinkRawHostPort {
|
|
62
71
|
return new NodeRawHostPort(
|
|
63
72
|
this.sharedContext ?? createContext(),
|
|
64
73
|
this.sharedContext === undefined,
|
|
65
|
-
this.
|
|
74
|
+
this.routerSocketOptions
|
|
66
75
|
);
|
|
67
76
|
}
|
|
68
77
|
}
|
|
@@ -74,13 +83,13 @@ class NodeRawHostPort implements ZLinkRawHostPort {
|
|
|
74
83
|
constructor(
|
|
75
84
|
private readonly context: Context,
|
|
76
85
|
private readonly ownsContext: boolean,
|
|
77
|
-
private readonly
|
|
86
|
+
private readonly routerSocketOptions?: ZLinkNodeRawRouterSocketOptions
|
|
78
87
|
) {}
|
|
79
88
|
|
|
80
89
|
createRouter(): ZLinkRawRouterPort {
|
|
81
90
|
this.requireOpen();
|
|
82
91
|
return this.own(
|
|
83
|
-
new NodeRawRouterPort(createRouterSocket(this.context), this.
|
|
92
|
+
new NodeRawRouterPort(createRouterSocket(this.context), this.routerSocketOptions)
|
|
84
93
|
);
|
|
85
94
|
}
|
|
86
95
|
|
|
@@ -133,6 +142,8 @@ class NodeRawHostPort implements ZLinkRawHostPort {
|
|
|
133
142
|
}
|
|
134
143
|
|
|
135
144
|
abstract class NodeRawSocketPort<TSocket extends Socket> implements ZLinkRawSocketPort {
|
|
145
|
+
protected readonly requests = new RequestRuntime();
|
|
146
|
+
protected readonly received = new Received();
|
|
136
147
|
private readonly endpoints = new Set<string>();
|
|
137
148
|
private readonly monitors = new Set<NodeRawMonitorPort>();
|
|
138
149
|
private readonly eventLoopPoller: ZLinkNodeEventLoopPoller;
|
|
@@ -145,7 +156,9 @@ abstract class NodeRawSocketPort<TSocket extends Socket> implements ZLinkRawSock
|
|
|
145
156
|
this.eventLoopPoller = new ZLinkNodeEventLoopPoller(socket, true, () => {}, pollRoute);
|
|
146
157
|
}
|
|
147
158
|
|
|
148
|
-
setReadableHandler(
|
|
159
|
+
setReadableHandler(
|
|
160
|
+
handler: (receiveReady: boolean, routeReady: boolean, connectReady: boolean) => void
|
|
161
|
+
): void {
|
|
149
162
|
this.requireOpen();
|
|
150
163
|
this.eventLoopPoller.setReadableHandler(handler);
|
|
151
164
|
}
|
|
@@ -183,6 +196,7 @@ abstract class NodeRawSocketPort<TSocket extends Socket> implements ZLinkRawSock
|
|
|
183
196
|
}
|
|
184
197
|
|
|
185
198
|
close(): void {
|
|
199
|
+
this.requests.close();
|
|
186
200
|
if (this.closed) return;
|
|
187
201
|
const failures: unknown[] = [];
|
|
188
202
|
try {
|
|
@@ -214,6 +228,7 @@ abstract class NodeRawSocketPort<TSocket extends Socket> implements ZLinkRawSock
|
|
|
214
228
|
}
|
|
215
229
|
this.endpoints.clear();
|
|
216
230
|
try {
|
|
231
|
+
this.received.close();
|
|
217
232
|
this.socket.close();
|
|
218
233
|
} catch (error) {
|
|
219
234
|
throw new AggregateError([error], 'Raw socket cleanup failed.');
|
|
@@ -238,7 +253,7 @@ class NodeRawRouterPort extends NodeRawSocketPort<RouterSocket> implements ZLink
|
|
|
238
253
|
private readonly replyParts = (
|
|
239
254
|
targetRid: BindingRoutingId,
|
|
240
255
|
replyToken: ReplyToken,
|
|
241
|
-
parts: readonly Uint8Array[]
|
|
256
|
+
parts: readonly (Uint8Array | string)[]
|
|
242
257
|
) => {
|
|
243
258
|
// The receive record keeps the binding RoutingId it was delivered with,
|
|
244
259
|
// so the reply addresses that route without rebuilding the identity.
|
|
@@ -273,13 +288,19 @@ class NodeRawRouterPort extends NodeRawSocketPort<RouterSocket> implements ZLink
|
|
|
273
288
|
disconnectSocketPeer(this.socket, this.preparedRoutingId(routingId));
|
|
274
289
|
}
|
|
275
290
|
|
|
276
|
-
constructor(socket: RouterSocket,
|
|
291
|
+
constructor(socket: RouterSocket, options?: ZLinkNodeRawRouterSocketOptions) {
|
|
277
292
|
super(socket, true);
|
|
278
293
|
socket.options.handover = true;
|
|
279
294
|
socket.options.mandatory = true;
|
|
280
295
|
socket.options.probe = true;
|
|
281
|
-
if (
|
|
282
|
-
socket.options.
|
|
296
|
+
if (options?.sendHighWaterMark !== undefined) {
|
|
297
|
+
socket.options.sendHwm = BigInt(options.sendHighWaterMark);
|
|
298
|
+
}
|
|
299
|
+
if (options?.receiveHighWaterMark !== undefined) {
|
|
300
|
+
socket.options.recvHwm = BigInt(options.receiveHighWaterMark);
|
|
301
|
+
}
|
|
302
|
+
if (options?.receiveTimeoutMs !== undefined) {
|
|
303
|
+
socket.options.recvTimeout = options.receiveTimeoutMs;
|
|
283
304
|
}
|
|
284
305
|
}
|
|
285
306
|
|
|
@@ -311,24 +332,55 @@ class NodeRawRouterPort extends NodeRawSocketPort<RouterSocket> implements ZLink
|
|
|
311
332
|
return submitBindingSend(this.socket.send(this.preparedRoutingId(targetRid)), parts);
|
|
312
333
|
}
|
|
313
334
|
|
|
314
|
-
request(
|
|
335
|
+
request<T>(
|
|
315
336
|
targetRid: string,
|
|
316
337
|
parts: readonly Uint8Array[],
|
|
317
338
|
timeoutMs: number,
|
|
339
|
+
onReply: (parts: readonly Buffer[]) => T,
|
|
340
|
+
onFailed: (error: unknown) => T,
|
|
318
341
|
recordReceived?: () => void,
|
|
319
|
-
onAdmitted?: () => void
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
try {
|
|
342
|
+
onAdmitted?: () => void,
|
|
343
|
+
existing?: Pick<OperationHandle<unknown>, 'id' | 'deadlineMs'>
|
|
344
|
+
): Promise<T> {
|
|
345
|
+
if (existing !== undefined) {
|
|
324
346
|
this.requireOpen();
|
|
325
|
-
submission =
|
|
326
|
-
.timeout(
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
347
|
+
const submission = submitRawRequest(
|
|
348
|
+
appendRequestParts(this.socket.request(this.preparedRoutingId(targetRid)), parts).timeout(
|
|
349
|
+
remainingRequestTimeout('Request', existing.deadlineMs) ?? timeoutMs
|
|
350
|
+
)
|
|
351
|
+
);
|
|
352
|
+
return requestReply(submission, 0, onReply, onFailed, recordReceived, onAdmitted);
|
|
330
353
|
}
|
|
331
|
-
return
|
|
354
|
+
return this.requests.observe<readonly Buffer[], T>(
|
|
355
|
+
timeoutMs,
|
|
356
|
+
(entry, receiver) => {
|
|
357
|
+
this.requireOpen();
|
|
358
|
+
const submission = submitRawRequest(
|
|
359
|
+
appendRequestParts(this.socket.request(this.preparedRoutingId(targetRid)), parts).timeout(
|
|
360
|
+
remainingRequestTimeout('Request', entry.deadlineMs) ?? timeoutMs
|
|
361
|
+
)
|
|
362
|
+
);
|
|
363
|
+
void requestReply(
|
|
364
|
+
submission,
|
|
365
|
+
0,
|
|
366
|
+
(value) => {
|
|
367
|
+
receiver.operationCompleted(entry.id, value, undefined);
|
|
368
|
+
},
|
|
369
|
+
(error) => {
|
|
370
|
+
receiver.operationFailed(entry.id, error, undefined);
|
|
371
|
+
},
|
|
372
|
+
recordReceived,
|
|
373
|
+
onAdmitted
|
|
374
|
+
);
|
|
375
|
+
},
|
|
376
|
+
onReply,
|
|
377
|
+
onFailed
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
connectionAttemptsSnapshot() {
|
|
382
|
+
this.requireOpen();
|
|
383
|
+
return this.socket.connectionAttemptsSnapshot();
|
|
332
384
|
}
|
|
333
385
|
|
|
334
386
|
routesSnapshot(): readonly ZLinkRawRouterRoute[] {
|
|
@@ -341,7 +393,13 @@ class NodeRawRouterPort extends NodeRawSocketPort<RouterSocket> implements ZLink
|
|
|
341
393
|
|
|
342
394
|
receive(dontWait = false): ZLinkRawReceivedRecord | undefined {
|
|
343
395
|
this.requireOpen();
|
|
344
|
-
return receiveRecord(
|
|
396
|
+
return receiveRecord(
|
|
397
|
+
this.socket,
|
|
398
|
+
this.received,
|
|
399
|
+
dontWait,
|
|
400
|
+
this.nextRequestSequence,
|
|
401
|
+
this.replyParts
|
|
402
|
+
);
|
|
345
403
|
}
|
|
346
404
|
}
|
|
347
405
|
|
|
@@ -366,20 +424,36 @@ class NodeRawDealerPort extends NodeRawSocketPort<DealerSocket> implements ZLink
|
|
|
366
424
|
timeoutMs: number,
|
|
367
425
|
onAdmitted?: () => void
|
|
368
426
|
): Promise<readonly Buffer[]> {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
427
|
+
return this.requests.observe<readonly Buffer[]>(
|
|
428
|
+
timeoutMs,
|
|
429
|
+
(entry, receiver) => {
|
|
430
|
+
this.requireOpen();
|
|
431
|
+
const submission = submitRawRequest(
|
|
432
|
+
appendRequestParts(this.socket.request(), parts).timeout(
|
|
433
|
+
remainingRequestTimeout('Request', entry.deadlineMs) ?? timeoutMs
|
|
434
|
+
)
|
|
435
|
+
);
|
|
436
|
+
void requestReply(
|
|
437
|
+
submission,
|
|
438
|
+
0,
|
|
439
|
+
(value) => {
|
|
440
|
+
receiver.operationCompleted(entry.id, value, undefined);
|
|
441
|
+
},
|
|
442
|
+
(error) => {
|
|
443
|
+
receiver.operationFailed(entry.id, error, undefined);
|
|
444
|
+
},
|
|
445
|
+
undefined,
|
|
446
|
+
onAdmitted
|
|
447
|
+
);
|
|
448
|
+
},
|
|
449
|
+
(value) => value,
|
|
450
|
+
rethrowCompletion
|
|
451
|
+
);
|
|
378
452
|
}
|
|
379
453
|
|
|
380
454
|
receive(dontWait = false): ZLinkRawReceivedRecord | undefined {
|
|
381
455
|
this.requireOpen();
|
|
382
|
-
return receiveRecord(this.socket, dontWait);
|
|
456
|
+
return receiveRecord(this.socket, this.received, dontWait);
|
|
383
457
|
}
|
|
384
458
|
}
|
|
385
459
|
|
|
@@ -429,7 +503,7 @@ function appendRequestParts(
|
|
|
429
503
|
|
|
430
504
|
function appendReplyParts(
|
|
431
505
|
operation: ReplyOperation,
|
|
432
|
-
parts: readonly Uint8Array[]
|
|
506
|
+
parts: readonly (Uint8Array | string)[]
|
|
433
507
|
): ReplySubmitOperation {
|
|
434
508
|
requireParts(parts);
|
|
435
509
|
let next = operation.message(parts[0]);
|
|
@@ -439,36 +513,35 @@ function appendReplyParts(
|
|
|
439
513
|
return next;
|
|
440
514
|
}
|
|
441
515
|
|
|
442
|
-
function requireParts(parts: readonly
|
|
516
|
+
function requireParts<T extends Uint8Array | string>(parts: readonly T[]): [T, ...T[]] {
|
|
443
517
|
if (parts.length === 0)
|
|
444
518
|
throw new TypeError('Raw multipart operation requires at least one part.');
|
|
445
|
-
return parts as [
|
|
519
|
+
return parts as [T, ...T[]];
|
|
446
520
|
}
|
|
447
521
|
|
|
448
522
|
type RawReceivedReply = (
|
|
449
523
|
targetRid: BindingRoutingId,
|
|
450
524
|
replyToken: ReplyToken,
|
|
451
|
-
parts: readonly Uint8Array[]
|
|
525
|
+
parts: readonly (Uint8Array | string)[]
|
|
452
526
|
) => void;
|
|
453
527
|
|
|
454
528
|
const EMPTY_SOURCE_ROUTE = Buffer.alloc(0);
|
|
455
529
|
|
|
456
530
|
/**
|
|
457
531
|
* One received binding record. The payload Buffers are the binding's own
|
|
458
|
-
* `data()` storage, retained under the runtime payload policy
|
|
459
|
-
*
|
|
532
|
+
* `data()` storage, retained under the runtime payload policy. The socket owns
|
|
533
|
+
* the reusable binding envelope; snapshots survive its next receive or close.
|
|
460
534
|
*/
|
|
461
535
|
class NodeRawReceivedRecord implements ZLinkRawReceivedRecord {
|
|
462
536
|
readonly sourceRid: string;
|
|
463
537
|
readonly sourceRoute: Uint8Array;
|
|
464
538
|
readonly routeGeneration: bigint;
|
|
465
539
|
readonly requestSeq?: bigint;
|
|
466
|
-
readonly reply?: (parts: readonly Uint8Array[]) => void;
|
|
540
|
+
readonly reply?: (parts: readonly (Uint8Array | string)[]) => void;
|
|
467
541
|
readonly parts: readonly Buffer[];
|
|
468
|
-
private closed = false;
|
|
469
542
|
|
|
470
543
|
constructor(
|
|
471
|
-
|
|
544
|
+
received: Received,
|
|
472
545
|
nextRequestSequence: (() => bigint) | undefined,
|
|
473
546
|
reply: RawReceivedReply | undefined
|
|
474
547
|
) {
|
|
@@ -495,21 +568,20 @@ class NodeRawReceivedRecord implements ZLinkRawReceivedRecord {
|
|
|
495
568
|
}
|
|
496
569
|
|
|
497
570
|
close(): void {
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
571
|
+
// Reading each binding payload above retained JS-owned storage and released
|
|
572
|
+
// its native frame. The socket clears its reusable envelope; these record
|
|
573
|
+
// snapshots need no native cleanup.
|
|
501
574
|
}
|
|
502
575
|
}
|
|
503
576
|
|
|
504
577
|
function receiveRecord(
|
|
505
578
|
socket: Pick<RouterSocket | DealerSocket, 'recv'>,
|
|
579
|
+
received: Received,
|
|
506
580
|
dontWait: boolean,
|
|
507
581
|
nextRequestSequence?: () => bigint,
|
|
508
582
|
reply?: RawReceivedReply
|
|
509
583
|
): ZLinkRawReceivedRecord | undefined {
|
|
510
|
-
const received = new Received();
|
|
511
584
|
if (!socket.recv(received, dontWait ? RecvFlags.DontWait : RecvFlags.None)) {
|
|
512
|
-
received.close();
|
|
513
585
|
return undefined;
|
|
514
586
|
}
|
|
515
587
|
try {
|
|
@@ -525,42 +597,71 @@ function receiveRecord(
|
|
|
525
597
|
* confirmed in this turn; a backpressured submission keeps the admission
|
|
526
598
|
* wait that bounds it by the request deadline.
|
|
527
599
|
*/
|
|
528
|
-
function requestReply(
|
|
600
|
+
function requestReply<T>(
|
|
529
601
|
submission: ReturnType<RequestSubmitOperation['submit']>,
|
|
530
|
-
|
|
602
|
+
_deadlineMs: number,
|
|
603
|
+
onReply: (parts: readonly Buffer[]) => T,
|
|
604
|
+
onFailed: (error: unknown) => T,
|
|
531
605
|
recordReceived: (() => void) | undefined,
|
|
532
606
|
onAdmitted: (() => void) | undefined
|
|
533
|
-
): Promise<
|
|
607
|
+
): Promise<T> {
|
|
608
|
+
const result = observeRequestReply(submission.reply, onReply, onFailed, recordReceived);
|
|
534
609
|
if (submission.result === SubmitResult.Backpressured) {
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
610
|
+
void submission.admitted.then(
|
|
611
|
+
() => {
|
|
612
|
+
try {
|
|
613
|
+
onAdmitted?.();
|
|
614
|
+
} catch (error) {
|
|
615
|
+
onFailed(translateBindingResultError(error, 'completion'));
|
|
616
|
+
}
|
|
617
|
+
},
|
|
618
|
+
(error) => onFailed(translateBindingResultError(error, 'completion'))
|
|
538
619
|
);
|
|
539
|
-
}
|
|
540
|
-
try {
|
|
541
|
-
onAdmitted?.();
|
|
542
|
-
} catch (error) {
|
|
543
|
-
return Promise.reject(translateBindingResultError(error, 'completion'));
|
|
544
|
-
}
|
|
545
|
-
return submission.reply.then((replies) => {
|
|
620
|
+
} else {
|
|
546
621
|
try {
|
|
547
|
-
|
|
548
|
-
return retainAndClose(replies);
|
|
622
|
+
onAdmitted?.();
|
|
549
623
|
} catch (error) {
|
|
550
|
-
|
|
624
|
+
onFailed(translateBindingResultError(error, 'completion'));
|
|
551
625
|
}
|
|
552
|
-
}
|
|
626
|
+
}
|
|
627
|
+
return result;
|
|
553
628
|
}
|
|
554
629
|
|
|
555
|
-
|
|
556
|
-
|
|
630
|
+
/** Consumes the binding reply and notifies its terminal in this continuation. */
|
|
631
|
+
function observeRequestReply<T>(
|
|
632
|
+
reply: Promise<readonly Message[]>,
|
|
633
|
+
onReply: (parts: readonly Buffer[]) => T,
|
|
634
|
+
onFailed: (error: unknown) => T,
|
|
635
|
+
recordReceived?: () => void
|
|
636
|
+
): Promise<T> {
|
|
637
|
+
return reply.then(
|
|
638
|
+
(replies) => {
|
|
639
|
+
try {
|
|
640
|
+
return onReply(retainAndClose(replies, recordReceived));
|
|
641
|
+
} catch (error) {
|
|
642
|
+
return onFailed(translateBindingResultError(error, 'completion'));
|
|
643
|
+
}
|
|
644
|
+
},
|
|
645
|
+
(error) => onFailed(translateBindingResultError(error, 'completion'))
|
|
646
|
+
);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
function rethrowCompletion(error: unknown): never {
|
|
650
|
+
throw error;
|
|
557
651
|
}
|
|
558
652
|
|
|
559
|
-
function retainAndClose(
|
|
653
|
+
function retainAndClose(
|
|
654
|
+
messages: readonly Message[],
|
|
655
|
+
recordReceived?: () => void
|
|
656
|
+
): readonly Buffer[] {
|
|
560
657
|
try {
|
|
561
|
-
|
|
658
|
+
recordReceived?.();
|
|
659
|
+
const retained = new Array<Buffer>(messages.length);
|
|
660
|
+
for (let index = 0; index < messages.length; index++)
|
|
661
|
+
retained[index] = ZLinkBufferMessage.retainPayload(messages[index]!);
|
|
662
|
+
return retained;
|
|
562
663
|
} finally {
|
|
563
|
-
for (
|
|
664
|
+
for (let index = 0; index < messages.length; index++) messages[index]!.close();
|
|
564
665
|
}
|
|
565
666
|
}
|
|
566
667
|
|
|
@@ -593,3 +694,13 @@ function copyMonitorEvent(event: MonitorEvent): ZLinkRawMonitorRecord {
|
|
|
593
694
|
flags: event.flags
|
|
594
695
|
};
|
|
595
696
|
}
|
|
697
|
+
|
|
698
|
+
function submitRawRequest(
|
|
699
|
+
operation: RequestSubmitOperation
|
|
700
|
+
): ReturnType<RequestSubmitOperation['submit']> {
|
|
701
|
+
try {
|
|
702
|
+
return operation.submit();
|
|
703
|
+
} catch (error) {
|
|
704
|
+
throw translateBindingResultError(error, 'submit');
|
|
705
|
+
}
|
|
706
|
+
}
|