@trpc/client 10.0.0-alpha.20 → 10.0.0-alpha.23

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 (93) hide show
  1. package/dist/index.js +329 -275
  2. package/dist/index.mjs +317 -262
  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/links/httpBatchLink/dist/trpc-client-links-httpBatchLink.cjs.dev.js +4 -4
  23. package/links/httpBatchLink/dist/trpc-client-links-httpBatchLink.cjs.prod.js +4 -4
  24. package/links/httpBatchLink/dist/trpc-client-links-httpBatchLink.esm.js +4 -4
  25. package/links/wsLink/dist/trpc-client-links-wsLink.cjs.dev.js +2 -0
  26. package/links/wsLink/dist/trpc-client-links-wsLink.cjs.prod.js +2 -0
  27. package/links/wsLink/dist/trpc-client-links-wsLink.esm.js +2 -0
  28. package/package.json +13 -11
  29. package/src/internals/TRPCClient.ts +48 -24
  30. package/src/internals/dataLoader.ts +116 -53
  31. package/src/links/dedupeLink.test.ts +1 -1
  32. package/src/links/dedupeLink.ts +1 -2
  33. package/src/links/httpBatchLink.ts +54 -31
  34. package/src/links/httpLink.ts +3 -3
  35. package/src/links/index.ts +0 -2
  36. package/src/links/internals/createChain.test.ts +1 -1
  37. package/src/links/internals/createChain.ts +1 -1
  38. package/src/links/internals/httpUtils.ts +52 -31
  39. package/src/links/internals/transformOperationResult.ts +40 -12
  40. package/src/links/loggerLink.ts +1 -1
  41. package/src/links/retryLink.ts +1 -2
  42. package/src/links/splitLink.test.ts +1 -1
  43. package/src/links/splitLink.ts +4 -4
  44. package/src/links/types.ts +12 -7
  45. package/src/links/wsLink.ts +13 -10
  46. package/dist/links/transformerLink.d.ts +0 -4
  47. package/dist/links/transformerLink.d.ts.map +0 -1
  48. package/dist/observable/index.d.ts +0 -4
  49. package/dist/observable/index.d.ts.map +0 -1
  50. package/dist/observable/index.js +0 -38
  51. package/dist/observable/index.mjs +0 -31
  52. package/dist/observable/index.ts.js +0 -1
  53. package/dist/observable/internals/identity.d.ts +0 -2
  54. package/dist/observable/internals/identity.d.ts.map +0 -1
  55. package/dist/observable/internals/observableToPromise.d.ts +0 -10
  56. package/dist/observable/internals/observableToPromise.d.ts.map +0 -1
  57. package/dist/observable/internals/pipe.d.ts +0 -4
  58. package/dist/observable/internals/pipe.d.ts.map +0 -1
  59. package/dist/observable/observable.d.ts +0 -4
  60. package/dist/observable/observable.d.ts.map +0 -1
  61. package/dist/observable/operators/index.d.ts +0 -4
  62. package/dist/observable/operators/index.d.ts.map +0 -1
  63. package/dist/observable/operators/map.d.ts +0 -3
  64. package/dist/observable/operators/map.d.ts.map +0 -1
  65. package/dist/observable/operators/share.d.ts +0 -6
  66. package/dist/observable/operators/share.d.ts.map +0 -1
  67. package/dist/observable/operators/tap.d.ts +0 -3
  68. package/dist/observable/operators/tap.d.ts.map +0 -1
  69. package/dist/observable/types.d.ts +0 -29
  70. package/dist/observable/types.d.ts.map +0 -1
  71. package/dist/tap-0dcdee86.js +0 -243
  72. package/dist/tap-136a9a90.mjs +0 -239
  73. package/observable/dist/trpc-client-rx.cjs.d.ts +0 -1
  74. package/observable/dist/trpc-client-rx.cjs.dev.js +0 -9
  75. package/observable/dist/trpc-client-rx.cjs.js +0 -7
  76. package/observable/dist/trpc-client-rx.cjs.prod.js +0 -9
  77. package/observable/dist/trpc-client-rx.esm.js +0 -1
  78. package/observable/index.d.ts +0 -1
  79. package/observable/index.js +0 -1
  80. package/src/links/transformerLink.ts +0 -74
  81. package/src/observable/index.ts +0 -3
  82. package/src/observable/internals/identity.ts +0 -3
  83. package/src/observable/internals/observableToPromise.ts +0 -49
  84. package/src/observable/internals/pipe.ts +0 -22
  85. package/src/observable/observable.test.ts +0 -101
  86. package/src/observable/observable.ts +0 -70
  87. package/src/observable/operators/index.ts +0 -3
  88. package/src/observable/operators/map.test.ts +0 -92
  89. package/src/observable/operators/map.ts +0 -25
  90. package/src/observable/operators/share.test.ts +0 -60
  91. package/src/observable/operators/share.ts +0 -67
  92. package/src/observable/operators/tap.ts +0 -26
  93. 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,81 +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];
