@miiajs/uws-server 0.1.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/LICENSE +21 -0
- package/README.md +44 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +599 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ruslan Matiushev
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# @miiajs/uws-server
|
|
2
|
+
|
|
3
|
+
uWebSockets.js HTTP server adapter for MiiaJS.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @miiajs/uws-server uWebSockets.js
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Documentation
|
|
12
|
+
|
|
13
|
+
**[miiajs.com/docs/packages/uws-server](https://miiajs.com/docs/packages/uws-server)**
|
|
14
|
+
|
|
15
|
+
## Troubleshooting
|
|
16
|
+
|
|
17
|
+
### Native module fails to load on Debian 12 / older glibc systems
|
|
18
|
+
|
|
19
|
+
`uWebSockets.js` ≥20.61.0 ships a prebuilt native binary that depends on a
|
|
20
|
+
newer glibc than what Debian 12 (bookworm) provides. On affected systems you
|
|
21
|
+
will see at startup:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
Error: This version of uWS.js supports only Node.js versions ...
|
|
25
|
+
TypeError: symbol 'napi_register_module_v1' not found in native module
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Why we can't simply downgrade:** `@miiajs/uws-server` uses APIs introduced
|
|
29
|
+
in `uWebSockets.js@20.61.0`, so pinning an older version will break the
|
|
30
|
+
adapter at build/startup.
|
|
31
|
+
|
|
32
|
+
**Workarounds (in order of preference):**
|
|
33
|
+
|
|
34
|
+
1. **Use a newer base image / OS** - Debian 13, Ubuntu 24.04, or any distro with
|
|
35
|
+
glibc ≥2.38. This is the only solution that keeps full uWS performance.
|
|
36
|
+
2. **Switch to `@miiajs/node-server`** - same API surface (`app.listen(port, host, serve)`),
|
|
37
|
+
slightly lower throughput but no native dependency. Drop-in replacement for
|
|
38
|
+
environments where the host OS cannot be upgraded.
|
|
39
|
+
3. **Track upstream** - follow https://github.com/uNetworking/uWebSockets.js/issues
|
|
40
|
+
for an official fix; once published, MiiaJS will adopt it without breaking changes.
|
|
41
|
+
|
|
42
|
+
## License
|
|
43
|
+
|
|
44
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface LoggerLike {
|
|
2
|
+
error(message: string, trace?: string, context?: string): void;
|
|
3
|
+
}
|
|
4
|
+
export interface ServeOptions {
|
|
5
|
+
fetch: (req: Request) => Response | Promise<Response>;
|
|
6
|
+
port?: number;
|
|
7
|
+
hostname?: string;
|
|
8
|
+
/** @default 'optimized' */
|
|
9
|
+
mode?: 'optimized' | 'native';
|
|
10
|
+
/** Bodies with Content-Length <= threshold are buffered as Promise<Uint8Array> for fast path.
|
|
11
|
+
* Larger or without Content-Length → ReadableStream. @default 102400 (100KB) */
|
|
12
|
+
bufferThreshold?: number;
|
|
13
|
+
/** Logger for unhandled handler errors. Defaults to `console`. Miia passes its internal logger automatically when used via `app.listen(port, hostname, serve)`. */
|
|
14
|
+
logger?: LoggerLike;
|
|
15
|
+
}
|
|
16
|
+
export declare const serve: ({ port, hostname, fetch: handler, mode, bufferThreshold, logger, }: ServeOptions) => Promise<{
|
|
17
|
+
close(): Promise<void>;
|
|
18
|
+
}>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuZA,UAAU,UAAU;IAClB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/D;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACrD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAA;IAC7B;qFACiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mKAAmK;IACnK,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,eAAO,MAAM,KAAK,GAAU,oEAOzB,YAAY,KAAG,OAAO,CAAC;IAAE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAsPnD,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @miiajs/uws-server - uWebSockets.js HTTP server for Web API frameworks.
|
|
3
|
+
*
|
|
4
|
+
* Requires `uWebSockets.js` to be installed separately:
|
|
5
|
+
* bun add uWebSockets.js@uNetworking/uWebSockets.js#v20.64.0
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { serve } from '@miiajs/uws-server';
|
|
9
|
+
* serve({ fetch: app.fetch, port: 3000 });
|
|
10
|
+
*
|
|
11
|
+
* ## Architecture
|
|
12
|
+
*
|
|
13
|
+
* uWS HttpRequest is only valid synchronously - method, url, and headers
|
|
14
|
+
* must be read before any async gap. Small bodies are accumulated natively
|
|
15
|
+
* in C++ via res.collectBody(). Large bodies arrive via res.onData() and
|
|
16
|
+
* are bridged to a ReadableStream for true streaming.
|
|
17
|
+
*
|
|
18
|
+
* ## Modes
|
|
19
|
+
*
|
|
20
|
+
* - **optimized** (default) - lazy Request proxy, LightResponse CACHE,
|
|
21
|
+
* sync handler path, lazy AbortController. For simple responses
|
|
22
|
+
* (string/null/Uint8Array), the entire request-response cycle is
|
|
23
|
+
* fully synchronous - zero Promises, one cork, one syscall.
|
|
24
|
+
*
|
|
25
|
+
* - **native** - standard Web API Request/Response objects,
|
|
26
|
+
* no proxies, no global overrides, full spec compliance.
|
|
27
|
+
* Safe for strict instanceof checks.
|
|
28
|
+
*
|
|
29
|
+
* After res.onAborted() fires, calling any method on res is undefined
|
|
30
|
+
* behavior - every res.cork/write/end call is guarded by an `aborted` flag.
|
|
31
|
+
*
|
|
32
|
+
* ## Known Limitations (optimized mode)
|
|
33
|
+
*
|
|
34
|
+
* - Body can only be consumed once (matches Web API spec).
|
|
35
|
+
* - clone() returns a GlobalResponse, not LightResponse.
|
|
36
|
+
* - Multiple serve instances: second close() restores GlobalResponse,
|
|
37
|
+
* which may break a still-running first instance.
|
|
38
|
+
*/
|
|
39
|
+
// ─── Symbols ─────────────────────────────────────────────────
|
|
40
|
+
/** Marker for LightResponse cached tuple: [status, body, headers] */
|
|
41
|
+
const CACHE = Symbol('responseCache');
|
|
42
|
+
const textDecoder = new TextDecoder();
|
|
43
|
+
const EMPTY_U8 = new Uint8Array(0);
|
|
44
|
+
const DEFAULT_BUFFER_THRESHOLD = 102_400; // 100KB
|
|
45
|
+
// ─── Lightweight Headers Proxy (optimized mode) ─────────────
|
|
46
|
+
//
|
|
47
|
+
// Linear scan over headerPairs instead of new Headers().
|
|
48
|
+
// uWS header keys are already lowercase - only the input name needs lowering.
|
|
49
|
+
const headersProto = {
|
|
50
|
+
get(name) {
|
|
51
|
+
const lower = name.toLowerCase();
|
|
52
|
+
const pairs = this._pairs;
|
|
53
|
+
let result = null;
|
|
54
|
+
for (let i = 0; i < pairs.length; i++) {
|
|
55
|
+
if (pairs[i][0] === lower) {
|
|
56
|
+
result = result === null ? pairs[i][1] : result + ', ' + pairs[i][1];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
},
|
|
61
|
+
has(name) {
|
|
62
|
+
return this.get(name) !== null;
|
|
63
|
+
},
|
|
64
|
+
forEach(callback) {
|
|
65
|
+
for (const [k, v] of this._pairs)
|
|
66
|
+
callback(v, k, this);
|
|
67
|
+
},
|
|
68
|
+
entries() {
|
|
69
|
+
return this._pairs[Symbol.iterator]();
|
|
70
|
+
},
|
|
71
|
+
keys() {
|
|
72
|
+
return this._pairs.map((p) => p[0])[Symbol.iterator]();
|
|
73
|
+
},
|
|
74
|
+
values() {
|
|
75
|
+
return this._pairs.map((p) => p[1])[Symbol.iterator]();
|
|
76
|
+
},
|
|
77
|
+
[Symbol.iterator]() {
|
|
78
|
+
return this.entries();
|
|
79
|
+
},
|
|
80
|
+
getSetCookie() {
|
|
81
|
+
return this._pairs.filter((p) => p[0] === 'set-cookie').map((p) => p[1]);
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
function createHeadersProxy(pairs) {
|
|
85
|
+
const proxy = Object.create(headersProto);
|
|
86
|
+
proxy._pairs = pairs;
|
|
87
|
+
return proxy;
|
|
88
|
+
}
|
|
89
|
+
// ─── Lightweight Request Proxy (optimized mode) ─────────────
|
|
90
|
+
//
|
|
91
|
+
// Object.create(requestProto) is ~100x cheaper than new Request().
|
|
92
|
+
// Properties accessed on the hot path (url, method) are simple reads.
|
|
93
|
+
// Everything else is lazy - created only when accessed.
|
|
94
|
+
const requestProto = {
|
|
95
|
+
get method() {
|
|
96
|
+
return this._method;
|
|
97
|
+
},
|
|
98
|
+
get url() {
|
|
99
|
+
return (this._url ??= `http://${this._host || `${this._hostname}:${this._port}`}${this._pathname}${this._search ? '?' + this._search : ''}`);
|
|
100
|
+
},
|
|
101
|
+
get headers() {
|
|
102
|
+
return (this._headers ??= createHeadersProxy(this._headerPairs));
|
|
103
|
+
},
|
|
104
|
+
get signal() {
|
|
105
|
+
if (!this._ac) {
|
|
106
|
+
this._ac = new AbortController();
|
|
107
|
+
if (this._aborted)
|
|
108
|
+
this._ac.abort(new Error('Client connection closed'));
|
|
109
|
+
}
|
|
110
|
+
return this._ac.signal;
|
|
111
|
+
},
|
|
112
|
+
/** Create real Request - only for rare operations (blob, formData, clone) */
|
|
113
|
+
_getReal() {
|
|
114
|
+
if (!this._real) {
|
|
115
|
+
const init = { method: this._method, headers: this._headerPairs };
|
|
116
|
+
if (this._bodyPromise) {
|
|
117
|
+
const buf = this._bodyBuffer;
|
|
118
|
+
if (buf && buf.byteLength > 0) {
|
|
119
|
+
init.body = buf; // Uint8Array is a valid BodyInit
|
|
120
|
+
}
|
|
121
|
+
else if (!buf) {
|
|
122
|
+
const p = this._bodyPromise;
|
|
123
|
+
init.body = new ReadableStream({
|
|
124
|
+
async start(c) {
|
|
125
|
+
try {
|
|
126
|
+
const b = await p;
|
|
127
|
+
if (b.byteLength > 0)
|
|
128
|
+
c.enqueue(b);
|
|
129
|
+
c.close();
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
c.error(e);
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
init.duplex = 'half';
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else if (this._body) {
|
|
140
|
+
init.body = this._body;
|
|
141
|
+
init.duplex = 'half';
|
|
142
|
+
}
|
|
143
|
+
if (this._ac)
|
|
144
|
+
init.signal = this._ac.signal;
|
|
145
|
+
this._real = new Request(this.url, init);
|
|
146
|
+
}
|
|
147
|
+
return this._real;
|
|
148
|
+
},
|
|
149
|
+
// ── Buffer helper: resolve body promise, cache result ──
|
|
150
|
+
async _getBuffer() {
|
|
151
|
+
if (this._bodyBuffer !== null)
|
|
152
|
+
return this._bodyBuffer;
|
|
153
|
+
if (!this._bodyPromise)
|
|
154
|
+
return EMPTY_U8;
|
|
155
|
+
this._bodyBuffer = await this._bodyPromise;
|
|
156
|
+
return this._bodyBuffer;
|
|
157
|
+
},
|
|
158
|
+
// ── Body consumers: buffer fast path, stream fallback ──
|
|
159
|
+
async json() {
|
|
160
|
+
if (this._bodyPromise) {
|
|
161
|
+
const buf = await this._getBuffer();
|
|
162
|
+
return JSON.parse(textDecoder.decode(buf));
|
|
163
|
+
}
|
|
164
|
+
return this._getReal().json();
|
|
165
|
+
},
|
|
166
|
+
async text() {
|
|
167
|
+
if (this._bodyPromise) {
|
|
168
|
+
const buf = await this._getBuffer();
|
|
169
|
+
return textDecoder.decode(buf);
|
|
170
|
+
}
|
|
171
|
+
return this._getReal().text();
|
|
172
|
+
},
|
|
173
|
+
async arrayBuffer() {
|
|
174
|
+
if (this._bodyPromise) {
|
|
175
|
+
const buf = await this._getBuffer();
|
|
176
|
+
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
|
|
177
|
+
}
|
|
178
|
+
return this._getReal().arrayBuffer();
|
|
179
|
+
},
|
|
180
|
+
get body() {
|
|
181
|
+
// Stream path - original ReadableStream
|
|
182
|
+
if (this._body)
|
|
183
|
+
return this._body;
|
|
184
|
+
// Buffer path - lazy stream from buffer (cached)
|
|
185
|
+
if (this._bodyPromise) {
|
|
186
|
+
if (!this._bodyStream) {
|
|
187
|
+
const self = this;
|
|
188
|
+
this._bodyStream = new ReadableStream({
|
|
189
|
+
async start(controller) {
|
|
190
|
+
try {
|
|
191
|
+
const buf = await self._getBuffer();
|
|
192
|
+
if (buf.byteLength > 0)
|
|
193
|
+
controller.enqueue(buf);
|
|
194
|
+
controller.close();
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
controller.error(e);
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return this._bodyStream;
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
},
|
|
206
|
+
get bodyUsed() {
|
|
207
|
+
return this._bodyBuffer !== null || (this._real?.bodyUsed ?? false);
|
|
208
|
+
},
|
|
209
|
+
// Rare path - delegate to real Request
|
|
210
|
+
blob() {
|
|
211
|
+
return this._getReal().blob();
|
|
212
|
+
},
|
|
213
|
+
formData() {
|
|
214
|
+
return this._getReal().formData();
|
|
215
|
+
},
|
|
216
|
+
clone() {
|
|
217
|
+
return this._getReal().clone();
|
|
218
|
+
},
|
|
219
|
+
// Static spec-compliant defaults
|
|
220
|
+
get cache() {
|
|
221
|
+
return 'default';
|
|
222
|
+
},
|
|
223
|
+
get credentials() {
|
|
224
|
+
return 'same-origin';
|
|
225
|
+
},
|
|
226
|
+
get destination() {
|
|
227
|
+
return '';
|
|
228
|
+
},
|
|
229
|
+
get integrity() {
|
|
230
|
+
return '';
|
|
231
|
+
},
|
|
232
|
+
get keepalive() {
|
|
233
|
+
return false;
|
|
234
|
+
},
|
|
235
|
+
get mode() {
|
|
236
|
+
return 'cors';
|
|
237
|
+
},
|
|
238
|
+
get redirect() {
|
|
239
|
+
return 'follow';
|
|
240
|
+
},
|
|
241
|
+
get referrer() {
|
|
242
|
+
return '';
|
|
243
|
+
},
|
|
244
|
+
get referrerPolicy() {
|
|
245
|
+
return '';
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
function createRequestProxy(method, headerPairs, body, bodyPromise, host, hostname, port, pathname, query) {
|
|
249
|
+
const proxy = Object.create(requestProto);
|
|
250
|
+
proxy._method = method;
|
|
251
|
+
proxy._host = host;
|
|
252
|
+
proxy._hostname = hostname;
|
|
253
|
+
proxy._port = port;
|
|
254
|
+
proxy._pathname = pathname;
|
|
255
|
+
proxy._search = query;
|
|
256
|
+
proxy._url = null;
|
|
257
|
+
proxy._headerPairs = headerPairs;
|
|
258
|
+
proxy._headers = null;
|
|
259
|
+
proxy._body = body;
|
|
260
|
+
proxy._bodyPromise = bodyPromise;
|
|
261
|
+
proxy._bodyBuffer = null;
|
|
262
|
+
proxy._bodyStream = null;
|
|
263
|
+
proxy._ac = null;
|
|
264
|
+
proxy._real = null;
|
|
265
|
+
proxy._aborted = false;
|
|
266
|
+
return proxy;
|
|
267
|
+
}
|
|
268
|
+
// ─── Cached Response (LightResponse, optimized mode) ────────
|
|
269
|
+
//
|
|
270
|
+
// Replaces globalThis.Response. For string/null/Uint8Array bodies,
|
|
271
|
+
// stores [status, body, headers] in CACHE symbol - no GlobalResponse
|
|
272
|
+
// created. Adapter reads CACHE directly for cork + end.
|
|
273
|
+
const GlobalResponse = globalThis.Response;
|
|
274
|
+
class LightResponse {
|
|
275
|
+
#body;
|
|
276
|
+
#init;
|
|
277
|
+
#real;
|
|
278
|
+
[CACHE];
|
|
279
|
+
constructor(body, init) {
|
|
280
|
+
this.#body = body ?? null;
|
|
281
|
+
this.#init = init;
|
|
282
|
+
if (body === null || typeof body === 'string' || body instanceof Uint8Array) {
|
|
283
|
+
const h = init?.headers;
|
|
284
|
+
this[CACHE] = [
|
|
285
|
+
init?.status ?? 200,
|
|
286
|
+
body,
|
|
287
|
+
h == null ? null : h instanceof Headers ? h : new Headers(h),
|
|
288
|
+
];
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/** Create real GlobalResponse - only for streaming/advanced operations */
|
|
292
|
+
#getReal() {
|
|
293
|
+
return (this.#real ??= new GlobalResponse(this.#body, this.#init));
|
|
294
|
+
}
|
|
295
|
+
get status() {
|
|
296
|
+
return this[CACHE]?.[0] ?? this.#getReal().status;
|
|
297
|
+
}
|
|
298
|
+
get statusText() {
|
|
299
|
+
return this.#init?.statusText ?? '';
|
|
300
|
+
}
|
|
301
|
+
get ok() {
|
|
302
|
+
return this.status >= 200 && this.status < 300;
|
|
303
|
+
}
|
|
304
|
+
get headers() {
|
|
305
|
+
if (this[CACHE]) {
|
|
306
|
+
return (this[CACHE][2] ??= new Headers());
|
|
307
|
+
}
|
|
308
|
+
return this.#getReal().headers;
|
|
309
|
+
}
|
|
310
|
+
get body() {
|
|
311
|
+
return this.#getReal().body;
|
|
312
|
+
}
|
|
313
|
+
get bodyUsed() {
|
|
314
|
+
return this.#real?.bodyUsed ?? false;
|
|
315
|
+
}
|
|
316
|
+
get type() {
|
|
317
|
+
return 'default';
|
|
318
|
+
}
|
|
319
|
+
get url() {
|
|
320
|
+
return '';
|
|
321
|
+
}
|
|
322
|
+
get redirected() {
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
clone() {
|
|
326
|
+
return this.#getReal().clone();
|
|
327
|
+
}
|
|
328
|
+
json() {
|
|
329
|
+
return this.#getReal().json();
|
|
330
|
+
}
|
|
331
|
+
text() {
|
|
332
|
+
return this.#getReal().text();
|
|
333
|
+
}
|
|
334
|
+
arrayBuffer() {
|
|
335
|
+
return this.#getReal().arrayBuffer();
|
|
336
|
+
}
|
|
337
|
+
blob() {
|
|
338
|
+
return this.#getReal().blob();
|
|
339
|
+
}
|
|
340
|
+
formData() {
|
|
341
|
+
return this.#getReal().formData();
|
|
342
|
+
}
|
|
343
|
+
bytes() {
|
|
344
|
+
return this.#getReal().bytes();
|
|
345
|
+
}
|
|
346
|
+
static json(data, init) {
|
|
347
|
+
const body = JSON.stringify(data);
|
|
348
|
+
const headers = init?.headers ? new Headers(init.headers) : new Headers();
|
|
349
|
+
headers.set('content-type', 'application/json');
|
|
350
|
+
return new LightResponse(body, { ...init, headers });
|
|
351
|
+
}
|
|
352
|
+
static redirect(url, status = 302) {
|
|
353
|
+
return new LightResponse(null, { status, headers: { Location: url } });
|
|
354
|
+
}
|
|
355
|
+
static error() {
|
|
356
|
+
return new GlobalResponse(null, { status: 0 });
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// Prototype chain: instanceof GlobalResponse checks pass for LightResponse
|
|
360
|
+
Object.setPrototypeOf(LightResponse, GlobalResponse);
|
|
361
|
+
Object.setPrototypeOf(LightResponse.prototype, GlobalResponse.prototype);
|
|
362
|
+
export const serve = async ({ port = 3000, hostname = '0.0.0.0', fetch: handler, mode = 'optimized', bufferThreshold = DEFAULT_BUFFER_THRESHOLD, logger = console, }) => {
|
|
363
|
+
const native = mode === 'native';
|
|
364
|
+
let listenSocket = null;
|
|
365
|
+
if (!native) {
|
|
366
|
+
Object.defineProperty(globalThis, 'Response', { value: LightResponse, configurable: true });
|
|
367
|
+
}
|
|
368
|
+
const uWS = await import('uWebSockets.js');
|
|
369
|
+
const app = (uWS.default ?? uWS).App();
|
|
370
|
+
app.any('/*', (res, req) => {
|
|
371
|
+
let aborted = false;
|
|
372
|
+
// ── 1. Sync: read request metadata before async gap ─────
|
|
373
|
+
const method = req.getCaseSensitiveMethod().toUpperCase();
|
|
374
|
+
const query = req.getQuery();
|
|
375
|
+
const path = req.getUrl();
|
|
376
|
+
const headerPairs = [];
|
|
377
|
+
let host = '';
|
|
378
|
+
let contentLength = -1;
|
|
379
|
+
req.forEach((key, value) => {
|
|
380
|
+
headerPairs.push([key, value]);
|
|
381
|
+
if (key === 'host')
|
|
382
|
+
host = value;
|
|
383
|
+
else if (key === 'content-length')
|
|
384
|
+
contentLength = +value;
|
|
385
|
+
});
|
|
386
|
+
// ── 2. Sync: set up body stream ─────────────────────────
|
|
387
|
+
const hasBody = method !== 'GET' && method !== 'HEAD';
|
|
388
|
+
const shouldBuffer = !native && hasBody && contentLength >= 0 && contentLength <= bufferThreshold;
|
|
389
|
+
let body;
|
|
390
|
+
let bodyController;
|
|
391
|
+
let bodyClosed = false;
|
|
392
|
+
let bodyPromise = null;
|
|
393
|
+
let bodyReject = null;
|
|
394
|
+
if (shouldBuffer) {
|
|
395
|
+
// ── Buffer path: small body accumulated natively in C++ ──
|
|
396
|
+
bodyPromise = new Promise((resolve, reject) => {
|
|
397
|
+
bodyReject = reject;
|
|
398
|
+
res.collectBody(bufferThreshold, (fullBody) => {
|
|
399
|
+
bodyReject = null;
|
|
400
|
+
if (fullBody === null) {
|
|
401
|
+
reject(new Error(`Body size exceeded buffer threshold ${bufferThreshold}`));
|
|
402
|
+
}
|
|
403
|
+
else if (fullBody.byteLength === 0) {
|
|
404
|
+
resolve(EMPTY_U8);
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
// Copy - collectBody neutering behavior is undocumented
|
|
408
|
+
resolve(new Uint8Array(fullBody.slice(0)));
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
bodyPromise.catch(() => { }); // prevent unhandled rejection if handler never reads body
|
|
413
|
+
}
|
|
414
|
+
else if (hasBody) {
|
|
415
|
+
// ── Stream path: large body, no Content-Length, or native mode ──
|
|
416
|
+
body = new ReadableStream({
|
|
417
|
+
start(controller) {
|
|
418
|
+
bodyController = controller;
|
|
419
|
+
res.onData((chunk, isLast) => {
|
|
420
|
+
if (chunk.byteLength > 0) {
|
|
421
|
+
// Must copy - uWS reuses the underlying ArrayBuffer memory
|
|
422
|
+
controller.enqueue(new Uint8Array(chunk.slice(0)));
|
|
423
|
+
}
|
|
424
|
+
if (isLast) {
|
|
425
|
+
bodyClosed = true;
|
|
426
|
+
controller.close();
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
},
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
// ── 3. Create request + register onAborted (BEFORE dispatch!) ─
|
|
433
|
+
let request;
|
|
434
|
+
if (native) {
|
|
435
|
+
const url = `http://${host || `${hostname}:${port}`}${path}${query ? '?' + query : ''}`;
|
|
436
|
+
const ac = new AbortController();
|
|
437
|
+
request = new Request(url, {
|
|
438
|
+
method,
|
|
439
|
+
headers: new Headers(headerPairs),
|
|
440
|
+
body,
|
|
441
|
+
signal: ac.signal,
|
|
442
|
+
// @ts-expect-error - duplex required for streaming request bodies in Node
|
|
443
|
+
duplex: hasBody ? 'half' : undefined,
|
|
444
|
+
});
|
|
445
|
+
res.onAborted(() => {
|
|
446
|
+
aborted = true;
|
|
447
|
+
ac.abort(new Error('Client connection closed'));
|
|
448
|
+
if (bodyController && !bodyClosed) {
|
|
449
|
+
try {
|
|
450
|
+
bodyController.error(new Error('Request aborted'));
|
|
451
|
+
}
|
|
452
|
+
catch {
|
|
453
|
+
/* already closed */
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
request = createRequestProxy(method, headerPairs, body, bodyPromise, host, hostname, port, path, query);
|
|
460
|
+
res.onAborted(() => {
|
|
461
|
+
aborted = true;
|
|
462
|
+
request._aborted = true;
|
|
463
|
+
if (request._ac) {
|
|
464
|
+
;
|
|
465
|
+
request._ac.abort(new Error('Client connection closed'));
|
|
466
|
+
}
|
|
467
|
+
// Buffer path
|
|
468
|
+
if (bodyReject) {
|
|
469
|
+
bodyReject(new Error('Request aborted'));
|
|
470
|
+
bodyReject = null;
|
|
471
|
+
}
|
|
472
|
+
// Stream path
|
|
473
|
+
if (bodyController && !bodyClosed) {
|
|
474
|
+
try {
|
|
475
|
+
bodyController.error(new Error('Request aborted'));
|
|
476
|
+
}
|
|
477
|
+
catch {
|
|
478
|
+
/* already closed */
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
// ── 4. Response helpers (close over res, aborted) ────────
|
|
484
|
+
const sendError = (error) => {
|
|
485
|
+
if (aborted)
|
|
486
|
+
return;
|
|
487
|
+
logger.error('Unhandled error', error instanceof Error ? (error.stack ?? error.message) : String(error), 'UwsServer');
|
|
488
|
+
res.cork(() => {
|
|
489
|
+
res.writeStatus('500');
|
|
490
|
+
res.writeHeader('content-type', 'application/json');
|
|
491
|
+
res.end(JSON.stringify({
|
|
492
|
+
statusCode: 500,
|
|
493
|
+
error: 'Internal Server Error',
|
|
494
|
+
message: 'Internal Server Error',
|
|
495
|
+
}));
|
|
496
|
+
});
|
|
497
|
+
};
|
|
498
|
+
const sendResponse = (response) => {
|
|
499
|
+
if (aborted)
|
|
500
|
+
return;
|
|
501
|
+
// Fast path: LightResponse CACHE - zero async, one cork
|
|
502
|
+
// Content-Length is set automatically by uWS res.end(body)
|
|
503
|
+
const cached = response[CACHE];
|
|
504
|
+
if (cached) {
|
|
505
|
+
const [status, body, headers] = cached;
|
|
506
|
+
res.cork(() => {
|
|
507
|
+
res.writeStatus(`${status}`);
|
|
508
|
+
if (headers) {
|
|
509
|
+
if (headers instanceof Headers) {
|
|
510
|
+
headers.forEach((v, k) => res.writeHeader(k, v));
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
for (const k of Object.keys(headers))
|
|
514
|
+
res.writeHeader(k, headers[k]);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
res.end(body ?? '');
|
|
518
|
+
});
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
// No body (e.g. native mode 204)
|
|
522
|
+
if (!response.body) {
|
|
523
|
+
res.cork(() => {
|
|
524
|
+
res.writeStatus(`${response.status}`);
|
|
525
|
+
response.headers.forEach((v, k) => res.writeHeader(k, v));
|
|
526
|
+
res.end();
|
|
527
|
+
});
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
530
|
+
// Streaming fallback (SSE, large files)
|
|
531
|
+
if (aborted)
|
|
532
|
+
return;
|
|
533
|
+
return streamBody(response);
|
|
534
|
+
};
|
|
535
|
+
const streamBody = async (response) => {
|
|
536
|
+
res.cork(() => {
|
|
537
|
+
res.writeStatus(`${response.status}`);
|
|
538
|
+
response.headers.forEach((v, k) => res.writeHeader(k, v));
|
|
539
|
+
});
|
|
540
|
+
const reader = response.body.getReader();
|
|
541
|
+
try {
|
|
542
|
+
while (true) {
|
|
543
|
+
const { done, value } = await reader.read();
|
|
544
|
+
if (done || aborted)
|
|
545
|
+
break;
|
|
546
|
+
res.cork(() => res.write(value));
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
catch {
|
|
550
|
+
// Response body stream errored
|
|
551
|
+
}
|
|
552
|
+
finally {
|
|
553
|
+
reader.releaseLock();
|
|
554
|
+
}
|
|
555
|
+
if (!aborted)
|
|
556
|
+
res.cork(() => res.end());
|
|
557
|
+
};
|
|
558
|
+
// ── 5. Dispatch: sync path when possible ────────────────
|
|
559
|
+
try {
|
|
560
|
+
const result = handler(request);
|
|
561
|
+
if (result instanceof Promise) {
|
|
562
|
+
result.then(sendResponse, sendError);
|
|
563
|
+
}
|
|
564
|
+
else {
|
|
565
|
+
const p = sendResponse(result);
|
|
566
|
+
if (p)
|
|
567
|
+
p.catch(sendError);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
catch (error) {
|
|
571
|
+
sendError(error);
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
// ── Listen ─────────────────────────────────────────────────
|
|
575
|
+
await new Promise((resolve, reject) => {
|
|
576
|
+
app.listen(port, (token) => {
|
|
577
|
+
if (token) {
|
|
578
|
+
listenSocket = token;
|
|
579
|
+
resolve();
|
|
580
|
+
}
|
|
581
|
+
else {
|
|
582
|
+
reject(new Error(`[uws-server] Failed to listen on port ${port}`));
|
|
583
|
+
}
|
|
584
|
+
});
|
|
585
|
+
});
|
|
586
|
+
return {
|
|
587
|
+
async close() {
|
|
588
|
+
if (!native) {
|
|
589
|
+
Object.defineProperty(globalThis, 'Response', { value: GlobalResponse, configurable: true });
|
|
590
|
+
}
|
|
591
|
+
if (listenSocket) {
|
|
592
|
+
;
|
|
593
|
+
(uWS.default ?? uWS).us_listen_socket_close(listenSocket);
|
|
594
|
+
listenSocket = null;
|
|
595
|
+
}
|
|
596
|
+
},
|
|
597
|
+
};
|
|
598
|
+
};
|
|
599
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@miiajs/uws-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"author": "Ruslan Matiushev",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"description": "uWebSockets.js HTTP adapter for MiiaJS - optimized and native modes.",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/miiajs/miia.git",
|
|
10
|
+
"directory": "packages/uws-server"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/miiajs/miia/tree/main/packages/uws-server#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/miiajs/miia/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"miiajs",
|
|
18
|
+
"miia",
|
|
19
|
+
"uwebsockets",
|
|
20
|
+
"http",
|
|
21
|
+
"server",
|
|
22
|
+
"performance"
|
|
23
|
+
],
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"type": "module",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"import": "./dist/index.js"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"main": "./dist/index.js",
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"files": [
|
|
37
|
+
"dist",
|
|
38
|
+
"README.md",
|
|
39
|
+
"LICENSE"
|
|
40
|
+
],
|
|
41
|
+
"sideEffects": false,
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22.22.1",
|
|
44
|
+
"bun": ">=1.3.11",
|
|
45
|
+
"deno": ">=2.6.1"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.64.0"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsc --build",
|
|
52
|
+
"clean": "tsc --build --clean"
|
|
53
|
+
}
|
|
54
|
+
}
|