trpc-uwebsockets 10.40.0-beta.0 → 10.44.0

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,20 +4,10 @@
4
4
 
5
5
  # Installation
6
6
 
7
- Latest stable version
8
-
9
- ```bash
10
- yarn add trpc-uwebsockets@latest
11
- ```
12
-
13
- Or install beta version with subscription support
14
-
15
7
  ```bash
16
- yarn add trpc-uwebsockets@beta
8
+ npm install trpc-uwebsockets
17
9
  ```
18
10
 
19
- ##
20
-
21
11
  # Usage
22
12
 
23
13
  Import needed packages
@@ -73,9 +63,25 @@ Initialize uWebsockets server and attach tRPC
73
63
  ```typescript
74
64
  const app = App();
75
65
 
66
+ /* handle CORS as needed */
67
+ app.options('/*', (res) => {
68
+ res.cork(() => {
69
+ res.writeHeader('Access-Control-Allow-Origin', allowOrigin);
70
+ res.endWithoutBody();
71
+ });
72
+ });
73
+
76
74
  createUWebSocketsHandler(app, '/trpc', {
77
75
  router,
78
76
  createContext,
77
+ // CORS part 2. See https://trpc.io/docs/server/caching for more information
78
+ responseMeta({ ctx, paths, type, errors }) {
79
+ return {
80
+ headers: {
81
+ 'Access-Control-Allow-Origin': '*',
82
+ },
83
+ };
84
+ },
79
85
  });
80
86
 
81
87
  /* dont crash on unknown request */
@@ -122,8 +128,10 @@ createUWebSocketsHandler(app, '/trpc', {
122
128
  });
123
129
  ```
124
130
 
125
- Recommended method: enable subscriptions after registering main request handler.
131
+ Recommended method: enable subscriptions after registering main request handler.
132
+
126
133
  <!-- For example, cookies are not accessible inside WSHandler createContext, so in order to implement auth query string param with jwt needs to be implemented. -->
