trpc-uwebsockets 0.9.1 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/utils.js +17 -22
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +8 -11
- package/src/types.ts +10 -2
- package/src/utils.ts +18 -19
- package/test/index.spec.ts +29 -1
- package/types/index.d.ts +3 -4
- package/types/types.d.ts +2 -1
package/README.md
CHANGED
|
@@ -78,6 +78,37 @@ app.listen('0.0.0.0', 8000, () => {
|
|
|
78
78
|
|
|
79
79
|
# API
|
|
80
80
|
|
|
81
|
+
Create uWebSockets handler options
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
function createUWebSocketsHandler<TRouter extends AnyRouter>(
|
|
85
|
+
/* instance of the uWebSockets server */
|
|
86
|
+
uWsApp: TemplatedApp,
|
|
87
|
+
/* Path to trpc without trailing slash (ex: "/trpc") */
|
|
88
|
+
pathPrefix: string,
|
|
89
|
+
/* Handler options */
|
|
90
|
+
opts: UWebSocketsCreateHandlerOptions<TRouter>
|
|
91
|
+
);
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Handler options
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
type UWebSocketsCreateHandlerOptions<TRouter extends AnyRouter> = {
|
|
98
|
+
/* trpc router */
|
|
99
|
+
router: TRouter;
|
|
100
|
+
/* optional create context */
|
|
101
|
+
createContext?: (
|
|
102
|
+
opts: UWebSocketsCreateContextOptions
|
|
103
|
+
) => Promise<inferRouterContext<TRouter>> | inferRouterContext<TRouter>;
|
|
104
|
+
/* optional pre-request handler. Useful for dealing with CORS, or sending extra headers */
|
|
105
|
+
onRequest?: (
|
|
106
|
+
req: UWebSocketsRequestObject,
|
|
107
|
+
res: UWebSocketsResponseObject
|
|
108
|
+
) => void;
|
|
109
|
+
};
|
|
110
|
+
```
|
|
111
|
+
|
|
81
112
|
Create context options
|
|
82
113
|
|
|
83
114
|
```typescript
|
|
@@ -90,7 +121,7 @@ type UWebSocketsCreateContextOptions = {
|
|
|
90
121
|
path: string;
|
|
91
122
|
getCookies: (opts?: CookieParseOptions) => Record<string, string>;
|
|
92
123
|
};
|
|
93
|
-
/*
|
|
124
|
+
/* minimal response interface */
|
|
94
125
|
res: {
|
|
95
126
|
setStatus(status: number): void;
|
|
96
127
|
setHeader(key: string, value: string): void;
|
package/dist/index.js
CHANGED
|
@@ -23,10 +23,9 @@ const utils_1 = require("./utils");
|
|
|
23
23
|
const cookie_1 = __importDefault(require("cookie"));
|
|
24
24
|
__exportStar(require("./types"), exports);
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
27
26
|
* @param uWsApp uWebsockets server instance
|
|
28
|
-
* @param pathPrefix The path to
|
|
29
|
-
* @param opts
|
|
27
|
+
* @param pathPrefix The path to trpc without trailing slash (ex: "/trpc")
|
|
28
|
+
* @param opts handler options
|
|
30
29
|
*/
|
|
31
30
|
function createUWebSocketsHandler(uWsApp, pathPrefix, opts) {
|
|
32
31
|
const prefixTrimLength = pathPrefix.length + 1; // remove /* from url
|
|
@@ -109,6 +108,8 @@ function createUWebSocketsHandler(uWsApp, pathPrefix, opts) {
|
|
|
109
108
|
// res.end();
|
|
110
109
|
// return;
|
|
111
110
|
}
|
|
111
|
+
if (opts.onRequest)
|
|
112
|
+
opts.onRequest(request, response);
|
|
112
113
|
//send all cookies
|
|
113
114
|
resOverride.cookies.forEach((value) => {
|
|
114
115
|
res.writeHeader('Set-Cookie', value);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,yCAIsB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.js
CHANGED
|
@@ -26,30 +26,25 @@ function readPostBody(method, res) {
|
|
|
26
26
|
}
|
|
27
27
|
let buffer;
|
|
28
28
|
res.onData((ab, isLast) => {
|
|
29
|
+
//resolve right away if there is only one chunk
|
|
30
|
+
if (buffer === undefined && isLast) {
|
|
31
|
+
resolve({
|
|
32
|
+
ok: true,
|
|
33
|
+
data: Buffer.from(ab).toString(),
|
|
34
|
+
});
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
29
37
|
const chunk = Buffer.from(ab);
|
|
38
|
+
//else accumulate
|
|
39
|
+
if (buffer)
|
|
40
|
+
buffer = Buffer.concat([buffer, chunk]);
|
|
41
|
+
else
|
|
42
|
+
buffer = Buffer.concat([chunk]);
|
|
30
43
|
if (isLast) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
data: buffer.toString(), // do i need utf8?
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
// only a single chunk was recieved
|
|
40
|
-
resolve({
|
|
41
|
-
ok: true,
|
|
42
|
-
data: chunk.toString(),
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
if (buffer) {
|
|
48
|
-
buffer = Buffer.concat([buffer, chunk]);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
buffer = Buffer.concat([chunk]);
|
|
52
|
-
}
|
|
44
|
+
resolve({
|
|
45
|
+
ok: true,
|
|
46
|
+
data: buffer.toString(),
|
|
47
|
+
});
|
|
53
48
|
}
|
|
54
49
|
});
|
|
55
50
|
res.onAborted(() => {
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAyC;AAEzC,oDAAoD;AACpD;;EAEE;AAEK,MAAM,WAAW,GACtB,CAAC,OAA+B,EAAE,EAAE,CAAC,CAAC,IAAyB,EAAE,EAAE;IACjE,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,OAAO,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC,CAAC;AALS,QAAA,WAAW,eAKpB;AAEJ,SAAgB,YAAY,CAAC,MAAc,EAAE,GAAiB;IAC5D,OAAO,IAAI,OAAO,CAEhB,CAAC,OAAO,EAAE,EAAE;QACZ,IAAI,MAAM,IAAI,KAAK,EAAE;YACnB,yBAAyB;YACzB,OAAO,CAAC;gBACN,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;SACJ;QAED,IAAI,MAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAyC;AAEzC,oDAAoD;AACpD;;EAEE;AAEK,MAAM,WAAW,GACtB,CAAC,OAA+B,EAAE,EAAE,CAAC,CAAC,IAAyB,EAAE,EAAE;IACjE,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,OAAO,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC,CAAC;AALS,QAAA,WAAW,eAKpB;AAEJ,SAAgB,YAAY,CAAC,MAAc,EAAE,GAAiB;IAC5D,OAAO,IAAI,OAAO,CAEhB,CAAC,OAAO,EAAE,EAAE;QACZ,IAAI,MAAM,IAAI,KAAK,EAAE;YACnB,yBAAyB;YACzB,OAAO,CAAC;gBACN,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;SACJ;QAED,IAAI,MAAc,CAAC;QAEnB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;YACxB,+CAA+C;YAC/C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,EAAE;gBAClC,OAAO,CAAC;oBACN,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;iBACjC,CAAC,CAAC;gBACH,OAAO;aACR;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE9B,iBAAiB;YACjB,IAAI,MAAM;gBAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;;gBAC/C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAErC,IAAI,MAAM,EAAE;gBACV,OAAO,CAAC;oBACN,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;iBACxB,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,OAAO,CAAC;gBACN,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;aACxD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AA7CD,oCA6CC"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"private": false,
|
|
3
3
|
"name": "trpc-uwebsockets",
|
|
4
4
|
"description": "tRPC adapter for uWebSockets.js server",
|
|
5
|
-
"version": "0.9.
|
|
5
|
+
"version": "0.9.4",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"type": "commonjs",
|
|
8
8
|
"types": "./types/index.d.ts",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"test:coverage": "jest --coverage",
|
|
16
16
|
"test:publish": "yarn test && yarn build && yarn pack",
|
|
17
17
|
"prebuild": "yarn clean",
|
|
18
|
-
"prepublishOnly": "yarn prettier && yarn lint && yarn build",
|
|
18
|
+
"prepublishOnly": "yarn prettier && yarn lint && yarn test && yarn build",
|
|
19
19
|
"clean": "rimraf -rf ./dist && rimraf -rf ./types && rimraf -rf ./*-*.tgz",
|
|
20
20
|
"format": "yarn prettier && yarn lint",
|
|
21
21
|
"lint": "eslint . --ext .ts --fix",
|
package/src/index.ts
CHANGED
|
@@ -4,15 +4,10 @@ import {
|
|
|
4
4
|
resolveHTTPResponse,
|
|
5
5
|
} from '@trpc/server';
|
|
6
6
|
import { HTTPRequest } from '@trpc/server/dist/declarations/src/http/internals/types';
|
|
7
|
-
import {
|
|
8
|
-
import type {
|
|
9
|
-
HttpRequest,
|
|
10
|
-
HttpResponse,
|
|
11
|
-
RecognizedString,
|
|
12
|
-
TemplatedApp,
|
|
13
|
-
} from 'uWebSockets.js';
|
|
7
|
+
import { CookieSerializeOptions } from 'cookie';
|
|
8
|
+
import type { HttpRequest, HttpResponse, TemplatedApp } from 'uWebSockets.js';
|
|
14
9
|
import {
|
|
15
|
-
|
|
10
|
+
UWebSocketsCreateHandlerOptions,
|
|
16
11
|
UWebSocketsRequestObject,
|
|
17
12
|
UWebSocketsResponseObject,
|
|
18
13
|
} from './types';
|
|
@@ -21,10 +16,9 @@ import cookie from 'cookie';
|
|
|
21
16
|
export * from './types';
|
|
22
17
|
|
|
23
18
|
/**
|
|
24
|
-
*
|
|
25
19
|
* @param uWsApp uWebsockets server instance
|
|
26
|
-
* @param pathPrefix The path to
|
|
27
|
-
* @param opts
|
|
20
|
+
* @param pathPrefix The path to trpc without trailing slash (ex: "/trpc")
|
|
21
|
+
* @param opts handler options
|
|
28
22
|
*/
|
|
29
23
|
export function createUWebSocketsHandler<TRouter extends AnyRouter>(
|
|
30
24
|
uWsApp: TemplatedApp,
|
|
@@ -41,6 +35,7 @@ export function createUWebSocketsHandler<TRouter extends AnyRouter>(
|
|
|
41
35
|
req.setYield(true);
|
|
42
36
|
return;
|
|
43
37
|
}
|
|
38
|
+
|
|
44
39
|
const path = req.getUrl().substring(prefixTrimLength);
|
|
45
40
|
const query = new URLSearchParams(decodeURIComponent(req.getQuery()));
|
|
46
41
|
|
|
@@ -128,6 +123,8 @@ export function createUWebSocketsHandler<TRouter extends AnyRouter>(
|
|
|
128
123
|
// return;
|
|
129
124
|
}
|
|
130
125
|
|
|
126
|
+
if (opts.onRequest) opts.onRequest(request, response);
|
|
127
|
+
|
|
131
128
|
//send all cookies
|
|
132
129
|
resOverride.cookies.forEach((value) => {
|
|
133
130
|
res.writeHeader('Set-Cookie', value);
|
package/src/types.ts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { AnyRouter, inferRouterContext } from '@trpc/server';
|
|
2
|
-
import { TemplatedApp } from 'uWebSockets.js';
|
|
2
|
+
import { HttpRequest, HttpResponse, TemplatedApp } from 'uWebSockets.js';
|
|
3
3
|
import { CookieParseOptions, CookieSerializeOptions } from 'cookie';
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
export type UWebSocketsCreateHandlerOptions<TRouter extends AnyRouter> = {
|
|
6
|
+
/* trpc router */
|
|
5
7
|
router: TRouter;
|
|
8
|
+
/* optional create context */
|
|
6
9
|
createContext?: (
|
|
7
10
|
opts: UWebSocketsCreateContextOptions
|
|
8
11
|
) => Promise<inferRouterContext<TRouter>> | inferRouterContext<TRouter>;
|
|
12
|
+
/* optional pre-request handler. Useful for dealing with CORS */
|
|
13
|
+
onRequest?: (
|
|
14
|
+
req: UWebSocketsRequestObject,
|
|
15
|
+
res: UWebSocketsResponseObject
|
|
16
|
+
) => void;
|
|
9
17
|
};
|
|
10
18
|
|
|
11
19
|
export type UWebSocketsRequestObject = {
|
package/src/utils.ts
CHANGED
|
@@ -25,29 +25,28 @@ export function readPostBody(method: string, res: HttpResponse) {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
let buffer: Buffer;
|
|
28
|
+
|
|
28
29
|
res.onData((ab, isLast) => {
|
|
30
|
+
//resolve right away if there is only one chunk
|
|
31
|
+
if (buffer === undefined && isLast) {
|
|
32
|
+
resolve({
|
|
33
|
+
ok: true,
|
|
34
|
+
data: Buffer.from(ab).toString(),
|
|
35
|
+
});
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
29
39
|
const chunk = Buffer.from(ab);
|
|
30
40
|
|
|
41
|
+
//else accumulate
|
|
42
|
+
if (buffer) buffer = Buffer.concat([buffer, chunk]);
|
|
43
|
+
else buffer = Buffer.concat([chunk]);
|
|
44
|
+
|
|
31
45
|
if (isLast) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
data: buffer.toString(), // do i need utf8?
|
|
37
|
-
});
|
|
38
|
-
} else {
|
|
39
|
-
// only a single chunk was recieved
|
|
40
|
-
resolve({
|
|
41
|
-
ok: true,
|
|
42
|
-
data: chunk.toString(),
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
} else {
|
|
46
|
-
if (buffer) {
|
|
47
|
-
buffer = Buffer.concat([buffer, chunk]);
|
|
48
|
-
} else {
|
|
49
|
-
buffer = Buffer.concat([chunk]);
|
|
50
|
-
}
|
|
46
|
+
resolve({
|
|
47
|
+
ok: true,
|
|
48
|
+
data: buffer.toString(),
|
|
49
|
+
});
|
|
51
50
|
}
|
|
52
51
|
});
|
|
53
52
|
|
package/test/index.spec.ts
CHANGED
|
@@ -27,13 +27,23 @@ function makeRouter() {
|
|
|
27
27
|
},
|
|
28
28
|
})
|
|
29
29
|
.query('error', {
|
|
30
|
-
resolve() {
|
|
30
|
+
async resolve() {
|
|
31
31
|
throw new TRPCError({
|
|
32
32
|
code: 'BAD_REQUEST',
|
|
33
33
|
message: 'error as expected',
|
|
34
34
|
});
|
|
35
35
|
},
|
|
36
36
|
})
|
|
37
|
+
.mutation('long-payload', {
|
|
38
|
+
input: z.object({
|
|
39
|
+
ping: z.any(),
|
|
40
|
+
}),
|
|
41
|
+
async resolve({ input }) {
|
|
42
|
+
return {
|
|
43
|
+
pong: input.ping,
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
})
|
|
37
47
|
.mutation('test', {
|
|
38
48
|
input: z.object({
|
|
39
49
|
value: z.string(),
|
|
@@ -114,6 +124,11 @@ async function startServer() {
|
|
|
114
124
|
// need to register everything on the app object,
|
|
115
125
|
// as uWebSockets does not have middleware
|
|
116
126
|
createUWebSocketsHandler(app, '/trpc', {
|
|
127
|
+
// onRequest: (req, res) => {
|
|
128
|
+
// // allows for prerequest handling
|
|
129
|
+
// const origin = req.headers.origin ?? '*';
|
|
130
|
+
// res.setHeader('Access-Control-Allow-Origin', origin);
|
|
131
|
+
// },
|
|
117
132
|
router: makeRouter(),
|
|
118
133
|
createContext: makeContext(),
|
|
119
134
|
});
|
|
@@ -232,6 +247,19 @@ test('setting cookies and headers', async () => {
|
|
|
232
247
|
expect(monsterRes.headers.get('x-spooked')).toEqual('true');
|
|
233
248
|
});
|
|
234
249
|
|
|
250
|
+
test('long payload', async () => {
|
|
251
|
+
const client = makeClient({});
|
|
252
|
+
const data = [...Array(50000)].map((x) => 0);
|
|
253
|
+
|
|
254
|
+
expect(
|
|
255
|
+
await client.mutation('long-payload', {
|
|
256
|
+
ping: data,
|
|
257
|
+
})
|
|
258
|
+
).toEqual({
|
|
259
|
+
pong: data,
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
|
|
235
263
|
test('error handling', async () => {
|
|
236
264
|
const indexRes = await fetch(`http://localhost:${testPort}`);
|
|
237
265
|
expect(indexRes.status).toEqual(200);
|
package/types/index.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { AnyRouter } from '@trpc/server';
|
|
2
2
|
import type { TemplatedApp } from 'uWebSockets.js';
|
|
3
|
-
import {
|
|
3
|
+
import { UWebSocketsCreateHandlerOptions } from './types';
|
|
4
4
|
export * from './types';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
6
|
* @param uWsApp uWebsockets server instance
|
|
8
|
-
* @param pathPrefix The path to
|
|
9
|
-
* @param opts
|
|
7
|
+
* @param pathPrefix The path to trpc without trailing slash (ex: "/trpc")
|
|
8
|
+
* @param opts handler options
|
|
10
9
|
*/
|
|
11
10
|
export declare function createUWebSocketsHandler<TRouter extends AnyRouter>(uWsApp: TemplatedApp, pathPrefix: string, opts: UWebSocketsCreateHandlerOptions<TRouter>): void;
|
package/types/types.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { AnyRouter, inferRouterContext } from '@trpc/server';
|
|
2
2
|
import { TemplatedApp } from 'uWebSockets.js';
|
|
3
3
|
import { CookieParseOptions, CookieSerializeOptions } from 'cookie';
|
|
4
|
-
export declare type
|
|
4
|
+
export declare type UWebSocketsCreateHandlerOptions<TRouter extends AnyRouter> = {
|
|
5
5
|
router: TRouter;
|
|
6
6
|
createContext?: (opts: UWebSocketsCreateContextOptions) => Promise<inferRouterContext<TRouter>> | inferRouterContext<TRouter>;
|
|
7
|
+
onRequest?: (req: UWebSocketsRequestObject, res: UWebSocketsResponseObject) => void;
|
|
7
8
|
};
|
|
8
9
|
export declare type UWebSocketsRequestObject = {
|
|
9
10
|
headers: Record<string, string>;
|