trpc-uwebsockets 0.9.4 → 0.10.0-proxy-beta.10

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/README.md CHANGED
@@ -4,6 +4,14 @@
4
4
 
5
5
  # Installation
6
6
 
7
+ To use old, stable version 9
8
+
9
+ ```bash
10
+ yarn add trpc-uwebsockets@^0.9.*
11
+ ```
12
+
13
+ To use version 10 beta run
14
+
7
15
  ```bash
8
16
  yarn add trpc-uwebsockets
9
17
  ```
@@ -14,44 +22,47 @@ Import needed packages
14
22
 
15
23
  ```typescript
16
24
  import { App } from 'uWebSockets.js';
17
- import * as trpc from '@trpc/server';
25
+ import { inferAsyncReturnType, initTRPC } from '@trpc/server';
26
+ import { CreateContextOptions } from 'trpc-uwebsockets';
18
27
  import z from 'zod';
19
28
  ```
20
29
 
21
- Define tRPC context and router
30
+ Define tRPC, context, and router
22
31
 
23
32
  ```typescript
24
- type Context = {
25
- user: {
26
- name: string;
27
- } | null;
28
- };
33
+ const t = initTRPC.context<Context>().create();
29
34
 
30
- const createContext = (opts: UWebSocketsContextOptions): Context => {
35
+ const createContext = ({ req, res }: CreateContextOptions) => {
31
36
  const getUser = () => {
32
- if (opts?.req.headers.authorization) {
33
- // const user = await decodeJwtToken(req.headers.authorization.split(' ')[1])
34
- // return user;
37
+ if (req.headers.authorization === 'meow') {
38
+ return {
39
+ name: 'KATT',
40
+ };
35
41
  }
36
42
  return null;
37
43
  };
38
-
39
44
  return {
45
+ req,
46
+ res,
40
47
  user: getUser(),
41
48
  };
42
49
  };
43
-
44
- const router = trpc.router<Context>().query('hello', {
45
- input: z
46
- .object({
47
- who: z.string().nullish(),
48
- })
49
- .nullish(),
50
- resolve({ input, ctx }) {
51
- return {
52
- text: `hello ${input?.who ?? ctx.user?.name ?? 'world'}`,
53
- };
54
- },
50
+ export type Context = inferAsyncReturnType<typeof createContext>;
51
+
52
+ const router = t.router({
53
+ hello: t.procedure
54
+ .input(
55
+ z
56
+ .object({
57
+ who: z.string().nullish(),
58
+ })
59
+ .nullish()
60
+ )
61
+ .query(({ input, ctx }) => {
62
+ return {
63
+ text: `hello ${input?.who ?? ctx.user?.name ?? 'world'}`,
64
+ };
65
+ }),
55
66
  });
56
67
  ```
57
68
 
