@trpc/client 11.19.0 → 11.21.1-canary.20.10e2ef98f
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/index.cjs +72 -46
- package/dist/index.d.cts +37 -5
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +37 -5
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +72 -47
- package/dist/index.mjs.map +1 -1
- package/links/httpBatchLink/index.d.ts +1 -0
- package/links/httpBatchLink/index.js +1 -0
- package/links/httpLink/index.d.ts +1 -0
- package/links/httpLink/index.js +1 -0
- package/links/loggerLink/index.d.ts +1 -0
- package/links/loggerLink/index.js +1 -0
- package/links/splitLink/index.d.ts +1 -0
- package/links/splitLink/index.js +1 -0
- package/links/wsLink/index.d.ts +1 -0
- package/links/wsLink/index.js +1 -0
- package/links/wsLink/wsLink/index.d.ts +1 -0
- package/links/wsLink/wsLink/index.js +1 -0
- package/package.json +10 -10
- package/src/createTRPCClient.ts +7 -2
- package/src/index.ts +6 -0
- package/src/links/localLink.ts +78 -69
- package/src/safe.ts +46 -0
- package/unstable-internals/index.d.ts +1 -0
- package/unstable-internals/index.js +1 -0
package/dist/index.cjs
CHANGED
|
@@ -652,7 +652,7 @@ AsyncGenerator.prototype["function" == typeof Symbol && Symbol.asyncIterator ||
|
|
|
652
652
|
/**
|
|
653
653
|
* localLink is a terminating link that allows you to make tRPC procedure calls directly in your application without going through HTTP.
|
|
654
654
|
*
|
|
655
|
-
* @see https://trpc.io/docs/links/localLink
|
|
655
|
+
* @see https://trpc.io/docs/client/links/localLink
|
|
656
656
|
*/
|
|
657
657
|
function unstable_localLink(opts) {
|
|
658
658
|
const transformer = require_unstable_internals.getTransformer(opts.transformer);
|
|
@@ -753,7 +753,6 @@ function unstable_localLink(opts) {
|
|
|
753
753
|
} });
|
|
754
754
|
let lastEventId = void 0;
|
|
755
755
|
_usingCtx3.u((0, _trpc_server_unstable_core_do_not_import.makeResource)({}, async () => {
|
|
756
|
-
observer.complete();
|
|
757
756
|
connectionState.next({
|
|
758
757
|
type: "state",
|
|
759
758
|
state: "idle",
|
|
@@ -761,52 +760,55 @@ function unstable_localLink(opts) {
|
|
|
761
760
|
});
|
|
762
761
|
connectionSub.unsubscribe();
|
|
763
762
|
}));
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
data: {
|
|
763
|
+
await (0, _trpc_server_unstable_core_do_not_import.run)(async () => {
|
|
764
|
+
while (true) try {
|
|
765
|
+
var _usingCtx4 = _usingCtx();
|
|
766
|
+
const result = await runProcedure(inputWithTrackedEventId(op.input, lastEventId));
|
|
767
|
+
if (!(0, _trpc_server_unstable_core_do_not_import.isAsyncIterable)(result)) throw new Error("Expected an async iterable");
|
|
768
|
+
const iterator = _usingCtx4.a((0, _trpc_server_unstable_core_do_not_import.iteratorResource)(result));
|
|
769
|
+
observer.next({ result: { type: "started" } });
|
|
770
|
+
connectionState.next({
|
|
771
|
+
type: "state",
|
|
772
|
+
state: "pending",
|
|
773
|
+
error: null
|
|
774
|
+
});
|
|
775
|
+
while (true) {
|
|
776
|
+
let res;
|
|
777
|
+
try {
|
|
778
|
+
res = await Promise.race([iterator.next(), signalPromise]);
|
|
779
|
+
} catch (cause) {
|
|
780
|
+
if ((0, _trpc_server_unstable_core_do_not_import.isAbortError)(cause)) return;
|
|
781
|
+
const error = (0, _trpc_server.getTRPCErrorFromUnknown)(cause);
|
|
782
|
+
if (!_trpc_server_unstable_core_do_not_import.retryableRpcCodes.includes(_trpc_server_rpc.TRPC_ERROR_CODES_BY_KEY[error.code])) throw coerceToTRPCClientError(error);
|
|
783
|
+
onErrorCallback(error);
|
|
784
|
+
connectionState.next({
|
|
785
|
+
type: "state",
|
|
786
|
+
state: "connecting",
|
|
787
|
+
error: coerceToTRPCClientError(error)
|
|
788
|
+
});
|
|
789
|
+
break;
|
|
790
|
+
}
|
|
791
|
+
if (res.done) return;
|
|
792
|
+
let chunk;
|
|
793
|
+
if ((0, _trpc_server.isTrackedEnvelope)(res.value)) {
|
|
794
|
+
lastEventId = res.value[0];
|
|
795
|
+
chunk = {
|
|
798
796
|
id: res.value[0],
|
|
799
|
-
data:
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
797
|
+
data: {
|
|
798
|
+
id: res.value[0],
|
|
799
|
+
data: res.value[1]
|
|
800
|
+
}
|
|
801
|
+
};
|
|
802
|
+
} else chunk = { data: res.value };
|
|
803
|
+
observer.next({ result: require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, chunk), {}, { data: transformChunk(chunk.data) }) });
|
|
804
|
+
}
|
|
805
|
+
} catch (_) {
|
|
806
|
+
_usingCtx4.e = _;
|
|
807
|
+
} finally {
|
|
808
|
+
await _usingCtx4.d();
|
|
804
809
|
}
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
} finally {
|
|
808
|
-
await _usingCtx4.d();
|
|
809
|
-
}
|
|
810
|
+
});
|
|
811
|
+
observer.complete();
|
|
810
812
|
break;
|
|
811
813
|
} catch (_) {
|
|
812
814
|
_usingCtx3.e = _;
|
|
@@ -828,6 +830,29 @@ function unstable_localLink(opts) {
|
|
|
828
830
|
*/
|
|
829
831
|
const experimental_localLink = unstable_localLink;
|
|
830
832
|
//#endregion
|
|
833
|
+
//#region src/safe.ts
|
|
834
|
+
/**
|
|
835
|
+
* Await a vanilla client `query()` or `mutate()` call without it throwing, getting back a
|
|
836
|
+
* `[data, error]` pair typed with that procedure's error shape.
|
|
837
|
+
*
|
|
838
|
+
* @example
|
|
839
|
+
* ```ts
|
|
840
|
+
* const [post, error] = await safe(client.post.byId.query({ id }));
|
|
841
|
+
* if (error) {
|
|
842
|
+
* console.error(error);
|
|
843
|
+
* }
|
|
844
|
+
*
|
|
845
|
+
* const id = post.id;
|
|
846
|
+
* ```
|
|
847
|
+
*/
|
|
848
|
+
async function safe(promise) {
|
|
849
|
+
try {
|
|
850
|
+
return [await promise, void 0];
|
|
851
|
+
} catch (cause) {
|
|
852
|
+
return [void 0, cause];
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
//#endregion
|
|
831
856
|
exports.TRPCClientError = require_TRPCClientError.TRPCClientError;
|
|
832
857
|
exports.TRPCUntypedClient = TRPCUntypedClient;
|
|
833
858
|
exports.clientCallTypeToProcedureType = clientCallTypeToProcedureType;
|
|
@@ -850,6 +875,7 @@ exports.isTRPCClientError = require_TRPCClientError.isTRPCClientError;
|
|
|
850
875
|
exports.jsonEncoder = require_wsLink.jsonEncoder;
|
|
851
876
|
exports.loggerLink = require_links_loggerLink.loggerLink;
|
|
852
877
|
exports.retryLink = retryLink;
|
|
878
|
+
exports.safe = safe;
|
|
853
879
|
exports.splitLink = require_splitLink.splitLink;
|
|
854
880
|
exports.unstable_httpBatchStreamLink = unstable_httpBatchStreamLink;
|
|
855
881
|
exports.unstable_httpSubscriptionLink = unstable_httpSubscriptionLink;
|
package/dist/index.d.cts
CHANGED
|
@@ -6,7 +6,7 @@ import { n as httpLink, t as HTTPLinkOptions } from "./httpLink-D5FQijY2.cjs";
|
|
|
6
6
|
import { n as loggerLink, t as LoggerLinkOptions } from "./loggerLink-2o-uZ3r1.cjs";
|
|
7
7
|
import { t as splitLink } from "./splitLink-CJdcmEmS.cjs";
|
|
8
8
|
import { a as WebSocketClientOptions, c as jsonEncoder, i as createWSClient, n as wsLink, o as UrlOptionsWithConnectionParams, r as TRPCWebSocketClient, s as Encoder, t as WebSocketLinkOptions } from "./wsLink-DoiyfDgJ.cjs";
|
|
9
|
-
import { AnyClientTypes, AnyProcedure, AnyRouter, ErrorHandlerOptions, EventSourceLike, InferrableClientTypes, ProcedureType, RouterRecord, TypeError, inferAsyncIterableYield, inferClientTypes, inferProcedureInput, inferRouterContext, inferTransformedProcedureOutput } from "@trpc/server/unstable-core-do-not-import";
|
|
9
|
+
import { AnyClientTypes, AnyProcedure, AnyRouter, ErrorHandlerOptions, EventSourceLike, InferrableClientTypes, ProcedureType, RouterRecord, TypeError, inferAsyncIterableYield, inferClientTypes, inferProcedureErrorShape, inferProcedureInput, inferRouterContext, inferTransformedProcedureOutput } from "@trpc/server/unstable-core-do-not-import";
|
|
10
10
|
import { Unsubscribable } from "@trpc/server/observable";
|
|
11
11
|
import { AnyRouter as AnyRouter$1 } from "@trpc/server";
|
|
12
12
|
//#region src/links/internals/contentTypes.d.ts
|
|
@@ -52,6 +52,38 @@ export declare class TRPCUntypedClient<TInferrable extends InferrableClientTypes
|
|
|
52
52
|
//#region src/createTRPCUntypedClient.d.ts
|
|
53
53
|
export declare function createTRPCUntypedClient<TRouter extends AnyRouter>(opts: CreateTRPCClientOptions<TRouter>): TRPCUntypedClient<TRouter>;
|
|
54
54
|
//#endregion
|
|
55
|
+
//#region src/safe.d.ts
|
|
56
|
+
/**
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
declare const errorShapeTag: unique symbol;
|
|
60
|
+
type TRPCTaggedPromise<TData, TErrorShape> = Promise<TData> & {
|
|
61
|
+
readonly [errorShapeTag]: TErrorShape;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* @internal
|
|
65
|
+
*/
|
|
66
|
+
type inferSafeError<TErrorShape> = TRPCClientError<{
|
|
67
|
+
errorShape: TErrorShape;
|
|
68
|
+
transformer: boolean;
|
|
69
|
+
}>;
|
|
70
|
+
type SafeResult<TData, TErrorShape> = readonly [data: TData, error: undefined] | readonly [data: undefined, error: inferSafeError<TErrorShape>];
|
|
71
|
+
/**
|
|
72
|
+
* Await a vanilla client `query()` or `mutate()` call without it throwing, getting back a
|
|
73
|
+
* `[data, error]` pair typed with that procedure's error shape.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* const [post, error] = await safe(client.post.byId.query({ id }));
|
|
78
|
+
* if (error) {
|
|
79
|
+
* console.error(error);
|
|
80
|
+
* }
|
|
81
|
+
*
|
|
82
|
+
* const id = post.id;
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare function safe<TData, TErrorShape>(promise: TRPCTaggedPromise<TData, TErrorShape>): Promise<SafeResult<TData, TErrorShape>>;
|
|
86
|
+
//#endregion
|
|
55
87
|
//#region src/createTRPCClient.d.ts
|
|
56
88
|
/**
|
|
57
89
|
* @public
|
|
@@ -82,7 +114,7 @@ export type TRPCResolverDef = {
|
|
|
82
114
|
};
|
|
83
115
|
type coerceAsyncGeneratorToIterable<T> = T extends AsyncGenerator<infer $T, infer $Return, infer $Next> ? AsyncIterable<$T, $Return, $Next> : T;
|
|
84
116
|
/** @internal */
|
|
85
|
-
export type Resolver<TDef extends TRPCResolverDef> = (input: TDef['input'], opts?: TRPCProcedureOptions) =>
|
|
117
|
+
export type Resolver<TDef extends TRPCResolverDef> = (input: TDef['input'], opts?: TRPCProcedureOptions) => TRPCTaggedPromise<coerceAsyncGeneratorToIterable<TDef['output']>, TDef['errorShape']>;
|
|
86
118
|
/** @internal */
|
|
87
119
|
export type SubscriptionResolver<TDef extends TRPCResolverDef> = (input: TDef['input'], opts: Partial<TRPCSubscriptionObserver<TDef['output'], TRPCClientError<TDef>>> & TRPCProcedureOptions) => Unsubscribable;
|
|
88
120
|
type DecorateProcedure<TType extends ProcedureType, TDef extends TRPCResolverDef> = TType extends 'query' ? {
|
|
@@ -98,7 +130,7 @@ type DecorateProcedure<TType extends ProcedureType, TDef extends TRPCResolverDef
|
|
|
98
130
|
type DecoratedProcedureRecord<TRoot extends InferrableClientTypes, TRecord extends RouterRecord> = { [TKey in keyof TRecord]: TRecord[TKey] extends (infer $Value) ? $Value extends AnyProcedure ? DecorateProcedure<$Value['_def']['type'], {
|
|
99
131
|
input: inferProcedureInput<$Value>;
|
|
100
132
|
output: inferTransformedProcedureOutput<inferClientTypes<TRoot>, $Value>;
|
|
101
|
-
errorShape:
|
|
133
|
+
errorShape: inferProcedureErrorShape<TRoot, $Value>;
|
|
102
134
|
transformer: inferClientTypes<TRoot>['transformer'];
|
|
103
135
|
}> : $Value extends RouterRecord ? DecoratedProcedureRecord<TRoot, $Value> : never : never; };
|
|
104
136
|
/** @internal */
|
|
@@ -197,7 +229,7 @@ export type LocalLinkOptions<TRouter extends AnyRouter> = {
|
|
|
197
229
|
/**
|
|
198
230
|
* localLink is a terminating link that allows you to make tRPC procedure calls directly in your application without going through HTTP.
|
|
199
231
|
*
|
|
200
|
-
* @see https://trpc.io/docs/links/localLink
|
|
232
|
+
* @see https://trpc.io/docs/client/links/localLink
|
|
201
233
|
*/
|
|
202
234
|
export declare function unstable_localLink<TRouter extends AnyRouter>(opts: LocalLinkOptions<TRouter>): TRPCLink<TRouter>;
|
|
203
235
|
/**
|
|
@@ -205,5 +237,5 @@ export declare function unstable_localLink<TRouter extends AnyRouter>(opts: Loca
|
|
|
205
237
|
*/
|
|
206
238
|
export declare const experimental_localLink: typeof unstable_localLink;
|
|
207
239
|
//#endregion
|
|
208
|
-
export { type CreateTRPCClientOptions, type Encoder, HTTPBatchLinkOptions, HTTPHeaders, HTTPLinkOptions, LoggerLinkOptions, Operation, OperationContext, OperationLink, OperationResultEnvelope, OperationResultObservable, OperationResultObserver, TRPCClientError, TRPCClientErrorBase, TRPCClientErrorLike, TRPCClientRuntime, TRPCFetch, TRPCLink, type TRPCProcedureOptions, type TRPCRequestOptions, type TRPCWebSocketClient, type WebSocketClientOptions, WebSocketLinkOptions, createTRPCClient as createTRPCProxyClient, createWSClient, httpBatchLink, httpLink, type inferRouterClient as inferRouterProxyClient, isTRPCClientError, jsonEncoder, loggerLink, splitLink, wsLink };
|
|
240
|
+
export { type CreateTRPCClientOptions, type Encoder, HTTPBatchLinkOptions, HTTPHeaders, HTTPLinkOptions, LoggerLinkOptions, Operation, OperationContext, OperationLink, OperationResultEnvelope, OperationResultObservable, OperationResultObserver, type SafeResult, TRPCClientError, TRPCClientErrorBase, TRPCClientErrorLike, TRPCClientRuntime, TRPCFetch, TRPCLink, type TRPCProcedureOptions, type TRPCTaggedPromise as TRPCPromise, type TRPCRequestOptions, type TRPCWebSocketClient, type WebSocketClientOptions, WebSocketLinkOptions, createTRPCClient as createTRPCProxyClient, createWSClient, httpBatchLink, httpLink, type inferRouterClient as inferRouterProxyClient, isTRPCClientError, jsonEncoder, loggerLink, splitLink, wsLink };
|
|
209
241
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/links/internals/contentTypes.ts","../src/internals/TRPCUntypedClient.ts","../src/createTRPCUntypedClient.ts","../src/createTRPCClient.ts","../src/getFetch.ts","../src/links/httpBatchStreamLink.ts","../src/links/httpSubscriptionLink.ts","../src/links/retryLink.ts","../src/links/localLink.ts"],"mappings":";;;;;;;;;;;;wBAAgB,YACd,iBACC,SAAS,WAAW,eAAe;wBAQtB,WAAW,iBAAc,SAAA;wBAIzB,sBAAsB,iBAAc,SAAA,OAAA,WAAA,WAAA;;;UCSnC;;;;EAIf,UAAU;EACV,SAAS;;UAGM,yBAAyB,QAAQ;EAChD,YAAY;IAAQ,SAAS;;EAC7B,SAAS,OAAO,wBAAwB;EACxC,UAAU,KAAK;EACf;EACA;EACA,0BAA0B,OAAO,oBAAoB;;;KAI3C,wBAAwB,gBAAgB;EAClD,OAAO,SAAS;EAChB,cAAc;;qBAGH,kBAAkB,oBAAoB;mBAChC;WACD,SAAS;UACjB;EAER,YAAY,MAAM,wBAAwB;UASlC;UAkBM;EAkBP,MAAM,cAAc,iBAAiB,OAAO,qBAAkB;EAS9D,SAAS,cAAc,iBAAiB,OAAO,qBAAkB;EASjE,aACL,cACA,gBACA,MAAM,QACJ,kCAAkC,gBAAgB,eAElD,qBACD;;;;wBCrHW,wBAAwB,gBAAgB,WACtD,MAAM,wBAAwB,WAC7B,kBAAkB;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/links/internals/contentTypes.ts","../src/internals/TRPCUntypedClient.ts","../src/createTRPCUntypedClient.ts","../src/safe.ts","../src/createTRPCClient.ts","../src/getFetch.ts","../src/links/httpBatchStreamLink.ts","../src/links/httpSubscriptionLink.ts","../src/links/retryLink.ts","../src/links/localLink.ts"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -7,7 +7,7 @@ import { n as loggerLink, t as LoggerLinkOptions } from "./loggerLink-CFercTVc.m
|
|
|
7
7
|
import { t as splitLink } from "./splitLink-CixmF14P.mjs";
|
|
8
8
|
import { a as WebSocketClientOptions, c as jsonEncoder, i as createWSClient, n as wsLink, o as UrlOptionsWithConnectionParams, r as TRPCWebSocketClient, s as Encoder, t as WebSocketLinkOptions } from "./wsLink-U8pJ7LD2.mjs";
|
|
9
9
|
import { Unsubscribable } from "@trpc/server/observable";
|
|
10
|
-
import { AnyClientTypes, AnyProcedure, AnyRouter, ErrorHandlerOptions, EventSourceLike, InferrableClientTypes, ProcedureType, RouterRecord, TypeError, inferAsyncIterableYield, inferClientTypes, inferProcedureInput, inferRouterContext, inferTransformedProcedureOutput } from "@trpc/server/unstable-core-do-not-import";
|
|
10
|
+
import { AnyClientTypes, AnyProcedure, AnyRouter, ErrorHandlerOptions, EventSourceLike, InferrableClientTypes, ProcedureType, RouterRecord, TypeError, inferAsyncIterableYield, inferClientTypes, inferProcedureErrorShape, inferProcedureInput, inferRouterContext, inferTransformedProcedureOutput } from "@trpc/server/unstable-core-do-not-import";
|
|
11
11
|
import { AnyRouter as AnyRouter$1 } from "@trpc/server";
|
|
12
12
|
//#region src/links/internals/contentTypes.d.ts
|
|
13
13
|
export declare function isOctetType(input: unknown): input is Uint8Array<ArrayBuffer> | Blob;
|
|
@@ -52,6 +52,38 @@ export declare class TRPCUntypedClient<TInferrable extends InferrableClientTypes
|
|
|
52
52
|
//#region src/createTRPCUntypedClient.d.ts
|
|
53
53
|
export declare function createTRPCUntypedClient<TRouter extends AnyRouter>(opts: CreateTRPCClientOptions<TRouter>): TRPCUntypedClient<TRouter>;
|
|
54
54
|
//#endregion
|
|
55
|
+
//#region src/safe.d.ts
|
|
56
|
+
/**
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
declare const errorShapeTag: unique symbol;
|
|
60
|
+
type TRPCTaggedPromise<TData, TErrorShape> = Promise<TData> & {
|
|
61
|
+
readonly [errorShapeTag]: TErrorShape;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* @internal
|
|
65
|
+
*/
|
|
66
|
+
type inferSafeError<TErrorShape> = TRPCClientError<{
|
|
67
|
+
errorShape: TErrorShape;
|
|
68
|
+
transformer: boolean;
|
|
69
|
+
}>;
|
|
70
|
+
type SafeResult<TData, TErrorShape> = readonly [data: TData, error: undefined] | readonly [data: undefined, error: inferSafeError<TErrorShape>];
|
|
71
|
+
/**
|
|
72
|
+
* Await a vanilla client `query()` or `mutate()` call without it throwing, getting back a
|
|
73
|
+
* `[data, error]` pair typed with that procedure's error shape.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* const [post, error] = await safe(client.post.byId.query({ id }));
|
|
78
|
+
* if (error) {
|
|
79
|
+
* console.error(error);
|
|
80
|
+
* }
|
|
81
|
+
*
|
|
82
|
+
* const id = post.id;
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare function safe<TData, TErrorShape>(promise: TRPCTaggedPromise<TData, TErrorShape>): Promise<SafeResult<TData, TErrorShape>>;
|
|
86
|
+
//#endregion
|
|
55
87
|
//#region src/createTRPCClient.d.ts
|
|
56
88
|
/**
|
|
57
89
|
* @public
|
|
@@ -82,7 +114,7 @@ export type TRPCResolverDef = {
|
|
|
82
114
|
};
|
|
83
115
|
type coerceAsyncGeneratorToIterable<T> = T extends AsyncGenerator<infer $T, infer $Return, infer $Next> ? AsyncIterable<$T, $Return, $Next> : T;
|
|
84
116
|
/** @internal */
|
|
85
|
-
export type Resolver<TDef extends TRPCResolverDef> = (input: TDef['input'], opts?: TRPCProcedureOptions) =>
|
|
117
|
+
export type Resolver<TDef extends TRPCResolverDef> = (input: TDef['input'], opts?: TRPCProcedureOptions) => TRPCTaggedPromise<coerceAsyncGeneratorToIterable<TDef['output']>, TDef['errorShape']>;
|
|
86
118
|
/** @internal */
|
|
87
119
|
export type SubscriptionResolver<TDef extends TRPCResolverDef> = (input: TDef['input'], opts: Partial<TRPCSubscriptionObserver<TDef['output'], TRPCClientError<TDef>>> & TRPCProcedureOptions) => Unsubscribable;
|
|
88
120
|
type DecorateProcedure<TType extends ProcedureType, TDef extends TRPCResolverDef> = TType extends 'query' ? {
|
|
@@ -98,7 +130,7 @@ type DecorateProcedure<TType extends ProcedureType, TDef extends TRPCResolverDef
|
|
|
98
130
|
type DecoratedProcedureRecord<TRoot extends InferrableClientTypes, TRecord extends RouterRecord> = { [TKey in keyof TRecord]: TRecord[TKey] extends (infer $Value) ? $Value extends AnyProcedure ? DecorateProcedure<$Value['_def']['type'], {
|
|
99
131
|
input: inferProcedureInput<$Value>;
|
|
100
132
|
output: inferTransformedProcedureOutput<inferClientTypes<TRoot>, $Value>;
|
|
101
|
-
errorShape:
|
|
133
|
+
errorShape: inferProcedureErrorShape<TRoot, $Value>;
|
|
102
134
|
transformer: inferClientTypes<TRoot>['transformer'];
|
|
103
135
|
}> : $Value extends RouterRecord ? DecoratedProcedureRecord<TRoot, $Value> : never : never; };
|
|
104
136
|
/** @internal */
|
|
@@ -197,7 +229,7 @@ export type LocalLinkOptions<TRouter extends AnyRouter> = {
|
|
|
197
229
|
/**
|
|
198
230
|
* localLink is a terminating link that allows you to make tRPC procedure calls directly in your application without going through HTTP.
|
|
199
231
|
*
|
|
200
|
-
* @see https://trpc.io/docs/links/localLink
|
|
232
|
+
* @see https://trpc.io/docs/client/links/localLink
|
|
201
233
|
*/
|
|
202
234
|
export declare function unstable_localLink<TRouter extends AnyRouter>(opts: LocalLinkOptions<TRouter>): TRPCLink<TRouter>;
|
|
203
235
|
/**
|
|
@@ -205,5 +237,5 @@ export declare function unstable_localLink<TRouter extends AnyRouter>(opts: Loca
|
|
|
205
237
|
*/
|
|
206
238
|
export declare const experimental_localLink: typeof unstable_localLink;
|
|
207
239
|
//#endregion
|
|
208
|
-
export { type CreateTRPCClientOptions, type Encoder, HTTPBatchLinkOptions, HTTPHeaders, HTTPLinkOptions, LoggerLinkOptions, Operation, OperationContext, OperationLink, OperationResultEnvelope, OperationResultObservable, OperationResultObserver, TRPCClientError, TRPCClientErrorBase, TRPCClientErrorLike, TRPCClientRuntime, TRPCFetch, TRPCLink, type TRPCProcedureOptions, type TRPCRequestOptions, type TRPCWebSocketClient, type WebSocketClientOptions, WebSocketLinkOptions, createTRPCClient as createTRPCProxyClient, createWSClient, httpBatchLink, httpLink, type inferRouterClient as inferRouterProxyClient, isTRPCClientError, jsonEncoder, loggerLink, splitLink, wsLink };
|
|
240
|
+
export { type CreateTRPCClientOptions, type Encoder, HTTPBatchLinkOptions, HTTPHeaders, HTTPLinkOptions, LoggerLinkOptions, Operation, OperationContext, OperationLink, OperationResultEnvelope, OperationResultObservable, OperationResultObserver, type SafeResult, TRPCClientError, TRPCClientErrorBase, TRPCClientErrorLike, TRPCClientRuntime, TRPCFetch, TRPCLink, type TRPCProcedureOptions, type TRPCTaggedPromise as TRPCPromise, type TRPCRequestOptions, type TRPCWebSocketClient, type WebSocketClientOptions, WebSocketLinkOptions, createTRPCClient as createTRPCProxyClient, createWSClient, httpBatchLink, httpLink, type inferRouterClient as inferRouterProxyClient, isTRPCClientError, jsonEncoder, loggerLink, splitLink, wsLink };
|
|
209
241
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/links/internals/contentTypes.ts","../src/internals/TRPCUntypedClient.ts","../src/createTRPCUntypedClient.ts","../src/createTRPCClient.ts","../src/getFetch.ts","../src/links/httpBatchStreamLink.ts","../src/links/httpSubscriptionLink.ts","../src/links/retryLink.ts","../src/links/localLink.ts"],"mappings":";;;;;;;;;;;;wBAAgB,YACd,iBACC,SAAS,WAAW,eAAe;wBAQtB,WAAW,iBAAc,SAAA;wBAIzB,sBAAsB,iBAAc,SAAA,OAAA,WAAA,WAAA;;;UCSnC;;;;EAIf,UAAU;EACV,SAAS;;UAGM,yBAAyB,QAAQ;EAChD,YAAY;IAAQ,SAAS;;EAC7B,SAAS,OAAO,wBAAwB;EACxC,UAAU,KAAK;EACf;EACA;EACA,0BAA0B,OAAO,oBAAoB;;;KAI3C,wBAAwB,gBAAgB;EAClD,OAAO,SAAS;EAChB,cAAc;;qBAGH,kBAAkB,oBAAoB;mBAChC;WACD,SAAS;UACjB;EAER,YAAY,MAAM,wBAAwB;UASlC;UAkBM;EAkBP,MAAM,cAAc,iBAAiB,OAAO,qBAAkB;EAS9D,SAAS,cAAc,iBAAiB,OAAO,qBAAkB;EASjE,aACL,cACA,gBACA,MAAM,QACJ,kCAAkC,gBAAgB,eAElD,qBACD;;;;wBCrHW,wBAAwB,gBAAgB,WACtD,MAAM,wBAAwB,WAC7B,kBAAkB;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/links/internals/contentTypes.ts","../src/internals/TRPCUntypedClient.ts","../src/createTRPCUntypedClient.ts","../src/safe.ts","../src/createTRPCClient.ts","../src/getFetch.ts","../src/links/httpBatchStreamLink.ts","../src/links/httpSubscriptionLink.ts","../src/links/retryLink.ts","../src/links/localLink.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -651,7 +651,7 @@ AsyncGenerator.prototype["function" == typeof Symbol && Symbol.asyncIterator ||
|
|
|
651
651
|
/**
|
|
652
652
|
* localLink is a terminating link that allows you to make tRPC procedure calls directly in your application without going through HTTP.
|
|
653
653
|
*
|
|
654
|
-
* @see https://trpc.io/docs/links/localLink
|
|
654
|
+
* @see https://trpc.io/docs/client/links/localLink
|
|
655
655
|
*/
|
|
656
656
|
function unstable_localLink(opts) {
|
|
657
657
|
const transformer = getTransformer(opts.transformer);
|
|
@@ -752,7 +752,6 @@ function unstable_localLink(opts) {
|
|
|
752
752
|
} });
|
|
753
753
|
let lastEventId = void 0;
|
|
754
754
|
_usingCtx3.u(makeResource({}, async () => {
|
|
755
|
-
observer.complete();
|
|
756
755
|
connectionState.next({
|
|
757
756
|
type: "state",
|
|
758
757
|
state: "idle",
|
|
@@ -760,52 +759,55 @@ function unstable_localLink(opts) {
|
|
|
760
759
|
});
|
|
761
760
|
connectionSub.unsubscribe();
|
|
762
761
|
}));
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
data: {
|
|
762
|
+
await run(async () => {
|
|
763
|
+
while (true) try {
|
|
764
|
+
var _usingCtx4 = _usingCtx();
|
|
765
|
+
const result = await runProcedure(inputWithTrackedEventId(op.input, lastEventId));
|
|
766
|
+
if (!isAsyncIterable(result)) throw new Error("Expected an async iterable");
|
|
767
|
+
const iterator = _usingCtx4.a(iteratorResource(result));
|
|
768
|
+
observer.next({ result: { type: "started" } });
|
|
769
|
+
connectionState.next({
|
|
770
|
+
type: "state",
|
|
771
|
+
state: "pending",
|
|
772
|
+
error: null
|
|
773
|
+
});
|
|
774
|
+
while (true) {
|
|
775
|
+
let res;
|
|
776
|
+
try {
|
|
777
|
+
res = await Promise.race([iterator.next(), signalPromise]);
|
|
778
|
+
} catch (cause) {
|
|
779
|
+
if (isAbortError(cause)) return;
|
|
780
|
+
const error = getTRPCErrorFromUnknown(cause);
|
|
781
|
+
if (!retryableRpcCodes.includes(TRPC_ERROR_CODES_BY_KEY[error.code])) throw coerceToTRPCClientError(error);
|
|
782
|
+
onErrorCallback(error);
|
|
783
|
+
connectionState.next({
|
|
784
|
+
type: "state",
|
|
785
|
+
state: "connecting",
|
|
786
|
+
error: coerceToTRPCClientError(error)
|
|
787
|
+
});
|
|
788
|
+
break;
|
|
789
|
+
}
|
|
790
|
+
if (res.done) return;
|
|
791
|
+
let chunk;
|
|
792
|
+
if (isTrackedEnvelope(res.value)) {
|
|
793
|
+
lastEventId = res.value[0];
|
|
794
|
+
chunk = {
|
|
797
795
|
id: res.value[0],
|
|
798
|
-
data:
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
796
|
+
data: {
|
|
797
|
+
id: res.value[0],
|
|
798
|
+
data: res.value[1]
|
|
799
|
+
}
|
|
800
|
+
};
|
|
801
|
+
} else chunk = { data: res.value };
|
|
802
|
+
observer.next({ result: _objectSpread2(_objectSpread2({}, chunk), {}, { data: transformChunk(chunk.data) }) });
|
|
803
|
+
}
|
|
804
|
+
} catch (_) {
|
|
805
|
+
_usingCtx4.e = _;
|
|
806
|
+
} finally {
|
|
807
|
+
await _usingCtx4.d();
|
|
803
808
|
}
|
|
804
|
-
}
|
|
805
|
-
|
|
806
|
-
} finally {
|
|
807
|
-
await _usingCtx4.d();
|
|
808
|
-
}
|
|
809
|
+
});
|
|
810
|
+
observer.complete();
|
|
809
811
|
break;
|
|
810
812
|
} catch (_) {
|
|
811
813
|
_usingCtx3.e = _;
|
|
@@ -827,6 +829,29 @@ function unstable_localLink(opts) {
|
|
|
827
829
|
*/
|
|
828
830
|
const experimental_localLink = unstable_localLink;
|
|
829
831
|
//#endregion
|
|
830
|
-
|
|
832
|
+
//#region src/safe.ts
|
|
833
|
+
/**
|
|
834
|
+
* Await a vanilla client `query()` or `mutate()` call without it throwing, getting back a
|
|
835
|
+
* `[data, error]` pair typed with that procedure's error shape.
|
|
836
|
+
*
|
|
837
|
+
* @example
|
|
838
|
+
* ```ts
|
|
839
|
+
* const [post, error] = await safe(client.post.byId.query({ id }));
|
|
840
|
+
* if (error) {
|
|
841
|
+
* console.error(error);
|
|
842
|
+
* }
|
|
843
|
+
*
|
|
844
|
+
* const id = post.id;
|
|
845
|
+
* ```
|
|
846
|
+
*/
|
|
847
|
+
async function safe(promise) {
|
|
848
|
+
try {
|
|
849
|
+
return [await promise, void 0];
|
|
850
|
+
} catch (cause) {
|
|
851
|
+
return [void 0, cause];
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
//#endregion
|
|
855
|
+
export { TRPCClientError, TRPCUntypedClient, clientCallTypeToProcedureType, createTRPCClient, createTRPCClient as createTRPCProxyClient, createTRPCClientProxy, createTRPCUntypedClient, createWSClient, experimental_localLink, getFetch, getUntypedClient, httpBatchLink, httpBatchStreamLink, httpLink, httpSubscriptionLink, isFormData, isNonJsonSerializable, isOctetType, isTRPCClientError, jsonEncoder, loggerLink, retryLink, safe, splitLink, unstable_httpBatchStreamLink, unstable_httpSubscriptionLink, unstable_localLink, wsLink };
|
|
831
856
|
|
|
832
857
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/internals/TRPCUntypedClient.ts","../src/createTRPCUntypedClient.ts","../src/createTRPCClient.ts","../src/links/httpBatchStreamLink.ts","../src/internals/inputWithTrackedEventId.ts","../src/links/httpSubscriptionLink.ts","../src/links/retryLink.ts","../src/links/localLink.ts"],"sourcesContent":["import type {\n inferObservableValue,\n Unsubscribable,\n} from '@trpc/server/observable';\nimport { observableToPromise, share } from '@trpc/server/observable';\nimport type {\n AnyRouter,\n inferAsyncIterableYield,\n InferrableClientTypes,\n Maybe,\n TypeError,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { createChain } from '../links/internals/createChain';\nimport type { TRPCConnectionState } from '../links/internals/subscriptions';\nimport type {\n OperationContext,\n OperationLink,\n TRPCClientRuntime,\n TRPCLink,\n} from '../links/types';\nimport { TRPCClientError } from '../TRPCClientError';\n\ntype TRPCType = 'mutation' | 'query' | 'subscription';\nexport interface TRPCRequestOptions {\n /**\n * Pass additional context to links\n */\n context?: OperationContext;\n signal?: AbortSignal;\n}\n\nexport interface TRPCSubscriptionObserver<TValue, TError> {\n onStarted: (opts: { context: OperationContext | undefined }) => void;\n onData: (value: inferAsyncIterableYield<TValue>) => void;\n onError: (err: TError) => void;\n onStopped: () => void;\n onComplete: () => void;\n onConnectionStateChange: (state: TRPCConnectionState<TError>) => void;\n}\n\n/** @internal */\nexport type CreateTRPCClientOptions<TRouter extends InferrableClientTypes> = {\n links: TRPCLink<TRouter>[];\n transformer?: TypeError<'The transformer property has moved to httpLink/httpBatchLink/wsLink'>;\n};\n\nexport class TRPCUntypedClient<TInferrable extends InferrableClientTypes> {\n private readonly links: OperationLink<TInferrable>[];\n public readonly runtime: TRPCClientRuntime;\n private requestId: number;\n\n constructor(opts: CreateTRPCClientOptions<TInferrable>) {\n this.requestId = 0;\n\n this.runtime = {};\n\n // Initialize the links\n this.links = opts.links.map((link) => link(this.runtime));\n }\n\n private $request<TInput = unknown, TOutput = unknown>(opts: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n signal: Maybe<AbortSignal>;\n }) {\n const chain$ = createChain<AnyRouter, TInput, TOutput>({\n links: this.links as OperationLink<any, any, any>[],\n op: {\n ...opts,\n context: opts.context ?? {},\n id: ++this.requestId,\n },\n });\n return chain$.pipe(share());\n }\n\n private async requestAsPromise<TInput = unknown, TOutput = unknown>(opts: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n signal: Maybe<AbortSignal>;\n }): Promise<TOutput> {\n try {\n const req$ = this.$request<TInput, TOutput>(opts);\n type TValue = inferObservableValue<typeof req$>;\n\n const envelope = await observableToPromise<TValue>(req$);\n const data = (envelope.result as any).data;\n return data;\n } catch (err) {\n throw TRPCClientError.from(err as Error);\n }\n }\n public query(path: string, input?: unknown, opts?: TRPCRequestOptions) {\n return this.requestAsPromise<unknown, unknown>({\n type: 'query',\n path,\n input,\n context: opts?.context,\n signal: opts?.signal,\n });\n }\n public mutation(path: string, input?: unknown, opts?: TRPCRequestOptions) {\n return this.requestAsPromise<unknown, unknown>({\n type: 'mutation',\n path,\n input,\n context: opts?.context,\n signal: opts?.signal,\n });\n }\n public subscription(\n path: string,\n input: unknown,\n opts: Partial<\n TRPCSubscriptionObserver<unknown, TRPCClientError<AnyRouter>>\n > &\n TRPCRequestOptions,\n ): Unsubscribable {\n const observable$ = this.$request({\n type: 'subscription',\n path,\n input,\n context: opts.context,\n signal: opts.signal,\n });\n return observable$.subscribe({\n next(envelope) {\n switch (envelope.result.type) {\n case 'state': {\n opts.onConnectionStateChange?.(envelope.result);\n break;\n }\n case 'started': {\n opts.onStarted?.({\n context: envelope.context,\n });\n break;\n }\n case 'stopped': {\n opts.onStopped?.();\n break;\n }\n case 'data':\n case undefined: {\n opts.onData?.(envelope.result.data);\n break;\n }\n }\n },\n error(err) {\n opts.onError?.(err);\n },\n complete() {\n opts.onComplete?.();\n },\n });\n }\n}\n","import type { AnyRouter } from '@trpc/server/unstable-core-do-not-import';\nimport type { CreateTRPCClientOptions } from './internals/TRPCUntypedClient';\nimport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\n\nexport function createTRPCUntypedClient<TRouter extends AnyRouter>(\n opts: CreateTRPCClientOptions<TRouter>,\n): TRPCUntypedClient<TRouter> {\n return new TRPCUntypedClient(opts);\n}\n\nexport type {\n CreateTRPCClientOptions,\n TRPCRequestOptions,\n} from './internals/TRPCUntypedClient';\nexport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport type { Unsubscribable } from '@trpc/server/observable';\nimport type {\n AnyProcedure,\n AnyRouter,\n inferClientTypes,\n inferProcedureInput,\n InferrableClientTypes,\n inferTransformedProcedureOutput,\n ProcedureType,\n RouterRecord,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n createFlatProxy,\n createRecursiveProxy,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type { CreateTRPCClientOptions } from './createTRPCUntypedClient';\nimport type { TRPCSubscriptionObserver } from './internals/TRPCUntypedClient';\nimport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\nimport type { TRPCProcedureOptions } from './internals/types';\nimport type { TRPCClientError } from './TRPCClientError';\n\n/**\n * @public\n * @deprecated use {@link TRPCClient} instead, will be removed in v12\n **/\nexport type inferRouterClient<TRouter extends AnyRouter> = TRPCClient<TRouter>;\n\n/**\n * @public\n * @deprecated use {@link TRPCClient} instead, will be removed in v12\n **/\nexport type CreateTRPCClient<TRouter extends AnyRouter> = TRPCClient<TRouter>;\n\nconst untypedClientSymbol = Symbol.for('trpc_untypedClient');\n\n/**\n * @public\n **/\nexport type TRPCClient<TRouter extends AnyRouter> = DecoratedProcedureRecord<\n {\n transformer: TRouter['_def']['_config']['$types']['transformer'];\n errorShape: TRouter['_def']['_config']['$types']['errorShape'];\n },\n TRouter['_def']['record']\n> & {\n [untypedClientSymbol]: TRPCUntypedClient<TRouter>;\n};\n\n/** @internal */\nexport type TRPCResolverDef = {\n input: any;\n output: any;\n transformer: boolean;\n errorShape: any;\n};\n\ntype coerceAsyncGeneratorToIterable<T> =\n T extends AsyncGenerator<infer $T, infer $Return, infer $Next>\n ? AsyncIterable<$T, $Return, $Next>\n : T;\n\n/** @internal */\nexport type Resolver<TDef extends TRPCResolverDef> = (\n input: TDef['input'],\n opts?: TRPCProcedureOptions,\n) => Promise<coerceAsyncGeneratorToIterable<TDef['output']>>;\n\n/** @internal */\nexport type SubscriptionResolver<TDef extends TRPCResolverDef> = (\n input: TDef['input'],\n opts: Partial<\n TRPCSubscriptionObserver<TDef['output'], TRPCClientError<TDef>>\n > &\n TRPCProcedureOptions,\n) => Unsubscribable;\n\ntype DecorateProcedure<\n TType extends ProcedureType,\n TDef extends TRPCResolverDef,\n> = TType extends 'query'\n ? {\n query: Resolver<TDef>;\n }\n : TType extends 'mutation'\n ? {\n mutate: Resolver<TDef>;\n }\n : TType extends 'subscription'\n ? {\n subscribe: SubscriptionResolver<TDef>;\n }\n : never;\n\n/**\n * @internal\n */\ntype DecoratedProcedureRecord<\n TRoot extends InferrableClientTypes,\n TRecord extends RouterRecord,\n> = {\n [TKey in keyof TRecord]: TRecord[TKey] extends infer $Value\n ? $Value extends AnyProcedure\n ? DecorateProcedure<\n $Value['_def']['type'],\n {\n input: inferProcedureInput<$Value>;\n output: inferTransformedProcedureOutput<\n inferClientTypes<TRoot>,\n $Value\n >;\n errorShape: inferClientTypes<TRoot>['errorShape'];\n transformer: inferClientTypes<TRoot>['transformer'];\n }\n >\n : $Value extends RouterRecord\n ? DecoratedProcedureRecord<TRoot, $Value>\n : never\n : never;\n};\n\nconst clientCallTypeMap: Record<\n keyof DecorateProcedure<any, any>,\n ProcedureType\n> = {\n query: 'query',\n mutate: 'mutation',\n subscribe: 'subscription',\n};\n\n/** @internal */\nexport const clientCallTypeToProcedureType = (\n clientCallType: string,\n): ProcedureType => {\n return clientCallTypeMap[clientCallType as keyof typeof clientCallTypeMap];\n};\n\n/**\n * @internal\n */\nexport function createTRPCClientProxy<TRouter extends AnyRouter>(\n client: TRPCUntypedClient<TRouter>,\n): TRPCClient<TRouter> {\n const proxy = createRecursiveProxy<TRPCClient<TRouter>>(({ path, args }) => {\n const pathCopy = [...path];\n const procedureType = clientCallTypeToProcedureType(pathCopy.pop()!);\n\n const fullPath = pathCopy.join('.');\n\n return (client[procedureType] as any)(fullPath, ...(args as any));\n });\n return createFlatProxy<TRPCClient<TRouter>>((key) => {\n if (key === untypedClientSymbol) {\n return client;\n }\n return proxy[key];\n });\n}\n\nexport function createTRPCClient<TRouter extends AnyRouter>(\n opts: CreateTRPCClientOptions<TRouter>,\n): TRPCClient<TRouter> {\n const client = new TRPCUntypedClient(opts);\n const proxy = createTRPCClientProxy<TRouter>(client);\n return proxy;\n}\n\n/**\n * Get an untyped client from a proxy client\n * @internal\n */\nexport function getUntypedClient<TRouter extends AnyRouter>(\n client: TRPCClient<TRouter>,\n): TRPCUntypedClient<TRouter> {\n return client[untypedClientSymbol];\n}\n","import type { AnyRouter, ProcedureType } from '@trpc/server';\nimport { observable } from '@trpc/server/observable';\nimport type { TRPCErrorShape, TRPCResponse } from '@trpc/server/rpc';\nimport type { AnyClientTypes } from '@trpc/server/unstable-core-do-not-import';\nimport { jsonlStreamConsumer } from '@trpc/server/unstable-core-do-not-import';\nimport type { BatchLoader } from '../internals/dataLoader';\nimport { dataLoader } from '../internals/dataLoader';\nimport { allAbortSignals, raceAbortSignals } from '../internals/signals';\nimport type { NonEmptyArray } from '../internals/types';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { HTTPBatchLinkOptions } from './HTTPBatchLinkOptions';\nimport type { HTTPResult } from './internals/httpUtils';\nimport {\n fetchHTTPResponse,\n getBody,\n getUrl,\n resolveHTTPLinkOptions,\n} from './internals/httpUtils';\nimport type { Operation, TRPCLink } from './types';\n\nexport type HTTPBatchStreamLinkOptions<TRoot extends AnyClientTypes> =\n HTTPBatchLinkOptions<TRoot> & {\n /**\n * Which header to use to signal the server that the client wants a streaming response.\n * - `'trpc-accept'` (default): sends `trpc-accept: application/jsonl` header\n * - `'accept'`: sends `Accept: application/jsonl` header, which can avoid CORS preflight for cross-origin streaming queries. Be aware that `application/jsonl` is not an official MIME type and so this is not completely spec-compliant - you should test that your infrastructure supports this value.\n * @default 'trpc-accept'\n */\n streamHeader?: 'trpc-accept' | 'accept';\n };\n\n/**\n * @see https://trpc.io/docs/client/links/httpBatchStreamLink\n */\nexport function httpBatchStreamLink<TRouter extends AnyRouter>(\n opts: HTTPBatchStreamLinkOptions<TRouter['_def']['_config']['$types']>,\n): TRPCLink<TRouter> {\n const resolvedOpts = resolveHTTPLinkOptions(opts);\n const maxURLLength = opts.maxURLLength ?? Infinity;\n const maxItems = opts.maxItems ?? Infinity;\n\n return () => {\n const batchLoader = (\n type: ProcedureType,\n ): BatchLoader<Operation, HTTPResult> => {\n return {\n validate(batchOps) {\n if (maxURLLength === Infinity && maxItems === Infinity) {\n // escape hatch for quick calcs\n return true;\n }\n if (batchOps.length > maxItems) {\n return false;\n }\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const url = getUrl({\n ...resolvedOpts,\n type,\n path,\n inputs,\n signal: null,\n });\n\n return url.length <= maxURLLength;\n },\n async fetch(batchOps) {\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const batchSignals = allAbortSignals(\n ...batchOps.map((op) => op.signal),\n );\n const abortController = new AbortController();\n\n const responsePromise = fetchHTTPResponse({\n ...resolvedOpts,\n signal: raceAbortSignals(batchSignals, abortController.signal),\n type,\n contentTypeHeader: 'application/json',\n trpcAcceptHeader: 'application/jsonl',\n trpcAcceptHeaderKey: opts.streamHeader ?? 'trpc-accept',\n getUrl,\n getBody,\n inputs,\n path,\n headers() {\n if (!opts.headers) {\n return {};\n }\n if (typeof opts.headers === 'function') {\n return opts.headers({\n opList: batchOps as NonEmptyArray<Operation>,\n });\n }\n return opts.headers;\n },\n });\n\n const res = await responsePromise;\n\n if (!res.ok) {\n // Server returned a non-2xx response (e.g. batching disabled).\n // The body is plain JSON, not JSONL, so parse it directly and\n // propagate the same error to every operation in the batch.\n const json = (await res.json()) as TRPCResponse;\n if ('error' in json) {\n json.error = resolvedOpts.transformer.output.deserialize(\n json.error,\n );\n }\n\n return batchOps.map((): Promise<HTTPResult> =>\n Promise.resolve({\n json,\n meta: {\n response: res,\n },\n }),\n );\n }\n\n const [head] = await jsonlStreamConsumer<\n Record<string, Promise<any>>\n >({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n from: res.body!,\n deserialize: (data) =>\n resolvedOpts.transformer.output.deserialize(data),\n // onError: console.error,\n formatError(opts) {\n const error = opts.error as TRPCErrorShape;\n return TRPCClientError.from({\n error,\n });\n },\n abortController,\n });\n const promises = Object.keys(batchOps).map(\n async (key): Promise<HTTPResult> => {\n let json: TRPCResponse = await Promise.resolve(head[key]);\n\n if ('result' in json) {\n /**\n * Not very pretty, but we need to unwrap nested data as promises\n * Our stream producer will only resolve top-level async values or async values that are directly nested in another async value\n */\n const result = await Promise.resolve(json.result);\n json = {\n result: {\n data: await Promise.resolve(result.data),\n },\n };\n }\n\n return {\n json,\n meta: {\n response: res,\n },\n };\n },\n );\n return promises;\n },\n };\n };\n\n const query = dataLoader(batchLoader('query'));\n const mutation = dataLoader(batchLoader('mutation'));\n\n const loaders = { query, mutation };\n return ({ op }) => {\n return observable((observer) => {\n /* istanbul ignore if -- @preserve */\n if (op.type === 'subscription') {\n throw new Error(\n 'Subscriptions are unsupported by `httpBatchStreamLink` - use `httpSubscriptionLink` or `wsLink`',\n );\n }\n const ac = new AbortController();\n const loader = loaders[op.type];\n const promise = loader.load({\n ...op,\n signal: raceAbortSignals(op.signal, ac.signal),\n });\n\n let isDone = false;\n let _res = undefined as HTTPResult | undefined;\n promise\n .then((res) => {\n isDone = true;\n _res = res;\n if ('error' in res.json) {\n observer.error(\n TRPCClientError.from(res.json, {\n meta: res.meta,\n }),\n );\n return;\n } else if ('result' in res.json) {\n observer.next({\n context: res.meta,\n result: res.json.result,\n });\n observer.complete();\n return;\n }\n\n observer.complete();\n })\n .catch((err) => {\n isDone = true;\n observer.error(\n TRPCClientError.from(err, {\n meta: _res?.meta,\n }),\n );\n });\n\n return () => {\n if (!isDone) {\n ac.abort();\n }\n };\n });\n };\n };\n}\n\n/**\n * @deprecated use {@link httpBatchStreamLink} instead\n */\nexport const unstable_httpBatchStreamLink = httpBatchStreamLink;\n","export function inputWithTrackedEventId(\n input: unknown,\n lastEventId: string | undefined,\n) {\n if (!lastEventId) {\n return input;\n }\n if (input != null && typeof input !== 'object') {\n return input;\n }\n return {\n ...(input ?? {}),\n lastEventId,\n };\n}\n","import { behaviorSubject, observable } from '@trpc/server/observable';\nimport type { TRPCErrorShape, TRPCResult } from '@trpc/server/rpc';\nimport type {\n AnyClientTypes,\n EventSourceLike,\n inferClientTypes,\n InferrableClientTypes,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n retryableRpcCodes,\n run,\n sseStreamConsumer,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport { raceAbortSignals } from '../internals/signals';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { TRPCConnectionState } from '../unstable-internals';\nimport { getTransformer, type TransformerOptions } from '../unstable-internals';\nimport { getUrl } from './internals/httpUtils';\nimport {\n resultOf,\n type UrlOptionsWithConnectionParams,\n} from './internals/urlWithConnectionParams';\nimport type { Operation, TRPCLink } from './types';\n\nasync function urlWithConnectionParams(\n opts: UrlOptionsWithConnectionParams,\n): Promise<string> {\n let url = await resultOf(opts.url);\n if (opts.connectionParams) {\n const params = await resultOf(opts.connectionParams);\n\n const prefix = url.includes('?') ? '&' : '?';\n url +=\n prefix + 'connectionParams=' + encodeURIComponent(JSON.stringify(params));\n }\n\n return url;\n}\n\ntype HTTPSubscriptionLinkOptions<\n TRoot extends AnyClientTypes,\n TEventSource extends EventSourceLike.AnyConstructor = typeof EventSource,\n> = {\n /**\n * EventSource ponyfill\n */\n EventSource?: TEventSource;\n /**\n * EventSource options or a callback that returns them\n */\n eventSourceOptions?:\n | EventSourceLike.InitDictOf<TEventSource>\n | ((opts: {\n op: Operation;\n }) =>\n | EventSourceLike.InitDictOf<TEventSource>\n | Promise<EventSourceLike.InitDictOf<TEventSource>>);\n} & TransformerOptions<TRoot> &\n UrlOptionsWithConnectionParams;\n\n/**\n * @see https://trpc.io/docs/client/links/httpSubscriptionLink\n */\nexport function httpSubscriptionLink<\n TInferrable extends InferrableClientTypes,\n TEventSource extends EventSourceLike.AnyConstructor,\n>(\n opts: HTTPSubscriptionLinkOptions<\n inferClientTypes<TInferrable>,\n TEventSource\n >,\n): TRPCLink<TInferrable> {\n const transformer = getTransformer(opts.transformer);\n\n return () => {\n return ({ op }) => {\n return observable((observer) => {\n const { type, path, input } = op;\n\n /* istanbul ignore if -- @preserve */\n if (type !== 'subscription') {\n throw new Error('httpSubscriptionLink only supports subscriptions');\n }\n\n let lastEventId: string | undefined = undefined;\n const ac = new AbortController();\n const signal = raceAbortSignals(op.signal, ac.signal);\n const eventSourceStream = sseStreamConsumer<{\n EventSource: TEventSource;\n data: Partial<{\n id?: string;\n data: unknown;\n }>;\n error: TRPCErrorShape;\n }>({\n url: async () =>\n getUrl({\n transformer,\n url: await urlWithConnectionParams(opts),\n input: inputWithTrackedEventId(input, lastEventId),\n path,\n type,\n signal: null,\n }),\n init: () => resultOf(opts.eventSourceOptions, { op }),\n signal,\n deserialize: (data) => transformer.output.deserialize(data),\n EventSource: opts.EventSource ?? (globalThis.EventSource as never),\n });\n\n const connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<any>>\n >({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n\n const connectionSub = connectionState.subscribe({\n next(state) {\n observer.next({\n result: state,\n });\n },\n });\n run(async () => {\n for await (const chunk of eventSourceStream) {\n switch (chunk.type) {\n case 'ping':\n // do nothing\n break;\n case 'data':\n const chunkData = chunk.data;\n\n let result: TRPCResult<unknown>;\n if (chunkData.id) {\n // if the `tracked()`-helper is used, we always have an `id` field\n lastEventId = chunkData.id;\n result = {\n id: chunkData.id,\n data: chunkData,\n };\n } else {\n result = {\n data: chunkData.data,\n };\n }\n\n observer.next({\n result,\n context: {\n eventSource: chunk.eventSource,\n },\n });\n break;\n case 'connected': {\n observer.next({\n result: {\n type: 'started',\n },\n context: {\n eventSource: chunk.eventSource,\n },\n });\n connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n break;\n }\n case 'serialized-error': {\n const error = TRPCClientError.from({ error: chunk.error });\n\n if (retryableRpcCodes.includes(chunk.error.code)) {\n //\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error,\n });\n break;\n }\n //\n // non-retryable error, cancel the subscription\n throw error;\n }\n case 'connecting': {\n const lastState = connectionState.get();\n\n const error = chunk.event && TRPCClientError.from(chunk.event);\n if (!error && lastState.state === 'connecting') {\n break;\n }\n\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error,\n });\n break;\n }\n case 'timeout': {\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error: new TRPCClientError(\n `Timeout of ${chunk.ms}ms reached while waiting for a response`,\n ),\n });\n }\n }\n }\n observer.next({\n result: {\n type: 'stopped',\n },\n });\n connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n observer.complete();\n }).catch((error) => {\n observer.error(TRPCClientError.from(error));\n });\n\n return () => {\n observer.complete();\n ac.abort();\n connectionSub.unsubscribe();\n };\n });\n };\n };\n}\n\n/**\n * @deprecated use {@link httpSubscriptionLink} instead\n */\nexport const unstable_httpSubscriptionLink = httpSubscriptionLink;\n","/* istanbul ignore file -- @preserve */\n// We're not actually exporting this link\nimport type { Unsubscribable } from '@trpc/server/observable';\nimport { observable } from '@trpc/server/observable';\nimport type { InferrableClientTypes } from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport type { TRPCClientError } from '../TRPCClientError';\nimport type { Operation, TRPCLink } from './types';\n\ninterface RetryLinkOptions<TInferrable extends InferrableClientTypes> {\n /**\n * The retry function\n */\n retry: (opts: RetryFnOptions<TInferrable>) => boolean;\n /**\n * The delay between retries in ms (defaults to 0)\n */\n retryDelayMs?: (attempt: number) => number;\n}\n\ninterface RetryFnOptions<TInferrable extends InferrableClientTypes> {\n /**\n * The operation that failed\n */\n op: Operation;\n /**\n * The error that occurred\n */\n error: TRPCClientError<TInferrable>;\n /**\n * The number of attempts that have been made (including the first call)\n */\n attempts: number;\n}\n\n/**\n * @see https://trpc.io/docs/v11/client/links/retryLink\n */\nexport function retryLink<TInferrable extends InferrableClientTypes>(\n opts: RetryLinkOptions<TInferrable>,\n): TRPCLink<TInferrable> {\n // initialized config\n return () => {\n // initialized in app\n return (callOpts) => {\n // initialized for request\n return observable((observer) => {\n let next$: Unsubscribable;\n let callNextTimeout: ReturnType<typeof setTimeout> | undefined =\n undefined;\n\n let lastEventId: string | undefined = undefined;\n\n attempt(1);\n\n function opWithLastEventId() {\n const op = callOpts.op;\n if (!lastEventId) {\n return op;\n }\n\n return {\n ...op,\n input: inputWithTrackedEventId(op.input, lastEventId),\n };\n }\n\n function attempt(attempts: number) {\n const op = opWithLastEventId();\n\n next$ = callOpts.next(op).subscribe({\n error(error) {\n const shouldRetry = opts.retry({\n op,\n attempts,\n error,\n });\n if (!shouldRetry) {\n observer.error(error);\n return;\n }\n const delayMs = opts.retryDelayMs?.(attempts) ?? 0;\n\n if (delayMs <= 0) {\n attempt(attempts + 1);\n return;\n }\n callNextTimeout = setTimeout(\n () => attempt(attempts + 1),\n delayMs,\n );\n },\n next(envelope) {\n //\n if (\n (!envelope.result.type || envelope.result.type === 'data') &&\n envelope.result.id\n ) {\n //\n lastEventId = envelope.result.id;\n }\n\n observer.next(envelope);\n },\n complete() {\n observer.complete();\n },\n });\n }\n return () => {\n next$.unsubscribe();\n clearTimeout(callNextTimeout);\n };\n });\n };\n };\n}\n","import {\n getTRPCErrorFromUnknown,\n getTRPCErrorShape,\n isTrackedEnvelope,\n} from '@trpc/server';\nimport { behaviorSubject, observable } from '@trpc/server/observable';\nimport { TRPC_ERROR_CODES_BY_KEY, type TRPCResult } from '@trpc/server/rpc';\nimport {\n callProcedure,\n isAbortError,\n isAsyncIterable,\n iteratorResource,\n makeResource,\n retryableRpcCodes,\n run,\n type AnyRouter,\n type ErrorHandlerOptions,\n type inferClientTypes,\n type inferRouterContext,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport { abortSignalToPromise, raceAbortSignals } from '../internals/signals';\nimport { getTransformer } from '../internals/transformer';\nimport type { TransformerOptions } from '../internals/transformer';\nimport { isTRPCClientError, TRPCClientError } from '../TRPCClientError';\nimport type { TRPCConnectionState } from './internals/subscriptions';\nimport type { TRPCLink } from './types';\n\nexport type LocalLinkOptions<TRouter extends AnyRouter> = {\n router: TRouter;\n createContext: () => Promise<inferRouterContext<TRouter>>;\n onError?: (opts: ErrorHandlerOptions<inferRouterContext<TRouter>>) => void;\n} & TransformerOptions<inferClientTypes<TRouter>>;\n\n/**\n * localLink is a terminating link that allows you to make tRPC procedure calls directly in your application without going through HTTP.\n *\n * @see https://trpc.io/docs/links/localLink\n */\nexport function unstable_localLink<TRouter extends AnyRouter>(\n opts: LocalLinkOptions<TRouter>,\n): TRPCLink<TRouter> {\n const transformer = getTransformer(opts.transformer);\n\n const transformChunk = (chunk: unknown) => {\n if (opts.transformer) {\n // assume transformer will do the right thing\n return chunk;\n }\n // Special case for undefined, because `JSON.stringify(undefined)` throws\n if (chunk === undefined) {\n return chunk;\n }\n const serialized = JSON.stringify(transformer.input.serialize(chunk));\n const deserialized = JSON.parse(transformer.output.deserialize(serialized));\n return deserialized;\n };\n\n return () =>\n ({ op }) =>\n observable((observer) => {\n let ctx: inferRouterContext<TRouter> | undefined = undefined;\n const ac = new AbortController();\n\n const signal = raceAbortSignals(op.signal, ac.signal);\n const signalPromise = abortSignalToPromise(signal);\n\n signalPromise.catch(() => {\n // prevent unhandled rejection\n });\n\n let input = op.input;\n async function runProcedure(newInput: unknown): Promise<unknown> {\n input = newInput;\n\n ctx = await opts.createContext();\n\n return callProcedure({\n router: opts.router,\n path: op.path,\n getRawInput: async () => newInput,\n ctx,\n type: op.type,\n signal,\n batchIndex: 0,\n });\n }\n\n function onErrorCallback(cause: unknown) {\n if (isAbortError(cause)) {\n return;\n }\n opts.onError?.({\n error: getTRPCErrorFromUnknown(cause),\n type: op.type,\n path: op.path,\n input,\n ctx,\n });\n }\n\n function coerceToTRPCClientError(cause: unknown) {\n if (isTRPCClientError<TRouter>(cause)) {\n return cause;\n }\n const error = getTRPCErrorFromUnknown(cause);\n\n const shape = getTRPCErrorShape({\n config: opts.router._def._config,\n ctx,\n error,\n input,\n path: op.path,\n type: op.type,\n });\n return TRPCClientError.from(\n { error: transformChunk(shape) },\n { cause: cause instanceof Error ? cause : undefined },\n );\n }\n\n run(async () => {\n switch (op.type) {\n case 'query':\n case 'mutation': {\n const result = await runProcedure(op.input);\n if (!isAsyncIterable(result)) {\n observer.next({\n result: { data: transformChunk(result) },\n });\n observer.complete();\n break;\n }\n\n observer.next({\n result: {\n data: (async function* () {\n await using iterator = iteratorResource(result);\n using _finally = makeResource({}, () => {\n observer.complete();\n });\n try {\n while (true) {\n const res = await Promise.race([\n iterator.next(),\n signalPromise,\n ]);\n if (res.done) {\n return transformChunk(res.value);\n }\n yield transformChunk(res.value);\n }\n } catch (cause) {\n onErrorCallback(cause);\n throw coerceToTRPCClientError(cause);\n }\n })(),\n },\n });\n break;\n }\n case 'subscription': {\n const connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<any>>\n >({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n\n const connectionSub = connectionState.subscribe({\n next(state) {\n observer.next({\n result: state,\n });\n },\n });\n let lastEventId: string | undefined = undefined;\n\n using _finally = makeResource({}, async () => {\n observer.complete();\n\n connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n connectionSub.unsubscribe();\n });\n while (true) {\n const result = await runProcedure(\n inputWithTrackedEventId(op.input, lastEventId),\n );\n if (!isAsyncIterable(result)) {\n throw new Error('Expected an async iterable');\n }\n await using iterator = iteratorResource(result);\n\n observer.next({\n result: {\n type: 'started',\n },\n });\n connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n\n // Use a while loop to handle errors and reconnects\n while (true) {\n let res;\n try {\n res = await Promise.race([iterator.next(), signalPromise]);\n } catch (cause) {\n if (isAbortError(cause)) {\n return;\n }\n const error = getTRPCErrorFromUnknown(cause);\n\n if (\n !retryableRpcCodes.includes(\n TRPC_ERROR_CODES_BY_KEY[error.code],\n )\n ) {\n throw coerceToTRPCClientError(error);\n }\n\n onErrorCallback(error);\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error: coerceToTRPCClientError(error),\n });\n\n break;\n }\n\n if (res.done) {\n return;\n }\n let chunk: TRPCResult<unknown>;\n if (isTrackedEnvelope(res.value)) {\n lastEventId = res.value[0];\n\n chunk = {\n id: res.value[0],\n data: {\n id: res.value[0],\n data: res.value[1],\n },\n };\n } else {\n chunk = {\n data: res.value,\n };\n }\n\n observer.next({\n result: {\n ...chunk,\n data: transformChunk(chunk.data),\n },\n });\n }\n }\n break;\n }\n }\n }).catch((cause) => {\n onErrorCallback(cause);\n observer.error(coerceToTRPCClientError(cause));\n });\n\n return () => {\n ac.abort();\n };\n });\n}\n/**\n * @deprecated Renamed to `unstable_localLink`. This alias will be removed in a future major release.\n */\nexport const experimental_localLink: typeof unstable_localLink =\n unstable_localLink;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/internals/TRPCUntypedClient.ts","../src/createTRPCUntypedClient.ts","../src/createTRPCClient.ts","../src/links/httpBatchStreamLink.ts","../src/internals/inputWithTrackedEventId.ts","../src/links/httpSubscriptionLink.ts","../src/links/retryLink.ts","../src/links/localLink.ts","../src/safe.ts"],"sourcesContent":["import type {\n inferObservableValue,\n Unsubscribable,\n} from '@trpc/server/observable';\nimport { observableToPromise, share } from '@trpc/server/observable';\nimport type {\n AnyRouter,\n inferAsyncIterableYield,\n InferrableClientTypes,\n Maybe,\n TypeError,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { createChain } from '../links/internals/createChain';\nimport type { TRPCConnectionState } from '../links/internals/subscriptions';\nimport type {\n OperationContext,\n OperationLink,\n TRPCClientRuntime,\n TRPCLink,\n} from '../links/types';\nimport { TRPCClientError } from '../TRPCClientError';\n\ntype TRPCType = 'mutation' | 'query' | 'subscription';\nexport interface TRPCRequestOptions {\n /**\n * Pass additional context to links\n */\n context?: OperationContext;\n signal?: AbortSignal;\n}\n\nexport interface TRPCSubscriptionObserver<TValue, TError> {\n onStarted: (opts: { context: OperationContext | undefined }) => void;\n onData: (value: inferAsyncIterableYield<TValue>) => void;\n onError: (err: TError) => void;\n onStopped: () => void;\n onComplete: () => void;\n onConnectionStateChange: (state: TRPCConnectionState<TError>) => void;\n}\n\n/** @internal */\nexport type CreateTRPCClientOptions<TRouter extends InferrableClientTypes> = {\n links: TRPCLink<TRouter>[];\n transformer?: TypeError<'The transformer property has moved to httpLink/httpBatchLink/wsLink'>;\n};\n\nexport class TRPCUntypedClient<TInferrable extends InferrableClientTypes> {\n private readonly links: OperationLink<TInferrable>[];\n public readonly runtime: TRPCClientRuntime;\n private requestId: number;\n\n constructor(opts: CreateTRPCClientOptions<TInferrable>) {\n this.requestId = 0;\n\n this.runtime = {};\n\n // Initialize the links\n this.links = opts.links.map((link) => link(this.runtime));\n }\n\n private $request<TInput = unknown, TOutput = unknown>(opts: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n signal: Maybe<AbortSignal>;\n }) {\n const chain$ = createChain<AnyRouter, TInput, TOutput>({\n links: this.links as OperationLink<any, any, any>[],\n op: {\n ...opts,\n context: opts.context ?? {},\n id: ++this.requestId,\n },\n });\n return chain$.pipe(share());\n }\n\n private async requestAsPromise<TInput = unknown, TOutput = unknown>(opts: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n signal: Maybe<AbortSignal>;\n }): Promise<TOutput> {\n try {\n const req$ = this.$request<TInput, TOutput>(opts);\n type TValue = inferObservableValue<typeof req$>;\n\n const envelope = await observableToPromise<TValue>(req$);\n const data = (envelope.result as any).data;\n return data;\n } catch (err) {\n throw TRPCClientError.from(err as Error);\n }\n }\n public query(path: string, input?: unknown, opts?: TRPCRequestOptions) {\n return this.requestAsPromise<unknown, unknown>({\n type: 'query',\n path,\n input,\n context: opts?.context,\n signal: opts?.signal,\n });\n }\n public mutation(path: string, input?: unknown, opts?: TRPCRequestOptions) {\n return this.requestAsPromise<unknown, unknown>({\n type: 'mutation',\n path,\n input,\n context: opts?.context,\n signal: opts?.signal,\n });\n }\n public subscription(\n path: string,\n input: unknown,\n opts: Partial<\n TRPCSubscriptionObserver<unknown, TRPCClientError<AnyRouter>>\n > &\n TRPCRequestOptions,\n ): Unsubscribable {\n const observable$ = this.$request({\n type: 'subscription',\n path,\n input,\n context: opts.context,\n signal: opts.signal,\n });\n return observable$.subscribe({\n next(envelope) {\n switch (envelope.result.type) {\n case 'state': {\n opts.onConnectionStateChange?.(envelope.result);\n break;\n }\n case 'started': {\n opts.onStarted?.({\n context: envelope.context,\n });\n break;\n }\n case 'stopped': {\n opts.onStopped?.();\n break;\n }\n case 'data':\n case undefined: {\n opts.onData?.(envelope.result.data);\n break;\n }\n }\n },\n error(err) {\n opts.onError?.(err);\n },\n complete() {\n opts.onComplete?.();\n },\n });\n }\n}\n","import type { AnyRouter } from '@trpc/server/unstable-core-do-not-import';\nimport type { CreateTRPCClientOptions } from './internals/TRPCUntypedClient';\nimport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\n\nexport function createTRPCUntypedClient<TRouter extends AnyRouter>(\n opts: CreateTRPCClientOptions<TRouter>,\n): TRPCUntypedClient<TRouter> {\n return new TRPCUntypedClient(opts);\n}\n\nexport type {\n CreateTRPCClientOptions,\n TRPCRequestOptions,\n} from './internals/TRPCUntypedClient';\nexport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport type { Unsubscribable } from '@trpc/server/observable';\nimport type {\n AnyProcedure,\n AnyRouter,\n inferClientTypes,\n inferProcedureErrorShape,\n inferProcedureInput,\n InferrableClientTypes,\n inferTransformedProcedureOutput,\n ProcedureType,\n RouterRecord,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n createFlatProxy,\n createRecursiveProxy,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type { CreateTRPCClientOptions } from './createTRPCUntypedClient';\nimport type { TRPCSubscriptionObserver } from './internals/TRPCUntypedClient';\nimport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\nimport type { TRPCProcedureOptions } from './internals/types';\nimport type { TRPCTaggedPromise } from './safe';\nimport type { TRPCClientError } from './TRPCClientError';\n\n/**\n * @public\n * @deprecated use {@link TRPCClient} instead, will be removed in v12\n **/\nexport type inferRouterClient<TRouter extends AnyRouter> = TRPCClient<TRouter>;\n\n/**\n * @public\n * @deprecated use {@link TRPCClient} instead, will be removed in v12\n **/\nexport type CreateTRPCClient<TRouter extends AnyRouter> = TRPCClient<TRouter>;\n\nconst untypedClientSymbol = Symbol.for('trpc_untypedClient');\n\n/**\n * @public\n **/\nexport type TRPCClient<TRouter extends AnyRouter> = DecoratedProcedureRecord<\n {\n transformer: TRouter['_def']['_config']['$types']['transformer'];\n errorShape: TRouter['_def']['_config']['$types']['errorShape'];\n },\n TRouter['_def']['record']\n> & {\n [untypedClientSymbol]: TRPCUntypedClient<TRouter>;\n};\n\n/** @internal */\nexport type TRPCResolverDef = {\n input: any;\n output: any;\n transformer: boolean;\n errorShape: any;\n};\n\ntype coerceAsyncGeneratorToIterable<T> =\n T extends AsyncGenerator<infer $T, infer $Return, infer $Next>\n ? AsyncIterable<$T, $Return, $Next>\n : T;\n\n/** @internal */\nexport type Resolver<TDef extends TRPCResolverDef> = (\n input: TDef['input'],\n opts?: TRPCProcedureOptions,\n) => TRPCTaggedPromise<\n coerceAsyncGeneratorToIterable<TDef['output']>,\n TDef['errorShape']\n>;\n\n/** @internal */\nexport type SubscriptionResolver<TDef extends TRPCResolverDef> = (\n input: TDef['input'],\n opts: Partial<\n TRPCSubscriptionObserver<TDef['output'], TRPCClientError<TDef>>\n > &\n TRPCProcedureOptions,\n) => Unsubscribable;\n\ntype DecorateProcedure<\n TType extends ProcedureType,\n TDef extends TRPCResolverDef,\n> = TType extends 'query'\n ? {\n query: Resolver<TDef>;\n }\n : TType extends 'mutation'\n ? {\n mutate: Resolver<TDef>;\n }\n : TType extends 'subscription'\n ? {\n subscribe: SubscriptionResolver<TDef>;\n }\n : never;\n\n/**\n * @internal\n */\ntype DecoratedProcedureRecord<\n TRoot extends InferrableClientTypes,\n TRecord extends RouterRecord,\n> = {\n [TKey in keyof TRecord]: TRecord[TKey] extends infer $Value\n ? $Value extends AnyProcedure\n ? DecorateProcedure<\n $Value['_def']['type'],\n {\n input: inferProcedureInput<$Value>;\n output: inferTransformedProcedureOutput<\n inferClientTypes<TRoot>,\n $Value\n >;\n errorShape: inferProcedureErrorShape<TRoot, $Value>;\n transformer: inferClientTypes<TRoot>['transformer'];\n }\n >\n : $Value extends RouterRecord\n ? DecoratedProcedureRecord<TRoot, $Value>\n : never\n : never;\n};\n\nconst clientCallTypeMap: Record<\n keyof DecorateProcedure<any, any>,\n ProcedureType\n> = {\n query: 'query',\n mutate: 'mutation',\n subscribe: 'subscription',\n};\n\n/** @internal */\nexport const clientCallTypeToProcedureType = (\n clientCallType: string,\n): ProcedureType => {\n return clientCallTypeMap[clientCallType as keyof typeof clientCallTypeMap];\n};\n\n/**\n * @internal\n */\nexport function createTRPCClientProxy<TRouter extends AnyRouter>(\n client: TRPCUntypedClient<TRouter>,\n): TRPCClient<TRouter> {\n const proxy = createRecursiveProxy<TRPCClient<TRouter>>(({ path, args }) => {\n const pathCopy = [...path];\n const procedureType = clientCallTypeToProcedureType(pathCopy.pop()!);\n\n const fullPath = pathCopy.join('.');\n\n return (client[procedureType] as any)(fullPath, ...(args as any));\n });\n return createFlatProxy<TRPCClient<TRouter>>((key) => {\n if (key === untypedClientSymbol) {\n return client;\n }\n return proxy[key];\n });\n}\n\nexport function createTRPCClient<TRouter extends AnyRouter>(\n opts: CreateTRPCClientOptions<TRouter>,\n): TRPCClient<TRouter> {\n const client = new TRPCUntypedClient(opts);\n const proxy = createTRPCClientProxy<TRouter>(client);\n return proxy;\n}\n\n/**\n * Get an untyped client from a proxy client\n * @internal\n */\nexport function getUntypedClient<TRouter extends AnyRouter>(\n client: TRPCClient<TRouter>,\n): TRPCUntypedClient<TRouter> {\n return client[untypedClientSymbol];\n}\n","import type { AnyRouter, ProcedureType } from '@trpc/server';\nimport { observable } from '@trpc/server/observable';\nimport type { TRPCErrorShape, TRPCResponse } from '@trpc/server/rpc';\nimport type { AnyClientTypes } from '@trpc/server/unstable-core-do-not-import';\nimport { jsonlStreamConsumer } from '@trpc/server/unstable-core-do-not-import';\nimport type { BatchLoader } from '../internals/dataLoader';\nimport { dataLoader } from '../internals/dataLoader';\nimport { allAbortSignals, raceAbortSignals } from '../internals/signals';\nimport type { NonEmptyArray } from '../internals/types';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { HTTPBatchLinkOptions } from './HTTPBatchLinkOptions';\nimport type { HTTPResult } from './internals/httpUtils';\nimport {\n fetchHTTPResponse,\n getBody,\n getUrl,\n resolveHTTPLinkOptions,\n} from './internals/httpUtils';\nimport type { Operation, TRPCLink } from './types';\n\nexport type HTTPBatchStreamLinkOptions<TRoot extends AnyClientTypes> =\n HTTPBatchLinkOptions<TRoot> & {\n /**\n * Which header to use to signal the server that the client wants a streaming response.\n * - `'trpc-accept'` (default): sends `trpc-accept: application/jsonl` header\n * - `'accept'`: sends `Accept: application/jsonl` header, which can avoid CORS preflight for cross-origin streaming queries. Be aware that `application/jsonl` is not an official MIME type and so this is not completely spec-compliant - you should test that your infrastructure supports this value.\n * @default 'trpc-accept'\n */\n streamHeader?: 'trpc-accept' | 'accept';\n };\n\n/**\n * @see https://trpc.io/docs/client/links/httpBatchStreamLink\n */\nexport function httpBatchStreamLink<TRouter extends AnyRouter>(\n opts: HTTPBatchStreamLinkOptions<TRouter['_def']['_config']['$types']>,\n): TRPCLink<TRouter> {\n const resolvedOpts = resolveHTTPLinkOptions(opts);\n const maxURLLength = opts.maxURLLength ?? Infinity;\n const maxItems = opts.maxItems ?? Infinity;\n\n return () => {\n const batchLoader = (\n type: ProcedureType,\n ): BatchLoader<Operation, HTTPResult> => {\n return {\n validate(batchOps) {\n if (maxURLLength === Infinity && maxItems === Infinity) {\n // escape hatch for quick calcs\n return true;\n }\n if (batchOps.length > maxItems) {\n return false;\n }\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const url = getUrl({\n ...resolvedOpts,\n type,\n path,\n inputs,\n signal: null,\n });\n\n return url.length <= maxURLLength;\n },\n async fetch(batchOps) {\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const batchSignals = allAbortSignals(\n ...batchOps.map((op) => op.signal),\n );\n const abortController = new AbortController();\n\n const responsePromise = fetchHTTPResponse({\n ...resolvedOpts,\n signal: raceAbortSignals(batchSignals, abortController.signal),\n type,\n contentTypeHeader: 'application/json',\n trpcAcceptHeader: 'application/jsonl',\n trpcAcceptHeaderKey: opts.streamHeader ?? 'trpc-accept',\n getUrl,\n getBody,\n inputs,\n path,\n headers() {\n if (!opts.headers) {\n return {};\n }\n if (typeof opts.headers === 'function') {\n return opts.headers({\n opList: batchOps as NonEmptyArray<Operation>,\n });\n }\n return opts.headers;\n },\n });\n\n const res = await responsePromise;\n\n if (!res.ok) {\n // Server returned a non-2xx response (e.g. batching disabled).\n // The body is plain JSON, not JSONL, so parse it directly and\n // propagate the same error to every operation in the batch.\n const json = (await res.json()) as TRPCResponse;\n if ('error' in json) {\n json.error = resolvedOpts.transformer.output.deserialize(\n json.error,\n );\n }\n\n return batchOps.map((): Promise<HTTPResult> =>\n Promise.resolve({\n json,\n meta: {\n response: res,\n },\n }),\n );\n }\n\n const [head] = await jsonlStreamConsumer<\n Record<string, Promise<any>>\n >({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n from: res.body!,\n deserialize: (data) =>\n resolvedOpts.transformer.output.deserialize(data),\n // onError: console.error,\n formatError(opts) {\n const error = opts.error as TRPCErrorShape;\n return TRPCClientError.from({\n error,\n });\n },\n abortController,\n });\n const promises = Object.keys(batchOps).map(\n async (key): Promise<HTTPResult> => {\n let json: TRPCResponse = await Promise.resolve(head[key]);\n\n if ('result' in json) {\n /**\n * Not very pretty, but we need to unwrap nested data as promises\n * Our stream producer will only resolve top-level async values or async values that are directly nested in another async value\n */\n const result = await Promise.resolve(json.result);\n json = {\n result: {\n data: await Promise.resolve(result.data),\n },\n };\n }\n\n return {\n json,\n meta: {\n response: res,\n },\n };\n },\n );\n return promises;\n },\n };\n };\n\n const query = dataLoader(batchLoader('query'));\n const mutation = dataLoader(batchLoader('mutation'));\n\n const loaders = { query, mutation };\n return ({ op }) => {\n return observable((observer) => {\n /* istanbul ignore if -- @preserve */\n if (op.type === 'subscription') {\n throw new Error(\n 'Subscriptions are unsupported by `httpBatchStreamLink` - use `httpSubscriptionLink` or `wsLink`',\n );\n }\n const ac = new AbortController();\n const loader = loaders[op.type];\n const promise = loader.load({\n ...op,\n signal: raceAbortSignals(op.signal, ac.signal),\n });\n\n let isDone = false;\n let _res = undefined as HTTPResult | undefined;\n promise\n .then((res) => {\n isDone = true;\n _res = res;\n if ('error' in res.json) {\n observer.error(\n TRPCClientError.from(res.json, {\n meta: res.meta,\n }),\n );\n return;\n } else if ('result' in res.json) {\n observer.next({\n context: res.meta,\n result: res.json.result,\n });\n observer.complete();\n return;\n }\n\n observer.complete();\n })\n .catch((err) => {\n isDone = true;\n observer.error(\n TRPCClientError.from(err, {\n meta: _res?.meta,\n }),\n );\n });\n\n return () => {\n if (!isDone) {\n ac.abort();\n }\n };\n });\n };\n };\n}\n\n/**\n * @deprecated use {@link httpBatchStreamLink} instead\n */\nexport const unstable_httpBatchStreamLink = httpBatchStreamLink;\n","export function inputWithTrackedEventId(\n input: unknown,\n lastEventId: string | undefined,\n) {\n if (!lastEventId) {\n return input;\n }\n if (input != null && typeof input !== 'object') {\n return input;\n }\n return {\n ...(input ?? {}),\n lastEventId,\n };\n}\n","import { behaviorSubject, observable } from '@trpc/server/observable';\nimport type { TRPCErrorShape, TRPCResult } from '@trpc/server/rpc';\nimport type {\n AnyClientTypes,\n EventSourceLike,\n inferClientTypes,\n InferrableClientTypes,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n retryableRpcCodes,\n run,\n sseStreamConsumer,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport { raceAbortSignals } from '../internals/signals';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { TRPCConnectionState } from '../unstable-internals';\nimport { getTransformer, type TransformerOptions } from '../unstable-internals';\nimport { getUrl } from './internals/httpUtils';\nimport {\n resultOf,\n type UrlOptionsWithConnectionParams,\n} from './internals/urlWithConnectionParams';\nimport type { Operation, TRPCLink } from './types';\n\nasync function urlWithConnectionParams(\n opts: UrlOptionsWithConnectionParams,\n): Promise<string> {\n let url = await resultOf(opts.url);\n if (opts.connectionParams) {\n const params = await resultOf(opts.connectionParams);\n\n const prefix = url.includes('?') ? '&' : '?';\n url +=\n prefix + 'connectionParams=' + encodeURIComponent(JSON.stringify(params));\n }\n\n return url;\n}\n\ntype HTTPSubscriptionLinkOptions<\n TRoot extends AnyClientTypes,\n TEventSource extends EventSourceLike.AnyConstructor = typeof EventSource,\n> = {\n /**\n * EventSource ponyfill\n */\n EventSource?: TEventSource;\n /**\n * EventSource options or a callback that returns them\n */\n eventSourceOptions?:\n | EventSourceLike.InitDictOf<TEventSource>\n | ((opts: {\n op: Operation;\n }) =>\n | EventSourceLike.InitDictOf<TEventSource>\n | Promise<EventSourceLike.InitDictOf<TEventSource>>);\n} & TransformerOptions<TRoot> &\n UrlOptionsWithConnectionParams;\n\n/**\n * @see https://trpc.io/docs/client/links/httpSubscriptionLink\n */\nexport function httpSubscriptionLink<\n TInferrable extends InferrableClientTypes,\n TEventSource extends EventSourceLike.AnyConstructor,\n>(\n opts: HTTPSubscriptionLinkOptions<\n inferClientTypes<TInferrable>,\n TEventSource\n >,\n): TRPCLink<TInferrable> {\n const transformer = getTransformer(opts.transformer);\n\n return () => {\n return ({ op }) => {\n return observable((observer) => {\n const { type, path, input } = op;\n\n /* istanbul ignore if -- @preserve */\n if (type !== 'subscription') {\n throw new Error('httpSubscriptionLink only supports subscriptions');\n }\n\n let lastEventId: string | undefined = undefined;\n const ac = new AbortController();\n const signal = raceAbortSignals(op.signal, ac.signal);\n const eventSourceStream = sseStreamConsumer<{\n EventSource: TEventSource;\n data: Partial<{\n id?: string;\n data: unknown;\n }>;\n error: TRPCErrorShape;\n }>({\n url: async () =>\n getUrl({\n transformer,\n url: await urlWithConnectionParams(opts),\n input: inputWithTrackedEventId(input, lastEventId),\n path,\n type,\n signal: null,\n }),\n init: () => resultOf(opts.eventSourceOptions, { op }),\n signal,\n deserialize: (data) => transformer.output.deserialize(data),\n EventSource: opts.EventSource ?? (globalThis.EventSource as never),\n });\n\n const connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<any>>\n >({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n\n const connectionSub = connectionState.subscribe({\n next(state) {\n observer.next({\n result: state,\n });\n },\n });\n run(async () => {\n for await (const chunk of eventSourceStream) {\n switch (chunk.type) {\n case 'ping':\n // do nothing\n break;\n case 'data':\n const chunkData = chunk.data;\n\n let result: TRPCResult<unknown>;\n if (chunkData.id) {\n // if the `tracked()`-helper is used, we always have an `id` field\n lastEventId = chunkData.id;\n result = {\n id: chunkData.id,\n data: chunkData,\n };\n } else {\n result = {\n data: chunkData.data,\n };\n }\n\n observer.next({\n result,\n context: {\n eventSource: chunk.eventSource,\n },\n });\n break;\n case 'connected': {\n observer.next({\n result: {\n type: 'started',\n },\n context: {\n eventSource: chunk.eventSource,\n },\n });\n connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n break;\n }\n case 'serialized-error': {\n const error = TRPCClientError.from({ error: chunk.error });\n\n if (retryableRpcCodes.includes(chunk.error.code)) {\n //\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error,\n });\n break;\n }\n //\n // non-retryable error, cancel the subscription\n throw error;\n }\n case 'connecting': {\n const lastState = connectionState.get();\n\n const error = chunk.event && TRPCClientError.from(chunk.event);\n if (!error && lastState.state === 'connecting') {\n break;\n }\n\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error,\n });\n break;\n }\n case 'timeout': {\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error: new TRPCClientError(\n `Timeout of ${chunk.ms}ms reached while waiting for a response`,\n ),\n });\n }\n }\n }\n observer.next({\n result: {\n type: 'stopped',\n },\n });\n connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n observer.complete();\n }).catch((error) => {\n observer.error(TRPCClientError.from(error));\n });\n\n return () => {\n observer.complete();\n ac.abort();\n connectionSub.unsubscribe();\n };\n });\n };\n };\n}\n\n/**\n * @deprecated use {@link httpSubscriptionLink} instead\n */\nexport const unstable_httpSubscriptionLink = httpSubscriptionLink;\n","/* istanbul ignore file -- @preserve */\n// We're not actually exporting this link\nimport type { Unsubscribable } from '@trpc/server/observable';\nimport { observable } from '@trpc/server/observable';\nimport type { InferrableClientTypes } from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport type { TRPCClientError } from '../TRPCClientError';\nimport type { Operation, TRPCLink } from './types';\n\ninterface RetryLinkOptions<TInferrable extends InferrableClientTypes> {\n /**\n * The retry function\n */\n retry: (opts: RetryFnOptions<TInferrable>) => boolean;\n /**\n * The delay between retries in ms (defaults to 0)\n */\n retryDelayMs?: (attempt: number) => number;\n}\n\ninterface RetryFnOptions<TInferrable extends InferrableClientTypes> {\n /**\n * The operation that failed\n */\n op: Operation;\n /**\n * The error that occurred\n */\n error: TRPCClientError<TInferrable>;\n /**\n * The number of attempts that have been made (including the first call)\n */\n attempts: number;\n}\n\n/**\n * @see https://trpc.io/docs/v11/client/links/retryLink\n */\nexport function retryLink<TInferrable extends InferrableClientTypes>(\n opts: RetryLinkOptions<TInferrable>,\n): TRPCLink<TInferrable> {\n // initialized config\n return () => {\n // initialized in app\n return (callOpts) => {\n // initialized for request\n return observable((observer) => {\n let next$: Unsubscribable;\n let callNextTimeout: ReturnType<typeof setTimeout> | undefined =\n undefined;\n\n let lastEventId: string | undefined = undefined;\n\n attempt(1);\n\n function opWithLastEventId() {\n const op = callOpts.op;\n if (!lastEventId) {\n return op;\n }\n\n return {\n ...op,\n input: inputWithTrackedEventId(op.input, lastEventId),\n };\n }\n\n function attempt(attempts: number) {\n const op = opWithLastEventId();\n\n next$ = callOpts.next(op).subscribe({\n error(error) {\n const shouldRetry = opts.retry({\n op,\n attempts,\n error,\n });\n if (!shouldRetry) {\n observer.error(error);\n return;\n }\n const delayMs = opts.retryDelayMs?.(attempts) ?? 0;\n\n if (delayMs <= 0) {\n attempt(attempts + 1);\n return;\n }\n callNextTimeout = setTimeout(\n () => attempt(attempts + 1),\n delayMs,\n );\n },\n next(envelope) {\n //\n if (\n (!envelope.result.type || envelope.result.type === 'data') &&\n envelope.result.id\n ) {\n //\n lastEventId = envelope.result.id;\n }\n\n observer.next(envelope);\n },\n complete() {\n observer.complete();\n },\n });\n }\n return () => {\n next$.unsubscribe();\n clearTimeout(callNextTimeout);\n };\n });\n };\n };\n}\n","import {\n getTRPCErrorFromUnknown,\n getTRPCErrorShape,\n isTrackedEnvelope,\n} from '@trpc/server';\nimport { behaviorSubject, observable } from '@trpc/server/observable';\nimport { TRPC_ERROR_CODES_BY_KEY, type TRPCResult } from '@trpc/server/rpc';\nimport {\n callProcedure,\n isAbortError,\n isAsyncIterable,\n iteratorResource,\n makeResource,\n retryableRpcCodes,\n run,\n type AnyRouter,\n type ErrorHandlerOptions,\n type inferClientTypes,\n type inferRouterContext,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport { abortSignalToPromise, raceAbortSignals } from '../internals/signals';\nimport { getTransformer } from '../internals/transformer';\nimport type { TransformerOptions } from '../internals/transformer';\nimport { isTRPCClientError, TRPCClientError } from '../TRPCClientError';\nimport type { TRPCConnectionState } from './internals/subscriptions';\nimport type { TRPCLink } from './types';\n\nexport type LocalLinkOptions<TRouter extends AnyRouter> = {\n router: TRouter;\n createContext: () => Promise<inferRouterContext<TRouter>>;\n onError?: (opts: ErrorHandlerOptions<inferRouterContext<TRouter>>) => void;\n} & TransformerOptions<inferClientTypes<TRouter>>;\n\n/**\n * localLink is a terminating link that allows you to make tRPC procedure calls directly in your application without going through HTTP.\n *\n * @see https://trpc.io/docs/client/links/localLink\n */\nexport function unstable_localLink<TRouter extends AnyRouter>(\n opts: LocalLinkOptions<TRouter>,\n): TRPCLink<TRouter> {\n const transformer = getTransformer(opts.transformer);\n\n const transformChunk = (chunk: unknown) => {\n if (opts.transformer) {\n // assume transformer will do the right thing\n return chunk;\n }\n // Special case for undefined, because `JSON.stringify(undefined)` throws\n if (chunk === undefined) {\n return chunk;\n }\n const serialized = JSON.stringify(transformer.input.serialize(chunk));\n const deserialized = JSON.parse(transformer.output.deserialize(serialized));\n return deserialized;\n };\n\n return () =>\n ({ op }) =>\n observable((observer) => {\n let ctx: inferRouterContext<TRouter> | undefined = undefined;\n const ac = new AbortController();\n\n const signal = raceAbortSignals(op.signal, ac.signal);\n const signalPromise = abortSignalToPromise(signal);\n\n signalPromise.catch(() => {\n // prevent unhandled rejection\n });\n\n let input = op.input;\n async function runProcedure(newInput: unknown): Promise<unknown> {\n input = newInput;\n\n ctx = await opts.createContext();\n\n return callProcedure({\n router: opts.router,\n path: op.path,\n getRawInput: async () => newInput,\n ctx,\n type: op.type,\n signal,\n batchIndex: 0,\n });\n }\n\n function onErrorCallback(cause: unknown) {\n if (isAbortError(cause)) {\n return;\n }\n opts.onError?.({\n error: getTRPCErrorFromUnknown(cause),\n type: op.type,\n path: op.path,\n input,\n ctx,\n });\n }\n\n function coerceToTRPCClientError(cause: unknown) {\n if (isTRPCClientError<TRouter>(cause)) {\n return cause;\n }\n const error = getTRPCErrorFromUnknown(cause);\n\n const shape = getTRPCErrorShape({\n config: opts.router._def._config,\n ctx,\n error,\n input,\n path: op.path,\n type: op.type,\n });\n return TRPCClientError.from(\n { error: transformChunk(shape) },\n { cause: cause instanceof Error ? cause : undefined },\n );\n }\n\n run(async () => {\n switch (op.type) {\n case 'query':\n case 'mutation': {\n const result = await runProcedure(op.input);\n if (!isAsyncIterable(result)) {\n observer.next({\n result: { data: transformChunk(result) },\n });\n observer.complete();\n break;\n }\n\n observer.next({\n result: {\n data: (async function* () {\n await using iterator = iteratorResource(result);\n using _finally = makeResource({}, () => {\n observer.complete();\n });\n try {\n while (true) {\n const res = await Promise.race([\n iterator.next(),\n signalPromise,\n ]);\n if (res.done) {\n return transformChunk(res.value);\n }\n yield transformChunk(res.value);\n }\n } catch (cause) {\n onErrorCallback(cause);\n throw coerceToTRPCClientError(cause);\n }\n })(),\n },\n });\n break;\n }\n case 'subscription': {\n const connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<any>>\n >({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n\n const connectionSub = connectionState.subscribe({\n next(state) {\n observer.next({\n result: state,\n });\n },\n });\n let lastEventId: string | undefined = undefined;\n\n using _finally = makeResource({}, async () => {\n connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n connectionSub.unsubscribe();\n });\n\n // returning from here means the stream ended, so this completes\n // below - a throw is left to the `.catch()`, which needs the\n // observer to still be open by the time it runs\n await run(async () => {\n while (true) {\n const result = await runProcedure(\n inputWithTrackedEventId(op.input, lastEventId),\n );\n if (!isAsyncIterable(result)) {\n throw new Error('Expected an async iterable');\n }\n await using iterator = iteratorResource(result);\n\n observer.next({\n result: {\n type: 'started',\n },\n });\n connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n\n // Use a while loop to handle errors and reconnects\n while (true) {\n let res;\n try {\n res = await Promise.race([\n iterator.next(),\n signalPromise,\n ]);\n } catch (cause) {\n if (isAbortError(cause)) {\n return;\n }\n const error = getTRPCErrorFromUnknown(cause);\n\n if (\n !retryableRpcCodes.includes(\n TRPC_ERROR_CODES_BY_KEY[error.code],\n )\n ) {\n throw coerceToTRPCClientError(error);\n }\n\n onErrorCallback(error);\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error: coerceToTRPCClientError(error),\n });\n\n break;\n }\n\n if (res.done) {\n return;\n }\n let chunk: TRPCResult<unknown>;\n if (isTrackedEnvelope(res.value)) {\n lastEventId = res.value[0];\n\n chunk = {\n id: res.value[0],\n data: {\n id: res.value[0],\n data: res.value[1],\n },\n };\n } else {\n chunk = {\n data: res.value,\n };\n }\n\n observer.next({\n result: {\n ...chunk,\n data: transformChunk(chunk.data),\n },\n });\n }\n }\n });\n\n observer.complete();\n break;\n }\n }\n }).catch((cause) => {\n onErrorCallback(cause);\n observer.error(coerceToTRPCClientError(cause));\n });\n\n return () => {\n ac.abort();\n };\n });\n}\n/**\n * @deprecated Renamed to `unstable_localLink`. This alias will be removed in a future major release.\n */\nexport const experimental_localLink: typeof unstable_localLink =\n unstable_localLink;\n","import type { TRPCClientError } from './TRPCClientError';\n\n/**\n * @internal\n */\nexport declare const errorShapeTag: unique symbol;\n\nexport type TRPCTaggedPromise<TData, TErrorShape> = Promise<TData> & {\n readonly [errorShapeTag]: TErrorShape;\n};\n\n/**\n * @internal\n */\nexport type inferSafeError<TErrorShape> = TRPCClientError<{\n errorShape: TErrorShape;\n transformer: boolean;\n}>;\n\nexport type SafeResult<TData, TErrorShape> =\n | readonly [data: TData, error: undefined]\n | readonly [data: undefined, error: inferSafeError<TErrorShape>];\n\n/**\n * Await a vanilla client `query()` or `mutate()` call without it throwing, getting back a\n * `[data, error]` pair typed with that procedure's error shape.\n *\n * @example\n * ```ts\n * const [post, error] = await safe(client.post.byId.query({ id }));\n * if (error) {\n * console.error(error);\n * }\n *\n * const id = post.id;\n * ```\n */\nexport async function safe<TData, TErrorShape>(\n promise: TRPCTaggedPromise<TData, TErrorShape>,\n): Promise<SafeResult<TData, TErrorShape>> {\n try {\n return [await promise, undefined];\n } catch (cause) {\n return [undefined, cause as inferSafeError<TErrorShape>];\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../dist/links/httpBatchLink';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../../dist/links/httpBatchLink');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../dist/links/httpLink';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../../dist/links/httpLink');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../dist/links/loggerLink';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../../dist/links/loggerLink');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../dist/links/splitLink';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../../dist/links/splitLink');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../dist/links/wsLink';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../../dist/links/wsLink');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../dist/links/wsLink/wsLink';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../../../dist/links/wsLink/wsLink');
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trpc/client",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "11.
|
|
4
|
+
"version": "11.21.1-canary.20.10e2ef98f",
|
|
5
5
|
"description": "The tRPC client library",
|
|
6
6
|
"author": "KATT",
|
|
7
7
|
"license": "MIT",
|
|
@@ -115,23 +115,23 @@
|
|
|
115
115
|
"bin"
|
|
116
116
|
],
|
|
117
117
|
"peerDependencies": {
|
|
118
|
-
"@trpc/server": "11.
|
|
118
|
+
"@trpc/server": "11.21.1",
|
|
119
119
|
"typescript": ">=5.7.2"
|
|
120
120
|
},
|
|
121
121
|
"devDependencies": {
|
|
122
122
|
"@tanstack/intent": "^0.0.27",
|
|
123
|
-
"@trpc/server": "11.
|
|
123
|
+
"@trpc/server": "11.21.1",
|
|
124
124
|
"@types/isomorphic-fetch": "^0.0.39",
|
|
125
|
-
"@types/node": "
|
|
125
|
+
"@types/node": "^24.13.4",
|
|
126
126
|
"dataloader": "^2.2.2",
|
|
127
|
-
"eslint": "
|
|
127
|
+
"eslint": "^10.10.0",
|
|
128
128
|
"isomorphic-fetch": "^3.0.0",
|
|
129
129
|
"node-fetch": "^3.3.0",
|
|
130
|
-
"tsdown": "
|
|
130
|
+
"tsdown": "0.23.0",
|
|
131
131
|
"tslib": "^2.8.1",
|
|
132
|
-
"typescript": "
|
|
133
|
-
"undici": "
|
|
134
|
-
"ws": "
|
|
132
|
+
"typescript": "^7.0.2",
|
|
133
|
+
"undici": "^8.10.2",
|
|
134
|
+
"ws": "^8.21.3"
|
|
135
135
|
},
|
|
136
136
|
"publishConfig": {
|
|
137
137
|
"access": "public"
|
|
@@ -145,5 +145,5 @@
|
|
|
145
145
|
"bin": {
|
|
146
146
|
"intent": "./bin/intent.js"
|
|
147
147
|
},
|
|
148
|
-
"gitHead": "
|
|
148
|
+
"gitHead": "10e2ef98f7842b94eb3026e4f9bcfe62cc39b088"
|
|
149
149
|
}
|
package/src/createTRPCClient.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type {
|
|
|
4
4
|
AnyProcedure,
|
|
5
5
|
AnyRouter,
|
|
6
6
|
inferClientTypes,
|
|
7
|
+
inferProcedureErrorShape,
|
|
7
8
|
inferProcedureInput,
|
|
8
9
|
InferrableClientTypes,
|
|
9
10
|
inferTransformedProcedureOutput,
|
|
@@ -18,6 +19,7 @@ import type { CreateTRPCClientOptions } from './createTRPCUntypedClient';
|
|
|
18
19
|
import type { TRPCSubscriptionObserver } from './internals/TRPCUntypedClient';
|
|
19
20
|
import { TRPCUntypedClient } from './internals/TRPCUntypedClient';
|
|
20
21
|
import type { TRPCProcedureOptions } from './internals/types';
|
|
22
|
+
import type { TRPCTaggedPromise } from './safe';
|
|
21
23
|
import type { TRPCClientError } from './TRPCClientError';
|
|
22
24
|
|
|
23
25
|
/**
|
|
@@ -64,7 +66,10 @@ type coerceAsyncGeneratorToIterable<T> =
|
|
|
64
66
|
export type Resolver<TDef extends TRPCResolverDef> = (
|
|
65
67
|
input: TDef['input'],
|
|
66
68
|
opts?: TRPCProcedureOptions,
|
|
67
|
-
) =>
|
|
69
|
+
) => TRPCTaggedPromise<
|
|
70
|
+
coerceAsyncGeneratorToIterable<TDef['output']>,
|
|
71
|
+
TDef['errorShape']
|
|
72
|
+
>;
|
|
68
73
|
|
|
69
74
|
/** @internal */
|
|
70
75
|
export type SubscriptionResolver<TDef extends TRPCResolverDef> = (
|
|
@@ -109,7 +114,7 @@ type DecoratedProcedureRecord<
|
|
|
109
114
|
inferClientTypes<TRoot>,
|
|
110
115
|
$Value
|
|
111
116
|
>;
|
|
112
|
-
errorShape:
|
|
117
|
+
errorShape: inferProcedureErrorShape<TRoot, $Value>;
|
|
113
118
|
transformer: inferClientTypes<TRoot>['transformer'];
|
|
114
119
|
}
|
|
115
120
|
>
|
package/src/index.ts
CHANGED
package/src/links/localLink.ts
CHANGED
|
@@ -35,7 +35,7 @@ export type LocalLinkOptions<TRouter extends AnyRouter> = {
|
|
|
35
35
|
/**
|
|
36
36
|
* localLink is a terminating link that allows you to make tRPC procedure calls directly in your application without going through HTTP.
|
|
37
37
|
*
|
|
38
|
-
* @see https://trpc.io/docs/links/localLink
|
|
38
|
+
* @see https://trpc.io/docs/client/links/localLink
|
|
39
39
|
*/
|
|
40
40
|
export function unstable_localLink<TRouter extends AnyRouter>(
|
|
41
41
|
opts: LocalLinkOptions<TRouter>,
|
|
@@ -178,8 +178,6 @@ export function unstable_localLink<TRouter extends AnyRouter>(
|
|
|
178
178
|
let lastEventId: string | undefined = undefined;
|
|
179
179
|
|
|
180
180
|
using _finally = makeResource({}, async () => {
|
|
181
|
-
observer.complete();
|
|
182
|
-
|
|
183
181
|
connectionState.next({
|
|
184
182
|
type: 'state',
|
|
185
183
|
state: 'idle',
|
|
@@ -187,83 +185,94 @@ export function unstable_localLink<TRouter extends AnyRouter>(
|
|
|
187
185
|
});
|
|
188
186
|
connectionSub.unsubscribe();
|
|
189
187
|
});
|
|
190
|
-
while (true) {
|
|
191
|
-
const result = await runProcedure(
|
|
192
|
-
inputWithTrackedEventId(op.input, lastEventId),
|
|
193
|
-
);
|
|
194
|
-
if (!isAsyncIterable(result)) {
|
|
195
|
-
throw new Error('Expected an async iterable');
|
|
196
|
-
}
|
|
197
|
-
await using iterator = iteratorResource(result);
|
|
198
188
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
});
|
|
204
|
-
connectionState.next({
|
|
205
|
-
type: 'state',
|
|
206
|
-
state: 'pending',
|
|
207
|
-
error: null,
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
// Use a while loop to handle errors and reconnects
|
|
189
|
+
// returning from here means the stream ended, so this completes
|
|
190
|
+
// below - a throw is left to the `.catch()`, which needs the
|
|
191
|
+
// observer to still be open by the time it runs
|
|
192
|
+
await run(async () => {
|
|
211
193
|
while (true) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
const error = getTRPCErrorFromUnknown(cause);
|
|
194
|
+
const result = await runProcedure(
|
|
195
|
+
inputWithTrackedEventId(op.input, lastEventId),
|
|
196
|
+
);
|
|
197
|
+
if (!isAsyncIterable(result)) {
|
|
198
|
+
throw new Error('Expected an async iterable');
|
|
199
|
+
}
|
|
200
|
+
await using iterator = iteratorResource(result);
|
|
220
201
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
202
|
+
observer.next({
|
|
203
|
+
result: {
|
|
204
|
+
type: 'started',
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
connectionState.next({
|
|
208
|
+
type: 'state',
|
|
209
|
+
state: 'pending',
|
|
210
|
+
error: null,
|
|
211
|
+
});
|
|
228
212
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
213
|
+
// Use a while loop to handle errors and reconnects
|
|
214
|
+
while (true) {
|
|
215
|
+
let res;
|
|
216
|
+
try {
|
|
217
|
+
res = await Promise.race([
|
|
218
|
+
iterator.next(),
|
|
219
|
+
signalPromise,
|
|
220
|
+
]);
|
|
221
|
+
} catch (cause) {
|
|
222
|
+
if (isAbortError(cause)) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const error = getTRPCErrorFromUnknown(cause);
|
|
235
226
|
|
|
236
|
-
|
|
237
|
-
|
|
227
|
+
if (
|
|
228
|
+
!retryableRpcCodes.includes(
|
|
229
|
+
TRPC_ERROR_CODES_BY_KEY[error.code],
|
|
230
|
+
)
|
|
231
|
+
) {
|
|
232
|
+
throw coerceToTRPCClientError(error);
|
|
233
|
+
}
|
|
238
234
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
235
|
+
onErrorCallback(error);
|
|
236
|
+
connectionState.next({
|
|
237
|
+
type: 'state',
|
|
238
|
+
state: 'connecting',
|
|
239
|
+
error: coerceToTRPCClientError(error),
|
|
240
|
+
});
|
|
245
241
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (res.done) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
let chunk: TRPCResult<unknown>;
|
|
249
|
+
if (isTrackedEnvelope(res.value)) {
|
|
250
|
+
lastEventId = res.value[0];
|
|
251
|
+
|
|
252
|
+
chunk = {
|
|
249
253
|
id: res.value[0],
|
|
250
|
-
data:
|
|
254
|
+
data: {
|
|
255
|
+
id: res.value[0],
|
|
256
|
+
data: res.value[1],
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
} else {
|
|
260
|
+
chunk = {
|
|
261
|
+
data: res.value,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
observer.next({
|
|
266
|
+
result: {
|
|
267
|
+
...chunk,
|
|
268
|
+
data: transformChunk(chunk.data),
|
|
251
269
|
},
|
|
252
|
-
};
|
|
253
|
-
} else {
|
|
254
|
-
chunk = {
|
|
255
|
-
data: res.value,
|
|
256
|
-
};
|
|
270
|
+
});
|
|
257
271
|
}
|
|
258
|
-
|
|
259
|
-
observer.next({
|
|
260
|
-
result: {
|
|
261
|
-
...chunk,
|
|
262
|
-
data: transformChunk(chunk.data),
|
|
263
|
-
},
|
|
264
|
-
});
|
|
265
272
|
}
|
|
266
|
-
}
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
observer.complete();
|
|
267
276
|
break;
|
|
268
277
|
}
|
|
269
278
|
}
|
package/src/safe.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { TRPCClientError } from './TRPCClientError';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare const errorShapeTag: unique symbol;
|
|
7
|
+
|
|
8
|
+
export type TRPCTaggedPromise<TData, TErrorShape> = Promise<TData> & {
|
|
9
|
+
readonly [errorShapeTag]: TErrorShape;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export type inferSafeError<TErrorShape> = TRPCClientError<{
|
|
16
|
+
errorShape: TErrorShape;
|
|
17
|
+
transformer: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
|
|
20
|
+
export type SafeResult<TData, TErrorShape> =
|
|
21
|
+
| readonly [data: TData, error: undefined]
|
|
22
|
+
| readonly [data: undefined, error: inferSafeError<TErrorShape>];
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Await a vanilla client `query()` or `mutate()` call without it throwing, getting back a
|
|
26
|
+
* `[data, error]` pair typed with that procedure's error shape.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const [post, error] = await safe(client.post.byId.query({ id }));
|
|
31
|
+
* if (error) {
|
|
32
|
+
* console.error(error);
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* const id = post.id;
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export async function safe<TData, TErrorShape>(
|
|
39
|
+
promise: TRPCTaggedPromise<TData, TErrorShape>,
|
|
40
|
+
): Promise<SafeResult<TData, TErrorShape>> {
|
|
41
|
+
try {
|
|
42
|
+
return [await promise, undefined];
|
|
43
|
+
} catch (cause) {
|
|
44
|
+
return [undefined, cause as inferSafeError<TErrorShape>];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/unstable-internals';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../dist/unstable-internals');
|