trpc-uwebsockets 0.9.3 → 0.10.0-proxy-beta.8

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,8 +4,16 @@
4
4
 
5
5
  # Installation
6
6
 
7
+ Version 9
8
+
9
+ ```bash
10
+ yarn add trpc-uwebsockets@^0.9.*
11
+ ```
12
+
13
+ Version 10
14
+
7
15
  ```bash
8
- yarn add trpc-uwebsockets
16
+ yarn add trpc-uwebsockets*
9
17
  ```
10
18
 
11
19
  # Usage
@@ -14,44 +22,48 @@ 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,
47
+ // uWs,
40
48
  user: getUser(),
41
49
  };
42
50
  };
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
- },
51
+ export type Context = inferAsyncReturnType<typeof createContext>;
52
+
53
+ const router = t.router({
54
+ hello: t.procedure
55
+ .input(
56
+ z
57
+ .object({
58
+ who: z.string().nullish(),
59
+ })
60
+ .nullish()
61
+ )
62
+ .query(({ input, ctx }) => {
63
+ return {
64
+ text: `hello ${input?.who ?? ctx.user?.name ?? 'world'}`,
65
+ };
66
+ }),
55
67
  });
56
68
  ```
57
69
 
@@ -78,54 +90,21 @@ app.listen('0.0.0.0', 8000, () => {
78
90
 
79
91
  # API
80
92
 
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
93
  Create context options
113
94
 
114
95
  ```typescript
115
- type UWebSocketsCreateContextOptions = {
96
+ type CreateContextOptions = {
116
97
  /* read-only request information */
117
98
  req: {
118
99
  headers: Record<string, string>;
119
100
  method: 'POST' | 'GET';
120
- query: URLSearchParams;
101
+ query: string;
121
102
  path: string;
122
- getCookies: (opts?: CookieParseOptions) => Record<string, string>;
123
103
  };
124
104
  /* minimal response interface */
125
105
  res: {
126
106
  setStatus(status: number): void;
127
- setHeader(key: string, value: string): void;
128
- setCookie(key: string, value: string, opts?: CookieSerializeOptions): void;
107
+ setHeader(name: string, value: string): void;
129
108
  };
130
109
  /* instance of the uWebSockets server */
131
110
  uWs: TemplatedApp;
@@ -146,5 +125,6 @@ yarn test:watch
146
125
 
147
126
  # Todo
148
127
 
149
- - [ ] Expose batching options (like express adapter)
150
- - [ ] Implement onError handling (like express adapter)
128
+ - [ ] Various improvements (res.tryEnd + reading multiple headers /w same key)
129
+ - [ ] Improve these (remove rollup and many dependencies)
130
+ - [ ] 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
@@ -26,30 +13,31 @@ function readPostBody(method, res) {
26
13
  }
27
14
  let buffer;
28
15
  res.onData((ab, isLast) => {
16
+ //resolve right away if there is only one chunk
17
+ if (buffer === undefined && isLast) {
18
+ resolve({
19
+ ok: true,
20
+ data: Buffer.from(ab).toString(),
21
+ });
22
+ return;
23
+ }
29
24
  const chunk = Buffer.from(ab);
30
- if (isLast) {
31
- if (buffer) {
32
- // large request, with multiple chunks
33
- resolve({
34
- ok: true,
35
- data: buffer.toString(), // do i need utf8?
36
- });
37
- }
38
- else {
39
- // only a single chunk was recieved
40
- resolve({
41
- ok: true,
42
- data: chunk.toString(),
43
- });
44
- }
25
+ if (maxBodySize && buffer.length >= maxBodySize) {
26
+ resolve({
27
+ ok: false,
28
+ error: new server_1.TRPCError({ code: 'PAYLOAD_TOO_LARGE' }),
29
+ });
45
30
  }
46
- else {
47
- if (buffer) {
48
- buffer = Buffer.concat([buffer, chunk]);
49
- }
50
- else {
51
- buffer = Buffer.concat([chunk]);
52
- }
31
+ if (buffer)
32
+ //else accumulate
33
+ buffer = Buffer.concat([buffer, chunk]);
34
+ else
35
+ buffer = Buffer.concat([chunk]);
36
+ if (isLast) {
37
+ resolve({
38
+ ok: true,
39
+ data: buffer.toString(),
40
+ });
53
41
  }
54
42
  });
55
43
  res.onAborted(() => {
@@ -60,5 +48,11 @@ function readPostBody(method, res) {
60
48
  });
61
49
  });
62
50
  }
63
- 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;
64
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;QACnB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE9B,IAAI,MAAM,EAAE;gBACV,IAAI,MAAM,EAAE;oBACV,sCAAsC;oBACtC,OAAO,CAAC;wBACN,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,kBAAkB;qBAC5C,CAAC,CAAC;iBACJ;qBAAM;oBACL,mCAAmC;oBACnC,OAAO,CAAC;wBACN,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE;qBACvB,CAAC,CAAC;iBACJ;aACF;iBAAM;gBACL,IAAI,MAAM,EAAE;oBACV,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;iBACzC;qBAAM;oBACL,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;iBACjC;aACF;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;AA9CD,oCA8CC"}
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.3",
5
+ "version": "0.10.0-proxy-beta.8",
6
6
  "main": "./dist/index.js",
7
7
  "type": "commonjs",
8
8
  "types": "./types/index.d.ts",
@@ -15,7 +15,7 @@
15
15
  "test:coverage": "jest --coverage",
16
16
  "test:publish": "yarn test && yarn build && yarn pack",
17
17
  "prebuild": "yarn clean",
18
- "prepublishOnly": "yarn prettier && yarn lint && yarn build",
18
+ "prepublishOnly": "yarn prettier && yarn lint && yarn test && yarn build",
19
19
  "clean": "rimraf -rf ./dist && rimraf -rf ./types && rimraf -rf ./*-*.tgz",
20
20
  "format": "yarn prettier && yarn lint",
21
21
  "lint": "eslint . --ext .ts --fix",
@@ -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",