@@ -78,57 +89,22 @@ app.listen('0.0.0.0', 8000, () => {
78
89
 
79
90
  # API
80
91
 
81
- Create uWebSockets handler options
82
-
83
- ```typescript
84
- function createUWebSocketsHandler<TRouter extends AnyRouter>(
85
- /* instance of the uWebSockets server */
86
- uWsApp: TemplatedApp,
87
- /* Path to trpc without trailing slash (ex: "/trpc") */
88
- pathPrefix: string,
89
- /* Handler options */
90
- opts: UWebSocketsCreateHandlerOptions<TRouter>
91
- );
92
- ```
93
-
94
- Handler options
95
-
96
- ```typescript
97
- type UWebSocketsCreateHandlerOptions<TRouter extends AnyRouter> = {
98
- /* trpc router */
99
- router: TRouter;
100
- /* optional create context */
101
- createContext?: (
102
- opts: UWebSocketsCreateContextOptions
103
- ) => Promise<inferRouterContext<TRouter>> | inferRouterContext<TRouter>;
104
- /* optional pre-request handler. Useful for dealing with CORS, or sending extra headers */
105
- onRequest?: (
106
- req: UWebSocketsRequestObject,
107
- res: UWebSocketsResponseObject
108
- ) => void;
109
- };
110
- ```
111
-
112
92
  Create context options
113
93
 
114
94
  ```typescript
115
- type UWebSocketsCreateContextOptions = {
95
+ type CreateContextOptions = {
116
96
  /* read-only request information */
117
97
  req: {
118
98
  headers: Record<string, string>;
119
99
  method: 'POST' | 'GET';
120
- query: URLSearchParams;
100
+ query: string;
121
101
  path: string;
122
- getCookies: (opts?: CookieParseOptions) => Record<string, string>;
123
102
  };
124
- /* minimal response interface */
103
+ /* minimal response interface, useful for setting cookies */
125
104
  res: {
126
105
  setStatus(status: number): void;
127
- setHeader(key: string, value: string): void;
128
- setCookie(key: string, value: string, opts?: CookieSerializeOptions): void;
106
+ setHeader(name: string, value: string): void;
129
107
  };
130
- /* instance of the uWebSockets server */
131
- uWs: TemplatedApp;
132
108
  };
133
109
  ```
134
110
 
@@ -146,5 +122,6 @@ yarn test:watch
146
122
 
147
123
  # Todo
148
124
 
149
- - [ ] Expose batching options (like express adapter)
150
- - [ ] Implement onError handling (like express adapter)
125
+ - [ ] Various improvements (res.tryEnd + reading multiple headers /w same key)
126
+ - [ ] Improve these (remove rollup and many dependencies)
127
+ - [ ] Subscription support with websockets
package/dist/index.js CHANGED
@@ -1,146 +1,41 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- var __importDefault = (this && this.__importDefault) || function (mod) {
17
- return (mod && mod.__esModule) ? mod : { "default": mod };
18
- };
19
2
  Object.defineProperty(exports, "__esModule", { value: true });
20
3
  exports.createUWebSocketsHandler = void 0;
21
- const server_1 = require("@trpc/server");
22
- const utils_1 = require("./utils");
23
- const cookie_1 = __importDefault(require("cookie"));
24
- __exportStar(require("./types"), exports);
4
+ const requestHandler_1 = require("./requestHandler");
5
+ // export * from './types';
25
6
  /**
26
7
  * @param uWsApp uWebsockets server instance
27
- * @param pathPrefix The path to trpc without trailing slash (ex: "/trpc")
8
+ * @param prefix The path to trpc without trailing slash (ex: "/trpc")
28
9
  * @param opts handler options
29
10
  */
30
- function createUWebSocketsHandler(uWsApp, pathPrefix, opts) {
31
- const prefixTrimLength = pathPrefix.length + 1; // remove /* from url
32
- const handler = async (res, req) => {
11
+ function createUWebSocketsHandler(uWsApp, prefix, opts) {
12
+ const prefixTrimLength = prefix.length + 1; // remove /* from url
13
+ const handler = (res, req) => {
33
14
  const method = req.getMethod().toUpperCase();
34
- if (method !== 'GET' && method !== 'POST') {
35
- // handle only get and post requests, while the rest
36
- // will not be captured and propagated further
37
- req.setYield(true);
38
- return;
39
- }
40
- const path = req.getUrl().substring(prefixTrimLength);
41
- const query = new URLSearchParams(decodeURIComponent(req.getQuery()));
15
+ const url = req.getUrl().substring(prefixTrimLength);
16
+ const query = req.getQuery();
42
17
  const headers = {};
43
18
  req.forEach((key, value) => {
19
+ // TODO handle headers with the same key, potential issue
44
20
  headers[key] = value;
45
21
  });
46
22
  // new request object needs to be created, because socket
47
23
  // can only be accessed synchronously, after await it cannot be accessed
48
- const request = {
24
+ const wrappedReq = {
49
25
  headers,
50
26
  method,
51
27
  query,
52
- path,
53
- getCookies: (0, utils_1.getCookieFn)(headers),
28
+ url,
54
29
  };
55
- const resOverride = {
56
- headers: new Map(),
57
- cookies: [],
58
- status: 0,
59
- };
60
- const response = {
61
- setCookie: (name, value, opts) => {
62
- const serialized = cookie_1.default.serialize(name, value, opts); //.substring(12); //remove the "Set-Cookie: "
63
- resOverride.cookies.push(serialized);
64
- },
65
- setStatus: (status) => {
66
- resOverride.status = status;
67
- },
68
- setHeader: (key, value) => {
69
- resOverride.headers.set(key, value);
70
- },
71
- };
72
- const bodyResult = await (0, utils_1.readPostBody)(method, res);
73
- // req is no longer available!
74
- const createContext = async function _() {
75
- //res could be proxied here
76
- return await opts.createContext?.({
77
- uWs: uWsApp,
78
- req: request,
79
- res: response,
80
- });
81
- };
82
- const internalReqObj = {
83
- method,
84
- headers,
85
- query,
86
- body: bodyResult.ok ? bodyResult.data : undefined,
87
- };
88
- // TODO batching, onError options need implementation.
89
- const result = await (0, server_1.resolveHTTPResponse)({
90
- path,
91
- createContext,
92
- router: opts.router,
93
- req: internalReqObj,
94
- error: bodyResult.ok ? null : bodyResult.error,
95
- });
96
- // user returned already, do nothing
97
- res.cork(() => {
98
- if (resOverride.status != 0) {
99
- res.writeStatus(resOverride.status.toString());
100
- }
101
- else if ('status' in result) {
102
- res.writeStatus(result.status.toString());
103
- }
104
- else {
105
- // assume something went bad, should never happen?
106
- throw new Error('No status to send');
107
- // res.writeStatus('500 INTERNAL SERVER ERROR');
108
- // res.end();
109
- // return;
110
- }
111
- if (opts.onRequest)
112
- opts.onRequest(request, response);
113
- //send all cookies
114
- resOverride.cookies.forEach((value) => {
115
- res.writeHeader('Set-Cookie', value);
116
- });
117
- resOverride.headers.forEach((value, key) => {
118
- res.writeHeader(key, value);
119
- });
120
- for (const [key, value] of Object.entries(result.headers ?? {})) {
121
- if (typeof value === 'undefined') {
122
- continue;
123
- }
124
- // make sure to never override user defined headers
125
- // cookies are an exception
126
- if (resOverride.headers.has(key))
127
- continue;
128
- // not sure why it could be an array. This code path is not tested
129
- // maybe its duplicates for the same key? like multiple "Set-Cookie"
130
- if (Array.isArray(value))
131
- value.forEach((header) => {
132
- res.writeHeader(key, header);
133
- });
134
- else
135
- res.writeHeader(key, value);
136
- }
137
- //now send user headers
138
- if (result.body)
139
- res.write(result.body);
140
- res.end();
30
+ (0, requestHandler_1.uWsHTTPRequestHandler)({
31
+ req: wrappedReq,
32
+ uRes: res,
33
+ path: url,
34
+ ...opts,
141
35
  });
142
36
  };
143
- uWsApp.any(pathPrefix + '/*', handler);
37
+ uWsApp.get(prefix + '/*', handler);
38
+ uWsApp.post(prefix + '/*', handler);
144
39
  }
145
40
  exports.createUWebSocketsHandler = createUWebSocketsHandler;
146
41
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAIA,qDAAyD;AAQzD,2BAA2B;AAE3B;;;;GAIG;AACH,SAAgB,wBAAwB,CACtC,MAAoB,EACpB,MAAc,EACd,IAAkC;IAElC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,qBAAqB;IAEjE,MAAM,OAAO,GAAG,CAAC,GAAiB,EAAE,GAAgB,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,WAAW,EAAoB,CAAC;QAC/D,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAE7B,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACzB,yDAAyD;YACzD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,yDAAyD;QACzD,wEAAwE;QACxE,MAAM,UAAU,GAAuB;YACrC,OAAO;YACP,MAAM;YACN,KAAK;YACL,GAAG;SACJ,CAAC;QAEF,IAAA,sCAAqB,EAAC;YACpB,GAAG,EAAE,UAAU;YACf,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,GAAG;YACT,GAAG,IAAI;SACR,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AApCD,4DAoCC"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uWsHTTPRequestHandler = void 0;
4
+ const server_1 = require("@trpc/server");
5
+ const utils_1 = require("./utils");
6
+ async function uWsHTTPRequestHandler(opts) {
7
+ const resOverride = {
8
+ headers: [],
9
+ status: 0,
10
+ };
11
+ const wrappedRes = {
12
+ setStatus: (status) => {
13
+ resOverride.status = status;
14
+ },
15
+ setHeader: (name, value) => {
16
+ resOverride.headers.push({ name, value });
17
+ // resOverride.headers.set(key, value);
18
+ },
19
+ };
20
+ const createContext = async function _createContext() {
21
+ return await opts.createContext?.({
22
+ req: opts.req,
23
+ res: wrappedRes,
24
+ });
25
+ };
26
+ const { path, router, uRes, req } = opts;
27
+ let aborted = false;
28
+ uRes.onAborted(() => {
29
+ // console.log('request was aborted');
30
+ aborted = true;
31
+ });
32
+ const bodyResult = await (0, utils_1.getPostBody)(req.method, uRes, opts.maxBodySize);
33
+ const query = new URLSearchParams(opts.req.query);
34
+ const requestObj = {
35
+ method: opts.req.method,
36
+ headers: opts.req.headers,
37
+ query,
38
+ body: bodyResult.ok ? bodyResult.data : undefined,
39
+ };
40
+ const result = await (0, server_1.resolveHTTPResponse)({
41
+ batching: opts.batching,
42
+ responseMeta: opts.responseMeta,
43
+ path,
44
+ createContext,
45
+ router,
46
+ req: requestObj,
47
+ error: bodyResult.ok ? null : bodyResult.error,
48
+ onError(o) {
49
+ opts?.onError?.({
50
+ ...o,
51
+ req: opts.req,
52
+ });
53
+ },
54
+ });
55
+ if (aborted) {
56
+ // TODO check this behavior
57
+ return;
58
+ }
59
+ uRes.cork(() => {
60
+ // if ('status' in result && (!res.statusCode || res.statusCode === 200)) {
61
+ if (resOverride.status > 0) {
62
+ uRes.writeStatus(resOverride.status.toString()); // TODO convert code to actual message
63
+ }
64
+ if ('status' in result) {
65
+ uRes.writeStatus(result.status.toString());
66
+ }
67
+ //send our manual headers
68
+ resOverride.headers.forEach((h) => {
69
+ uRes.writeHeader(h.name, h.value);
70
+ });
71
+ for (const [key, value] of Object.entries(result.headers ?? {})) {
72
+ if (typeof value === 'undefined') {
73
+ continue;
74
+ }
75
+ if (Array.isArray(value))
76
+ value.forEach((v) => {
77
+ uRes.writeHeader(key, v);
78
+ });
79
+ else
80
+ uRes.writeHeader(key, value);
81
+ }
82
+ (0, utils_1.sendResponse)(uRes, result.body);
83
+ });
84
+ }
85
+ exports.uWsHTTPRequestHandler = uWsHTTPRequestHandler;
86
+ //# sourceMappingURL=requestHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestHandler.js","sourceRoot":"","sources":["../src/requestHandler.ts"],"names":[],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -1,21 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.readPostBody = exports.getCookieFn = void 0;
3
+ exports.sendResponse = exports.getPostBody = void 0;
7
4
  const server_1 = require("@trpc/server");
8
- const cookie_1 = __importDefault(require("cookie"));
9
- /*
10
- cookie: 'cookie1=abc; cookie2=d.e'
11
- */
12
- const getCookieFn = (headers) => (opts) => {
13
- if (!('cookie' in headers))
14
- return {};
15
- return cookie_1.default.parse(headers.cookie, opts);
16
- };
17
- exports.getCookieFn = getCookieFn;
18
- function readPostBody(method, res) {
5
+ function getPostBody(method, res, maxBodySize) {
19
6
  return new Promise((resolve) => {
20
7
  if (method == 'GET') {
21
8
  // no body in get request
@@ -35,8 +22,14 @@ function readPostBody(method, res) {
35
22
  return;
36
23
  }
37
24
  const chunk = Buffer.from(ab);
38
- //else accumulate
25
+ if (maxBodySize && buffer.length >= maxBodySize) {
26
+ resolve({
27
+ ok: false,
28
+ error: new server_1.TRPCError({ code: 'PAYLOAD_TOO_LARGE' }),
29
+ });
30
+ }
39
31
  if (buffer)
32
+ //else accumulate
40
33
  buffer = Buffer.concat([buffer, chunk]);
41
34
  else
42
35
  buffer = Buffer.concat([chunk]);
@@ -55,5 +48,11 @@ function readPostBody(method, res) {
55
48
  });
56
49
  });
57
50
  }
58
- exports.readPostBody = readPostBody;
51
+ exports.getPostBody = getPostBody;
52
+ // FIXME buffer the output with tryEnd instead
53
+ // https://github.com/uNetworking/uWebSockets.js/blob/master/examples/VideoStreamer.js
54
+ function sendResponse(res, payload) {
55
+ res.end(payload);
56
+ }
57
+ exports.sendResponse = sendResponse;
59
58
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAyC;AAEzC,oDAAoD;AACpD;;EAEE;AAEK,MAAM,WAAW,GACtB,CAAC,OAA+B,EAAE,EAAE,CAAC,CAAC,IAAyB,EAAE,EAAE;IACjE,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,OAAO,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC,CAAC;AALS,QAAA,WAAW,eAKpB;AAEJ,SAAgB,YAAY,CAAC,MAAc,EAAE,GAAiB;IAC5D,OAAO,IAAI,OAAO,CAEhB,CAAC,OAAO,EAAE,EAAE;QACZ,IAAI,MAAM,IAAI,KAAK,EAAE;YACnB,yBAAyB;YACzB,OAAO,CAAC;gBACN,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;SACJ;QAED,IAAI,MAAc,CAAC;QAEnB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;YACxB,+CAA+C;YAC/C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,EAAE;gBAClC,OAAO,CAAC;oBACN,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;iBACjC,CAAC,CAAC;gBACH,OAAO;aACR;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE9B,iBAAiB;YACjB,IAAI,MAAM;gBAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;;gBAC/C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAErC,IAAI,MAAM,EAAE;gBACV,OAAO,CAAC;oBACN,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;iBACxB,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,OAAO,CAAC;gBACN,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;aACxD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AA7CD,oCA6CC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAOA,yCAAoD;AAEpD,SAAgB,WAAW,CAIzB,MAAM,EAAE,GAAiB,EAAE,WAAoB;IAC/C,OAAO,IAAI,OAAO,CAEhB,CAAC,OAAO,EAAE,EAAE;QACZ,IAAI,MAAM,IAAI,KAAK,EAAE;YACnB,yBAAyB;YACzB,OAAO,CAAC;gBACN,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;SACJ;QAED,IAAI,MAAc,CAAC;QAEnB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;YACxB,+CAA+C;YAC/C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,EAAE;gBAClC,OAAO,CAAC;oBACN,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;iBACjC,CAAC,CAAC;gBACH,OAAO;aACR;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE9B,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,IAAI,WAAW,EAAE;gBAC/C,OAAO,CAAC;oBACN,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;iBACpD,CAAC,CAAC;aACJ;YACD,IAAI,MAAM;gBACR,iBAAiB;gBACjB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;;gBACrC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAErC,IAAI,MAAM,EAAE;gBACV,OAAO,CAAC;oBACN,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;iBACxB,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,OAAO,CAAC;gBACN,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;aACxD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAxDD,kCAwDC;AAED,8CAA8C;AAC9C,sFAAsF;AACtF,SAAgB,YAAY,CAAC,GAAiB,EAAE,OAAgB;IAC9D,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAFD,oCAEC"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "private": false,
3
3
  "name": "trpc-uwebsockets",
4
4
  "description": "tRPC adapter for uWebSockets.js server",
5
- "version": "0.9.4",
5
+ "version": "0.10.0-proxy-beta.10",
6
6
  "main": "./dist/index.js",
7
7
  "type": "commonjs",
8
8
  "types": "./types/index.d.ts",
@@ -24,18 +24,18 @@
24
24
  "prettier:dry": "prettier --config .prettierrc 'src/**/*.ts'"
25
25
  },
26
26
  "dependencies": {
27
- "@trpc/server": "^9.26.2",
28
- "cookie": "^0.5.0",
27
+ "@trpc/server": "^10.0.0-proxy-beta.10",
29
28
  "uWebSockets.js": "uNetworking/uWebSockets.js#v20.10.0"
30
29
  },
31
30
  "devDependencies": {
32
31
  "@rollup/plugin-typescript": "^8.3.3",
33
32
  "@swc/core": "^1.2.215",
34
33
  "@swc/jest": "^0.2.21",
35
- "@trpc/client": "^9.26.2",
34
+ "@trpc/client": "^10.0.0-proxy-beta.10",
36
35
  "@types/cookie": "^0.5.1",
37
36
  "@types/jest": "^28.1.6",
38
37
  "@types/node": "^18.0.6",
38
+ "@types/node-fetch": "^2.6.2",
39
39
  "@types/webrtc": "^0.0.32",
40
40
  "@typescript-eslint/eslint-plugin": "^5.30.6",
41
41
  "@typescript-eslint/parser": "^5.30.6",