@trpc/client 11.4.1 → 11.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/TRPCClientError-CjKyS10w.mjs +47 -0
- package/dist/{TRPCClientError-COkhCKf3.mjs.map → TRPCClientError-CjKyS10w.mjs.map} +1 -1
- package/dist/{TRPCClientError-CGgRtttT.cjs → TRPCClientError-Dey88Uiy.cjs} +15 -24
- package/dist/{httpBatchLink-DIfnmmcu.mjs → httpBatchLink-CA96-gnJ.mjs} +33 -24
- package/dist/{httpBatchLink-DIfnmmcu.mjs.map → httpBatchLink-CA96-gnJ.mjs.map} +1 -1
- package/dist/{httpBatchLink-CIC9PZ_Z.cjs → httpBatchLink-JKXaA6dG.cjs} +32 -23
- package/dist/{httpBatchLink.d-BN2Iw_cK.d.mts → httpBatchLink.d-CAaMQOtX.d.mts} +3 -3
- package/dist/{httpBatchLink.d-BN2Iw_cK.d.mts.map → httpBatchLink.d-CAaMQOtX.d.mts.map} +1 -1
- package/dist/{httpLink-9bpwQ15c.mjs → httpLink-CYOcG9kQ.mjs} +11 -12
- package/dist/{httpLink-9bpwQ15c.mjs.map → httpLink-CYOcG9kQ.mjs.map} +1 -1
- package/dist/{httpLink-BbVj_TgM.cjs → httpLink-CbZZVG--.cjs} +10 -11
- package/dist/{httpLink.d-CTSOARfE.d.mts → httpLink.d-B0nHKy2W.d.mts} +3 -3
- package/dist/{httpLink.d-CTSOARfE.d.mts.map → httpLink.d-B0nHKy2W.d.mts.map} +1 -1
- package/dist/{httpUtils-3pbQzhUL.mjs → httpUtils-Bkv1johT.mjs} +12 -13
- package/dist/{httpUtils-3pbQzhUL.mjs.map → httpUtils-Bkv1johT.mjs.map} +1 -1
- package/dist/{httpUtils-Buf6jCgh.cjs → httpUtils-rn2lxsJO.cjs} +12 -12
- package/dist/{httpUtils.d-C8wPxU79.d.mts → httpUtils.d-cQRQZrfo.d.mts} +3 -3
- package/dist/{httpUtils.d-C8wPxU79.d.mts.map → httpUtils.d-cQRQZrfo.d.mts.map} +1 -1
- package/dist/index.cjs +268 -104
- package/dist/index.d.mts +9 -9
- package/dist/index.mjs +269 -131
- package/dist/index.mjs.map +1 -1
- package/dist/links/httpBatchLink.cjs +5 -4
- package/dist/links/httpBatchLink.d.mts +5 -5
- package/dist/links/httpBatchLink.mjs +5 -4
- package/dist/links/httpLink.cjs +5 -4
- package/dist/links/httpLink.d.mts +5 -5
- package/dist/links/httpLink.mjs +5 -4
- package/dist/links/loggerLink.cjs +2 -1
- package/dist/links/loggerLink.d.mts +3 -3
- package/dist/links/loggerLink.mjs +2 -1
- package/dist/links/splitLink.d.mts +3 -3
- package/dist/links/splitLink.mjs +1 -1
- package/dist/links/wsLink/wsLink.cjs +4 -3
- package/dist/links/wsLink/wsLink.d.mts +4 -4
- package/dist/links/wsLink/wsLink.mjs +4 -3
- package/dist/{loggerLink-CsDfg5Bb.cjs → loggerLink-CuYvRzyH.cjs} +14 -21
- package/dist/{loggerLink-PGBSQFcR.mjs → loggerLink-ineCN1PO.mjs} +15 -22
- package/dist/{loggerLink-PGBSQFcR.mjs.map → loggerLink-ineCN1PO.mjs.map} +1 -1
- package/dist/{loggerLink.d-CZjK1CXm.d.mts → loggerLink.d-g_uYSbus.d.mts} +2 -2
- package/dist/{loggerLink.d-CZjK1CXm.d.mts.map → loggerLink.d-g_uYSbus.d.mts.map} +1 -1
- package/dist/objectSpread2-Bsvh_OqM.cjs +100 -0
- package/dist/objectSpread2-BvkFp-_Y.mjs +114 -0
- package/dist/objectSpread2-BvkFp-_Y.mjs.map +1 -0
- package/dist/{splitLink-BVblHq4n.mjs → splitLink-B7Cuf2c_.mjs} +1 -1
- package/dist/{splitLink-BVblHq4n.mjs.map → splitLink-B7Cuf2c_.mjs.map} +1 -1
- package/dist/{splitLink.d-BAqgq0NG.d.mts → splitLink.d-od8YIcex.d.mts} +2 -2
- package/dist/{splitLink.d-BAqgq0NG.d.mts.map → splitLink.d-od8YIcex.d.mts.map} +1 -1
- package/dist/{subscriptions.d-U92STdZl.d.mts → subscriptions.d-Dlr1nWGD.d.mts} +1 -1
- package/dist/{subscriptions.d-U92STdZl.d.mts.map → subscriptions.d-Dlr1nWGD.d.mts.map} +1 -1
- package/dist/{types.d-DXbqQLCC.d.mts → types.d-POgEdUB1.d.mts} +2 -2
- package/dist/{types.d-DXbqQLCC.d.mts.map → types.d-POgEdUB1.d.mts.map} +1 -1
- package/dist/{unstable-internals-DU4WecoG.mjs → unstable-internals-Bg7n9BBj.mjs} +1 -1
- package/dist/{unstable-internals-DU4WecoG.mjs.map → unstable-internals-Bg7n9BBj.mjs.map} +1 -1
- package/dist/unstable-internals.cjs +1 -1
- package/dist/{unstable-internals.d-DyLd-B0J.d.mts → unstable-internals.d-BOmV7EK1.d.mts} +1 -1
- package/dist/{unstable-internals.d-DyLd-B0J.d.mts.map → unstable-internals.d-BOmV7EK1.d.mts.map} +1 -1
- package/dist/unstable-internals.d.mts +2 -2
- package/dist/unstable-internals.mjs +1 -1
- package/dist/{wsLink-DhJ50EC5.cjs → wsLink-BcTLPVgc.cjs} +93 -106
- package/dist/{wsLink-DbSHOzlB.mjs → wsLink-H5IjZfJW.mjs} +94 -107
- package/dist/wsLink-H5IjZfJW.mjs.map +1 -0
- package/dist/{wsLink.d-BqO7ltN_.d.mts → wsLink.d-BZxAJRBO.d.mts} +4 -4
- package/dist/{wsLink.d-BqO7ltN_.d.mts.map → wsLink.d-BZxAJRBO.d.mts.map} +1 -1
- package/package.json +4 -4
- package/dist/TRPCClientError-COkhCKf3.mjs +0 -56
- package/dist/wsLink-DbSHOzlB.mjs.map +0 -1
- /package/dist/{unstable-internals-CYBH4jbF.cjs → unstable-internals-M84gUQCV.cjs} +0 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { __toESM, require_defineProperty, require_objectSpread2 } from "./objectSpread2-BvkFp-_Y.mjs";
|
|
2
|
+
import { isObject } from "@trpc/server/unstable-core-do-not-import";
|
|
3
|
+
|
|
4
|
+
//#region src/TRPCClientError.ts
|
|
5
|
+
var import_defineProperty = __toESM(require_defineProperty(), 1);
|
|
6
|
+
var import_objectSpread2 = __toESM(require_objectSpread2(), 1);
|
|
7
|
+
function isTRPCClientError(cause) {
|
|
8
|
+
return cause instanceof TRPCClientError;
|
|
9
|
+
}
|
|
10
|
+
function isTRPCErrorResponse(obj) {
|
|
11
|
+
return isObject(obj) && isObject(obj["error"]) && typeof obj["error"]["code"] === "number" && typeof obj["error"]["message"] === "string";
|
|
12
|
+
}
|
|
13
|
+
function getMessageFromUnknownError(err, fallback) {
|
|
14
|
+
if (typeof err === "string") return err;
|
|
15
|
+
if (isObject(err) && typeof err["message"] === "string") return err["message"];
|
|
16
|
+
return fallback;
|
|
17
|
+
}
|
|
18
|
+
var TRPCClientError = class TRPCClientError extends Error {
|
|
19
|
+
constructor(message, opts) {
|
|
20
|
+
var _opts$result, _opts$result2;
|
|
21
|
+
const cause = opts === null || opts === void 0 ? void 0 : opts.cause;
|
|
22
|
+
super(message, { cause });
|
|
23
|
+
(0, import_defineProperty.default)(this, "cause", void 0);
|
|
24
|
+
(0, import_defineProperty.default)(this, "shape", void 0);
|
|
25
|
+
(0, import_defineProperty.default)(this, "data", void 0);
|
|
26
|
+
(0, import_defineProperty.default)(this, "meta", void 0);
|
|
27
|
+
this.meta = opts === null || opts === void 0 ? void 0 : opts.meta;
|
|
28
|
+
this.cause = cause;
|
|
29
|
+
this.shape = opts === null || opts === void 0 || (_opts$result = opts.result) === null || _opts$result === void 0 ? void 0 : _opts$result.error;
|
|
30
|
+
this.data = opts === null || opts === void 0 || (_opts$result2 = opts.result) === null || _opts$result2 === void 0 ? void 0 : _opts$result2.error.data;
|
|
31
|
+
this.name = "TRPCClientError";
|
|
32
|
+
Object.setPrototypeOf(this, TRPCClientError.prototype);
|
|
33
|
+
}
|
|
34
|
+
static from(_cause, opts = {}) {
|
|
35
|
+
const cause = _cause;
|
|
36
|
+
if (isTRPCClientError(cause)) {
|
|
37
|
+
if (opts.meta) cause.meta = (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, cause.meta), opts.meta);
|
|
38
|
+
return cause;
|
|
39
|
+
}
|
|
40
|
+
if (isTRPCErrorResponse(cause)) return new TRPCClientError(cause.error.message, (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, opts), {}, { result: cause }));
|
|
41
|
+
return new TRPCClientError(getMessageFromUnknownError(cause, "Unknown error"), (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, opts), {}, { cause }));
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
//#endregion
|
|
46
|
+
export { TRPCClientError, isTRPCClientError };
|
|
47
|
+
//# sourceMappingURL=TRPCClientError-CjKyS10w.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TRPCClientError-
|
|
1
|
+
{"version":3,"file":"TRPCClientError-CjKyS10w.mjs","names":["cause: unknown","obj: unknown","err: unknown","fallback: string","message: string","opts?: {\n result?: Maybe<TRPCErrorResponse<inferErrorShape<TRouterOrProcedure>>>;\n cause?: Error;\n meta?: Record<string, unknown>;\n }","_cause: Error | TRPCErrorResponse<any> | object","opts: { meta?: Record<string, unknown> }"],"sources":["../src/TRPCClientError.ts"],"sourcesContent":["import type {\n inferClientTypes,\n InferrableClientTypes,\n Maybe,\n TRPCErrorResponse,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n isObject,\n type DefaultErrorShape,\n} from '@trpc/server/unstable-core-do-not-import';\n\ntype inferErrorShape<TInferrable extends InferrableClientTypes> =\n inferClientTypes<TInferrable>['errorShape'];\nexport interface TRPCClientErrorBase<TShape extends DefaultErrorShape> {\n readonly message: string;\n readonly shape: Maybe<TShape>;\n readonly data: Maybe<TShape['data']>;\n}\nexport type TRPCClientErrorLike<TInferrable extends InferrableClientTypes> =\n TRPCClientErrorBase<inferErrorShape<TInferrable>>;\n\nexport function isTRPCClientError<TInferrable extends InferrableClientTypes>(\n cause: unknown,\n): cause is TRPCClientError<TInferrable> {\n return cause instanceof TRPCClientError;\n}\n\nfunction isTRPCErrorResponse(obj: unknown): obj is TRPCErrorResponse<any> {\n return (\n isObject(obj) &&\n isObject(obj['error']) &&\n typeof obj['error']['code'] === 'number' &&\n typeof obj['error']['message'] === 'string'\n );\n}\n\nfunction getMessageFromUnknownError(err: unknown, fallback: string): string {\n if (typeof err === 'string') {\n return err;\n }\n if (isObject(err) && typeof err['message'] === 'string') {\n return err['message'];\n }\n return fallback;\n}\n\nexport class TRPCClientError<TRouterOrProcedure extends InferrableClientTypes>\n extends Error\n implements TRPCClientErrorBase<inferErrorShape<TRouterOrProcedure>>\n{\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore override doesn't work in all environments due to \"This member cannot have an 'override' modifier because it is not declared in the base class 'Error'\"\n public override readonly cause;\n public readonly shape: Maybe<inferErrorShape<TRouterOrProcedure>>;\n public readonly data: Maybe<inferErrorShape<TRouterOrProcedure>['data']>;\n\n /**\n * Additional meta data about the error\n * In the case of HTTP-errors, we'll have `response` and potentially `responseJSON` here\n */\n public meta;\n\n constructor(\n message: string,\n opts?: {\n result?: Maybe<TRPCErrorResponse<inferErrorShape<TRouterOrProcedure>>>;\n cause?: Error;\n meta?: Record<string, unknown>;\n },\n ) {\n const cause = opts?.cause;\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore https://github.com/tc39/proposal-error-cause\n super(message, { cause });\n\n this.meta = opts?.meta;\n\n this.cause = cause;\n this.shape = opts?.result?.error;\n this.data = opts?.result?.error.data;\n this.name = 'TRPCClientError';\n\n Object.setPrototypeOf(this, TRPCClientError.prototype);\n }\n\n public static from<TRouterOrProcedure extends InferrableClientTypes>(\n _cause: Error | TRPCErrorResponse<any> | object,\n opts: { meta?: Record<string, unknown> } = {},\n ): TRPCClientError<TRouterOrProcedure> {\n const cause = _cause as unknown;\n\n if (isTRPCClientError(cause)) {\n if (opts.meta) {\n // Decorate with meta error data\n cause.meta = {\n ...cause.meta,\n ...opts.meta,\n };\n }\n return cause;\n }\n if (isTRPCErrorResponse(cause)) {\n return new TRPCClientError(cause.error.message, {\n ...opts,\n result: cause,\n });\n }\n return new TRPCClientError(\n getMessageFromUnknownError(cause, 'Unknown error'),\n {\n ...opts,\n cause: cause as any,\n },\n );\n }\n}\n"],"mappings":";;;;;;AAqBA,SAAgB,kBACdA,OACuC;AACvC,QAAO,iBAAiB;AACzB;AAED,SAAS,oBAAoBC,KAA6C;AACxE,QACE,SAAS,IAAI,IACb,SAAS,IAAI,SAAS,WACf,IAAI,SAAS,YAAY,mBACzB,IAAI,SAAS,eAAe;AAEtC;AAED,SAAS,2BAA2BC,KAAcC,UAA0B;AAC1E,YAAW,QAAQ,SACjB,QAAO;AAET,KAAI,SAAS,IAAI,WAAW,IAAI,eAAe,SAC7C,QAAO,IAAI;AAEb,QAAO;AACR;AAED,IAAa,kBAAb,MAAa,wBACH,MAEV;CAaE,YACEC,SACAC,MAKA;;EACA,MAAM,oDAAQ,KAAM;AAIpB,QAAM,SAAS,EAAE,MAAO,EAAC;qCA2C1B,MAjEwB;qCAiEvB,MAhEc;qCAgEb,MA/Da;qCA+DZ,MAzDG;AAgBL,OAAK,mDAAO,KAAM;AAElB,OAAK,QAAQ;AACb,OAAK,4DAAQ,KAAM,oEAAQ;AAC3B,OAAK,4DAAO,KAAM,sEAAQ,MAAM;AAChC,OAAK,OAAO;AAEZ,SAAO,eAAe,MAAM,gBAAgB,UAAU;CACvD;CAED,OAAc,KACZC,QACAC,OAA2C,CAAE,GACR;EACrC,MAAM,QAAQ;AAEd,MAAI,kBAAkB,MAAM,EAAE;AAC5B,OAAI,KAAK,KAEP,OAAM,+EACD,MAAM,OACN,KAAK;AAGZ,UAAO;EACR;AACD,MAAI,oBAAoB,MAAM,CAC5B,QAAO,IAAI,gBAAgB,MAAM,MAAM,iFAClC,aACH,QAAQ;AAGZ,SAAO,IAAI,gBACT,2BAA2B,OAAO,gBAAgB,0EAE7C,aACI;CAGZ;AACF"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-DWy1uDak.cjs');
|
|
2
|
+
const require_objectSpread2$1 = require('./objectSpread2-Bsvh_OqM.cjs');
|
|
2
3
|
const __trpc_server_unstable_core_do_not_import = require_chunk.__toESM(require("@trpc/server/unstable-core-do-not-import"));
|
|
3
4
|
|
|
4
5
|
//#region src/TRPCClientError.ts
|
|
6
|
+
var import_defineProperty = require_chunk.__toESM(require_objectSpread2$1.require_defineProperty(), 1);
|
|
7
|
+
var import_objectSpread2 = require_chunk.__toESM(require_objectSpread2$1.require_objectSpread2(), 1);
|
|
5
8
|
function isTRPCClientError(cause) {
|
|
6
9
|
return cause instanceof TRPCClientError;
|
|
7
10
|
}
|
|
@@ -14,41 +17,29 @@ function getMessageFromUnknownError(err, fallback) {
|
|
|
14
17
|
return fallback;
|
|
15
18
|
}
|
|
16
19
|
var TRPCClientError = class TRPCClientError extends Error {
|
|
17
|
-
cause;
|
|
18
|
-
shape;
|
|
19
|
-
data;
|
|
20
|
-
/**
|
|
21
|
-
* Additional meta data about the error
|
|
22
|
-
* In the case of HTTP-errors, we'll have `response` and potentially `responseJSON` here
|
|
23
|
-
*/
|
|
24
|
-
meta;
|
|
25
20
|
constructor(message, opts) {
|
|
26
|
-
|
|
21
|
+
var _opts$result, _opts$result2;
|
|
22
|
+
const cause = opts === null || opts === void 0 ? void 0 : opts.cause;
|
|
27
23
|
super(message, { cause });
|
|
28
|
-
this
|
|
24
|
+
(0, import_defineProperty.default)(this, "cause", void 0);
|
|
25
|
+
(0, import_defineProperty.default)(this, "shape", void 0);
|
|
26
|
+
(0, import_defineProperty.default)(this, "data", void 0);
|
|
27
|
+
(0, import_defineProperty.default)(this, "meta", void 0);
|
|
28
|
+
this.meta = opts === null || opts === void 0 ? void 0 : opts.meta;
|
|
29
29
|
this.cause = cause;
|
|
30
|
-
this.shape = opts
|
|
31
|
-
this.data = opts
|
|
30
|
+
this.shape = opts === null || opts === void 0 || (_opts$result = opts.result) === null || _opts$result === void 0 ? void 0 : _opts$result.error;
|
|
31
|
+
this.data = opts === null || opts === void 0 || (_opts$result2 = opts.result) === null || _opts$result2 === void 0 ? void 0 : _opts$result2.error.data;
|
|
32
32
|
this.name = "TRPCClientError";
|
|
33
33
|
Object.setPrototypeOf(this, TRPCClientError.prototype);
|
|
34
34
|
}
|
|
35
35
|
static from(_cause, opts = {}) {
|
|
36
36
|
const cause = _cause;
|
|
37
37
|
if (isTRPCClientError(cause)) {
|
|
38
|
-
if (opts.meta) cause.meta = {
|
|
39
|
-
...cause.meta,
|
|
40
|
-
...opts.meta
|
|
41
|
-
};
|
|
38
|
+
if (opts.meta) cause.meta = (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, cause.meta), opts.meta);
|
|
42
39
|
return cause;
|
|
43
40
|
}
|
|
44
|
-
if (isTRPCErrorResponse(cause)) return new TRPCClientError(cause.error.message, {
|
|
45
|
-
|
|
46
|
-
result: cause
|
|
47
|
-
});
|
|
48
|
-
return new TRPCClientError(getMessageFromUnknownError(cause, "Unknown error"), {
|
|
49
|
-
...opts,
|
|
50
|
-
cause
|
|
51
|
-
});
|
|
41
|
+
if (isTRPCErrorResponse(cause)) return new TRPCClientError(cause.error.message, (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, opts), {}, { result: cause }));
|
|
42
|
+
return new TRPCClientError(getMessageFromUnknownError(cause, "Unknown error"), (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, opts), {}, { cause }));
|
|
52
43
|
}
|
|
53
44
|
};
|
|
54
45
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { __toESM, require_objectSpread2 } from "./objectSpread2-BvkFp-_Y.mjs";
|
|
2
|
+
import { TRPCClientError } from "./TRPCClientError-CjKyS10w.mjs";
|
|
3
|
+
import { getUrl, jsonHttpRequester, resolveHTTPLinkOptions } from "./httpUtils-Bkv1johT.mjs";
|
|
3
4
|
import { observable } from "@trpc/server/observable";
|
|
4
5
|
import { transformResult } from "@trpc/server/unstable-core-do-not-import";
|
|
5
6
|
|
|
@@ -34,7 +35,8 @@ function dataLoader(batchLoader) {
|
|
|
34
35
|
if (!item) break;
|
|
35
36
|
const lastGroup = groupedItems[groupedItems.length - 1];
|
|
36
37
|
if (item.aborted) {
|
|
37
|
-
|
|
38
|
+
var _item$reject;
|
|
39
|
+
(_item$reject = item.reject) === null || _item$reject === void 0 || _item$reject.call(item, new Error("Aborted"));
|
|
38
40
|
index++;
|
|
39
41
|
continue;
|
|
40
42
|
}
|
|
@@ -45,7 +47,8 @@ function dataLoader(batchLoader) {
|
|
|
45
47
|
continue;
|
|
46
48
|
}
|
|
47
49
|
if (lastGroup.length === 0) {
|
|
48
|
-
|
|
50
|
+
var _item$reject2;
|
|
51
|
+
(_item$reject2 = item.reject) === null || _item$reject2 === void 0 || _item$reject2.call(item, new Error("Input is too big for a single dispatch"));
|
|
49
52
|
index++;
|
|
50
53
|
continue;
|
|
51
54
|
}
|
|
@@ -65,28 +68,33 @@ function dataLoader(batchLoader) {
|
|
|
65
68
|
await Promise.all(result.map(async (valueOrPromise, index) => {
|
|
66
69
|
const item = batch.items[index];
|
|
67
70
|
try {
|
|
71
|
+
var _item$resolve;
|
|
68
72
|
const value = await Promise.resolve(valueOrPromise);
|
|
69
|
-
item.resolve
|
|
73
|
+
(_item$resolve = item.resolve) === null || _item$resolve === void 0 || _item$resolve.call(item, value);
|
|
70
74
|
} catch (cause) {
|
|
71
|
-
|
|
75
|
+
var _item$reject3;
|
|
76
|
+
(_item$reject3 = item.reject) === null || _item$reject3 === void 0 || _item$reject3.call(item, cause);
|
|
72
77
|
}
|
|
73
78
|
item.batch = null;
|
|
74
79
|
item.reject = null;
|
|
75
80
|
item.resolve = null;
|
|
76
81
|
}));
|
|
77
82
|
for (const item of batch.items) {
|
|
78
|
-
|
|
83
|
+
var _item$reject4;
|
|
84
|
+
(_item$reject4 = item.reject) === null || _item$reject4 === void 0 || _item$reject4.call(item, new Error("Missing result"));
|
|
79
85
|
item.batch = null;
|
|
80
86
|
}
|
|
81
87
|
}).catch((cause) => {
|
|
82
88
|
for (const item of batch.items) {
|
|
83
|
-
|
|
89
|
+
var _item$reject5;
|
|
90
|
+
(_item$reject5 = item.reject) === null || _item$reject5 === void 0 || _item$reject5.call(item, cause);
|
|
84
91
|
item.batch = null;
|
|
85
92
|
}
|
|
86
93
|
});
|
|
87
94
|
}
|
|
88
95
|
}
|
|
89
96
|
function load(key) {
|
|
97
|
+
var _dispatchTimer;
|
|
90
98
|
const item = {
|
|
91
99
|
aborted: false,
|
|
92
100
|
key,
|
|
@@ -95,12 +103,13 @@ function dataLoader(batchLoader) {
|
|
|
95
103
|
reject: throwFatalError
|
|
96
104
|
};
|
|
97
105
|
const promise = new Promise((resolve, reject) => {
|
|
106
|
+
var _pendingItems;
|
|
98
107
|
item.reject = reject;
|
|
99
108
|
item.resolve = resolve;
|
|
100
|
-
pendingItems
|
|
109
|
+
(_pendingItems = pendingItems) !== null && _pendingItems !== void 0 || (pendingItems = []);
|
|
101
110
|
pendingItems.push(item);
|
|
102
111
|
});
|
|
103
|
-
dispatchTimer
|
|
112
|
+
(_dispatchTimer = dispatchTimer) !== null && _dispatchTimer !== void 0 || (dispatchTimer = setTimeout(dispatch));
|
|
104
113
|
return promise;
|
|
105
114
|
}
|
|
106
115
|
return { load };
|
|
@@ -120,8 +129,8 @@ function allAbortSignals(...signals) {
|
|
|
120
129
|
const onAbort = () => {
|
|
121
130
|
if (++abortedCount === count) ac.abort();
|
|
122
131
|
};
|
|
123
|
-
for (const signal of signals) if (signal
|
|
124
|
-
else signal
|
|
132
|
+
for (const signal of signals) if (signal === null || signal === void 0 ? void 0 : signal.aborted) onAbort();
|
|
133
|
+
else signal === null || signal === void 0 || signal.addEventListener("abort", onAbort, { once: true });
|
|
125
134
|
return ac.signal;
|
|
126
135
|
}
|
|
127
136
|
/**
|
|
@@ -132,8 +141,8 @@ function allAbortSignals(...signals) {
|
|
|
132
141
|
*/
|
|
133
142
|
function raceAbortSignals(...signals) {
|
|
134
143
|
const ac = new AbortController();
|
|
135
|
-
for (const signal of signals) if (signal
|
|
136
|
-
else signal
|
|
144
|
+
for (const signal of signals) if (signal === null || signal === void 0 ? void 0 : signal.aborted) ac.abort();
|
|
145
|
+
else signal === null || signal === void 0 || signal.addEventListener("abort", () => ac.abort(), { once: true });
|
|
137
146
|
return ac.signal;
|
|
138
147
|
}
|
|
139
148
|
function abortSignalToPromise(signal) {
|
|
@@ -150,13 +159,15 @@ function abortSignalToPromise(signal) {
|
|
|
150
159
|
|
|
151
160
|
//#endregion
|
|
152
161
|
//#region src/links/httpBatchLink.ts
|
|
162
|
+
var import_objectSpread2 = __toESM(require_objectSpread2(), 1);
|
|
153
163
|
/**
|
|
154
164
|
* @see https://trpc.io/docs/client/links/httpBatchLink
|
|
155
165
|
*/
|
|
156
166
|
function httpBatchLink(opts) {
|
|
167
|
+
var _opts$maxURLLength, _opts$maxItems;
|
|
157
168
|
const resolvedOpts = resolveHTTPLinkOptions(opts);
|
|
158
|
-
const maxURLLength = opts.maxURLLength
|
|
159
|
-
const maxItems = opts.maxItems
|
|
169
|
+
const maxURLLength = (_opts$maxURLLength = opts.maxURLLength) !== null && _opts$maxURLLength !== void 0 ? _opts$maxURLLength : Infinity;
|
|
170
|
+
const maxItems = (_opts$maxItems = opts.maxItems) !== null && _opts$maxItems !== void 0 ? _opts$maxItems : Infinity;
|
|
160
171
|
return () => {
|
|
161
172
|
const batchLoader = (type) => {
|
|
162
173
|
return {
|
|
@@ -165,21 +176,19 @@ function httpBatchLink(opts) {
|
|
|
165
176
|
if (batchOps.length > maxItems) return false;
|
|
166
177
|
const path = batchOps.map((op) => op.path).join(",");
|
|
167
178
|
const inputs = batchOps.map((op) => op.input);
|
|
168
|
-
const url = getUrl({
|
|
169
|
-
...resolvedOpts,
|
|
179
|
+
const url = getUrl((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, resolvedOpts), {}, {
|
|
170
180
|
type,
|
|
171
181
|
path,
|
|
172
182
|
inputs,
|
|
173
183
|
signal: null
|
|
174
|
-
});
|
|
184
|
+
}));
|
|
175
185
|
return url.length <= maxURLLength;
|
|
176
186
|
},
|
|
177
187
|
async fetch(batchOps) {
|
|
178
188
|
const path = batchOps.map((op) => op.path).join(",");
|
|
179
189
|
const inputs = batchOps.map((op) => op.input);
|
|
180
190
|
const signal = allAbortSignals(...batchOps.map((op) => op.signal));
|
|
181
|
-
const res = await jsonHttpRequester({
|
|
182
|
-
...resolvedOpts,
|
|
191
|
+
const res = await jsonHttpRequester((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, resolvedOpts), {}, {
|
|
183
192
|
path,
|
|
184
193
|
inputs,
|
|
185
194
|
type,
|
|
@@ -189,7 +198,7 @@ function httpBatchLink(opts) {
|
|
|
189
198
|
return opts.headers;
|
|
190
199
|
},
|
|
191
200
|
signal
|
|
192
|
-
});
|
|
201
|
+
}));
|
|
193
202
|
const resJSON = Array.isArray(res.json) ? res.json : batchOps.map(() => res.json);
|
|
194
203
|
const result = resJSON.map((item) => ({
|
|
195
204
|
meta: res.meta,
|
|
@@ -225,7 +234,7 @@ function httpBatchLink(opts) {
|
|
|
225
234
|
});
|
|
226
235
|
observer.complete();
|
|
227
236
|
}).catch((err) => {
|
|
228
|
-
observer.error(TRPCClientError.from(err, { meta: _res
|
|
237
|
+
observer.error(TRPCClientError.from(err, { meta: _res === null || _res === void 0 ? void 0 : _res.meta }));
|
|
229
238
|
});
|
|
230
239
|
return () => {};
|
|
231
240
|
});
|
|
@@ -235,4 +244,4 @@ function httpBatchLink(opts) {
|
|
|
235
244
|
|
|
236
245
|
//#endregion
|
|
237
246
|
export { abortSignalToPromise, allAbortSignals, dataLoader, httpBatchLink, raceAbortSignals };
|
|
238
|
-
//# sourceMappingURL=httpBatchLink-
|
|
247
|
+
//# sourceMappingURL=httpBatchLink-CA96-gnJ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpBatchLink-DIfnmmcu.mjs","names":["batchLoader: BatchLoader<TKey, TValue>","pendingItems: BatchItem<TKey, TValue>[] | null","dispatchTimer: ReturnType<typeof setTimeout> | null","items: BatchItem<TKey, TValue>[]","groupedItems: BatchItem<TKey, TValue>[][]","batch: Batch<TKey, TValue>","key: TKey","item: BatchItem<TKey, TValue>","signal: AbortSignal","opts: HTTPBatchLinkOptions<TRouter['_def']['_config']['$types']>","type: ProcedureType"],"sources":["../src/internals/dataLoader.ts","../src/internals/signals.ts","../src/links/httpBatchLink.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\ntype BatchItem<TKey, TValue> = {\n aborted: boolean;\n key: TKey;\n resolve: ((value: TValue) => void) | null;\n reject: ((error: Error) => void) | null;\n batch: Batch<TKey, TValue> | null;\n};\ntype Batch<TKey, TValue> = {\n items: BatchItem<TKey, TValue>[];\n};\nexport type BatchLoader<TKey, TValue> = {\n validate: (keys: TKey[]) => boolean;\n fetch: (keys: TKey[]) => Promise<TValue[] | Promise<TValue>[]>;\n};\n\n/**\n * A function that should never be called unless we messed something up.\n */\nconst throwFatalError = () => {\n throw new Error(\n 'Something went wrong. Please submit an issue at https://github.com/trpc/trpc/issues/new',\n );\n};\n\n/**\n * Dataloader that's very inspired by https://github.com/graphql/dataloader\n * Less configuration, no caching, and allows you to cancel requests\n * When cancelling a single fetch the whole batch will be cancelled only when _all_ items are cancelled\n */\nexport function dataLoader<TKey, TValue>(\n batchLoader: BatchLoader<TKey, TValue>,\n) {\n let pendingItems: BatchItem<TKey, TValue>[] | null = null;\n let dispatchTimer: ReturnType<typeof setTimeout> | null = null;\n\n const destroyTimerAndPendingItems = () => {\n clearTimeout(dispatchTimer as any);\n dispatchTimer = null;\n pendingItems = null;\n };\n\n /**\n * Iterate through the items and split them into groups based on the `batchLoader`'s validate function\n */\n function groupItems(items: BatchItem<TKey, TValue>[]) {\n const groupedItems: BatchItem<TKey, TValue>[][] = [[]];\n let index = 0;\n while (true) {\n const item = items[index];\n if (!item) {\n // we're done\n break;\n }\n const lastGroup = groupedItems[groupedItems.length - 1]!;\n\n if (item.aborted) {\n // Item was aborted before it was dispatched\n item.reject?.(new Error('Aborted'));\n index++;\n continue;\n }\n\n const isValid = batchLoader.validate(\n lastGroup.concat(item).map((it) => it.key),\n );\n\n if (isValid) {\n lastGroup.push(item);\n index++;\n continue;\n }\n\n if (lastGroup.length === 0) {\n item.reject?.(new Error('Input is too big for a single dispatch'));\n index++;\n continue;\n }\n // Create new group, next iteration will try to add the item to that\n groupedItems.push([]);\n }\n return groupedItems;\n }\n\n function dispatch() {\n const groupedItems = groupItems(pendingItems!);\n destroyTimerAndPendingItems();\n\n // Create batches for each group of items\n for (const items of groupedItems) {\n if (!items.length) {\n continue;\n }\n const batch: Batch<TKey, TValue> = {\n items,\n };\n for (const item of items) {\n item.batch = batch;\n }\n const promise = batchLoader.fetch(batch.items.map((_item) => _item.key));\n\n promise\n .then(async (result) => {\n await Promise.all(\n result.map(async (valueOrPromise, index) => {\n const item = batch.items[index]!;\n try {\n const value = await Promise.resolve(valueOrPromise);\n\n item.resolve?.(value);\n } catch (cause) {\n item.reject?.(cause as Error);\n }\n\n item.batch = null;\n item.reject = null;\n item.resolve = null;\n }),\n );\n\n for (const item of batch.items) {\n item.reject?.(new Error('Missing result'));\n item.batch = null;\n }\n })\n .catch((cause) => {\n for (const item of batch.items) {\n item.reject?.(cause);\n item.batch = null;\n }\n });\n }\n }\n function load(key: TKey): Promise<TValue> {\n const item: BatchItem<TKey, TValue> = {\n aborted: false,\n key,\n batch: null,\n resolve: throwFatalError,\n reject: throwFatalError,\n };\n\n const promise = new Promise<TValue>((resolve, reject) => {\n item.reject = reject;\n item.resolve = resolve;\n\n pendingItems ??= [];\n pendingItems.push(item);\n });\n\n dispatchTimer ??= setTimeout(dispatch);\n\n return promise;\n }\n\n return {\n load,\n };\n}\n","import type { Maybe } from '@trpc/server/unstable-core-do-not-import';\n\n/**\n * Like `Promise.all()` but for abort signals\n * - When all signals have been aborted, the merged signal will be aborted\n * - If one signal is `null`, no signal will be aborted\n */\nexport function allAbortSignals(...signals: Maybe<AbortSignal>[]): AbortSignal {\n const ac = new AbortController();\n\n const count = signals.length;\n\n let abortedCount = 0;\n\n const onAbort = () => {\n if (++abortedCount === count) {\n ac.abort();\n }\n };\n\n for (const signal of signals) {\n if (signal?.aborted) {\n onAbort();\n } else {\n signal?.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n return ac.signal;\n}\n\n/**\n * Like `Promise.race` but for abort signals\n *\n * Basically, a ponyfill for\n * [`AbortSignal.any`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/any_static).\n */\nexport function raceAbortSignals(\n ...signals: Maybe<AbortSignal>[]\n): AbortSignal {\n const ac = new AbortController();\n\n for (const signal of signals) {\n if (signal?.aborted) {\n ac.abort();\n } else {\n signal?.addEventListener('abort', () => ac.abort(), { once: true });\n }\n }\n\n return ac.signal;\n}\n\nexport function abortSignalToPromise(signal: AbortSignal): Promise<never> {\n return new Promise((_, reject) => {\n if (signal.aborted) {\n reject(signal.reason);\n return;\n }\n signal.addEventListener(\n 'abort',\n () => {\n reject(signal.reason);\n },\n { once: true },\n );\n });\n}\n","import type { AnyRouter, ProcedureType } from '@trpc/server';\nimport { observable } from '@trpc/server/observable';\nimport { transformResult } from '@trpc/server/unstable-core-do-not-import';\nimport type { BatchLoader } from '../internals/dataLoader';\nimport { dataLoader } from '../internals/dataLoader';\nimport { allAbortSignals } from '../internals/signals';\nimport type { NonEmptyArray } from '../internals/types';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { HTTPBatchLinkOptions } from './HTTPBatchLinkOptions';\nimport type { HTTPResult } from './internals/httpUtils';\nimport {\n getUrl,\n jsonHttpRequester,\n resolveHTTPLinkOptions,\n} from './internals/httpUtils';\nimport type { Operation, TRPCLink } from './types';\n\n/**\n * @see https://trpc.io/docs/client/links/httpBatchLink\n */\nexport function httpBatchLink<TRouter extends AnyRouter>(\n opts: HTTPBatchLinkOptions<TRouter['_def']['_config']['$types']>,\n): TRPCLink<TRouter> {\n const resolvedOpts = resolveHTTPLinkOptions(opts);\n const maxURLLength = opts.maxURLLength ?? Infinity;\n const maxItems = opts.maxItems ?? Infinity;\n\n return () => {\n const batchLoader = (\n type: ProcedureType,\n ): BatchLoader<Operation, HTTPResult> => {\n return {\n validate(batchOps) {\n if (maxURLLength === Infinity && maxItems === Infinity) {\n // escape hatch for quick calcs\n return true;\n }\n if (batchOps.length > maxItems) {\n return false;\n }\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const url = getUrl({\n ...resolvedOpts,\n type,\n path,\n inputs,\n signal: null,\n });\n\n return url.length <= maxURLLength;\n },\n async fetch(batchOps) {\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n const signal = allAbortSignals(...batchOps.map((op) => op.signal));\n\n const res = await jsonHttpRequester({\n ...resolvedOpts,\n path,\n inputs,\n type,\n headers() {\n if (!opts.headers) {\n return {};\n }\n if (typeof opts.headers === 'function') {\n return opts.headers({\n opList: batchOps as NonEmptyArray<Operation>,\n });\n }\n return opts.headers;\n },\n signal,\n });\n const resJSON = Array.isArray(res.json)\n ? res.json\n : batchOps.map(() => res.json);\n const result = resJSON.map((item) => ({\n meta: res.meta,\n json: item,\n }));\n return result;\n },\n };\n };\n\n const query = dataLoader(batchLoader('query'));\n const mutation = dataLoader(batchLoader('mutation'));\n\n const loaders = { query, mutation };\n return ({ op }) => {\n return observable((observer) => {\n /* istanbul ignore if -- @preserve */\n if (op.type === 'subscription') {\n throw new Error(\n 'Subscriptions are unsupported by `httpLink` - use `httpSubscriptionLink` or `wsLink`',\n );\n }\n const loader = loaders[op.type];\n const promise = loader.load(op);\n\n let _res = undefined as HTTPResult | undefined;\n promise\n .then((res) => {\n _res = res;\n const transformed = transformResult(\n res.json,\n resolvedOpts.transformer.output,\n );\n\n if (!transformed.ok) {\n observer.error(\n TRPCClientError.from(transformed.error, {\n meta: res.meta,\n }),\n );\n return;\n }\n observer.next({\n context: res.meta,\n result: transformed.result,\n });\n observer.complete();\n })\n .catch((err) => {\n observer.error(\n TRPCClientError.from(err, {\n meta: _res?.meta,\n }),\n );\n });\n\n return () => {\n // noop\n };\n });\n };\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"httpBatchLink-CA96-gnJ.mjs","names":["batchLoader: BatchLoader<TKey, TValue>","pendingItems: BatchItem<TKey, TValue>[] | null","dispatchTimer: ReturnType<typeof setTimeout> | null","items: BatchItem<TKey, TValue>[]","groupedItems: BatchItem<TKey, TValue>[][]","batch: Batch<TKey, TValue>","key: TKey","item: BatchItem<TKey, TValue>","signal: AbortSignal","opts: HTTPBatchLinkOptions<TRouter['_def']['_config']['$types']>","type: ProcedureType"],"sources":["../src/internals/dataLoader.ts","../src/internals/signals.ts","../src/links/httpBatchLink.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\ntype BatchItem<TKey, TValue> = {\n aborted: boolean;\n key: TKey;\n resolve: ((value: TValue) => void) | null;\n reject: ((error: Error) => void) | null;\n batch: Batch<TKey, TValue> | null;\n};\ntype Batch<TKey, TValue> = {\n items: BatchItem<TKey, TValue>[];\n};\nexport type BatchLoader<TKey, TValue> = {\n validate: (keys: TKey[]) => boolean;\n fetch: (keys: TKey[]) => Promise<TValue[] | Promise<TValue>[]>;\n};\n\n/**\n * A function that should never be called unless we messed something up.\n */\nconst throwFatalError = () => {\n throw new Error(\n 'Something went wrong. Please submit an issue at https://github.com/trpc/trpc/issues/new',\n );\n};\n\n/**\n * Dataloader that's very inspired by https://github.com/graphql/dataloader\n * Less configuration, no caching, and allows you to cancel requests\n * When cancelling a single fetch the whole batch will be cancelled only when _all_ items are cancelled\n */\nexport function dataLoader<TKey, TValue>(\n batchLoader: BatchLoader<TKey, TValue>,\n) {\n let pendingItems: BatchItem<TKey, TValue>[] | null = null;\n let dispatchTimer: ReturnType<typeof setTimeout> | null = null;\n\n const destroyTimerAndPendingItems = () => {\n clearTimeout(dispatchTimer as any);\n dispatchTimer = null;\n pendingItems = null;\n };\n\n /**\n * Iterate through the items and split them into groups based on the `batchLoader`'s validate function\n */\n function groupItems(items: BatchItem<TKey, TValue>[]) {\n const groupedItems: BatchItem<TKey, TValue>[][] = [[]];\n let index = 0;\n while (true) {\n const item = items[index];\n if (!item) {\n // we're done\n break;\n }\n const lastGroup = groupedItems[groupedItems.length - 1]!;\n\n if (item.aborted) {\n // Item was aborted before it was dispatched\n item.reject?.(new Error('Aborted'));\n index++;\n continue;\n }\n\n const isValid = batchLoader.validate(\n lastGroup.concat(item).map((it) => it.key),\n );\n\n if (isValid) {\n lastGroup.push(item);\n index++;\n continue;\n }\n\n if (lastGroup.length === 0) {\n item.reject?.(new Error('Input is too big for a single dispatch'));\n index++;\n continue;\n }\n // Create new group, next iteration will try to add the item to that\n groupedItems.push([]);\n }\n return groupedItems;\n }\n\n function dispatch() {\n const groupedItems = groupItems(pendingItems!);\n destroyTimerAndPendingItems();\n\n // Create batches for each group of items\n for (const items of groupedItems) {\n if (!items.length) {\n continue;\n }\n const batch: Batch<TKey, TValue> = {\n items,\n };\n for (const item of items) {\n item.batch = batch;\n }\n const promise = batchLoader.fetch(batch.items.map((_item) => _item.key));\n\n promise\n .then(async (result) => {\n await Promise.all(\n result.map(async (valueOrPromise, index) => {\n const item = batch.items[index]!;\n try {\n const value = await Promise.resolve(valueOrPromise);\n\n item.resolve?.(value);\n } catch (cause) {\n item.reject?.(cause as Error);\n }\n\n item.batch = null;\n item.reject = null;\n item.resolve = null;\n }),\n );\n\n for (const item of batch.items) {\n item.reject?.(new Error('Missing result'));\n item.batch = null;\n }\n })\n .catch((cause) => {\n for (const item of batch.items) {\n item.reject?.(cause);\n item.batch = null;\n }\n });\n }\n }\n function load(key: TKey): Promise<TValue> {\n const item: BatchItem<TKey, TValue> = {\n aborted: false,\n key,\n batch: null,\n resolve: throwFatalError,\n reject: throwFatalError,\n };\n\n const promise = new Promise<TValue>((resolve, reject) => {\n item.reject = reject;\n item.resolve = resolve;\n\n pendingItems ??= [];\n pendingItems.push(item);\n });\n\n dispatchTimer ??= setTimeout(dispatch);\n\n return promise;\n }\n\n return {\n load,\n };\n}\n","import type { Maybe } from '@trpc/server/unstable-core-do-not-import';\n\n/**\n * Like `Promise.all()` but for abort signals\n * - When all signals have been aborted, the merged signal will be aborted\n * - If one signal is `null`, no signal will be aborted\n */\nexport function allAbortSignals(...signals: Maybe<AbortSignal>[]): AbortSignal {\n const ac = new AbortController();\n\n const count = signals.length;\n\n let abortedCount = 0;\n\n const onAbort = () => {\n if (++abortedCount === count) {\n ac.abort();\n }\n };\n\n for (const signal of signals) {\n if (signal?.aborted) {\n onAbort();\n } else {\n signal?.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n return ac.signal;\n}\n\n/**\n * Like `Promise.race` but for abort signals\n *\n * Basically, a ponyfill for\n * [`AbortSignal.any`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/any_static).\n */\nexport function raceAbortSignals(\n ...signals: Maybe<AbortSignal>[]\n): AbortSignal {\n const ac = new AbortController();\n\n for (const signal of signals) {\n if (signal?.aborted) {\n ac.abort();\n } else {\n signal?.addEventListener('abort', () => ac.abort(), { once: true });\n }\n }\n\n return ac.signal;\n}\n\nexport function abortSignalToPromise(signal: AbortSignal): Promise<never> {\n return new Promise((_, reject) => {\n if (signal.aborted) {\n reject(signal.reason);\n return;\n }\n signal.addEventListener(\n 'abort',\n () => {\n reject(signal.reason);\n },\n { once: true },\n );\n });\n}\n","import type { AnyRouter, ProcedureType } from '@trpc/server';\nimport { observable } from '@trpc/server/observable';\nimport { transformResult } from '@trpc/server/unstable-core-do-not-import';\nimport type { BatchLoader } from '../internals/dataLoader';\nimport { dataLoader } from '../internals/dataLoader';\nimport { allAbortSignals } from '../internals/signals';\nimport type { NonEmptyArray } from '../internals/types';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { HTTPBatchLinkOptions } from './HTTPBatchLinkOptions';\nimport type { HTTPResult } from './internals/httpUtils';\nimport {\n getUrl,\n jsonHttpRequester,\n resolveHTTPLinkOptions,\n} from './internals/httpUtils';\nimport type { Operation, TRPCLink } from './types';\n\n/**\n * @see https://trpc.io/docs/client/links/httpBatchLink\n */\nexport function httpBatchLink<TRouter extends AnyRouter>(\n opts: HTTPBatchLinkOptions<TRouter['_def']['_config']['$types']>,\n): TRPCLink<TRouter> {\n const resolvedOpts = resolveHTTPLinkOptions(opts);\n const maxURLLength = opts.maxURLLength ?? Infinity;\n const maxItems = opts.maxItems ?? Infinity;\n\n return () => {\n const batchLoader = (\n type: ProcedureType,\n ): BatchLoader<Operation, HTTPResult> => {\n return {\n validate(batchOps) {\n if (maxURLLength === Infinity && maxItems === Infinity) {\n // escape hatch for quick calcs\n return true;\n }\n if (batchOps.length > maxItems) {\n return false;\n }\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const url = getUrl({\n ...resolvedOpts,\n type,\n path,\n inputs,\n signal: null,\n });\n\n return url.length <= maxURLLength;\n },\n async fetch(batchOps) {\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n const signal = allAbortSignals(...batchOps.map((op) => op.signal));\n\n const res = await jsonHttpRequester({\n ...resolvedOpts,\n path,\n inputs,\n type,\n headers() {\n if (!opts.headers) {\n return {};\n }\n if (typeof opts.headers === 'function') {\n return opts.headers({\n opList: batchOps as NonEmptyArray<Operation>,\n });\n }\n return opts.headers;\n },\n signal,\n });\n const resJSON = Array.isArray(res.json)\n ? res.json\n : batchOps.map(() => res.json);\n const result = resJSON.map((item) => ({\n meta: res.meta,\n json: item,\n }));\n return result;\n },\n };\n };\n\n const query = dataLoader(batchLoader('query'));\n const mutation = dataLoader(batchLoader('mutation'));\n\n const loaders = { query, mutation };\n return ({ op }) => {\n return observable((observer) => {\n /* istanbul ignore if -- @preserve */\n if (op.type === 'subscription') {\n throw new Error(\n 'Subscriptions are unsupported by `httpLink` - use `httpSubscriptionLink` or `wsLink`',\n );\n }\n const loader = loaders[op.type];\n const promise = loader.load(op);\n\n let _res = undefined as HTTPResult | undefined;\n promise\n .then((res) => {\n _res = res;\n const transformed = transformResult(\n res.json,\n resolvedOpts.transformer.output,\n );\n\n if (!transformed.ok) {\n observer.error(\n TRPCClientError.from(transformed.error, {\n meta: res.meta,\n }),\n );\n return;\n }\n observer.next({\n context: res.meta,\n result: transformed.result,\n });\n observer.complete();\n })\n .catch((err) => {\n observer.error(\n TRPCClientError.from(err, {\n meta: _res?.meta,\n }),\n );\n });\n\n return () => {\n // noop\n };\n });\n };\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-DWy1uDak.cjs');
|
|
2
|
-
const
|
|
3
|
-
const
|
|
2
|
+
const require_objectSpread2$1 = require('./objectSpread2-Bsvh_OqM.cjs');
|
|
3
|
+
const require_TRPCClientError = require('./TRPCClientError-Dey88Uiy.cjs');
|
|
4
|
+
const require_httpUtils = require('./httpUtils-rn2lxsJO.cjs');
|
|
4
5
|
const __trpc_server_observable = require_chunk.__toESM(require("@trpc/server/observable"));
|
|
5
6
|
const __trpc_server_unstable_core_do_not_import = require_chunk.__toESM(require("@trpc/server/unstable-core-do-not-import"));
|
|
6
7
|
|
|
@@ -35,7 +36,8 @@ function dataLoader(batchLoader) {
|
|
|
35
36
|
if (!item) break;
|
|
36
37
|
const lastGroup = groupedItems[groupedItems.length - 1];
|
|
37
38
|
if (item.aborted) {
|
|
38
|
-
|
|
39
|
+
var _item$reject;
|
|
40
|
+
(_item$reject = item.reject) === null || _item$reject === void 0 || _item$reject.call(item, new Error("Aborted"));
|
|
39
41
|
index++;
|
|
40
42
|
continue;
|
|
41
43
|
}
|
|
@@ -46,7 +48,8 @@ function dataLoader(batchLoader) {
|
|
|
46
48
|
continue;
|
|
47
49
|
}
|
|
48
50
|
if (lastGroup.length === 0) {
|
|
49
|
-
|
|
51
|
+
var _item$reject2;
|
|
52
|
+
(_item$reject2 = item.reject) === null || _item$reject2 === void 0 || _item$reject2.call(item, new Error("Input is too big for a single dispatch"));
|
|
50
53
|
index++;
|
|
51
54
|
continue;
|
|
52
55
|
}
|
|
@@ -66,28 +69,33 @@ function dataLoader(batchLoader) {
|
|
|
66
69
|
await Promise.all(result.map(async (valueOrPromise, index) => {
|
|
67
70
|
const item = batch.items[index];
|
|
68
71
|
try {
|
|
72
|
+
var _item$resolve;
|
|
69
73
|
const value = await Promise.resolve(valueOrPromise);
|
|
70
|
-
item.resolve
|
|
74
|
+
(_item$resolve = item.resolve) === null || _item$resolve === void 0 || _item$resolve.call(item, value);
|
|
71
75
|
} catch (cause) {
|
|
72
|
-
|
|
76
|
+
var _item$reject3;
|
|
77
|
+
(_item$reject3 = item.reject) === null || _item$reject3 === void 0 || _item$reject3.call(item, cause);
|
|
73
78
|
}
|
|
74
79
|
item.batch = null;
|
|
75
80
|
item.reject = null;
|
|
76
81
|
item.resolve = null;
|
|
77
82
|
}));
|
|
78
83
|
for (const item of batch.items) {
|
|
79
|
-
|
|
84
|
+
var _item$reject4;
|
|
85
|
+
(_item$reject4 = item.reject) === null || _item$reject4 === void 0 || _item$reject4.call(item, new Error("Missing result"));
|
|
80
86
|
item.batch = null;
|
|
81
87
|
}
|
|
82
88
|
}).catch((cause) => {
|
|
83
89
|
for (const item of batch.items) {
|
|
84
|
-
|
|
90
|
+
var _item$reject5;
|
|
91
|
+
(_item$reject5 = item.reject) === null || _item$reject5 === void 0 || _item$reject5.call(item, cause);
|
|
85
92
|
item.batch = null;
|
|
86
93
|
}
|
|
87
94
|
});
|
|
88
95
|
}
|
|
89
96
|
}
|
|
90
97
|
function load(key) {
|
|
98
|
+
var _dispatchTimer;
|
|
91
99
|
const item = {
|
|
92
100
|
aborted: false,
|
|
93
101
|
key,
|
|
@@ -96,12 +104,13 @@ function dataLoader(batchLoader) {
|
|
|
96
104
|
reject: throwFatalError
|
|
97
105
|
};
|
|
98
106
|
const promise = new Promise((resolve, reject) => {
|
|
107
|
+
var _pendingItems;
|
|
99
108
|
item.reject = reject;
|
|
100
109
|
item.resolve = resolve;
|
|
101
|
-
pendingItems
|
|
110
|
+
(_pendingItems = pendingItems) !== null && _pendingItems !== void 0 || (pendingItems = []);
|
|
102
111
|
pendingItems.push(item);
|
|
103
112
|
});
|
|
104
|
-
dispatchTimer
|
|
113
|
+
(_dispatchTimer = dispatchTimer) !== null && _dispatchTimer !== void 0 || (dispatchTimer = setTimeout(dispatch));
|
|
105
114
|
return promise;
|
|
106
115
|
}
|
|
107
116
|
return { load };
|
|
@@ -121,8 +130,8 @@ function allAbortSignals(...signals) {
|
|
|
121
130
|
const onAbort = () => {
|
|
122
131
|
if (++abortedCount === count) ac.abort();
|
|
123
132
|
};
|
|
124
|
-
for (const signal of signals) if (signal
|
|
125
|
-
else signal
|
|
133
|
+
for (const signal of signals) if (signal === null || signal === void 0 ? void 0 : signal.aborted) onAbort();
|
|
134
|
+
else signal === null || signal === void 0 || signal.addEventListener("abort", onAbort, { once: true });
|
|
126
135
|
return ac.signal;
|
|
127
136
|
}
|
|
128
137
|
/**
|
|
@@ -133,8 +142,8 @@ function allAbortSignals(...signals) {
|
|
|
133
142
|
*/
|
|
134
143
|
function raceAbortSignals(...signals) {
|
|
135
144
|
const ac = new AbortController();
|
|
136
|
-
for (const signal of signals) if (signal
|
|
137
|
-
else signal
|
|
145
|
+
for (const signal of signals) if (signal === null || signal === void 0 ? void 0 : signal.aborted) ac.abort();
|
|
146
|
+
else signal === null || signal === void 0 || signal.addEventListener("abort", () => ac.abort(), { once: true });
|
|
138
147
|
return ac.signal;
|
|
139
148
|
}
|
|
140
149
|
function abortSignalToPromise(signal) {
|
|
@@ -151,13 +160,15 @@ function abortSignalToPromise(signal) {
|
|
|
151
160
|
|
|
152
161
|
//#endregion
|
|
153
162
|
//#region src/links/httpBatchLink.ts
|
|
163
|
+
var import_objectSpread2 = require_chunk.__toESM(require_objectSpread2$1.require_objectSpread2(), 1);
|
|
154
164
|
/**
|
|
155
165
|
* @see https://trpc.io/docs/client/links/httpBatchLink
|
|
156
166
|
*/
|
|
157
167
|
function httpBatchLink(opts) {
|
|
168
|
+
var _opts$maxURLLength, _opts$maxItems;
|
|
158
169
|
const resolvedOpts = require_httpUtils.resolveHTTPLinkOptions(opts);
|
|
159
|
-
const maxURLLength = opts.maxURLLength
|
|
160
|
-
const maxItems = opts.maxItems
|
|
170
|
+
const maxURLLength = (_opts$maxURLLength = opts.maxURLLength) !== null && _opts$maxURLLength !== void 0 ? _opts$maxURLLength : Infinity;
|
|
171
|
+
const maxItems = (_opts$maxItems = opts.maxItems) !== null && _opts$maxItems !== void 0 ? _opts$maxItems : Infinity;
|
|
161
172
|
return () => {
|
|
162
173
|
const batchLoader = (type) => {
|
|
163
174
|
return {
|
|
@@ -166,21 +177,19 @@ function httpBatchLink(opts) {
|
|
|
166
177
|
if (batchOps.length > maxItems) return false;
|
|
167
178
|
const path = batchOps.map((op) => op.path).join(",");
|
|
168
179
|
const inputs = batchOps.map((op) => op.input);
|
|
169
|
-
const url = require_httpUtils.getUrl({
|
|
170
|
-
...resolvedOpts,
|
|
180
|
+
const url = require_httpUtils.getUrl((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, resolvedOpts), {}, {
|
|
171
181
|
type,
|
|
172
182
|
path,
|
|
173
183
|
inputs,
|
|
174
184
|
signal: null
|
|
175
|
-
});
|
|
185
|
+
}));
|
|
176
186
|
return url.length <= maxURLLength;
|
|
177
187
|
},
|
|
178
188
|
async fetch(batchOps) {
|
|
179
189
|
const path = batchOps.map((op) => op.path).join(",");
|
|
180
190
|
const inputs = batchOps.map((op) => op.input);
|
|
181
191
|
const signal = allAbortSignals(...batchOps.map((op) => op.signal));
|
|
182
|
-
const res = await require_httpUtils.jsonHttpRequester({
|
|
183
|
-
...resolvedOpts,
|
|
192
|
+
const res = await require_httpUtils.jsonHttpRequester((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, resolvedOpts), {}, {
|
|
184
193
|
path,
|
|
185
194
|
inputs,
|
|
186
195
|
type,
|
|
@@ -190,7 +199,7 @@ function httpBatchLink(opts) {
|
|
|
190
199
|
return opts.headers;
|
|
191
200
|
},
|
|
192
201
|
signal
|
|
193
|
-
});
|
|
202
|
+
}));
|
|
194
203
|
const resJSON = Array.isArray(res.json) ? res.json : batchOps.map(() => res.json);
|
|
195
204
|
const result = resJSON.map((item) => ({
|
|
196
205
|
meta: res.meta,
|
|
@@ -226,7 +235,7 @@ function httpBatchLink(opts) {
|
|
|
226
235
|
});
|
|
227
236
|
observer.complete();
|
|
228
237
|
}).catch((err) => {
|
|
229
|
-
observer.error(require_TRPCClientError.TRPCClientError.from(err, { meta: _res
|
|
238
|
+
observer.error(require_TRPCClientError.TRPCClientError.from(err, { meta: _res === null || _res === void 0 ? void 0 : _res.meta }));
|
|
230
239
|
});
|
|
231
240
|
return () => {};
|
|
232
241
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { HTTPHeaders, NonEmptyArray, Operation, TRPCLink } from "./types.d-
|
|
2
|
-
import { HTTPLinkBaseOptions } from "./httpUtils.d-
|
|
1
|
+
import { HTTPHeaders, NonEmptyArray, Operation, TRPCLink } from "./types.d-POgEdUB1.mjs";
|
|
2
|
+
import { HTTPLinkBaseOptions } from "./httpUtils.d-cQRQZrfo.mjs";
|
|
3
3
|
import { AnyClientTypes } from "@trpc/server/unstable-core-do-not-import";
|
|
4
4
|
import { AnyRouter as AnyRouter$1 } from "@trpc/server";
|
|
5
5
|
|
|
@@ -30,4 +30,4 @@ declare function httpBatchLink<TRouter extends AnyRouter$1>(opts: HTTPBatchLinkO
|
|
|
30
30
|
|
|
31
31
|
//#endregion
|
|
32
32
|
export { HTTPBatchLinkOptions, httpBatchLink };
|
|
33
|
-
//# sourceMappingURL=httpBatchLink.d-
|
|
33
|
+
//# sourceMappingURL=httpBatchLink.d-CAaMQOtX.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpBatchLink.d-
|
|
1
|
+
{"version":3,"file":"httpBatchLink.d-CAaMQOtX.d.mts","names":[],"sources":["../src/links/HTTPBatchLinkOptions.ts","../src/links/httpBatchLink.ts"],"sourcesContent":[],"mappings":";;;;;;KAKY,mCAAmC,kBAC7C,oBAAoB;;EADV;;;;EACe,OAAzB,CAAA,EAOM,WAPN,GAAA,CAAA,CAAA,IAAA,EAAA;IAOM,MAAA,EAEU,aAFV,CAEwB,SAFxB,CAAA;EAAW,CAAA,EAEa,GAClB,WADkB,GACJ,OADI,CACI,WADJ,CAAA,CAAA;EAAS;;;;EACN,QAAA,CAAA,EAAA,MAAA;;;;;;;;AAXvB,iBCeI,aDfgB,CAAA,gBCec,WDfd,CAAA,CAAA,IAAA,ECgBxB,oBDhBwB,CCgBH,ODhBG,CAAA,MAAA,CAAA,CAAA,SAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,ECiB7B,QDjB6B,CCiBpB,ODjBoB,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { __toESM, require_objectSpread2 } from "./objectSpread2-BvkFp-_Y.mjs";
|
|
2
|
+
import { TRPCClientError } from "./TRPCClientError-CjKyS10w.mjs";
|
|
3
|
+
import { getUrl, httpRequest, jsonHttpRequester, resolveHTTPLinkOptions } from "./httpUtils-Bkv1johT.mjs";
|
|
3
4
|
import { observable } from "@trpc/server/observable";
|
|
4
5
|
import { transformResult } from "@trpc/server/unstable-core-do-not-import";
|
|
5
6
|
|
|
@@ -16,26 +17,25 @@ function isNonJsonSerializable(input) {
|
|
|
16
17
|
|
|
17
18
|
//#endregion
|
|
18
19
|
//#region src/links/httpLink.ts
|
|
20
|
+
var import_objectSpread2 = __toESM(require_objectSpread2(), 1);
|
|
19
21
|
const universalRequester = (opts) => {
|
|
20
22
|
if ("input" in opts) {
|
|
21
23
|
const { input } = opts;
|
|
22
24
|
if (isFormData(input)) {
|
|
23
25
|
if (opts.type !== "mutation" && opts.methodOverride !== "POST") throw new Error("FormData is only supported for mutations");
|
|
24
|
-
return httpRequest({
|
|
25
|
-
...opts,
|
|
26
|
+
return httpRequest((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, opts), {}, {
|
|
26
27
|
contentTypeHeader: void 0,
|
|
27
28
|
getUrl,
|
|
28
29
|
getBody: () => input
|
|
29
|
-
});
|
|
30
|
+
}));
|
|
30
31
|
}
|
|
31
32
|
if (isOctetType(input)) {
|
|
32
33
|
if (opts.type !== "mutation" && opts.methodOverride !== "POST") throw new Error("Octet type input is only supported for mutations");
|
|
33
|
-
return httpRequest({
|
|
34
|
-
...opts,
|
|
34
|
+
return httpRequest((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, opts), {}, {
|
|
35
35
|
contentTypeHeader: "application/octet-stream",
|
|
36
36
|
getUrl,
|
|
37
37
|
getBody: () => input
|
|
38
|
-
});
|
|
38
|
+
}));
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
return jsonHttpRequester(opts);
|
|
@@ -51,8 +51,7 @@ function httpLink(opts) {
|
|
|
51
51
|
const { path, input, type } = op;
|
|
52
52
|
/* istanbul ignore if -- @preserve */
|
|
53
53
|
if (type === "subscription") throw new Error("Subscriptions are unsupported by `httpLink` - use `httpSubscriptionLink` or `wsLink`");
|
|
54
|
-
const request = universalRequester({
|
|
55
|
-
...resolvedOpts,
|
|
54
|
+
const request = universalRequester((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, resolvedOpts), {}, {
|
|
56
55
|
type,
|
|
57
56
|
path,
|
|
58
57
|
input,
|
|
@@ -62,7 +61,7 @@ function httpLink(opts) {
|
|
|
62
61
|
if (typeof opts.headers === "function") return opts.headers({ op });
|
|
63
62
|
return opts.headers;
|
|
64
63
|
}
|
|
65
|
-
});
|
|
64
|
+
}));
|
|
66
65
|
let meta = void 0;
|
|
67
66
|
request.then((res) => {
|
|
68
67
|
meta = res.meta;
|
|
@@ -87,4 +86,4 @@ function httpLink(opts) {
|
|
|
87
86
|
|
|
88
87
|
//#endregion
|
|
89
88
|
export { httpLink, isFormData, isNonJsonSerializable, isOctetType };
|
|
90
|
-
//# sourceMappingURL=httpLink-
|
|
89
|
+
//# sourceMappingURL=httpLink-CYOcG9kQ.mjs.map
|