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

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 (90) hide show
  1. package/dist/index.js +329 -276
  2. package/dist/index.mjs +317 -263
  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/wsLink/dist/trpc-client-links-wsLink.cjs.dev.js +2 -0
  23. package/links/wsLink/dist/trpc-client-links-wsLink.cjs.prod.js +2 -0
  24. package/links/wsLink/dist/trpc-client-links-wsLink.esm.js +2 -0
  25. package/package.json +5 -11
  26. package/src/internals/TRPCClient.ts +48 -24
  27. package/src/internals/dataLoader.ts +116 -54
  28. package/src/links/dedupeLink.test.ts +1 -1
  29. package/src/links/dedupeLink.ts +1 -2
  30. package/src/links/httpBatchLink.ts +54 -31
  31. package/src/links/httpLink.ts +3 -3
  32. package/src/links/index.ts +0 -2
  33. package/src/links/internals/createChain.test.ts +1 -1
  34. package/src/links/internals/createChain.ts +1 -1
  35. package/src/links/internals/httpUtils.ts +52 -31
  36. package/src/links/internals/transformOperationResult.ts +40 -12
  37. package/src/links/loggerLink.ts +1 -1
  38. package/src/links/retryLink.ts +1 -2
  39. package/src/links/splitLink.test.ts +1 -1
  40. package/src/links/splitLink.ts +4 -4
  41. package/src/links/types.ts +12 -7
  42. package/src/links/wsLink.ts +13 -10
  43. package/dist/links/transformerLink.d.ts +0 -4
  44. package/dist/links/transformerLink.d.ts.map +0 -1
  45. package/dist/observable/index.d.ts +0 -4
  46. package/dist/observable/index.d.ts.map +0 -1
  47. package/dist/observable/index.js +0 -38
  48. package/dist/observable/index.mjs +0 -31
  49. package/dist/observable/index.ts.js +0 -1
  50. package/dist/observable/internals/identity.d.ts +0 -2
  51. package/dist/observable/internals/identity.d.ts.map +0 -1
  52. package/dist/observable/internals/observableToPromise.d.ts +0 -10
  53. package/dist/observable/internals/observableToPromise.d.ts.map +0 -1
  54. package/dist/observable/internals/pipe.d.ts +0 -4
  55. package/dist/observable/internals/pipe.d.ts.map +0 -1
  56. package/dist/observable/observable.d.ts +0 -4
  57. package/dist/observable/observable.d.ts.map +0 -1
  58. package/dist/observable/operators/index.d.ts +0 -4
  59. package/dist/observable/operators/index.d.ts.map +0 -1
  60. package/dist/observable/operators/map.d.ts +0 -3
  61. package/dist/observable/operators/map.d.ts.map +0 -1
  62. package/dist/observable/operators/share.d.ts +0 -6
  63. package/dist/observable/operators/share.d.ts.map +0 -1
  64. package/dist/observable/operators/tap.d.ts +0 -3
  65. package/dist/observable/operators/tap.d.ts.map +0 -1
  66. package/dist/observable/types.d.ts +0 -29
  67. package/dist/observable/types.d.ts.map +0 -1
  68. package/dist/tap-0dcdee86.js +0 -243
  69. package/dist/tap-136a9a90.mjs +0 -239
  70. package/observable/dist/trpc-client-rx.cjs.d.ts +0 -1
  71. package/observable/dist/trpc-client-rx.cjs.dev.js +0 -9
  72. package/observable/dist/trpc-client-rx.cjs.js +0 -7
  73. package/observable/dist/trpc-client-rx.cjs.prod.js +0 -9
  74. package/observable/dist/trpc-client-rx.esm.js +0 -1
  75. package/observable/index.d.ts +0 -1
  76. package/observable/index.js +0 -1
  77. package/src/links/transformerLink.ts +0 -74
  78. package/src/observable/index.ts +0 -3
  79. package/src/observable/internals/identity.ts +0 -3
  80. package/src/observable/internals/observableToPromise.ts +0 -49
  81. package/src/observable/internals/pipe.ts +0 -22
  82. package/src/observable/observable.test.ts +0 -101
  83. package/src/observable/observable.ts +0 -70
  84. package/src/observable/operators/index.ts +0 -3
  85. package/src/observable/operators/map.test.ts +0 -92
  86. package/src/observable/operators/map.ts +0 -25
  87. package/src/observable/operators/share.test.ts +0 -60
  88. package/src/observable/operators/share.ts +0 -67
  89. package/src/observable/operators/tap.ts +0 -26
  90. 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
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
+ };
235
272
 