210
- 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;
211
219
  }
212
- }).catch(function (cause) {
213
- var _iterator = _createForOfIteratorHelper(batchCopy.items),
214
- _step;
215
-
216
- try {
217
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
218
- var item = _step.value;
219
- item.reject(cause);
220
- }
221
- } catch (err) {
222
- _iterator.e(err);
223
- } finally {
224
- _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;
225
228
  }
226
- });
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;
227
251
  }
228
252
 
229
- function load(key) {
230
- var batchItem = {
231
- cancelled: false,
232
- key: key
233
- };
253
+ function dispatch() {
254
+ var groupedItems = groupItems(pendingItems);
255
+ destroyTimerAndPendingItems(); // Create batches for each group of items
256
+
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";
266
+ }
267
+
268
+ var batch = {
269
+ items: items,
270
+ cancel: throwFatalError
271
+ };
234
272
 
235
- if (!batch) {
236
- batch = {
237
- items: [],
238
- cancel: function cancel() {
239
- destroyTimerAndBatch();
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();
240
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
+ });
241
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();
242
328
  }
329
+ }
243
330
 
244
- 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
+ };
245
339
  var promise = new Promise(function (resolve, reject) {
246
- var item = batchItem;
247
340
  item.reject = reject;
248
341
  item.resolve = resolve;
249
- thisBatch.items.push(item);
250
342
 
251
- if (typeof (opts === null || opts === void 0 ? void 0 : opts.maxBatchSize) !== 'undefined' && thisBatch.items.length >= opts.maxBatchSize) {
252
- dispatch();
253
- return;
343
+ if (!pendingItems) {
344
+ pendingItems = [];
254
345
  }
346
+
347
+ pendingItems.push(item);
255
348
  });
256
349
 
257
350
  if (!dispatchTimer) {
@@ -259,16 +352,17 @@ function dataLoader(fetchMany, opts) {
259
352
  }
260
353
 
261
354
  var cancel = function cancel() {
262
- batchItem.cancelled = true;
355
+ var _item$batch;
263
356
 
264
- if (thisBatch.items.some(function (item) {
265
- return !item.cancelled;
357
+ item.aborted = true;
358
+
359
+ if ((_item$batch = item.batch) !== null && _item$batch !== void 0 && _item$batch.items.every(function (item) {
360
+ return item.aborted;
266
361
  })) {
267
- // there are still things that can be resolved
268
- return;
362
+ // All items in the batch have been cancelled
363
+ item.batch.cancel();
364
+ item.batch = null;
269
365
  }
270
-
271
- thisBatch.cancel();
272
366
  };
273
367
 
274
368
  return {
@@ -303,48 +397,56 @@ var METHOD = {
303
397
  mutation: 'POST',
304
398
  subscription: 'PATCH'
305
399
  };
306
- function httpRequest(props) {
307
- var type = props.type,
308
- rt = props.runtime,
309
- path = props.path;
310
- var ac = rt.AbortController ? new rt.AbortController() : null;
311
- var input = 'input' in props ? props.input : arrayToDict(props.inputs);
312
-
313
- function getUrl() {
314
- var url = props.url + '/' + path;
315
- var queryParts = [];
316
-
317
- if ('inputs' in props) {
318
- queryParts.push('batch=1');
319
- }
320
400
 
321
- if (type === 'query' && input !== undefined) {
322
- queryParts.push("input=".concat(encodeURIComponent(JSON.stringify(input))));
323
- }
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
+ }
324
406
 
325
- if (queryParts.length) {
326
- url += '?' + queryParts.join('&');
327
- }
407
+ function getUrl(opts) {
408
+ var url = opts.url + '/' + opts.path;
409
+ var queryParts = [];
328
410
 
329
- return url;
411
+ if ('inputs' in opts) {
412
+ queryParts.push('batch=1');
330
413
  }
331
414
 
332
- function getBody() {
333
- if (type === 'query') {
334
- 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))));
335
420
  }
421
+ }
422
+
423
+ if (queryParts.length) {
424
+ url += '?' + queryParts.join('&');
425
+ }
336
426
 
337
- return input !== undefined ? JSON.stringify(input) : undefined;
427
+ return url;
428
+ }
429
+ function getBody(opts) {
430
+ if (opts.type === 'query') {
431
+ return undefined;
338
432
  }
339
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;
340
441
  var promise = new Promise(function (resolve, reject) {
341
- var url = getUrl();
442
+ var url = getUrl(opts);
443
+ var body = getBody(opts);
342
444
  var meta = {};
343
- Promise.resolve(rt.headers()).then(function (headers) {
344
- return rt.fetch(url, {
445
+ Promise.resolve(runtime.headers()).then(function (headers) {
446
+ return runtime.fetch(url, {
345
447
  method: METHOD[type],
346
448
  signal: ac === null || ac === void 0 ? void 0 : ac.signal,
347
- body: getBody(),
449
+ body: body,
348
450
  headers: _objectSpread$2({
349
451
  'content-type': 'application/json'
350
452
  }, headers)
@@ -371,31 +473,54 @@ function httpRequest(props) {
371
473
  }
372
474
 
373
475
  function httpBatchLink(opts) {
374
- var url = opts.url; // initialized config
375
-
476
+ // initialized config
376
477
  return function (runtime) {
377
- var fetcher = function fetcher(type) {
378
- return function (keyInputPairs) {
379
- 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) {
488
+ return op.path;
489
+ }).join(',');
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) {
380
505
  return op.path;
381
506
  }).join(',');
382
- var inputs = keyInputPairs.map(function (op) {
507
+ var inputs = batchOps.map(function (op) {
383
508
  return op.input;
384
509
  });
385
510
 
386
511
  var _httpRequest = httpRequest({
387
- url: url,
388
- inputs: inputs,
389
- path: path,
512
+ url: opts.url,
390
513
  runtime: runtime,
391
- type: type
514
+ type: type,
515
+ path: path,
516
+ inputs: inputs
392
517
  }),
393
518
  promise = _httpRequest.promise,
394
519
  cancel = _httpRequest.cancel;
395
520
 
396
521
  return {
397
522
  promise: promise.then(function (res) {
398
- var resJSON = Array.isArray(res.json) ? res.json : keyInputPairs.map(function () {
523
+ var resJSON = Array.isArray(res.json) ? res.json : batchOps.map(function () {
399
524
  return res.json;
400
525
  });
401
526
  var result = resJSON.map(function (item) {
@@ -409,11 +534,16 @@ function httpBatchLink(opts) {
409
534
  cancel: cancel
410
535
  };
411
536
  };
537
+
538
+ return {
539
+ validate: validate,
540
+ fetch: fetch
541
+ };
412
542
  };
413
543
 
414
- var query = dataLoader(fetcher('query'), opts);
415
- var mutation = dataLoader(fetcher('mutation'), opts);
416
- var subscription = dataLoader(fetcher('subscription'), opts);
544
+ var query = dataLoader(batchLoader('query'));
545
+ var mutation = dataLoader(batchLoader('mutation'));
546
+ var subscription = dataLoader(batchLoader('subscription'));
417
547
  var loaders = {
418
548
  query: query,
419
549
  subscription: subscription,
@@ -421,7 +551,7 @@ function httpBatchLink(opts) {
421
551
  };
422
552
  return function (_ref) {
423
553
  var op = _ref.op;
424
- return tap.observable(function (observer) {
554
+ return observable.observable(function (observer) {
425
555
  var loader = loaders[op.type];
426
556
 
427
557
  var _loader$load = loader.load(op),
@@ -450,17 +580,17 @@ function httpLink(opts) {
450
580
  return function (runtime) {
451
581
  return function (_ref) {
452
582
  var op = _ref.op;
453
- return tap.observable(function (observer) {
583
+ return observable.observable(function (observer) {
454
584
  var path = op.path,
455
585
  input = op.input,
456
586
  type = op.type;
457
587
 
458
588
  var _httpRequest = httpRequest({
589
+ url: url,
459
590
  runtime: runtime,
460
- path: path,
461
- input: input,
462
591
  type: type,
463
- url: url
592
+ path: path,
593
+ input: input
464
594
  }),
465
595
  promise = _httpRequest.promise,
466
596
  cancel = _httpRequest.cancel;
@@ -539,7 +669,7 @@ function loggerLink() {
539
669
  return function (_ref) {
540
670
  var op = _ref.op,
541
671
  next = _ref.next;
542
- return tap.observable(function (observer) {
672
+ return observable.observable(function (observer) {
543
673
  // ->
544
674
  enabled(_objectSpread$1(_objectSpread$1({}, op), {}, {
545
675
  direction: 'up'
@@ -560,7 +690,7 @@ function loggerLink() {
560
690
  }));
561
691
  }
562
692
 
563
- return next(op).pipe(tap.tap({
693
+ return next(op).pipe(observable.tap({
564
694
  next: function next(result) {
565
695
  logResult(result);
566
696
  },
@@ -581,7 +711,7 @@ function retryLink(opts) {
581
711
  var op = _ref.op,
582
712
  next = _ref.next;
583
713
  // initialized for request
584
- return tap.observable(function (observer) {
714
+ return observable.observable(function (observer) {
585
715
  var next$ = null;
586
716
  var attempts = 0;
587
717
  var isDone = false;
@@ -637,7 +767,7 @@ function retryLink(opts) {
637
767
 
638
768
  /** @internal */
639
769
  function createChain(opts) {
640
- return tap.observable(function (observer) {
770
+ return observable.observable(function (observer) {
641
771
  function execute() {
642
772
  var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
643
773
  var op = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : opts.op;
@@ -662,15 +792,15 @@ function asArray(value) {
662
792
  }
663
793
 
664
794
  function splitLink(opts) {
665
- return function (rt) {
795
+ return function (runtime) {
666
796
  var yes = asArray(opts.true).map(function (link) {
667
- return link(rt);
797
+ return link(runtime);
668
798
  });
669
799
  var no = asArray(opts.false).map(function (link) {
670
- return link(rt);
800
+ return link(runtime);
671
801
  });
672
802
  return function (props) {
673
- return tap.observable(function (observer) {
803
+ return observable.observable(function (observer) {
674
804
  var links = opts.condition(props.op) ? yes : no;
675
805
  return createChain({
676
806
  op: props.op,
@@ -681,81 +811,14 @@ function splitLink(opts) {
681
811
  };
682
812
  }
683
813
 
684
- 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; }
685
-
686
- 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; }
687
-
688
- /**
689
- * @internal
690
- */
691
- function transformOperationResult$1(result, transformer) {
692
- if ('error' in result.data) {
693
- return _objectSpread(_objectSpread({}, result), {}, {
694
- data: _objectSpread(_objectSpread({}, result.data), {}, {
695
- error: transformer.deserialize(result.data.error)
696
- })
697
- });
698
- }
699
-
700
- if (result.data.result.type !== 'data') {
701
- return result;
702
- }
703
-
704
- return _objectSpread(_objectSpread({}, result), {}, {
705
- data: _objectSpread(_objectSpread({}, result.data), {}, {
706
- result: _objectSpread(_objectSpread({}, result.data.result), {}, {
707
- data: transformer.deserialize(result.data.result.data)
708
- })
709
- })
710
- });
711
- }
712
-
713
- function transformerLink(transformer) {
714
- var _transformer = transformer ? 'input' in transformer ? {
715
- serialize: transformer.input.serialize,
716
- deserialize: transformer.output.deserialize
717
- } : transformer : {
718
- serialize: function serialize(data) {
719
- return data;
720
- },
721
- deserialize: function deserialize(data) {
722
- return data;
723
- }
724
- };
725
-
726
- return function () {
727
- return function (props) {
728
- var input = _transformer.serialize(props.op.input);
729
-
730
- return tap.observable(function (observer) {
731
- var subscription = props.next(_objectSpread(_objectSpread({}, props.op), {}, {
732
- input: input
733
- })).subscribe({
734
- next: function next(value) {
735
- var transformed = transformOperationResult$1(value, _transformer);
736
- observer.next(transformed);
737
- },
738
- error: function error(err) {
739
- observer.error(err);
740
- },
741
- complete: function complete() {
742
- observer.complete();
743
- }
744
- });
745
- return subscription;
746
- });
747
- };
748
- };
749
- }
750
-
751
814
  /* istanbul ignore next */
752
815
  var retryDelay = function retryDelay(attemptIndex) {
753
816
  return attemptIndex === 0 ? 0 : Math.min(1000 * Math.pow(2, attemptIndex), 30000);
754
817
  };
755
818
 
756
- 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); }; }
757
820
 
758
- 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; } }
759
822
  function createWSClient(opts) {
760
823
  var url = opts.url,
761
824
  _opts$WebSocket = opts.WebSocket,
@@ -967,7 +1030,6 @@ function createWSClient(opts) {
967
1030
  id = op.id;
968
1031
  var envelope = {
969
1032
  id: id,
970
- jsonrpc: '2.0',
971
1033
  method: type,
972
1034
  params: {
973
1035
  input: input,
@@ -996,8 +1058,7 @@ function createWSClient(opts) {
996
1058
  if (op.type === 'subscription') {
997
1059
  outgoing.push({
998
1060
  id: id,
999
- method: 'subscription.stop',
1000
- params: undefined
1061
+ method: 'subscription.stop'
1001
1062
  });
1002
1063
  dispatch();
1003
1064
  }
@@ -1008,6 +1069,8 @@ function createWSClient(opts) {
1008
1069
  close: function close() {
1009
1070
  state = 'closed';
1010
1071
  closeIfNoPending(activeConnection);
1072
+ clearTimeout(connectTimer);
1073
+ connectTimer = null;
1011
1074
  },
1012
1075
  request: request,
1013
1076
  getConnection: function getConnection() {
@@ -1019,7 +1082,7 @@ function createWSClient(opts) {
1019
1082
  var TRPCWebSocketClosedError = /*#__PURE__*/function (_Error) {
1020
1083
  _inherits__default["default"](TRPCWebSocketClosedError, _Error);
1021
1084
 
1022
- var _super = /*#__PURE__*/_createSuper$1(TRPCWebSocketClosedError);
1085
+ var _super = /*#__PURE__*/_createSuper(TRPCWebSocketClosedError);
1023
1086
 
1024
1087
  function TRPCWebSocketClosedError(message) {
1025
1088
  var _this;
@@ -1038,7 +1101,7 @@ var TRPCWebSocketClosedError = /*#__PURE__*/function (_Error) {
1038
1101
  var TRPCSubscriptionEndedError = /*#__PURE__*/function (_Error2) {
1039
1102
  _inherits__default["default"](TRPCSubscriptionEndedError, _Error2);
1040
1103
 
1041
- var _super2 = /*#__PURE__*/_createSuper$1(TRPCSubscriptionEndedError);
1104
+ var _super2 = /*#__PURE__*/_createSuper(TRPCSubscriptionEndedError);
1042
1105
 
1043
1106
  function TRPCSubscriptionEndedError(message) {
1044
1107
  var _this2;
@@ -1055,16 +1118,16 @@ var TRPCSubscriptionEndedError = /*#__PURE__*/function (_Error2) {
1055
1118
  }( /*#__PURE__*/_wrapNativeSuper__default["default"](Error));
1056
1119
 
1057
1120
  function wsLink(opts) {
1058
- return function () {
1121
+ return function (runtime) {
1059
1122
  var client = opts.client;
1060
1123
  return function (_ref2) {
1061
1124
  var op = _ref2.op;
1062
- return tap.observable(function (observer) {
1125
+ return observable.observable(function (observer) {
1063
1126
  var type = op.type,
1064
- input = op.input,
1065
1127
  path = op.path,
1066
1128
  id = op.id,
1067
1129
  context = op.context;
1130
+ var input = runtime.transformer.serialize(op.input);
1068
1131
  var isDone = false;
1069
1132
  var unsub = client.request({
1070
1133
  type: type,
@@ -1106,12 +1169,18 @@ function wsLink(opts) {
1106
1169
  };
1107
1170
  }
1108
1171
 
1172
+ 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; }
1173
+
1174
+ 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; }
1175
+
1109
1176
  /** @internal */
1110
- function transformOperationResult(result) {
1177
+ function transformOperationResult(result, runtime) {
1111
1178
  var context = result.context;
1112
1179
 
1113
1180
  if ('error' in result.data) {
1114
- var error = TRPCClientError.from(result.data);
1181
+ var error = TRPCClientError.from(_objectSpread(_objectSpread({}, result.data), {}, {
1182
+ error: runtime.transformer.deserialize(result.data.error)
1183
+ }));
1115
1184
  return {
1116
1185
  ok: false,
1117
1186
  error: error,
@@ -1119,75 +1188,39 @@ function transformOperationResult(result) {
1119
1188
  };
1120
1189
  }
1121
1190
 
1122
- var data = result.data.result.data;
1191
+ var data = runtime.transformer.deserialize(result.data.result.data);
1123
1192
  return {
1124
1193
  ok: true,
1125
1194
  data: data,
1126
1195
  context: context
1127
1196
  };
1128
1197
  }
1129
-
1130
- 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); }; }
1131
-
1132
- 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; } }
1133
-
1134
- var ObservableAbortError = /*#__PURE__*/function (_Error) {
1135
- _inherits__default["default"](ObservableAbortError, _Error);
1136
-
1137
- var _super = /*#__PURE__*/_createSuper(ObservableAbortError);
1138
-
1139
- function ObservableAbortError(message) {
1140
- var _this;
1141
-
1142
- _classCallCheck__default["default"](this, ObservableAbortError);
1143
-
1144
- _this = _super.call(this, message);
1145
- _this.name = 'ObservableAbortError';
1146
- Object.setPrototypeOf(_assertThisInitialized__default["default"](_this), ObservableAbortError.prototype);
1147
- return _this;
1148
- }
1149
-
1150
- return _createClass__default["default"](ObservableAbortError);
1151
- }( /*#__PURE__*/_wrapNativeSuper__default["default"](Error));
1152
1198
  /** @internal */
1153
1199
 
1154
- function observableToPromise(observable) {
1155
- var abort;
1156
- var promise = new Promise(function (resolve, reject) {
1157
- var isDone = false;
1158
-
1159
- function onDone() {
1160
- if (isDone) {
1161
- return;
1162
- }
1163
-
1164
- isDone = true;
1165
- reject(new ObservableAbortError('This operation was cancelled.'));
1166
- obs$.unsubscribe();
1167
- }
1200
+ function transformSubscriptionOperationResult(result, runtime) {
1201
+ var context = result.context;
1168
1202
 
1169
- var obs$ = observable.subscribe({
1170
- next: function next(data) {
1171
- isDone = true;
1172
- resolve(data);
1173
- onDone();
1174
- },
1175
- error: function error(data) {
1176
- isDone = true;
1177
- reject(data);
1178
- onDone();
1179
- },
1180
- complete: function complete() {
1181
- isDone = true;
1182
- onDone();
1183
- }
1203
+ if ('error' in result.data) {
1204
+ var error = TRPCClientError.from(_objectSpread(_objectSpread({}, result.data), {}, {
1205
+ error: runtime.transformer.deserialize(result.data.error)
1206
+ }), {
1207
+ meta: context
1184
1208
  });
1185
- abort = onDone;
1209
+ return {
1210
+ ok: false,
1211
+ error: error,
1212
+ context: context
1213
+ };
1214
+ }
1215
+
1216
+ var data = _objectSpread(_objectSpread({}, result.data.result), result.data.result.type === 'data' && {
1217
+ data: runtime.transformer.deserialize(result.data.result.data)
1186
1218
  });
1219
+
1187
1220
  return {
1188
- promise: promise,
1189
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1190
- abort: abort
1221
+ ok: true,
1222
+ data: data,
1223
+ context: context
1191
1224
  };
1192
1225
  }
1193
1226
 
@@ -1223,10 +1256,22 @@ var TRPCClient = /*#__PURE__*/function () {
1223
1256
  };
1224
1257
  }
1225
1258
 
1259
+ var transformer = opts.transformer ? 'input' in opts.transformer ? {
1260
+ serialize: opts.transformer.input.serialize,
1261
+ deserialize: opts.transformer.output.deserialize
1262
+ } : opts.transformer : {
1263
+ serialize: function serialize(data) {
1264
+ return data;
1265
+ },
1266
+ deserialize: function deserialize(data) {
1267
+ return data;
1268
+ }
1269
+ };
1226
1270
  this.runtime = {
1227
1271
  AbortController: AC,
1228
1272
  fetch: _fetch,
1229
- headers: getHeadersFn()
1273
+ headers: getHeadersFn(),
1274
+ transformer: transformer
1230
1275
  };
1231
1276
 
1232
1277
  if ('links' in opts) {
@@ -1258,20 +1303,22 @@ var TRPCClient = /*#__PURE__*/function () {
1258
1303
  context: context
1259
1304
  }
1260
1305
  });
1261
- return chain$.pipe(tap.share());
1306
+ return chain$.pipe(observable.share());
1262
1307
  }
1263
1308
  }, {
1264
1309
  key: "requestAsPromise",
1265
1310
  value: function requestAsPromise(opts) {
1311
+ var _this2 = this;
1312
+
1266
1313
  var req$ = this.$request(opts);
1267
1314
 
1268
- var _observableToPromise = observableToPromise(req$),
1315
+ var _observableToPromise = observable.observableToPromise(req$),
1269
1316
  promise = _observableToPromise.promise,
1270
1317
  abort = _observableToPromise.abort;
1271
1318
 
1272
1319
  var cancellablePromise = new Promise(function (resolve, reject) {
1273
1320
  promise.then(function (result) {
1274
- var transformed = transformOperationResult(result);
1321
+ var transformed = transformOperationResult(result, _this2.runtime);
1275
1322
 
1276
1323
  if (transformed.ok) {
1277
1324
  resolve(transformed.data);
@@ -1289,26 +1336,34 @@ var TRPCClient = /*#__PURE__*/function () {
1289
1336
  }, {
1290
1337
  key: "query",
1291
1338
  value: function query(path) {
1292
- var _ref2;
1339
+ var _args$;
1340
+
1341
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
1342
+ args[_key - 1] = arguments[_key];
1343
+ }
1293
1344
 
1294
- var context = (_ref2 = arguments.length <= 2 ? undefined : arguments[2]) === null || _ref2 === void 0 ? void 0 : _ref2.context;
1345
+ var context = (_args$ = args[1]) === null || _args$ === void 0 ? void 0 : _args$.context;
1295
1346
  return this.requestAsPromise({
1296
1347
  type: 'query',
1297
1348
  path: path,
1298
- input: arguments.length <= 1 ? undefined : arguments[1],
1349
+ input: args[0],
1299
1350
  context: context
1300
1351
  });
1301
1352
  }
1302
1353
  }, {
1303
1354
  key: "mutation",
1304
1355
  value: function mutation(path) {
1305
- var _ref3;
1356
+ var _args$2;
1357
+
1358
+ for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
1359
+ args[_key2 - 1] = arguments[_key2];
1360
+ }
1306
1361
 
1307
- var context = (_ref3 = arguments.length <= 2 ? undefined : arguments[2]) === null || _ref3 === void 0 ? void 0 : _ref3.context;
1362
+ var context = (_args$2 = args[1]) === null || _args$2 === void 0 ? void 0 : _args$2.context;
1308
1363
  return this.requestAsPromise({
1309
1364
  type: 'mutation',
1310
1365
  path: path,
1311
- input: arguments.length <= 1 ? undefined : arguments[1],
1366
+ input: args[0],
1312
1367
  context: context
1313
1368
  });
1314
1369
  }
@@ -1321,21 +1376,21 @@ var TRPCClient = /*#__PURE__*/function () {
1321
1376
  input: input,
1322
1377
  context: opts.context
1323
1378
  });
1379
+ var runtime = this.runtime;
1324
1380
  return observable$.subscribe({
1325
1381
  next: function next(result) {
1326
- var _opts$next;
1382
+ var _opts$error;
1327
1383
 
1328
- if ('error' in result.data) {
1329
- var _opts$error;
1384
+ var transformed = transformSubscriptionOperationResult(result, runtime);
1330
1385
 
1331
- var err = TRPCClientError.from(result.data, {
1332
- meta: result.context
1333
- });
1334
- (_opts$error = opts.error) === null || _opts$error === void 0 ? void 0 : _opts$error.call(opts, err);
1386
+ if (transformed.ok) {
1387
+ var _opts$next;
1388
+
1389
+ (_opts$next = opts.next) === null || _opts$next === void 0 ? void 0 : _opts$next.call(opts, transformed.data);
1335
1390
  return;
1336
1391
  }
1337
1392
 
1338
- (_opts$next = opts.next) === null || _opts$next === void 0 ? void 0 : _opts$next.call(opts, result.data.result);
1393
+ (_opts$error = opts.error) === null || _opts$error === void 0 ? void 0 : _opts$error.call(opts, transformed.error);
1339
1394
  },
1340
1395
  error: function error(err) {
1341
1396
  var _opts$error2;
@@ -1369,5 +1424,4 @@ exports.httpLink = httpLink;
1369
1424
  exports.loggerLink = loggerLink;
1370
1425
  exports.retryLink = retryLink;
1371
1426
  exports.splitLink = splitLink;
1372
- exports.transformerLink = transformerLink;
1373
1427
  exports.wsLink = wsLink;