@trpc/client 10.0.0-alpha.42 → 10.0.0-alpha.45
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/TRPCClientError.d.ts +14 -10
- package/dist/TRPCClientError.d.ts.map +1 -1
- package/dist/createTRPCClient.d.ts +1 -1
- package/dist/createTRPCClient.d.ts.map +1 -1
- package/dist/createTRPCClientProxy.d.ts +9 -3
- package/dist/createTRPCClientProxy.d.ts.map +1 -1
- package/dist/index.js +33 -97
- package/dist/index.mjs +30 -94
- package/dist/internals/TRPCClient.d.ts +19 -3
- package/dist/internals/TRPCClient.d.ts.map +1 -1
- package/dist/links/httpBatchLink.d.ts.map +1 -1
- package/dist/links/httpBatchLink.js +18 -1
- package/dist/links/httpBatchLink.mjs +18 -1
- package/dist/links/httpLink.d.ts.map +1 -1
- package/dist/links/httpLink.js +21 -2
- package/dist/links/httpLink.mjs +21 -2
- package/dist/links/internals/httpUtils.d.ts +4 -3
- package/dist/links/internals/httpUtils.d.ts.map +1 -1
- package/dist/links/internals/transformResult.d.ts +28 -0
- package/dist/links/internals/transformResult.d.ts.map +1 -0
- package/dist/links/loggerLink.d.ts +3 -3
- package/dist/links/loggerLink.d.ts.map +1 -1
- package/dist/links/loggerLink.js +1 -1
- package/dist/links/loggerLink.mjs +1 -1
- package/dist/links/types.d.ts +6 -8
- package/dist/links/types.d.ts.map +1 -1
- package/dist/links/wsLink.d.ts +9 -4
- package/dist/links/wsLink.d.ts.map +1 -1
- package/dist/links/wsLink.js +400 -12
- package/dist/links/wsLink.mjs +391 -10
- package/dist/transformResult-06bec648.mjs +108 -0
- package/dist/transformResult-3ccc74ea.js +122 -0
- package/links/httpBatchLink/dist/trpc-client-links-httpBatchLink.cjs.dev.js +4 -4
- package/links/httpBatchLink/dist/trpc-client-links-httpBatchLink.cjs.prod.js +4 -4
- package/links/httpBatchLink/dist/trpc-client-links-httpBatchLink.esm.js +1 -1
- package/links/httpLink/dist/trpc-client-links-httpLink.cjs.dev.js +4 -4
- package/links/httpLink/dist/trpc-client-links-httpLink.cjs.prod.js +4 -4
- package/links/httpLink/dist/trpc-client-links-httpLink.esm.js +1 -1
- package/package.json +4 -4
- package/src/TRPCClientError.ts +35 -17
- package/src/createTRPCClient.ts +1 -0
- package/src/createTRPCClientProxy.ts +17 -2
- package/src/internals/TRPCClient.ts +43 -35
- package/src/links/dedupeLink.test.ts +8 -14
- package/src/links/httpBatchLink.ts +17 -7
- package/src/links/httpLink.ts +14 -2
- package/src/links/internals/createChain.test.ts +18 -33
- package/src/links/internals/httpUtils.ts +6 -5
- package/src/links/internals/transformResult.ts +40 -0
- package/src/links/loggerLink.ts +5 -5
- package/src/links/retryLink.ts +1 -1
- package/src/links/types.ts +8 -10
- package/src/links/wsLink.ts +27 -8
- package/dist/links/internals/transformOperationResult.d.ts +0 -30
- package/dist/links/internals/transformOperationResult.d.ts.map +0 -1
- package/dist/wsLink-27b93bd0.mjs +0 -451
- package/dist/wsLink-44703a83.js +0 -467
- package/src/links/internals/transformOperationResult.ts +0 -53
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var TRPCClientError = require('../../../dist/TRPCClientError-e9bf96e9.cjs.prod.js');
|
|
6
|
-
var
|
|
6
|
+
var httpRequest = require('../../../dist/httpRequest-66400297.cjs.prod.js');
|
|
7
7
|
var _createForOfIteratorHelper = require('@babel/runtime/helpers/createForOfIteratorHelper');
|
|
8
8
|
require('@babel/runtime/helpers/objectSpread2');
|
|
9
9
|
require('@babel/runtime/helpers/classCallCheck');
|
|
@@ -133,7 +133,7 @@ function httpBatchLink(opts) {
|
|
|
133
133
|
return op.input;
|
|
134
134
|
});
|
|
135
135
|
|
|
136
|
-
var _httpRequest =
|
|
136
|
+
var _httpRequest = httpRequest.httpRequest({
|
|
137
137
|
url: url,
|
|
138
138
|
inputs: inputs,
|
|
139
139
|
path: path,
|
|
@@ -194,13 +194,13 @@ function httpBatchLink(opts) {
|
|
|
194
194
|
};
|
|
195
195
|
|
|
196
196
|
onDestroy(function () {
|
|
197
|
-
prevOnce(TRPCClientError.TRPCClientError.from(new
|
|
197
|
+
prevOnce(TRPCClientError.TRPCClientError.from(new httpRequest.TRPCAbortError(), {
|
|
198
198
|
isDone: true
|
|
199
199
|
}));
|
|
200
200
|
cancel();
|
|
201
201
|
});
|
|
202
202
|
promise.then(function (envelope) {
|
|
203
|
-
prevOnce(
|
|
203
|
+
prevOnce(httpRequest.transformRPCResponse({
|
|
204
204
|
envelope: envelope,
|
|
205
205
|
runtime: runtime
|
|
206
206
|
}));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { T as TRPCClientError } from '../../../dist/TRPCClientError-09b8a26b.esm.js';
|
|
2
|
-
import { T as TRPCAbortError, t as transformRPCResponse, h as httpRequest } from '../../../dist/
|
|
2
|
+
import { T as TRPCAbortError, t as transformRPCResponse, h as httpRequest } from '../../../dist/httpRequest-62c5cce4.esm.js';
|
|
3
3
|
import _createForOfIteratorHelper from '@babel/runtime/helpers/esm/createForOfIteratorHelper';
|
|
4
4
|
import '@babel/runtime/helpers/objectSpread2';
|
|
5
5
|
import '@babel/runtime/helpers/classCallCheck';
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var TRPCClientError = require('../../../dist/TRPCClientError-bfee2bf5.cjs.dev.js');
|
|
6
|
-
var
|
|
6
|
+
var httpRequest = require('../../../dist/httpRequest-6b1f0c6f.cjs.dev.js');
|
|
7
7
|
require('@babel/runtime/helpers/objectSpread2');
|
|
8
8
|
require('@babel/runtime/helpers/classCallCheck');
|
|
9
9
|
require('@babel/runtime/helpers/createClass');
|
|
@@ -25,7 +25,7 @@ function httpLink(opts) {
|
|
|
25
25
|
input = op.input,
|
|
26
26
|
type = op.type;
|
|
27
27
|
|
|
28
|
-
var _httpRequest =
|
|
28
|
+
var _httpRequest = httpRequest.httpRequest({
|
|
29
29
|
runtime: runtime,
|
|
30
30
|
type: type,
|
|
31
31
|
input: input,
|
|
@@ -47,13 +47,13 @@ function httpLink(opts) {
|
|
|
47
47
|
};
|
|
48
48
|
|
|
49
49
|
onDestroy(function () {
|
|
50
|
-
prevOnce(TRPCClientError.TRPCClientError.from(new
|
|
50
|
+
prevOnce(TRPCClientError.TRPCClientError.from(new httpRequest.TRPCAbortError(), {
|
|
51
51
|
isDone: true
|
|
52
52
|
}));
|
|
53
53
|
cancel();
|
|
54
54
|
});
|
|
55
55
|
promise.then(function (envelope) {
|
|
56
|
-
prevOnce(
|
|
56
|
+
prevOnce(httpRequest.transformRPCResponse({
|
|
57
57
|
envelope: envelope,
|
|
58
58
|
runtime: runtime
|
|
59
59
|
}));
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var TRPCClientError = require('../../../dist/TRPCClientError-e9bf96e9.cjs.prod.js');
|
|
6
|
-
var
|
|
6
|
+
var httpRequest = require('../../../dist/httpRequest-66400297.cjs.prod.js');
|
|
7
7
|
require('@babel/runtime/helpers/objectSpread2');
|
|
8
8
|
require('@babel/runtime/helpers/classCallCheck');
|
|
9
9
|
require('@babel/runtime/helpers/createClass');
|
|
@@ -25,7 +25,7 @@ function httpLink(opts) {
|
|
|
25
25
|
input = op.input,
|
|
26
26
|
type = op.type;
|
|
27
27
|
|
|
28
|
-
var _httpRequest =
|
|
28
|
+
var _httpRequest = httpRequest.httpRequest({
|
|
29
29
|
runtime: runtime,
|
|
30
30
|
type: type,
|
|
31
31
|
input: input,
|
|
@@ -47,13 +47,13 @@ function httpLink(opts) {
|
|
|
47
47
|
};
|
|
48
48
|
|
|
49
49
|
onDestroy(function () {
|
|
50
|
-
prevOnce(TRPCClientError.TRPCClientError.from(new
|
|
50
|
+
prevOnce(TRPCClientError.TRPCClientError.from(new httpRequest.TRPCAbortError(), {
|
|
51
51
|
isDone: true
|
|
52
52
|
}));
|
|
53
53
|
cancel();
|
|
54
54
|
});
|
|
55
55
|
promise.then(function (envelope) {
|
|
56
|
-
prevOnce(
|
|
56
|
+
prevOnce(httpRequest.transformRPCResponse({
|
|
57
57
|
envelope: envelope,
|
|
58
58
|
runtime: runtime
|
|
59
59
|
}));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { T as TRPCClientError } from '../../../dist/TRPCClientError-09b8a26b.esm.js';
|
|
2
|
-
import { h as httpRequest, T as TRPCAbortError, t as transformRPCResponse } from '../../../dist/
|
|
2
|
+
import { h as httpRequest, T as TRPCAbortError, t as transformRPCResponse } from '../../../dist/httpRequest-62c5cce4.esm.js';
|
|
3
3
|
import '@babel/runtime/helpers/objectSpread2';
|
|
4
4
|
import '@babel/runtime/helpers/classCallCheck';
|
|
5
5
|
import '@babel/runtime/helpers/createClass';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trpc/client",
|
|
3
|
-
"version": "10.0.0-alpha.
|
|
3
|
+
"version": "10.0.0-alpha.45",
|
|
4
4
|
"description": "tRPC Client lib",
|
|
5
5
|
"author": "KATT",
|
|
6
6
|
"license": "MIT",
|
|
@@ -67,13 +67,13 @@
|
|
|
67
67
|
"@babel/runtime": "^7.9.0"
|
|
68
68
|
},
|
|
69
69
|
"peerDependencies": {
|
|
70
|
-
"@trpc/server": "10.0.0-alpha.
|
|
70
|
+
"@trpc/server": "10.0.0-alpha.45"
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
|
-
"@trpc/server": "10.0.0-alpha.
|
|
73
|
+
"@trpc/server": "10.0.0-alpha.45"
|
|
74
74
|
},
|
|
75
75
|
"publishConfig": {
|
|
76
76
|
"access": "public"
|
|
77
77
|
},
|
|
78
|
-
"gitHead": "
|
|
78
|
+
"gitHead": "337fc1ec6ff60b1cd38a85ba4d564e96d6ba7a40"
|
|
79
79
|
}
|
package/src/TRPCClientError.ts
CHANGED
|
@@ -1,25 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
AnyRouter,
|
|
3
|
+
DefaultErrorShape,
|
|
4
|
+
Maybe,
|
|
5
|
+
Procedure,
|
|
6
|
+
inferRouterError,
|
|
7
|
+
} from '@trpc/server';
|
|
2
8
|
import { TRPCErrorResponse } from '@trpc/server/rpc';
|
|
3
9
|
|
|
4
|
-
|
|
10
|
+
type RouterOrProcedure = AnyRouter | Procedure<any>;
|
|
11
|
+
|
|
12
|
+
type inferErrorShape<TRouterOrProcedure extends AnyRouter | Procedure<any>> =
|
|
13
|
+
TRouterOrProcedure extends AnyRouter
|
|
14
|
+
? inferRouterError<TRouterOrProcedure>
|
|
15
|
+
: TRouterOrProcedure['_def']['_config']['errorShape'];
|
|
16
|
+
|
|
17
|
+
export interface TRPCClientErrorBase<TShape extends DefaultErrorShape> {
|
|
5
18
|
readonly message: string;
|
|
6
|
-
readonly shape: Maybe<
|
|
7
|
-
readonly data: Maybe<
|
|
19
|
+
readonly shape: Maybe<TShape>;
|
|
20
|
+
readonly data: Maybe<TShape['data']>;
|
|
8
21
|
}
|
|
22
|
+
export type TRPCClientErrorLike<TRouterOrProcedure extends RouterOrProcedure> =
|
|
23
|
+
TRPCClientErrorBase<inferErrorShape<TRouterOrProcedure>>;
|
|
9
24
|
|
|
10
|
-
export class TRPCClientError<
|
|
25
|
+
export class TRPCClientError<TRouterOrProcedure extends RouterOrProcedure>
|
|
11
26
|
extends Error
|
|
12
|
-
implements
|
|
27
|
+
implements TRPCClientErrorBase<inferErrorShape<TRouterOrProcedure>>
|
|
13
28
|
{
|
|
14
29
|
public readonly cause;
|
|
15
|
-
public readonly shape
|
|
16
|
-
public readonly data
|
|
30
|
+
public readonly shape;
|
|
31
|
+
public readonly data;
|
|
17
32
|
public readonly meta;
|
|
18
33
|
|
|
19
34
|
constructor(
|
|
20
35
|
message: string,
|
|
21
36
|
opts?: {
|
|
22
|
-
result
|
|
37
|
+
result?: Maybe<inferErrorShape<TRouterOrProcedure>>;
|
|
23
38
|
cause?: Error;
|
|
24
39
|
meta?: Record<string, unknown>;
|
|
25
40
|
},
|
|
@@ -40,22 +55,25 @@ export class TRPCClientError<TRouter extends AnyRouter>
|
|
|
40
55
|
Object.setPrototypeOf(this, TRPCClientError.prototype);
|
|
41
56
|
}
|
|
42
57
|
|
|
43
|
-
public static from<
|
|
58
|
+
public static from<TRouterOrProcedure extends RouterOrProcedure>(
|
|
44
59
|
cause: Error | TRPCErrorResponse<any>,
|
|
45
60
|
opts: { meta?: Record<string, unknown> } = {},
|
|
46
|
-
): TRPCClientError<
|
|
61
|
+
): TRPCClientError<TRouterOrProcedure> {
|
|
47
62
|
if (!(cause instanceof Error)) {
|
|
48
|
-
return new TRPCClientError<
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
63
|
+
return new TRPCClientError<TRouterOrProcedure>(
|
|
64
|
+
(cause.error as any).message ?? '',
|
|
65
|
+
{
|
|
66
|
+
...opts,
|
|
67
|
+
cause: undefined,
|
|
68
|
+
result: cause as any,
|
|
69
|
+
},
|
|
70
|
+
);
|
|
53
71
|
}
|
|
54
72
|
if (cause.name === 'TRPCClientError') {
|
|
55
73
|
return cause as TRPCClientError<any>;
|
|
56
74
|
}
|
|
57
75
|
|
|
58
|
-
return new TRPCClientError<
|
|
76
|
+
return new TRPCClientError<TRouterOrProcedure>(cause.message, {
|
|
59
77
|
...opts,
|
|
60
78
|
cause,
|
|
61
79
|
result: null,
|
package/src/createTRPCClient.ts
CHANGED
|
@@ -17,6 +17,7 @@ import type {
|
|
|
17
17
|
import type { TRPCResultMessage } from '@trpc/server/rpc';
|
|
18
18
|
import { createProxy } from '@trpc/server/shared';
|
|
19
19
|
import { TRPCClientError } from './TRPCClientError';
|
|
20
|
+
import { CreateTRPCClientOptions, createTRPCClient } from './createTRPCClient';
|
|
20
21
|
import {
|
|
21
22
|
TRPCClient as Client,
|
|
22
23
|
TRPCSubscriptionObserver,
|
|
@@ -65,14 +66,16 @@ type assertProcedure<T> = T extends Procedure<any> ? T : never;
|
|
|
65
66
|
type DecoratedProcedureRecord<
|
|
66
67
|
TProcedures extends ProcedureRouterRecord,
|
|
67
68
|
TRouter extends AnyRouter,
|
|
68
|
-
> = {
|
|
69
|
+
> = OmitNeverKeys<{
|
|
69
70
|
[TKey in keyof TProcedures]: TProcedures[TKey] extends AnyRouter
|
|
70
71
|
? DecoratedProcedureRecord<
|
|
71
72
|
TProcedures[TKey]['_def']['record'],
|
|
72
73
|
TProcedures[TKey]
|
|
73
74
|
>
|
|
75
|
+
: assertProcedure<TProcedures[TKey]>['_def']['_old'] extends true
|
|
76
|
+
? never
|
|
74
77
|
: DecorateProcedure<assertProcedure<TProcedures[TKey]>, TRouter>;
|
|
75
|
-
}
|
|
78
|
+
}>;
|
|
76
79
|
|
|
77
80
|
const clientCallTypeMap: Record<
|
|
78
81
|
keyof DecorateProcedure<any, any>,
|
|
@@ -83,6 +86,10 @@ const clientCallTypeMap: Record<
|
|
|
83
86
|
subscribe: 'subscription',
|
|
84
87
|
};
|
|
85
88
|
|
|
89
|
+
/**
|
|
90
|
+
* @deprecated use createTRPCProxyClient instead
|
|
91
|
+
* @internal
|
|
92
|
+
*/
|
|
86
93
|
export function createTRPCClientProxy<TRouter extends AnyRouter>(
|
|
87
94
|
client: Client<TRouter>,
|
|
88
95
|
) {
|
|
@@ -96,3 +103,11 @@ export function createTRPCClientProxy<TRouter extends AnyRouter>(
|
|
|
96
103
|
});
|
|
97
104
|
return proxy as DecoratedProcedureRecord<TRouter['_def']['record'], TRouter>;
|
|
98
105
|
}
|
|
106
|
+
|
|
107
|
+
export function createTRPCProxyClient<TRouter extends AnyRouter>(
|
|
108
|
+
opts: CreateTRPCClientOptions<TRouter>,
|
|
109
|
+
) {
|
|
110
|
+
const client = createTRPCClient<TRouter>(opts);
|
|
111
|
+
const proxy = createTRPCClientProxy(client);
|
|
112
|
+
return proxy;
|
|
113
|
+
}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
inferProcedureOutput,
|
|
8
8
|
inferSubscriptionOutput,
|
|
9
9
|
} from '@trpc/server';
|
|
10
|
+
import { ProcedureRecord } from '@trpc/server';
|
|
10
11
|
import {
|
|
11
12
|
Unsubscribable,
|
|
12
13
|
inferObservableValue,
|
|
@@ -18,10 +19,6 @@ import { TRPCClientError } from '../TRPCClientError';
|
|
|
18
19
|
import { getFetch } from '../getFetch';
|
|
19
20
|
import { httpBatchLink } from '../links';
|
|
20
21
|
import { createChain } from '../links/internals/createChain';
|
|
21
|
-
import {
|
|
22
|
-
transformOperationResult,
|
|
23
|
-
transformSubscriptionOperationResult,
|
|
24
|
-
} from '../links/internals/transformOperationResult';
|
|
25
22
|
import {
|
|
26
23
|
HTTPHeaders,
|
|
27
24
|
OperationContext,
|
|
@@ -97,6 +94,23 @@ export interface TRPCSubscriptionObserver<TValue, TError> {
|
|
|
97
94
|
export type CreateTRPCClientOptions<TRouter extends AnyRouter> =
|
|
98
95
|
| CreateTRPCClientWithLinksOptions<TRouter>
|
|
99
96
|
| CreateTRPCClientWithURLOptions;
|
|
97
|
+
|
|
98
|
+
export type AssertType<T, K> = T extends K ? T : never;
|
|
99
|
+
/**
|
|
100
|
+
* @deprecated
|
|
101
|
+
*/
|
|
102
|
+
export type AssertLegacyDef<TRouter extends AnyRouter> =
|
|
103
|
+
TRouter['_def']['legacy'] extends Record<
|
|
104
|
+
'subscriptions' | 'queries' | 'mutations',
|
|
105
|
+
ProcedureRecord
|
|
106
|
+
>
|
|
107
|
+
? TRouter['_def']['legacy']
|
|
108
|
+
: {
|
|
109
|
+
subscriptions: {};
|
|
110
|
+
queries: {};
|
|
111
|
+
mutations: {};
|
|
112
|
+
};
|
|
113
|
+
|
|
100
114
|
export class TRPCClient<TRouter extends AnyRouter> {
|
|
101
115
|
private readonly links: OperationLink<TRouter>[];
|
|
102
116
|
public readonly runtime: TRPCClientRuntime;
|
|
@@ -179,13 +193,8 @@ export class TRPCClient<TRouter extends AnyRouter> {
|
|
|
179
193
|
const cancellablePromise: CancellablePromise<any> = new Promise<TOutput>(
|
|
180
194
|
(resolve, reject) => {
|
|
181
195
|
promise
|
|
182
|
-
.then((
|
|
183
|
-
|
|
184
|
-
if (transformed.ok) {
|
|
185
|
-
resolve(transformed.data);
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
reject(transformed.error);
|
|
196
|
+
.then((envelope) => {
|
|
197
|
+
resolve((envelope.result as any).data);
|
|
189
198
|
})
|
|
190
199
|
.catch((err) => {
|
|
191
200
|
reject(TRPCClientError.from(err));
|
|
@@ -197,15 +206,18 @@ export class TRPCClient<TRouter extends AnyRouter> {
|
|
|
197
206
|
return cancellablePromise;
|
|
198
207
|
}
|
|
199
208
|
public query<
|
|
200
|
-
TQueries extends TRouter['
|
|
209
|
+
TQueries extends AssertLegacyDef<TRouter>['queries'],
|
|
201
210
|
TPath extends string & keyof TQueries,
|
|
202
211
|
>(
|
|
203
212
|
path: TPath,
|
|
204
|
-
...args: [
|
|
213
|
+
...args: [
|
|
214
|
+
...inferHandlerInput<AssertType<TQueries, ProcedureRecord>[TPath]>,
|
|
215
|
+
TRPCRequestOptions?,
|
|
216
|
+
]
|
|
205
217
|
) {
|
|
206
218
|
const context = (args[1] as TRPCRequestOptions | undefined)?.requestContext;
|
|
207
219
|
return this.requestAsPromise<
|
|
208
|
-
inferHandlerInput<TQueries[TPath]>,
|
|
220
|
+
inferHandlerInput<AssertType<TQueries, ProcedureRecord>[TPath]>,
|
|
209
221
|
inferProcedureOutput<TQueries[TPath]>
|
|
210
222
|
>({
|
|
211
223
|
type: 'query',
|
|
@@ -215,15 +227,18 @@ export class TRPCClient<TRouter extends AnyRouter> {
|
|
|
215
227
|
});
|
|
216
228
|
}
|
|
217
229
|
public mutation<
|
|
218
|
-
TMutations extends TRouter['
|
|
230
|
+
TMutations extends AssertLegacyDef<TRouter>['mutations'],
|
|
219
231
|
TPath extends string & keyof TMutations,
|
|
220
232
|
>(
|
|
221
233
|
path: TPath,
|
|
222
|
-
...args: [
|
|
234
|
+
...args: [
|
|
235
|
+
...inferHandlerInput<AssertType<TMutations, ProcedureRecord>[TPath]>,
|
|
236
|
+
TRPCRequestOptions?,
|
|
237
|
+
]
|
|
223
238
|
) {
|
|
224
239
|
const context = (args[1] as TRPCRequestOptions | undefined)?.requestContext;
|
|
225
240
|
return this.requestAsPromise<
|
|
226
|
-
inferHandlerInput<TMutations[TPath]>,
|
|
241
|
+
inferHandlerInput<AssertType<TMutations, ProcedureRecord>[TPath]>,
|
|
227
242
|
inferProcedureOutput<TMutations[TPath]>
|
|
228
243
|
>({
|
|
229
244
|
type: 'mutation',
|
|
@@ -233,10 +248,12 @@ export class TRPCClient<TRouter extends AnyRouter> {
|
|
|
233
248
|
});
|
|
234
249
|
}
|
|
235
250
|
public subscription<
|
|
236
|
-
TSubscriptions extends TRouter['
|
|
251
|
+
TSubscriptions extends AssertLegacyDef<TRouter>['subscriptions'],
|
|
237
252
|
TPath extends string & keyof TSubscriptions,
|
|
238
253
|
TOutput extends inferSubscriptionOutput<TRouter, TPath>,
|
|
239
|
-
TInput extends inferProcedureInput<
|
|
254
|
+
TInput extends inferProcedureInput<
|
|
255
|
+
AssertType<TSubscriptions, ProcedureRecord>[TPath]
|
|
256
|
+
>,
|
|
240
257
|
>(
|
|
241
258
|
path: TPath,
|
|
242
259
|
input: TInput,
|
|
@@ -249,24 +266,15 @@ export class TRPCClient<TRouter extends AnyRouter> {
|
|
|
249
266
|
input,
|
|
250
267
|
context: opts.requestContext,
|
|
251
268
|
});
|
|
252
|
-
const runtime = this.runtime;
|
|
253
269
|
return observable$.subscribe({
|
|
254
|
-
next(
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
opts.onStarted?.();
|
|
262
|
-
} else if (transformed.data.type === 'stopped') {
|
|
263
|
-
opts.onStopped?.();
|
|
264
|
-
} else if (transformed.data.type === 'data') {
|
|
265
|
-
opts.onData?.(transformed.data.data);
|
|
266
|
-
}
|
|
267
|
-
return;
|
|
270
|
+
next(envelope) {
|
|
271
|
+
if (envelope.result.type === 'started') {
|
|
272
|
+
opts.onStarted?.();
|
|
273
|
+
} else if (envelope.result.type === 'stopped') {
|
|
274
|
+
opts.onStopped?.();
|
|
275
|
+
} else {
|
|
276
|
+
opts.onData?.((envelope.result as any).data);
|
|
268
277
|
}
|
|
269
|
-
opts.onError?.(transformed.error);
|
|
270
278
|
},
|
|
271
279
|
error(err) {
|
|
272
280
|
opts.onError?.(err);
|
|
@@ -17,13 +17,10 @@ test('dedupeLink', async () => {
|
|
|
17
17
|
const timer = setTimeout(() => {
|
|
18
18
|
timerTriggered();
|
|
19
19
|
subscribe.next({
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
data: {
|
|
25
|
-
input: op.input,
|
|
26
|
-
},
|
|
20
|
+
result: {
|
|
21
|
+
type: 'data',
|
|
22
|
+
data: {
|
|
23
|
+
input: op.input,
|
|
27
24
|
},
|
|
28
25
|
},
|
|
29
26
|
});
|
|
@@ -80,13 +77,10 @@ test('dedupe - cancel one does not cancel the other', async () => {
|
|
|
80
77
|
const timer = setTimeout(() => {
|
|
81
78
|
timerTriggered();
|
|
82
79
|
subscribe.next({
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
data: {
|
|
88
|
-
input: op.input,
|
|
89
|
-
},
|
|
80
|
+
result: {
|
|
81
|
+
type: 'data',
|
|
82
|
+
data: {
|
|
83
|
+
input: op.input,
|
|
90
84
|
},
|
|
91
85
|
},
|
|
92
86
|
});
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { AnyRouter, ProcedureType } from '@trpc/server';
|
|
2
2
|
import { observable } from '@trpc/server/observable';
|
|
3
|
+
import { TRPCClientError } from '../TRPCClientError';
|
|
3
4
|
import { dataLoader } from '../internals/dataLoader';
|
|
4
5
|
import {
|
|
5
6
|
HTTPLinkOptions,
|
|
6
|
-
|
|
7
|
+
HTTPResult,
|
|
7
8
|
getUrl,
|
|
8
9
|
httpRequest,
|
|
9
10
|
} from './internals/httpUtils';
|
|
11
|
+
import { transformResult } from './internals/transformResult';
|
|
10
12
|
import { TRPCLink } from './types';
|
|
11
13
|
|
|
12
14
|
export interface HttpBatchLinkOptions extends HTTPLinkOptions {
|
|
@@ -67,13 +69,11 @@ export function httpBatchLink<TRouter extends AnyRouter>(
|
|
|
67
69
|
return { validate, fetch };
|
|
68
70
|
};
|
|
69
71
|
|
|
70
|
-
const query = dataLoader<BatchOperation,
|
|
71
|
-
|
|
72
|
-
);
|
|
73
|
-
const mutation = dataLoader<BatchOperation, ResponseShape>(
|
|
72
|
+
const query = dataLoader<BatchOperation, HTTPResult>(batchLoader('query'));
|
|
73
|
+
const mutation = dataLoader<BatchOperation, HTTPResult>(
|
|
74
74
|
batchLoader('mutation'),
|
|
75
75
|
);
|
|
76
|
-
const subscription = dataLoader<BatchOperation,
|
|
76
|
+
const subscription = dataLoader<BatchOperation, HTTPResult>(
|
|
77
77
|
batchLoader('subscription'),
|
|
78
78
|
);
|
|
79
79
|
|
|
@@ -85,9 +85,19 @@ export function httpBatchLink<TRouter extends AnyRouter>(
|
|
|
85
85
|
|
|
86
86
|
promise
|
|
87
87
|
.then((res) => {
|
|
88
|
+
const transformed = transformResult(res.json, runtime);
|
|
89
|
+
|
|
90
|
+
if (!transformed.ok) {
|
|
91
|
+
observer.error(
|
|
92
|
+
TRPCClientError.from(transformed.error, {
|
|
93
|
+
meta: res.meta,
|
|
94
|
+
}),
|
|
95
|
+
);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
88
98
|
observer.next({
|
|
89
99
|
context: res.meta,
|
|
90
|
-
|
|
100
|
+
result: transformed.result,
|
|
91
101
|
});
|
|
92
102
|
observer.complete();
|
|
93
103
|
})
|
package/src/links/httpLink.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { AnyRouter } from '@trpc/server';
|
|
2
2
|
import { observable } from '@trpc/server/observable';
|
|
3
|
+
import { TRPCClientError } from '../TRPCClientError';
|
|
3
4
|
import { HTTPLinkOptions, httpRequest } from './internals/httpUtils';
|
|
5
|
+
import { transformResult } from './internals/transformResult';
|
|
4
6
|
import { TRPCLink } from './types';
|
|
5
7
|
|
|
6
8
|
export function httpLink<TRouter extends AnyRouter>(
|
|
@@ -20,13 +22,23 @@ export function httpLink<TRouter extends AnyRouter>(
|
|
|
20
22
|
});
|
|
21
23
|
promise
|
|
22
24
|
.then((res) => {
|
|
25
|
+
const transformed = transformResult(res.json, runtime);
|
|
26
|
+
|
|
27
|
+
if (!transformed.ok) {
|
|
28
|
+
observer.error(
|
|
29
|
+
TRPCClientError.from(transformed.error, {
|
|
30
|
+
meta: res.meta,
|
|
31
|
+
}),
|
|
32
|
+
);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
23
35
|
observer.next({
|
|
24
36
|
context: res.meta,
|
|
25
|
-
|
|
37
|
+
result: transformed.result,
|
|
26
38
|
});
|
|
27
39
|
observer.complete();
|
|
28
40
|
})
|
|
29
|
-
.catch(
|
|
41
|
+
.catch((cause) => TRPCClientError.from(cause));
|
|
30
42
|
|
|
31
43
|
return () => {
|
|
32
44
|
cancel();
|
|
@@ -18,13 +18,10 @@ describe('chain', () => {
|
|
|
18
18
|
return observable((observer) => {
|
|
19
19
|
observer.next({
|
|
20
20
|
context: {},
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
data: {
|
|
26
|
-
input: op.input,
|
|
27
|
-
},
|
|
21
|
+
result: {
|
|
22
|
+
type: 'data',
|
|
23
|
+
data: {
|
|
24
|
+
input: op.input,
|
|
28
25
|
},
|
|
29
26
|
},
|
|
30
27
|
});
|
|
@@ -54,12 +51,9 @@ describe('chain', () => {
|
|
|
54
51
|
return observable((observer) => {
|
|
55
52
|
observer.next({
|
|
56
53
|
context: {},
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
type: 'data',
|
|
61
|
-
data: 'from cache',
|
|
62
|
-
},
|
|
54
|
+
result: {
|
|
55
|
+
type: 'data',
|
|
56
|
+
data: 'from cache',
|
|
63
57
|
},
|
|
64
58
|
});
|
|
65
59
|
const subscription = next(op).subscribe(observer);
|
|
@@ -71,13 +65,10 @@ describe('chain', () => {
|
|
|
71
65
|
({ op }) => {
|
|
72
66
|
return observable((observer) => {
|
|
73
67
|
observer.next({
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
data: {
|
|
79
|
-
input: op.input,
|
|
80
|
-
},
|
|
68
|
+
result: {
|
|
69
|
+
type: 'data',
|
|
70
|
+
data: {
|
|
71
|
+
input: op.input,
|
|
81
72
|
},
|
|
82
73
|
},
|
|
83
74
|
});
|
|
@@ -103,12 +94,9 @@ describe('chain', () => {
|
|
|
103
94
|
Array [
|
|
104
95
|
Object {
|
|
105
96
|
"context": Object {},
|
|
106
|
-
"
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"data": "from cache",
|
|
110
|
-
"type": "data",
|
|
111
|
-
},
|
|
97
|
+
"result": Object {
|
|
98
|
+
"data": "from cache",
|
|
99
|
+
"type": "data",
|
|
112
100
|
},
|
|
113
101
|
},
|
|
114
102
|
]
|
|
@@ -116,14 +104,11 @@ describe('chain', () => {
|
|
|
116
104
|
expect(next.mock.calls[1]).toMatchInlineSnapshot(`
|
|
117
105
|
Array [
|
|
118
106
|
Object {
|
|
119
|
-
"
|
|
120
|
-
"
|
|
121
|
-
|
|
122
|
-
"data": Object {
|
|
123
|
-
"input": "world",
|
|
124
|
-
},
|
|
125
|
-
"type": "data",
|
|
107
|
+
"result": Object {
|
|
108
|
+
"data": Object {
|
|
109
|
+
"input": "world",
|
|
126
110
|
},
|
|
111
|
+
"type": "data",
|
|
127
112
|
},
|
|
128
113
|
},
|
|
129
114
|
]
|