trpc-uwebsockets 0.9.1 → 0.9.4

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
@@ -78,6 +78,37 @@ app.listen('0.0.0.0', 8000, () => {
78
78
 
79
79
  # API
80
80
 
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
+
81
112
  Create context options
82
113
 
83
114
  ```typescript
@@ -90,7 +121,7 @@ type UWebSocketsCreateContextOptions = {
90
121
  path: string;
91
122
  getCookies: (opts?: CookieParseOptions) => Record<string, string>;
92
123
  };
93
- /* */
124
+ /* minimal response interface */
94
125
  res: {
95
126
  setStatus(status: number): void;
96
127
  setHeader(key: string, value: string): void;
package/dist/index.js CHANGED
@@ -23,10 +23,9 @@ const utils_1 = require("./utils");
23
23
  const cookie_1 = __importDefault(require("cookie"));
24
24
  __exportStar(require("./types"), exports);
25
25
  /**
26
- *
27
26
  * @param uWsApp uWebsockets server instance
28
- * @param pathPrefix The path to endpoint without trailing slash (ex: "/trpc")
29
- * @param opts router and createContext options
27
+ * @param pathPrefix The path to trpc without trailing slash (ex: "/trpc")
28
+ * @param opts handler options
30
29
  */
31
30
  function createUWebSocketsHandler(uWsApp, pathPrefix, opts) {
32
31
  const prefixTrimLength = pathPrefix.length + 1; // remove /* from url
@@ -109,6 +108,8 @@ function createUWebSocketsHandler(uWsApp, pathPrefix, opts) {
109
108
  // res.end();
110
109
  // return;
111
110
  }
111
+ if (opts.onRequest)
112
+ opts.onRequest(request, response);
112
113
  //send all cookies
113
114
  resOverride.cookies.forEach((value) => {
114
115
  res.writeHeader('Set-Cookie', value);
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":"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"}
package/dist/utils.js CHANGED
@@ -26,30 +26,25 @@ function readPostBody(method, res) {
26
26
  }
27
27
  let buffer;
28
28
  res.onData((ab, isLast) => {
29
+ //resolve right away if there is only one chunk
30
+ if (buffer === undefined && isLast) {
31
+ resolve({
32
+ ok: true,
33
+ data: Buffer.from(ab).toString(),
34
+ });
35
+ return;
36
+ }
29
37
  const chunk = Buffer.from(ab);
38
+ //else accumulate
39
+ if (buffer)
40
+ buffer = Buffer.concat([buffer, chunk]);
41
+ else
42
+ buffer = Buffer.concat([chunk]);
30
43
  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
- }
45
- }
46
- else {
47
- if (buffer) {
48
- buffer = Buffer.concat([buffer, chunk]);
49
- }
50
- else {
51
- buffer = Buffer.concat([chunk]);
52
- }
44
+ resolve({
45
+ ok: true,
46
+ data: buffer.toString(),
47
+ });
53
48
  }
54
49
  });
55
50
  res.onAborted(() => {
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":";;;;;;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"}
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.1",
5
+ "version": "0.9.4",
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",
package/src/index.ts CHANGED
@@ -4,15 +4,10 @@ import {
4
4
  resolveHTTPResponse,
5
5
  } from '@trpc/server';
6
6
  import { HTTPRequest } from '@trpc/server/dist/declarations/src/http/internals/types';
7
- import { CookieParseOptions, CookieSerializeOptions } from 'cookie';
8
- import type {
9
- HttpRequest,
10
- HttpResponse,
11
- RecognizedString,
12
- TemplatedApp,
13
- } from 'uWebSockets.js';
7
+ import { CookieSerializeOptions } from 'cookie';
8
+ import type { HttpRequest, HttpResponse, TemplatedApp } from 'uWebSockets.js';
14
9
  import {
15
- UWebSocketsRegisterEndpointOptions as UWebSocketsCreateHandlerOptions,
10
+ UWebSocketsCreateHandlerOptions,
16
11
  UWebSocketsRequestObject,
17
12
  UWebSocketsResponseObject,
18
13
  } from './types';
@@ -21,10 +16,9 @@ import cookie from 'cookie';
21
16
  export * from './types';
22
17
 
23
18
  /**
24
- *
25
19
  * @param uWsApp uWebsockets server instance
26
- * @param pathPrefix The path to endpoint without trailing slash (ex: "/trpc")
27
- * @param opts router and createContext options
20
+ * @param pathPrefix The path to trpc without trailing slash (ex: "/trpc")
21
+ * @param opts handler options
28
22
  */
29
23
  export function createUWebSocketsHandler<TRouter extends AnyRouter>(
30
24
  uWsApp: TemplatedApp,
@@ -41,6 +35,7 @@ export function createUWebSocketsHandler<TRouter extends AnyRouter>(
41
35
  req.setYield(true);
42
36
  return;
43
37
  }
38
+
44
39
  const path = req.getUrl().substring(prefixTrimLength);
45
40
  const query = new URLSearchParams(decodeURIComponent(req.getQuery()));
46
41
 
@@ -128,6 +123,8 @@ export function createUWebSocketsHandler<TRouter extends AnyRouter>(
128
123
  // return;
129
124
  }
130
125
 
126
+ if (opts.onRequest) opts.onRequest(request, response);
127
+
131
128
  //send all cookies
132
129
  resOverride.cookies.forEach((value) => {
133
130
  res.writeHeader('Set-Cookie', value);
package/src/types.ts CHANGED
@@ -1,11 +1,19 @@
1
1
  import { AnyRouter, inferRouterContext } from '@trpc/server';
2
- import { TemplatedApp } from 'uWebSockets.js';
2
+ import { HttpRequest, HttpResponse, TemplatedApp } from 'uWebSockets.js';
3
3
  import { CookieParseOptions, CookieSerializeOptions } from 'cookie';
4
- export type UWebSocketsRegisterEndpointOptions<TRouter extends AnyRouter> = {
4
+
5
+ export type UWebSocketsCreateHandlerOptions<TRouter extends AnyRouter> = {
6
+ /* trpc router */
5
7
  router: TRouter;
8
+ /* optional create context */
6
9
  createContext?: (
7
10
  opts: UWebSocketsCreateContextOptions
8
11
  ) => Promise<inferRouterContext<TRouter>> | inferRouterContext<TRouter>;
12
+ /* optional pre-request handler. Useful for dealing with CORS */
13
+ onRequest?: (
14
+ req: UWebSocketsRequestObject,
15
+ res: UWebSocketsResponseObject
16
+ ) => void;
9
17
  };
10
18
 
11
19
  export type UWebSocketsRequestObject = {
package/src/utils.ts CHANGED
@@ -25,29 +25,28 @@ export function readPostBody(method: string, res: HttpResponse) {
25
25
  }
26
26
 
27
27
  let buffer: Buffer;
28
+
28
29
  res.onData((ab, isLast) => {
30
+ //resolve right away if there is only one chunk
31
+ if (buffer === undefined && isLast) {
32
+ resolve({
33
+ ok: true,
34
+ data: Buffer.from(ab).toString(),
35
+ });
36
+ return;
37
+ }
38
+
29
39
  const chunk = Buffer.from(ab);
30
40
 
41
+ //else accumulate
42
+ if (buffer) buffer = Buffer.concat([buffer, chunk]);
43
+ else buffer = Buffer.concat([chunk]);
44
+
31
45
  if (isLast) {
32
- if (buffer) {
33
- // large request, with multiple chunks
34
- resolve({
35
- ok: true,
36
- data: buffer.toString(), // do i need utf8?
37
- });
38
- } else {
39
- // only a single chunk was recieved
40
- resolve({
41
- ok: true,
42
- data: chunk.toString(),
43
- });
44
- }
45
- } else {
46
- if (buffer) {
47
- buffer = Buffer.concat([buffer, chunk]);
48
- } else {
49
- buffer = Buffer.concat([chunk]);
50
- }
46
+ resolve({
47
+ ok: true,
48
+ data: buffer.toString(),
49
+ });
51
50
  }
52
51
  });
53
52
 
@@ -27,13 +27,23 @@ function makeRouter() {
27
27
  },
28
28
  })
29
29
  .query('error', {
30
- resolve() {
30
+ async resolve() {
31
31
  throw new TRPCError({
32
32
  code: 'BAD_REQUEST',
33
33
  message: 'error as expected',
34
34
  });
35
35
  },
36
36
  })
37
+ .mutation('long-payload', {
38
+ input: z.object({
39
+ ping: z.any(),
40
+ }),
41
+ async resolve({ input }) {
42
+ return {
43
+ pong: input.ping,
44
+ };
45
+ },
46
+ })
37
47
  .mutation('test', {
38
48
  input: z.object({
39
49
  value: z.string(),
@@ -114,6 +124,11 @@ async function startServer() {
114
124
  // need to register everything on the app object,
115
125
  // as uWebSockets does not have middleware
116
126
  createUWebSocketsHandler(app, '/trpc', {
127
+ // onRequest: (req, res) => {
128
+ // // allows for prerequest handling
129
+ // const origin = req.headers.origin ?? '*';
130
+ // res.setHeader('Access-Control-Allow-Origin', origin);
131
+ // },
117
132
  router: makeRouter(),
118
133
  createContext: makeContext(),
119
134
  });
@@ -232,6 +247,19 @@ test('setting cookies and headers', async () => {
232
247
  expect(monsterRes.headers.get('x-spooked')).toEqual('true');
233
248
  });
234
249
 
250
+ test('long payload', async () => {
251
+ const client = makeClient({});
252
+ const data = [...Array(50000)].map((x) => 0);
253
+
254
+ expect(
255
+ await client.mutation('long-payload', {
256
+ ping: data,
257
+ })
258
+ ).toEqual({
259
+ pong: data,
260
+ });
261
+ });
262
+
235
263
  test('error handling', async () => {
236
264
  const indexRes = await fetch(`http://localhost:${testPort}`);
237
265
  expect(indexRes.status).toEqual(200);
package/types/index.d.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  import { AnyRouter } from '@trpc/server';
2
2
  import type { TemplatedApp } from 'uWebSockets.js';
3
- import { UWebSocketsRegisterEndpointOptions as UWebSocketsCreateHandlerOptions } from './types';
3
+ import { UWebSocketsCreateHandlerOptions } from './types';
4
4
  export * from './types';
5
5
  /**
6
- *
7
6
  * @param uWsApp uWebsockets server instance
8
- * @param pathPrefix The path to endpoint without trailing slash (ex: "/trpc")
9
- * @param opts router and createContext options
7
+ * @param pathPrefix The path to trpc without trailing slash (ex: "/trpc")
8
+ * @param opts handler options
10
9
  */
11
10
  export declare function createUWebSocketsHandler<TRouter extends AnyRouter>(uWsApp: TemplatedApp, pathPrefix: string, opts: UWebSocketsCreateHandlerOptions<TRouter>): void;
package/types/types.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import { AnyRouter, inferRouterContext } from '@trpc/server';
2
2
  import { TemplatedApp } from 'uWebSockets.js';
3
3
  import { CookieParseOptions, CookieSerializeOptions } from 'cookie';
4
- export declare type UWebSocketsRegisterEndpointOptions<TRouter extends AnyRouter> = {
4
+ export declare type UWebSocketsCreateHandlerOptions<TRouter extends AnyRouter> = {
5
5
  router: TRouter;
6
6
  createContext?: (opts: UWebSocketsCreateContextOptions) => Promise<inferRouterContext<TRouter>> | inferRouterContext<TRouter>;
7
+ onRequest?: (req: UWebSocketsRequestObject, res: UWebSocketsResponseObject) => void;
7
8
  };
8
9
  export declare type UWebSocketsRequestObject = {
9
10
  headers: Record<string, string>;