trpc-uwebsockets 11.0.2 → 11.0.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.
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.decorateHttpResponse = decorateHttpResponse;
4
+ exports.uWsToRequestNoBody = uWsToRequestNoBody;
4
5
  exports.uWsToRequest = uWsToRequest;
5
6
  exports.createURL = createURL;
6
7
  exports.uWsSendResponse = uWsSendResponse;
@@ -12,6 +13,18 @@ function decorateHttpResponse(res, ssl = false) {
12
13
  resDecorated.ssl = ssl;
13
14
  return resDecorated;
14
15
  }
16
+ function uWsToRequestNoBody(req, res) {
17
+ const headers = createHeaders(req);
18
+ const method = req.getCaseSensitiveMethod().toUpperCase();
19
+ const isSsl = res.ssl;
20
+ const url = createURL(req, isSsl ? 'https' : 'http');
21
+ const init = {
22
+ headers: headers,
23
+ method: method,
24
+ };
25
+ const request = new Request(url, init);
26
+ return request;
27
+ }
15
28
  function uWsToRequest(req, res, opts) {
16
29
  const ac = new AbortController();
17
30
  const onAbort = () => {
@@ -74,37 +87,36 @@ function createBody(res, opts) {
74
87
  let hasClosed = false;
75
88
  return new ReadableStream({
76
89
  start(controller) {
77
- const onData = (ab, isLast) => {
78
- // special case of empty body
79
- if (size == 0 && ab.byteLength == 0 && isLast) {
80
- onEnd();
90
+ res.onData((tempChunk, isLast) => {
91
+ if (hasClosed)
81
92
  return;
82
- }
83
- size += ab.byteLength;
93
+ // This copies the buffer *immediately* and avoids using a detached buffer
94
+ const chunk = new Uint8Array(tempChunk.byteLength);
95
+ chunk.set(new Uint8Array(tempChunk)); // must be done before enqueue
96
+ size += chunk.byteLength;
84
97
  if (!opts.maxBodySize || size <= opts.maxBodySize) {
85
- controller.enqueue(new Uint8Array(ab));
98
+ controller.enqueue(chunk);
86
99
  if (isLast) {
87
- onEnd();
100
+ hasClosed = true;
101
+ controller.close();
88
102
  }
89
- return;
90
103
  }
91
- controller.error(new server_1.TRPCError({
92
- code: 'PAYLOAD_TOO_LARGE',
93
- }));
94
- hasClosed = true;
95
- };
96
- const onEnd = () => {
97
- if (hasClosed) {
98
- return;
104
+ else {
105
+ hasClosed = true;
106
+ controller.error(new server_1.TRPCError({ code: 'PAYLOAD_TOO_LARGE' }));
99
107
  }
100
- hasClosed = true;
101
- controller.close();
102
- };
103
- res.onData(onData);
104
- res.onAborted(onEnd);
108
+ });
109
+ res.onAborted(() => {
110
+ if (!hasClosed) {
111
+ hasClosed = true;
112
+ controller.error(new server_1.TRPCError({ code: 'CLIENT_CLOSED_REQUEST' }));
113
+ }
114
+ });
105
115
  },
106
116
  cancel() {
107
- res.close();
117
+ res.cork(() => {
118
+ res.close();
119
+ });
108
120
  },
109
121
  });
110
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fetchCompat.js","sourceRoot":"","sources":["../src/fetchCompat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetchCompat.js","sourceRoot":"","sources":["../src/fetchCompat.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,19 @@ const rpc_1 = require("@trpc/server/rpc");
62
62
  const unstable_core_do_not_import_1 = require("@trpc/server/unstable-core-do-not-import");
63
63
  const url_1 = require("url");
64
64
  const fetchCompat_1 = require("./fetchCompat");
65
+ function createCompleter() {
66
+ let resolve;
67
+ let reject;
68
+ const promise = new Promise((res, rej) => {
69
+ resolve = res;
70
+ reject = rej;
71
+ });
72
+ return {
73
+ promise,
74
+ resolve: resolve,
75
+ reject: reject,
76
+ };
77
+ }
65
78
  function getWSConnectionHandler(opts, allClients) {
66
79
  const { createContext, router } = opts;
67
80
  const { transformer } = router._def._config;
@@ -75,62 +88,23 @@ function getWSConnectionHandler(opts, allClients) {
75
88
  // and server is sending keepalive messages
76
89
  }
77
90
  }
78
- // this deviates from standard implementation
79
- // this function returns true is context was resolved and set
80
- // it returns false if context threw, and execution must be halted.
81
- // this function will cleanup the connection
82
- async function tryResolveContext(client, getConnectionParams) {
83
- const data = client.getUserData();
84
- data.contextResolveAttempted = true;
91
+ function getConnectionParams(msgStr) {
92
+ let msg;
85
93
  try {
86
- data.ctx = await createContext?.({
87
- req: data.req,
88
- // @ts-expect-error res cant be used, but undefined is needed here
89
- // for type compatibility with main handler
90
- res: undefined,
91
- client,
92
- info: {
93
- connectionParams: getConnectionParams(),
94
- calls: [],
95
- isBatchCall: false,
96
- accept: null,
97
- type: 'unknown',
98
- signal: data.abortController.signal,
99
- url: data.url,
100
- },
101
- });
102
- return true;
94
+ msg = JSON.parse(msgStr);
95
+ if (!(0, unstable_core_do_not_import_1.isObject)(msg)) {
96
+ throw new Error('Message was not an object');
97
+ }
103
98
  }
104
99
  catch (cause) {
105
- // console.error('could not resolve context, cause', cause);
106
- const error = (0, server_1.getTRPCErrorFromUnknown)(cause);
107
- opts.onError?.({
108
- error,
109
- path: undefined,
110
- type: 'unknown',
111
- ctx: data.ctx,
112
- req: data.req,
113
- input: undefined,
114
- });
115
- respond(client, {
116
- id: null,
117
- error: (0, server_1.getErrorShape)({
118
- config: router._def._config,
119
- error,
120
- type: 'unknown',
121
- path: undefined,
122
- input: undefined,
123
- ctx: data.ctx,
124
- }),
125
- });
126
- setTimeout(() => {
127
- // trpc wierd behavior:
128
- // no mater whats the websocket close status code, trpc websocket still attemps to reconnect indefinitely
129
- // I chose 1008 as due to https://datatracker.ietf.org/doc/html/rfc6455#section-7.4
130
- client.end(1008, 'bad context');
100
+ throw new server_1.TRPCError({
101
+ code: 'PARSE_ERROR',
102
+ message: `Malformed TRPCConnectionParamsMessage`,
103
+ cause,
131
104
  });
132
- return false;
133
105
  }
106
+ const connectionParams = (0, http_1.parseConnectionParamsFromUnknown)(msg.data);
107
+ return connectionParams;
134
108
  }
135
109
  async function handleRequest(client, msg) {
136
110
  const { clientSubscriptions, ctx, req } = client.getUserData();
@@ -223,10 +197,6 @@ function getWSConnectionHandler(opts, allClients) {
223
197
  let next;
224
198
  let result;
225
199
  while (true) {
226
- // using the Promise.race could introduce memory leaks?
227
- // more on this here: https://github.com/cefn/watchable/tree/main/packages/unpromise
228
- // the trpc used Unpromise to accomplish this
229
- // next = await Unpromise.race([
230
200
  next = await unstable_core_do_not_import_1.Unpromise.race([
231
201
  iterator.next().catch(server_1.getTRPCErrorFromUnknown),
232
202
  abortPromise,
@@ -346,14 +316,12 @@ function getWSConnectionHandler(opts, allClients) {
346
316
  maxPayloadLength: opts.uWsBehaviorOptions?.maxPayloadLength,
347
317
  maxLifetime: opts.uWsBehaviorOptions?.maxLifetime,
348
318
  idleTimeout: opts.uWsBehaviorOptions?.idleTimeout,
349
- async upgrade(res, req, context) {
319
+ upgrade(res, req, context) {
350
320
  const resDecorated = (0, fetchCompat_1.decorateHttpResponse)(res);
351
321
  res.onAborted(() => {
352
322
  resDecorated.aborted = true;
353
323
  });
354
- const reqFetch = (0, fetchCompat_1.uWsToRequest)(req, resDecorated, {
355
- maxBodySize: null,
356
- });
324
+ const reqFetch = (0, fetchCompat_1.uWsToRequestNoBody)(req, resDecorated);
357
325
  const secWebSocketKey = req.getHeader('sec-websocket-key');
358
326
  const secWebSocketProtocol = req.getHeader('sec-websocket-protocol');
359
327
  const secWebSocketExtensions = req.getHeader('sec-websocket-extensions');
@@ -363,9 +331,8 @@ function getWSConnectionHandler(opts, allClients) {
363
331
  clientSubscriptions,
364
332
  abortController,
365
333
  req: reqFetch,
366
- ctx: null,
367
- contextResolveAttempted: false,
368
- useConnectionParams: false,
334
+ ctx: undefined,
335
+ ctxCompleter: null,
369
336
  keepAlive: null,
370
337
  url: (0, fetchCompat_1.createURL)(req, resDecorated.sll ? 'wss' : 'ws'),
371
338
  };
@@ -373,16 +340,9 @@ function getWSConnectionHandler(opts, allClients) {
373
340
  },
374
341
  async open(client) {
375
342
  allClients.add(client);
376
- const data = client.getUserData();
377
- data.useConnectionParams =
378
- new url_1.URL(data.req.url).searchParams.get('connectionParams') === '1';
379
- if (!data.useConnectionParams) {
380
- const ok = await tryResolveContext(client, () => null);
381
- if (!ok)
382
- return;
383
- }
384
343
  if (opts.keepAlive?.enabled) {
385
344
  const { pingMs, pongWaitMs } = opts.keepAlive;
345
+ const data = client.getUserData();
386
346
  data.keepAlive = handleKeepAlive(client, pingMs, pongWaitMs);
387
347
  }
388
348
  },
@@ -391,7 +351,6 @@ function getWSConnectionHandler(opts, allClients) {
391
351
  if (data.keepAlive) {
392
352
  data.keepAlive.onMessage();
393
353
  }
394
- // const msgStr = rawMsg.toString(); // or could do this ;
395
354
  const msgStr = Buffer.from(rawMsg).toString();
396
355
  if (msgStr === 'PONG') {
397
356
  return;
@@ -402,31 +361,67 @@ function getWSConnectionHandler(opts, allClients) {
402
361
  }
403
362
  return;
404
363
  }
405
- if (data.useConnectionParams && !data.contextResolveAttempted) {
406
- if (data.ctx !== null) {
407
- // TODO: just in case for now, this can be removed later
408
- throw new Error('assertion: context should not be null');
364
+ if (data.ctxCompleter == null) {
365
+ data.ctxCompleter = createCompleter();
366
+ const useConnectionParams = new url_1.URL(data.req.url).searchParams.get('connectionParams') === '1';
367
+ try {
368
+ data.ctx = await createContext?.({
369
+ req: data.req,
370
+ res: client,
371
+ client: client,
372
+ info: {
373
+ connectionParams: useConnectionParams
374
+ ? getConnectionParams(msgStr)
375
+ : null,
376
+ calls: [],
377
+ isBatchCall: false,
378
+ accept: null,
379
+ type: 'unknown',
380
+ signal: data.abortController.signal,
381
+ url: data.url, // was null
382
+ },
383
+ });
384
+ data.ctxCompleter.resolve();
409
385
  }
410
- const ok = await tryResolveContext(client, () => {
411
- let msg;
412
- try {
413
- msg = JSON.parse(msgStr);
414
- if (!(0, unstable_core_do_not_import_1.isObject)(msg)) {
415
- throw new Error('Message was not an object');
416
- }
417
- }
418
- catch (cause) {
419
- throw new server_1.TRPCError({
420
- code: 'PARSE_ERROR',
421
- message: `Malformed TRPCConnectionParamsMessage`,
422
- cause,
423
- });
424
- }
425
- const connectionParams = (0, http_1.parseConnectionParamsFromUnknown)(msg.data);
426
- return connectionParams;
427
- });
428
- if (!ok)
386
+ catch (cause) {
387
+ const error = (0, server_1.getTRPCErrorFromUnknown)(cause);
388
+ opts.onError?.({
389
+ ctx: data.ctx,
390
+ error: error,
391
+ input: undefined,
392
+ path: undefined,
393
+ type: 'unknown',
394
+ req: data.req,
395
+ });
396
+ respond(client, {
397
+ id: null,
398
+ error: (0, server_1.getErrorShape)({
399
+ config: router._def._config,
400
+ error,
401
+ type: 'unknown',
402
+ path: undefined,
403
+ input: undefined,
404
+ ctx: data.ctx,
405
+ }),
406
+ });
407
+ data.ctxCompleter.reject(error);
408
+ // close in next tick
409
+ (globalThis.setImmediate ?? globalThis.setTimeout)(() => {
410
+ client.end(1008);
411
+ });
412
+ }
413
+ if (useConnectionParams) {
414
+ // fully consume first message
429
415
  return;
416
+ }
417
+ }
418
+ try {
419
+ await data.ctxCompleter.promise;
420
+ }
421
+ catch {
422
+ // stop execution of pending requests when context could not be resolved
423
+ // single error message will be sent
424
+ return;
430
425
  }
431
426
  try {
432
427
  const msgJSON = JSON.parse(msgStr);
@@ -1 +1 @@
1
- {"version":3,"file":"websockets.js","sourceRoot":"","sources":["../src/websockets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websockets.js","sourceRoot":"","sources":["../src/websockets.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "trpc-uwebsockets",
3
3
  "description": "tRPC adapter for uWebSockets.js server",
4
- "version": "11.0.2",
4
+ "version": "11.0.4",
5
5
  "main": "./dist/index.js",
6
6
  "type": "commonjs",
7
7
  "types": "./types/index.d.ts",
@@ -17,8 +17,8 @@
17
17
  "test:watch": "vitest",
18
18
  "test:coverage": "vitest --coverage",
19
19
  "test:publish": "yarn test && yarn build && yarn pack",
20
- "publish:main": "bash -c 'source .env' && yarn npm publish",
21
- "publish:next": "bash -c 'source .env' && yarn npm publish --tag next",
20
+ "publish:main": "yarn npm publish",
21
+ "publish:canary": "yarn npm publish --tag canary",
22
22
  "prepack": "yarn build",
23
23
  "prepublish": "yarn clean && yarn prettier && yarn lint && yarn test",
24
24
  "clean": "rimraf -rf ./dist && rimraf -rf ./types && rimraf -rf ./coverage && rimraf -rf ./package.tgz",
@@ -29,18 +29,18 @@
29
29
  "prettier:dry": "prettier src/**/*.ts --config .prettierrc"
30
30
  },
31
31
  "dependencies": {
32
- "@trpc/server": "^11.0.2",
32
+ "@trpc/server": "^11.0.4",
33
33
  "uWebSockets.js": "uNetworking/uWebSockets.js#v20.51.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@eslint/eslintrc": "^3.3.1",
37
37
  "@eslint/js": "^9.24.0",
38
- "@trpc/client": "^11.0.2",
38
+ "@trpc/client": "^11.0.4",
39
39
  "@types/node": "^20.11.5",
40
40
  "@types/node-fetch": "^2.6.12",
41
41
  "@types/ws": "^8.5.10",
42
- "@typescript-eslint/eslint-plugin": "^8.29.0",
43
- "@typescript-eslint/parser": "^8.29.0",
42
+ "@typescript-eslint/eslint-plugin": "^8.29.1",
43
+ "@typescript-eslint/parser": "^8.29.1",
44
44
  "@vitest/coverage-istanbul": "^3.1.1",
45
45
  "abort-controller": "^3.0.0",
46
46
  "eslint": "^9.24.0",
@@ -22,6 +22,26 @@ export function decorateHttpResponse(
22
22
  return resDecorated;
23
23
  }
24
24
 
25
+ export function uWsToRequestNoBody(
26
+ req: HttpRequest,
27
+ res: HttpResponseDecorated
28
+ ): Request {
29
+ const headers = createHeaders(req);
30
+ const method = req.getCaseSensitiveMethod().toUpperCase();
31
+ const isSsl = res.ssl;
32
+
33
+ const url = createURL(req, isSsl ? 'https' : 'http');
34
+
35
+ const init: RequestInit = {
36
+ headers: headers,
37
+ method: method,
38
+ };
39
+
40
+ const request = new Request(url, init);
41
+
42
+ return request;
43
+ }
44
+
25
45
  export function uWsToRequest(
26
46
  req: HttpRequest,
27
47
  res: HttpResponseDecorated,
@@ -109,46 +129,40 @@ function createBody(
109
129
  let size = 0;
110
130
  let hasClosed = false;
111
131
 
112
- return new ReadableStream({
132
+ return new ReadableStream<Uint8Array>({
113
133
  start(controller) {
114
- const onData = (ab: ArrayBuffer, isLast: boolean) => {
115
- // special case of empty body
116
- if (size == 0 && ab.byteLength == 0 && isLast) {
117
- onEnd();
118
- return;
119
- }
134
+ res.onData((tempChunk, isLast) => {
135
+ if (hasClosed) return;
136
+
137
+ // This copies the buffer *immediately* and avoids using a detached buffer
138
+ const chunk = new Uint8Array(tempChunk.byteLength);
139
+ chunk.set(new Uint8Array(tempChunk)); // must be done before enqueue
140
+ size += chunk.byteLength;
120
141
 
121
- size += ab.byteLength;
122
142
  if (!opts.maxBodySize || size <= opts.maxBodySize) {
123
- controller.enqueue(new Uint8Array(ab));
143
+ controller.enqueue(chunk);
124
144
 
125
145
  if (isLast) {
126
- onEnd();
146
+ hasClosed = true;
147
+ controller.close();
127
148
  }
128
-
129
- return;
130
- }
131
- controller.error(
132
- new TRPCError({
133
- code: 'PAYLOAD_TOO_LARGE',
134
- })
135
- );
136
- hasClosed = true;
137
- };
138
-
139
- const onEnd = () => {
140
- if (hasClosed) {
141
- return;
149
+ } else {
150
+ hasClosed = true;
151
+ controller.error(new TRPCError({ code: 'PAYLOAD_TOO_LARGE' }));
142
152
  }
143
- hasClosed = true;
144
- controller.close();
145
- };
153
+ });
146
154
 
147
- res.onData(onData);
148
- res.onAborted(onEnd);
155
+ res.onAborted(() => {
156
+ if (!hasClosed) {
157
+ hasClosed = true;
158
+ controller.error(new TRPCError({ code: 'CLIENT_CLOSED_REQUEST' }));
159
+ }
160
+ });
149
161
  },
150
162
  cancel() {
151
- res.close();
163
+ res.cork(() => {
164
+ res.close();
165
+ });
152
166
  },
153
167
  });
154
168
  }
@@ -1,7 +1,11 @@
1
1
  import uWs from 'uWebSockets.js';
2
2
  import { describe, expect, test } from 'vitest';
3
3
 
4
- import { decorateHttpResponse, uWsToRequest } from './fetchCompat';
4
+ import {
5
+ decorateHttpResponse,
6
+ uWsSendResponseStreamed,
7
+ uWsToRequest,
8
+ } from './fetchCompat';
5
9
  // source: packages/server/src/adapters/node-http/incomingMessageToRequest.test.ts
6
10
 
7
11
  function createServer(opts: { maxBodySize: number | null }) {
@@ -13,7 +17,7 @@ function createServer(opts: { maxBodySize: number | null }) {
13
17
 
14
18
  const app = uWs.App();
15
19
 
16
- app.any('/*', async (res, req) => {
20
+ app.any('/handle', async (res, req) => {
17
21
  const resDecorated = decorateHttpResponse(res);
18
22
 
19
23
  const request = uWsToRequest(req, resDecorated, opts);
@@ -23,6 +27,20 @@ function createServer(opts: { maxBodySize: number | null }) {
23
27
  });
24
28
  });
25
29
 
30
+ app.any('/stream', async (res, req) => {
31
+ const resDecorated = decorateHttpResponse(res);
32
+
33
+ const request = uWsToRequest(req, resDecorated, opts);
34
+ const bytes = await request.bytes();
35
+
36
+ const resFetch = new Response('hello world', {
37
+ status: 200,
38
+ statusText: '200 OK',
39
+ headers: { 'request-size': bytes.length.toString() },
40
+ });
41
+ await uWsSendResponseStreamed(resFetch, resDecorated);
42
+ });
43
+
26
44
  let socket: uWs.us_listen_socket | false | null = null;
27
45
 
28
46
  app.listen('0.0.0.0', 0, (token) => {
@@ -46,7 +64,7 @@ function createServer(opts: { maxBodySize: number | null }) {
46
64
  },
47
65
  fetch: async (
48
66
  opts: RequestInit & {
49
- path?: string;
67
+ path: string;
50
68
  },
51
69
  _handle: (request: Request) => Promise<void>
52
70
  ) => {
@@ -57,20 +75,60 @@ function createServer(opts: { maxBodySize: number | null }) {
57
75
  rejectHandler = reject;
58
76
  });
59
77
 
60
- await fetch(`http://localhost:${port}${opts.path ?? ''}`, {
78
+ await fetch(`http://localhost:${port}${opts.path ?? '/'}`, {
61
79
  ...opts,
62
80
  });
63
81
  await promise;
64
82
  },
83
+ fetchWithResponse: async (
84
+ opts: RequestInit & {
85
+ path?: string;
86
+ }
87
+ ) => {
88
+ return await fetch(`http://localhost:${port}${opts.path ?? ''}`, {
89
+ ...opts,
90
+ });
91
+ },
65
92
  };
66
93
  }
67
94
 
95
+ function slowReadableStream(
96
+ size: number,
97
+ count: number,
98
+ sleepMs: number
99
+ ): ReadableStream {
100
+ const body = '0'.repeat(size);
101
+
102
+ return new ReadableStream({
103
+ start(controller) {
104
+ let i = 0;
105
+ function pump() {
106
+ if (i >= count) {
107
+ controller.close();
108
+ return;
109
+ }
110
+ setTimeout(() => {
111
+ controller.enqueue(body);
112
+ i++;
113
+ pump();
114
+ }, sleepMs);
115
+ }
116
+ pump();
117
+ },
118
+ });
119
+ }
120
+
68
121
  describe('request', () => {
69
122
  test('basic GET', async () => {
70
123
  const server = createServer({ maxBodySize: null });
71
- await server.fetch({}, async (request) => {
72
- expect(request.method).toBe('GET');
73
- });
124
+ await server.fetch(
125
+ {
126
+ path: '/handle',
127
+ },
128
+ async (request) => {
129
+ expect(request.method).toBe('GET');
130
+ }
131
+ );
74
132
  await server.close();
75
133
  });
76
134
 
@@ -79,6 +137,7 @@ describe('request', () => {
79
137
 
80
138
  await server.fetch(
81
139
  {
140
+ path: '/handle',
82
141
  method: 'POST',
83
142
  },
84
143
  async (request) => {
@@ -97,6 +156,7 @@ describe('request', () => {
97
156
 
98
157
  await server.fetch(
99
158
  {
159
+ path: '/handle',
100
160
  method: 'POST',
101
161
  body: JSON.stringify({ hello: 'world' }),
102
162
  headers: {
@@ -117,6 +177,7 @@ describe('request', () => {
117
177
 
118
178
  await server.fetch(
119
179
  {
180
+ path: '/handle',
120
181
  method: 'POST',
121
182
  body,
122
183
  },
@@ -137,6 +198,7 @@ describe('request', () => {
137
198
 
138
199
  await server.fetch(
139
200
  {
201
+ path: '/handle',
140
202
  method: 'POST',
141
203
  body: '0'.repeat(11),
142
204
  },
@@ -155,6 +217,7 @@ describe('request', () => {
155
217
 
156
218
  await server.fetch(
157
219
  {
220
+ path: '/handle',
158
221
  method: 'POST',
159
222
  body: '0'.repeat(9),
160
223
  },
@@ -177,11 +240,11 @@ describe('request', () => {
177
240
  await server.fetch(
178
241
  {
179
242
  method: 'GET',
180
- path: '/?hello=world',
243
+ path: '/handle?hello=world',
181
244
  },
182
245
  async (request) => {
183
246
  const url = new URL(request.url);
184
- expect(url.pathname).toBe('/');
247
+ expect(url.pathname).toBe('/handle');
185
248
  expect(url.searchParams.get('hello')).toBe('world');
186
249
  // expect(url.searchParams.size).toBe(1);
187
250
  }
@@ -194,11 +257,11 @@ describe('request', () => {
194
257
  await server.fetch(
195
258
  {
196
259
  method: 'GET',
197
- path: '/',
260
+ path: '/handle',
198
261
  },
199
262
  async (request) => {
200
263
  const url = new URL(request.url);
201
- expect(url.pathname).toBe('/');
264
+ expect(url.pathname).toBe('/handle');
202
265
  expect(url.searchParams.size).toBe(0);
203
266
  }
204
267
  );
@@ -206,6 +269,22 @@ describe('request', () => {
206
269
  await server.close();
207
270
  });
208
271
 
272
+ test('slow requests are handled', async () => {
273
+ const server = createServer({ maxBodySize: null });
274
+
275
+ const readableStream = slowReadableStream(100, 3, 50);
276
+ const res = await server.fetchWithResponse({
277
+ path: '/stream',
278
+ method: 'POST',
279
+ body: readableStream,
280
+ // @ts-expect-error needed for using the stream
281
+ duplex: 'half',
282
+ });
283
+
284
+ expect(res.ok).equals(true);
285
+ expect(res.headers.get('request-size')).equals('300');
286
+ });
287
+
209
288
  // testing aborts without mocks...is painful...
210
289
  // TODO: recreate the slow request in a same way as is done with slow response
211
290
  test('aborted requests are handled', async () => {
@@ -220,6 +299,7 @@ describe('request', () => {
220
299
  try {
221
300
  await server.fetch(
222
301
  {
302
+ path: '/handle',
223
303
  method: 'POST',
224
304
  body,
225
305
  signal: controller.signal,
@@ -254,6 +334,7 @@ describe('request', () => {
254
334
  }, 5);
255
335
  await server.fetch(
256
336
  {
337
+ path: '/handle',
257
338
  method: 'POST',
258
339
  body,
259
340
  signal: controller.signal,
@@ -40,9 +40,11 @@ const config = {
40
40
  prefix: '/trpc',
41
41
  };
42
42
 
43
- function createContext({ req, res, info, client }: CreateContextOptions) {
43
+ async function createContext({ req, res, info, client }: CreateContextOptions) {
44
44
  const user = { name: req.headers.get('username') || 'anonymous' };
45
45
 
46
+ await new Promise((resolve) => setTimeout(resolve, 10));
47
+
46
48
  if (req.headers.has('throw')) {
47
49
  throw new TRPCError({
48
50
  code: 'BAD_REQUEST',
@@ -68,10 +70,11 @@ function createContext({ req, res, info, client }: CreateContextOptions) {
68
70
  });
69
71
  }
70
72
 
71
- // filter out so that this is not triggered during subscription
72
- // but really, responseMeta should be used instead!
73
+ // test writing headers inside the context
73
74
  if (info.type === 'query') {
74
- res.writeHeader('x-test', 'true');
75
+ res.cork(() => {
76
+ res.writeHeader('x-test', 'true');
77
+ });
75
78
  }
76
79
  return { req, res, user, info, client };
77
80
  }
@@ -548,7 +551,6 @@ describe('server', () => {
548
551
  }
549
552
  `);
550
553
  }
551
-
552
554
  {
553
555
  // batch
554
556
  const { client } = app.getClient('batch');
@@ -820,16 +822,24 @@ describe('websocket', () => {
820
822
  onClose(cause) {
821
823
  closeCode = cause?.code;
822
824
  },
825
+ onError(cause) {
826
+ console.warn('on error called', cause);
827
+ },
823
828
  },
824
829
  });
825
830
 
826
- client.count.subscribe(
827
- {
828
- from: 0,
829
- count: 10,
830
- },
831
- {}
832
- );
831
+ try {
832
+ await client.echo.query('hi');
833
+ } catch (err) {
834
+ //
835
+ }
836
+ // client.count.subscribe(
837
+ // {
838
+ // from: 0,
839
+ // count: 10,
840
+ // },
841
+ // {}
842
+ // );
833
843
 
834
844
  await vi.waitFor(() => {
835
845
  expect(closeCode).toEqual(1008);
package/src/websockets.ts CHANGED
@@ -46,7 +46,7 @@ import {
46
46
  createURL,
47
47
  decorateHttpResponse,
48
48
  HttpResponseDecorated,
49
- uWsToRequest,
49
+ uWsToRequestNoBody,
50
50
  } from './fetchCompat';
51
51
 
52
52
  type RemoveFunctions<T> = {
@@ -58,16 +58,17 @@ type RemoveFunctions<T> = {
58
58
  */
59
59
  export type WebSocketBehaviorOptions = RemoveFunctions<WebSocketBehavior<any>>;
60
60
 
61
- // copying over packages/server/src/adapters/ws.ts
62
-
63
61
  export type WebSocketConnection = WebSocket<WebsocketData>;
64
62
 
63
+ // following packages/server/src/adapters/ws.ts
64
+
65
65
  /**
66
66
  * @public
67
67
  */
68
68
  export type CreateWSSContextFnOptions = NodeHTTPCreateContextFnOptions<
69
69
  Request,
70
- HttpResponseDecorated // res is never used here
70
+ HttpResponseDecorated
71
+ // WebSocketConnection
71
72
  > & {
72
73
  client: WebSocketConnection;
73
74
  };
@@ -129,14 +130,39 @@ export type WebsocketsHandlerOptions<TRouter extends AnyRouter> =
129
130
  uWsBehaviorOptions?: WebSocketBehaviorOptions | undefined;
130
131
  };
131
132
 
133
+ interface Completer {
134
+ promise: Promise<void>;
135
+ resolve: () => void;
136
+ reject: (error: Error) => void;
137
+ }
138
+
139
+ function createCompleter(): Completer {
140
+ let resolve: () => void;
141
+ let reject: (error: Error) => void;
142
+ const promise = new Promise<void>((res, rej) => {
143
+ resolve = res;
144
+ reject = rej;
145
+ });
146
+ return {
147
+ promise,
148
+ resolve: resolve!,
149
+ reject: reject!,
150
+ };
151
+ }
152
+
132
153
  // data bound internally on each client
133
154
  type WebsocketData = {
134
155
  req: Request;
135
156
  clientSubscriptions: Map<number | string, AbortController>;
136
157
  abortController: AbortController;
137
- useConnectionParams: boolean;
138
- contextResolveAttempted: boolean;
139
- ctx: inferRouterContext<AnyRouter> | null;
158
+ ctx: inferRouterContext<AnyRouter> | undefined;
159
+ /**
160
+ * inside-out promise that resolves when context is ready.
161
+ *
162
+ * - when this is null, the context resolution will be started
163
+ * - otherwise all requests must await context resolution
164
+ */
165
+ ctxCompleter: Completer | null;
140
166
  keepAlive: KeepAliver | null;
141
167
  url: URL;
142
168
  };
@@ -165,67 +191,27 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
165
191
  }
166
192
  }
167
193
 
168
- // this deviates from standard implementation
169
- // this function returns true is context was resolved and set
170
- // it returns false if context threw, and execution must be halted.
171
- // this function will cleanup the connection
172
- async function tryResolveContext(
173
- client: WebSocket<WebsocketData>,
174
- getConnectionParams: () => TRPCRequestInfo['connectionParams']
175
- ): Promise<boolean> {
176
- const data = client.getUserData();
177
- data.contextResolveAttempted = true;
178
-
194
+ function getConnectionParams(
195
+ msgStr: string
196
+ ): TRPCRequestInfo['connectionParams'] {
197
+ let msg;
179
198
  try {
180
- data.ctx = await createContext?.({
181
- req: data.req,
182
- // @ts-expect-error res cant be used, but undefined is needed here
183
- // for type compatibility with main handler
184
- res: undefined,
185
- client,
186
- info: {
187
- connectionParams: getConnectionParams(),
188
- calls: [],
189
- isBatchCall: false,
190
- accept: null,
191
- type: 'unknown',
192
- signal: data.abortController.signal,
193
- url: data.url,
194
- },
195
- });
196
- return true;
199
+ msg = JSON.parse(msgStr) as TRPCConnectionParamsMessage;
200
+
201
+ if (!isObject(msg)) {
202
+ throw new Error('Message was not an object');
203
+ }
197
204
  } catch (cause) {
198
- // console.error('could not resolve context, cause', cause);
199
- const error = getTRPCErrorFromUnknown(cause);
200
- opts.onError?.({
201
- error,
202
- path: undefined,
203
- type: 'unknown',
204
- ctx: data.ctx,
205
- req: data.req,
206
- input: undefined,
207
- });
208
- respond(client, {
209
- id: null,
210
- error: getErrorShape({
211
- config: router._def._config,
212
- error,
213
- type: 'unknown',
214
- path: undefined,
215
- input: undefined,
216
- ctx: data.ctx,
217
- }),
205
+ throw new TRPCError({
206
+ code: 'PARSE_ERROR',
207
+ message: `Malformed TRPCConnectionParamsMessage`,
208
+ cause,
218
209
  });
210
+ }
219
211
 
220
- setTimeout(() => {
221
- // trpc wierd behavior:
222
- // no mater whats the websocket close status code, trpc websocket still attemps to reconnect indefinitely
223
- // I chose 1008 as due to https://datatracker.ietf.org/doc/html/rfc6455#section-7.4
224
- client.end(1008, 'bad context');
225
- });
212
+ const connectionParams = parseConnectionParamsFromUnknown(msg.data);
226
213
 
227
- return false;
228
- }
214
+ return connectionParams;
229
215
  }
230
216
 
231
217
  async function handleRequest(
@@ -337,10 +323,6 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
337
323
  let result: null | TRPCResultMessage<unknown>['result'];
338
324
 
339
325
  while (true) {
340
- // using the Promise.race could introduce memory leaks?
341
- // more on this here: https://github.com/cefn/watchable/tree/main/packages/unpromise
342
- // the trpc used Unpromise to accomplish this
343
- // next = await Unpromise.race([
344
326
  next = await Unpromise.race([
345
327
  iterator.next().catch(getTRPCErrorFromUnknown),
346
328
  abortPromise,
@@ -457,15 +439,13 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
457
439
  maxPayloadLength: opts.uWsBehaviorOptions?.maxPayloadLength,
458
440
  maxLifetime: opts.uWsBehaviorOptions?.maxLifetime,
459
441
  idleTimeout: opts.uWsBehaviorOptions?.idleTimeout,
460
- async upgrade(res, req, context) {
442
+ upgrade(res, req, context) {
461
443
  const resDecorated = decorateHttpResponse(res);
462
444
 
463
445
  res.onAborted(() => {
464
446
  resDecorated.aborted = true;
465
447
  });
466
- const reqFetch = uWsToRequest(req, resDecorated, {
467
- maxBodySize: null,
468
- });
448
+ const reqFetch = uWsToRequestNoBody(req, resDecorated);
469
449
 
470
450
  const secWebSocketKey = req.getHeader('sec-websocket-key');
471
451
  const secWebSocketProtocol = req.getHeader('sec-websocket-protocol');
@@ -478,9 +458,8 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
478
458
  clientSubscriptions,
479
459
  abortController,
480
460
  req: reqFetch,
481
- ctx: null,
482
- contextResolveAttempted: false,
483
- useConnectionParams: false,
461
+ ctx: undefined,
462
+ ctxCompleter: null,
484
463
  keepAlive: null,
485
464
  url: createURL(req, resDecorated.sll ? 'wss' : 'ws'),
486
465
  };
@@ -496,19 +475,9 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
496
475
  async open(client) {
497
476
  allClients.add(client);
498
477
 
499
- const data = client.getUserData();
500
-
501
- data.useConnectionParams =
502
- new URL(data.req.url).searchParams.get('connectionParams') === '1';
503
-
504
- if (!data.useConnectionParams) {
505
- const ok = await tryResolveContext(client, () => null);
506
-
507
- if (!ok) return;
508
- }
509
-
510
478
  if (opts.keepAlive?.enabled) {
511
479
  const { pingMs, pongWaitMs } = opts.keepAlive;
480
+ const data = client.getUserData();
512
481
  data.keepAlive = handleKeepAlive(client, pingMs, pongWaitMs);
513
482
  }
514
483
  },
@@ -519,7 +488,6 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
519
488
  data.keepAlive.onMessage();
520
489
  }
521
490
 
522
- // const msgStr = rawMsg.toString(); // or could do this ;
523
491
  const msgStr = Buffer.from(rawMsg).toString();
524
492
 
525
493
  if (msgStr === 'PONG') {
@@ -532,34 +500,71 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
532
500
  return;
533
501
  }
534
502
 
535
- if (data.useConnectionParams && !data.contextResolveAttempted) {
536
- if (data.ctx !== null) {
537
- // TODO: just in case for now, this can be removed later
538
- throw new Error('assertion: context should not be null');
539
- }
540
-
541
- const ok = await tryResolveContext(client, () => {
542
- let msg;
543
- try {
544
- msg = JSON.parse(msgStr) as TRPCConnectionParamsMessage;
545
-
546
- if (!isObject(msg)) {
547
- throw new Error('Message was not an object');
548
- }
549
- } catch (cause) {
550
- throw new TRPCError({
551
- code: 'PARSE_ERROR',
552
- message: `Malformed TRPCConnectionParamsMessage`,
553
- cause,
554
- });
555
- }
503
+ if (data.ctxCompleter == null) {
504
+ data.ctxCompleter = createCompleter();
505
+
506
+ const useConnectionParams =
507
+ new URL(data.req.url).searchParams.get('connectionParams') === '1';
508
+
509
+ try {
510
+ data.ctx = await createContext?.({
511
+ req: data.req,
512
+ res: client as unknown as HttpResponseDecorated,
513
+ client: client,
514
+ info: {
515
+ connectionParams: useConnectionParams
516
+ ? getConnectionParams(msgStr)
517
+ : null,
518
+ calls: [],
519
+ isBatchCall: false,
520
+ accept: null,
521
+ type: 'unknown',
522
+ signal: data.abortController.signal,
523
+ url: data.url, // was null
524
+ },
525
+ });
526
+ data.ctxCompleter.resolve();
527
+ } catch (cause) {
528
+ const error = getTRPCErrorFromUnknown(cause);
529
+ opts.onError?.({
530
+ ctx: data.ctx,
531
+ error: error,
532
+ input: undefined,
533
+ path: undefined,
534
+ type: 'unknown',
535
+ req: data.req,
536
+ });
537
+ respond(client, {
538
+ id: null,
539
+ error: getErrorShape({
540
+ config: router._def._config,
541
+ error,
542
+ type: 'unknown',
543
+ path: undefined,
544
+ input: undefined,
545
+ ctx: data.ctx,
546
+ }),
547
+ });
548
+ data.ctxCompleter.reject(error);
556
549
 
557
- const connectionParams = parseConnectionParamsFromUnknown(msg.data);
550
+ // close in next tick
551
+ (globalThis.setImmediate ?? globalThis.setTimeout)(() => {
552
+ client.end(1008);
553
+ });
554
+ }
558
555
 
559
- return connectionParams;
560
- });
556
+ if (useConnectionParams) {
557
+ // fully consume first message
558
+ return;
559
+ }
560
+ }
561
561
 
562
- if (!ok) return;
562
+ try {
563
+ await data.ctxCompleter.promise;
564
+ } catch {
565
+ // stop execution of pending requests when context could not be resolved
566
+ // single error message will be sent
567
+ return;
563
568
  }
564
569
 
565
570
  try {
@@ -4,6 +4,7 @@ export type HttpResponseDecorated = HttpResponse & {
4
4
  ssl: boolean;
5
5
  };
6
6
  export declare function decorateHttpResponse(res: HttpResponse, ssl?: boolean): HttpResponseDecorated;
7
+ export declare function uWsToRequestNoBody(req: HttpRequest, res: HttpResponseDecorated): Request;
7
8
  export declare function uWsToRequest(req: HttpRequest, res: HttpResponseDecorated, opts: {
8
9
  /**
9
10
  * Max body size in bytes. If the body is larger than this, the request will be aborted
@@ -63,13 +63,23 @@ export type WebsocketsHandlerOptions<TRouter extends AnyRouter> = WSConnectionHa
63
63
  */
64
64
  uWsBehaviorOptions?: WebSocketBehaviorOptions | undefined;
65
65
  };
66
+ interface Completer {
67
+ promise: Promise<void>;
68
+ resolve: () => void;
69
+ reject: (error: Error) => void;
70
+ }
66
71
  type WebsocketData = {
67
72
  req: Request;
68
73
  clientSubscriptions: Map<number | string, AbortController>;
69
74
  abortController: AbortController;
70
- useConnectionParams: boolean;
71
- contextResolveAttempted: boolean;
72
- ctx: inferRouterContext<AnyRouter> | null;
75
+ ctx: inferRouterContext<AnyRouter> | undefined;
76
+ /**
77
+ * inside-out promise that resolves when context is ready.
78
+ *
79
+ * - when this is null, the context resolution will be started
80
+ * - otherwise all requests must await context resolution
81
+ */
82
+ ctxCompleter: Completer | null;
73
83
  keepAlive: KeepAliver | null;
74
84
  url: URL;
75
85
  };