@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.
Files changed (58) hide show
  1. package/dist/TRPCClientError.d.ts +14 -10
  2. package/dist/TRPCClientError.d.ts.map +1 -1
  3. package/dist/createTRPCClient.d.ts +1 -1
  4. package/dist/createTRPCClient.d.ts.map +1 -1
  5. package/dist/createTRPCClientProxy.d.ts +9 -3
  6. package/dist/createTRPCClientProxy.d.ts.map +1 -1
  7. package/dist/index.js +33 -97
  8. package/dist/index.mjs +30 -94
  9. package/dist/internals/TRPCClient.d.ts +19 -3
  10. package/dist/internals/TRPCClient.d.ts.map +1 -1
  11. package/dist/links/httpBatchLink.d.ts.map +1 -1
  12. package/dist/links/httpBatchLink.js +18 -1
  13. package/dist/links/httpBatchLink.mjs +18 -1
  14. package/dist/links/httpLink.d.ts.map +1 -1
  15. package/dist/links/httpLink.js +21 -2
  16. package/dist/links/httpLink.mjs +21 -2
  17. package/dist/links/internals/httpUtils.d.ts +4 -3
  18. package/dist/links/internals/httpUtils.d.ts.map +1 -1
  19. package/dist/links/internals/transformResult.d.ts +28 -0
  20. package/dist/links/internals/transformResult.d.ts.map +1 -0
  21. package/dist/links/loggerLink.d.ts +3 -3
  22. package/dist/links/loggerLink.d.ts.map +1 -1
  23. package/dist/links/loggerLink.js +1 -1
  24. package/dist/links/loggerLink.mjs +1 -1
  25. package/dist/links/types.d.ts +6 -8
  26. package/dist/links/types.d.ts.map +1 -1
  27. package/dist/links/wsLink.d.ts +9 -4
  28. package/dist/links/wsLink.d.ts.map +1 -1
  29. package/dist/links/wsLink.js +400 -12
  30. package/dist/links/wsLink.mjs +391 -10
  31. package/dist/transformResult-06bec648.mjs +108 -0
  32. package/dist/transformResult-3ccc74ea.js +122 -0
  33. package/links/httpBatchLink/dist/trpc-client-links-httpBatchLink.cjs.dev.js +4 -4
  34. package/links/httpBatchLink/dist/trpc-client-links-httpBatchLink.cjs.prod.js +4 -4
  35. package/links/httpBatchLink/dist/trpc-client-links-httpBatchLink.esm.js +1 -1
  36. package/links/httpLink/dist/trpc-client-links-httpLink.cjs.dev.js +4 -4
  37. package/links/httpLink/dist/trpc-client-links-httpLink.cjs.prod.js +4 -4
  38. package/links/httpLink/dist/trpc-client-links-httpLink.esm.js +1 -1
  39. package/package.json +4 -4
  40. package/src/TRPCClientError.ts +35 -17
  41. package/src/createTRPCClient.ts +1 -0
  42. package/src/createTRPCClientProxy.ts +17 -2
  43. package/src/internals/TRPCClient.ts +43 -35
  44. package/src/links/dedupeLink.test.ts +8 -14
  45. package/src/links/httpBatchLink.ts +17 -7
  46. package/src/links/httpLink.ts +14 -2
  47. package/src/links/internals/createChain.test.ts +18 -33
  48. package/src/links/internals/httpUtils.ts +6 -5
  49. package/src/links/internals/transformResult.ts +40 -0
  50. package/src/links/loggerLink.ts +5 -5
  51. package/src/links/retryLink.ts +1 -1
  52. package/src/links/types.ts +8 -10
  53. package/src/links/wsLink.ts +27 -8
  54. package/dist/links/internals/transformOperationResult.d.ts +0 -30
  55. package/dist/links/internals/transformOperationResult.d.ts.map +0 -1
  56. package/dist/wsLink-27b93bd0.mjs +0 -451
  57. package/dist/wsLink-44703a83.js +0 -467
  58. 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 transformRPCResponse = require('../../../dist/transformRPCResponse-e6daeb02.cjs.prod.js');
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 = transformRPCResponse.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 transformRPCResponse.TRPCAbortError(), {
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(transformRPCResponse.transformRPCResponse({
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/transformRPCResponse-3700ef8b.esm.js';
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 transformRPCResponse = require('../../../dist/transformRPCResponse-0ad3cc9f.cjs.dev.js');
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 = transformRPCResponse.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 transformRPCResponse.TRPCAbortError(), {
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(transformRPCResponse.transformRPCResponse({
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 transformRPCResponse = require('../../../dist/transformRPCResponse-e6daeb02.cjs.prod.js');
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 = transformRPCResponse.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 transformRPCResponse.TRPCAbortError(), {
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(transformRPCResponse.transformRPCResponse({
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/transformRPCResponse-3700ef8b.esm.js';
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.42",
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.42"
70
+ "@trpc/server": "10.0.0-alpha.45"
71
71
  },
72
72
  "devDependencies": {
73
- "@trpc/server": "10.0.0-alpha.42"
73
+ "@trpc/server": "10.0.0-alpha.45"
74
74
  },
75
75
  "publishConfig": {
76
76
  "access": "public"
77
77
  },
78
- "gitHead": "d5909785e8d024ef7869d9f5423dbe3bfd80cd59"
78
+ "gitHead": "337fc1ec6ff60b1cd38a85ba4d564e96d6ba7a40"
79
79
  }
@@ -1,25 +1,40 @@
1
- import { AnyRouter, Maybe, inferRouterError } from '@trpc/server';
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
- export interface TRPCClientErrorLike<TRouter extends AnyRouter> {
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<inferRouterError<TRouter>>;
7
- readonly data: Maybe<inferRouterError<TRouter>['data']>;
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<TRouter extends AnyRouter>
25
+ export class TRPCClientError<TRouterOrProcedure extends RouterOrProcedure>
11
26
  extends Error
12
- implements TRPCClientErrorLike<TRouter>
27
+ implements TRPCClientErrorBase<inferErrorShape<TRouterOrProcedure>>
13
28
  {
14
29
  public readonly cause;
15
- public readonly shape: Maybe<inferRouterError<TRouter>>;
16
- public readonly data: Maybe<inferRouterError<TRouter>['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: Maybe<TRPCErrorResponse<inferRouterError<TRouter>>>;
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<TRouter extends AnyRouter>(
58
+ public static from<TRouterOrProcedure extends RouterOrProcedure>(
44
59
  cause: Error | TRPCErrorResponse<any>,
45
60
  opts: { meta?: Record<string, unknown> } = {},
46
- ): TRPCClientError<TRouter> {
61
+ ): TRPCClientError<TRouterOrProcedure> {
47
62
  if (!(cause instanceof Error)) {
48
- return new TRPCClientError<TRouter>((cause.error as any).message ?? '', {
49
- ...opts,
50
- cause: undefined,
51
- result: cause,
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<TRouter>(cause.message, {
76
+ return new TRPCClientError<TRouterOrProcedure>(cause.message, {
59
77
  ...opts,
60
78
  cause,
61
79
  result: null,
@@ -20,4 +20,5 @@ export type {
20
20
  TRPCRequestOptions,
21
21
  CreateTRPCClientOptions,
22
22
  TRPCClient,
23
+ AssertLegacyDef,
23
24
  } from './internals/TRPCClient';
@@ -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((result) => {
183
- const transformed = transformOperationResult(result, this.runtime);
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['_def']['queries'],
209
+ TQueries extends AssertLegacyDef<TRouter>['queries'],
201
210
  TPath extends string & keyof TQueries,
202
211
  >(
203
212
  path: TPath,
204
- ...args: [...inferHandlerInput<TQueries[TPath]>, TRPCRequestOptions?]
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['_def']['mutations'],
230
+ TMutations extends AssertLegacyDef<TRouter>['mutations'],
219
231
  TPath extends string & keyof TMutations,
220
232
  >(
221
233
  path: TPath,
222
- ...args: [...inferHandlerInput<TMutations[TPath]>, TRPCRequestOptions?]
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['_def']['subscriptions'],
251
+ TSubscriptions extends AssertLegacyDef<TRouter>['subscriptions'],
237
252
  TPath extends string & keyof TSubscriptions,
238
253
  TOutput extends inferSubscriptionOutput<TRouter, TPath>,
239
- TInput extends inferProcedureInput<TSubscriptions[TPath]>,
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(result) {
255
- const transformed = transformSubscriptionOperationResult(
256
- result,
257
- runtime,
258
- );
259
- if (transformed.ok) {
260
- if (transformed.data.type === 'started') {
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
- data: {
21
- id: null,
22
- result: {
23
- type: 'data',
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
- data: {
84
- id: null,
85
- result: {
86
- type: 'data',
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
- ResponseShape,
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, ResponseShape>(
71
- batchLoader('query'),
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, ResponseShape>(
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
- data: res.json as any,
100
+ result: transformed.result,
91
101
  });
92
102
  observer.complete();
93
103
  })
@@ -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
- data: res.json as any,
37
+ result: transformed.result,
26
38
  });
27
39
  observer.complete();
28
40
  })
29
- .catch(observer.error);
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
- data: {
22
- id: null,
23
- result: {
24
- type: 'data',
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
- data: {
58
- id: null,
59
- result: {
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
- data: {
75
- id: null,
76
- result: {
77
- type: 'data',
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
- "data": Object {
107
- "id": null,
108
- "result": Object {
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
- "data": Object {
120
- "id": null,
121
- "result": Object {
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
  ]