trpc-uwebsockets 0.9.3 → 0.10.0-proxy-beta.8
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 +43 -63
- package/dist/index.js +18 -123
- package/dist/index.js.map +1 -1
- package/dist/requestHandler.js +86 -0
- package/dist/requestHandler.js.map +1 -0
- package/dist/utils.js +32 -38
- package/dist/utils.js.map +1 -1
- package/package.json +5 -5
- package/src/index.ts +28 -133
- package/src/requestHandler.ts +99 -0
- package/src/types.ts +30 -27
- package/src/utils.ts +42 -31
- package/test/index.spec.ts +109 -148
- package/types/index.d.ts +3 -4
- package/types/requestHandler.d.ts +3 -0
- package/types/types.d.ts +17 -19
- package/types/utils.d.ts +4 -4
package/README.md
CHANGED
|
@@ -4,8 +4,16 @@
|
|
|
4
4
|
|
|
5
5
|
# Installation
|
|
6
6
|
|
|
7
|
+
Version 9
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
yarn add trpc-uwebsockets@^0.9.*
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Version 10
|
|
14
|
+
|
|
7
15
|
```bash
|
|
8
|
-
yarn add trpc-uwebsockets
|
|
16
|
+
yarn add trpc-uwebsockets*
|
|
9
17
|
```
|
|
10
18
|
|
|
11
19
|
# Usage
|
|
@@ -14,44 +22,48 @@ Import needed packages
|
|
|
14
22
|
|
|
15
23
|
```typescript
|
|
16
24
|
import { App } from 'uWebSockets.js';
|
|
17
|
-
import
|
|
25
|
+
import { inferAsyncReturnType, initTRPC } from '@trpc/server';
|
|
26
|
+
import { CreateContextOptions } from 'trpc-uwebsockets';
|
|
18
27
|
import z from 'zod';
|
|
19
28
|
```
|
|
20
29
|
|
|
21
|
-
Define tRPC context and router
|
|
30
|
+
Define tRPC, context, and router
|
|
22
31
|
|
|
23
32
|
```typescript
|
|
24
|
-
|
|
25
|
-
user: {
|
|
26
|
-
name: string;
|
|
27
|
-
} | null;
|
|
28
|
-
};
|
|
33
|
+
const t = initTRPC.context<Context>().create();
|
|
29
34
|
|
|
30
|
-
const createContext = (
|
|
35
|
+
const createContext = ({ req, res }: CreateContextOptions) => {
|
|
31
36
|
const getUser = () => {
|
|
32
|
-
if (
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
if (req.headers.authorization === 'meow') {
|
|
38
|
+
return {
|
|
39
|
+
name: 'KATT',
|
|
40
|
+
};
|
|
35
41
|
}
|
|
36
42
|
return null;
|
|
37
43
|
};
|
|
38
|
-
|
|
39
44
|
return {
|
|
45
|
+
req,
|
|
46
|
+
res,
|
|
47
|
+
// uWs,
|
|
40
48
|
user: getUser(),
|
|
41
49
|
};
|
|
42
50
|
};
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
export type Context = inferAsyncReturnType<typeof createContext>;
|
|
52
|
+
|
|
53
|
+
const router = t.router({
|
|
54
|
+
hello: t.procedure
|
|
55
|
+
.input(
|
|
56
|
+
z
|
|
57
|
+
.object({
|
|
58
|
+
who: z.string().nullish(),
|
|
59
|
+
})
|
|
60
|
+
.nullish()
|
|
61
|
+
)
|
|
62
|
+
.query(({ input, ctx }) => {
|
|
63
|
+
return {
|
|
64
|
+
text: `hello ${input?.who ?? ctx.user?.name ?? 'world'}`,
|
|
65
|
+
};
|
|
66
|
+
}),
|
|
55
67
|
});
|
|
56
68
|
```
|
|
57
69
|
|
|
@@ -78,54 +90,21 @@ app.listen('0.0.0.0', 8000, () => {
|
|
|
78
90
|
|
|
79
91
|
# API
|
|
80
92
|
|
|
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
|
-
|
|
112
93
|
Create context options
|
|
113
94
|
|
|
114
95
|
```typescript
|
|
115
|
-
type
|
|
96
|
+
type CreateContextOptions = {
|
|
116
97
|
/* read-only request information */
|
|
117
98
|
req: {
|
|
118
99
|
headers: Record<string, string>;
|
|
119
100
|
method: 'POST' | 'GET';
|
|
120
|
-
query:
|
|
101
|
+
query: string;
|
|
121
102
|
path: string;
|
|
122
|
-
getCookies: (opts?: CookieParseOptions) => Record<string, string>;
|
|
123
103
|
};
|
|
124
104
|
/* minimal response interface */
|
|
125
105
|
res: {
|
|
126
106
|
setStatus(status: number): void;
|
|
127
|
-
setHeader(
|
|
128
|
-
setCookie(key: string, value: string, opts?: CookieSerializeOptions): void;
|
|
107
|
+
setHeader(name: string, value: string): void;
|
|
129
108
|
};
|
|
130
109
|
/* instance of the uWebSockets server */
|
|
131
110
|
uWs: TemplatedApp;
|
|
@@ -146,5 +125,6 @@ yarn test:watch
|
|
|
146
125
|
|
|
147
126
|
# Todo
|
|
148
127
|
|
|
149
|
-
- [ ]
|
|
150
|
-
- [ ]
|
|
128
|
+
- [ ] Various improvements (res.tryEnd + reading multiple headers /w same key)
|
|
129
|
+
- [ ] Improve these (remove rollup and many dependencies)
|
|
130
|
+
- [ ] Subscription support with websockets
|
package/dist/index.js
CHANGED
|
@@ -1,146 +1,41 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
-
};
|
|
19
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
3
|
exports.createUWebSocketsHandler = void 0;
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
const cookie_1 = __importDefault(require("cookie"));
|
|
24
|
-
__exportStar(require("./types"), exports);
|
|
4
|
+
const requestHandler_1 = require("./requestHandler");
|
|
5
|
+
// export * from './types';
|
|
25
6
|
/**
|
|
26
7
|
* @param uWsApp uWebsockets server instance
|
|
27
|
-
* @param
|
|
8
|
+
* @param prefix The path to trpc without trailing slash (ex: "/trpc")
|
|
28
9
|
* @param opts handler options
|
|
29
10
|
*/
|
|
30
|
-
function createUWebSocketsHandler(uWsApp,
|
|
31
|
-
const prefixTrimLength =
|
|
32
|
-
const handler =
|
|
11
|
+
function createUWebSocketsHandler(uWsApp, prefix, opts) {
|
|
12
|
+
const prefixTrimLength = prefix.length + 1; // remove /* from url
|
|
13
|
+
const handler = (res, req) => {
|
|
33
14
|
const method = req.getMethod().toUpperCase();
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// will not be captured and propagated further
|
|
37
|
-
req.setYield(true);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const path = req.getUrl().substring(prefixTrimLength);
|
|
41
|
-
const query = new URLSearchParams(decodeURIComponent(req.getQuery()));
|
|
15
|
+
const url = req.getUrl().substring(prefixTrimLength);
|
|
16
|
+
const query = req.getQuery();
|
|
42
17
|
const headers = {};
|
|
43
18
|
req.forEach((key, value) => {
|
|
19
|
+
// TODO handle headers with the same key, potential issue
|
|
44
20
|
headers[key] = value;
|
|
45
21
|
});
|
|
46
22
|
// new request object needs to be created, because socket
|
|
47
23
|
// can only be accessed synchronously, after await it cannot be accessed
|
|
48
|
-
const
|
|
24
|
+
const wrappedReq = {
|
|
49
25
|
headers,
|
|
50
26
|
method,
|
|
51
27
|
query,
|
|
52
|
-
|
|
53
|
-
getCookies: (0, utils_1.getCookieFn)(headers),
|
|
28
|
+
url,
|
|
54
29
|
};
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const response = {
|
|
61
|
-
setCookie: (name, value, opts) => {
|
|
62
|
-
const serialized = cookie_1.default.serialize(name, value, opts); //.substring(12); //remove the "Set-Cookie: "
|
|
63
|
-
resOverride.cookies.push(serialized);
|
|
64
|
-
},
|
|
65
|
-
setStatus: (status) => {
|
|
66
|
-
resOverride.status = status;
|
|
67
|
-
},
|
|
68
|
-
setHeader: (key, value) => {
|
|
69
|
-
resOverride.headers.set(key, value);
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
const bodyResult = await (0, utils_1.readPostBody)(method, res);
|
|
73
|
-
// req is no longer available!
|
|
74
|
-
const createContext = async function _() {
|
|
75
|
-
//res could be proxied here
|
|
76
|
-
return await opts.createContext?.({
|
|
77
|
-
uWs: uWsApp,
|
|
78
|
-
req: request,
|
|
79
|
-
res: response,
|
|
80
|
-
});
|
|
81
|
-
};
|
|
82
|
-
const internalReqObj = {
|
|
83
|
-
method,
|
|
84
|
-
headers,
|
|
85
|
-
query,
|
|
86
|
-
body: bodyResult.ok ? bodyResult.data : undefined,
|
|
87
|
-
};
|
|
88
|
-
// TODO batching, onError options need implementation.
|
|
89
|
-
const result = await (0, server_1.resolveHTTPResponse)({
|
|
90
|
-
path,
|
|
91
|
-
createContext,
|
|
92
|
-
router: opts.router,
|
|
93
|
-
req: internalReqObj,
|
|
94
|
-
error: bodyResult.ok ? null : bodyResult.error,
|
|
95
|
-
});
|
|
96
|
-
// user returned already, do nothing
|
|
97
|
-
res.cork(() => {
|
|
98
|
-
if (resOverride.status != 0) {
|
|
99
|
-
res.writeStatus(resOverride.status.toString());
|
|
100
|
-
}
|
|
101
|
-
else if ('status' in result) {
|
|
102
|
-
res.writeStatus(result.status.toString());
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
// assume something went bad, should never happen?
|
|
106
|
-
throw new Error('No status to send');
|
|
107
|
-
// res.writeStatus('500 INTERNAL SERVER ERROR');
|
|
108
|
-
// res.end();
|
|
109
|
-
// return;
|
|
110
|
-
}
|
|
111
|
-
if (opts.onRequest)
|
|
112
|
-
opts.onRequest(request, response);
|
|
113
|
-
//send all cookies
|
|
114
|
-
resOverride.cookies.forEach((value) => {
|
|
115
|
-
res.writeHeader('Set-Cookie', value);
|
|
116
|
-
});
|
|
117
|
-
resOverride.headers.forEach((value, key) => {
|
|
118
|
-
res.writeHeader(key, value);
|
|
119
|
-
});
|
|
120
|
-
for (const [key, value] of Object.entries(result.headers ?? {})) {
|
|
121
|
-
if (typeof value === 'undefined') {
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
// make sure to never override user defined headers
|
|
125
|
-
// cookies are an exception
|
|
126
|
-
if (resOverride.headers.has(key))
|
|
127
|
-
continue;
|
|
128
|
-
// not sure why it could be an array. This code path is not tested
|
|
129
|
-
// maybe its duplicates for the same key? like multiple "Set-Cookie"
|
|
130
|
-
if (Array.isArray(value))
|
|
131
|
-
value.forEach((header) => {
|
|
132
|
-
res.writeHeader(key, header);
|
|
133
|
-
});
|
|
134
|
-
else
|
|
135
|
-
res.writeHeader(key, value);
|
|
136
|
-
}
|
|
137
|
-
//now send user headers
|
|
138
|
-
if (result.body)
|
|
139
|
-
res.write(result.body);
|
|
140
|
-
res.end();
|
|
30
|
+
(0, requestHandler_1.uWsHTTPRequestHandler)({
|
|
31
|
+
req: wrappedReq,
|
|
32
|
+
uRes: res,
|
|
33
|
+
path: url,
|
|
34
|
+
...opts,
|
|
141
35
|
});
|
|
142
36
|
};
|
|
143
|
-
uWsApp.
|
|
37
|
+
uWsApp.get(prefix + '/*', handler);
|
|
38
|
+
uWsApp.post(prefix + '/*', handler);
|
|
144
39
|
}
|
|
145
40
|
exports.createUWebSocketsHandler = createUWebSocketsHandler;
|
|
146
41
|
//# 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":";;;AAIA,qDAAyD;AAQzD,2BAA2B;AAE3B;;;;GAIG;AACH,SAAgB,wBAAwB,CACtC,MAAoB,EACpB,MAAc,EACd,IAAkC;IAElC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,qBAAqB;IAEjE,MAAM,OAAO,GAAG,CAAC,GAAiB,EAAE,GAAgB,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,WAAW,EAAoB,CAAC;QAC/D,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAE7B,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACzB,yDAAyD;YACzD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,yDAAyD;QACzD,wEAAwE;QACxE,MAAM,UAAU,GAAuB;YACrC,OAAO;YACP,MAAM;YACN,KAAK;YACL,GAAG;SACJ,CAAC;QAEF,IAAA,sCAAqB,EAAC;YACpB,GAAG,EAAE,UAAU;YACf,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,GAAG;YACT,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;AACtC,CAAC;AApCD,4DAoCC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.uWsHTTPRequestHandler = void 0;
|
|
4
|
+
const server_1 = require("@trpc/server");
|
|
5
|
+
const utils_1 = require("./utils");
|
|
6
|
+
async function uWsHTTPRequestHandler(opts) {
|
|
7
|
+
const resOverride = {
|
|
8
|
+
headers: [],
|
|
9
|
+
status: 0,
|
|
10
|
+
};
|
|
11
|
+
const wrappedRes = {
|
|
12
|
+
setStatus: (status) => {
|
|
13
|
+
resOverride.status = status;
|
|
14
|
+
},
|
|
15
|
+
setHeader: (name, value) => {
|
|
16
|
+
resOverride.headers.push({ name, value });
|
|
17
|
+
// resOverride.headers.set(key, value);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
const createContext = async function _createContext() {
|
|
21
|
+
return await opts.createContext?.({
|
|
22
|
+
req: opts.req,
|
|
23
|
+
res: wrappedRes,
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
const { path, router, uRes, req } = opts;
|
|
27
|
+
let aborted = false;
|
|
28
|
+
uRes.onAborted(() => {
|
|
29
|
+
// console.log('request was aborted');
|
|
30
|
+
aborted = true;
|
|
31
|
+
});
|
|
32
|
+
const bodyResult = await (0, utils_1.getPostBody)(req.method, uRes, opts.maxBodySize);
|
|
33
|
+
const query = new URLSearchParams(opts.req.query);
|
|
34
|
+
const requestObj = {
|
|
35
|
+
method: opts.req.method,
|
|
36
|
+
headers: opts.req.headers,
|
|
37
|
+
query,
|
|
38
|
+
body: bodyResult.ok ? bodyResult.data : undefined,
|
|
39
|
+
};
|
|
40
|
+
const result = await (0, server_1.resolveHTTPResponse)({
|
|
41
|
+
batching: opts.batching,
|
|
42
|
+
responseMeta: opts.responseMeta,
|
|
43
|
+
path,
|
|
44
|
+
createContext,
|
|
45
|
+
router,
|
|
46
|
+
req: requestObj,
|
|
47
|
+
error: bodyResult.ok ? null : bodyResult.error,
|
|
48
|
+
onError(o) {
|
|
49
|
+
opts?.onError?.({
|
|
50
|
+
...o,
|
|
51
|
+
req: opts.req,
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
if (aborted) {
|
|
56
|
+
// TODO check this behavior
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
uRes.cork(() => {
|
|
60
|
+
// if ('status' in result && (!res.statusCode || res.statusCode === 200)) {
|
|
61
|
+
if (resOverride.status > 0) {
|
|
62
|
+
uRes.writeStatus(resOverride.status.toString()); // TODO convert code to actual message
|
|
63
|
+
}
|
|
64
|
+
if ('status' in result) {
|
|
65
|
+
uRes.writeStatus(result.status.toString());
|
|
66
|
+
}
|
|
67
|
+
//send our manual headers
|
|
68
|
+
resOverride.headers.forEach((h) => {
|
|
69
|
+
uRes.writeHeader(h.name, h.value);
|
|
70
|
+
});
|
|
71
|
+
for (const [key, value] of Object.entries(result.headers ?? {})) {
|
|
72
|
+
if (typeof value === 'undefined') {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (Array.isArray(value))
|
|
76
|
+
value.forEach((v) => {
|
|
77
|
+
uRes.writeHeader(key, v);
|
|
78
|
+
});
|
|
79
|
+
else
|
|
80
|
+
uRes.writeHeader(key, value);
|
|
81
|
+
}
|
|
82
|
+
(0, utils_1.sendResponse)(uRes, result.body);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
exports.uWsHTTPRequestHandler = uWsHTTPRequestHandler;
|
|
86
|
+
//# sourceMappingURL=requestHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestHandler.js","sourceRoot":"","sources":["../src/requestHandler.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.js
CHANGED
|
@@ -1,21 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
3
|
+
exports.sendResponse = exports.getPostBody = void 0;
|
|
7
4
|
const server_1 = require("@trpc/server");
|
|
8
|
-
|
|
9
|
-
/*
|
|
10
|
-
cookie: 'cookie1=abc; cookie2=d.e'
|
|
11
|
-
*/
|
|
12
|
-
const getCookieFn = (headers) => (opts) => {
|
|
13
|
-
if (!('cookie' in headers))
|
|
14
|
-
return {};
|
|
15
|
-
return cookie_1.default.parse(headers.cookie, opts);
|
|
16
|
-
};
|
|
17
|
-
exports.getCookieFn = getCookieFn;
|
|
18
|
-
function readPostBody(method, res) {
|
|
5
|
+
function getPostBody(method, res, maxBodySize) {
|
|
19
6
|
return new Promise((resolve) => {
|
|
20
7
|
if (method == 'GET') {
|
|
21
8
|
// no body in get request
|
|
@@ -26,30 +13,31 @@ function readPostBody(method, res) {
|
|
|
26
13
|
}
|
|
27
14
|
let buffer;
|
|
28
15
|
res.onData((ab, isLast) => {
|
|
16
|
+
//resolve right away if there is only one chunk
|
|
17
|
+
if (buffer === undefined && isLast) {
|
|
18
|
+
resolve({
|
|
19
|
+
ok: true,
|
|
20
|
+
data: Buffer.from(ab).toString(),
|
|
21
|
+
});
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
29
24
|
const chunk = Buffer.from(ab);
|
|
30
|
-
if (
|
|
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
|
-
}
|
|
25
|
+
if (maxBodySize && buffer.length >= maxBodySize) {
|
|
26
|
+
resolve({
|
|
27
|
+
ok: false,
|
|
28
|
+
error: new server_1.TRPCError({ code: 'PAYLOAD_TOO_LARGE' }),
|
|
29
|
+
});
|
|
45
30
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
31
|
+
if (buffer)
|
|
32
|
+
//else accumulate
|
|
33
|
+
buffer = Buffer.concat([buffer, chunk]);
|
|
34
|
+
else
|
|
35
|
+
buffer = Buffer.concat([chunk]);
|
|
36
|
+
if (isLast) {
|
|
37
|
+
resolve({
|
|
38
|
+
ok: true,
|
|
39
|
+
data: buffer.toString(),
|
|
40
|
+
});
|
|
53
41
|
}
|
|
54
42
|
});
|
|
55
43
|
res.onAborted(() => {
|
|
@@ -60,5 +48,11 @@ function readPostBody(method, res) {
|
|
|
60
48
|
});
|
|
61
49
|
});
|
|
62
50
|
}
|
|
63
|
-
exports.
|
|
51
|
+
exports.getPostBody = getPostBody;
|
|
52
|
+
// FIXME buffer the output with tryEnd instead
|
|
53
|
+
// https://github.com/uNetworking/uWebSockets.js/blob/master/examples/VideoStreamer.js
|
|
54
|
+
function sendResponse(res, payload) {
|
|
55
|
+
res.end(payload);
|
|
56
|
+
}
|
|
57
|
+
exports.sendResponse = sendResponse;
|
|
64
58
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAOA,yCAAoD;AAEpD,SAAgB,WAAW,CAIzB,MAAM,EAAE,GAAiB,EAAE,WAAoB;IAC/C,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,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,IAAI,WAAW,EAAE;gBAC/C,OAAO,CAAC;oBACN,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;iBACpD,CAAC,CAAC;aACJ;YACD,IAAI,MAAM;gBACR,iBAAiB;gBACjB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;;gBACrC,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;AAxDD,kCAwDC;AAED,8CAA8C;AAC9C,sFAAsF;AACtF,SAAgB,YAAY,CAAC,GAAiB,EAAE,OAAgB;IAC9D,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAFD,oCAEC"}
|
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.
|
|
5
|
+
"version": "0.10.0-proxy-beta.8",
|
|
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",
|
|
@@ -24,18 +24,18 @@
|
|
|
24
24
|
"prettier:dry": "prettier --config .prettierrc 'src/**/*.ts'"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@trpc/server": "^
|
|
28
|
-
"cookie": "^0.5.0",
|
|
27
|
+
"@trpc/server": "^10.0.0-proxy-beta.10",
|
|
29
28
|
"uWebSockets.js": "uNetworking/uWebSockets.js#v20.10.0"
|
|
30
29
|
},
|
|
31
30
|
"devDependencies": {
|
|
32
31
|
"@rollup/plugin-typescript": "^8.3.3",
|
|
33
32
|
"@swc/core": "^1.2.215",
|
|
34
33
|
"@swc/jest": "^0.2.21",
|
|
35
|
-
"@trpc/client": "^
|
|
34
|
+
"@trpc/client": "^10.0.0-proxy-beta.10",
|
|
36
35
|
"@types/cookie": "^0.5.1",
|
|
37
36
|
"@types/jest": "^28.1.6",
|
|
38
37
|
"@types/node": "^18.0.6",
|
|
38
|
+
"@types/node-fetch": "^2.6.2",
|
|
39
39
|
"@types/webrtc": "^0.0.32",
|
|
40
40
|
"@typescript-eslint/eslint-plugin": "^5.30.6",
|
|
41
41
|
"@typescript-eslint/parser": "^5.30.6",
|