134
+
127
135
  ```typescript
128
136
  const app = App();
129
137
 
@@ -282,11 +282,16 @@ function applyWSHandler(app, prefix, opts) {
282
282
  ctx: data.ctx,
283
283
  }),
284
284
  });
285
- // close in next tick
286
- // FIXME check if this is okay?
287
- (global.setImmediate ?? global.setTimeout)(() => {
288
- client.close();
289
- });
285
+ // large timeout is needed in order for response above to reach the client
286
+ // otherwise it tries to reconnect over and over again, even though the context throws
287
+ // this is a rouch edge of uWs
288
+ setTimeout(() => {
289
+ client.end();
290
+ }, 1000);
291
+ // original code
292
+ // (global.setImmediate ?? global.setTimeout)(() => {
293
+ // client.end()
294
+ // });
290
295
  }
291
296
  }
292
297
  await createContextAsync();
@@ -1 +1 @@
1
- {"version":3,"file":"applyWsHandler.js","sourceRoot":"","sources":["../src/applyWsHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"applyWsHandler.js","sourceRoot":"","sources":["../src/applyWsHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createUWebSocketsHandler = void 0;
4
+ const applyWsHandler_1 = require("./applyWsHandler");
5
+ const requestHandler_1 = require("./requestHandler");
6
+ const utils_1 = require("./utils");
7
+ /**
8
+ * @param uWsApp uWebsockets server instance
9
+ * @param prefix The path to trpc without trailing slash (ex: "/trpc")
10
+ * @param opts handler options
11
+ */
12
+ function createUWebSocketsHandler(uWsApp, prefix, opts) {
13
+ const handler = (res, req) => {
14
+ const wrappedReq = (0, utils_1.extractAndWrapHttpRequest)(prefix, req);
15
+ (0, requestHandler_1.uWsHTTPRequestHandler)({
16
+ req: wrappedReq,
17
+ res: res,
18
+ path: wrappedReq.url,
19
+ ...opts,
20
+ });
21
+ };
22
+ uWsApp.get(prefix + '/*', handler);
23
+ uWsApp.post(prefix + '/*', handler);
24
+ if (opts.enableSubscriptions) {
25
+ opts.router;
26
+ (0, applyWsHandler_1.applyWSHandler)(uWsApp, prefix, opts);
27
+ }
28
+ }
29
+ exports.createUWebSocketsHandler = createUWebSocketsHandler;
30
+ //# sourceMappingURL=createUWebsocketsHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createUWebsocketsHandler.js","sourceRoot":"","sources":["../src/createUWebsocketsHandler.ts"],"names":[],"mappings":";;;AAEA,qDAAqE;AACrE,qDAAyD;AAEzD,mCAAoD;AAEpD;;;;GAIG;AACH,SAAgB,wBAAwB,CACtC,MAAoB,EACpB,MAAc,EACd,IAAoE;IAEpE,MAAM,OAAO,GAAG,CAAC,GAAiB,EAAE,GAAgB,EAAE,EAAE;QACtD,MAAM,UAAU,GAAG,IAAA,iCAAyB,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE1D,IAAA,sCAAqB,EAAC;YACpB,GAAG,EAAE,UAAU;YACf,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,UAAU,CAAC,GAAG;YACpB,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;IAEpC,IAAI,IAAI,CAAC,mBAAmB,EAAE;QAC5B,IAAI,CAAC,MAAM,CAAC;QACZ,IAAA,+BAAc,EAAC,MAAM,EAAE,MAAM,EAAE,IAAkC,CAAC,CAAC;KACpE;AACH,CAAC;AAtBD,4DAsBC"}
package/dist/index.js CHANGED
@@ -14,33 +14,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.createUWebSocketsHandler = void 0;
18
- const requestHandler_1 = require("./requestHandler");
19
- const utils_1 = require("./utils");
20
- const applyWsHandler_1 = require("./applyWsHandler");
17
+ exports.createUWebSocketsHandler = exports.applyWSHandler = void 0;
18
+ var applyWsHandler_1 = require("./applyWsHandler");
19
+ Object.defineProperty(exports, "applyWSHandler", { enumerable: true, get: function () { return applyWsHandler_1.applyWSHandler; } });
20
+ var createUWebsocketsHandler_1 = require("./createUWebsocketsHandler");
21
+ Object.defineProperty(exports, "createUWebSocketsHandler", { enumerable: true, get: function () { return createUWebsocketsHandler_1.createUWebSocketsHandler; } });
21
22
  __exportStar(require("./types"), exports);
22
- __exportStar(require("./applyWsHandler"), exports);
23
- /**
24
- * @param uWsApp uWebsockets server instance
25
- * @param prefix The path to trpc without trailing slash (ex: "/trpc")
26
- * @param opts handler options
27
- */
28
- function createUWebSocketsHandler(uWsApp, prefix, opts) {
29
- const handler = (res, req) => {
30
- const wrappedReq = (0, utils_1.extractAndWrapHttpRequest)(prefix, req);
31
- (0, requestHandler_1.uWsHTTPRequestHandler)({
32
- req: wrappedReq,
33
- res: res,
34
- path: wrappedReq.url,
35
- ...opts,
36
- });
37
- };
38
- uWsApp.get(prefix + '/*', handler);
39
- uWsApp.post(prefix + '/*', handler);
40
- if (opts.enableSubscriptions) {
41
- opts.router;
42
- (0, applyWsHandler_1.applyWSHandler)(uWsApp, prefix, opts);
43
- }
44
- }
45
- exports.createUWebSocketsHandler = createUWebSocketsHandler;
46
23
  //# 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":";;;;;;;;;;;;;;;;;AACA,qDAAyD;AACzD,mCAAoD;AACpD,qDAAqE;AAIrE,0CAAwB;AACxB,mDAAiC;AAEjC;;;;GAIG;AACH,SAAgB,wBAAwB,CACtC,MAAoB,EACpB,MAAc,EACd,IAAoE;IAEpE,MAAM,OAAO,GAAG,CAAC,GAAiB,EAAE,GAAgB,EAAE,EAAE;QACtD,MAAM,UAAU,GAAG,IAAA,iCAAyB,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE1D,IAAA,sCAAqB,EAAC;YACpB,GAAG,EAAE,UAAU;YACf,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,UAAU,CAAC,GAAG;YACpB,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;IAEpC,IAAI,IAAI,CAAC,mBAAmB,EAAE;QAC5B,IAAI,CAAC,MAAM,CAAC;QACZ,IAAA,+BAAc,EAAC,MAAM,EAAE,MAAM,EAAE,IAAkC,CAAC,CAAC;KACpE;AACH,CAAC;AAtBD,4DAsBC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mDAAqE;AAA5D,gHAAA,cAAc,OAAA;AACvB,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,0CAAwB"}
@@ -5,6 +5,11 @@ const utils_1 = require("./utils");
5
5
  const http_1 = require("@trpc/server/http");
6
6
  async function uWsHTTPRequestHandler(opts) {
7
7
  const handleViaMiddleware = opts.middleware ?? ((_req, _res, next) => next());
8
+ let aborted = false;
9
+ opts.res.onAborted(() => {
10
+ // console.log('request was aborted');
11
+ aborted = true;
12
+ });
8
13
  return handleViaMiddleware(opts.req, opts.res, async (err) => {
9
14
  if (err)
10
15
  throw err;
@@ -14,11 +19,8 @@ async function uWsHTTPRequestHandler(opts) {
14
19
  // this may not be needed
15
20
  const query = new URLSearchParams(opts.req.query);
16
21
  const { res, req } = opts;
17
- let aborted = false;
18
- res.onAborted(() => {
19
- // console.log('request was aborted');
20
- aborted = true;
21
- });
22
+ if (aborted)
23
+ return;
22
24
  const bodyResult = await (0, utils_1.getPostBody)(req.method, res, opts.maxBodySize);
23
25
  const reqObj = {
24
26
  method: opts.req.method,
@@ -1 +1 @@
1
- {"version":3,"file":"requestHandler.js","sourceRoot":"","sources":["../src/requestHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"requestHandler.js","sourceRoot":"","sources":["../src/requestHandler.ts"],"names":[],"mappings":"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"}
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": "10.40.0-beta.0",
5
+ "version": "10.44.0",
6
6
  "main": "./dist/index.js",
7
7
  "type": "commonjs",
8
8
  "types": "./types/index.d.ts",
@@ -12,7 +12,7 @@
12
12
  "build:watch": "tsc --watch",
13
13
  "test": "vitest run",
14
14
  "test:watch": "vitest",
15
- "test:coverage": "jest --coverage",
15
+ "test:coverage": "vitest --coverage",
16
16
  "test:publish": "yarn test && yarn build && yarn pack",
17
17
  "prepublishOnly": "yarn clean && yarn prettier && yarn lint && yarn test && yarn build",
18
18
  "clean": "rimraf -rf ./dist && rimraf -rf ./types && rimraf -rf ./*-*.tgz",
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@trpc/server": "^10.40.0",
27
- "uWebSockets.js": "uNetworking/uWebSockets.js#v20.32.0"
27
+ "uWebSockets.js": "uNetworking/uWebSockets.js#v20.34.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@trpc/client": "^10.40.0",
@@ -33,6 +33,7 @@
33
33
  "@types/ws": "^8.5.5",
34
34
  "@typescript-eslint/eslint-plugin": "^5.30.6",
35
35
  "@typescript-eslint/parser": "^5.30.6",
36
+ "@vitest/coverage-v8": "^0.34.6",
36
37
  "abort-controller": "^3.0.0",
37
38
  "eslint": "^8.19.0",
38
39
  "eslint-config-prettier": "^8.5.0",
@@ -121,7 +121,6 @@ type UWSBuiltInOpts = {
121
121
  export type WSSHandlerOptions<TRouter extends AnyRouter> = BaseHandlerOptions<
122
122
  TRouter,
123
123
  WrappedHTTPRequest
124
- // IncomingMessage
125
124
  > &
126
125
  NodeHTTPCreateContextOption<TRouter, WrappedHTTPRequest, any> &
127
126
  UWSBuiltInOpts;
@@ -365,10 +364,12 @@ export function applyWSHandler<TRouter extends AnyRouter>(
365
364
  async open(client: WebSocket<Decoration>) {
366
365
  async function createContextAsync() {
367
366
  const data = client.getUserData();
367
+
368
368
  try {
369
369
  data.ctx = await data.ctxPromise;
370
370
  } catch (cause) {
371
371
  const error = getTRPCErrorFromUnknown(cause);
372
+
372
373
  opts.onError?.({
373
374
  error,
374
375
  path: undefined,
@@ -389,11 +390,17 @@ export function applyWSHandler<TRouter extends AnyRouter>(
389
390
  }),
390
391
  });
391
392
 
392
- // close in next tick
393
- // FIXME check if this is okay?
394
- (global.setImmediate ?? global.setTimeout)(() => {
395
- client.close();
396
- });
393
+ // large timeout is needed in order for response above to reach the client
394
+ // otherwise it tries to reconnect over and over again, even though the context throws
395
+ // this is a rouch edge of uWs
396
+ setTimeout(() => {
397
+ client.end();
398
+ }, 1000);
399
+
400
+ // original code
401
+ // (global.setImmediate ?? global.setTimeout)(() => {
402
+ // client.end()
403
+ // });
397
404
  }
398
405
  }
399
406
  await createContextAsync();
@@ -435,6 +442,7 @@ export function applyWSHandler<TRouter extends AnyRouter>(
435
442
 
436
443
  close(client: WebSocket<Decoration>) {
437
444
  const data = client.getUserData();
445
+
438
446
  for (const sub of data.clientSubscriptions.values()) {
439
447
  sub.unsubscribe();
440
448
  }
@@ -0,0 +1,35 @@
1
+ import { AnyRouter } from '@trpc/server';
2
+ import { TemplatedApp, HttpResponse, HttpRequest } from 'uWebSockets.js';
3
+ import { applyWSHandler, WSSHandlerOptions } from './applyWsHandler';
4
+ import { uWsHTTPRequestHandler } from './requestHandler';
5
+ import { uHTTPHandlerOptions, WrappedHTTPRequest } from './types';
6
+ import { extractAndWrapHttpRequest } from './utils';
7
+
8
+ /**
9
+ * @param uWsApp uWebsockets server instance
10
+ * @param prefix The path to trpc without trailing slash (ex: "/trpc")
11
+ * @param opts handler options
12
+ */
13
+ export function createUWebSocketsHandler<TRouter extends AnyRouter>(
14
+ uWsApp: TemplatedApp,
15
+ prefix: string,
16
+ opts: uHTTPHandlerOptions<TRouter, WrappedHTTPRequest, HttpResponse>
17
+ ) {
18
+ const handler = (res: HttpResponse, req: HttpRequest) => {
19
+ const wrappedReq = extractAndWrapHttpRequest(prefix, req);
20
+
21
+ uWsHTTPRequestHandler({
22
+ req: wrappedReq,
23
+ res: res,
24
+ path: wrappedReq.url,
25
+ ...opts,
26
+ });
27
+ };
28
+ uWsApp.get(prefix + '/*', handler);
29
+ uWsApp.post(prefix + '/*', handler);
30
+
31
+ if (opts.enableSubscriptions) {
32
+ opts.router;
33
+ applyWSHandler(uWsApp, prefix, opts as WSSHandlerOptions<TRouter>);
34
+ }
35
+ }
package/src/index.ts CHANGED
@@ -1,38 +1,3 @@
1
- import { AnyRouter } from '@trpc/server';
2
- import { uWsHTTPRequestHandler } from './requestHandler';
3
- import { extractAndWrapHttpRequest } from './utils';
4
- import { applyWSHandler, WSSHandlerOptions } from './applyWsHandler';
5
- import type { uHTTPHandlerOptions, WrappedHTTPRequest } from './types';
6
- import type { HttpRequest, HttpResponse, TemplatedApp } from 'uWebSockets.js';
7
-
1
+ export { applyWSHandler, WSSHandlerOptions } from './applyWsHandler';
2
+ export { createUWebSocketsHandler } from './createUWebsocketsHandler';
8
3
  export * from './types';
9
- export * from './applyWsHandler';
10
-
11
- /**
12
- * @param uWsApp uWebsockets server instance
13
- * @param prefix The path to trpc without trailing slash (ex: "/trpc")
14
- * @param opts handler options
15
- */
16
- export function createUWebSocketsHandler<TRouter extends AnyRouter>(
17
- uWsApp: TemplatedApp,
18
- prefix: string,
19
- opts: uHTTPHandlerOptions<TRouter, WrappedHTTPRequest, HttpResponse>
20
- ) {
21
- const handler = (res: HttpResponse, req: HttpRequest) => {
22
- const wrappedReq = extractAndWrapHttpRequest(prefix, req);
23
-
24
- uWsHTTPRequestHandler({
25
- req: wrappedReq,
26
- res: res,
27
- path: wrappedReq.url,
28
- ...opts,
29
- });
30
- };
31
- uWsApp.get(prefix + '/*', handler);
32
- uWsApp.post(prefix + '/*', handler);
33
-
34
- if (opts.enableSubscriptions) {
35
- opts.router;
36
- applyWSHandler(uWsApp, prefix, opts as WSSHandlerOptions<TRouter>);
37
- }
38
- }
@@ -14,7 +14,11 @@ export async function uWsHTTPRequestHandler<
14
14
  TResponse extends WrappedHTTPResponse
15
15
  >(opts: uHTTPRequestHandlerOptions<TRouter, TRequest, TResponse>) {
16
16
  const handleViaMiddleware = opts.middleware ?? ((_req, _res, next) => next());
17
-
17
+ let aborted = false;
18
+ opts.res.onAborted(() => {
19
+ // console.log('request was aborted');
20
+ aborted = true;
21
+ });
18
22
  return handleViaMiddleware(opts.req, opts.res, async (err) => {
19
23
  if (err) throw err;
20
24
 
@@ -26,11 +30,8 @@ export async function uWsHTTPRequestHandler<
26
30
  const query = new URLSearchParams(opts.req.query);
27
31
 
28
32
  const { res, req } = opts;
29
- let aborted = false;
30
- res.onAborted(() => {
31
- // console.log('request was aborted');
32
- aborted = true;
33
- });
33
+
34
+ if (aborted) return;
34
35
 
35
36
  const bodyResult = await getPostBody(req.method, res, opts.maxBodySize);
36
37
 
@@ -1,4 +1,12 @@
1
- import { vi, beforeEach, afterEach, test, expect, expectTypeOf } from 'vitest';
1
+ import {
2
+ vi,
3
+ beforeEach,
4
+ afterEach,
5
+ test,
6
+ expect,
7
+ expectTypeOf,
8
+ describe,
9
+ } from 'vitest';
2
10
  // idk how to use that
3
11
  // import { waitFor } from '@testing-library/dom';
4
12
 
@@ -6,12 +14,13 @@ import fetch from 'node-fetch';
6
14
  import { CreateContextOptions } from '../src/types';
7
15
  import uWs from 'uWebSockets.js';
8
16
  import z from 'zod';
9
- import { createUWebSocketsHandler } from '../src/index';
17
+ import { applyWSHandler, createUWebSocketsHandler } from '../src/index';
10
18
  import {
11
19
  createTRPCProxyClient,
12
20
  createWSClient,
13
21
  httpBatchLink,
14
22
  splitLink,
23
+ TRPCClientError,
15
24
  TRPCLink,
16
25
  // unstable_httpBatchStreamLink,
17
26
  wsLink,
@@ -21,6 +30,7 @@ import EventEmitter from 'events';
21
30
 
22
31
  import { observable } from '@trpc/server/observable';
23
32
  import ws from 'ws';
33
+ const WebSocket: any = ws;
24
34
 
25
35
  const testPort = 8799;
26
36
 
@@ -104,6 +114,9 @@ function makeContext() {
104
114
  name: 'KATT',
105
115
  };
106
116
  }
117
+
118
+ if (req.query.get('fail')) throw new Error('context failed as expected');
119
+
107
120
  return null;
108
121
  };
109
122
  return {
@@ -122,19 +135,53 @@ export type Context = inferAsyncReturnType<ReturnType<typeof makeContext>>;
122
135
  async function startServer() {
123
136
  const app = uWs.App();
124
137
 
138
+ app.options('/*', (res) => {
139
+ res.cork(() => {
140
+ res.writeHeader('Access-Control-Allow-Origin', '*');
141
+
142
+ res.endWithoutBody();
143
+ });
144
+ });
145
+
146
+ const router = makeRouter();
125
147
  createUWebSocketsHandler(app, '/trpc', {
126
148
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
127
149
  responseMeta({ ctx, paths, type, errors }) {
128
150
  return {
129
151
  headers: {
130
- hello: 'world',
152
+ 'Access-Control-Allow-Origin': '*',
131
153
  },
132
154
  };
133
155
  },
134
156
 
135
- router: makeRouter(),
157
+ router,
136
158
  createContext: makeContext(),
137
- enableSubscriptions: true,
159
+ // enableSubscriptions: true,
160
+ });
161
+
162
+ applyWSHandler(app, '/trpc', {
163
+ router,
164
+ createContext: async ({ req, res }) => {
165
+ const userName = req.query.get('user');
166
+
167
+ const fail = req.query.get('fail');
168
+
169
+ if (fail)
170
+ throw new TRPCError({
171
+ code: 'BAD_REQUEST',
172
+ message: 'failing as expected',
173
+ });
174
+
175
+ return {
176
+ req,
177
+ res,
178
+ user: userName
179
+ ? {
180
+ name: userName,
181
+ }
182
+ : null,
183
+ };
184
+ },
138
185
  });
139
186
 
140
187
  let { socket } = await new Promise<{
@@ -161,11 +208,33 @@ async function startServer() {
161
208
  };
162
209
  }
163
210
 
164
- function makeClient(headers) {
211
+ function makeClient(headers: Record<string, string>) {
212
+ const host = `localhost:${testPort}/trpc`;
213
+
214
+ const client = createTRPCProxyClient<AppRouter>({
215
+ links: [
216
+ httpBatchLink({
217
+ url: `http://${host}`,
218
+ headers: headers,
219
+ AbortController,
220
+ fetch: fetch as any,
221
+ }),
222
+ ],
223
+ });
224
+ return {
225
+ client,
226
+ };
227
+ }
228
+
229
+ function makeClientWithWs(headers: Record<string, string>) {
165
230
  const host = `localhost:${testPort}/trpc`;
166
231
  const wsClient = createWSClient({
167
232
  url: `ws://${host}`,
168
- WebSocket: ws as any,
233
+ WebSocket,
234
+ retryDelayMs: (i) => {
235
+ console.log('retrying connection in ws', i);
236
+ return 200;
237
+ },
169
238
  });
170
239
  const client = createTRPCProxyClient<AppRouter>({
171
240
  links: [
@@ -193,7 +262,12 @@ function makeClient(headers) {
193
262
  return {
194
263
  client,
195
264
  closeWs: () => {
196
- wsClient.close();
265
+ return new Promise<void>((resolve) => {
266
+ wsClient.getConnection()?.addEventListener('close', () => {
267
+ resolve();
268
+ });
269
+ wsClient.close();
270
+ });
197
271
  },
198
272
  };
199
273
  }
@@ -201,6 +275,7 @@ function makeClient(headers) {
201
275
  let t!: Awaited<ReturnType<typeof startServer>>;
202
276
  beforeEach(async () => {
203
277
  t = await startServer();
278
+ // WebSocket = ws;
204
279
  });
205
280
  afterEach(async () => {
206
281
  await t.close();
@@ -227,34 +302,37 @@ const linkSpy: TRPCLink<AppRouter> = () => {
227
302
  };
228
303
  };
229
304
 
230
- test('query simple success and error handling', async () => {
231
- // t.client.runtime.headers = ()
232
- const { client } = makeClient({});
233
-
234
- // client.
235
- expect(
236
- await client.hello.query({
237
- who: 'test',
238
- })
239
- ).toMatchInlineSnapshot(`
305
+ describe('main tests', () => {
306
+ test('query simple success and error handling', async () => {
307
+ // t.client.runtime.headers = ()
308
+ const { client } = makeClient({});
309
+
310
+ // client.
311
+ expect(
312
+ await client.hello.query({
313
+ who: 'test',
314
+ })
315
+ ).toMatchInlineSnapshot(`
240
316
  {
241
317
  "text": "hello test",
242
318
  }
243
319
  `);
244
320
 
245
- await expect(client.error.query()).rejects.toThrowError('error as expected');
246
- });
247
-
248
- test('mutation and reading headers', async () => {
249
- const { client } = makeClient({
250
- authorization: 'meow',
321
+ await expect(client.error.query()).rejects.toThrowError(
322
+ 'error as expected'
323
+ );
251
324
  });
252
325
 
253
- expect(
254
- await client.test.mutate({
255
- value: 'lala',
256
- })
257
- ).toMatchInlineSnapshot(`
326
+ test('mutation and reading headers', async () => {
327
+ const { client } = makeClient({
328
+ authorization: 'meow',
329
+ });
330
+
331
+ expect(
332
+ await client.test.mutate({
333
+ value: 'lala',
334
+ })
335
+ ).toMatchInlineSnapshot(`
258
336
  {
259
337
  "originalValue": "lala",
260
338
  "user": {
@@ -262,127 +340,99 @@ test('mutation and reading headers', async () => {
262
340
  },
263
341
  }
264
342
  `);
265
- });
266
-
267
- test('manually sets status and headers', async () => {
268
- const fetcher = await fetch(
269
- `http://localhost:${testPort}/trpc/manualRes?input=${encodeURI('{}')}`
270
- );
271
- const body = await fetcher.json();
272
- expect(fetcher.status).toEqual(400);
273
- expect(body.result.data).toEqual('status 400');
274
-
275
- expect(fetcher.headers.get('hello')).toEqual('world'); // from the meta
276
- expect(fetcher.headers.get('manual')).toEqual('header'); //from the result
277
- });
278
-
279
- // this needs to be tested
280
- test('abording requests works', async () => {
281
- const ac = new AbortController();
282
- const { client } = makeClient({});
283
-
284
- expect.assertions(1);
285
-
286
- setTimeout(() => {
287
- ac.abort();
288
343
  });
289
344
 
290
- try {
291
- await client.test.mutate(
292
- {
293
- value: 'haha',
294
- },
295
- {
296
- signal: ac.signal as any,
297
- }
345
+ test('manually sets status and headers', async () => {
346
+ const fetcher = await fetch(
347
+ `http://localhost:${testPort}/trpc/manualRes?input=${encodeURI('{}')}`
298
348
  );
299
- } catch (error) {
300
- expect(error.name).toBe('TRPCClientError');
301
- }
302
- });
349
+ const body = await fetcher.json();
350
+ expect(fetcher.status).toEqual(400);
351
+ expect(body.result.data).toEqual('status 400');
303
352
 
304
- test('subscription only operation', async () => {
305
- const host = `localhost:${testPort}/trpc`;
306
- const wsClient = createWSClient({
307
- url: `ws://${host}`,
308
- WebSocket: ws as any,
309
- retryDelayMs: (i) => {
310
- console.log('retrying', i);
311
- return 200;
312
- },
353
+ expect(fetcher.headers.get('Access-Control-Allow-Origin')).toEqual('*'); // from the meta
354
+ expect(fetcher.headers.get('manual')).toEqual('header'); //from the result
313
355
  });
314
356
 
315
- const client = createTRPCProxyClient<AppRouter>({
316
- links: [wsLink({ client: wsClient })],
317
- });
318
- expect(
319
- await client.hello.query({
320
- who: 'test',
321
- })
322
- ).toMatchInlineSnapshot(`
323
- {
324
- "text": "hello test",
325
- }
326
- `);
327
- await expect(client.error.query()).rejects.toThrowError('error as expected');
357
+ // this needs to be tested
358
+ test('aborting requests works', async () => {
359
+ const ac = new AbortController();
360
+ const { client } = makeClient({});
328
361
 
329
- wsClient.close();
330
- });
362
+ expect.assertions(1);
331
363
 
332
- // FIXME no idea how to make it non-flaky
333
- const sleep = (ms: number) => new Promise((res) => setTimeout(res, ms));
334
-
335
- // Source: https://github.com/trpc/trpc/blob/main/packages/tests/server/adapters/fastify.test.ts
336
- test(
337
- 'ugly subscription tests',
338
- async () => {
339
- ee.once('subscription:created', () => {
340
- setTimeout(() => {
341
- ee.emit('server:msg', {
342
- id: '1',
343
- });
344
- ee.emit('server:msg', {
345
- id: '2',
364
+ setTimeout(() => {
365
+ ac.abort();
366
+ });
367
+
368
+ try {
369
+ await client.test.mutate(
370
+ {
371
+ value: 'haha',
372
+ },
373
+ {
374
+ signal: ac.signal as any,
375
+ }
376
+ );
377
+ } catch (error) {
378
+ expect(error.name).toBe('TRPCClientError');
379
+ }
380
+ });
381
+
382
+ // FIXME no idea how to make it non-flaky
383
+ const sleep = (ms: number) => new Promise((res) => setTimeout(res, ms));
384
+
385
+ // Source: https://github.com/trpc/trpc/blob/main/packages/tests/server/adapters/fastify.test.ts
386
+ test(
387
+ 'ugly subscription tests',
388
+ async () => {
389
+ ee.once('subscription:created', () => {
390
+ setTimeout(() => {
391
+ ee.emit('server:msg', {
392
+ id: '1',
393
+ });
394
+ ee.emit('server:msg', {
395
+ id: '2',
396
+ });
346
397
  });
347
398
  });
348
- });
349
399
 
350
- const { client, closeWs } = makeClient({});
400
+ const { client, closeWs } = makeClientWithWs({});
351
401
 
352
- const onStartedMock = vi.fn();
353
- const onDataMock = vi.fn();
354
- const sub = client.onMessage.subscribe('onMessage', {
355
- onStarted: onStartedMock,
356
- onData(data) {
357
- expectTypeOf(data).not.toBeAny();
358
- expectTypeOf(data).toMatchTypeOf<Message>();
359
- onDataMock(data);
360
- },
361
- });
402
+ const onStartedMock = vi.fn();
403
+ const onDataMock = vi.fn();
404
+ const sub = client.onMessage.subscribe('onMessage', {
405
+ onStarted: onStartedMock,
406
+ onData(data) {
407
+ expectTypeOf(data).not.toBeAny();
408
+ expectTypeOf(data).toMatchTypeOf<Message>();
409
+ onDataMock(data);
410
+ },
411
+ });
362
412
 
363
- // onStartedMock.
413
+ // onStartedMock.
364
414
 
365
- // expect(onStartedMock).toh
415
+ // expect(onStartedMock).toh
366
416
 
367
- await sleep(500); // FIXME how to use waitFor instead?
368
- expect(onStartedMock).toHaveBeenCalledTimes(1);
369
- expect(onDataMock).toHaveBeenCalledTimes(2);
370
- // await waitFor(() => {
371
- // expect(onStartedMock).toHaveBeenCalledTimes(1);
372
- // expect(onDataMock).toHaveBeenCalledTimes(2);
373
- // });
417
+ await sleep(300); // FIXME how to use waitFor instead?
418
+ expect(onStartedMock).toHaveBeenCalledTimes(1);
419
+ expect(onDataMock).toHaveBeenCalledTimes(2);
420
+ // await waitFor(() => {
421
+ // expect(onStartedMock).toHaveBeenCalledTimes(1);
422
+ // expect(onDataMock).toHaveBeenCalledTimes(2);
423
+ // });
374
424
 
375
- ee.emit('server:msg', {
376
- id: '3',
377
- });
378
- await sleep(500);
379
- expect(onDataMock).toHaveBeenCalledTimes(3);
425
+ ee.emit('server:msg', {
426
+ id: '3',
427
+ });
428
+ await sleep(500);
429
+ expect(onDataMock).toHaveBeenCalledTimes(3);
380
430
 
381
- // await waitFor(() => {
382
- // expect(onDataMock).toHaveBeenCalledTimes(3);
383
- // });
431
+ // await waitFor(() => {
432
+ // expect(onDataMock).toHaveBeenCalledTimes(3);
433
+ // });
384
434
 
385
- expect(onDataMock.mock.calls).toMatchInlineSnapshot(`
435
+ expect(onDataMock.mock.calls).toMatchInlineSnapshot(`
386
436
  [
387
437
  [
388
438
  {
@@ -402,16 +452,64 @@ test(
402
452
  ]
403
453
  `);
404
454
 
405
- sub.unsubscribe();
455
+ sub.unsubscribe();
456
+
457
+ await sleep(500);
458
+
459
+ expect(ee.listenerCount('server:msg')).toBe(0);
460
+ expect(ee.listenerCount('server:error')).toBe(0);
461
+
462
+ await closeWs();
463
+ },
464
+ {
465
+ timeout: 10000,
466
+ }
467
+ );
406
468
 
407
- await sleep(500);
469
+ test(
470
+ 'subscription failed context',
471
+ async () => {
472
+ expect.assertions(2);
473
+ // const host = `localhost:${testPort}/trpc?user=user1`; // weClient can inject values via query string
474
+ const host = `localhost:${testPort}/trpc?user=user1&fail=yess`; // weClient can inject values via query string
475
+ const wsClient = createWSClient({
476
+ url: `ws://${host}`,
477
+ WebSocket,
478
+ retryDelayMs: (i) => {
479
+ console.log('retrying connection in subscription only', i);
480
+ return 200;
481
+ },
482
+ });
408
483
 
409
- expect(ee.listenerCount('server:msg')).toBe(0);
410
- expect(ee.listenerCount('server:error')).toBe(0);
484
+ const client = createTRPCProxyClient<AppRouter>({
485
+ links: [wsLink({ client: wsClient })],
486
+ });
411
487
 
412
- closeWs();
413
- },
414
- {
415
- timeout: 10000,
416
- }
417
- );
488
+ client.onMessage.subscribe('lala', {
489
+ onError(err) {
490
+ // expect this error here?
491
+ expect(err).toBeInstanceOf(TRPCClientError);
492
+ expect(err.message).toBe('failing as expected');
493
+ },
494
+ });
495
+
496
+ await sleep(100);
497
+ wsClient.close();
498
+ },
499
+ {
500
+ timeout: 3000,
501
+ }
502
+ );
503
+
504
+ test('options still passthrough (cors)', async () => {
505
+ const res = await fetch(
506
+ `http://localhost:${testPort}/trpc/hello?input=${encodeURI('{}')}`,
507
+ {
508
+ method: 'OPTIONS',
509
+ }
510
+ );
511
+
512
+ expect(res.status).toBe(200);
513
+ expect(res.headers.get('Access-Control-Allow-Origin')).toBe('*');
514
+ });
515
+ });
@@ -0,0 +1,9 @@
1
+ import { AnyRouter } from '@trpc/server';
2
+ import { TemplatedApp, HttpResponse } from 'uWebSockets.js';
3
+ import { uHTTPHandlerOptions, WrappedHTTPRequest } from './types';
4
+ /**
5
+ * @param uWsApp uWebsockets server instance
6
+ * @param prefix The path to trpc without trailing slash (ex: "/trpc")
7
+ * @param opts handler options
8
+ */
9
+ export declare function createUWebSocketsHandler<TRouter extends AnyRouter>(uWsApp: TemplatedApp, prefix: string, opts: uHTTPHandlerOptions<TRouter, WrappedHTTPRequest, HttpResponse>): void;
package/types/index.d.ts CHANGED
@@ -1,11 +1,3 @@
1
- import { AnyRouter } from '@trpc/server';
2
- import type { uHTTPHandlerOptions, WrappedHTTPRequest } from './types';
3
- import type { HttpResponse, TemplatedApp } from 'uWebSockets.js';
1
+ export { applyWSHandler, WSSHandlerOptions } from './applyWsHandler';
2
+ export { createUWebSocketsHandler } from './createUWebsocketsHandler';
4
3
  export * from './types';
5
- export * from './applyWsHandler';
6
- /**
7
- * @param uWsApp uWebsockets server instance
8
- * @param prefix The path to trpc without trailing slash (ex: "/trpc")
9
- * @param opts handler options
10
- */
11
- export declare function createUWebSocketsHandler<TRouter extends AnyRouter>(uWsApp: TemplatedApp, prefix: string, opts: uHTTPHandlerOptions<TRouter, WrappedHTTPRequest, HttpResponse>): void;