trpc-uwebsockets 11.0.2 → 11.0.4-canary.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
@@ -25,7 +25,7 @@ import {
25
25
  CreateContextOptions,
26
26
  } from 'trpc-uwebsockets';
27
27
 
28
- /* Define context. `client` is available when websocket connection is used */
28
+ /* Define context. During websocket connection do not use `res`, use `client` instead */
29
29
  function createContext({ req, res, info, client }: CreateContextOptions) {
30
30
  const user = { name: req.headers.get('username') || 'anonymous' };
31
31
  return { req, res, user, info, client };
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.testFactory = testFactory;
7
+ const vitest_1 = require("vitest");
8
+ const websockets_1 = require("./websockets");
9
+ const observable_1 = require("@trpc/server/observable");
10
+ const uWebSockets_js_1 = __importDefault(require("uWebSockets.js"));
11
+ const requestHandler_1 = require("./requestHandler");
12
+ const client_1 = require("@trpc/client");
13
+ const event_source_polyfill_1 = require("event-source-polyfill");
14
+ global.EventSource = event_source_polyfill_1.EventSourcePolyfill;
15
+ function createServer(opts) {
16
+ const prefix = opts.prefix ?? '/trpc';
17
+ const instance = uWebSockets_js_1.default.App();
18
+ const router = opts.appRouter;
19
+ const onServerErrorSpy = vitest_1.vi.fn();
20
+ (0, requestHandler_1.applyRequestHandler)(instance, {
21
+ prefix,
22
+ ssl: false,
23
+ trpcOptions: {
24
+ router,
25
+ createContext: opts.createContext ?? (() => ({})),
26
+ onError(data) {
27
+ onServerErrorSpy(data);
28
+ },
29
+ responseMeta() {
30
+ return {
31
+ headers: {
32
+ 'Access-Control-Allow-Origin': '*',
33
+ },
34
+ };
35
+ },
36
+ },
37
+ });
38
+ (0, websockets_1.applyWebsocketHandler)(instance, {
39
+ prefix,
40
+ ssl: false,
41
+ router,
42
+ createContext: opts.createContext ?? (() => ({})),
43
+ onError(data) {
44
+ onServerErrorSpy(data);
45
+ },
46
+ uWsBehaviorOptions: opts.uWsBehaviorOptions,
47
+ keepAlive: opts.keepAlive,
48
+ });
49
+ instance.get('/hello', async (res) => {
50
+ res.end('Hello world');
51
+ });
52
+ instance.post('/hello', async (res) => {
53
+ res.end(JSON.stringify({ hello: 'POST', body: 'TODO, why?' }));
54
+ });
55
+ instance.ws('/ws', {
56
+ message: (client, rawMsg) => {
57
+ client.send(rawMsg);
58
+ },
59
+ });
60
+ instance.ws('/pubsub', {
61
+ open: (client) => {
62
+ const ok = client.subscribe('topic');
63
+ if (!ok) {
64
+ throw new Error("assertion: failed to subscribe to 'topic'");
65
+ }
66
+ },
67
+ });
68
+ instance.any('/*', (res) => {
69
+ res.writeStatus('404 NOT FOUND');
70
+ res.end();
71
+ });
72
+ let socket = null;
73
+ instance.listen('0.0.0.0', 0, (token) => {
74
+ socket = token;
75
+ });
76
+ if (!socket) {
77
+ throw new Error('could not make a socket');
78
+ }
79
+ const port = uWebSockets_js_1.default.us_socket_local_port(socket);
80
+ return {
81
+ stop() {
82
+ if (!socket) {
83
+ throw new Error('could not close socket as socket is already closed');
84
+ }
85
+ uWebSockets_js_1.default.us_listen_socket_close(socket);
86
+ socket = null;
87
+ },
88
+ port,
89
+ instance,
90
+ onServerErrorSpy,
91
+ };
92
+ }
93
+ function makeLinkSpy() {
94
+ const orderedResults = [];
95
+ const linkSpy = () => {
96
+ // here we just got initialized in the app - this happens once per app
97
+ // useful for storing cache for instance
98
+ return ({ next, op }) => {
99
+ // this is when passing the result to the next link
100
+ // each link needs to return an observable which propagates results
101
+ return (0, observable_1.observable)((observer) => {
102
+ const unsubscribe = next(op).subscribe({
103
+ next(value) {
104
+ const data = value.result.data;
105
+ if (data !== undefined) {
106
+ orderedResults.push(data);
107
+ }
108
+ observer.next(value);
109
+ },
110
+ error: observer.error,
111
+ });
112
+ return unsubscribe;
113
+ });
114
+ };
115
+ };
116
+ return {
117
+ orderedResults,
118
+ linkSpy,
119
+ };
120
+ }
121
+ function toQueryString(queryParams) {
122
+ const raw = new URLSearchParams(queryParams).toString();
123
+ return raw.length == 0 ? '' : `?${raw}`;
124
+ }
125
+ function createClientWs(router, opts) {
126
+ const prefix = opts.prefix ?? '/trpc';
127
+ const transformer = router._def._config.transformer;
128
+ const qs = toQueryString(opts.queryParams ?? {});
129
+ const host = `localhost:${opts.port}${prefix}${qs}`;
130
+ const wsClient = (0, client_1.createWSClient)({
131
+ retryDelayMs: () => 99999, // never retry by default
132
+ ...opts.wsClientOptions,
133
+ url: `ws://${host}`,
134
+ });
135
+ const { orderedResults, linkSpy } = makeLinkSpy();
136
+ const client = (0, client_1.createTRPCClient)({
137
+ links: [linkSpy, (0, client_1.wsLink)({ client: wsClient, transformer })],
138
+ });
139
+ return { client, wsClient, orderedResults };
140
+ }
141
+ function createClientBatchStream(router, opts) {
142
+ const prefix = opts.prefix ?? '/trpc';
143
+ const transformer = router._def._config.transformer;
144
+ const qs = toQueryString(opts.queryParams ?? {});
145
+ const host = `localhost:${opts.port}${prefix}${qs}`;
146
+ const { orderedResults, linkSpy } = makeLinkSpy();
147
+ const client = (0, client_1.createTRPCClient)({
148
+ links: [
149
+ linkSpy,
150
+ (0, client_1.httpBatchStreamLink)({
151
+ url: `http://${host}`,
152
+ headers: opts.headers,
153
+ transformer,
154
+ }),
155
+ ],
156
+ });
157
+ return { client, orderedResults };
158
+ }
159
+ function createClientBatch(router, opts) {
160
+ const prefix = opts.prefix ?? '/trpc';
161
+ const transformer = router._def._config.transformer;
162
+ const qs = toQueryString(opts.queryParams ?? {});
163
+ const host = `localhost:${opts.port}${prefix}${qs}`;
164
+ const client = (0, client_1.createTRPCClient)({
165
+ links: [
166
+ (0, client_1.httpBatchLink)({
167
+ url: `http://${host}`,
168
+ headers: opts.headers,
169
+ transformer,
170
+ }),
171
+ ],
172
+ });
173
+ return { client };
174
+ }
175
+ function createClientSse(router, opts) {
176
+ const prefix = opts.prefix ?? '/trpc';
177
+ const transformer = router._def._config.transformer;
178
+ const qs = toQueryString(opts.queryParams ?? {});
179
+ const host = `localhost:${opts.port}${prefix}${qs}`;
180
+ const { orderedResults, linkSpy } = makeLinkSpy();
181
+ const client = (0, client_1.createTRPCClient)({
182
+ links: [
183
+ linkSpy,
184
+ (0, client_1.httpSubscriptionLink)({
185
+ url: `http://${host}`,
186
+ connectionParams: opts.wsClientOptions?.connectionParams,
187
+ // ponyfill EventSource
188
+ EventSource: event_source_polyfill_1.EventSourcePolyfill,
189
+ transformer,
190
+ }),
191
+ ],
192
+ });
193
+ return { client, orderedResults };
194
+ }
195
+ function testFactory(serverOptions) {
196
+ const { instance, port, stop, onServerErrorSpy } = createServer({
197
+ ...serverOptions,
198
+ });
199
+ return {
200
+ server: instance,
201
+ stop,
202
+ onServerErrorSpy,
203
+ port,
204
+ opts: serverOptions,
205
+ fetch(path, opts) {
206
+ return fetch(`http://localhost:${port}${path}`, { ...opts });
207
+ },
208
+ clientBatchStream(clientOptions) {
209
+ return createClientBatchStream(serverOptions.appRouter, {
210
+ ...clientOptions,
211
+ port,
212
+ });
213
+ },
214
+ clientBatch(clientOptions) {
215
+ return createClientBatch(serverOptions.appRouter, {
216
+ ...clientOptions,
217
+ port,
218
+ });
219
+ },
220
+ clientSse(clientOptions) {
221
+ return createClientSse(serverOptions.appRouter, {
222
+ ...clientOptions,
223
+ port,
224
+ });
225
+ },
226
+ clientWs(clientOptions) {
227
+ return createClientWs(serverOptions.appRouter, {
228
+ ...clientOptions,
229
+ port,
230
+ });
231
+ },
232
+ };
233
+ }
234
+ //# sourceMappingURL=___testHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"___testHelpers.js","sourceRoot":"","sources":["../src/___testHelpers.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -60,8 +60,20 @@ const http_1 = require("@trpc/server/http");
60
60
  const observable_1 = require("@trpc/server/observable");
61
61
  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
- const url_1 = require("url");
64
63
  const fetchCompat_1 = require("./fetchCompat");
64
+ function createCompleter() {
65
+ let resolve;
66
+ let reject;
67
+ const promise = new Promise((res, rej) => {
68
+ resolve = res;
69
+ reject = rej;
70
+ });
71
+ return {
72
+ promise,
73
+ resolve: resolve,
74
+ reject: reject,
75
+ };
76
+ }
65
77
  function getWSConnectionHandler(opts, allClients) {
66
78
  const { createContext, router } = opts;
67
79
  const { transformer } = router._def._config;
@@ -75,62 +87,23 @@ function getWSConnectionHandler(opts, allClients) {
75
87
  // and server is sending keepalive messages
76
88
  }
77
89
  }
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;
90
+ function getConnectionParams(msgStr) {
91
+ let msg;
85
92
  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;
93
+ msg = JSON.parse(msgStr);
94
+ if (!(0, unstable_core_do_not_import_1.isObject)(msg)) {
95
+ throw new Error('Message was not an object');
96
+ }
103
97
  }
104
98
  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');
99
+ throw new server_1.TRPCError({
100
+ code: 'PARSE_ERROR',
101
+ message: `Malformed TRPCConnectionParamsMessage`,
102
+ cause,
131
103
  });
132
- return false;
133
104
  }
