@trpc/server 11.4.0 → 11.4.2-canary.1
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/adapters/aws-lambda/index.cjs +49 -42
- package/dist/adapters/aws-lambda/index.mjs +47 -40
- package/dist/adapters/aws-lambda/index.mjs.map +1 -1
- package/dist/adapters/express.cjs +14 -15
- package/dist/adapters/express.mjs +14 -15
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/fastify/index.cjs +27 -28
- package/dist/adapters/fastify/index.mjs +27 -28
- package/dist/adapters/fastify/index.mjs.map +1 -1
- package/dist/adapters/fetch/index.cjs +18 -19
- package/dist/adapters/fetch/index.mjs +18 -19
- package/dist/adapters/fetch/index.mjs.map +1 -1
- package/dist/adapters/next-app-dir.cjs +57 -53
- package/dist/adapters/next-app-dir.mjs +15 -11
- package/dist/adapters/next-app-dir.mjs.map +1 -1
- package/dist/adapters/next.cjs +14 -15
- package/dist/adapters/next.mjs +14 -15
- package/dist/adapters/next.mjs.map +1 -1
- package/dist/adapters/node-http/index.cjs +8 -8
- package/dist/adapters/node-http/index.mjs +8 -8
- package/dist/adapters/standalone.cjs +17 -17
- package/dist/adapters/standalone.mjs +16 -16
- package/dist/adapters/standalone.mjs.map +1 -1
- package/dist/adapters/ws.cjs +10 -10
- package/dist/adapters/ws.mjs +10 -10
- package/dist/getErrorShape-DKiEF6Zc.cjs +339 -0
- package/dist/getErrorShape-Uhlrl4Bk.mjs +263 -0
- package/dist/getErrorShape-Uhlrl4Bk.mjs.map +1 -0
- package/dist/http.cjs +5 -5
- package/dist/http.mjs +5 -5
- package/dist/index.cjs +4 -4
- package/dist/index.mjs +4 -4
- package/dist/{initTRPC-DjEpHmY2.cjs → initTRPC-IT4M4lu3.cjs} +83 -64
- package/dist/{initTRPC-COaJMShh.mjs → initTRPC-IT_6ZYJd.mjs} +84 -65
- package/dist/initTRPC-IT_6ZYJd.mjs.map +1 -0
- package/dist/{node-http-BUQnHuGI.mjs → node-http-Du8akt-R.mjs} +26 -23
- package/dist/{node-http-BUQnHuGI.mjs.map → node-http-Du8akt-R.mjs.map} +1 -1
- package/dist/{node-http-BPR68yI4.cjs → node-http-kIQEhZUH.cjs} +25 -22
- package/dist/observable/index.cjs +2 -2
- package/dist/observable/index.mjs +2 -2
- package/dist/{observable-BwdrSFZU.cjs → observable-B1Nk6r1H.cjs} +7 -4
- package/dist/{observable-C6qq2Ydk.cjs → observable-BVzLuBs6.cjs} +19 -7
- package/dist/{observable-CFXA_tyK.mjs → observable-CUiPknO-.mjs} +20 -8
- package/dist/{observable-CFXA_tyK.mjs.map → observable-CUiPknO-.mjs.map} +1 -1
- package/dist/{observable-B1orLHHI.mjs → observable-UMO3vUa_.mjs} +8 -5
- package/dist/{observable-B1orLHHI.mjs.map → observable-UMO3vUa_.mjs.map} +1 -1
- package/dist/{parseTRPCMessage-CNyYMSRB.mjs → parseTRPCMessage-ByIHyFRz.mjs} +2 -2
- package/dist/{parseTRPCMessage-CNyYMSRB.mjs.map → parseTRPCMessage-ByIHyFRz.mjs.map} +1 -1
- package/dist/{parseTRPCMessage-ByQWigsq.cjs → parseTRPCMessage-snNQop7N.cjs} +1 -1
- package/dist/{resolveResponse-B2CuaT_1.cjs → resolveResponse-CVGbakBm.cjs} +664 -405
- package/dist/{resolveResponse-DPbYgJDD.mjs → resolveResponse-CzlbRpCI.mjs} +660 -389
- package/dist/resolveResponse-CzlbRpCI.mjs.map +1 -0
- package/dist/rpc.cjs +2 -2
- package/dist/rpc.mjs +2 -2
- package/dist/shared.cjs +2 -2
- package/dist/shared.mjs +2 -2
- package/dist/{tracked-Dl9sBZxY.cjs → tracked-HoF8L_mq.cjs} +30 -42
- package/dist/{tracked-GEWPoL0C.mjs → tracked-gU3ttYjg.mjs} +31 -43
- package/dist/{tracked-GEWPoL0C.mjs.map → tracked-gU3ttYjg.mjs.map} +1 -1
- package/dist/unstable-core-do-not-import.cjs +7 -7
- package/dist/unstable-core-do-not-import.mjs +7 -7
- package/dist/{utils-BHZJcBRv.mjs → utils-DdbbrDku.mjs} +1 -1
- package/dist/{utils-BHZJcBRv.mjs.map → utils-DdbbrDku.mjs.map} +1 -1
- package/dist/{ws-C2nEUNk_.cjs → ws-BhrWsMpl.cjs} +37 -26
- package/dist/{ws-eIVIMTrw.mjs → ws-Bn5rkP_I.mjs} +37 -26
- package/dist/{ws-eIVIMTrw.mjs.map → ws-Bn5rkP_I.mjs.map} +1 -1
- package/package.json +62 -62
- package/dist/getErrorShape-CsikfkAc.cjs +0 -201
- package/dist/getErrorShape-DyYil4aT.mjs +0 -149
- package/dist/getErrorShape-DyYil4aT.mjs.map +0 -1
- package/dist/initTRPC-COaJMShh.mjs.map +0 -1
- package/dist/resolveResponse-DPbYgJDD.mjs.map +0 -1
- /package/dist/{utils-DVO6HZiR.cjs → utils-BhNVZA-c.cjs} +0 -0
|
@@ -1,67 +1,66 @@
|
|
|
1
|
-
const
|
|
2
|
-
require('../../
|
|
3
|
-
require('../../
|
|
4
|
-
require('../../
|
|
5
|
-
require('../../
|
|
1
|
+
const require_getErrorShape = require('../../getErrorShape-DKiEF6Zc.cjs');
|
|
2
|
+
require('../../tracked-HoF8L_mq.cjs');
|
|
3
|
+
require('../../utils-BhNVZA-c.cjs');
|
|
4
|
+
require('../../parseTRPCMessage-snNQop7N.cjs');
|
|
5
|
+
const require_resolveResponse = require('../../resolveResponse-CVGbakBm.cjs');
|
|
6
6
|
require('../../contentTypeParsers-iAFF_pJG.cjs');
|
|
7
7
|
require('../../unstable-core-do-not-import-DFQys1IC.cjs');
|
|
8
|
-
require('../../observable-
|
|
9
|
-
require('../../initTRPC-
|
|
8
|
+
require('../../observable-B1Nk6r1H.cjs');
|
|
9
|
+
require('../../initTRPC-IT4M4lu3.cjs');
|
|
10
10
|
require('../../http-DXy3XyhL.cjs');
|
|
11
|
-
const require_node_http = require('../../node-http-
|
|
12
|
-
require('../../observable-
|
|
13
|
-
const require_ws = require('../../ws-
|
|
11
|
+
const require_node_http = require('../../node-http-kIQEhZUH.cjs');
|
|
12
|
+
require('../../observable-BVzLuBs6.cjs');
|
|
13
|
+
const require_ws = require('../../ws-BhrWsMpl.cjs');
|
|
14
14
|
|
|
15
15
|
//#region src/adapters/fastify/fastifyRequestHandler.ts
|
|
16
|
+
var import_objectSpread2$1 = require_getErrorShape.__toESM(require_getErrorShape.require_objectSpread2(), 1);
|
|
16
17
|
async function fastifyRequestHandler(opts) {
|
|
17
18
|
const createContext = async (innerOpts) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
...innerOpts
|
|
21
|
-
});
|
|
19
|
+
var _opts$createContext;
|
|
20
|
+
return await ((_opts$createContext = opts.createContext) === null || _opts$createContext === void 0 ? void 0 : _opts$createContext.call(opts, (0, import_objectSpread2$1.default)((0, import_objectSpread2$1.default)({}, opts), innerOpts)));
|
|
22
21
|
};
|
|
23
22
|
const incomingMessage = opts.req.raw;
|
|
24
23
|
if ("body" in opts.req) incomingMessage.body = opts.req.body;
|
|
25
24
|
const req = require_node_http.incomingMessageToRequest(incomingMessage, opts.res.raw, { maxBodySize: null });
|
|
26
|
-
const res = await require_resolveResponse.resolveResponse({
|
|
27
|
-
...opts,
|
|
25
|
+
const res = await require_resolveResponse.resolveResponse((0, import_objectSpread2$1.default)((0, import_objectSpread2$1.default)({}, opts), {}, {
|
|
28
26
|
req,
|
|
29
27
|
error: null,
|
|
30
28
|
createContext,
|
|
31
29
|
onError(o) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
req: opts.req
|
|
35
|
-
});
|
|
30
|
+
var _opts$onError;
|
|
31
|
+
opts === null || opts === void 0 || (_opts$onError = opts.onError) === null || _opts$onError === void 0 || _opts$onError.call(opts, (0, import_objectSpread2$1.default)((0, import_objectSpread2$1.default)({}, o), {}, { req: opts.req }));
|
|
36
32
|
}
|
|
37
|
-
});
|
|
33
|
+
}));
|
|
38
34
|
await opts.res.send(res);
|
|
39
35
|
}
|
|
40
36
|
|
|
41
37
|
//#endregion
|
|
42
38
|
//#region src/adapters/fastify/fastifyTRPCPlugin.ts
|
|
39
|
+
var import_objectSpread2 = require_getErrorShape.__toESM(require_getErrorShape.require_objectSpread2(), 1);
|
|
43
40
|
function fastifyTRPCPlugin(fastify, opts, done) {
|
|
41
|
+
var _opts$prefix;
|
|
44
42
|
fastify.removeContentTypeParser("application/json");
|
|
45
43
|
fastify.addContentTypeParser("application/json", { parseAs: "string" }, function(_, body, _done) {
|
|
46
44
|
_done(null, body);
|
|
47
45
|
});
|
|
48
|
-
let prefix = opts.prefix
|
|
46
|
+
let prefix = (_opts$prefix = opts.prefix) !== null && _opts$prefix !== void 0 ? _opts$prefix : "";
|
|
49
47
|
if (typeof fastifyTRPCPlugin.default !== "function") prefix = "";
|
|
50
48
|
fastify.all(`${prefix}/:path`, async (req, res) => {
|
|
51
49
|
const path = req.params.path;
|
|
52
|
-
await fastifyRequestHandler({
|
|
53
|
-
...opts.trpcOptions,
|
|
50
|
+
await fastifyRequestHandler((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, opts.trpcOptions), {}, {
|
|
54
51
|
req,
|
|
55
52
|
res,
|
|
56
53
|
path
|
|
57
|
-
});
|
|
54
|
+
}));
|
|
58
55
|
});
|
|
59
56
|
if (opts.useWSS) {
|
|
57
|
+
var _prefix;
|
|
60
58
|
const trpcOptions = opts.trpcOptions;
|
|
61
|
-
const onConnection = require_ws.getWSConnectionHandler({
|
|
62
|
-
fastify.get(prefix
|
|
59
|
+
const onConnection = require_ws.getWSConnectionHandler((0, import_objectSpread2.default)({}, trpcOptions));
|
|
60
|
+
fastify.get((_prefix = prefix) !== null && _prefix !== void 0 ? _prefix : "/", { websocket: true }, (socket, req) => {
|
|
61
|
+
var _trpcOptions$keepAliv;
|
|
63
62
|
onConnection(socket, req.raw);
|
|
64
|
-
if (trpcOptions
|
|
63
|
+
if (trpcOptions === null || trpcOptions === void 0 || (_trpcOptions$keepAliv = trpcOptions.keepAlive) === null || _trpcOptions$keepAliv === void 0 ? void 0 : _trpcOptions$keepAliv.enabled) {
|
|
65
64
|
const { pingMs, pongWaitMs } = trpcOptions.keepAlive;
|
|
66
65
|
require_ws.handleKeepAlive(socket, pingMs, pongWaitMs);
|
|
67
66
|
}
|
|
@@ -1,67 +1,66 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "../../
|
|
3
|
-
import "../../
|
|
4
|
-
import "../../
|
|
5
|
-
import "../../
|
|
1
|
+
import { __toESM, require_objectSpread2 } from "../../getErrorShape-Uhlrl4Bk.mjs";
|
|
2
|
+
import "../../tracked-gU3ttYjg.mjs";
|
|
3
|
+
import "../../utils-DdbbrDku.mjs";
|
|
4
|
+
import "../../parseTRPCMessage-ByIHyFRz.mjs";
|
|
5
|
+
import { resolveResponse } from "../../resolveResponse-CzlbRpCI.mjs";
|
|
6
6
|
import "../../contentTypeParsers-SN4WL9ze.mjs";
|
|
7
7
|
import "../../unstable-core-do-not-import-D89CaGtL.mjs";
|
|
8
|
-
import "../../observable-
|
|
9
|
-
import "../../initTRPC-
|
|
8
|
+
import "../../observable-UMO3vUa_.mjs";
|
|
9
|
+
import "../../initTRPC-IT_6ZYJd.mjs";
|
|
10
10
|
import "../../http-CWyjOa1l.mjs";
|
|
11
|
-
import { incomingMessageToRequest } from "../../node-http-
|
|
12
|
-
import "../../observable-
|
|
13
|
-
import { getWSConnectionHandler, handleKeepAlive } from "../../ws-
|
|
11
|
+
import { incomingMessageToRequest } from "../../node-http-Du8akt-R.mjs";
|
|
12
|
+
import "../../observable-CUiPknO-.mjs";
|
|
13
|
+
import { getWSConnectionHandler, handleKeepAlive } from "../../ws-Bn5rkP_I.mjs";
|
|
14
14
|
|
|
15
15
|
//#region src/adapters/fastify/fastifyRequestHandler.ts
|
|
16
|
+
var import_objectSpread2$1 = __toESM(require_objectSpread2(), 1);
|
|
16
17
|
async function fastifyRequestHandler(opts) {
|
|
17
18
|
const createContext = async (innerOpts) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
...innerOpts
|
|
21
|
-
});
|
|
19
|
+
var _opts$createContext;
|
|
20
|
+
return await ((_opts$createContext = opts.createContext) === null || _opts$createContext === void 0 ? void 0 : _opts$createContext.call(opts, (0, import_objectSpread2$1.default)((0, import_objectSpread2$1.default)({}, opts), innerOpts)));
|
|
22
21
|
};
|
|
23
22
|
const incomingMessage = opts.req.raw;
|
|
24
23
|
if ("body" in opts.req) incomingMessage.body = opts.req.body;
|
|
25
24
|
const req = incomingMessageToRequest(incomingMessage, opts.res.raw, { maxBodySize: null });
|
|
26
|
-
const res = await resolveResponse({
|
|
27
|
-
...opts,
|
|
25
|
+
const res = await resolveResponse((0, import_objectSpread2$1.default)((0, import_objectSpread2$1.default)({}, opts), {}, {
|
|
28
26
|
req,
|
|
29
27
|
error: null,
|
|
30
28
|
createContext,
|
|
31
29
|
onError(o) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
req: opts.req
|
|
35
|
-
});
|
|
30
|
+
var _opts$onError;
|
|
31
|
+
opts === null || opts === void 0 || (_opts$onError = opts.onError) === null || _opts$onError === void 0 || _opts$onError.call(opts, (0, import_objectSpread2$1.default)((0, import_objectSpread2$1.default)({}, o), {}, { req: opts.req }));
|
|
36
32
|
}
|
|
37
|
-
});
|
|
33
|
+
}));
|
|
38
34
|
await opts.res.send(res);
|
|
39
35
|
}
|
|
40
36
|
|
|
41
37
|
//#endregion
|
|
42
38
|
//#region src/adapters/fastify/fastifyTRPCPlugin.ts
|
|
39
|
+
var import_objectSpread2 = __toESM(require_objectSpread2(), 1);
|
|
43
40
|
function fastifyTRPCPlugin(fastify, opts, done) {
|
|
41
|
+
var _opts$prefix;
|
|
44
42
|
fastify.removeContentTypeParser("application/json");
|
|
45
43
|
fastify.addContentTypeParser("application/json", { parseAs: "string" }, function(_, body, _done) {
|
|
46
44
|
_done(null, body);
|
|
47
45
|
});
|
|
48
|
-
let prefix = opts.prefix
|
|
46
|
+
let prefix = (_opts$prefix = opts.prefix) !== null && _opts$prefix !== void 0 ? _opts$prefix : "";
|
|
49
47
|
if (typeof fastifyTRPCPlugin.default !== "function") prefix = "";
|
|
50
48
|
fastify.all(`${prefix}/:path`, async (req, res) => {
|
|
51
49
|
const path = req.params.path;
|
|
52
|
-
await fastifyRequestHandler({
|
|
53
|
-
...opts.trpcOptions,
|
|
50
|
+
await fastifyRequestHandler((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, opts.trpcOptions), {}, {
|
|
54
51
|
req,
|
|
55
52
|
res,
|
|
56
53
|
path
|
|
57
|
-
});
|
|
54
|
+
}));
|
|
58
55
|
});
|
|
59
56
|
if (opts.useWSS) {
|
|
57
|
+
var _prefix;
|
|
60
58
|
const trpcOptions = opts.trpcOptions;
|
|
61
|
-
const onConnection = getWSConnectionHandler({
|
|
62
|
-
fastify.get(prefix
|
|
59
|
+
const onConnection = getWSConnectionHandler((0, import_objectSpread2.default)({}, trpcOptions));
|
|
60
|
+
fastify.get((_prefix = prefix) !== null && _prefix !== void 0 ? _prefix : "/", { websocket: true }, (socket, req) => {
|
|
61
|
+
var _trpcOptions$keepAliv;
|
|
63
62
|
onConnection(socket, req.raw);
|
|
64
|
-
if (trpcOptions
|
|
63
|
+
if (trpcOptions === null || trpcOptions === void 0 || (_trpcOptions$keepAliv = trpcOptions.keepAlive) === null || _trpcOptions$keepAliv === void 0 ? void 0 : _trpcOptions$keepAliv.enabled) {
|
|
65
64
|
const { pingMs, pongWaitMs } = trpcOptions.keepAlive;
|
|
66
65
|
handleKeepAlive(socket, pingMs, pongWaitMs);
|
|
67
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["opts: FastifyRequestHandlerOptions<TRouter, TRequest, TResponse>","createContext: ResolveHTTPRequestOptionsContextFn<TRouter>","incomingMessage: NodeHTTPRequest","fastify: FastifyInstance","opts: FastifyTRPCPluginOptions<TRouter>","done: (err?: Error) => void"],"sources":["../../../src/adapters/fastify/fastifyRequestHandler.ts","../../../src/adapters/fastify/fastifyTRPCPlugin.ts"],"sourcesContent":["/**\n * If you're making an adapter for tRPC and looking at this file for reference, you should import types and functions from `@trpc/server` and `@trpc/server/http`\n *\n * @example\n * ```ts\n * import type { AnyTRPCRouter } from '@trpc/server'\n * import type { HTTPBaseHandlerOptions } from '@trpc/server/http'\n * ```\n */\nimport type { FastifyReply, FastifyRequest } from 'fastify';\n// @trpc/server\nimport type { AnyRouter } from '../../@trpc/server';\n// @trpc/server/http\nimport {\n resolveResponse,\n type HTTPBaseHandlerOptions,\n type ResolveHTTPRequestOptionsContextFn,\n} from '../../@trpc/server/http';\n// @trpc/server/node-http\nimport type { NodeHTTPRequest } from '../node-http';\nimport {\n incomingMessageToRequest,\n type NodeHTTPCreateContextOption,\n} from '../node-http';\n\nexport type FastifyHandlerOptions<\n TRouter extends AnyRouter,\n TRequest extends FastifyRequest,\n TResponse extends FastifyReply,\n> = HTTPBaseHandlerOptions<TRouter, TRequest> &\n NodeHTTPCreateContextOption<TRouter, TRequest, TResponse>;\n\ntype FastifyRequestHandlerOptions<\n TRouter extends AnyRouter,\n TRequest extends FastifyRequest,\n TResponse extends FastifyReply,\n> = FastifyHandlerOptions<TRouter, TRequest, TResponse> & {\n req: TRequest;\n res: TResponse;\n path: string;\n};\n\nexport async function fastifyRequestHandler<\n TRouter extends AnyRouter,\n TRequest extends FastifyRequest,\n TResponse extends FastifyReply,\n>(opts: FastifyRequestHandlerOptions<TRouter, TRequest, TResponse>) {\n const createContext: ResolveHTTPRequestOptionsContextFn<TRouter> = async (\n innerOpts,\n ) => {\n return await opts.createContext?.({\n ...opts,\n ...innerOpts,\n });\n };\n\n const incomingMessage: NodeHTTPRequest = opts.req.raw;\n\n // monkey-path body to the IncomingMessage\n if ('body' in opts.req) {\n incomingMessage.body = opts.req.body;\n }\n const req = incomingMessageToRequest(incomingMessage, opts.res.raw, {\n maxBodySize: null,\n });\n\n const res = await resolveResponse({\n ...opts,\n req,\n error: null,\n createContext,\n onError(o) {\n opts?.onError?.({\n ...o,\n req: opts.req,\n });\n },\n });\n\n await opts.res.send(res);\n}\n","/**\n * If you're making an adapter for tRPC and looking at this file for reference, you should import types and functions from `@trpc/server` and `@trpc/server/http`\n *\n * @example\n * ```ts\n * import type { AnyTRPCRouter } from '@trpc/server'\n * import type { HTTPBaseHandlerOptions } from '@trpc/server/http'\n * ```\n */\n/// <reference types=\"@fastify/websocket\" />\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';\n// @trpc/server\nimport type { AnyRouter } from '../../@trpc/server';\n// @trpc/server/http\nimport type { NodeHTTPCreateContextFnOptions } from '../node-http';\n// @trpc/server/ws\nimport {\n getWSConnectionHandler,\n handleKeepAlive,\n type WSSHandlerOptions,\n} from '../ws';\nimport type { FastifyHandlerOptions } from './fastifyRequestHandler';\nimport { fastifyRequestHandler } from './fastifyRequestHandler';\n\nexport interface FastifyTRPCPluginOptions<TRouter extends AnyRouter> {\n prefix?: string;\n useWSS?: boolean;\n trpcOptions: FastifyHandlerOptions<TRouter, FastifyRequest, FastifyReply>;\n}\n\nexport type CreateFastifyContextOptions = NodeHTTPCreateContextFnOptions<\n FastifyRequest,\n FastifyReply\n>;\n\nexport function fastifyTRPCPlugin<TRouter extends AnyRouter>(\n fastify: FastifyInstance,\n opts: FastifyTRPCPluginOptions<TRouter>,\n done: (err?: Error) => void,\n) {\n fastify.removeContentTypeParser('application/json');\n fastify.addContentTypeParser(\n 'application/json',\n { parseAs: 'string' },\n function (_, body, _done) {\n _done(null, body);\n },\n );\n\n let prefix = opts.prefix ?? '';\n\n // https://github.com/fastify/fastify-plugin/blob/fe079bef6557a83794bf437e14b9b9edb8a74104/plugin.js#L11\n // @ts-expect-error property 'default' does not exists on type ...\n if (typeof fastifyTRPCPlugin.default !== 'function') {\n prefix = ''; // handled by fastify internally\n }\n\n fastify.all(`${prefix}/:path`, async (req, res) => {\n const path = (req.params as any).path;\n await fastifyRequestHandler({ ...opts.trpcOptions, req, res, path });\n });\n\n if (opts.useWSS) {\n const trpcOptions =\n opts.trpcOptions as unknown as WSSHandlerOptions<TRouter>;\n\n const onConnection = getWSConnectionHandler<TRouter>({\n ...trpcOptions,\n });\n\n fastify.get(prefix ?? '/', { websocket: true }, (socket, req) => {\n onConnection(socket, req.raw);\n if (trpcOptions?.keepAlive?.enabled) {\n const { pingMs, pongWaitMs } = trpcOptions.keepAlive;\n handleKeepAlive(socket, pingMs, pongWaitMs);\n }\n });\n }\n\n done();\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["opts: FastifyRequestHandlerOptions<TRouter, TRequest, TResponse>","createContext: ResolveHTTPRequestOptionsContextFn<TRouter>","incomingMessage: NodeHTTPRequest","fastify: FastifyInstance","opts: FastifyTRPCPluginOptions<TRouter>","done: (err?: Error) => void"],"sources":["../../../src/adapters/fastify/fastifyRequestHandler.ts","../../../src/adapters/fastify/fastifyTRPCPlugin.ts"],"sourcesContent":["/**\n * If you're making an adapter for tRPC and looking at this file for reference, you should import types and functions from `@trpc/server` and `@trpc/server/http`\n *\n * @example\n * ```ts\n * import type { AnyTRPCRouter } from '@trpc/server'\n * import type { HTTPBaseHandlerOptions } from '@trpc/server/http'\n * ```\n */\nimport type { FastifyReply, FastifyRequest } from 'fastify';\n// @trpc/server\nimport type { AnyRouter } from '../../@trpc/server';\n// @trpc/server/http\nimport {\n resolveResponse,\n type HTTPBaseHandlerOptions,\n type ResolveHTTPRequestOptionsContextFn,\n} from '../../@trpc/server/http';\n// @trpc/server/node-http\nimport type { NodeHTTPRequest } from '../node-http';\nimport {\n incomingMessageToRequest,\n type NodeHTTPCreateContextOption,\n} from '../node-http';\n\nexport type FastifyHandlerOptions<\n TRouter extends AnyRouter,\n TRequest extends FastifyRequest,\n TResponse extends FastifyReply,\n> = HTTPBaseHandlerOptions<TRouter, TRequest> &\n NodeHTTPCreateContextOption<TRouter, TRequest, TResponse>;\n\ntype FastifyRequestHandlerOptions<\n TRouter extends AnyRouter,\n TRequest extends FastifyRequest,\n TResponse extends FastifyReply,\n> = FastifyHandlerOptions<TRouter, TRequest, TResponse> & {\n req: TRequest;\n res: TResponse;\n path: string;\n};\n\nexport async function fastifyRequestHandler<\n TRouter extends AnyRouter,\n TRequest extends FastifyRequest,\n TResponse extends FastifyReply,\n>(opts: FastifyRequestHandlerOptions<TRouter, TRequest, TResponse>) {\n const createContext: ResolveHTTPRequestOptionsContextFn<TRouter> = async (\n innerOpts,\n ) => {\n return await opts.createContext?.({\n ...opts,\n ...innerOpts,\n });\n };\n\n const incomingMessage: NodeHTTPRequest = opts.req.raw;\n\n // monkey-path body to the IncomingMessage\n if ('body' in opts.req) {\n incomingMessage.body = opts.req.body;\n }\n const req = incomingMessageToRequest(incomingMessage, opts.res.raw, {\n maxBodySize: null,\n });\n\n const res = await resolveResponse({\n ...opts,\n req,\n error: null,\n createContext,\n onError(o) {\n opts?.onError?.({\n ...o,\n req: opts.req,\n });\n },\n });\n\n await opts.res.send(res);\n}\n","/**\n * If you're making an adapter for tRPC and looking at this file for reference, you should import types and functions from `@trpc/server` and `@trpc/server/http`\n *\n * @example\n * ```ts\n * import type { AnyTRPCRouter } from '@trpc/server'\n * import type { HTTPBaseHandlerOptions } from '@trpc/server/http'\n * ```\n */\n/// <reference types=\"@fastify/websocket\" />\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';\n// @trpc/server\nimport type { AnyRouter } from '../../@trpc/server';\n// @trpc/server/http\nimport type { NodeHTTPCreateContextFnOptions } from '../node-http';\n// @trpc/server/ws\nimport {\n getWSConnectionHandler,\n handleKeepAlive,\n type WSSHandlerOptions,\n} from '../ws';\nimport type { FastifyHandlerOptions } from './fastifyRequestHandler';\nimport { fastifyRequestHandler } from './fastifyRequestHandler';\n\nexport interface FastifyTRPCPluginOptions<TRouter extends AnyRouter> {\n prefix?: string;\n useWSS?: boolean;\n trpcOptions: FastifyHandlerOptions<TRouter, FastifyRequest, FastifyReply>;\n}\n\nexport type CreateFastifyContextOptions = NodeHTTPCreateContextFnOptions<\n FastifyRequest,\n FastifyReply\n>;\n\nexport function fastifyTRPCPlugin<TRouter extends AnyRouter>(\n fastify: FastifyInstance,\n opts: FastifyTRPCPluginOptions<TRouter>,\n done: (err?: Error) => void,\n) {\n fastify.removeContentTypeParser('application/json');\n fastify.addContentTypeParser(\n 'application/json',\n { parseAs: 'string' },\n function (_, body, _done) {\n _done(null, body);\n },\n );\n\n let prefix = opts.prefix ?? '';\n\n // https://github.com/fastify/fastify-plugin/blob/fe079bef6557a83794bf437e14b9b9edb8a74104/plugin.js#L11\n // @ts-expect-error property 'default' does not exists on type ...\n if (typeof fastifyTRPCPlugin.default !== 'function') {\n prefix = ''; // handled by fastify internally\n }\n\n fastify.all(`${prefix}/:path`, async (req, res) => {\n const path = (req.params as any).path;\n await fastifyRequestHandler({ ...opts.trpcOptions, req, res, path });\n });\n\n if (opts.useWSS) {\n const trpcOptions =\n opts.trpcOptions as unknown as WSSHandlerOptions<TRouter>;\n\n const onConnection = getWSConnectionHandler<TRouter>({\n ...trpcOptions,\n });\n\n fastify.get(prefix ?? '/', { websocket: true }, (socket, req) => {\n onConnection(socket, req.raw);\n if (trpcOptions?.keepAlive?.enabled) {\n const { pingMs, pongWaitMs } = trpcOptions.keepAlive;\n handleKeepAlive(socket, pingMs, pongWaitMs);\n }\n });\n }\n\n done();\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA0CA,eAAsB,sBAIpBA,MAAkE;CAClE,MAAMC,gBAA6D,OACjE,cACG;;AACH,SAAO,8BAAM,KAAK,qEAAL,2GACR,OACA,WACH;CACH;CAED,MAAMC,kBAAmC,KAAK,IAAI;AAGlD,KAAI,UAAU,KAAK,IACjB,iBAAgB,OAAO,KAAK,IAAI;CAElC,MAAM,MAAM,yBAAyB,iBAAiB,KAAK,IAAI,KAAK,EAClE,aAAa,KACd,EAAC;CAEF,MAAM,MAAM,MAAM,4FACb;EACH;EACA,OAAO;EACP;EACA,QAAQ,GAAG;;AACT,6DAAM,iDAAN,qGACK,UACH,KAAK,KAAK,OACV;EACH;IACD;AAEF,OAAM,KAAK,IAAI,KAAK,IAAI;AACzB;;;;;AC7CD,SAAgB,kBACdC,SACAC,MACAC,MACA;;AACA,SAAQ,wBAAwB,mBAAmB;AACnD,SAAQ,qBACN,oBACA,EAAE,SAAS,SAAU,GACrB,SAAU,GAAG,MAAM,OAAO;AACxB,QAAM,MAAM,KAAK;CAClB,EACF;CAED,IAAI,yBAAS,KAAK,6DAAU;AAI5B,YAAW,kBAAkB,YAAY,WACvC,UAAS;AAGX,SAAQ,KAAK,EAAE,OAAO,SAAS,OAAO,KAAK,QAAQ;EACjD,MAAM,OAAQ,IAAI,OAAe;AACjC,QAAM,8FAA2B,KAAK;GAAa;GAAK;GAAK;KAAO;CACrE,EAAC;AAEF,KAAI,KAAK,QAAQ;;EACf,MAAM,cACJ,KAAK;EAEP,MAAM,eAAe,6DAChB,aACH;AAEF,UAAQ,eAAI,mDAAU,KAAK,EAAE,WAAW,KAAM,GAAE,CAAC,QAAQ,QAAQ;;AAC/D,gBAAa,QAAQ,IAAI,IAAI;AAC7B,kFAAI,YAAa,yFAAW,SAAS;IACnC,MAAM,EAAE,QAAQ,YAAY,GAAG,YAAY;AAC3C,oBAAgB,QAAQ,QAAQ,WAAW;GAC5C;EACF,EAAC;CACH;AAED,OAAM;AACP"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
const
|
|
2
|
-
require('../../
|
|
3
|
-
require('../../
|
|
4
|
-
require('../../
|
|
5
|
-
require('../../observable-
|
|
1
|
+
const require_getErrorShape = require('../../getErrorShape-DKiEF6Zc.cjs');
|
|
2
|
+
require('../../tracked-HoF8L_mq.cjs');
|
|
3
|
+
require('../../utils-BhNVZA-c.cjs');
|
|
4
|
+
const require_resolveResponse = require('../../resolveResponse-CVGbakBm.cjs');
|
|
5
|
+
require('../../observable-B1Nk6r1H.cjs');
|
|
6
6
|
|
|
7
7
|
//#region src/adapters/fetch/fetchRequestHandler.ts
|
|
8
|
+
var import_objectSpread2 = require_getErrorShape.__toESM(require_getErrorShape.require_objectSpread2(), 1);
|
|
8
9
|
const trimSlashes = (path) => {
|
|
9
10
|
path = path.startsWith("/") ? path.slice(1) : path;
|
|
10
11
|
path = path.endsWith("/") ? path.slice(0, -1) : path;
|
|
@@ -13,31 +14,29 @@ const trimSlashes = (path) => {
|
|
|
13
14
|
async function fetchRequestHandler(opts) {
|
|
14
15
|
const resHeaders = new Headers();
|
|
15
16
|
const createContext = async (innerOpts) => {
|
|
16
|
-
|
|
17
|
+
var _opts$createContext;
|
|
18
|
+
return (_opts$createContext = opts.createContext) === null || _opts$createContext === void 0 ? void 0 : _opts$createContext.call(opts, (0, import_objectSpread2.default)({
|
|
17
19
|
req: opts.req,
|
|
18
|
-
resHeaders
|
|
19
|
-
|
|
20
|
-
});
|
|
20
|
+
resHeaders
|
|
21
|
+
}, innerOpts));
|
|
21
22
|
};
|
|
22
23
|
const url = new URL(opts.req.url);
|
|
23
24
|
const pathname = trimSlashes(url.pathname);
|
|
24
25
|
const endpoint = trimSlashes(opts.endpoint);
|
|
25
26
|
const path = trimSlashes(pathname.slice(endpoint.length));
|
|
26
|
-
return await require_resolveResponse.resolveResponse({
|
|
27
|
-
...opts,
|
|
27
|
+
return await require_resolveResponse.resolveResponse((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, opts), {}, {
|
|
28
28
|
req: opts.req,
|
|
29
29
|
createContext,
|
|
30
30
|
path,
|
|
31
31
|
error: null,
|
|
32
32
|
onError(o) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
req: opts.req
|
|
36
|
-
});
|
|
33
|
+
var _opts$onError;
|
|
34
|
+
opts === null || opts === void 0 || (_opts$onError = opts.onError) === null || _opts$onError === void 0 || _opts$onError.call(opts, (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, o), {}, { req: opts.req }));
|
|
37
35
|
},
|
|
38
36
|
responseMeta(data) {
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
var _opts$responseMeta;
|
|
38
|
+
const meta = (_opts$responseMeta = opts.responseMeta) === null || _opts$responseMeta === void 0 ? void 0 : _opts$responseMeta.call(opts, data);
|
|
39
|
+
if (meta === null || meta === void 0 ? void 0 : meta.headers) {
|
|
41
40
|
if (meta.headers instanceof Headers) for (const [key, value] of meta.headers.entries()) resHeaders.append(key, value);
|
|
42
41
|
else
|
|
43
42
|
/**
|
|
@@ -48,10 +47,10 @@ async function fetchRequestHandler(opts) {
|
|
|
48
47
|
}
|
|
49
48
|
return {
|
|
50
49
|
headers: resHeaders,
|
|
51
|
-
status: meta
|
|
50
|
+
status: meta === null || meta === void 0 ? void 0 : meta.status
|
|
52
51
|
};
|
|
53
52
|
}
|
|
54
|
-
});
|
|
53
|
+
}));
|
|
55
54
|
}
|
|
56
55
|
|
|
57
56
|
//#endregion
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "../../
|
|
3
|
-
import "../../
|
|
4
|
-
import "../../
|
|
5
|
-
import "../../observable-
|
|
1
|
+
import { __toESM, require_objectSpread2 } from "../../getErrorShape-Uhlrl4Bk.mjs";
|
|
2
|
+
import "../../tracked-gU3ttYjg.mjs";
|
|
3
|
+
import "../../utils-DdbbrDku.mjs";
|
|
4
|
+
import { resolveResponse } from "../../resolveResponse-CzlbRpCI.mjs";
|
|
5
|
+
import "../../observable-UMO3vUa_.mjs";
|
|
6
6
|
|
|
7
7
|
//#region src/adapters/fetch/fetchRequestHandler.ts
|
|
8
|
+
var import_objectSpread2 = __toESM(require_objectSpread2(), 1);
|
|
8
9
|
const trimSlashes = (path) => {
|
|
9
10
|
path = path.startsWith("/") ? path.slice(1) : path;
|
|
10
11
|
path = path.endsWith("/") ? path.slice(0, -1) : path;
|
|
@@ -13,31 +14,29 @@ const trimSlashes = (path) => {
|
|
|
13
14
|
async function fetchRequestHandler(opts) {
|
|
14
15
|
const resHeaders = new Headers();
|
|
15
16
|
const createContext = async (innerOpts) => {
|
|
16
|
-
|
|
17
|
+
var _opts$createContext;
|
|
18
|
+
return (_opts$createContext = opts.createContext) === null || _opts$createContext === void 0 ? void 0 : _opts$createContext.call(opts, (0, import_objectSpread2.default)({
|
|
17
19
|
req: opts.req,
|
|
18
|
-
resHeaders
|
|
19
|
-
|
|
20
|
-
});
|
|
20
|
+
resHeaders
|
|
21
|
+
}, innerOpts));
|
|
21
22
|
};
|
|
22
23
|
const url = new URL(opts.req.url);
|
|
23
24
|
const pathname = trimSlashes(url.pathname);
|
|
24
25
|
const endpoint = trimSlashes(opts.endpoint);
|
|
25
26
|
const path = trimSlashes(pathname.slice(endpoint.length));
|
|
26
|
-
return await resolveResponse({
|
|
27
|
-
...opts,
|
|
27
|
+
return await resolveResponse((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, opts), {}, {
|
|
28
28
|
req: opts.req,
|
|
29
29
|
createContext,
|
|
30
30
|
path,
|
|
31
31
|
error: null,
|
|
32
32
|
onError(o) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
req: opts.req
|
|
36
|
-
});
|
|
33
|
+
var _opts$onError;
|
|
34
|
+
opts === null || opts === void 0 || (_opts$onError = opts.onError) === null || _opts$onError === void 0 || _opts$onError.call(opts, (0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, o), {}, { req: opts.req }));
|
|
37
35
|
},
|
|
38
36
|
responseMeta(data) {
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
var _opts$responseMeta;
|
|
38
|
+
const meta = (_opts$responseMeta = opts.responseMeta) === null || _opts$responseMeta === void 0 ? void 0 : _opts$responseMeta.call(opts, data);
|
|
39
|
+
if (meta === null || meta === void 0 ? void 0 : meta.headers) {
|
|
41
40
|
if (meta.headers instanceof Headers) for (const [key, value] of meta.headers.entries()) resHeaders.append(key, value);
|
|
42
41
|
else
|
|
43
42
|
/**
|
|
@@ -48,10 +47,10 @@ async function fetchRequestHandler(opts) {
|
|
|
48
47
|
}
|
|
49
48
|
return {
|
|
50
49
|
headers: resHeaders,
|
|
51
|
-
status: meta
|
|
50
|
+
status: meta === null || meta === void 0 ? void 0 : meta.status
|
|
52
51
|
};
|
|
53
52
|
}
|
|
54
|
-
});
|
|
53
|
+
}));
|
|
55
54
|
}
|
|
56
55
|
|
|
57
56
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["path: string","opts: FetchHandlerRequestOptions<TRouter>","createContext: ResolveHTTPRequestOptionsContextFn<TRouter>"],"sources":["../../../src/adapters/fetch/fetchRequestHandler.ts"],"sourcesContent":["/**\n * If you're making an adapter for tRPC and looking at this file for reference, you should import types and functions from `@trpc/server` and `@trpc/server/http`\n *\n * @example\n * ```ts\n * import type { AnyTRPCRouter } from '@trpc/server'\n * import type { HTTPBaseHandlerOptions } from '@trpc/server/http'\n * ```\n */\n// @trpc/server\n\nimport type { AnyRouter } from '../../@trpc/server';\nimport type { ResolveHTTPRequestOptionsContextFn } from '../../@trpc/server/http';\nimport { resolveResponse } from '../../@trpc/server/http';\nimport type { FetchHandlerRequestOptions } from './types';\n\nconst trimSlashes = (path: string): string => {\n path = path.startsWith('/') ? path.slice(1) : path;\n path = path.endsWith('/') ? path.slice(0, -1) : path;\n\n return path;\n};\n\nexport async function fetchRequestHandler<TRouter extends AnyRouter>(\n opts: FetchHandlerRequestOptions<TRouter>,\n): Promise<Response> {\n const resHeaders = new Headers();\n\n const createContext: ResolveHTTPRequestOptionsContextFn<TRouter> = async (\n innerOpts,\n ) => {\n return opts.createContext?.({ req: opts.req, resHeaders, ...innerOpts });\n };\n\n const url = new URL(opts.req.url);\n\n const pathname = trimSlashes(url.pathname);\n const endpoint = trimSlashes(opts.endpoint);\n const path = trimSlashes(pathname.slice(endpoint.length));\n\n return await resolveResponse({\n ...opts,\n req: opts.req,\n createContext,\n path,\n error: null,\n onError(o) {\n opts?.onError?.({ ...o, req: opts.req });\n },\n responseMeta(data) {\n const meta = opts.responseMeta?.(data);\n\n if (meta?.headers) {\n if (meta.headers instanceof Headers) {\n for (const [key, value] of meta.headers.entries()) {\n resHeaders.append(key, value);\n }\n } else {\n /**\n * @deprecated, delete in v12\n */\n for (const [key, value] of Object.entries(meta.headers)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n resHeaders.append(key, v);\n }\n } else if (typeof value === 'string') {\n resHeaders.set(key, value);\n }\n }\n }\n }\n\n return {\n headers: resHeaders,\n status: meta?.status,\n };\n },\n });\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["path: string","opts: FetchHandlerRequestOptions<TRouter>","createContext: ResolveHTTPRequestOptionsContextFn<TRouter>"],"sources":["../../../src/adapters/fetch/fetchRequestHandler.ts"],"sourcesContent":["/**\n * If you're making an adapter for tRPC and looking at this file for reference, you should import types and functions from `@trpc/server` and `@trpc/server/http`\n *\n * @example\n * ```ts\n * import type { AnyTRPCRouter } from '@trpc/server'\n * import type { HTTPBaseHandlerOptions } from '@trpc/server/http'\n * ```\n */\n// @trpc/server\n\nimport type { AnyRouter } from '../../@trpc/server';\nimport type { ResolveHTTPRequestOptionsContextFn } from '../../@trpc/server/http';\nimport { resolveResponse } from '../../@trpc/server/http';\nimport type { FetchHandlerRequestOptions } from './types';\n\nconst trimSlashes = (path: string): string => {\n path = path.startsWith('/') ? path.slice(1) : path;\n path = path.endsWith('/') ? path.slice(0, -1) : path;\n\n return path;\n};\n\nexport async function fetchRequestHandler<TRouter extends AnyRouter>(\n opts: FetchHandlerRequestOptions<TRouter>,\n): Promise<Response> {\n const resHeaders = new Headers();\n\n const createContext: ResolveHTTPRequestOptionsContextFn<TRouter> = async (\n innerOpts,\n ) => {\n return opts.createContext?.({ req: opts.req, resHeaders, ...innerOpts });\n };\n\n const url = new URL(opts.req.url);\n\n const pathname = trimSlashes(url.pathname);\n const endpoint = trimSlashes(opts.endpoint);\n const path = trimSlashes(pathname.slice(endpoint.length));\n\n return await resolveResponse({\n ...opts,\n req: opts.req,\n createContext,\n path,\n error: null,\n onError(o) {\n opts?.onError?.({ ...o, req: opts.req });\n },\n responseMeta(data) {\n const meta = opts.responseMeta?.(data);\n\n if (meta?.headers) {\n if (meta.headers instanceof Headers) {\n for (const [key, value] of meta.headers.entries()) {\n resHeaders.append(key, value);\n }\n } else {\n /**\n * @deprecated, delete in v12\n */\n for (const [key, value] of Object.entries(meta.headers)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n resHeaders.append(key, v);\n }\n } else if (typeof value === 'string') {\n resHeaders.set(key, value);\n }\n }\n }\n }\n\n return {\n headers: resHeaders,\n status: meta?.status,\n };\n },\n });\n}\n"],"mappings":";;;;;;;;AAgBA,MAAM,cAAc,CAACA,SAAyB;AAC5C,QAAO,KAAK,WAAW,IAAI,GAAG,KAAK,MAAM,EAAE,GAAG;AAC9C,QAAO,KAAK,SAAS,IAAI,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG;AAEhD,QAAO;AACR;AAED,eAAsB,oBACpBC,MACmB;CACnB,MAAM,aAAa,IAAI;CAEvB,MAAMC,gBAA6D,OACjE,cACG;;AACH,gCAAO,KAAK,qEAAL;GAAuB,KAAK,KAAK;GAAK;KAAe,WAAY;CACzE;CAED,MAAM,MAAM,IAAI,IAAI,KAAK,IAAI;CAE7B,MAAM,WAAW,YAAY,IAAI,SAAS;CAC1C,MAAM,WAAW,YAAY,KAAK,SAAS;CAC3C,MAAM,OAAO,YAAY,SAAS,MAAM,SAAS,OAAO,CAAC;AAEzD,QAAO,MAAM,wFACR;EACH,KAAK,KAAK;EACV;EACA;EACA,OAAO;EACP,QAAQ,GAAG;;AACT,6DAAM,iDAAN,iGAAqB,UAAG,KAAK,KAAK,OAAM;EACzC;EACD,aAAa,MAAM;;GACjB,MAAM,6BAAO,KAAK,mEAAL,8BAAoB,KAAK;AAEtC,mDAAI,KAAM,SACR;QAAI,KAAK,mBAAmB,QAC1B,MAAK,MAAM,CAAC,KAAK,MAAM,IAAI,KAAK,QAAQ,SAAS,CAC/C,YAAW,OAAO,KAAK,MAAM;;;;;AAM/B,SAAK,MAAM,CAAC,KAAK,MAAM,IAAI,OAAO,QAAQ,KAAK,QAAQ,CACrD,KAAI,MAAM,QAAQ,MAAM,CACtB,MAAK,MAAM,KAAK,MACd,YAAW,OAAO,KAAK,EAAE;oBAEX,UAAU,SAC1B,YAAW,IAAI,KAAK,MAAM;GAG/B;AAGH,UAAO;IACL,SAAS;IACT,oDAAQ,KAAM;GACf;EACF;IACD;AACH"}
|