@nice-code/action 0.18.0 → 0.19.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/README.md CHANGED
@@ -499,6 +499,35 @@ const server = serveChannel(runtime, appChannel, {
499
499
  On the connector side, list several transports in `connectChannel`'s `transports` (preference order) to
500
500
  get automatic fallback across carriers (e.g. secure WS, then plain HTTP).
501
501
 
502
+ ### Gating a transport until a precondition holds — `available`
503
+
504
+ A transport can declare an `available` predicate to opt **out** of selection until a runtime precondition
505
+ is met. While it returns `false`, the manager treats that transport as `unsupported` and falls through to
506
+ the next one in preference order — **without** opening its carrier or even computing its cache key. The
507
+ predicate is re-evaluated per action dispatch, so the transport switches on the moment the precondition
508
+ holds, with no reconnect.
509
+
510
+ ```ts
511
+ // Prefer the secure socket, but only once a session id exists; fall back to HTTP meanwhile.
512
+ const wsTransport = secureTransport({
513
+ channel, runtime, storageAdapter, securityLevel,
514
+ available: () => sessionId != null,
515
+ carrier: wsCarrier(`${url}/ws`, {
516
+ // Only ever called once `available` passes, so no need for a placeholder cache key.
517
+ getTransportCacheKey: () => [sessionId],
518
+ }),
519
+ });
520
+
521
+ connectChannel(runtime, serverCoord, {
522
+ transports: [wsTransport, httpTransport], // ws preferred; HTTP serves while ws is gated off
523
+ });
524
+ ```
525
+
526
+ Flipping `available` back to `false` only **skips selection** — it does not tear down a live carrier
527
+ (socket closure stays owned by the carrier's own disconnect handling), and a still-cached connection is
528
+ reused with no reconnect once it becomes available again. Omit `available` for an always-available
529
+ transport (the default).
530
+
502
531
  ---
503
532
 
504
533
  ## React Query integration
@@ -1,4 +1,4 @@
1
- import { _ as TActionProgress, jr as IRuntimeCoordinate } from "./ActionPayload.types-BchJrBIX.mjs";
1
+ import { Ir as IRuntimeCoordinate, _ as TActionProgress } from "./ActionPayload.types-CdHOGGZK.cjs";
2
2
  //#region ../nice-devtools-shared/src/components/PanelChrome.d.ts
3
3
  /** Where a devtools panel is docked. */
4
4
  type TDevtoolsPosition = "dock-bottom" | "dock-top" | "dock-left" | "dock-right";
@@ -76,4 +76,4 @@ declare class ActionDevtoolsCore {
76
76
  }
77
77
  //#endregion
78
78
  export { TDevtoolsActionStatus as a, IDevtoolsObservableDomain as i, IActionDevtoolsCoreOptions as n, TDevtoolsListener as o, IDevtoolsActionEntry as r, TDevtoolsPosition as s, ActionDevtoolsCore as t };
79
- //# sourceMappingURL=ActionDevtoolsCore-C5XrQI1K.d.mts.map
79
+ //# sourceMappingURL=ActionDevtoolsCore-CCZXQBAo.d.cts.map
@@ -1,4 +1,4 @@
1
- import { _ as TActionProgress, jr as IRuntimeCoordinate } from "./ActionPayload.types-snDlSIF-.cjs";
1
+ import { Ir as IRuntimeCoordinate, _ as TActionProgress } from "./ActionPayload.types-Bmkzw2df.mjs";
2
2
  //#region ../nice-devtools-shared/src/components/PanelChrome.d.ts
3
3
  /** Where a devtools panel is docked. */
4
4
  type TDevtoolsPosition = "dock-bottom" | "dock-top" | "dock-left" | "dock-right";
@@ -76,4 +76,4 @@ declare class ActionDevtoolsCore {
76
76
  }
77
77
  //#endregion
78
78
  export { TDevtoolsActionStatus as a, IDevtoolsObservableDomain as i, IActionDevtoolsCoreOptions as n, TDevtoolsListener as o, IDevtoolsActionEntry as r, TDevtoolsPosition as s, ActionDevtoolsCore as t };
79
- //# sourceMappingURL=ActionDevtoolsCore-Dd1qJAwK.d.cts.map
79
+ //# sourceMappingURL=ActionDevtoolsCore-bjYQ8O2_.d.mts.map
@@ -1027,6 +1027,13 @@ declare abstract class TransportConnection<T extends ETransportShape = ETranspor
1027
1027
  protected _finalizeReady(readyData: RD): IActionTransportReadyData_Methods | Promise<IActionTransportReadyData_Methods>;
1028
1028
  protected _getCacheKey(input: RP): string | null;
1029
1029
  getCacheKey(input: RP): string | null;
1030
+ /**
1031
+ * Whether this transport can serve the given action right now. Consulted by the manager before
1032
+ * cache-key resolution and `getTransport`; a `false` result skips this transport (treated as
1033
+ * `unsupported`) and the manager falls through to the next in preference order. Defaults to `true`
1034
+ * when the transport declares no gate.
1035
+ */
1036
+ isAvailable(input: RP): boolean;
1030
1037
  getTransport(input: RP): TTransportStatusInfo<IActionTransportReadyData_Methods>;
1031
1038
  protected _processTransportStatus(input: RP): TTransportStatusInfo<IActionTransportReadyData_Methods>;
1032
1039
  /** Await carrier readiness, then finalize (possibly running a handshake) into the live methods. */
@@ -1174,6 +1181,15 @@ interface IActionTransportResolvers {
1174
1181
  type TGetTransportFn<IN extends ITransportRouteActionParams, READY extends IActionTransportReadyData_Base> = (input: IN) => TTransportStatusInfo_GetTransport_Output<READY>;
1175
1182
  interface IActionTransportInitialized<IN extends ITransportRouteActionParams, READY extends IActionTransportReadyData_Base> {
1176
1183
  getTransportCacheKey?: (input: IN) => string[];
1184
+ /**
1185
+ * Optional availability gate, consulted by {@link ConnectionTransportManager} *before* cache-key
1186
+ * resolution and `getTransport`. When it returns `false`, this transport is treated as `unsupported`
1187
+ * for that action and the manager falls through to the next transport in preference order — without
1188
+ * opening the carrier or computing its cache key. Re-evaluated per action dispatch, so a transport can
1189
+ * become available later (e.g. once a session/connection precondition is met) with no reconnect. Omit =
1190
+ * always available.
1191
+ */
1192
+ isAvailable?: (input: IN) => boolean;
1177
1193
  getTransport: TGetTransportFn<IN, READY>;
1178
1194
  }
1179
1195
  interface IActionTransportDef<TYPE extends ETransportShape, INIT extends IActionTransportInitialized<any, any>> {
@@ -2735,6 +2751,12 @@ interface IExchangeTransportOptions {
2735
2751
  updateRunConfig?: TUpdateActionRunConfig;
2736
2752
  /** Keys identifying a reusable session, so one carrier is shared across actions to the same peer. */
2737
2753
  getTransportCacheKey?: (input: ITransportRouteActionParams) => string[];
2754
+ /**
2755
+ * Optional availability gate. When it returns `false`, the manager skips this transport for that action
2756
+ * (reporting `unsupported`) and falls through to the next — without opening the carrier or computing its
2757
+ * cache key. Re-evaluated per dispatch, so the transport can become available later with no reconnect.
2758
+ */
2759
+ available?: (input: ITransportRouteActionParams) => boolean;
2738
2760
  /** Short label for the devtools chip (defaults to "exchange"). */
2739
2761
  label?: string;
2740
2762
  getRouteInfo?: (input: ITransportRouteActionParams) => ITransportRouteInfo;
@@ -2841,6 +2863,12 @@ interface ILinkTransportOptions {
2841
2863
  updateRunConfig?: TUpdateActionRunConfig;
2842
2864
  /** Keys identifying a reusable channel, so one carrier is shared across actions to the same peer. */
2843
2865
  getTransportCacheKey?: (input: ITransportRouteActionParams) => string[];
2866
+ /**
2867
+ * Optional availability gate. When it returns `false`, the manager skips this transport for that action
2868
+ * (reporting `unsupported`) and falls through to the next — without opening the carrier or computing its
2869
+ * cache key. Re-evaluated per dispatch, so the transport can become available later with no reconnect.
2870
+ */
2871
+ available?: (input: ITransportRouteActionParams) => boolean;
2844
2872
  /** Short label for the devtools chip (defaults to "link"). */
2845
2873
  label?: string;
2846
2874
  getRouteInfo?: (input: ITransportRouteActionParams) => ITransportRouteInfo;
@@ -2875,6 +2903,13 @@ interface IPlainTransportOptions {
2875
2903
  formatMessage?: TLinkFormatMessage;
2876
2904
  /** Per-channel codec factory for stateful duplex codecs (e.g. the binary session). */
2877
2905
  createFormatMessage?: () => TLinkFormatMessage;
2906
+ /**
2907
+ * Optional availability gate. When it returns `false`, this transport reports as `unsupported` for that
2908
+ * action and the manager falls through to the next transport in preference order — without opening the
2909
+ * carrier or computing its cache key. Re-evaluated per dispatch, so a transport can become available
2910
+ * later (e.g. once a session/connection precondition holds) with no reconnect. Omit = always available.
2911
+ */
2912
+ available?: (input: ITransportRouteActionParams) => boolean;
2878
2913
  updateRunConfig?: TUpdateActionRunConfig;
2879
2914
  /** Override the devtools chip label (defaults to the carrier's `carrierLabel`). */
2880
2915
  label?: string;
@@ -2894,6 +2929,55 @@ declare function plainTransport(options: IPlainTransportOptions & {
2894
2929
  carrier: IDuplexCarrierSource;
2895
2930
  }): LinkTransport;
2896
2931
  //#endregion
2932
+ //#region src/ActionRuntime/Transport/SecureSession/exchangeProtocol.d.ts
2933
+ /**
2934
+ * The application-level envelope for secure action traffic over an {@link IExchangeCarrier} (HTTP). An
2935
+ * exchange carrier only moves one request frame → one reply frame with no unsolicited push, so the
2936
+ * handshake and the per-action token + crypto all ride in this envelope (a JSON string body) rather than
2937
+ * on a persistent channel. The three security levels share it:
2938
+ *
2939
+ * - `none` — no handshake, no token: an `act` envelope carries the plaintext wire both ways.
2940
+ * - `authenticated` — a one-time handshake yields a session `token`; each later `act` carries it +
2941
+ * the plaintext wire.
2942
+ * - `encrypted` — same, but the wire is AES-GCM ciphertext, base64 in the `c` field.
2943
+ *
2944
+ * The handshake runs as two `hs` exchanges (hello→welcome, prove→accept) correlated by a client-chosen
2945
+ * `hsid`, since stateless requests can't rely on channel ordering. The `accept` reply carries the token.
2946
+ */
2947
+ type TWireJson = TActionPayload_Any_JsonObject<any, any>;
2948
+ /** Connector → acceptor request envelope. */
2949
+ type TExchangeRequest = {
2950
+ k: "hs";
2951
+ hsid: string;
2952
+ m: string;
2953
+ } | {
2954
+ k: "act";
2955
+ t?: string;
2956
+ w: TWireJson;
2957
+ } | {
2958
+ k: "act";
2959
+ t?: string;
2960
+ c: string;
2961
+ };
2962
+ /** Acceptor → connector reply envelope. */
2963
+ type TExchangeReply = {
2964
+ k: "hs";
2965
+ m: string;
2966
+ t?: string;
2967
+ } | {
2968
+ k: "act";
2969
+ w: TWireJson;
2970
+ } | {
2971
+ k: "act";
2972
+ c: string;
2973
+ } | {
2974
+ k: "err";
2975
+ message: string;
2976
+ };
2977
+ declare function encodeExchange(envelope: TExchangeRequest | TExchangeReply): string;
2978
+ declare function decodeExchangeRequest(raw: string): TExchangeRequest | undefined;
2979
+ declare function decodeExchangeReply(raw: string): TExchangeReply | undefined;
2980
+ //#endregion
2897
2981
  //#region src/ActionRuntime/Transport/secureTransport.d.ts
2898
2982
  interface ISecureTransportOptions {
2899
2983
  /** The shared channel identity (per-connection codec + dictionary version) — same one both ends use. */
@@ -2904,6 +2988,13 @@ interface ISecureTransportOptions {
2904
2988
  storageAdapter: StorageAdapter;
2905
2989
  /** The level this client requests; the peer must allow it. */
2906
2990
  securityLevel: ESecurityLevel;
2991
+ /**
2992
+ * Optional availability gate. When it returns `false`, this transport reports as `unsupported` for that
2993
+ * action and the manager falls through to the next transport in preference order — without opening the
2994
+ * carrier or computing its cache key. Re-evaluated per dispatch, so a transport can become available
2995
+ * later (e.g. once a session/connection precondition holds) with no reconnect. Omit = always available.
2996
+ */
2997
+ available?: (input: ITransportRouteActionParams) => boolean;
2907
2998
  /**
2908
2999
  * How to reach the peer. A duplex carrier (`wsCarrier(url)`, `rtcCarrier(dc)`,
2909
3000
  * `inMemoryCarrier().carrier`) runs the push-capable session; an exchange carrier (`httpCarrier(...)`)
@@ -3151,5 +3242,5 @@ interface IActionPayload_Result_JsonObject<DOM extends IActionDomain = IActionDo
3151
3242
  type TActionPayload_Any_Instance<DOM extends IActionDomain = IActionDomain, ID extends keyof DOM["actionSchema"] & string = keyof DOM["actionSchema"] & string> = ActionPayload_Request<DOM, ID> | ActionPayload_Result<DOM, ID> | ActionPayload_Progress<DOM, ID>;
3152
3243
  type TActionPayload_Any_JsonObject<DOM extends IActionDomain = IActionDomain, ID extends keyof DOM["actionSchema"] & string = keyof DOM["actionSchema"] & string> = IActionPayload_Request_JsonObject<DOM, ID> | IActionPayload_Progress_JsonObject<DOM, ID> | IActionPayload_Result_JsonObject<DOM, ID>;
3153
3244
  //#endregion
3154
- export { EErrId_NiceTransport_WebSocket as $, IClientVerifyKeyResolver as $n, TTransportedValue as $r, IAcceptorConnectionBinding as $t, ILinkTransportOptions as A, ITransportStatusInfo_Ready as An, ActionPayload_Result as Ar, IDuplexCarrier as At, IActionFrameCryptoConfig as B, TSendActionDataMethod as Bn, TActionDomainChildDef as Br, IActionChannel as Bt, decodeActionFrame as C, ITransportMethod_SendActionData_Input as Cn, IRunningActionUpdate_Abort as Cr, IServeChannelOptions as Ct, secureTransport as D, ITransportStatusInfo_Base as Dn, TRunningActionUpdate as Dr, IExchangeAcceptorCarrier as Dt, ISecureTransportOptions as E, ITransportRouteInfo as En, IRunningActionUpdate_Success as Er, IDuplexAcceptorCarrier as Et, err_nice_transport as F, TOnResolveAnyIncomingActionData_Json as Fn, TRuntimeCoordinateEnvId as Fr, TFrame$1 as Ft, TCarrierFetch as G, TTransportStatusInfo_GetTransport_Output as Gn, TPossibleDomainId as Gr, acceptChannelConnections as Gt, createBinaryWireAdapter as H, TTransportCache as Hn, TDomainActionId as Hr, TChannelAcceptorCases as Ht, ExchangeTransport as I, TOnResolveIncomingRequest as In, TRuntimeCoordinateStringId as Ir, IDuplexConnectionRouter as It, httpAcceptorCarrier as J, Transport as Jn, EActionResponseMode as Jr, ISecureChannel as Jt, httpCarrier as K, TUpdateActionRunConfig as Kn, TPossibleDomainIdList as Kr, connectChannel as Kt, IExchangeTransportOptions as L, TOnResolveIncomingRequestJson as Ln, IActionDomain as Lr, IHibernatableWsServerAdapterOptions as Lt, IActionTransportReadyData_Link as M, IUpdateActionRunConfig_Output as Mn, IRuntimeCoordinateSpecifics as Mr, IExchangeCarrier as Mt, TLinkFormatMessage as N, TGetTransportFn as Nn, IRuntimeFullCoordinates as Nr, IExchangeCarrierSource as Nt, IPlainTransportOptions as O, ITransportStatusInfo_Failed as On, TRunningActionUpdateFinished as Or, TAcceptorCarrier as Ot, EErrId_NiceTransport as P, TOnResolveAnyIncomingActionData as Pn, RuntimeCoordinate as Pr, TCarrier as Pt, wsAcceptorCarrier as Q, IClientVerifyKeyResolveInput as Qn, TActionSerializationDefinition as Qr, AcceptorHandler as Qt, IActionTransportReadyData_Exchange as R, TOnResolveIncomingResponse as Rn, IActionDomainChildOptions as Rr, createHibernatableWsServerAdapter as Rt, IActionFrameDecoder as S, ITransportDispatchAction as Sn, ERunningActionUpdateType as Sr, IChannelServer as St, err_nice_action as T, ITransportRouteClientParams as Tn, IRunningActionUpdate_Started as Tr, IAcceptorHibernation as Tt, IHttpCarrierOptions as U, TTransportInitializationFinishedInfo as Un, TInferInputFromSchema as Ur, TChannelPushHandlers as Ut, createActionFrameCrypto as V, TSendReturnDataMethod as Vn, TActionDomainSchema as Vr, IConnectChannelOptions as Vt, IHttpCarrierRequest as W, TTransportStatusInfo as Wn, TInferOutputFromSchema as Wr, acceptChannel as Wt, wsCarrier as X, ESecurityLevel as Xn, actionSchema as Xr, IBinaryWireSessionOptions as Xt, IWsCarrierOptions as Y, EHandshakeMessageType as Yn, TInferActionError as Yr, defineSecureChannel as Yt, IWsAcceptorCarrierOptions as Z, IClientHandshakeConfig as Zn, TActionSchemaOptions as Zr, createBinaryWireSessionFactory as Zt, TActionProgress as _, IActionTransportReady as _n, ActionPayload_Request as _r, IActionFetchHandlerOptions as _t, IActionPayload_Data_Base as a, IActionWireFormat as an, createInMemoryTofuVerifyKeyResolver as ar, IInMemoryCarrier as at, isActionPayload_Request_JsonObject as b, IActionTransportResolvers as bn, ERunningActionFinishedType as br, IExchangeAcceptorConfig as bt, IActionPayload_Request_JsonObject as c, ActionDomain as cn, decodeHandshakeMessage as cr, IInMemoryServerEndpoint as ct, IActionProgress_Custom as d, ConnectorHandler as dn, PeerLinkHandler as dr, ConnectionStateStore as dt, IAcceptorHandlerOptions as en, IHandshakeEncryptionKeyMaterial as er, err_nice_transport_ws as et, IActionProgress_None as f, createConnectorHandler as fn, ActionLocalHandler as fr, IConnectionAttachment as ft, TActionPayload_Any_JsonObject as g, IActionTransportInitialized as gn, ActionPayload_Progress as gr, createSecureAcceptorHandler as gt, TActionPayload_Any_Instance as h, IActionTransportDef as hn, RunningAction as hr, ISecureAcceptorHandlerOptions as ht, IActionPayload_Base_JsonObject as i, createAcceptorHandler as in, createClientHandshake as ir, rtcDataChannelByteChannel as it, LinkTransport as j, ITransportStatusInfo_Unsupported as jn, IRuntimeCoordinate as jr, IDuplexCarrierSource as jt, plainTransport as k, ITransportStatusInfo_Initializing as kn, TRunningActionUpdateListener as kr, isExchangeAcceptorCarrier as kt, IActionPayload_Result as l, ActionRootDomain as ln, encodeHandshakeMessage as lr, createInMemoryChannelPair as lt, IActionRouteItemHandler as m, ETransportStatus as mn, MaybePromise as mr, createConnectionStateStore as mt, EActionProgressType as n, TActionChannelFormatMessage as nn, IServerHandshakeConfig as nr, rtcCarrier as nt, IActionPayload_Progress as o, createActionRootDomain as on, createServerHandshake as or, inMemoryCarrier as ot, IActionProgress_Percentage as p, ETransportShape as pn, createLocalHandler as pr, IConnectionStateStoreOptions as pt, IHttpAcceptorCarrierOptions as q, ITransportConnectionContext as qn, ActionSchema as qr, defineChannel as qt, IActionPayload_Base as r, TActionConnectionEncoding as rn, THandshakeMessage as rr, IRtcDataChannelLike as rt, IActionPayload_Progress_JsonObject as s, ActionCore as sn, createStorageTofuVerifyKeyResolver as sr, IInMemoryChannelPair as st, EActionPayloadType as t, TAcceptorConnectionCaseFn as tn, IHandshakeResult as tr, IRtcCarrierOptions as tt, IActionPayload_Result_JsonObject as u, ActionRuntime as un, runtimeLinkId as ur, err_nice_external_client as ut, TActionResultOutcome as v, IActionTransportReadyData_Base as vn, IActionCore as vr, createActionFetchHandler as vt, EErrId_NiceAction as w, ITransportRouteActionParams as wn, IRunningActionUpdate_Progress as wr, serveChannel as wt, isActionPayload_Any_JsonObject as x, ISecureClientConfig as xn, ERunningActionState as xr, IExchangeAcceptorSecurity as xt, isActionPayload_Result_JsonObject as y, IActionTransportReadyData_Methods as yn, IActionCore_JsonObject as yr, ExchangeAcceptor as yt, IActionFrameCrypto as z, TOnResolveIncomingResponseJson as zn, IActionRootDomain as zr, IAcceptChannelOptions as zt };
3155
- //# sourceMappingURL=ActionPayload.types-BchJrBIX.d.mts.map
3245
+ export { httpAcceptorCarrier as $, Transport as $n, EActionResponseMode as $r, ISecureChannel as $t, decodeExchangeReply as A, ITransportRouteClientParams as An, IRunningActionUpdate_Started as Ar, IAcceptorHibernation as At, err_nice_transport as B, TOnResolveAnyIncomingActionData_Json as Bn, TRuntimeCoordinateEnvId as Br, TFrame$1 as Bt, decodeActionFrame as C, IActionTransportReadyData_Base as Cn, IActionCore as Cr, createActionFetchHandler as Ct, secureTransport as D, ITransportDispatchAction as Dn, ERunningActionUpdateType as Dr, IChannelServer as Dt, ISecureTransportOptions as E, ISecureClientConfig as En, ERunningActionState as Er, IExchangeAcceptorSecurity as Et, ILinkTransportOptions as F, ITransportStatusInfo_Ready as Fn, ActionPayload_Result as Fr, IDuplexCarrier as Ft, IActionFrameCryptoConfig as G, TSendActionDataMethod as Gn, TActionDomainChildDef as Gr, IActionChannel as Gt, IExchangeTransportOptions as H, TOnResolveIncomingRequestJson as Hn, IActionDomain as Hr, IHibernatableWsServerAdapterOptions as Ht, LinkTransport as I, ITransportStatusInfo_Unsupported as In, IRuntimeCoordinate as Ir, IDuplexCarrierSource as It, IHttpCarrierOptions as J, TTransportInitializationFinishedInfo as Jn, TInferInputFromSchema as Jr, TChannelPushHandlers as Jt, createActionFrameCrypto as K, TSendReturnDataMethod as Kn, TActionDomainSchema as Kr, IConnectChannelOptions as Kt, IActionTransportReadyData_Link as L, IUpdateActionRunConfig_Output as Ln, IRuntimeCoordinateSpecifics as Lr, IExchangeCarrier as Lt, encodeExchange as M, ITransportStatusInfo_Base as Mn, TRunningActionUpdate as Mr, IExchangeAcceptorCarrier as Mt, IPlainTransportOptions as N, ITransportStatusInfo_Failed as Nn, TRunningActionUpdateFinished as Nr, TAcceptorCarrier as Nt, TExchangeReply as O, ITransportMethod_SendActionData_Input as On, IRunningActionUpdate_Abort as Or, IServeChannelOptions as Ot, plainTransport as P, ITransportStatusInfo_Initializing as Pn, TRunningActionUpdateListener as Pr, isExchangeAcceptorCarrier as Pt, IHttpAcceptorCarrierOptions as Q, ITransportConnectionContext as Qn, ActionSchema as Qr, defineChannel as Qt, TLinkFormatMessage as R, TGetTransportFn as Rn, IRuntimeFullCoordinates as Rr, IExchangeCarrierSource as Rt, IActionFrameDecoder as S, IActionTransportReady as Sn, ActionPayload_Request as Sr, IActionFetchHandlerOptions as St, err_nice_action as T, IActionTransportResolvers as Tn, ERunningActionFinishedType as Tr, IExchangeAcceptorConfig as Tt, IActionTransportReadyData_Exchange as U, TOnResolveIncomingResponse as Un, IActionDomainChildOptions as Ur, createHibernatableWsServerAdapter as Ut, ExchangeTransport as V, TOnResolveIncomingRequest as Vn, TRuntimeCoordinateStringId as Vr, IDuplexConnectionRouter as Vt, IActionFrameCrypto as W, TOnResolveIncomingResponseJson as Wn, IActionRootDomain as Wr, IAcceptChannelOptions as Wt, TCarrierFetch as X, TTransportStatusInfo_GetTransport_Output as Xn, TPossibleDomainId as Xr, acceptChannelConnections as Xt, IHttpCarrierRequest as Y, TTransportStatusInfo as Yn, TInferOutputFromSchema as Yr, acceptChannel as Yt, httpCarrier as Z, TUpdateActionRunConfig as Zn, TPossibleDomainIdList as Zr, connectChannel as Zt, TActionProgress as _, createConnectorHandler as _n, ActionLocalHandler as _r, IConnectionAttachment as _t, IActionPayload_Data_Base as a, IAcceptorHandlerOptions as an, IHandshakeEncryptionKeyMaterial as ar, err_nice_transport_ws as at, isActionPayload_Request_JsonObject as b, IActionTransportDef as bn, RunningAction as br, ISecureAcceptorHandlerOptions as bt, IActionPayload_Request_JsonObject as c, TActionConnectionEncoding as cn, THandshakeMessage as cr, IRtcDataChannelLike as ct, IActionProgress_Custom as d, createActionRootDomain as dn, createServerHandshake as dr, inMemoryCarrier as dt, TInferActionError as ei, defineSecureChannel as en, EHandshakeMessageType as er, IWsCarrierOptions as et, IActionProgress_None as f, ActionCore as fn, createStorageTofuVerifyKeyResolver as fr, IInMemoryChannelPair as ft, TActionPayload_Any_JsonObject as g, ConnectorHandler as gn, PeerLinkHandler as gr, ConnectionStateStore as gt, TActionPayload_Any_Instance as h, ActionRuntime as hn, runtimeLinkId as hr, err_nice_external_client as ht, IActionPayload_Base_JsonObject as i, TTransportedValue as ii, IAcceptorConnectionBinding as in, IClientVerifyKeyResolver as ir, EErrId_NiceTransport_WebSocket as it, decodeExchangeRequest as j, ITransportRouteInfo as jn, IRunningActionUpdate_Success as jr, IDuplexAcceptorCarrier as jt, TExchangeRequest as k, ITransportRouteActionParams as kn, IRunningActionUpdate_Progress as kr, serveChannel as kt, IActionPayload_Result as l, createAcceptorHandler as ln, createClientHandshake as lr, rtcDataChannelByteChannel as lt, IActionRouteItemHandler as m, ActionRootDomain as mn, encodeHandshakeMessage as mr, createInMemoryChannelPair as mt, EActionProgressType as n, TActionSchemaOptions as ni, createBinaryWireSessionFactory as nn, IClientHandshakeConfig as nr, IWsAcceptorCarrierOptions as nt, IActionPayload_Progress as o, TAcceptorConnectionCaseFn as on, IHandshakeResult as or, IRtcCarrierOptions as ot, IActionProgress_Percentage as p, ActionDomain as pn, decodeHandshakeMessage as pr, IInMemoryServerEndpoint as pt, createBinaryWireAdapter as q, TTransportCache as qn, TDomainActionId as qr, TChannelAcceptorCases as qt, IActionPayload_Base as r, TActionSerializationDefinition as ri, AcceptorHandler as rn, IClientVerifyKeyResolveInput as rr, wsAcceptorCarrier as rt, IActionPayload_Progress_JsonObject as s, TActionChannelFormatMessage as sn, IServerHandshakeConfig as sr, rtcCarrier as st, EActionPayloadType as t, actionSchema as ti, IBinaryWireSessionOptions as tn, ESecurityLevel as tr, wsCarrier as tt, IActionPayload_Result_JsonObject as u, IActionWireFormat as un, createInMemoryTofuVerifyKeyResolver as ur, IInMemoryCarrier as ut, TActionResultOutcome as v, ETransportShape as vn, createLocalHandler as vr, IConnectionStateStoreOptions as vt, EErrId_NiceAction as w, IActionTransportReadyData_Methods as wn, IActionCore_JsonObject as wr, ExchangeAcceptor as wt, isActionPayload_Any_JsonObject as x, IActionTransportInitialized as xn, ActionPayload_Progress as xr, createSecureAcceptorHandler as xt, isActionPayload_Result_JsonObject as y, ETransportStatus as yn, MaybePromise as yr, createConnectionStateStore as yt, EErrId_NiceTransport as z, TOnResolveAnyIncomingActionData as zn, RuntimeCoordinate as zr, TCarrier as zt };
3246
+ //# sourceMappingURL=ActionPayload.types-Bmkzw2df.d.mts.map
@@ -1027,6 +1027,13 @@ declare abstract class TransportConnection<T extends ETransportShape = ETranspor
1027
1027
  protected _finalizeReady(readyData: RD): IActionTransportReadyData_Methods | Promise<IActionTransportReadyData_Methods>;
1028
1028
  protected _getCacheKey(input: RP): string | null;
1029
1029
  getCacheKey(input: RP): string | null;
1030
+ /**
1031
+ * Whether this transport can serve the given action right now. Consulted by the manager before
1032
+ * cache-key resolution and `getTransport`; a `false` result skips this transport (treated as
1033
+ * `unsupported`) and the manager falls through to the next in preference order. Defaults to `true`
1034
+ * when the transport declares no gate.
1035
+ */
1036
+ isAvailable(input: RP): boolean;
1030
1037
  getTransport(input: RP): TTransportStatusInfo<IActionTransportReadyData_Methods>;
1031
1038
  protected _processTransportStatus(input: RP): TTransportStatusInfo<IActionTransportReadyData_Methods>;
1032
1039
  /** Await carrier readiness, then finalize (possibly running a handshake) into the live methods. */
@@ -1174,6 +1181,15 @@ interface IActionTransportResolvers {
1174
1181
  type TGetTransportFn<IN extends ITransportRouteActionParams, READY extends IActionTransportReadyData_Base> = (input: IN) => TTransportStatusInfo_GetTransport_Output<READY>;
1175
1182
  interface IActionTransportInitialized<IN extends ITransportRouteActionParams, READY extends IActionTransportReadyData_Base> {
1176
1183
  getTransportCacheKey?: (input: IN) => string[];
1184
+ /**
1185
+ * Optional availability gate, consulted by {@link ConnectionTransportManager} *before* cache-key
1186
+ * resolution and `getTransport`. When it returns `false`, this transport is treated as `unsupported`
1187
+ * for that action and the manager falls through to the next transport in preference order — without
1188
+ * opening the carrier or computing its cache key. Re-evaluated per action dispatch, so a transport can
1189
+ * become available later (e.g. once a session/connection precondition is met) with no reconnect. Omit =
1190
+ * always available.
1191
+ */
1192
+ isAvailable?: (input: IN) => boolean;
1177
1193
  getTransport: TGetTransportFn<IN, READY>;
1178
1194
  }
1179
1195
  interface IActionTransportDef<TYPE extends ETransportShape, INIT extends IActionTransportInitialized<any, any>> {
@@ -2735,6 +2751,12 @@ interface IExchangeTransportOptions {
2735
2751
  updateRunConfig?: TUpdateActionRunConfig;
2736
2752
  /** Keys identifying a reusable session, so one carrier is shared across actions to the same peer. */
2737
2753
  getTransportCacheKey?: (input: ITransportRouteActionParams) => string[];
2754
+ /**
2755
+ * Optional availability gate. When it returns `false`, the manager skips this transport for that action
2756
+ * (reporting `unsupported`) and falls through to the next — without opening the carrier or computing its
2757
+ * cache key. Re-evaluated per dispatch, so the transport can become available later with no reconnect.
2758
+ */
2759
+ available?: (input: ITransportRouteActionParams) => boolean;
2738
2760
  /** Short label for the devtools chip (defaults to "exchange"). */
2739
2761
  label?: string;
2740
2762
  getRouteInfo?: (input: ITransportRouteActionParams) => ITransportRouteInfo;
@@ -2841,6 +2863,12 @@ interface ILinkTransportOptions {
2841
2863
  updateRunConfig?: TUpdateActionRunConfig;
2842
2864
  /** Keys identifying a reusable channel, so one carrier is shared across actions to the same peer. */
2843
2865
  getTransportCacheKey?: (input: ITransportRouteActionParams) => string[];
2866
+ /**
2867
+ * Optional availability gate. When it returns `false`, the manager skips this transport for that action
2868
+ * (reporting `unsupported`) and falls through to the next — without opening the carrier or computing its
2869
+ * cache key. Re-evaluated per dispatch, so the transport can become available later with no reconnect.
2870
+ */
2871
+ available?: (input: ITransportRouteActionParams) => boolean;
2844
2872
  /** Short label for the devtools chip (defaults to "link"). */
2845
2873
  label?: string;
2846
2874
  getRouteInfo?: (input: ITransportRouteActionParams) => ITransportRouteInfo;
@@ -2875,6 +2903,13 @@ interface IPlainTransportOptions {
2875
2903
  formatMessage?: TLinkFormatMessage;
2876
2904
  /** Per-channel codec factory for stateful duplex codecs (e.g. the binary session). */
2877
2905
  createFormatMessage?: () => TLinkFormatMessage;
2906
+ /**
2907
+ * Optional availability gate. When it returns `false`, this transport reports as `unsupported` for that
2908
+ * action and the manager falls through to the next transport in preference order — without opening the
2909
+ * carrier or computing its cache key. Re-evaluated per dispatch, so a transport can become available
2910
+ * later (e.g. once a session/connection precondition holds) with no reconnect. Omit = always available.
2911
+ */
2912
+ available?: (input: ITransportRouteActionParams) => boolean;
2878
2913
  updateRunConfig?: TUpdateActionRunConfig;
2879
2914
  /** Override the devtools chip label (defaults to the carrier's `carrierLabel`). */
2880
2915
  label?: string;
@@ -2894,6 +2929,55 @@ declare function plainTransport(options: IPlainTransportOptions & {
2894
2929
  carrier: IDuplexCarrierSource;
2895
2930
  }): LinkTransport;
2896
2931
  //#endregion
2932
+ //#region src/ActionRuntime/Transport/SecureSession/exchangeProtocol.d.ts
2933
+ /**
2934
+ * The application-level envelope for secure action traffic over an {@link IExchangeCarrier} (HTTP). An
2935
+ * exchange carrier only moves one request frame → one reply frame with no unsolicited push, so the
2936
+ * handshake and the per-action token + crypto all ride in this envelope (a JSON string body) rather than
2937
+ * on a persistent channel. The three security levels share it:
2938
+ *
2939
+ * - `none` — no handshake, no token: an `act` envelope carries the plaintext wire both ways.
2940
+ * - `authenticated` — a one-time handshake yields a session `token`; each later `act` carries it +
2941
+ * the plaintext wire.
2942
+ * - `encrypted` — same, but the wire is AES-GCM ciphertext, base64 in the `c` field.
2943
+ *
2944
+ * The handshake runs as two `hs` exchanges (hello→welcome, prove→accept) correlated by a client-chosen
2945
+ * `hsid`, since stateless requests can't rely on channel ordering. The `accept` reply carries the token.
2946
+ */
2947
+ type TWireJson = TActionPayload_Any_JsonObject<any, any>;
2948
+ /** Connector → acceptor request envelope. */
2949
+ type TExchangeRequest = {
2950
+ k: "hs";
2951
+ hsid: string;
2952
+ m: string;
2953
+ } | {
2954
+ k: "act";
2955
+ t?: string;
2956
+ w: TWireJson;
2957
+ } | {
2958
+ k: "act";
2959
+ t?: string;
2960
+ c: string;
2961
+ };
2962
+ /** Acceptor → connector reply envelope. */
2963
+ type TExchangeReply = {
2964
+ k: "hs";
2965
+ m: string;
2966
+ t?: string;
2967
+ } | {
2968
+ k: "act";
2969
+ w: TWireJson;
2970
+ } | {
2971
+ k: "act";
2972
+ c: string;
2973
+ } | {
2974
+ k: "err";
2975
+ message: string;
2976
+ };
2977
+ declare function encodeExchange(envelope: TExchangeRequest | TExchangeReply): string;
2978
+ declare function decodeExchangeRequest(raw: string): TExchangeRequest | undefined;
2979
+ declare function decodeExchangeReply(raw: string): TExchangeReply | undefined;
2980
+ //#endregion
2897
2981
  //#region src/ActionRuntime/Transport/secureTransport.d.ts
2898
2982
  interface ISecureTransportOptions {
2899
2983
  /** The shared channel identity (per-connection codec + dictionary version) — same one both ends use. */
@@ -2904,6 +2988,13 @@ interface ISecureTransportOptions {
2904
2988
  storageAdapter: StorageAdapter;
2905
2989
  /** The level this client requests; the peer must allow it. */
2906
2990
  securityLevel: ESecurityLevel;
2991
+ /**
2992
+ * Optional availability gate. When it returns `false`, this transport reports as `unsupported` for that
2993
+ * action and the manager falls through to the next transport in preference order — without opening the
2994
+ * carrier or computing its cache key. Re-evaluated per dispatch, so a transport can become available
2995
+ * later (e.g. once a session/connection precondition holds) with no reconnect. Omit = always available.
2996
+ */
2997
+ available?: (input: ITransportRouteActionParams) => boolean;
2907
2998
  /**
2908
2999
  * How to reach the peer. A duplex carrier (`wsCarrier(url)`, `rtcCarrier(dc)`,
2909
3000
  * `inMemoryCarrier().carrier`) runs the push-capable session; an exchange carrier (`httpCarrier(...)`)
@@ -3151,5 +3242,5 @@ interface IActionPayload_Result_JsonObject<DOM extends IActionDomain = IActionDo
3151
3242
  type TActionPayload_Any_Instance<DOM extends IActionDomain = IActionDomain, ID extends keyof DOM["actionSchema"] & string = keyof DOM["actionSchema"] & string> = ActionPayload_Request<DOM, ID> | ActionPayload_Result<DOM, ID> | ActionPayload_Progress<DOM, ID>;
3152
3243
  type TActionPayload_Any_JsonObject<DOM extends IActionDomain = IActionDomain, ID extends keyof DOM["actionSchema"] & string = keyof DOM["actionSchema"] & string> = IActionPayload_Request_JsonObject<DOM, ID> | IActionPayload_Progress_JsonObject<DOM, ID> | IActionPayload_Result_JsonObject<DOM, ID>;
3153
3244
  //#endregion
3154
- export { EErrId_NiceTransport_WebSocket as $, IClientVerifyKeyResolver as $n, TTransportedValue as $r, IAcceptorConnectionBinding as $t, ILinkTransportOptions as A, ITransportStatusInfo_Ready as An, ActionPayload_Result as Ar, IDuplexCarrier as At, IActionFrameCryptoConfig as B, TSendActionDataMethod as Bn, TActionDomainChildDef as Br, IActionChannel as Bt, decodeActionFrame as C, ITransportMethod_SendActionData_Input as Cn, IRunningActionUpdate_Abort as Cr, IServeChannelOptions as Ct, secureTransport as D, ITransportStatusInfo_Base as Dn, TRunningActionUpdate as Dr, IExchangeAcceptorCarrier as Dt, ISecureTransportOptions as E, ITransportRouteInfo as En, IRunningActionUpdate_Success as Er, IDuplexAcceptorCarrier as Et, err_nice_transport as F, TOnResolveAnyIncomingActionData_Json as Fn, TRuntimeCoordinateEnvId as Fr, TFrame$1 as Ft, TCarrierFetch as G, TTransportStatusInfo_GetTransport_Output as Gn, TPossibleDomainId as Gr, acceptChannelConnections as Gt, createBinaryWireAdapter as H, TTransportCache as Hn, TDomainActionId as Hr, TChannelAcceptorCases as Ht, ExchangeTransport as I, TOnResolveIncomingRequest as In, TRuntimeCoordinateStringId as Ir, IDuplexConnectionRouter as It, httpAcceptorCarrier as J, Transport as Jn, EActionResponseMode as Jr, ISecureChannel as Jt, httpCarrier as K, TUpdateActionRunConfig as Kn, TPossibleDomainIdList as Kr, connectChannel as Kt, IExchangeTransportOptions as L, TOnResolveIncomingRequestJson as Ln, IActionDomain as Lr, IHibernatableWsServerAdapterOptions as Lt, IActionTransportReadyData_Link as M, IUpdateActionRunConfig_Output as Mn, IRuntimeCoordinateSpecifics as Mr, IExchangeCarrier as Mt, TLinkFormatMessage as N, TGetTransportFn as Nn, IRuntimeFullCoordinates as Nr, IExchangeCarrierSource as Nt, IPlainTransportOptions as O, ITransportStatusInfo_Failed as On, TRunningActionUpdateFinished as Or, TAcceptorCarrier as Ot, EErrId_NiceTransport as P, TOnResolveAnyIncomingActionData as Pn, RuntimeCoordinate as Pr, TCarrier as Pt, wsAcceptorCarrier as Q, IClientVerifyKeyResolveInput as Qn, TActionSerializationDefinition as Qr, AcceptorHandler as Qt, IActionTransportReadyData_Exchange as R, TOnResolveIncomingResponse as Rn, IActionDomainChildOptions as Rr, createHibernatableWsServerAdapter as Rt, IActionFrameDecoder as S, ITransportDispatchAction as Sn, ERunningActionUpdateType as Sr, IChannelServer as St, err_nice_action as T, ITransportRouteClientParams as Tn, IRunningActionUpdate_Started as Tr, IAcceptorHibernation as Tt, IHttpCarrierOptions as U, TTransportInitializationFinishedInfo as Un, TInferInputFromSchema as Ur, TChannelPushHandlers as Ut, createActionFrameCrypto as V, TSendReturnDataMethod as Vn, TActionDomainSchema as Vr, IConnectChannelOptions as Vt, IHttpCarrierRequest as W, TTransportStatusInfo as Wn, TInferOutputFromSchema as Wr, acceptChannel as Wt, wsCarrier as X, ESecurityLevel as Xn, actionSchema as Xr, IBinaryWireSessionOptions as Xt, IWsCarrierOptions as Y, EHandshakeMessageType as Yn, TInferActionError as Yr, defineSecureChannel as Yt, IWsAcceptorCarrierOptions as Z, IClientHandshakeConfig as Zn, TActionSchemaOptions as Zr, createBinaryWireSessionFactory as Zt, TActionProgress as _, IActionTransportReady as _n, ActionPayload_Request as _r, IActionFetchHandlerOptions as _t, IActionPayload_Data_Base as a, IActionWireFormat as an, createInMemoryTofuVerifyKeyResolver as ar, IInMemoryCarrier as at, isActionPayload_Request_JsonObject as b, IActionTransportResolvers as bn, ERunningActionFinishedType as br, IExchangeAcceptorConfig as bt, IActionPayload_Request_JsonObject as c, ActionDomain as cn, decodeHandshakeMessage as cr, IInMemoryServerEndpoint as ct, IActionProgress_Custom as d, ConnectorHandler as dn, PeerLinkHandler as dr, ConnectionStateStore as dt, IAcceptorHandlerOptions as en, IHandshakeEncryptionKeyMaterial as er, err_nice_transport_ws as et, IActionProgress_None as f, createConnectorHandler as fn, ActionLocalHandler as fr, IConnectionAttachment as ft, TActionPayload_Any_JsonObject as g, IActionTransportInitialized as gn, ActionPayload_Progress as gr, createSecureAcceptorHandler as gt, TActionPayload_Any_Instance as h, IActionTransportDef as hn, RunningAction as hr, ISecureAcceptorHandlerOptions as ht, IActionPayload_Base_JsonObject as i, createAcceptorHandler as in, createClientHandshake as ir, rtcDataChannelByteChannel as it, LinkTransport as j, ITransportStatusInfo_Unsupported as jn, IRuntimeCoordinate as jr, IDuplexCarrierSource as jt, plainTransport as k, ITransportStatusInfo_Initializing as kn, TRunningActionUpdateListener as kr, isExchangeAcceptorCarrier as kt, IActionPayload_Result as l, ActionRootDomain as ln, encodeHandshakeMessage as lr, createInMemoryChannelPair as lt, IActionRouteItemHandler as m, ETransportStatus as mn, MaybePromise as mr, createConnectionStateStore as mt, EActionProgressType as n, TActionChannelFormatMessage as nn, IServerHandshakeConfig as nr, rtcCarrier as nt, IActionPayload_Progress as o, createActionRootDomain as on, createServerHandshake as or, inMemoryCarrier as ot, IActionProgress_Percentage as p, ETransportShape as pn, createLocalHandler as pr, IConnectionStateStoreOptions as pt, IHttpAcceptorCarrierOptions as q, ITransportConnectionContext as qn, ActionSchema as qr, defineChannel as qt, IActionPayload_Base as r, TActionConnectionEncoding as rn, THandshakeMessage as rr, IRtcDataChannelLike as rt, IActionPayload_Progress_JsonObject as s, ActionCore as sn, createStorageTofuVerifyKeyResolver as sr, IInMemoryChannelPair as st, EActionPayloadType as t, TAcceptorConnectionCaseFn as tn, IHandshakeResult as tr, IRtcCarrierOptions as tt, IActionPayload_Result_JsonObject as u, ActionRuntime as un, runtimeLinkId as ur, err_nice_external_client as ut, TActionResultOutcome as v, IActionTransportReadyData_Base as vn, IActionCore as vr, createActionFetchHandler as vt, EErrId_NiceAction as w, ITransportRouteActionParams as wn, IRunningActionUpdate_Progress as wr, serveChannel as wt, isActionPayload_Any_JsonObject as x, ISecureClientConfig as xn, ERunningActionState as xr, IExchangeAcceptorSecurity as xt, isActionPayload_Result_JsonObject as y, IActionTransportReadyData_Methods as yn, IActionCore_JsonObject as yr, ExchangeAcceptor as yt, IActionFrameCrypto as z, TOnResolveIncomingResponseJson as zn, IActionRootDomain as zr, IAcceptChannelOptions as zt };
3155
- //# sourceMappingURL=ActionPayload.types-snDlSIF-.d.cts.map
3245
+ export { httpAcceptorCarrier as $, Transport as $n, EActionResponseMode as $r, ISecureChannel as $t, decodeExchangeReply as A, ITransportRouteClientParams as An, IRunningActionUpdate_Started as Ar, IAcceptorHibernation as At, err_nice_transport as B, TOnResolveAnyIncomingActionData_Json as Bn, TRuntimeCoordinateEnvId as Br, TFrame$1 as Bt, decodeActionFrame as C, IActionTransportReadyData_Base as Cn, IActionCore as Cr, createActionFetchHandler as Ct, secureTransport as D, ITransportDispatchAction as Dn, ERunningActionUpdateType as Dr, IChannelServer as Dt, ISecureTransportOptions as E, ISecureClientConfig as En, ERunningActionState as Er, IExchangeAcceptorSecurity as Et, ILinkTransportOptions as F, ITransportStatusInfo_Ready as Fn, ActionPayload_Result as Fr, IDuplexCarrier as Ft, IActionFrameCryptoConfig as G, TSendActionDataMethod as Gn, TActionDomainChildDef as Gr, IActionChannel as Gt, IExchangeTransportOptions as H, TOnResolveIncomingRequestJson as Hn, IActionDomain as Hr, IHibernatableWsServerAdapterOptions as Ht, LinkTransport as I, ITransportStatusInfo_Unsupported as In, IRuntimeCoordinate as Ir, IDuplexCarrierSource as It, IHttpCarrierOptions as J, TTransportInitializationFinishedInfo as Jn, TInferInputFromSchema as Jr, TChannelPushHandlers as Jt, createActionFrameCrypto as K, TSendReturnDataMethod as Kn, TActionDomainSchema as Kr, IConnectChannelOptions as Kt, IActionTransportReadyData_Link as L, IUpdateActionRunConfig_Output as Ln, IRuntimeCoordinateSpecifics as Lr, IExchangeCarrier as Lt, encodeExchange as M, ITransportStatusInfo_Base as Mn, TRunningActionUpdate as Mr, IExchangeAcceptorCarrier as Mt, IPlainTransportOptions as N, ITransportStatusInfo_Failed as Nn, TRunningActionUpdateFinished as Nr, TAcceptorCarrier as Nt, TExchangeReply as O, ITransportMethod_SendActionData_Input as On, IRunningActionUpdate_Abort as Or, IServeChannelOptions as Ot, plainTransport as P, ITransportStatusInfo_Initializing as Pn, TRunningActionUpdateListener as Pr, isExchangeAcceptorCarrier as Pt, IHttpAcceptorCarrierOptions as Q, ITransportConnectionContext as Qn, ActionSchema as Qr, defineChannel as Qt, TLinkFormatMessage as R, TGetTransportFn as Rn, IRuntimeFullCoordinates as Rr, IExchangeCarrierSource as Rt, IActionFrameDecoder as S, IActionTransportReady as Sn, ActionPayload_Request as Sr, IActionFetchHandlerOptions as St, err_nice_action as T, IActionTransportResolvers as Tn, ERunningActionFinishedType as Tr, IExchangeAcceptorConfig as Tt, IActionTransportReadyData_Exchange as U, TOnResolveIncomingResponse as Un, IActionDomainChildOptions as Ur, createHibernatableWsServerAdapter as Ut, ExchangeTransport as V, TOnResolveIncomingRequest as Vn, TRuntimeCoordinateStringId as Vr, IDuplexConnectionRouter as Vt, IActionFrameCrypto as W, TOnResolveIncomingResponseJson as Wn, IActionRootDomain as Wr, IAcceptChannelOptions as Wt, TCarrierFetch as X, TTransportStatusInfo_GetTransport_Output as Xn, TPossibleDomainId as Xr, acceptChannelConnections as Xt, IHttpCarrierRequest as Y, TTransportStatusInfo as Yn, TInferOutputFromSchema as Yr, acceptChannel as Yt, httpCarrier as Z, TUpdateActionRunConfig as Zn, TPossibleDomainIdList as Zr, connectChannel as Zt, TActionProgress as _, createConnectorHandler as _n, ActionLocalHandler as _r, IConnectionAttachment as _t, IActionPayload_Data_Base as a, IAcceptorHandlerOptions as an, IHandshakeEncryptionKeyMaterial as ar, err_nice_transport_ws as at, isActionPayload_Request_JsonObject as b, IActionTransportDef as bn, RunningAction as br, ISecureAcceptorHandlerOptions as bt, IActionPayload_Request_JsonObject as c, TActionConnectionEncoding as cn, THandshakeMessage as cr, IRtcDataChannelLike as ct, IActionProgress_Custom as d, createActionRootDomain as dn, createServerHandshake as dr, inMemoryCarrier as dt, TInferActionError as ei, defineSecureChannel as en, EHandshakeMessageType as er, IWsCarrierOptions as et, IActionProgress_None as f, ActionCore as fn, createStorageTofuVerifyKeyResolver as fr, IInMemoryChannelPair as ft, TActionPayload_Any_JsonObject as g, ConnectorHandler as gn, PeerLinkHandler as gr, ConnectionStateStore as gt, TActionPayload_Any_Instance as h, ActionRuntime as hn, runtimeLinkId as hr, err_nice_external_client as ht, IActionPayload_Base_JsonObject as i, TTransportedValue as ii, IAcceptorConnectionBinding as in, IClientVerifyKeyResolver as ir, EErrId_NiceTransport_WebSocket as it, decodeExchangeRequest as j, ITransportRouteInfo as jn, IRunningActionUpdate_Success as jr, IDuplexAcceptorCarrier as jt, TExchangeRequest as k, ITransportRouteActionParams as kn, IRunningActionUpdate_Progress as kr, serveChannel as kt, IActionPayload_Result as l, createAcceptorHandler as ln, createClientHandshake as lr, rtcDataChannelByteChannel as lt, IActionRouteItemHandler as m, ActionRootDomain as mn, encodeHandshakeMessage as mr, createInMemoryChannelPair as mt, EActionProgressType as n, TActionSchemaOptions as ni, createBinaryWireSessionFactory as nn, IClientHandshakeConfig as nr, IWsAcceptorCarrierOptions as nt, IActionPayload_Progress as o, TAcceptorConnectionCaseFn as on, IHandshakeResult as or, IRtcCarrierOptions as ot, IActionProgress_Percentage as p, ActionDomain as pn, decodeHandshakeMessage as pr, IInMemoryServerEndpoint as pt, createBinaryWireAdapter as q, TTransportCache as qn, TDomainActionId as qr, TChannelAcceptorCases as qt, IActionPayload_Base as r, TActionSerializationDefinition as ri, AcceptorHandler as rn, IClientVerifyKeyResolveInput as rr, wsAcceptorCarrier as rt, IActionPayload_Progress_JsonObject as s, TActionChannelFormatMessage as sn, IServerHandshakeConfig as sr, rtcCarrier as st, EActionPayloadType as t, actionSchema as ti, IBinaryWireSessionOptions as tn, ESecurityLevel as tr, wsCarrier as tt, IActionPayload_Result_JsonObject as u, IActionWireFormat as un, createInMemoryTofuVerifyKeyResolver as ur, IInMemoryCarrier as ut, TActionResultOutcome as v, ETransportShape as vn, createLocalHandler as vr, IConnectionStateStoreOptions as vt, EErrId_NiceAction as w, IActionTransportReadyData_Methods as wn, IActionCore_JsonObject as wr, ExchangeAcceptor as wt, isActionPayload_Any_JsonObject as x, IActionTransportInitialized as xn, ActionPayload_Progress as xr, createSecureAcceptorHandler as xt, isActionPayload_Result_JsonObject as y, ETransportStatus as yn, MaybePromise as yr, createConnectionStateStore as yt, EErrId_NiceTransport as z, TOnResolveAnyIncomingActionData as zn, RuntimeCoordinate as zr, TCarrier as zt };
3246
+ //# sourceMappingURL=ActionPayload.types-CdHOGGZK.d.cts.map
@@ -1,4 +1,4 @@
1
- import { a as TDevtoolsActionStatus, i as IDevtoolsObservableDomain, n as IActionDevtoolsCoreOptions, o as TDevtoolsListener, r as IDevtoolsActionEntry, s as TDevtoolsPosition, t as ActionDevtoolsCore } from "../../ActionDevtoolsCore-Dd1qJAwK.cjs";
1
+ import { a as TDevtoolsActionStatus, i as IDevtoolsObservableDomain, n as IActionDevtoolsCoreOptions, o as TDevtoolsListener, r as IDevtoolsActionEntry, s as TDevtoolsPosition, t as ActionDevtoolsCore } from "../../ActionDevtoolsCore-CCZXQBAo.cjs";
2
2
 
3
3
  //#region src/devtools/browser/NiceActionDevtools.d.ts
4
4
  interface INiceActionDevtoolsProps {
@@ -1,4 +1,4 @@
1
- import { a as TDevtoolsActionStatus, i as IDevtoolsObservableDomain, n as IActionDevtoolsCoreOptions, o as TDevtoolsListener, r as IDevtoolsActionEntry, s as TDevtoolsPosition, t as ActionDevtoolsCore } from "../../ActionDevtoolsCore-C5XrQI1K.mjs";
1
+ import { a as TDevtoolsActionStatus, i as IDevtoolsObservableDomain, n as IActionDevtoolsCoreOptions, o as TDevtoolsListener, r as IDevtoolsActionEntry, s as TDevtoolsPosition, t as ActionDevtoolsCore } from "../../ActionDevtoolsCore-bjYQ8O2_.mjs";
2
2
 
3
3
  //#region src/devtools/browser/NiceActionDevtools.d.ts
4
4
  interface INiceActionDevtoolsProps {
@@ -1,4 +1,4 @@
1
- import { a as TDevtoolsActionStatus, i as IDevtoolsObservableDomain, n as IActionDevtoolsCoreOptions, o as TDevtoolsListener, r as IDevtoolsActionEntry, t as ActionDevtoolsCore } from "../../ActionDevtoolsCore-Dd1qJAwK.cjs";
1
+ import { a as TDevtoolsActionStatus, i as IDevtoolsObservableDomain, n as IActionDevtoolsCoreOptions, o as TDevtoolsListener, r as IDevtoolsActionEntry, t as ActionDevtoolsCore } from "../../ActionDevtoolsCore-CCZXQBAo.cjs";
2
2
 
3
3
  //#region src/devtools/server/NiceActionServerDevtools.d.ts
4
4
  type TServerDevtoolsLogFn = (message: string, data?: Record<string, unknown>) => void;
@@ -1,4 +1,4 @@
1
- import { a as TDevtoolsActionStatus, i as IDevtoolsObservableDomain, n as IActionDevtoolsCoreOptions, o as TDevtoolsListener, r as IDevtoolsActionEntry, t as ActionDevtoolsCore } from "../../ActionDevtoolsCore-C5XrQI1K.mjs";
1
+ import { a as TDevtoolsActionStatus, i as IDevtoolsObservableDomain, n as IActionDevtoolsCoreOptions, o as TDevtoolsListener, r as IDevtoolsActionEntry, t as ActionDevtoolsCore } from "../../ActionDevtoolsCore-bjYQ8O2_.mjs";
2
2
 
3
3
  //#region src/devtools/server/NiceActionServerDevtools.d.ts
4
4
  type TServerDevtoolsLogFn = (message: string, data?: Record<string, unknown>) => void;
package/build/index.cjs CHANGED
@@ -879,6 +879,10 @@ var ConnectionTransportManager = class {
879
879
  const candidates = [];
880
880
  const unavailableTransports = [];
881
881
  for (const transport of this._transports) {
882
+ if (!transport.isAvailable(routeActionParams)) {
883
+ unavailableTransports.push(transport);
884
+ continue;
885
+ }
882
886
  const cacheKey = transport.getCacheKey(routeActionParams);
883
887
  if (cacheKey != null) {
884
888
  const cached = this._cache.get(cacheKey);
@@ -4440,6 +4444,15 @@ var TransportConnection = class {
4440
4444
  if (inner == null) return null;
4441
4445
  return `${this.transOrd}:${inner}`;
4442
4446
  }
4447
+ /**
4448
+ * Whether this transport can serve the given action right now. Consulted by the manager before
4449
+ * cache-key resolution and `getTransport`; a `false` result skips this transport (treated as
4450
+ * `unsupported`) and the manager falls through to the next in preference order. Defaults to `true`
4451
+ * when the transport declares no gate.
4452
+ */
4453
+ isAvailable(input) {
4454
+ return this.initialized.isAvailable?.(input) ?? true;
4455
+ }
4443
4456
  getTransport(input) {
4444
4457
  return this._processTransportStatus(input);
4445
4458
  }
@@ -4536,6 +4549,7 @@ var ExchangeTransport = class ExchangeTransport extends Transport {
4536
4549
  const options = this.options;
4537
4550
  return new ExchangeConnection({ initialize: () => ({
4538
4551
  getTransportCacheKey: options.getTransportCacheKey,
4552
+ isAvailable: options.available,
4539
4553
  getTransport: (input) => ({
4540
4554
  status: "ready",
4541
4555
  readyData: {
@@ -4784,6 +4798,7 @@ var LinkTransport = class LinkTransport extends Transport {
4784
4798
  const options = this.options;
4785
4799
  return new LinkConnection({ initialize: () => ({
4786
4800
  getTransportCacheKey: options.getTransportCacheKey,
4801
+ isAvailable: options.available,
4787
4802
  getTransport: (input) => ({
4788
4803
  status: "ready",
4789
4804
  readyData: {
@@ -4820,6 +4835,7 @@ function plainTransport(options) {
4820
4835
  if (isExchangeCarrierSource(carrier)) return ExchangeTransport.create({
4821
4836
  openCarrier: carrier.open,
4822
4837
  getTransportCacheKey: carrier.getCacheKey,
4838
+ available: options.available,
4823
4839
  getRouteInfo: carrier.getRouteInfo,
4824
4840
  label: options.label ?? carrier.carrierLabel,
4825
4841
  updateRunConfig: options.updateRunConfig
@@ -4829,6 +4845,7 @@ function plainTransport(options) {
4829
4845
  formatMessage: options.formatMessage,
4830
4846
  createFormatMessage: options.createFormatMessage,
4831
4847
  getTransportCacheKey: carrier.getCacheKey,
4848
+ available: options.available,
4832
4849
  getRouteInfo: carrier.getRouteInfo,
4833
4850
  label: options.label ?? carrier.carrierLabel,
4834
4851
  updateRunConfig: options.updateRunConfig
@@ -4848,6 +4865,7 @@ function secureTransport(options) {
4848
4865
  if (isExchangeCarrierSource(carrier)) return ExchangeTransport.create({
4849
4866
  openCarrier: carrier.open,
4850
4867
  getTransportCacheKey: carrier.getCacheKey,
4868
+ available: options.available,
4851
4869
  getRouteInfo: carrier.getRouteInfo,
4852
4870
  label: carrier.carrierLabel,
4853
4871
  security
@@ -4856,6 +4874,7 @@ function secureTransport(options) {
4856
4874
  openChannel: carrier.open,
4857
4875
  createFormatMessage: options.channel.createCodec,
4858
4876
  getTransportCacheKey: carrier.getCacheKey,
4877
+ available: options.available,
4859
4878
  getRouteInfo: carrier.getRouteInfo,
4860
4879
  label: carrier.carrierLabel,
4861
4880
  security
@@ -4912,9 +4931,12 @@ exports.createSecureAcceptorHandler = createSecureAcceptorHandler;
4912
4931
  exports.createServerHandshake = createServerHandshake;
4913
4932
  exports.createStorageTofuVerifyKeyResolver = createStorageTofuVerifyKeyResolver;
4914
4933
  exports.decodeActionFrame = decodeActionFrame;
4934
+ exports.decodeExchangeReply = decodeExchangeReply;
4935
+ exports.decodeExchangeRequest = decodeExchangeRequest;
4915
4936
  exports.decodeHandshakeMessage = decodeHandshakeMessage;
4916
4937
  exports.defineChannel = defineChannel;
4917
4938
  exports.defineSecureChannel = defineSecureChannel;
4939
+ exports.encodeExchange = encodeExchange;
4918
4940
  exports.encodeHandshakeMessage = encodeHandshakeMessage;
4919
4941
  exports.err_nice_action = err_nice_action;
4920
4942
  exports.err_nice_external_client = err_nice_external_client;