@trpc/client 10.0.0-alpha.21 → 10.0.0-alpha.22

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 (87) hide show
  1. package/dist/index.js +313 -270
  2. package/dist/index.mjs +301 -257
  3. package/dist/internals/TRPCClient.d.ts +12 -7
  4. package/dist/internals/TRPCClient.d.ts.map +1 -1
  5. package/dist/internals/dataLoader.d.ts +7 -6
  6. package/dist/internals/dataLoader.d.ts.map +1 -1
  7. package/dist/links/dedupeLink.d.ts.map +1 -1
  8. package/dist/links/httpBatchLink.d.ts +1 -1
  9. package/dist/links/httpBatchLink.d.ts.map +1 -1
  10. package/dist/links/index.d.ts +0 -2
  11. package/dist/links/index.d.ts.map +1 -1
  12. package/dist/links/internals/httpUtils.d.ts +15 -7
  13. package/dist/links/internals/httpUtils.d.ts.map +1 -1
  14. package/dist/links/internals/transformOperationResult.d.ts +17 -3
  15. package/dist/links/internals/transformOperationResult.d.ts.map +1 -1
  16. package/dist/links/loggerLink.d.ts.map +1 -1
  17. package/dist/links/retryLink.d.ts.map +1 -1
  18. package/dist/links/types.d.ts +10 -7
  19. package/dist/links/types.d.ts.map +1 -1
  20. package/dist/links/wsLink.d.ts +1 -1
  21. package/dist/links/wsLink.d.ts.map +1 -1
  22. package/package.json +5 -11
  23. package/src/internals/TRPCClient.ts +48 -24
  24. package/src/internals/dataLoader.ts +116 -54
  25. package/src/links/dedupeLink.test.ts +1 -1
  26. package/src/links/dedupeLink.ts +1 -2
  27. package/src/links/httpBatchLink.ts +54 -31
  28. package/src/links/httpLink.ts +3 -3
  29. package/src/links/index.ts +0 -2
  30. package/src/links/internals/createChain.test.ts +1 -1
  31. package/src/links/internals/createChain.ts +1 -1
  32. package/src/links/internals/httpUtils.ts +52 -31
  33. package/src/links/internals/transformOperationResult.ts +40 -12
  34. package/src/links/loggerLink.ts +1 -1
  35. package/src/links/retryLink.ts +1 -2
  36. package/src/links/splitLink.test.ts +1 -1
  37. package/src/links/splitLink.ts +4 -4
  38. package/src/links/types.ts +12 -7
  39. package/src/links/wsLink.ts +11 -10
  40. package/dist/links/transformerLink.d.ts +0 -4
  41. package/dist/links/transformerLink.d.ts.map +0 -1
  42. package/dist/observable/index.d.ts +0 -4
  43. package/dist/observable/index.d.ts.map +0 -1
  44. package/dist/observable/index.js +0 -38
  45. package/dist/observable/index.mjs +0 -31
  46. package/dist/observable/index.ts.js +0 -1
  47. package/dist/observable/internals/identity.d.ts +0 -2
  48. package/dist/observable/internals/identity.d.ts.map +0 -1
  49. package/dist/observable/internals/observableToPromise.d.ts +0 -10
  50. package/dist/observable/internals/observableToPromise.d.ts.map +0 -1
  51. package/dist/observable/internals/pipe.d.ts +0 -4
  52. package/dist/observable/internals/pipe.d.ts.map +0 -1
  53. package/dist/observable/observable.d.ts +0 -4
  54. package/dist/observable/observable.d.ts.map +0 -1
  55. package/dist/observable/operators/index.d.ts +0 -4
  56. package/dist/observable/operators/index.d.ts.map +0 -1
  57. package/dist/observable/operators/map.d.ts +0 -3
  58. package/dist/observable/operators/map.d.ts.map +0 -1
  59. package/dist/observable/operators/share.d.ts +0 -6
  60. package/dist/observable/operators/share.d.ts.map +0 -1
  61. package/dist/observable/operators/tap.d.ts +0 -3
  62. package/dist/observable/operators/tap.d.ts.map +0 -1
  63. package/dist/observable/types.d.ts +0 -29
  64. package/dist/observable/types.d.ts.map +0 -1
  65. package/dist/tap-0dcdee86.js +0 -243
  66. package/dist/tap-136a9a90.mjs +0 -239
  67. package/observable/dist/trpc-client-rx.cjs.d.ts +0 -1
  68. package/observable/dist/trpc-client-rx.cjs.dev.js +0 -9
  69. package/observable/dist/trpc-client-rx.cjs.js +0 -7
  70. package/observable/dist/trpc-client-rx.cjs.prod.js +0 -9
  71. package/observable/dist/trpc-client-rx.esm.js +0 -1
  72. package/observable/index.d.ts +0 -1
  73. package/observable/index.js +0 -1
  74. package/src/links/transformerLink.ts +0 -74
  75. package/src/observable/index.ts +0 -3
  76. package/src/observable/internals/identity.ts +0 -3
  77. package/src/observable/internals/observableToPromise.ts +0 -49
  78. package/src/observable/internals/pipe.ts +0 -22
  79. package/src/observable/observable.test.ts +0 -101
  80. package/src/observable/observable.ts +0 -70
  81. package/src/observable/operators/index.ts +0 -3
  82. package/src/observable/operators/map.test.ts +0 -92
  83. package/src/observable/operators/map.ts +0 -25
  84. package/src/observable/operators/share.test.ts +0 -60
  85. package/src/observable/operators/share.ts +0 -67
  86. package/src/observable/operators/tap.ts +0 -26
  87. package/src/observable/types.ts +0 -69
