@zlink-systems/framework 0.30.0 → 0.30.2
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/LICENSE +150 -68
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
- package/dist/contracts/Channels/Calls.d.ts +2 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
- package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
- package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
- package/dist/contracts/Common/encoded-payload-storage.js +5 -2
- package/dist/contracts/Configuration/Builders.d.ts +1 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
- package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
- package/dist/contracts/Handlers/Attributes.d.ts +5 -13
- package/dist/contracts/Handlers/Attributes.js +7 -11
- package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
- package/dist/contracts/Handlers/JsonContract.js +4 -153
- package/dist/contracts/Locations/Rows.d.ts +2 -0
- package/dist/contracts/Spots/Contracts.d.ts +6 -1
- package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
- package/dist/nest-integration.d.ts +1 -1
- package/dist/nest-integration.js +2 -1
- package/dist/runtime/abort.d.ts +5 -0
- package/dist/runtime/abort.js +10 -0
- package/dist/runtime/actors/actor-authority-publication.js +3 -2
- package/dist/runtime/actors/actor-client.d.ts +1 -2
- package/dist/runtime/actors/actor-client.js +52 -57
- package/dist/runtime/actors/actor-context.d.ts +2 -0
- package/dist/runtime/actors/actor-context.js +46 -9
- package/dist/runtime/actors/actor-handoff.d.ts +8 -4
- package/dist/runtime/actors/actor-handoff.js +219 -92
- package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
- package/dist/runtime/actors/actor-local-native-join.js +13 -12
- package/dist/runtime/actors/actor-mailbox.js +27 -1
- package/dist/runtime/actors/actor-remote-joiner.js +3 -1
- package/dist/runtime/actors/actor-remote-wire.js +15 -0
- package/dist/runtime/actors/actor-reply.d.ts +4 -0
- package/dist/runtime/actors/actor-reply.js +29 -0
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
- package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-state.js +2 -20
- package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
- package/dist/runtime/actors/index.d.ts +8 -3
- package/dist/runtime/actors/index.js +55 -27
- package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
- package/dist/runtime/actors/session-disconnected-wire.js +48 -0
- package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
- package/dist/runtime/admission.d.ts +9 -1
- package/dist/runtime/admission.js +56 -23
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
- package/dist/runtime/application-jobs/contracts.d.ts +12 -1
- package/dist/runtime/backend/contracts/index.d.ts +37 -12
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
- package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
- package/dist/runtime/backend/mesh-completion-table.js +154 -49
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
- package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
- package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
- package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
- package/dist/runtime/backend/runtime-message.d.ts +1 -0
- package/dist/runtime/backend/runtime-message.js +5 -0
- package/dist/runtime/backend/runtime-values.d.ts +1 -0
- package/dist/runtime/backend/runtime-values.js +2 -1
- package/dist/runtime/channels/channel-clients.d.ts +2 -0
- package/dist/runtime/channels/channel-clients.js +75 -23
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
- package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
- package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
- package/dist/runtime/channels/channel-dispatch-services.js +45 -0
- package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
- package/dist/runtime/channels/channel-dispatchers.js +62 -54
- package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
- package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
- package/dist/runtime/channels/channel-envelope.d.ts +2 -0
- package/dist/runtime/channels/channel-envelope.js +146 -28
- package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
- package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
- package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
- package/dist/runtime/channels/channel-runtime-manager.js +16 -16
- package/dist/runtime/channels/channel-transports.d.ts +18 -16
- package/dist/runtime/channels/channel-transports.js +77 -58
- package/dist/runtime/channels/client-server-location-runtime.js +5 -4
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/fanout-location-runtime.js +3 -3
- package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.js +2 -1
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
- package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
- package/dist/runtime/channels/source-spot-router.d.ts +2 -2
- package/dist/runtime/channels/source-spot-router.js +4 -4
- package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-node-route-transport.js +4 -4
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
- package/dist/runtime/diagnostics/flow-context.js +19 -7
- package/dist/runtime/diagnostics/index.js +4 -9
- package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
- package/dist/runtime/diagnostics/message-flow.js +35 -5
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
- package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
- package/dist/runtime/execution/index.d.ts +4 -2
- package/dist/runtime/execution/index.js +33 -10
- package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
- package/dist/runtime/execution/serial-execution-queue.js +22 -2
- package/dist/runtime/execution/state-lane.d.ts +2 -0
- package/dist/runtime/execution/state-lane.js +5 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
- package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
- package/dist/runtime/foundation/durable-service-request.js +98 -0
- package/dist/runtime/foundation/operation-identity.d.ts +1 -0
- package/dist/runtime/foundation/operation-identity.js +5 -1
- package/dist/runtime/foundation/operation-registry.d.ts +25 -1
- package/dist/runtime/foundation/operation-registry.js +86 -18
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
- package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
- package/dist/runtime/foundation/service-liveness-registry.js +38 -0
- package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
- package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
- package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
- package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
- package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
- package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
- package/dist/runtime/foundation/service-stateful-registry.js +24 -26
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
- package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
- package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
- package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
- package/dist/runtime/foundation/service-topology-registry.js +61 -27
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
- package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
- package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
- package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
- package/dist/runtime/handlers/handler-instance-scope.js +54 -11
- package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
- package/dist/runtime/host/actor-packet-relay.js +59 -72
- package/dist/runtime/host/actor-placement-coordinator.js +25 -8
- package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
- package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
- package/dist/runtime/host/actor-transfer-runtime.js +85 -331
- package/dist/runtime/host/application-job-queue.d.ts +40 -7
- package/dist/runtime/host/application-job-queue.js +137 -42
- package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
- package/dist/runtime/host/entry-actor-runtime.js +3 -0
- package/dist/runtime/host/index.d.ts +12 -2
- package/dist/runtime/host/index.js +300 -202
- package/dist/runtime/host/location-runtime-owner.js +2 -6
- package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
- package/dist/runtime/host/mesh-router-resolver.js +14 -6
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
- package/dist/runtime/host/remote-bound-session-relay.js +73 -208
- package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
- package/dist/runtime/host/route-mesh-runtime.js +6 -4
- package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
- package/dist/runtime/host/runtime-shutdown.js +3 -2
- package/dist/runtime/host/service-relocation-control.d.ts +1 -0
- package/dist/runtime/host/service-relocation-control.js +10 -4
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
- package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
- package/dist/runtime/host/spot-address-transport.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
- package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
- package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
- package/dist/runtime/locations/actor-location-claims.js +34 -19
- package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
- package/dist/runtime/locations/auto-connect-loop.js +22 -14
- package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
- package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
- package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
- package/dist/runtime/locations/descriptor-publication.js +11 -0
- package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
- package/dist/runtime/locations/in-memory-authority-store.js +56 -19
- package/dist/runtime/locations/in-memory-location-store.js +1 -10
- package/dist/runtime/locations/index.d.ts +1 -0
- package/dist/runtime/locations/index.js +1 -0
- package/dist/runtime/locations/lease-tracker.js +1 -6
- package/dist/runtime/locations/lifecycle.d.ts +1 -2
- package/dist/runtime/locations/lifecycle.js +2 -5
- package/dist/runtime/locations/location-store-repository.d.ts +51 -1
- package/dist/runtime/locations/location-store-repository.js +363 -139
- package/dist/runtime/locations/relocation-blob.d.ts +18 -1
- package/dist/runtime/locations/relocation-blob.js +52 -1
- package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
- package/dist/runtime/locations/request-source-resolver.js +80 -0
- package/dist/runtime/locations/resolvers.js +1 -1
- package/dist/runtime/locations/runtime.d.ts +7 -3
- package/dist/runtime/locations/runtime.js +61 -53
- package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
- package/dist/runtime/messaging/framework-json-v1.js +38 -294
- package/dist/runtime/messaging/packet-name.d.ts +1 -1
- package/dist/runtime/messaging/packet-name.js +8 -24
- package/dist/runtime/messaging/payload-codec.d.ts +7 -1
- package/dist/runtime/messaging/payload-codec.js +7 -6
- package/dist/runtime/messaging/request-result.d.ts +2 -0
- package/dist/runtime/messaging/request-result.js +57 -0
- package/dist/runtime/messaging/submission-result.d.ts +1 -0
- package/dist/runtime/messaging/submission-result.js +5 -2
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
- package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
- package/dist/runtime/spots/index.d.ts +21 -11
- package/dist/runtime/spots/index.js +243 -178
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
- package/dist/runtime/spots/spot-activation-registry.js +21 -11
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +7 -7
- package/dist/runtime/spots/spot-activation.d.ts +7 -3
- package/dist/runtime/spots/spot-activation.js +140 -52
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
- package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-membership.js +0 -8
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
- package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
- package/dist/runtime/spots/spot-entry-activation.js +20 -11
- package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
- package/dist/runtime/spots/spot-handler-registry.js +24 -10
- package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
- package/dist/runtime/spots/spot-manager-public.js +2 -2
- package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
- package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
- package/dist/runtime/spots/spot-outbound.d.ts +3 -0
- package/dist/runtime/spots/spot-outbound.js +27 -18
- package/dist/runtime/spots/spot-remote-codec.js +5 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
- package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
- package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
- package/dist/runtime/spots/spot-serial-executor.js +61 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
- package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
- package/dist/runtime/spots/spot-timer.d.ts +57 -5
- package/dist/runtime/spots/spot-timer.js +288 -103
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
- package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
- package/dist/runtime/streams/bound-session-service.d.ts +1 -1
- package/dist/runtime/streams/bound-session-service.js +6 -11
- package/dist/runtime/streams/index.d.ts +3 -2
- package/dist/runtime/streams/index.js +6 -4
- package/dist/runtime/streams/managed-stream.js +3 -2
- package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
- package/dist/runtime/streams/session-actor-coordinator.js +15 -32
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
- package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
- package/dist/runtime/streams/stream-session-runtime.js +14 -31
- package/dist/runtime/workers/index.js +1 -1
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
- package/src/contracts/Channels/Calls.ts +2 -1
- package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
- package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
- package/src/contracts/Common/encoded-payload-storage.ts +6 -3
- package/src/contracts/Configuration/Builders.ts +4 -1
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
- package/src/contracts/Handlers/Attributes.ts +14 -21
- package/src/contracts/Handlers/JsonContract.ts +8 -216
- package/src/contracts/Locations/Rows.ts +2 -0
- package/src/contracts/Spots/Contracts.ts +10 -1
- package/src/contracts/Spots/ZLinkSpot.ts +3 -3
- package/src/nest-integration.ts +1 -0
- package/src/runtime/abort.ts +12 -0
- package/src/runtime/actors/actor-authority-publication.ts +3 -2
- package/src/runtime/actors/actor-client.ts +100 -85
- package/src/runtime/actors/actor-context.ts +49 -9
- package/src/runtime/actors/actor-handoff.ts +291 -110
- package/src/runtime/actors/actor-join-relocation.ts +3 -0
- package/src/runtime/actors/actor-local-native-join.ts +21 -26
- package/src/runtime/actors/actor-mailbox.ts +40 -2
- package/src/runtime/actors/actor-remote-joiner.ts +6 -1
- package/src/runtime/actors/actor-remote-wire.ts +17 -0
- package/src/runtime/actors/actor-reply.ts +42 -0
- package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
- package/src/runtime/actors/actor-routed-json-request.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
- package/src/runtime/actors/actor-runtime-state.ts +2 -20
- package/src/runtime/actors/actor-source-transfer.ts +1 -34
- package/src/runtime/actors/index.ts +60 -32
- package/src/runtime/actors/session-disconnected-wire.ts +66 -0
- package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
- package/src/runtime/admission.ts +69 -21
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
- package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
- package/src/runtime/application-jobs/contracts.ts +16 -1
- package/src/runtime/backend/contracts/index.ts +92 -18
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
- package/src/runtime/backend/mesh-completion-table.ts +160 -57
- package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
- package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
- package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
- package/src/runtime/backend/raw-binding-port.ts +7 -2
- package/src/runtime/backend/runtime-message.ts +6 -0
- package/src/runtime/backend/runtime-values.ts +1 -0
- package/src/runtime/channels/channel-clients.ts +132 -58
- package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
- package/src/runtime/channels/channel-dispatch-services.ts +69 -1
- package/src/runtime/channels/channel-dispatchers.ts +136 -90
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
- package/src/runtime/channels/channel-envelope.ts +225 -31
- package/src/runtime/channels/channel-outbound-operations.ts +22 -8
- package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
- package/src/runtime/channels/channel-runtime-manager.ts +41 -17
- package/src/runtime/channels/channel-transports.ts +171 -112
- package/src/runtime/channels/client-server-location-runtime.ts +11 -10
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
- package/src/runtime/channels/fanout-location-runtime.ts +17 -9
- package/src/runtime/channels/local-spot-route-transport.ts +3 -1
- package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
- package/src/runtime/channels/source-spot-router.ts +8 -4
- package/src/runtime/channels/spot-node-route-transport.ts +8 -4
- package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
- package/src/runtime/diagnostics/flow-context.ts +20 -7
- package/src/runtime/diagnostics/index.ts +1 -7
- package/src/runtime/diagnostics/message-flow.ts +47 -9
- package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
- package/src/runtime/execution/index.ts +40 -14
- package/src/runtime/execution/serial-execution-queue.ts +33 -4
- package/src/runtime/execution/state-lane.ts +7 -0
- package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
- package/src/runtime/foundation/durable-service-request.ts +137 -0
- package/src/runtime/foundation/operation-identity.ts +5 -1
- package/src/runtime/foundation/operation-registry.ts +98 -20
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
- package/src/runtime/foundation/service-liveness-registry.ts +39 -0
- package/src/runtime/foundation/service-mailbox.ts +8 -0
- package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
- package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
- package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
- package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
- package/src/runtime/foundation/service-stateful-registry.ts +38 -35
- package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
- package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
- package/src/runtime/foundation/service-topology-registry.ts +91 -36
- package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
- package/src/runtime/handlers/handler-instance-scope.ts +67 -16
- package/src/runtime/host/actor-packet-relay.ts +113 -94
- package/src/runtime/host/actor-placement-coordinator.ts +31 -8
- package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
- package/src/runtime/host/actor-transfer-runtime.ts +104 -430
- package/src/runtime/host/application-job-queue.ts +160 -41
- package/src/runtime/host/entry-actor-runtime.ts +4 -0
- package/src/runtime/host/index.ts +473 -271
- package/src/runtime/host/location-runtime-owner.ts +2 -6
- package/src/runtime/host/mesh-router-resolver.ts +13 -5
- package/src/runtime/host/remote-bound-session-relay.ts +88 -271
- package/src/runtime/host/route-mesh-runtime.ts +12 -6
- package/src/runtime/host/runtime-shutdown.ts +15 -4
- package/src/runtime/host/service-relocation-control.ts +11 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
- package/src/runtime/host/spot-address-transport.ts +4 -2
- package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
- package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
- package/src/runtime/locations/actor-location-claims.ts +52 -30
- package/src/runtime/locations/auto-connect-loop.ts +22 -14
- package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
- package/src/runtime/locations/auto-connect-types.ts +0 -1
- package/src/runtime/locations/descriptor-publication.ts +7 -0
- package/src/runtime/locations/domain-store-contract.ts +5 -0
- package/src/runtime/locations/in-memory-authority-store.ts +85 -23
- package/src/runtime/locations/in-memory-location-store.ts +1 -12
- package/src/runtime/locations/index.ts +1 -0
- package/src/runtime/locations/lease-tracker.ts +2 -9
- package/src/runtime/locations/lifecycle.ts +8 -26
- package/src/runtime/locations/location-store-repository.ts +628 -152
- package/src/runtime/locations/relocation-blob.ts +75 -1
- package/src/runtime/locations/request-source-resolver.ts +138 -0
- package/src/runtime/locations/resolvers.ts +2 -2
- package/src/runtime/locations/runtime.ts +98 -64
- package/src/runtime/messaging/framework-json-v1.ts +5 -325
- package/src/runtime/messaging/packet-name.ts +5 -25
- package/src/runtime/messaging/payload-codec.ts +8 -11
- package/src/runtime/messaging/request-result.ts +62 -0
- package/src/runtime/messaging/submission-result.ts +5 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
- package/src/runtime/spots/index.ts +389 -283
- package/src/runtime/spots/spot-activation-registry.ts +25 -13
- package/src/runtime/spots/spot-activation-state.ts +12 -19
- package/src/runtime/spots/spot-activation.ts +198 -96
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
- package/src/runtime/spots/spot-actor-membership.ts +0 -15
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
- package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
- package/src/runtime/spots/spot-entry-activation.ts +33 -21
- package/src/runtime/spots/spot-handler-registry.ts +56 -12
- package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
- package/src/runtime/spots/spot-manager-public.ts +2 -2
- package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
- package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
- package/src/runtime/spots/spot-outbound.ts +39 -19
- package/src/runtime/spots/spot-remote-codec.ts +9 -2
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
- package/src/runtime/spots/spot-runtime-ports.ts +1 -1
- package/src/runtime/spots/spot-serial-executor.ts +97 -25
- package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
- package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
- package/src/runtime/spots/spot-timer.ts +418 -158
- package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
- package/src/runtime/streams/bound-session-service.ts +7 -10
- package/src/runtime/streams/index.ts +12 -6
- package/src/runtime/streams/managed-stream.ts +4 -2
- package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
- package/src/runtime/streams/session-actor-coordinator.ts +39 -88
- package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
- package/src/runtime/streams/stream-session-runtime.ts +13 -34
- package/src/runtime/workers/index.ts +1 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { Message } from '../../contracts/Common/Message';
|
|
2
|
+
import { ZLinkBufferMessage } from '../backend/runtime-message';
|
|
2
3
|
import type { ZLinkBackendMessageLike as MessageLike } from '../backend/runtime-values';
|
|
3
|
-
import {
|
|
4
|
+
import { randomBytes } from 'node:crypto';
|
|
4
5
|
import { isUtf8 } from 'node:buffer';
|
|
5
6
|
import {
|
|
6
7
|
ZLinkFrameworkErrorKind,
|
|
7
8
|
ZLinkFrameworkException,
|
|
8
|
-
ZLinkEncodedPayload,
|
|
9
9
|
type ZLinkMessageSerializer,
|
|
10
10
|
type ZLinkFlowOrigin
|
|
11
11
|
} from '../../contracts';
|
|
@@ -17,7 +17,10 @@ import {
|
|
|
17
17
|
createInternalFrameworkException
|
|
18
18
|
} from '../framework-errors-internal';
|
|
19
19
|
import { resolveFrameworkPacketName } from '../messaging/packet-name';
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
encodedPayloadFromOwned,
|
|
22
|
+
selectSerializerWithContentType
|
|
23
|
+
} from '../messaging/payload-codec';
|
|
21
24
|
import { isCanonicalCodecContentType } from '../../contracts/Configuration/CodecContentType';
|
|
22
25
|
import { parseFrameworkJsonV1, stringifyFrameworkJsonV1 } from '../messaging/framework-json-v1';
|
|
23
26
|
import { currentOrCreateFlow } from '../diagnostics/flow-context';
|
|
@@ -70,8 +73,46 @@ export interface ZLinkChannelEnvelopeCodecRegistry {
|
|
|
70
73
|
readonly serializers: ReadonlyMap<string, ZLinkMessageSerializer>;
|
|
71
74
|
}
|
|
72
75
|
|
|
76
|
+
interface PreparedChannelHeader {
|
|
77
|
+
readonly bytes: Buffer;
|
|
78
|
+
readonly correlationOffset: number;
|
|
79
|
+
readonly deadlineOffset: number;
|
|
80
|
+
readonly flowOffset: number;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Per kind, deadline presence and flow origin (`undefined` when the header carries no flow). */
|
|
84
|
+
type PreparedHeaderVariants = Map<
|
|
85
|
+
ZLinkChannelMessageKind,
|
|
86
|
+
Map<boolean, Map<ZLinkFlowOrigin | undefined, PreparedChannelHeader>>
|
|
87
|
+
>;
|
|
88
|
+
const preparedChannelHeaders = new WeakMap<
|
|
89
|
+
ReadonlyMap<string, ZLinkMessageSerializer>,
|
|
90
|
+
Map<string, Map<string, Map<string, PreparedHeaderVariants>>>
|
|
91
|
+
>();
|
|
92
|
+
const CHANNEL_CORRELATION_FIELD = ',"correlationId":';
|
|
93
|
+
const CHANNEL_DEADLINE_FIELD = ',"deadline":';
|
|
94
|
+
const CHANNEL_CORRELATION_TEXT_LENGTH = 32;
|
|
95
|
+
const PREPARED_CHANNEL_CORRELATION = '0'.repeat(CHANNEL_CORRELATION_TEXT_LENGTH);
|
|
96
|
+
const PREPARED_CHANNEL_DEADLINE = '2000-01-01T00:00:00.000Z';
|
|
97
|
+
const CHANNEL_CORRELATION_TEXT = /^[0-9a-f]{32}$/;
|
|
98
|
+
const CHANNEL_FLOW_FIELD = ',"flowId":';
|
|
99
|
+
// A flow id is a lowercase UUIDv7 (spec 27 §3): fixed 36 JSON-safe ASCII bytes.
|
|
100
|
+
const PREPARED_CHANNEL_FLOW = '00000000-0000-7000-8000-000000000000';
|
|
101
|
+
const CHANNEL_FLOW_TEXT = /^[0-9a-f-]{36}$/;
|
|
102
|
+
|
|
103
|
+
// A per-process random 64-bit prefix followed by a per-process counter, both
|
|
104
|
+
// as lowercase hex: unique among the runtime's pending requests (spec 06-obs/04
|
|
105
|
+
// §3) without drawing random bytes for every request — the shape Java
|
|
106
|
+
// ZLinkServiceOperationIds uses.
|
|
107
|
+
const CHANNEL_CORRELATION_PREFIX = randomBytes(CHANNEL_CORRELATION_TEXT_LENGTH / 4).toString('hex');
|
|
108
|
+
let channelCorrelationCounter = 0;
|
|
109
|
+
|
|
73
110
|
export function newChannelCorrelationId(): string {
|
|
74
|
-
|
|
111
|
+
channelCorrelationCounter += 1;
|
|
112
|
+
return (
|
|
113
|
+
CHANNEL_CORRELATION_PREFIX +
|
|
114
|
+
channelCorrelationCounter.toString(16).padStart(CHANNEL_CORRELATION_TEXT_LENGTH / 2, '0')
|
|
115
|
+
);
|
|
75
116
|
}
|
|
76
117
|
|
|
77
118
|
export function encodeChannelEnvelopeParts(
|
|
@@ -147,7 +188,8 @@ export function encodeChannelEnvelopePartsAtDeadline(
|
|
|
147
188
|
undefined,
|
|
148
189
|
applicationMetadataRecord(metadata),
|
|
149
190
|
flow?.flowId,
|
|
150
|
-
flow?.flowOrigin
|
|
191
|
+
flow?.flowOrigin,
|
|
192
|
+
codecs
|
|
151
193
|
),
|
|
152
194
|
encoded.message
|
|
153
195
|
];
|
|
@@ -215,7 +257,8 @@ export function encodeChannelReplyParts(
|
|
|
215
257
|
undefined,
|
|
216
258
|
EMPTY_APPLICATION_METADATA,
|
|
217
259
|
request.flowId,
|
|
218
|
-
request.flowOrigin
|
|
260
|
+
request.flowOrigin,
|
|
261
|
+
codecs
|
|
219
262
|
),
|
|
220
263
|
encoded.message
|
|
221
264
|
];
|
|
@@ -255,6 +298,10 @@ const ERROR_KIND_BY_WIRE_NAME: ReadonlyMap<string, ZLinkFrameworkErrorKind> = ne
|
|
|
255
298
|
ERROR_KIND_WIRE_NAMES.map((name, kind) => [name, kind as ZLinkFrameworkErrorKind])
|
|
256
299
|
);
|
|
257
300
|
|
|
301
|
+
export function channelErrorKindFromCode(code: string): ZLinkFrameworkErrorKind | undefined {
|
|
302
|
+
return ERROR_KIND_BY_WIRE_NAME.get(code);
|
|
303
|
+
}
|
|
304
|
+
|
|
258
305
|
export function channelErrorCodeName(kind: ZLinkFrameworkErrorKind): string {
|
|
259
306
|
return ERROR_KIND_WIRE_NAMES[kind] ?? 'internal_failure';
|
|
260
307
|
}
|
|
@@ -325,11 +372,11 @@ export function decodeChannelReply<TReply>(
|
|
|
325
372
|
return undefined as TReply;
|
|
326
373
|
}
|
|
327
374
|
if (header.contentType === BINARY_CONTENT_TYPE) {
|
|
328
|
-
return
|
|
375
|
+
return ZLinkBufferMessage.retainPayload(parts[1]) as TReply;
|
|
329
376
|
}
|
|
330
377
|
if (serializer !== undefined) {
|
|
331
378
|
return serializer.deserialize<TReply>(
|
|
332
|
-
|
|
379
|
+
encodedPayloadFromOwned(parts[1].data()),
|
|
333
380
|
Object as never
|
|
334
381
|
);
|
|
335
382
|
}
|
|
@@ -352,7 +399,7 @@ function decodeChannelError(header: ZLinkChannelEnvelopeHeader): ZLinkChannelDec
|
|
|
352
399
|
// Cross-language contract: errorCode carries the snake_case wire name.
|
|
353
400
|
// An unknown name degrades to InternalFailure, matching the C++
|
|
354
401
|
// request_failure_mapper fallback for unrecognized codes.
|
|
355
|
-
const publicKind =
|
|
402
|
+
const publicKind = channelErrorKindFromCode(code) ?? ZLinkFrameworkErrorKind.InternalFailure;
|
|
356
403
|
failure = new ZLinkFrameworkException(publicKind, message);
|
|
357
404
|
}
|
|
358
405
|
// Cross-language contract (.NET ZLinkErrorOriginWire.RemoteReplyOrigin /
|
|
@@ -403,7 +450,7 @@ export function decodeChannelPayload(
|
|
|
403
450
|
}
|
|
404
451
|
const serializer = codecs?.serializers.get(envelope.header.contentType);
|
|
405
452
|
if (serializer !== undefined) {
|
|
406
|
-
return serializer.deserialize(
|
|
453
|
+
return serializer.deserialize(encodedPayloadFromOwned(envelope.payload), Object as never);
|
|
407
454
|
}
|
|
408
455
|
if (envelope.header.contentType === BINARY_CONTENT_TYPE) {
|
|
409
456
|
// The receive loop owns the Message for the duration of dispatch, so
|
|
@@ -517,8 +564,50 @@ function encodeChannelHeader(
|
|
|
517
564
|
source: string | null | undefined,
|
|
518
565
|
metadata: Readonly<Record<string, string>>,
|
|
519
566
|
flowId: string | undefined,
|
|
520
|
-
flowOrigin: ZLinkFlowOrigin | undefined
|
|
567
|
+
flowOrigin: ZLinkFlowOrigin | undefined,
|
|
568
|
+
codecs?: ZLinkChannelEnvelopeCodecRegistry
|
|
521
569
|
): Buffer {
|
|
570
|
+
if (
|
|
571
|
+
codecs !== undefined &&
|
|
572
|
+
metadata === EMPTY_APPLICATION_METADATA &&
|
|
573
|
+
(flowId === undefined
|
|
574
|
+
? flowOrigin === undefined
|
|
575
|
+
: flowOrigin !== undefined && CHANNEL_FLOW_TEXT.test(flowId)) &&
|
|
576
|
+
topic === null &&
|
|
577
|
+
source === undefined &&
|
|
578
|
+
((kind === ZLinkChannelMessageKind.Command &&
|
|
579
|
+
correlationId === null &&
|
|
580
|
+
deadline === null &&
|
|
581
|
+
errorCode === null &&
|
|
582
|
+
errorMessage === null) ||
|
|
583
|
+
(kind === ZLinkChannelMessageKind.Request &&
|
|
584
|
+
correlationId !== null &&
|
|
585
|
+
CHANNEL_CORRELATION_TEXT.test(correlationId) &&
|
|
586
|
+
deadline !== null &&
|
|
587
|
+
deadline.length === PREPARED_CHANNEL_DEADLINE.length &&
|
|
588
|
+
errorCode === null &&
|
|
589
|
+
errorMessage === null) ||
|
|
590
|
+
(kind === ZLinkChannelMessageKind.Response &&
|
|
591
|
+
correlationId !== null &&
|
|
592
|
+
CHANNEL_CORRELATION_TEXT.test(correlationId) &&
|
|
593
|
+
deadline === null &&
|
|
594
|
+
errorCode === undefined &&
|
|
595
|
+
errorMessage === undefined))
|
|
596
|
+
) {
|
|
597
|
+
return preparedChannelHeader(
|
|
598
|
+
codecs,
|
|
599
|
+
kind,
|
|
600
|
+
channelName,
|
|
601
|
+
messageName,
|
|
602
|
+
contentType,
|
|
603
|
+
correlationId,
|
|
604
|
+
deadline,
|
|
605
|
+
errorCode,
|
|
606
|
+
errorMessage,
|
|
607
|
+
flowId,
|
|
608
|
+
flowOrigin
|
|
609
|
+
);
|
|
610
|
+
}
|
|
522
611
|
// The wire has a fixed field order. Measure escaped UTF-8 first, then write
|
|
523
612
|
// each field once into the only header Buffer: no header object, whole JSON
|
|
524
613
|
// string, or post-encode byte copy exists on the outbound path.
|
|
@@ -560,6 +649,76 @@ function encodeChannelHeader(
|
|
|
560
649
|
return result;
|
|
561
650
|
}
|
|
562
651
|
|
|
652
|
+
function preparedChannelHeader(
|
|
653
|
+
codecs: ZLinkChannelEnvelopeCodecRegistry,
|
|
654
|
+
kind: ZLinkChannelMessageKind,
|
|
655
|
+
channelName: string,
|
|
656
|
+
messageName: string,
|
|
657
|
+
contentType: string,
|
|
658
|
+
correlationId: string | null,
|
|
659
|
+
deadline: string | null,
|
|
660
|
+
errorCode: string | null | undefined,
|
|
661
|
+
errorMessage: string | null | undefined,
|
|
662
|
+
flowId: string | undefined,
|
|
663
|
+
flowOrigin: ZLinkFlowOrigin | undefined
|
|
664
|
+
): Buffer {
|
|
665
|
+
let channels = preparedChannelHeaders.get(codecs.serializers);
|
|
666
|
+
if (channels === undefined)
|
|
667
|
+
preparedChannelHeaders.set(codecs.serializers, (channels = new Map()));
|
|
668
|
+
let packets = channels.get(channelName);
|
|
669
|
+
if (packets === undefined) channels.set(channelName, (packets = new Map()));
|
|
670
|
+
let contentTypes = packets.get(messageName);
|
|
671
|
+
if (contentTypes === undefined) packets.set(messageName, (contentTypes = new Map()));
|
|
672
|
+
let kinds = contentTypes.get(contentType);
|
|
673
|
+
if (kinds === undefined) contentTypes.set(contentType, (kinds = new Map()));
|
|
674
|
+
let deadlines = kinds.get(kind);
|
|
675
|
+
if (deadlines === undefined) kinds.set(kind, (deadlines = new Map()));
|
|
676
|
+
const hasDeadline = deadline !== null;
|
|
677
|
+
let flows = deadlines.get(hasDeadline);
|
|
678
|
+
if (flows === undefined) deadlines.set(hasDeadline, (flows = new Map()));
|
|
679
|
+
let prepared = flows.get(flowOrigin);
|
|
680
|
+
if (prepared === undefined) {
|
|
681
|
+
const bytes = encodeChannelHeader(
|
|
682
|
+
kind,
|
|
683
|
+
channelName,
|
|
684
|
+
messageName,
|
|
685
|
+
contentType,
|
|
686
|
+
correlationId === null ? null : PREPARED_CHANNEL_CORRELATION,
|
|
687
|
+
hasDeadline ? PREPARED_CHANNEL_DEADLINE : null,
|
|
688
|
+
null,
|
|
689
|
+
errorCode,
|
|
690
|
+
errorMessage,
|
|
691
|
+
undefined,
|
|
692
|
+
EMPTY_APPLICATION_METADATA,
|
|
693
|
+
flowOrigin === undefined ? undefined : PREPARED_CHANNEL_FLOW,
|
|
694
|
+
flowOrigin
|
|
695
|
+
);
|
|
696
|
+
prepared = {
|
|
697
|
+
bytes,
|
|
698
|
+
correlationOffset:
|
|
699
|
+
bytes.indexOf(CHANNEL_CORRELATION_FIELD) + CHANNEL_CORRELATION_FIELD.length + 1,
|
|
700
|
+
deadlineOffset: bytes.indexOf(CHANNEL_DEADLINE_FIELD) + CHANNEL_DEADLINE_FIELD.length + 1,
|
|
701
|
+
flowOffset: bytes.indexOf(CHANNEL_FLOW_FIELD) + CHANNEL_FLOW_FIELD.length + 1
|
|
702
|
+
};
|
|
703
|
+
flows.set(flowOrigin, prepared);
|
|
704
|
+
}
|
|
705
|
+
if (correlationId === null && flowId === undefined) return prepared.bytes;
|
|
706
|
+
const bytes = Buffer.allocUnsafe(prepared.bytes.byteLength);
|
|
707
|
+
prepared.bytes.copy(bytes);
|
|
708
|
+
if (correlationId !== null)
|
|
709
|
+
bytes.write(
|
|
710
|
+
correlationId,
|
|
711
|
+
prepared.correlationOffset,
|
|
712
|
+
CHANNEL_CORRELATION_TEXT_LENGTH,
|
|
713
|
+
'ascii'
|
|
714
|
+
);
|
|
715
|
+
if (deadline !== null)
|
|
716
|
+
bytes.write(deadline, prepared.deadlineOffset, PREPARED_CHANNEL_DEADLINE.length, 'ascii');
|
|
717
|
+
if (flowId !== undefined)
|
|
718
|
+
bytes.write(flowId, prepared.flowOffset, PREPARED_CHANNEL_FLOW.length, 'ascii');
|
|
719
|
+
return bytes;
|
|
720
|
+
}
|
|
721
|
+
|
|
563
722
|
function writeChannelHeader(
|
|
564
723
|
writer: ChannelHeaderWriter,
|
|
565
724
|
kind: ZLinkChannelMessageKind,
|
|
@@ -586,9 +745,9 @@ function writeChannelHeader(
|
|
|
586
745
|
writer.string(messageName);
|
|
587
746
|
writer.append(',"contentType":');
|
|
588
747
|
writer.string(contentType);
|
|
589
|
-
writer.append(
|
|
748
|
+
writer.append(CHANNEL_CORRELATION_FIELD);
|
|
590
749
|
writer.nullableString(correlationId);
|
|
591
|
-
writer.append(
|
|
750
|
+
writer.append(CHANNEL_DEADLINE_FIELD);
|
|
592
751
|
writer.nullableString(deadline);
|
|
593
752
|
writer.append(',"topic":');
|
|
594
753
|
writer.nullableString(topic);
|
|
@@ -742,13 +901,18 @@ function parseWireJson(payload: string, schema?: ZLinkJsonSchema): unknown {
|
|
|
742
901
|
}
|
|
743
902
|
|
|
744
903
|
function parseChannelHeaderBytes(payload: Buffer): unknown {
|
|
904
|
+
const reader = new CanonicalChannelHeaderReader(payload);
|
|
905
|
+
const canonical = tryParseCanonicalChannelHeader(reader);
|
|
906
|
+
// An all-ASCII canonical header is valid UTF-8 by construction; any other
|
|
907
|
+
// header is checked before it is decoded.
|
|
908
|
+
if (canonical !== undefined && !reader.sawNonAscii) return canonical;
|
|
745
909
|
if (!isUtf8(payload)) {
|
|
746
910
|
throw new ZLinkFrameworkException(
|
|
747
911
|
ZLinkFrameworkErrorKind.ProtocolError,
|
|
748
912
|
'Channel envelope header must contain valid UTF-8.'
|
|
749
913
|
);
|
|
750
914
|
}
|
|
751
|
-
return
|
|
915
|
+
return canonical ?? parseFrameworkJsonV1(payload.toString());
|
|
752
916
|
}
|
|
753
917
|
|
|
754
918
|
/**
|
|
@@ -757,8 +921,9 @@ function parseChannelHeaderBytes(payload: Buffer): unknown {
|
|
|
757
921
|
* framework-json-v1 parser, which remains the sole authority for JSON
|
|
758
922
|
* failures and unknown properties. Header metadata accepts every valid string key.
|
|
759
923
|
*/
|
|
760
|
-
function tryParseCanonicalChannelHeader(
|
|
761
|
-
|
|
924
|
+
function tryParseCanonicalChannelHeader(
|
|
925
|
+
reader: CanonicalChannelHeaderReader
|
|
926
|
+
): Record<string, unknown> | undefined {
|
|
762
927
|
if (!reader.consume('{"formatMarker":242,"kind":')) return undefined;
|
|
763
928
|
const kind = reader.readSingleDigit();
|
|
764
929
|
if (kind === undefined || !reader.consume(',"channelName":')) return undefined;
|
|
@@ -785,20 +950,31 @@ function tryParseCanonicalChannelHeader(payload: Buffer): Record<string, unknown
|
|
|
785
950
|
deadline: deadline === NULL_JSON_STRING ? null : deadline,
|
|
786
951
|
topic: topic === NULL_JSON_STRING ? null : topic
|
|
787
952
|
};
|
|
788
|
-
if (!reader.readOptionalNullableString('errorCode', header))
|
|
789
|
-
|
|
790
|
-
if (!reader.readOptionalNullableString('
|
|
953
|
+
if (!reader.readOptionalNullableString(CANONICAL_ERROR_CODE, 'errorCode', header))
|
|
954
|
+
return undefined;
|
|
955
|
+
if (!reader.readOptionalNullableString(CANONICAL_ERROR_MESSAGE, 'errorMessage', header))
|
|
956
|
+
return undefined;
|
|
957
|
+
if (!reader.readOptionalNullableString(CANONICAL_SOURCE, 'source', header)) return undefined;
|
|
958
|
+
// Empty metadata validates to the shared empty record.
|
|
791
959
|
if (!reader.consume(',"metadata":{}')) return undefined;
|
|
792
|
-
|
|
793
|
-
if (!reader.
|
|
794
|
-
|
|
960
|
+
if (!reader.readOptionalString(CANONICAL_FLOW_ID, 'flowId', header)) return undefined;
|
|
961
|
+
if (!reader.readOptionalSingleDigit(CANONICAL_FLOW_ORIGIN, 'flowOrigin', header))
|
|
962
|
+
return undefined;
|
|
795
963
|
return reader.consume('}') && reader.atEnd() ? header : undefined;
|
|
796
964
|
}
|
|
797
965
|
|
|
966
|
+
const CANONICAL_ERROR_CODE = ',"errorCode":';
|
|
967
|
+
const CANONICAL_ERROR_MESSAGE = ',"errorMessage":';
|
|
968
|
+
const CANONICAL_SOURCE = ',"source":';
|
|
969
|
+
const CANONICAL_FLOW_ID = ',"flowId":';
|
|
970
|
+
const CANONICAL_FLOW_ORIGIN = ',"flowOrigin":';
|
|
971
|
+
|
|
798
972
|
const NULL_JSON_STRING = Symbol('null JSON string');
|
|
799
973
|
|
|
800
974
|
class CanonicalChannelHeaderReader {
|
|
801
975
|
private index = 0;
|
|
976
|
+
/** A string held a byte outside ASCII, so the caller must still check UTF-8. */
|
|
977
|
+
sawNonAscii = false;
|
|
802
978
|
|
|
803
979
|
constructor(private readonly bytes: Buffer) {}
|
|
804
980
|
|
|
@@ -827,13 +1003,19 @@ class CanonicalChannelHeaderReader {
|
|
|
827
1003
|
if (this.bytes[this.index] !== 0x22) return undefined;
|
|
828
1004
|
const start = this.index;
|
|
829
1005
|
this.index += 1;
|
|
1006
|
+
let hasEscape = false;
|
|
830
1007
|
while (this.index < this.bytes.length) {
|
|
831
1008
|
const value = this.bytes[this.index++]!;
|
|
832
1009
|
if (value === 0x22) {
|
|
833
|
-
|
|
1010
|
+
// Without escapes the JSON string is its own bytes; decode them once.
|
|
1011
|
+
return hasEscape
|
|
1012
|
+
? (JSON.parse(this.bytes.toString('utf8', start, this.index)) as string)
|
|
1013
|
+
: this.bytes.toString(this.sawNonAscii ? 'utf8' : 'latin1', start + 1, this.index - 1);
|
|
834
1014
|
}
|
|
835
1015
|
if (value < 0x20) return undefined;
|
|
1016
|
+
if (value >= 0x80) this.sawNonAscii = true;
|
|
836
1017
|
if (value !== 0x5c) continue;
|
|
1018
|
+
hasEscape = true;
|
|
837
1019
|
if (this.index === this.bytes.length) return undefined;
|
|
838
1020
|
const escaped = this.bytes[this.index++]!;
|
|
839
1021
|
if (escaped === 0x75) {
|
|
@@ -863,24 +1045,28 @@ class CanonicalChannelHeaderReader {
|
|
|
863
1045
|
return this.readString();
|
|
864
1046
|
}
|
|
865
1047
|
|
|
866
|
-
readOptionalNullableString(
|
|
867
|
-
|
|
1048
|
+
readOptionalNullableString(
|
|
1049
|
+
token: string,
|
|
1050
|
+
name: string,
|
|
1051
|
+
target: Record<string, unknown>
|
|
1052
|
+
): boolean {
|
|
1053
|
+
if (!this.consume(token)) return true;
|
|
868
1054
|
const value = this.readNullableString();
|
|
869
1055
|
if (value === undefined) return false;
|
|
870
1056
|
target[name] = value === NULL_JSON_STRING ? null : value;
|
|
871
1057
|
return true;
|
|
872
1058
|
}
|
|
873
1059
|
|
|
874
|
-
readOptionalString(name: string, target: Record<string, unknown>): boolean {
|
|
875
|
-
if (!this.consume(
|
|
1060
|
+
readOptionalString(token: string, name: string, target: Record<string, unknown>): boolean {
|
|
1061
|
+
if (!this.consume(token)) return true;
|
|
876
1062
|
const value = this.readString();
|
|
877
1063
|
if (value === undefined) return false;
|
|
878
1064
|
target[name] = value;
|
|
879
1065
|
return true;
|
|
880
1066
|
}
|
|
881
1067
|
|
|
882
|
-
readOptionalSingleDigit(name: string, target: Record<string, unknown>): boolean {
|
|
883
|
-
if (!this.consume(
|
|
1068
|
+
readOptionalSingleDigit(token: string, name: string, target: Record<string, unknown>): boolean {
|
|
1069
|
+
if (!this.consume(token)) return true;
|
|
884
1070
|
const value = this.readSingleDigit();
|
|
885
1071
|
if (value === undefined) return false;
|
|
886
1072
|
target[name] = value;
|
|
@@ -994,9 +1180,17 @@ function validateCorrelationForKind(
|
|
|
994
1180
|
}
|
|
995
1181
|
}
|
|
996
1182
|
|
|
1183
|
+
const MAXIMUM_CORRELATION_ID_BYTES = 64;
|
|
1184
|
+
|
|
1185
|
+
export function isValidChannelCorrelationId(value: string): boolean {
|
|
1186
|
+
const byteLength = Buffer.byteLength(value, 'utf8');
|
|
1187
|
+
return (
|
|
1188
|
+
byteLength >= 1 && byteLength <= MAXIMUM_CORRELATION_ID_BYTES && /^[\x00-\x7f]*$/.test(value)
|
|
1189
|
+
);
|
|
1190
|
+
}
|
|
1191
|
+
|
|
997
1192
|
function validateCorrelationValue(correlationId: string): void {
|
|
998
|
-
|
|
999
|
-
if (byteLength < 1 || byteLength > 64 || !/^[\x00-\x7f]*$/.test(correlationId)) {
|
|
1193
|
+
if (!isValidChannelCorrelationId(correlationId)) {
|
|
1000
1194
|
throw new ZLinkConfigurationException(
|
|
1001
1195
|
'Channel envelope correlationId must be a non-empty ASCII value of at most 64 bytes.'
|
|
1002
1196
|
);
|
|
@@ -128,11 +128,20 @@ export class ZLinkChannelOutboundOperations {
|
|
|
128
128
|
request: unknown,
|
|
129
129
|
timeoutMs: number | undefined,
|
|
130
130
|
signal?: AbortSignal,
|
|
131
|
-
metadata?: ReadonlyMap<string, string
|
|
131
|
+
metadata?: ReadonlyMap<string, string>,
|
|
132
|
+
onAdmitted?: () => void
|
|
132
133
|
): Promise<TReply> {
|
|
133
134
|
return keepChannelRequestAlive(
|
|
134
135
|
runWithOutboundFlow(this.dispatchServices.flowCreationEnabled(), () =>
|
|
135
|
-
this.requestScoped<TReply>(
|
|
136
|
+
this.requestScoped<TReply>(
|
|
137
|
+
channelName,
|
|
138
|
+
packetName,
|
|
139
|
+
request,
|
|
140
|
+
timeoutMs,
|
|
141
|
+
signal,
|
|
142
|
+
metadata,
|
|
143
|
+
onAdmitted
|
|
144
|
+
)
|
|
136
145
|
)
|
|
137
146
|
);
|
|
138
147
|
}
|
|
@@ -143,7 +152,8 @@ export class ZLinkChannelOutboundOperations {
|
|
|
143
152
|
request: unknown,
|
|
144
153
|
timeoutMs: number | undefined,
|
|
145
154
|
signal?: AbortSignal,
|
|
146
|
-
metadata?: ReadonlyMap<string, string
|
|
155
|
+
metadata?: ReadonlyMap<string, string>,
|
|
156
|
+
onAdmitted?: () => void
|
|
147
157
|
): Promise<TReply> {
|
|
148
158
|
const deadlineMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
|
|
149
159
|
const deadlineUnixMs = timeoutMs === undefined ? undefined : Date.now() + timeoutMs;
|
|
@@ -213,7 +223,8 @@ export class ZLinkChannelOutboundOperations {
|
|
|
213
223
|
replyParts = await awaitWithAbort(
|
|
214
224
|
dealer.request(
|
|
215
225
|
parts,
|
|
216
|
-
remainingRequestTimeout(`Channel request '${channelName}'`, deadlineMs)
|
|
226
|
+
remainingRequestTimeout(`Channel request '${channelName}'`, deadlineMs),
|
|
227
|
+
onAdmitted
|
|
217
228
|
),
|
|
218
229
|
signal
|
|
219
230
|
);
|
|
@@ -397,7 +408,8 @@ export class ZLinkChannelOutboundOperations {
|
|
|
397
408
|
request: unknown,
|
|
398
409
|
timeoutMs: number | undefined,
|
|
399
410
|
signal?: AbortSignal,
|
|
400
|
-
metadata?: ReadonlyMap<string, string
|
|
411
|
+
metadata?: ReadonlyMap<string, string>,
|
|
412
|
+
onAdmitted?: () => void
|
|
401
413
|
): Promise<TReply> {
|
|
402
414
|
return runWithOutboundFlow(this.dispatchServices.flowCreationEnabled(), () =>
|
|
403
415
|
this.routeRequestScoped<TReply>(
|
|
@@ -407,7 +419,8 @@ export class ZLinkChannelOutboundOperations {
|
|
|
407
419
|
request,
|
|
408
420
|
timeoutMs,
|
|
409
421
|
signal,
|
|
410
|
-
metadata
|
|
422
|
+
metadata,
|
|
423
|
+
onAdmitted
|
|
411
424
|
)
|
|
412
425
|
);
|
|
413
426
|
}
|
|
@@ -419,7 +432,8 @@ export class ZLinkChannelOutboundOperations {
|
|
|
419
432
|
request: unknown,
|
|
420
433
|
timeoutMs: number | undefined,
|
|
421
434
|
signal?: AbortSignal,
|
|
422
|
-
metadata?: ReadonlyMap<string, string
|
|
435
|
+
metadata?: ReadonlyMap<string, string>,
|
|
436
|
+
onAdmitted?: () => void
|
|
423
437
|
): Promise<TReply> {
|
|
424
438
|
let correlationId: string | undefined;
|
|
425
439
|
let router: ReturnType<ZLinkChannelSocketRegistry['routeRouter']> | undefined;
|
|
@@ -471,7 +485,7 @@ export class ZLinkChannelOutboundOperations {
|
|
|
471
485
|
});
|
|
472
486
|
const reply = await this.measureRequest(routerChannelId, async () => {
|
|
473
487
|
const replyParts = await awaitWithAbort(
|
|
474
|
-
router!.request(targetNodeRid, parts, timeoutMs),
|
|
488
|
+
router!.request(targetNodeRid, parts, timeoutMs, onAdmitted),
|
|
475
489
|
signal
|
|
476
490
|
);
|
|
477
491
|
try {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ZLinkMeshDispatchAdmission } from '../admission';
|
|
1
2
|
import { RuntimeDisposal } from '../disposal';
|
|
2
3
|
import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
|
|
3
4
|
import type { ZLinkRequestHandler, ZLinkSendHandler } from '../../contracts/Handlers';
|
|
@@ -50,12 +51,9 @@ import {
|
|
|
50
51
|
endpointConnections
|
|
51
52
|
} from '../../contracts/Configuration/RuntimeEndpointConnections';
|
|
52
53
|
import type { ApplicationJobQueue } from '../host/application-job-queue';
|
|
53
|
-
import {
|
|
54
|
-
import { ZLinkStateLane } from '../execution/state-lane';
|
|
54
|
+
import { startOutsideStateLane, ZLinkStateLane } from '../execution/state-lane';
|
|
55
55
|
import { ZLinkSerialExecutionQueue } from '../execution/serial-execution-queue';
|
|
56
56
|
|
|
57
|
-
const detachedStateLaneResource = new AsyncResource('zlink:channel-runtime-lifecycle');
|
|
58
|
-
|
|
59
57
|
interface ManualFanoutSubscriberState {
|
|
60
58
|
readonly channelName: string;
|
|
61
59
|
readonly endpoint: string;
|
|
@@ -349,8 +347,9 @@ export class ZLinkChannelRuntimeLifecycle {
|
|
|
349
347
|
dispatchMeshChannel(
|
|
350
348
|
meshName: string,
|
|
351
349
|
record: ReceiveRecord,
|
|
352
|
-
signal?: AbortSignal
|
|
353
|
-
|
|
350
|
+
signal?: AbortSignal,
|
|
351
|
+
admit?: ZLinkMeshDispatchAdmission
|
|
352
|
+
): void | Promise<void> {
|
|
354
353
|
const channelName = record.channelName;
|
|
355
354
|
if (channelName === null) {
|
|
356
355
|
throw new ZLinkConfigurationException('MeshNode channel record is missing channelName.');
|
|
@@ -361,17 +360,22 @@ export class ZLinkChannelRuntimeLifecycle {
|
|
|
361
360
|
`RouteMesh '${meshName}' channel '${channelName}' has no registered handlers.`
|
|
362
361
|
);
|
|
363
362
|
}
|
|
364
|
-
return dispatcher.dispatchMesh(record, signal);
|
|
363
|
+
return dispatcher.dispatchMesh(record, signal, admit);
|
|
365
364
|
}
|
|
366
365
|
|
|
367
|
-
dispatchMeshRoute(
|
|
366
|
+
dispatchMeshRoute(
|
|
367
|
+
meshName: string,
|
|
368
|
+
record: ReceiveRecord,
|
|
369
|
+
signal?: AbortSignal,
|
|
370
|
+
admit?: ZLinkMeshDispatchAdmission
|
|
371
|
+
): void | Promise<void> {
|
|
368
372
|
const dispatcher = this.meshRouteDispatchers.get(meshName);
|
|
369
373
|
if (dispatcher === undefined) {
|
|
370
374
|
throw new ZLinkConfigurationException(
|
|
371
375
|
`RouteMesh '${meshName}' has no registered node-direct handlers.`
|
|
372
376
|
);
|
|
373
377
|
}
|
|
374
|
-
return dispatcher.dispatchMesh(record, signal);
|
|
378
|
+
return dispatcher.dispatchMesh(record, signal, admit);
|
|
375
379
|
}
|
|
376
380
|
|
|
377
381
|
dispatchLocalMeshRoute(
|
|
@@ -1060,7 +1064,3 @@ function hasFanoutLocationTopology(registration: ZLinkFrameworkRegistration): bo
|
|
|
1060
1064
|
}
|
|
1061
1065
|
return false;
|
|
1062
1066
|
}
|
|
1063
|
-
|
|
1064
|
-
function startOutsideStateLane<T>(work: () => T): T {
|
|
1065
|
-
return detachedStateLaneResource.runInAsyncScope(work);
|
|
1066
|
-
}
|