@zlink-systems/framework 0.21.0 → 0.22.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/Common/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +24 -18
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +158 -124
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +116 -113
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +10 -18
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +43 -33
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -7
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +47 -39
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -23
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +136 -136
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.js +416 -438
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.js +96 -95
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +244 -227
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +208 -219
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +23 -20
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +74 -85
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +16 -14
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +5 -5
- package/dist/runtime/spots/spot-timer.js +25 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +98 -107
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +18 -16
- package/dist/runtime/streams/bound-session-service.js +8 -9
- package/dist/runtime/streams/index.js +20 -19
- package/dist/runtime/streams/managed-stream.js +32 -30
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.js +29 -18
- package/dist/runtime/streams/session-actor-coordinator.js +34 -37
- package/dist/runtime/streams/session-context.js +30 -28
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.js +11 -5
- package/dist/runtime/streams/stream-session-runtime.js +70 -66
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +2 -2
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +0 -1
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +138 -130
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +5 -4
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +351 -320
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +73 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +335 -383
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +40 -42
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +215 -197
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +11 -8
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/flow-context.ts +12 -3
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +95 -76
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -51
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +312 -385
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +1 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1174 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +157 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +593 -563
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +184 -153
- package/src/runtime/spots/spot-actor-packet-drain.ts +54 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +230 -221
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +128 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +11 -17
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +56 -46
- package/src/runtime/spots/spot-timer.ts +98 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +277 -235
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +7 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +53 -51
- package/src/runtime/streams/bound-session-response-target.ts +29 -8
- package/src/runtime/streams/bound-session-service.ts +39 -39
- package/src/runtime/streams/index.ts +176 -100
- package/src/runtime/streams/managed-stream.ts +98 -87
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +73 -43
- package/src/runtime/streams/session-actor-coordinator.ts +97 -89
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +66 -48
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +55 -38
- package/src/runtime/streams/stream-session-runtime.ts +268 -210
- package/src/runtime/workers/index.ts +68 -29
|
@@ -61,8 +61,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
61
61
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorSessionNotBound, `Actor '${actor.actorId}' session binding changed before route replacement.`, true);
|
|
62
62
|
}
|
|
63
63
|
context.bindLocal(actor, bindingToken);
|
|
64
|
-
const sameLocalBinding = previous.context === context
|
|
65
|
-
&& previous.bindingToken === bindingToken;
|
|
64
|
+
const sameLocalBinding = previous.context === context && previous.bindingToken === bindingToken;
|
|
66
65
|
if (!sameLocalBinding) {
|
|
67
66
|
try {
|
|
68
67
|
previous.context.unbindLocal(actor.actorId, previous.bindingToken);
|
|
@@ -238,8 +237,8 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
238
237
|
return;
|
|
239
238
|
completed = true;
|
|
240
239
|
route.activeFrames.count--;
|
|
241
|
-
if (route.activeFrames.count === 0
|
|
242
|
-
|
|
240
|
+
if (route.activeFrames.count === 0 &&
|
|
241
|
+
this.routes.get(actorId)?.activeFrames === route.activeFrames) {
|
|
243
242
|
this.resolveActiveFrameWaiters(actorId);
|
|
244
243
|
}
|
|
245
244
|
};
|
|
@@ -356,9 +355,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
356
355
|
assertRelocationClaim(existing, claim);
|
|
357
356
|
return { kind: 'existing', wait: existing.ready };
|
|
358
357
|
}
|
|
359
|
-
const predecessor = queue?.activeSealId === undefined
|
|
360
|
-
? undefined
|
|
361
|
-
: queue.seals.get(queue.activeSealId);
|
|
358
|
+
const predecessor = queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
362
359
|
if (predecessor !== undefined && predecessor.phase !== 'terminal') {
|
|
363
360
|
if (predecessor.sessionIdentity === undefined || claim.sessionIdentity === undefined) {
|
|
364
361
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${claim.actorId}' session ingress is sealed by another relocation.`, true);
|
|
@@ -368,7 +365,9 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
368
365
|
}
|
|
369
366
|
this.sealCore(claim.actorId, claim.sealId, expected);
|
|
370
367
|
let resolveTerminal;
|
|
371
|
-
const terminal = new Promise((resolve) => {
|
|
368
|
+
const terminal = new Promise((resolve) => {
|
|
369
|
+
resolveTerminal = resolve;
|
|
370
|
+
});
|
|
372
371
|
const ready = this.waitForActiveFramesCore(claim.actorId, signal);
|
|
373
372
|
const actorQueue = queue ?? {
|
|
374
373
|
actorId: claim.actorId,
|
|
@@ -402,10 +401,10 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
402
401
|
if (sealId !== undefined) {
|
|
403
402
|
const queue = this.relocations.get(actorId);
|
|
404
403
|
const state = queue?.seals.get(sealId);
|
|
405
|
-
if (queue === undefined
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
404
|
+
if (queue === undefined ||
|
|
405
|
+
state === undefined ||
|
|
406
|
+
(queue.activeSealId !== sealId &&
|
|
407
|
+
!(queue.activeSealId === undefined && state.phase === 'terminal'))) {
|
|
409
408
|
failRetainedOutbound(operation, new Error(`Actor '${actorId}' Session outbound did not match its exact relocation seal.`));
|
|
410
409
|
return 'rejected';
|
|
411
410
|
}
|
|
@@ -417,9 +416,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
417
416
|
}
|
|
418
417
|
admitRelocationOutboundCore(claim, operation) {
|
|
419
418
|
const queue = this.relocations.get(claim.actorId);
|
|
420
|
-
const state = queue?.activeSealId === undefined
|
|
421
|
-
? undefined
|
|
422
|
-
: queue.seals.get(queue.activeSealId);
|
|
419
|
+
const state = queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
423
420
|
const error = this.outboundAdmissionError(claim);
|
|
424
421
|
if (error !== undefined) {
|
|
425
422
|
failRetainedOutbound(operation, error);
|
|
@@ -437,14 +434,11 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
437
434
|
if (state.phase === 'sealed' || state.phase === 'applying') {
|
|
438
435
|
const matchesSource = matchesRelocationSourceProof(state, claim);
|
|
439
436
|
const matchesCurrent = this.matchesCurrentProducerNode(claim);
|
|
440
|
-
const authorization = matchesSource || matchesCurrent
|
|
441
|
-
? 'source'
|
|
442
|
-
: 'pendingTarget';
|
|
437
|
+
const authorization = matchesSource || matchesCurrent ? 'source' : 'pendingTarget';
|
|
443
438
|
return this.retainRelocationOutboundCore(claim.actorId, operation, authorization, claim);
|
|
444
439
|
}
|
|
445
440
|
const acceptedProof = state.acceptedProducerProof;
|
|
446
|
-
if (acceptedProof === undefined
|
|
447
|
-
|| !matchesAcceptedProducerProof(acceptedProof, claim)) {
|
|
441
|
+
if (acceptedProof === undefined || !matchesAcceptedProducerProof(acceptedProof, claim)) {
|
|
448
442
|
failRetainedOutbound(operation, new Error(`Actor '${claim.actorId}' Session outbound admission did not match its accepted producer proof.`));
|
|
449
443
|
return 'rejected';
|
|
450
444
|
}
|
|
@@ -452,9 +446,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
452
446
|
}
|
|
453
447
|
retainRelocationOutboundCore(actorId, operation, authorization, claim) {
|
|
454
448
|
const queue = this.relocations.get(actorId);
|
|
455
|
-
const state = queue?.activeSealId === undefined
|
|
456
|
-
? undefined
|
|
457
|
-
: queue.seals.get(queue.activeSealId);
|
|
449
|
+
const state = queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
|
|
458
450
|
if (queue === undefined)
|
|
459
451
|
return 'passThrough';
|
|
460
452
|
if (state === undefined || state.phase === 'applied' || state.phase === 'terminal') {
|
|
@@ -535,9 +527,9 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
535
527
|
}
|
|
536
528
|
return { queue, state, applyPromise: state.applyPromise };
|
|
537
529
|
}
|
|
538
|
-
if (action === 'commit'
|
|
539
|
-
|
|
540
|
-
|
|
530
|
+
if (action === 'commit' &&
|
|
531
|
+
acceptedProducerProof !== undefined &&
|
|
532
|
+
!validAcceptedTargetProof(state, acceptedProducerProof)) {
|
|
541
533
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${actorId}' command 44 target producer proof did not match its Session seal.`, true);
|
|
542
534
|
}
|
|
543
535
|
if (action === 'abort' && acceptedProducerProof !== undefined) {
|
|
@@ -567,7 +559,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
567
559
|
completeRelocationApply(prepared) {
|
|
568
560
|
const { queue, state, action, acceptedProducerProof, actorId, sealId } = prepared;
|
|
569
561
|
const proof = action === 'commit'
|
|
570
|
-
? acceptedProducerProof ?? this.currentProducerProof(actorId)
|
|
562
|
+
? (acceptedProducerProof ?? this.currentProducerProof(actorId))
|
|
571
563
|
: relocationSourceProof(state);
|
|
572
564
|
state.acceptedProducerProof = proof;
|
|
573
565
|
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
@@ -578,10 +570,10 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
578
570
|
entry.released = true;
|
|
579
571
|
continue;
|
|
580
572
|
}
|
|
581
|
-
if (action === 'commit'
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
573
|
+
if (action === 'commit' &&
|
|
574
|
+
proof !== undefined &&
|
|
575
|
+
entry.claim !== undefined &&
|
|
576
|
+
matchesAcceptedProducerProof(proof, entry.claim)) {
|
|
585
577
|
entry.released = true;
|
|
586
578
|
continue;
|
|
587
579
|
}
|
|
@@ -601,16 +593,16 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
601
593
|
const route = this.routes.get(actorId);
|
|
602
594
|
const actorRef = (route?.actor).ref;
|
|
603
595
|
const sessionIdentity = route?.sessionIdentity;
|
|
604
|
-
if (route === undefined
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
596
|
+
if (route === undefined ||
|
|
597
|
+
actorRef === undefined ||
|
|
598
|
+
sessionIdentity === undefined ||
|
|
599
|
+
actorRef.ownerNodeGeneration === undefined)
|
|
608
600
|
return undefined;
|
|
609
601
|
return {
|
|
610
602
|
actorId,
|
|
611
|
-
objectGeneration: BigInt(actorRef.objectGeneration
|
|
612
|
-
|
|
613
|
-
|
|
603
|
+
objectGeneration: BigInt(actorRef.objectGeneration ??
|
|
604
|
+
actorRef.generation ??
|
|
605
|
+
-1),
|
|
614
606
|
actorNodeRid: String(actorRef.nodeRid ?? ''),
|
|
615
607
|
actorNodeGeneration: BigInt(actorRef.ownerNodeGeneration),
|
|
616
608
|
sessionIdentity: String(sessionIdentity),
|
|
@@ -623,10 +615,10 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
623
615
|
observeRelocationTerminalCore(actorId, sealId, applyFingerprint) {
|
|
624
616
|
const queue = this.relocations.get(actorId);
|
|
625
617
|
const state = queue?.seals.get(sealId);
|
|
626
|
-
if (queue === undefined
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
618
|
+
if (queue === undefined ||
|
|
619
|
+
state === undefined ||
|
|
620
|
+
state.applyFingerprint !== applyFingerprint ||
|
|
621
|
+
(state.phase !== 'applied' && state.phase !== 'terminal')) {
|
|
630
622
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${actorId}' Session relocation terminal did not match its exact route apply.`, true);
|
|
631
623
|
}
|
|
632
624
|
if (state.phase === 'terminal') {
|
|
@@ -680,9 +672,9 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
680
672
|
return;
|
|
681
673
|
const activeSealId = queue.activeSealId;
|
|
682
674
|
const activeState = activeSealId === undefined ? undefined : queue.seals.get(activeSealId);
|
|
683
|
-
const ownsActiveSeal = activeState !== undefined
|
|
684
|
-
|
|
685
|
-
|
|
675
|
+
const ownsActiveSeal = activeState !== undefined &&
|
|
676
|
+
activeState.phase !== 'terminal' &&
|
|
677
|
+
activeState.sessionIdentity === route.sessionIdentity;
|
|
686
678
|
if (!ownsActiveSeal) {
|
|
687
679
|
// Nothing this exact route still holds open — leave terminal
|
|
688
680
|
// retention and any other Session's active seal untouched.
|
|
@@ -725,8 +717,7 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
725
717
|
}
|
|
726
718
|
validateSealCore(actorId, sealId) {
|
|
727
719
|
const route = this.routes.get(actorId);
|
|
728
|
-
return route !== undefined
|
|
729
|
-
&& route.sealId === sealId;
|
|
720
|
+
return route !== undefined && route.sealId === sealId;
|
|
730
721
|
}
|
|
731
722
|
/** True while a relocation seal currently holds this actor's ingress. */
|
|
732
723
|
async isSealed(actorId) {
|
|
@@ -952,30 +943,30 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
952
943
|
failRetainedOutbound(entry.operation, error);
|
|
953
944
|
}
|
|
954
945
|
outboundAdmissionError(claim) {
|
|
955
|
-
if (claim.actorId.length === 0
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
946
|
+
if (claim.actorId.length === 0 ||
|
|
947
|
+
claim.objectGeneration <= 0n ||
|
|
948
|
+
claim.actorNodeRid.length === 0 ||
|
|
949
|
+
claim.actorNodeGeneration <= 0n ||
|
|
950
|
+
claim.producerNodeRid.length === 0 ||
|
|
951
|
+
claim.producerNodeGeneration <= 0n ||
|
|
952
|
+
claim.bindingGeneration <= 0n ||
|
|
953
|
+
claim.sessionIdentity.length === 0 ||
|
|
954
|
+
!(0, routing_id_1.routingIdsEqual)(claim.producerNodeRid, claim.actorNodeRid) ||
|
|
955
|
+
claim.producerNodeGeneration !== claim.actorNodeGeneration) {
|
|
965
956
|
return new Error(`Actor '${claim.actorId}' Session outbound admission claim is invalid.`);
|
|
966
957
|
}
|
|
967
958
|
const route = this.routes.get(claim.actorId);
|
|
968
959
|
const ref = route?.actor;
|
|
969
960
|
const actorRef = ref?.ref;
|
|
970
961
|
const routeSessionIdentity = route?.sessionIdentity;
|
|
971
|
-
if (route === undefined
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
962
|
+
if (route === undefined ||
|
|
963
|
+
actorRef === undefined ||
|
|
964
|
+
String(actorRef.actorId ?? claim.actorId) !== claim.actorId ||
|
|
965
|
+
BigInt(actorRef.objectGeneration ??
|
|
966
|
+
actorRef.generation ??
|
|
967
|
+
-1) !== claim.objectGeneration ||
|
|
968
|
+
BigInt(actorRef.bindingGeneration ?? -1) !== claim.bindingGeneration ||
|
|
969
|
+
String(routeSessionIdentity ?? '') !== claim.sessionIdentity) {
|
|
979
970
|
return new Error(`Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`);
|
|
980
971
|
}
|
|
981
972
|
return undefined;
|
|
@@ -983,9 +974,9 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
983
974
|
matchesCurrentProducerNode(claim) {
|
|
984
975
|
const route = this.routes.get(claim.actorId);
|
|
985
976
|
const actorRef = (route?.actor).ref;
|
|
986
|
-
return route !== undefined
|
|
987
|
-
|
|
988
|
-
|
|
977
|
+
return (route !== undefined &&
|
|
978
|
+
actorRef !== undefined &&
|
|
979
|
+
(0, routing_id_1.routingIdsEqual)(String(actorRef.nodeRid ?? ''), claim.actorNodeRid));
|
|
989
980
|
}
|
|
990
981
|
rememberTerminalRelocation(state) {
|
|
991
982
|
this.terminalRelocations.delete(state);
|
|
@@ -1003,11 +994,11 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
1003
994
|
}
|
|
1004
995
|
}
|
|
1005
996
|
deleteEmptyRelocationQueue(queue) {
|
|
1006
|
-
if (queue.activeSealId === undefined
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
997
|
+
if (queue.activeSealId === undefined &&
|
|
998
|
+
queue.seals.size === 0 &&
|
|
999
|
+
queue.outbound.length === 0 &&
|
|
1000
|
+
queue.drainPromise === undefined &&
|
|
1001
|
+
this.relocations.get(queue.actorId) === queue) {
|
|
1011
1002
|
this.relocations.delete(queue.actorId);
|
|
1012
1003
|
}
|
|
1013
1004
|
}
|
|
@@ -1030,11 +1021,11 @@ class ZLinkActorSessionBindingRegistry {
|
|
|
1030
1021
|
}
|
|
1031
1022
|
exports.ZLinkActorSessionBindingRegistry = ZLinkActorSessionBindingRegistry;
|
|
1032
1023
|
function assertRelocationClaim(state, claim) {
|
|
1033
|
-
if (state.actorGeneration !== claim.actorGeneration
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1024
|
+
if (state.actorGeneration !== claim.actorGeneration ||
|
|
1025
|
+
state.bindingGeneration !== claim.bindingGeneration ||
|
|
1026
|
+
state.sessionIdentity !== claim.sessionIdentity ||
|
|
1027
|
+
state.actorNodeRid !== claim.actorNodeRid ||
|
|
1028
|
+
state.actorNodeGeneration !== claim.actorNodeGeneration) {
|
|
1038
1029
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${claim.actorId}' repeated Session seal changed its exact identity.`, true);
|
|
1039
1030
|
}
|
|
1040
1031
|
}
|
|
@@ -1042,34 +1033,34 @@ function startOutsideStateLane(work) {
|
|
|
1042
1033
|
return detachedStateLaneResource.runInAsyncScope(work);
|
|
1043
1034
|
}
|
|
1044
1035
|
function matchesRelocationSourceProof(state, claim) {
|
|
1045
|
-
return state.actorId === claim.actorId
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1036
|
+
return (state.actorId === claim.actorId &&
|
|
1037
|
+
state.actorGeneration === claim.objectGeneration &&
|
|
1038
|
+
state.bindingGeneration === claim.bindingGeneration &&
|
|
1039
|
+
state.sessionIdentity === claim.sessionIdentity &&
|
|
1040
|
+
state.actorNodeRid !== undefined &&
|
|
1041
|
+
(0, routing_id_1.routingIdsEqual)(state.actorNodeRid, claim.actorNodeRid) &&
|
|
1042
|
+
state.actorNodeGeneration === claim.actorNodeGeneration);
|
|
1052
1043
|
}
|
|
1053
1044
|
function matchesAcceptedProducerProof(proof, claim) {
|
|
1054
|
-
return proof.actorId === claim.actorId
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1045
|
+
return (proof.actorId === claim.actorId &&
|
|
1046
|
+
proof.objectGeneration === claim.objectGeneration &&
|
|
1047
|
+
(0, routing_id_1.routingIdsEqual)(proof.actorNodeRid, claim.actorNodeRid) &&
|
|
1048
|
+
proof.actorNodeGeneration === claim.actorNodeGeneration &&
|
|
1049
|
+
proof.sessionIdentity === claim.sessionIdentity &&
|
|
1050
|
+
proof.bindingGeneration === claim.bindingGeneration);
|
|
1060
1051
|
}
|
|
1061
1052
|
function validAcceptedTargetProof(state, proof) {
|
|
1062
|
-
return proof.actorId === state.actorId
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1053
|
+
return (proof.actorId === state.actorId &&
|
|
1054
|
+
proof.objectGeneration === state.actorGeneration &&
|
|
1055
|
+
proof.actorNodeRid.length > 0 &&
|
|
1056
|
+
proof.actorNodeGeneration > 0n &&
|
|
1057
|
+
proof.sessionIdentity === state.sessionIdentity &&
|
|
1058
|
+
proof.bindingGeneration === state.bindingGeneration);
|
|
1068
1059
|
}
|
|
1069
1060
|
function relocationSourceProof(state) {
|
|
1070
|
-
if (state.sessionIdentity === undefined
|
|
1071
|
-
|
|
1072
|
-
|
|
1061
|
+
if (state.sessionIdentity === undefined ||
|
|
1062
|
+
state.actorNodeRid === undefined ||
|
|
1063
|
+
state.actorNodeGeneration === undefined)
|
|
1073
1064
|
return undefined;
|
|
1074
1065
|
return {
|
|
1075
1066
|
actorId: state.actorId,
|
|
@@ -1090,17 +1081,17 @@ function failRetainedOutbound(operation, error) {
|
|
|
1090
1081
|
}
|
|
1091
1082
|
}
|
|
1092
1083
|
function assertSuccessorSessionIdentity(predecessor, successor) {
|
|
1093
|
-
if (predecessor.actorGeneration !== successor.actorGeneration
|
|
1094
|
-
|
|
1095
|
-
|
|
1084
|
+
if (predecessor.actorGeneration !== successor.actorGeneration ||
|
|
1085
|
+
predecessor.bindingGeneration !== successor.bindingGeneration ||
|
|
1086
|
+
predecessor.sessionIdentity !== successor.sessionIdentity) {
|
|
1096
1087
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${successor.actorId}' successor Session seal changed its exact Session identity.`, true);
|
|
1097
1088
|
}
|
|
1098
1089
|
}
|
|
1099
1090
|
function routeMatchesFence(route, expected) {
|
|
1100
1091
|
const ref = route.actor.ref;
|
|
1101
|
-
return ref !== undefined
|
|
1102
|
-
|
|
1103
|
-
|
|
1092
|
+
return (ref !== undefined &&
|
|
1093
|
+
BigInt(ref.objectGeneration ?? ref.generation ?? -1n) === expected.objectGeneration &&
|
|
1094
|
+
ref.bindingGeneration === expected.bindingGeneration);
|
|
1104
1095
|
}
|
|
1105
1096
|
function sessionIdentityFromContext(context) {
|
|
1106
1097
|
return context.routingId === undefined ? undefined : String(context.routingId);
|
|
@@ -1119,7 +1110,7 @@ function waitForSessionRelocation(operation, signal) {
|
|
|
1119
1110
|
operation.then(() => {
|
|
1120
1111
|
signal.removeEventListener('abort', onAbort);
|
|
1121
1112
|
resolve();
|
|
1122
|
-
}, error => {
|
|
1113
|
+
}, (error) => {
|
|
1123
1114
|
signal.removeEventListener('abort', onAbort);
|
|
1124
1115
|
reject(error);
|
|
1125
1116
|
});
|
|
@@ -6,7 +6,9 @@ class ZLinkActorSessionLifecycleCoordinator {
|
|
|
6
6
|
async run(actorId, operation) {
|
|
7
7
|
const previous = this.tails.get(actorId) ?? Promise.resolve();
|
|
8
8
|
let release;
|
|
9
|
-
const current = new Promise((resolve) => {
|
|
9
|
+
const current = new Promise((resolve) => {
|
|
10
|
+
release = resolve;
|
|
11
|
+
});
|
|
10
12
|
const tail = previous.catch(() => undefined).then(() => current);
|
|
11
13
|
this.tails.set(actorId, tail);
|
|
12
14
|
await previous.catch(() => undefined);
|
|
@@ -23,8 +23,7 @@ class ZLinkBoundActorRelaySender {
|
|
|
23
23
|
const header = dispatchHeader === undefined
|
|
24
24
|
? await this.currentHeader(actor)
|
|
25
25
|
: await this.requireDispatchHeader(actor, dispatchHeader);
|
|
26
|
-
if (header.kind === protocol_1.ZLinkStreamMessageKind.Request
|
|
27
|
-
&& header.requestSeq !== undefined) {
|
|
26
|
+
if (header.kind === protocol_1.ZLinkStreamMessageKind.Request && header.requestSeq !== undefined) {
|
|
28
27
|
const operation = async () => {
|
|
29
28
|
const admission = await this.routes.beginAcceptedRequestFrameWhenReady(actor.actorId, actor.bindingToken, signal);
|
|
30
29
|
try {
|
|
@@ -34,13 +33,14 @@ class ZLinkBoundActorRelaySender {
|
|
|
34
33
|
await admission.complete();
|
|
35
34
|
}
|
|
36
35
|
};
|
|
37
|
-
if (await this.routes.isSealed(actor.actorId) &&
|
|
36
|
+
if ((await this.routes.isSealed(actor.actorId)) &&
|
|
37
|
+
(0, execution_1.captureZLinkExecutionTurn)() !== undefined) {
|
|
38
38
|
void operation().catch(() => undefined);
|
|
39
39
|
return { status: submission_result_1.ZLinkSubmitStatus.Submitted };
|
|
40
40
|
}
|
|
41
41
|
return await operation();
|
|
42
42
|
}
|
|
43
|
-
if (await this.routes.isSealed(actor.actorId) && (0, execution_1.captureZLinkExecutionTurn)() !== undefined) {
|
|
43
|
+
if ((await this.routes.isSealed(actor.actorId)) && (0, execution_1.captureZLinkExecutionTurn)() !== undefined) {
|
|
44
44
|
// Spec 32:62 — a Send completes once the source outbound queue
|
|
45
45
|
// accepts it; spec 05 — infrastructure send progress must not depend
|
|
46
46
|
// on the application turn. When the CALLER IS an application turn
|
|
@@ -53,17 +53,19 @@ class ZLinkBoundActorRelaySender {
|
|
|
53
53
|
// Non-turn callers (stream ingress relays) keep the waiting
|
|
54
54
|
// semantics so a held frame across a failed rebind still
|
|
55
55
|
// terminalizes to the caller.
|
|
56
|
-
void this.routes
|
|
56
|
+
void this.routes
|
|
57
|
+
.runAcceptedFrameWhenReady(actor.actorId, actor.bindingToken, () => this.relayAcceptedFrame(actor, payload, signal), signal)
|
|
58
|
+
.catch(() => undefined);
|
|
57
59
|
return { status: submission_result_1.ZLinkSubmitStatus.Submitted };
|
|
58
60
|
}
|
|
59
61
|
return this.routes.runAcceptedFrameWhenReady(actor.actorId, actor.bindingToken, () => this.relayAcceptedFrame(actor, payload, signal), signal);
|
|
60
62
|
}
|
|
61
63
|
async relayAcceptedFrame(actor, payload, signal, header, requestAdmission) {
|
|
62
|
-
const activeHeader = header ?? await this.currentHeader(actor);
|
|
64
|
+
const activeHeader = header ?? (await this.currentHeader(actor));
|
|
63
65
|
const started = await this.lifecycle.run(actor.actorId, async () => {
|
|
64
66
|
const completion = this.relayInsideLifecycle(actor, payload, signal, activeHeader, requestAdmission);
|
|
65
|
-
if (activeHeader.kind === protocol_1.ZLinkStreamMessageKind.Request
|
|
66
|
-
|
|
67
|
+
if (activeHeader.kind === protocol_1.ZLinkStreamMessageKind.Request &&
|
|
68
|
+
activeHeader.requestSeq !== undefined) {
|
|
67
69
|
// A routed REQUEST only needs this lane while its ordered submission
|
|
68
70
|
// is started. Its admission acknowledgement can depend on relocation
|
|
69
71
|
// route publication, and command 44 uses the same lane. Keeping the
|
|
@@ -94,7 +96,7 @@ class ZLinkBoundActorRelaySender {
|
|
|
94
96
|
return header;
|
|
95
97
|
}
|
|
96
98
|
async relayInsideLifecycle(actor, payload, signal, currentHeader, requestAdmission) {
|
|
97
|
-
const header = currentHeader ?? await this.currentHeader(actor);
|
|
99
|
+
const header = currentHeader ?? (await this.currentHeader(actor));
|
|
98
100
|
const held = requestAdmission?.beginSubmission(signal);
|
|
99
101
|
if (held !== undefined)
|
|
100
102
|
await held;
|
|
@@ -135,9 +137,9 @@ class ZLinkBoundActorRelaySender {
|
|
|
135
137
|
await this.routes.unbind(actor.actorId, route.context, actor.bindingToken);
|
|
136
138
|
return route;
|
|
137
139
|
});
|
|
138
|
-
if (unbindNative
|
|
139
|
-
|
|
140
|
-
|
|
140
|
+
if (unbindNative &&
|
|
141
|
+
detached.bindingToken === actor.bindingToken &&
|
|
142
|
+
detached.context.stream instanceof managed_stream_1.ZLinkManagedStream) {
|
|
141
143
|
await detached.context.stream.unbindActor(actor.actorId, this.options.actorBindTimeoutMs ?? 2000, signal);
|
|
142
144
|
}
|
|
143
145
|
await this.options.notifyDisconnected?.(actor, signal);
|
|
@@ -148,10 +150,10 @@ class ZLinkBoundActorRelaySender {
|
|
|
148
150
|
await Promise.allSettled(snapshot.map(async (actor) => {
|
|
149
151
|
const detached = await this.lifecycle.run(actor.actorId, async () => {
|
|
150
152
|
const route = await this.routes.route(actor.actorId);
|
|
151
|
-
if (route === undefined
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
if (route === undefined ||
|
|
154
|
+
route.context !== context ||
|
|
155
|
+
route.actor !== actor ||
|
|
156
|
+
route.bindingToken !== actor.bindingToken) {
|
|
155
157
|
return false;
|
|
156
158
|
}
|
|
157
159
|
// The transport is already closed, so remove its exact route before
|
|
@@ -114,7 +114,7 @@ class ZLinkBoundSessionService {
|
|
|
114
114
|
const header = runtime_message_1.ZLinkBufferMessage.fromOwned(Buffer.from(encodedBindHeader.buffer, encodedBindHeader.byteOffset, encodedBindHeader.byteLength));
|
|
115
115
|
const body = runtime_message_1.ZLinkBufferMessage.fromOwned(Buffer.alloc(0));
|
|
116
116
|
try {
|
|
117
|
-
if (!await stream.sendBoundActor(actorRef.actorId, [header, body], 0)) {
|
|
117
|
+
if (!(await stream.sendBoundActor(actorRef.actorId, [header, body], 0))) {
|
|
118
118
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorRouteNotFound, `Actor '${actorRef.actorId}' remote bound session bind relay failed.`);
|
|
119
119
|
}
|
|
120
120
|
}
|
|
@@ -183,14 +183,13 @@ function toBoundSessionSendActorRef(actor) {
|
|
|
183
183
|
}
|
|
184
184
|
function boundSessionSendFence(node, backendActor, actor) {
|
|
185
185
|
const internal = actor;
|
|
186
|
-
const ownerNodeGeneration = internal.ownerNodeGeneration
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|| ownerNodeGeneration <= 0n) {
|
|
186
|
+
const ownerNodeGeneration = internal.ownerNodeGeneration ?? node.actorNodeGeneration?.(backendActor);
|
|
187
|
+
if (internal.ownershipGeneration === undefined ||
|
|
188
|
+
internal.ownershipGeneration <= 0n ||
|
|
189
|
+
internal.ownerLeaseGeneration === undefined ||
|
|
190
|
+
internal.ownerLeaseGeneration <= 0n ||
|
|
191
|
+
ownerNodeGeneration === undefined ||
|
|
192
|
+
ownerNodeGeneration <= 0n) {
|
|
194
193
|
return undefined;
|
|
195
194
|
}
|
|
196
195
|
return Object.freeze({
|
|
@@ -40,8 +40,9 @@ class ZLinkStreamRuntimeManager {
|
|
|
40
40
|
applicationJobQueue;
|
|
41
41
|
constructor(options) {
|
|
42
42
|
this.options = options;
|
|
43
|
-
this.applicationJobQueue =
|
|
44
|
-
|
|
43
|
+
this.applicationJobQueue =
|
|
44
|
+
options.applicationJobQueue ??
|
|
45
|
+
new application_job_queue_1.ApplicationJobQueue((0, application_job_queue_1.resolveApplicationJobQueueConfiguration)());
|
|
45
46
|
}
|
|
46
47
|
start() {
|
|
47
48
|
if (this.options.registration.streamNodes.size === 0) {
|
|
@@ -75,14 +76,12 @@ class ZLinkStreamRuntimeManager {
|
|
|
75
76
|
if (actorDispatchEnabled) {
|
|
76
77
|
for (const [meshName, mesh] of this.options.registration.spotNodes) {
|
|
77
78
|
const isPrimaryMesh = meshName === applicationMeshName;
|
|
78
|
-
if (!isPrimaryMesh
|
|
79
|
-
&& mesh.objectRole !== 'client'
|
|
80
|
-
&& mesh.objectRole !== 'server')
|
|
79
|
+
if (!isPrimaryMesh && mesh.objectRole !== 'client' && mesh.objectRole !== 'server')
|
|
81
80
|
continue;
|
|
82
|
-
const meshNode = this.options.nativeMeshNodeForName?.(meshName)
|
|
83
|
-
|
|
84
|
-
const completions = this.options.meshCompletionsForName?.(meshName)
|
|
85
|
-
|
|
81
|
+
const meshNode = this.options.nativeMeshNodeForName?.(meshName) ??
|
|
82
|
+
(isPrimaryMesh ? nativeMeshNode : undefined);
|
|
83
|
+
const completions = this.options.meshCompletionsForName?.(meshName) ??
|
|
84
|
+
(isPrimaryMesh ? meshCompletions : undefined);
|
|
86
85
|
const createService = meshNode?.createStreamSessionService;
|
|
87
86
|
if (typeof createService !== 'function' || completions === undefined)
|
|
88
87
|
continue;
|
|
@@ -112,7 +111,7 @@ class ZLinkStreamRuntimeManager {
|
|
|
112
111
|
applicationJobQueue: this.applicationJobQueue,
|
|
113
112
|
nativeSessionService,
|
|
114
113
|
meshCompletions,
|
|
115
|
-
nativeSessionRouteForMesh: meshName => nativeSessionRoutes.get(meshName),
|
|
114
|
+
nativeSessionRouteForMesh: (meshName) => nativeSessionRoutes.get(meshName),
|
|
116
115
|
monitor,
|
|
117
116
|
bindingRuntime: this.options.bindingRuntime,
|
|
118
117
|
acceptNewSession: () => this.options.acceptNewSession?.(applicationMeshName) !== false,
|
|
@@ -131,7 +130,7 @@ class ZLinkStreamRuntimeManager {
|
|
|
131
130
|
socket,
|
|
132
131
|
monitor,
|
|
133
132
|
nativeSessionService,
|
|
134
|
-
nativeSessionServices: [...nativeSessionRoutes.values()].map(route => route.service)
|
|
133
|
+
nativeSessionServices: [...nativeSessionRoutes.values()].map((route) => route.service)
|
|
135
134
|
});
|
|
136
135
|
}
|
|
137
136
|
}
|
|
@@ -140,8 +139,8 @@ class ZLinkStreamRuntimeManager {
|
|
|
140
139
|
this.nodes.clear();
|
|
141
140
|
for (const node of nodes.reverse()) {
|
|
142
141
|
await node.runtime.dispose();
|
|
143
|
-
const nativeServices = node.nativeSessionServices
|
|
144
|
-
|
|
142
|
+
const nativeServices = node.nativeSessionServices ??
|
|
143
|
+
(node.nativeSessionService === undefined ? [] : [node.nativeSessionService]);
|
|
145
144
|
for (const service of nativeServices) {
|
|
146
145
|
service.shutdown(1000);
|
|
147
146
|
service.close();
|
|
@@ -167,9 +166,10 @@ class ZLinkStreamSessionRuntime extends stream_session_runtime_1.ZLinkStreamSess
|
|
|
167
166
|
// Spec 27 §4: a default-constructed binding runtime must still honor the
|
|
168
167
|
// process diagnostics level, so wire its Off gate to the runtime's
|
|
169
168
|
// dispatch-error flow tracer.
|
|
170
|
-
const bindingRuntime = options.bindingRuntime ??
|
|
171
|
-
|
|
172
|
-
|
|
169
|
+
const bindingRuntime = options.bindingRuntime ??
|
|
170
|
+
new ZLinkStreamBindingRuntime({
|
|
171
|
+
flowCreationEnabled: () => options.dispatchErrors?.flow.flowCreationEnabled() ?? true
|
|
172
|
+
});
|
|
173
173
|
super({
|
|
174
174
|
...options,
|
|
175
175
|
bindingRuntime
|
|
@@ -183,9 +183,10 @@ class ZLinkStreamSessionNodeRuntime extends stream_session_runtime_1.ZLinkStream
|
|
|
183
183
|
constructor(options) {
|
|
184
184
|
// Spec 27 §4: keep the default binding runtime's flow creation behind the
|
|
185
185
|
// process diagnostics Off gate (see ZLinkStreamSessionRuntime above).
|
|
186
|
-
const bindingRuntime = options.bindingRuntime ??
|
|
187
|
-
|
|
188
|
-
|
|
186
|
+
const bindingRuntime = options.bindingRuntime ??
|
|
187
|
+
new ZLinkStreamBindingRuntime({
|
|
188
|
+
flowCreationEnabled: () => options.dispatchErrors?.flow.flowCreationEnabled() ?? true
|
|
189
|
+
});
|
|
189
190
|
super({
|
|
190
191
|
...options,
|
|
191
192
|
bindingRuntime
|