package/dist/index.js CHANGED
@@ -4,13 +4,13 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _classCallCheck = require('@babel/runtime/helpers/classCallCheck');
6
6
  var _createClass = require('@babel/runtime/helpers/createClass');
7
+ var observable = require('@trpc/server/observable');
7
8
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
8
9
  var _assertThisInitialized = require('@babel/runtime/helpers/assertThisInitialized');
9
10
  var _inherits = require('@babel/runtime/helpers/inherits');
10
11
  var _possibleConstructorReturn = require('@babel/runtime/helpers/possibleConstructorReturn');
11
12
  var _getPrototypeOf = require('@babel/runtime/helpers/getPrototypeOf');
12
13
  var _wrapNativeSuper = require('@babel/runtime/helpers/wrapNativeSuper');
13
- var tap = require('./tap-0dcdee86.js');
14
14
  var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
15
15
 
16
16
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -29,14 +29,14 @@ function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if
29
29
 
30
30
  function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$3(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
31
31
 
32
- function _createSuper$2(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$2(); return function _createSuperInternal() { var Super = _getPrototypeOf__default["default"](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default["default"](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default["default"](this, result); }; }
32
+ function _createSuper$1(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); return function _createSuperInternal() { var Super = _getPrototypeOf__default["default"](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default["default"](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default["default"](this, result); }; }
33
33
 
34
- function _isNativeReflectConstruct$2() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
34
+ function _isNativeReflectConstruct$1() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
35
35
 
36
36
  var TRPCClientError = /*#__PURE__*/function (_Error) {
37
37
  _inherits__default["default"](TRPCClientError, _Error);
38
38
 
39
- var _super = /*#__PURE__*/_createSuper$2(TRPCClientError);
39
+ var _super = /*#__PURE__*/_createSuper$1(TRPCClientError);
40
40
 
41
41
  function TRPCClientError(message, opts) {
42
42
  var _opts$result, _opts$result2;
@@ -137,12 +137,12 @@ function dedupeLink() {
137
137
 
138
138
  if (pending[key]) {
139
139
  // console.log('hooking into pending', { op });
140
- return tap.observable(function (observer) {
140
+ return observable.observable(function (observer) {
141
141
  return pending[key].subscribe(observer);
142
142
  });
143
143
  }
144
144
 
145
- var shared$ = tap.observable(function (observer) {
145
+ var shared$ = observable.observable(function (observer) {
146
146
  function reset() {
147
147
  delete pending[key];
148
148
  }
@@ -164,7 +164,7 @@ function dedupeLink() {
164
164
  reset();
165
165
  subscription.unsubscribe();
166
166
  };
167
- }).pipe(tap.share());
167
+ }).pipe(observable.share());
168
168
  pending[key] = shared$;
169
169
  return shared$;
170
170
  };
@@ -177,82 +177,174 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
177
177
 
178
178
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
179
179
 
180
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
181
+
182
+ /**
183
+ * A function that should never be called unless we messed something up.
184
+ */
185
+ var throwFatalError = function throwFatalError() {
186
+ throw new Error('Something went wrong. Please submit an issue at https://github.com/trpc/trpc/issues/new');
187
+ };
180
188
  /**
181
189
  * Dataloader that's very inspired by https://github.com/graphql/dataloader
182
190
  * Less configuration, no caching, and allows you to cancel requests
183
191
  * When cancelling a single fetch the whole batch will be cancelled only when _all_ items are cancelled
184
192
  */
185
- function dataLoader(fetchMany, opts) {
186
- var batch = null;
193
+
194
+
195
+ function dataLoader(batchLoader) {
196
+ var pendingItems = null;
187
197
  var dispatchTimer = null;
188
198
 
189
- var destroyTimerAndBatch = function destroyTimerAndBatch() {
199
+ var destroyTimerAndPendingItems = function destroyTimerAndPendingItems() {
190
200
  clearTimeout(dispatchTimer);
191
201
  dispatchTimer = null;
192
- batch = null;
202
+ pendingItems = null;
193
203
  };
204
+ /**
205
+ * Iterate through the items and split them into groups based on the `batchLoader`'s validate function
206
+ */
194
207
 
195
- function dispatch() {
196
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
197
- var batchCopy = batch;
198
- destroyTimerAndBatch();
199
-
200
- var _fetchMany = fetchMany(batchCopy.items.map(function (v) {
201
- return v.key;
202
- })),
203
- promise = _fetchMany.promise,
204
- cancel = _fetchMany.cancel;
205
-
206
- batchCopy.cancel = cancel;
207
- promise.then(function (result) {
208
- for (var i = 0; i < result.length; i++) {
209
- var _value = result[i]; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
210
-
211
- batchCopy.items[i].resolve(_value);
208
+
209
+ function groupItems(items) {
210
+ var groupedItems = [[]];
211
+ var index = 0;
212
+
213
+ while (true) {
214
+ var item = items[index];
215
+
216
+ if (!item) {
217
+ // we're done
218
+ break;
212
219
  }
213
- }).catch(function (cause) {
214
- var _iterator = _createForOfIteratorHelper(batchCopy.items),
215
- _step;
216
-
217
- try {
218
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
219
- var item = _step.value;
220
- item.reject(cause);
221
- }
222
- } catch (err) {
223
- _iterator.e(err);
224
- } finally {
225
- _iterator.f();
220
+
221
+ var lastGroup = groupedItems[groupedItems.length - 1];
222
+
223
+ if (item.aborted) {
224
+ // Item was aborted before it was dispatched
225
+ item.reject(new Error('Aborted'));
226
+ index++;
227
+ continue;
226
228
  }
227
- });
229
+
230
+ var isValid = batchLoader.validate(lastGroup.concat(item).map(function (it) {
231
+ return it.key;
232
+ }));
233
+
234
+ if (isValid) {
235
+ lastGroup.push(item);
236
+ index++;
237
+ continue;
238
+ }
239
+
240
+ if (lastGroup.length === 0) {
241
+ item.reject(new Error('Input is too big for a single dispatch'));
242
+ index++;
243
+ continue;
244
+ } // Create new group, next iteration will try to add the item to that
245
+
246
+
247
+ groupedItems.push([]);
248
+ }
249
+
250
+ return groupedItems;
228
251
  }
229
252
 
230
- function load(key) {
231
- var batchItem = {
232
- cancelled: false,
233
- key: key
234
- };
253
+ function dispatch() {
254
+ var groupedItems = groupItems(pendingItems);
255
+ destroyTimerAndPendingItems(); // Create batches for each group of items
235
256
 
236
- if (!batch) {
237
- batch = {
238
- items: [],
239
- cancel: function cancel() {
240
- destroyTimerAndBatch();
257
+ var _iterator = _createForOfIteratorHelper(groupedItems),
258
+ _step;
259
+
260
+ try {
261
+ var _loop = function _loop() {
262
+ var items = _step.value;
263
+
264
+ if (!items.length) {
265
+ return "continue";
241
266
  }
267
+
268
+ var batch = {
269
+ items: items,
270
+ cancel: throwFatalError
271
+ };
272
+
273
+ var _iterator2 = _createForOfIteratorHelper(items),
274
+ _step2;
275
+
276
+ try {
277
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
278
+ var item = _step2.value;
279
+ item.batch = batch;
280
+ }
281
+ } catch (err) {
282
+ _iterator2.e(err);
283
+ } finally {
284
+ _iterator2.f();
285
+ }
286
+
287
+ var _batchLoader$fetch = batchLoader.fetch(batch.items.map(function (_item) {
288
+ return _item.key;
289
+ })),
290
+ promise = _batchLoader$fetch.promise,
291
+ cancel = _batchLoader$fetch.cancel;
292
+
293
+ batch.cancel = cancel;
294
+ promise.then(function (result) {
295
+ for (var i = 0; i < result.length; i++) {
296
+ var _value = result[i];
297
+ var item = batch.items[i];
298
+ item.resolve(_value);
299
+ item.batch = null;
300
+ }
301
+ }).catch(function (cause) {
302
+ var _iterator3 = _createForOfIteratorHelper(batch.items),
303
+ _step3;
304
+
305
+ try {
306
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
307
+ var item = _step3.value;
308
+ item.reject(cause);
309
+ item.batch = null;
310
+ }
311
+ } catch (err) {
312
+ _iterator3.e(err);
313
+ } finally {
314
+ _iterator3.f();
315
+ }
316
+ });
242
317
  };
318
+
319
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
320
+ var _ret = _loop();
321
+
322
+ if (_ret === "continue") continue;
323
+ }
324
+ } catch (err) {
325
+ _iterator.e(err);
326
+ } finally {
327
+ _iterator.f();
243
328
  }
329
+ }
244
330
 
245
- var thisBatch = batch;
331
+ function load(key) {
332
+ var item = {
333
+ aborted: false,
334
+ key: key,
335
+ batch: null,
336
+ resolve: throwFatalError,
337
+ reject: throwFatalError
338
+ };
246
339
  var promise = new Promise(function (resolve, reject) {
247
- var item = batchItem;
248
340
  item.reject = reject;
249
341
  item.resolve = resolve;
250
- thisBatch.items.push(item);
251
342
 
252
- if (typeof (opts === null || opts === void 0 ? void 0 : opts.maxBatchSize) !== 'undefined' && thisBatch.items.length >= opts.maxBatchSize) {
253
- dispatch();
254
- return;
343
+ if (!pendingItems) {
344
+ pendingItems = [];
255
345
  }
346
+
347
+ pendingItems.push(item);
256
348
  });
257
349
 
258
350
  if (!dispatchTimer) {
@@ -260,16 +352,17 @@ function dataLoader(fetchMany, opts) {
260
352
  }
261
353
 
262
354
  var cancel = function cancel() {
263
- batchItem.cancelled = true;
355
+ var _item$batch;
356
+
357
+ item.aborted = true;
264
358
 
265
- if (thisBatch.items.some(function (item) {
266
- return !item.cancelled;
359
+ if ((_item$batch = item.batch) !== null && _item$batch !== void 0 && _item$batch.items.every(function (item) {
360
+ return item.aborted;
267
361
  })) {
268
- // there are still things that can be resolved
269
- return;
362
+ // All items in the batch have been cancelled
363
+ item.batch.cancel();
364
+ item.batch = null;
270
365
  }
271
-
272
- thisBatch.cancel();
273
366
  };
274
367
 
275
368
  return {
@@ -304,48 +397,56 @@ var METHOD = {
304
397
  mutation: 'POST',
305
398
  subscription: 'PATCH'
306
399
  };
307
- function httpRequest(props) {
308
- var type = props.type,
309
- rt = props.runtime,
310
- path = props.path;
311
- var ac = rt.AbortController ? new rt.AbortController() : null;
312
- var input = 'input' in props ? props.input : arrayToDict(props.inputs);
313
-
314
- function getUrl() {
315
- var url = props.url + '/' + path;
316
- var queryParts = [];
317
-
318
- if ('inputs' in props) {
319
- queryParts.push('batch=1');
320
- }
321
400
 
322
- if (type === 'query' && input !== undefined) {
323
- queryParts.push("input=".concat(encodeURIComponent(JSON.stringify(input))));
324
- }
401
+ function getInput(opts) {
402
+ return 'input' in opts ? opts.runtime.transformer.serialize(opts.input) : arrayToDict(opts.inputs.map(function (_input) {
403
+ return opts.runtime.transformer.serialize(_input);
404
+ }));
405
+ }
325
406
 
326
- if (queryParts.length) {
327
- url += '?' + queryParts.join('&');
328
- }
407
+ function getUrl(opts) {
408
+ var url = opts.url + '/' + opts.path;
409
+ var queryParts = [];
329
410
 
330
- return url;
411
+ if ('inputs' in opts) {
412
+ queryParts.push('batch=1');
331
413
  }
332
414
 
333
- function getBody() {
334
- if (type === 'query') {
335
- return undefined;
415
+ if (opts.type === 'query') {
416
+ var input = getInput(opts);
417
+
418
+ if (input !== undefined) {
419
+ queryParts.push("input=".concat(encodeURIComponent(JSON.stringify(input))));
336
420
  }
421
+ }
337
422
 
338
- return input !== undefined ? JSON.stringify(input) : undefined;
423
+ if (queryParts.length) {
424
+ url += '?' + queryParts.join('&');
339
425
  }
340
426
 
427
+ return url;
428
+ }
429
+ function getBody(opts) {
430
+ if (opts.type === 'query') {
431
+ return undefined;
432
+ }
433
+
434
+ var input = getInput(opts);
435
+ return input !== undefined ? JSON.stringify(input) : undefined;
436
+ }
437
+ function httpRequest(opts) {
438
+ var type = opts.type,
439
+ runtime = opts.runtime;
440
+ var ac = runtime.AbortController ? new runtime.AbortController() : null;
341
441
  var promise = new Promise(function (resolve, reject) {
342
- var url = getUrl();
442
+ var url = getUrl(opts);
443
+ var body = getBody(opts);
343
444
  var meta = {};
344
- Promise.resolve(rt.headers()).then(function (headers) {
345
- return rt.fetch(url, {
445
+ Promise.resolve(runtime.headers()).then(function (headers) {
446
+ return runtime.fetch(url, {
346
447
  method: METHOD[type],
347
448
  signal: ac === null || ac === void 0 ? void 0 : ac.signal,
348
- body: getBody(),
449
+ body: body,
349
450
  headers: _objectSpread$2({
350
451
  'content-type': 'application/json'
351
452
  }, headers)
@@ -372,31 +473,54 @@ function httpRequest(props) {
372
473
  }
373
474
 
374
475
  function httpBatchLink(opts) {
375
- var url = opts.url; // initialized config
376
-
476
+ // initialized config
377
477
  return function (runtime) {
378
- var fetcher = function fetcher(type) {
379
- return function (keyInputPairs) {
380
- var path = keyInputPairs.map(function (op) {
478
+ var maxURLLength = opts.maxURLLength || Infinity;
479
+
480
+ var batchLoader = function batchLoader(type) {
481
+ var validate = function validate(batchOps) {
482
+ if (maxURLLength === Infinity) {
483
+ // escape hatch for quick calcs
484
+ return true;
485
+ }
486
+
487
+ var path = batchOps.map(function (op) {
381
488
  return op.path;
382
489
  }).join(',');
383
- var inputs = keyInputPairs.map(function (op) {
490
+ var inputs = batchOps.map(function (op) {
491
+ return op.input;
492
+ });
493
+ var url = getUrl({
494
+ url: opts.url,
495
+ runtime: runtime,
496
+ type: type,
497
+ path: path,
498
+ inputs: inputs
499
+ });
500
+ return url.length <= maxURLLength;
501
+ };
502
+
503
+ var fetch = function fetch(batchOps) {
504
+ var path = batchOps.map(function (op) {
505
+ return op.path;
506
+ }).join(',');
507
+ var inputs = batchOps.map(function (op) {
384
508
  return op.input;
385
509
  });
386
510
 
387
511
  var _httpRequest = httpRequest({
388
- url: url,
389
- inputs: inputs,
390
- path: path,
512
+ url: opts.url,
391
513
  runtime: runtime,
392
- type: type
514
+ type: type,
515
+ path: path,
516
+ inputs: inputs
393
517
  }),
394
518
  promise = _httpRequest.promise,
395
519
  cancel = _httpRequest.cancel;
396
520
 
397
521
  return {
398
522
  promise: promise.then(function (res) {
399
- var resJSON = Array.isArray(res.json) ? res.json : keyInputPairs.map(function () {
523
+ var resJSON = Array.isArray(res.json) ? res.json : batchOps.map(function () {
400
524
  return res.json;
401
525
  });
402
526
  var result = resJSON.map(function (item) {
@@ -410,11 +534,16 @@ function httpBatchLink(opts) {
410
534
  cancel: cancel
411
535
  };
412
536
  };
537
+
538
+ return {
539
+ validate: validate,
540
+ fetch: fetch
541
+ };
413
542
  };
414
543
 
415
- var query = dataLoader(fetcher('query'), opts);
416
- var mutation = dataLoader(fetcher('mutation'), opts);
417
- var subscription = dataLoader(fetcher('subscription'), opts);
544
+ var query = dataLoader(batchLoader('query'));
545
+ var mutation = dataLoader(batchLoader('mutation'));
546
+ var subscription = dataLoader(batchLoader('subscription'));
418
547
  var loaders = {
419
548
  query: query,
420
549
  subscription: subscription,
@@ -422,7 +551,7 @@ function httpBatchLink(opts) {
422
551
  };
423
552
  return function (_ref) {
424
553
  var op = _ref.op;
425
- return tap.observable(function (observer) {
554
+ return observable.observable(function (observer) {
426
555
  var loader = loaders[op.type];
427
556
 
428
557
  var _loader$load = loader.load(op),
@@ -451,17 +580,17 @@ function httpLink(opts) {
451
580
  return function (runtime) {
452
581
  return function (_ref) {
453
582
  var op = _ref.op;
454
- return tap.observable(function (observer) {
583
+ return observable.observable(function (observer) {
455
584
  var path = op.path,
456
585
  input = op.input,
457
586
  type = op.type;
458
587
 
459
588
  var _httpRequest = httpRequest({
589
+ url: url,
460
590
  runtime: runtime,
461
- path: path,
462
- input: input,
463
591
  type: type,
464
- url: url
592
+ path: path,
593
+ input: input
465
594
  }),
466
595
  promise = _httpRequest.promise,
467
596
  cancel = _httpRequest.cancel;
@@ -540,7 +669,7 @@ function loggerLink() {
540
669
  return function (_ref) {
541
670
  var op = _ref.op,
542
671
  next = _ref.next;
543
- return tap.observable(function (observer) {
672
+ return observable.observable(function (observer) {
544
673
  // ->
545
674
  enabled(_objectSpread$1(_objectSpread$1({}, op), {}, {
546
675
  direction: 'up'
@@ -561,7 +690,7 @@ function loggerLink() {
561
690
  }));
562
691
  }
563
692
 
564
- return next(op).pipe(tap.tap({
693
+ return next(op).pipe(observable.tap({
565
694
  next: function next(result) {
566
695
  logResult(result);
567
696
  },
@@ -582,7 +711,7 @@ function retryLink(opts) {
582
711
  var op = _ref.op,
583
712
  next = _ref.next;
584
713
  // initialized for request
585
- return tap.observable(function (observer) {
714
+ return observable.observable(function (observer) {
586
715
  var next$ = null;
587
716
  var attempts = 0;
588
717
  var isDone = false;
@@ -638,7 +767,7 @@ function retryLink(opts) {
638
767
 
639
768
  /** @internal */
640
769
  function createChain(opts) {
641
- return tap.observable(function (observer) {
770
+ return observable.observable(function (observer) {
642
771
  function execute() {
643
772
  var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
644
773
  var op = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : opts.op;
@@ -663,15 +792,15 @@ function asArray(value) {
663
792
  }
664
793
 
665
794
  function splitLink(opts) {
666
- return function (rt) {
795
+ return function (runtime) {
667
796
  var yes = asArray(opts.true).map(function (link) {
668
- return link(rt);
797
+ return link(runtime);
669
798
  });
670
799
  var no = asArray(opts.false).map(function (link) {
671
- return link(rt);
800
+ return link(runtime);
672
801
  });
673
802
  return function (props) {
674
- return tap.observable(function (observer) {
803
+ return observable.observable(function (observer) {
675
804
  var links = opts.condition(props.op) ? yes : no;
676
805
  return createChain({
677
806
  op: props.op,
@@ -682,81 +811,14 @@ function splitLink(opts) {
682
811
  };
683
812
  }
684
813
 
685
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
686
-
687
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
688
-
689
- /**
690
- * @internal
691
- */
692
- function transformOperationResult$1(result, transformer) {
693
- if ('error' in result.data) {
694
- return _objectSpread(_objectSpread({}, result), {}, {
695
- data: _objectSpread(_objectSpread({}, result.data), {}, {
696
- error: transformer.deserialize(result.data.error)
697
- })
698
- });
699
- }
700
-
701
- if (result.data.result.type !== 'data') {
702
- return result;
703
- }
704
-
705
- return _objectSpread(_objectSpread({}, result), {}, {
706
- data: _objectSpread(_objectSpread({}, result.data), {}, {
707
- result: _objectSpread(_objectSpread({}, result.data.result), {}, {
708
- data: transformer.deserialize(result.data.result.data)
709
- })
710
- })
711
- });
712
- }
713
-
714
- function transformerLink(transformer) {
715
- var _transformer = transformer ? 'input' in transformer ? {
716
- serialize: transformer.input.serialize,
717
- deserialize: transformer.output.deserialize
718
- } : transformer : {
719
- serialize: function serialize(data) {
720
- return data;
721
- },
722
- deserialize: function deserialize(data) {
723
- return data;
724
- }
725
- };
726
-
727
- return function () {
728
- return function (props) {
729
- var input = _transformer.serialize(props.op.input);
730
-
731
- return tap.observable(function (observer) {
732
- var subscription = props.next(_objectSpread(_objectSpread({}, props.op), {}, {
733
- input: input
734
- })).subscribe({
735
- next: function next(value) {
736
- var transformed = transformOperationResult$1(value, _transformer);
737
- observer.next(transformed);
738
- },
739
- error: function error(err) {
740
- observer.error(err);
741
- },
742
- complete: function complete() {
743
- observer.complete();
744
- }
745
- });
746
- return subscription;
747
- });
748
- };
749
- };
750
- }
751
-
752
814
  /* istanbul ignore next */
753
815
  var retryDelay = function retryDelay(attemptIndex) {
754
816
  return attemptIndex === 0 ? 0 : Math.min(1000 * Math.pow(2, attemptIndex), 30000);
755
817
  };
756
818
 
757
- function _createSuper$1(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); return function _createSuperInternal() { var Super = _getPrototypeOf__default["default"](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default["default"](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default["default"](this, result); }; }
819
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf__default["default"](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default["default"](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default["default"](this, result); }; }
758
820
 
759
- function _isNativeReflectConstruct$1() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
821
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
760
822
  function createWSClient(opts) {
761
823
  var url = opts.url,
762
824
  _opts$WebSocket = opts.WebSocket,
@@ -968,7 +1030,6 @@ function createWSClient(opts) {
968
1030
  id = op.id;
969
1031
  var envelope = {
970
1032
  id: id,
971
- jsonrpc: '2.0',
972
1033
  method: type,
973
1034
  params: {
974
1035
  input: input,
@@ -997,8 +1058,7 @@ function createWSClient(opts) {
997
1058
  if (op.type === 'subscription') {
998
1059
  outgoing.push({
999
1060
  id: id,
1000
- method: 'subscription.stop',
1001
- params: undefined
1061
+ method: 'subscription.stop'
1002
1062
  });
1003
1063
  dispatch();
1004
1064
  }
@@ -1020,7 +1080,7 @@ function createWSClient(opts) {
1020
1080
  var TRPCWebSocketClosedError = /*#__PURE__*/function (_Error) {
1021
1081
  _inherits__default["default"](TRPCWebSocketClosedError, _Error);
1022
1082
 
1023
- var _super = /*#__PURE__*/_createSuper$1(TRPCWebSocketClosedError);
1083
+ var _super = /*#__PURE__*/_createSuper(TRPCWebSocketClosedError);
1024
1084
 
1025
1085
  function TRPCWebSocketClosedError(message) {
1026
1086
  var _this;
@@ -1039,7 +1099,7 @@ var TRPCWebSocketClosedError = /*#__PURE__*/function (_Error) {
1039
1099
  var TRPCSubscriptionEndedError = /*#__PURE__*/function (_Error2) {
1040
1100
  _inherits__default["default"](TRPCSubscriptionEndedError, _Error2);
1041
1101
 
1042
- var _super2 = /*#__PURE__*/_createSuper$1(TRPCSubscriptionEndedError);
1102
+ var _super2 = /*#__PURE__*/_createSuper(TRPCSubscriptionEndedError);
1043
1103
 
1044
1104
  function TRPCSubscriptionEndedError(message) {
1045
1105
  var _this2;
@@ -1056,16 +1116,16 @@ var TRPCSubscriptionEndedError = /*#__PURE__*/function (_Error2) {
1056
1116
  }( /*#__PURE__*/_wrapNativeSuper__default["default"](Error));
1057
1117
 
1058
1118
  function wsLink(opts) {
1059
- return function () {
1119
+ return function (runtime) {
1060
1120
  var client = opts.client;
1061
1121
  return function (_ref2) {
1062
1122
  var op = _ref2.op;
1063
- return tap.observable(function (observer) {
1123
+ return observable.observable(function (observer) {
1064
1124
  var type = op.type,
1065
- input = op.input,
1066
1125
  path = op.path,
1067
1126
  id = op.id,
1068
1127
  context = op.context;
1128
+ var input = runtime.transformer.serialize(op.input);
1069
1129
  var isDone = false;
1070
1130
  var unsub = client.request({
1071
1131
  type: type,
@@ -1107,12 +1167,18 @@ function wsLink(opts) {
1107
1167
  };
1108
1168
  }
1109
1169
 
1170
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1171
+
1172
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1173
+
1110
1174
  /** @internal */
1111
- function transformOperationResult(result) {
1175
+ function transformOperationResult(result, runtime) {
1112
1176
  var context = result.context;
1113
1177
 
1114
1178
  if ('error' in result.data) {
1115
- var error = TRPCClientError.from(result.data);
1179
+ var error = TRPCClientError.from(_objectSpread(_objectSpread({}, result.data), {}, {
1180
+ error: runtime.transformer.deserialize(result.data.error)
1181
+ }));
1116
1182
  return {
1117
1183
  ok: false,
1118
1184
  error: error,
@@ -1120,75 +1186,39 @@ function transformOperationResult(result) {
1120
1186
  };
1121
1187
  }
1122
1188
 
1123
- var data = result.data.result.data;
1189
+ var data = runtime.transformer.deserialize(result.data.result.data);
1124
1190
  return {
1125
1191
  ok: true,
1126
1192
  data: data,
1127
1193
  context: context
1128
1194
  };
1129
1195
  }
1130
-
1131
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf__default["default"](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default["default"](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default["default"](this, result); }; }
1132
-
1133
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
1134
-
1135
- var ObservableAbortError = /*#__PURE__*/function (_Error) {
1136
- _inherits__default["default"](ObservableAbortError, _Error);
1137
-
1138
- var _super = /*#__PURE__*/_createSuper(ObservableAbortError);
1139
-
1140
- function ObservableAbortError(message) {
1141
- var _this;
1142
-
1143
- _classCallCheck__default["default"](this, ObservableAbortError);
1144
-
1145
- _this = _super.call(this, message);
1146
- _this.name = 'ObservableAbortError';
1147
- Object.setPrototypeOf(_assertThisInitialized__default["default"](_this), ObservableAbortError.prototype);
1148
- return _this;
1149
- }
1150
-
1151
- return _createClass__default["default"](ObservableAbortError);
1152
- }( /*#__PURE__*/_wrapNativeSuper__default["default"](Error));
1153
1196
  /** @internal */
1154
1197
 
1155
- function observableToPromise(observable) {
1156
- var abort;
1157
- var promise = new Promise(function (resolve, reject) {
1158
- var isDone = false;
1159
-
1160
- function onDone() {
1161
- if (isDone) {
1162
- return;
1163
- }
1164
-
1165
- isDone = true;
1166
- reject(new ObservableAbortError('This operation was cancelled.'));
1167
- obs$.unsubscribe();
1168
- }
1198
+ function transformSubscriptionOperationResult(result, runtime) {
1199
+ var context = result.context;
1169
1200
 
1170
- var obs$ = observable.subscribe({
1171
- next: function next(data) {
1172
- isDone = true;
1173
- resolve(data);
1174
- onDone();
1175
- },
1176
- error: function error(data) {
1177
- isDone = true;
1178
- reject(data);
1179
- onDone();
1180
- },
1181
- complete: function complete() {
1182
- isDone = true;
1183
- onDone();
1184
- }
1201
+ if ('error' in result.data) {
1202
+ var error = TRPCClientError.from(_objectSpread(_objectSpread({}, result.data), {}, {
1203
+ error: runtime.transformer.deserialize(result.data.error)
1204
+ }), {
1205
+ meta: context
1185
1206
  });
1186
- abort = onDone;
1207
+ return {
1208
+ ok: false,
1209
+ error: error,
1210
+ context: context
1211
+ };
1212
+ }
1213
+
1214
+ var data = _objectSpread(_objectSpread({}, result.data.result), result.data.result.type === 'data' && {
1215
+ data: runtime.transformer.deserialize(result.data.result.data)
1187
1216
  });
1217
+
1188
1218
  return {
1189
- promise: promise,
1190
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1191
- abort: abort
1219
+ ok: true,
1220
+ data: data,
1221
+ context: context
1192
1222
  };
1193
1223
  }
1194
1224
 
@@ -1224,10 +1254,22 @@ var TRPCClient = /*#__PURE__*/function () {
1224
1254
  };
1225
1255
  }
1226
1256
 
1257
+ var transformer = opts.transformer ? 'input' in opts.transformer ? {
1258
+ serialize: opts.transformer.input.serialize,
1259
+ deserialize: opts.transformer.output.deserialize
1260
+ } : opts.transformer : {
1261
+ serialize: function serialize(data) {
1262
+ return data;
1263
+ },
1264
+ deserialize: function deserialize(data) {
1265
+ return data;
1266
+ }
1267
+ };
1227
1268
  this.runtime = {
1228
1269
  AbortController: AC,
1229
1270
  fetch: _fetch,
1230
- headers: getHeadersFn()
1271
+ headers: getHeadersFn(),
1272
+ transformer: transformer
1231
1273
  };
1232
1274
 
1233
1275
  if ('links' in opts) {
@@ -1259,20 +1301,22 @@ var TRPCClient = /*#__PURE__*/function () {
1259
1301
  context: context
1260
1302
  }
1261
1303
  });
1262
- return chain$.pipe(tap.share());
1304
+ return chain$.pipe(observable.share());
1263
1305
  }
1264
1306
  }, {
1265
1307
  key: "requestAsPromise",
1266
1308
  value: function requestAsPromise(opts) {
1309
+ var _this2 = this;
1310
+
1267
1311
  var req$ = this.$request(opts);
1268
1312
 
1269
- var _observableToPromise = observableToPromise(req$),
1313
+ var _observableToPromise = observable.observableToPromise(req$),
1270
1314
  promise = _observableToPromise.promise,
1271
1315
  abort = _observableToPromise.abort;
1272
1316
 
1273
1317
  var cancellablePromise = new Promise(function (resolve, reject) {
1274
1318
  promise.then(function (result) {
1275
- var transformed = transformOperationResult(result);
1319
+ var transformed = transformOperationResult(result, _this2.runtime);
1276
1320
 
1277
1321
  if (transformed.ok) {
1278
1322
  resolve(transformed.data);
@@ -1322,21 +1366,21 @@ var TRPCClient = /*#__PURE__*/function () {
1322
1366
  input: input,
1323
1367
  context: opts.context
1324
1368
  });
1369
+ var runtime = this.runtime;
1325
1370
  return observable$.subscribe({
1326
1371
  next: function next(result) {
1327
- var _opts$next;
1372
+ var _opts$error;
1328
1373
 
1329
- if ('error' in result.data) {
1330
- var _opts$error;
1374
+ var transformed = transformSubscriptionOperationResult(result, runtime);
1331
1375
 
1332
- var err = TRPCClientError.from(result.data, {
1333
- meta: result.context
1334
- });
1335
- (_opts$error = opts.error) === null || _opts$error === void 0 ? void 0 : _opts$error.call(opts, err);
1376
+ if (transformed.ok) {
1377
+ var _opts$next;
1378
+
1379
+ (_opts$next = opts.next) === null || _opts$next === void 0 ? void 0 : _opts$next.call(opts, transformed.data);
1336
1380
  return;
1337
1381
  }
1338
1382
 
1339
- (_opts$next = opts.next) === null || _opts$next === void 0 ? void 0 : _opts$next.call(opts, result.data.result);
1383
+ (_opts$error = opts.error) === null || _opts$error === void 0 ? void 0 : _opts$error.call(opts, transformed.error);
1340
1384
  },
1341
1385
  error: function error(err) {
1342
1386
  var _opts$error2;
@@ -1370,5 +1414,4 @@ exports.httpLink = httpLink;
1370
1414
  exports.loggerLink = loggerLink;
1371
1415
  exports.retryLink = retryLink;
1372
1416
  exports.splitLink = splitLink;
1373
- exports.transformerLink = transformerLink;
1374
1417
  exports.wsLink = wsLink;