105
+ const connectionParams = (0, http_1.parseConnectionParamsFromUnknown)(msg.data);
106
+ return connectionParams;
134
107
  }
135
108
  async function handleRequest(client, msg) {
136
109
  const { clientSubscriptions, ctx, req } = client.getUserData();
@@ -223,10 +196,6 @@ function getWSConnectionHandler(opts, allClients) {
223
196
  let next;
224
197
  let result;
225
198
  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
199
  next = await unstable_core_do_not_import_1.Unpromise.race([
231
200
  iterator.next().catch(server_1.getTRPCErrorFromUnknown),
232
201
  abortPromise,
@@ -346,14 +315,12 @@ function getWSConnectionHandler(opts, allClients) {
346
315
  maxPayloadLength: opts.uWsBehaviorOptions?.maxPayloadLength,
347
316
  maxLifetime: opts.uWsBehaviorOptions?.maxLifetime,
348
317
  idleTimeout: opts.uWsBehaviorOptions?.idleTimeout,
349
- async upgrade(res, req, context) {
318
+ upgrade(res, req, context) {
350
319
  const resDecorated = (0, fetchCompat_1.decorateHttpResponse)(res);
351
320
  res.onAborted(() => {
352
321
  resDecorated.aborted = true;
353
322
  });
354
- const reqFetch = (0, fetchCompat_1.uWsToRequest)(req, resDecorated, {
355
- maxBodySize: null,
356
- });
323
+ const reqFetch = (0, fetchCompat_1.uWsToRequestNoBody)(req, resDecorated);
357
324
  const secWebSocketKey = req.getHeader('sec-websocket-key');
358
325
  const secWebSocketProtocol = req.getHeader('sec-websocket-protocol');
359
326
  const secWebSocketExtensions = req.getHeader('sec-websocket-extensions');
@@ -363,9 +330,8 @@ function getWSConnectionHandler(opts, allClients) {
363
330
  clientSubscriptions,
364
331
  abortController,
365
332
  req: reqFetch,
366
- ctx: null,
367
- contextResolveAttempted: false,
368
- useConnectionParams: false,
333
+ ctx: undefined,
334
+ ctxCompleter: null,
369
335
  keepAlive: null,
370
336
  url: (0, fetchCompat_1.createURL)(req, resDecorated.sll ? 'wss' : 'ws'),
371
337
  };
@@ -373,16 +339,9 @@ function getWSConnectionHandler(opts, allClients) {
373
339
  },
374
340
  async open(client) {
375
341
  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
342
  if (opts.keepAlive?.enabled) {
385
343
  const { pingMs, pongWaitMs } = opts.keepAlive;
344
+ const data = client.getUserData();
386
345
  data.keepAlive = handleKeepAlive(client, pingMs, pongWaitMs);
387
346
  }
388
347
  },
@@ -391,7 +350,6 @@ function getWSConnectionHandler(opts, allClients) {
391
350
  if (data.keepAlive) {
392
351
  data.keepAlive.onMessage();
393
352
  }
394
- // const msgStr = rawMsg.toString(); // or could do this ;
395
353
  const msgStr = Buffer.from(rawMsg).toString();
396
354
  if (msgStr === 'PONG') {
397
355
  return;
@@ -402,31 +360,67 @@ function getWSConnectionHandler(opts, allClients) {
402
360
  }
403
361
  return;
404
362
  }
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');
363
+ if (data.ctxCompleter == null) {
364
+ data.ctxCompleter = createCompleter();
365
+ const useConnectionParams = data.url.searchParams.get('connectionParams') === '1';
366
+ try {
367
+ data.ctx = await createContext?.({
368
+ req: data.req,
369
+ res: client,
370
+ client: client,
371
+ info: {
372
+ connectionParams: useConnectionParams
373
+ ? getConnectionParams(msgStr)
374
+ : null,
375
+ calls: [],
376
+ isBatchCall: false,
377
+ accept: null,
378
+ type: 'unknown',
379
+ signal: data.abortController.signal,
380
+ url: data.url,
381
+ },
382
+ });
383
+ data.ctxCompleter.resolve();
409
384
  }
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)
385
+ catch (cause) {
386
+ const error = (0, server_1.getTRPCErrorFromUnknown)(cause);
387
+ opts.onError?.({
388
+ ctx: data.ctx,
389
+ error: error,
390
+ input: undefined,
391
+ path: undefined,
392
+ type: 'unknown',
393
+ req: data.req,
394
+ });
395
+ respond(client, {
396
+ id: null,
397
+ error: (0, server_1.getErrorShape)({
398
+ config: router._def._config,
399
+ error,
400
+ type: 'unknown',
401
+ path: undefined,
402
+ input: undefined,
403
+ ctx: data.ctx,
404
+ }),
405
+ });
406
+ data.ctxCompleter.reject(error);
407
+ // close in next tick
408
+ (globalThis.setImmediate ?? globalThis.setTimeout)(() => {
409
+ client.end(1008);
410
+ });
411
+ }
412
+ if (useConnectionParams) {
413
+ // fully consume first message
429
414
  return;
415
+ }
416
+ }
417
+ try {
418
+ await data.ctxCompleter.promise;
419
+ }
420
+ catch {
421
+ // stop execution of pending requests when context could not be resolved
422
+ // single error message will be sent
423
+ return;
430
424
  }
431
425
  try {
432
426
  const msgJSON = JSON.parse(msgStr);