236
- if (!batch) {
237
- batch = {
238
- items: [],
239
- cancel: function cancel() {
240
- 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();
241
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;
264
356
 
265
- if (thisBatch.items.some(function (item) {
266
- 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;
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
+ }
422
+
423
+ if (queryParts.length) {
424
+ url += '?' + queryParts.join('&');
425
+ }
337
426
 
338
- return input !== undefined ? JSON.stringify(input) : undefined;
427
+ return url;
428
+ }
429
+ function getBody(opts) {
430
+ if (opts.type === 'query') {
431
+ return undefined;
339
432
  }
340
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) {
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) {
381
505
  return op.path;
382
506
  }).join(',');
383
- var inputs = keyInputPairs.map(function (op) {
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
  }
@@ -1009,6 +1069,8 @@ function createWSClient(opts) {
1009
1069
  close: function close() {
1010
1070
  state = 'closed';
1011
1071
  closeIfNoPending(activeConnection);
1072
+ clearTimeout(connectTimer);
1073
+ connectTimer = null;
1012
1074
  },
1013
1075
  request: request,
1014
1076
  getConnection: function getConnection() {
@@ -1020,7 +1082,7 @@ function createWSClient(opts) {
1020
1082
  var TRPCWebSocketClosedError = /*#__PURE__*/function (_Error) {
1021
1083
  _inherits__default["default"](TRPCWebSocketClosedError, _Error);
1022
1084
 
1023
- var _super = /*#__PURE__*/_createSuper$1(TRPCWebSocketClosedError);
1085
+ var _super = /*#__PURE__*/_createSuper(TRPCWebSocketClosedError);
1024
1086
 
1025
1087
  function TRPCWebSocketClosedError(message) {
1026
1088
  var _this;
@@ -1039,7 +1101,7 @@ var TRPCWebSocketClosedError = /*#__PURE__*/function (_Error) {
1039
1101
  var TRPCSubscriptionEndedError = /*#__PURE__*/function (_Error2) {
1040
1102
  _inherits__default["default"](TRPCSubscriptionEndedError, _Error2);
1041
1103
 
1042
- var _super2 = /*#__PURE__*/_createSuper$1(TRPCSubscriptionEndedError);
1104
+ var _super2 = /*#__PURE__*/_createSuper(TRPCSubscriptionEndedError);
1043
1105
 
1044
1106
  function TRPCSubscriptionEndedError(message) {
1045
1107
  var _this2;
@@ -1056,16 +1118,16 @@ var TRPCSubscriptionEndedError = /*#__PURE__*/function (_Error2) {
1056
1118
  }( /*#__PURE__*/_wrapNativeSuper__default["default"](Error));
1057
1119
 
1058
1120
  function wsLink(opts) {
1059
- return function () {
1121
+ return function (runtime) {
1060
1122
  var client = opts.client;
1061
1123
  return function (_ref2) {
1062
1124
  var op = _ref2.op;
1063
- return tap.observable(function (observer) {
1125
+ return observable.observable(function (observer) {
1064
1126
  var type = op.type,
1065
- input = op.input,
1066
1127
  path = op.path,
1067
1128
  id = op.id,
1068
1129
  context = op.context;
1130
+ var input = runtime.transformer.serialize(op.input);
1069
1131
  var isDone = false;
1070
1132
  var unsub = client.request({
1071
1133
  type: type,
@@ -1107,12 +1169,18 @@ function wsLink(opts) {
1107
1169
  };
1108
1170
  }
1109
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
+
1110
1176
  /** @internal */
1111
- function transformOperationResult(result) {
1177
+ function transformOperationResult(result, runtime) {
1112
1178
  var context = result.context;
1113
1179
 
1114
1180
  if ('error' in result.data) {
1115
- var error = TRPCClientError.from(result.data);
1181
+ var error = TRPCClientError.from(_objectSpread(_objectSpread({}, result.data), {}, {
1182
+ error: runtime.transformer.deserialize(result.data.error)
1183
+ }));
1116
1184
  return {
1117
1185
  ok: false,
1118
1186
  error: error,
@@ -1120,75 +1188,39 @@ function transformOperationResult(result) {
1120
1188
  };
1121
1189
  }
1122
1190
 
1123
- var data = result.data.result.data;
1191
+ var data = runtime.transformer.deserialize(result.data.result.data);
1124
1192
  return {
1125
1193
  ok: true,
1126
1194
  data: data,
1127
1195
  context: context
1128
1196
  };
1129
1197
  }
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
1198
  /** @internal */
1154
1199
 
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
- }
1200
+ function transformSubscriptionOperationResult(result, runtime) {
1201
+ var context = result.context;
1169
1202
 
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
- }
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
1185
1208
  });
1186
- 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)
1187
1218
  });
1219
+
1188
1220
  return {
1189
- promise: promise,
1190
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1191
- abort: abort
1221
+ ok: true,
1222
+ data: data,
1223
+ context: context
1192
1224
  };
1193
1225
  }
1194
1226
 
@@ -1224,10 +1256,22 @@ var TRPCClient = /*#__PURE__*/function () {
1224
1256
  };
1225
1257
  }
1226
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
+ };
1227
1270
  this.runtime = {
1228
1271
  AbortController: AC,
1229
1272
  fetch: _fetch,
1230
- headers: getHeadersFn()
1273
+ headers: getHeadersFn(),
1274
+ transformer: transformer
1231
1275
  };
1232
1276
 
1233
1277
  if ('links' in opts) {
@@ -1259,20 +1303,22 @@ var TRPCClient = /*#__PURE__*/function () {
1259
1303
  context: context
1260
1304
  }
1261
1305
  });
1262
- return chain$.pipe(tap.share());
1306
+ return chain$.pipe(observable.share());
1263
1307
  }
1264
1308
  }, {
1265
1309
  key: "requestAsPromise",
1266
1310
  value: function requestAsPromise(opts) {
1311
+ var _this2 = this;
1312
+
1267
1313
  var req$ = this.$request(opts);
1268
1314
 
1269
- var _observableToPromise = observableToPromise(req$),
1315
+ var _observableToPromise = observable.observableToPromise(req$),
1270
1316
  promise = _observableToPromise.promise,
1271
1317
  abort = _observableToPromise.abort;
1272
1318
 
1273
1319
  var cancellablePromise = new Promise(function (resolve, reject) {
1274
1320
  promise.then(function (result) {
1275
- var transformed = transformOperationResult(result);
1321
+ var transformed = transformOperationResult(result, _this2.runtime);
1276
1322
 
1277
1323
  if (transformed.ok) {
1278
1324
  resolve(transformed.data);
@@ -1290,26 +1336,34 @@ var TRPCClient = /*#__PURE__*/function () {
1290
1336
  }, {
1291
1337
  key: "query",
1292
1338
  value: function query(path) {
1293
- 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
+ }
1294
1344
 
1295
- 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;
1296
1346
  return this.requestAsPromise({
1297
1347
  type: 'query',
1298
1348
  path: path,
1299
- input: arguments.length <= 1 ? undefined : arguments[1],
1349
+ input: args[0],
1300
1350
  context: context
1301
1351
  });
1302
1352
  }
1303
1353
  }, {
1304
1354
  key: "mutation",
1305
1355
  value: function mutation(path) {
1306
- 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
+ }
1307
1361
 
1308
- 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;
1309
1363
  return this.requestAsPromise({
1310
1364
  type: 'mutation',
1311
1365
  path: path,
1312
- input: arguments.length <= 1 ? undefined : arguments[1],
1366
+ input: args[0],
1313
1367
  context: context
1314
1368
  });
1315
1369
  }
@@ -1322,21 +1376,21 @@ var TRPCClient = /*#__PURE__*/function () {
1322
1376
  input: input,
1323
1377
  context: opts.context
1324
1378
  });
1379
+ var runtime = this.runtime;
1325
1380
  return observable$.subscribe({
1326
1381
  next: function next(result) {
1327
- var _opts$next;
1382
+ var _opts$error;
1328
1383
 
1329
- if ('error' in result.data) {
1330
- var _opts$error;
1384
+ var transformed = transformSubscriptionOperationResult(result, runtime);
1331
1385
 
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);
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);
1336
1390
  return;
1337
1391
  }
1338
1392
 
1339
- (_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);
1340
1394
  },
1341
1395
  error: function error(err) {
1342
1396
  var _opts$error2;
@@ -1370,5 +1424,4 @@ exports.httpLink = httpLink;
1370
1424
  exports.loggerLink = loggerLink;
1371
1425
  exports.retryLink = retryLink;
1372
1426
  exports.splitLink = splitLink;
1373
- exports.transformerLink = transformerLink;
1374
1427
  exports.wsLink = wsLink;