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 +20 -12
- package/dist/applyWsHandler.js +10 -5
- package/dist/applyWsHandler.js.map +1 -1
- package/dist/createUWebsocketsHandler.js +30 -0
- package/dist/createUWebsocketsHandler.js.map +1 -0
- package/dist/index.js +5 -28
- package/dist/index.js.map +1 -1
- package/dist/requestHandler.js +7 -5
- package/dist/requestHandler.js.map +1 -1
- package/package.json +4 -3
- package/src/applyWsHandler.ts +14 -6
- package/src/createUWebsocketsHandler.ts +35 -0
- package/src/index.ts +2 -37
- package/src/requestHandler.ts +7 -6
- package/test/index.spec.ts +240 -142
- package/types/createUWebsocketsHandler.d.ts +9 -0
- package/types/index.d.ts +2 -10
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
|
-
|
|
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
|
|
package/dist/applyWsHandler.js
CHANGED
|
@@ -282,11 +282,16 @@ function applyWSHandler(app, prefix, opts) {
|
|
|
282
282
|
ctx: data.ctx,
|
|
283
283
|
}),
|
|
284
284
|
});
|
|
285
|
-
//
|
|
286
|
-
//
|
|
287
|
-
|
|
288
|
-
|
|
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":";;;AAEA,yCASsB;AAGtB,wDAAuE;AAQvE,2EAA2E;AAC3E,gDAA2E;AAE3E,mCAAoD;AAEpD,uCAAuC;AACvC,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE;QACzD,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;KAClC;AACH,CAAC;AACD,uCAAuC;AACvC,SAAS,qBAAqB,CAAC,GAAY;IACzC,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,cAAc,IAAI,GAAG,KAAK,UAAU,EAAE;QACnE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;KAC3C;AACH,CAAC;AACD,uCAAuC;AACvC,SAAS,iBAAiB,CACxB,GAAY;IAEZ,IACE,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,KAAK,CAAC,GAAG,CAAC;QACV,OAAO,GAAG,KAAK,QAAQ,EACvB;QACA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;KACvC;AACH,CAAC;AACD,uCAAuC;AACvC,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;KACnC;AACH,CAAC;AACD,uCAAuC;AACvC,SAAS,2BAA2B,CAClC,GAAY;IAEZ,IAAI,OAAO,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,KAAK,EAAE;QAC/C,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;KACxC;AACH,CAAC;AACD,SAAS,YAAY,CACnB,GAAY,EACZ,WAAoC;IAEpC,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAC5C,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,mBAAmB,EAAE;QAClC,OAAO;YACL,EAAE;YACF,OAAO;YACP,MAAM;SACP,CAAC;KACH;IACD,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACzC,cAAc,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtD,OAAO;QACL,EAAE;QACF,OAAO;QACP,MAAM;QACN,MAAM,EAAE;YACN,KAAK;YACL,IAAI;SACL;KACF,CAAC;AACJ,CAAC;
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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":";;;;;;;;;;;;;;;;;
|
|
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"}
|
package/dist/requestHandler.js
CHANGED
|
@@ -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
|
-
|
|
18
|
-
|
|
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":";;;AACA,mCAAsC;AAOtC,4CAAwD;AAEjD,KAAK,UAAU,qBAAqB,CAIzC,IAA8D;IAC9D,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;
|
|
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.
|
|
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": "
|
|
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.
|
|
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",
|
package/src/applyWsHandler.ts
CHANGED
|
@@ -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
|
-
//
|
|
393
|
-
//
|
|
394
|
-
|
|
395
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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
|
-
}
|
package/src/requestHandler.ts
CHANGED
|
@@ -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
|
-
|
|
30
|
-
|
|
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
|
|
package/test/index.spec.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
152
|
+
'Access-Control-Allow-Origin': '*',
|
|
131
153
|
},
|
|
132
154
|
};
|
|
133
155
|
},
|
|
134
156
|
|
|
135
|
-
router
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
})
|
|
257
|
-
|
|
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
|
-
|
|
291
|
-
await
|
|
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
|
-
|
|
300
|
-
expect(
|
|
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
|
-
|
|
305
|
-
|
|
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
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
-
|
|
330
|
-
});
|
|
362
|
+
expect.assertions(1);
|
|
331
363
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
|
|
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
|
-
|
|
400
|
+
const { client, closeWs } = makeClientWithWs({});
|
|
351
401
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
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
|
-
|
|
413
|
+
// onStartedMock.
|
|
364
414
|
|
|
365
|
-
|
|
415
|
+
// expect(onStartedMock).toh
|
|
366
416
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
425
|
+
ee.emit('server:msg', {
|
|
426
|
+
id: '3',
|
|
427
|
+
});
|
|
428
|
+
await sleep(500);
|
|
429
|
+
expect(onDataMock).toHaveBeenCalledTimes(3);
|
|
380
430
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
431
|
+
// await waitFor(() => {
|
|
432
|
+
// expect(onDataMock).toHaveBeenCalledTimes(3);
|
|
433
|
+
// });
|
|
384
434
|
|
|
385
|
-
|
|
435
|
+
expect(onDataMock.mock.calls).toMatchInlineSnapshot(`
|
|
386
436
|
[
|
|
387
437
|
[
|
|
388
438
|
{
|
|
@@ -402,16 +452,64 @@ test(
|
|
|
402
452
|
]
|
|
403
453
|
`);
|
|
404
454
|
|
|
405
|
-
|
|
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
|
-
|
|
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
|
-
|
|
410
|
-
|
|
484
|
+
const client = createTRPCProxyClient<AppRouter>({
|
|
485
|
+
links: [wsLink({ client: wsClient })],
|
|
486
|
+
});
|
|
411
487
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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;
|