@flight-framework/http 0.0.3 → 0.0.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 CHANGED
@@ -1,156 +1,580 @@
1
- # @flight-framework/http
2
-
3
- HTTP server for Flight Framework with radix-tree routing and Web Standard APIs.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install @flight-framework/http
9
- ```
10
-
11
- ## Quick Start
12
-
13
- ```typescript
14
- import { createServer } from '@flight-framework/http';
15
- import { serve } from '@flight-framework/http/node';
16
-
17
- const app = createServer();
18
-
19
- // Simple JSON response
20
- app.get('/', (c) => c.json({ message: 'Hello Flight!' }));
21
-
22
- // Route params
23
- app.get('/users/:id', (c) => {
24
- return c.json({ userId: c.params.id });
25
- });
26
-
27
- // POST with body
28
- app.post('/users', async (c) => {
29
- const body = await c.req.json();
30
- return c.json({ created: true, data: body }, 201);
31
- });
32
-
33
- // Start server
34
- serve(app, { port: 3000 });
35
- ```
36
-
37
- ## Features
38
-
39
- - Radix-tree based routing
40
- - Native Request/Response APIs
41
- - Multi-runtime: Node.js, Bun, Deno
42
- - Minimal dependencies
43
- - Full TypeScript support
44
-
45
- ## Runtime Adapters
46
-
47
- ### Node.js
48
-
49
- ```typescript
50
- import { createServer } from '@flight-framework/http';
51
- import { serve } from '@flight-framework/http/node';
52
-
53
- serve(app, { port: 3000 });
54
- ```
55
-
56
- ### Bun
57
-
58
- ```typescript
59
- import { createServer } from '@flight-framework/http';
60
- import { serve } from '@flight-framework/http/bun';
61
-
62
- serve(app, { port: 3000 });
63
- ```
64
-
65
- ### Deno
66
-
67
- ```typescript
68
- import { createServer } from '@flight-framework/http';
69
- import { serve } from '@flight-framework/http/deno';
70
-
71
- serve(app, { port: 3000 });
72
- ```
73
-
74
- ## Middleware
75
-
76
- ```typescript
77
- // Logging middleware
78
- app.use(async (c, next) => {
79
- const start = performance.now();
80
- const response = await next();
81
- const duration = performance.now() - start;
82
- console.log(`${c.req.method} ${c.req.url} - ${duration}ms`);
83
- return response;
84
- });
85
-
86
- // Auth middleware
87
- app.use(async (c, next) => {
88
- const token = c.header('Authorization');
89
- if (!token) {
90
- return c.json({ error: 'Unauthorized' }, 401);
91
- }
92
- c.set('user', { id: '123' });
93
- return next();
94
- });
95
- ```
96
-
97
- ## Context Helpers
98
-
99
- ```typescript
100
- app.get('/demo', (c) => {
101
- // JSON response
102
- return c.json({ data: 'value' });
103
-
104
- // Text response
105
- return c.text('Hello');
106
-
107
- // HTML response
108
- return c.html('<h1>Hello</h1>');
109
-
110
- // Redirect
111
- return c.redirect('/other');
112
-
113
- // Access headers
114
- const auth = c.header('Authorization');
115
-
116
- // Access cookies
117
- const session = c.cookie('session');
118
-
119
- // Access params
120
- const id = c.params.id;
121
- });
122
- ```
123
-
124
- ## API Reference
125
-
126
- ### `createServer(options?)`
127
-
128
- Create a new Flight HTTP server.
129
-
130
- ### `app.get/post/put/delete/patch(path, ...handlers)`
131
-
132
- Register a route handler.
133
-
134
- ### `app.use(...middleware)`
135
-
136
- Add global middleware.
137
-
138
- ### `app.route(path, subRouter)`
139
-
140
- Mount a sub-router.
141
-
142
- ### `app.notFound(handler)`
143
-
144
- Set custom 404 handler.
145
-
146
- ### `app.onError(handler)`
147
-
148
- Set custom error handler.
149
-
150
- ### `app.fetch(request)`
151
-
152
- Handle a Request and return a Response (Web Standard).
153
-
154
- ## License
155
-
156
- MIT
1
+ # @flight-framework/http
2
+
3
+ HTTP server for Flight Framework. Built on Web Standard APIs with radix-tree routing for maximum performance. Runs on Node.js, Bun, and Deno.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Features](#features)
8
+ - [Installation](#installation)
9
+ - [Quick Start](#quick-start)
10
+ - [Routing](#routing)
11
+ - [Route Parameters](#route-parameters)
12
+ - [Middleware](#middleware)
13
+ - [Context API](#context-api)
14
+ - [Request Handling](#request-handling)
15
+ - [Response Helpers](#response-helpers)
16
+ - [Error Handling](#error-handling)
17
+ - [Sub-Routers](#sub-routers)
18
+ - [Runtime Adapters](#runtime-adapters)
19
+ - [Static Files](#static-files)
20
+ - [CORS](#cors)
21
+ - [API Reference](#api-reference)
22
+ - [License](#license)
23
+
24
+ ---
25
+
26
+ ## Features
27
+
28
+ - Radix-tree routing for fast path matching
29
+ - Native Request/Response APIs (Web Standard)
30
+ - Multi-runtime support: Node.js, Bun, Deno
31
+ - Middleware with async/await
32
+ - Type-safe route parameters
33
+ - Built-in helpers for JSON, HTML, redirects
34
+ - Zero external runtime dependencies
35
+ - Full TypeScript support
36
+
37
+ ---
38
+
39
+ ## Installation
40
+
41
+ ```bash
42
+ npm install @flight-framework/http
43
+ ```
44
+
45
+ ---
46
+
47
+ ## Quick Start
48
+
49
+ ```typescript
50
+ import { createServer } from '@flight-framework/http';
51
+ import { serve } from '@flight-framework/http/node';
52
+
53
+ const app = createServer();
54
+
55
+ app.get('/', (c) => c.json({ message: 'Hello Flight!' }));
56
+
57
+ app.get('/users/:id', (c) => {
58
+ return c.json({ userId: c.params.id });
59
+ });
60
+
61
+ app.post('/users', async (c) => {
62
+ const body = await c.req.json();
63
+ return c.json({ created: true, user: body }, 201);
64
+ });
65
+
66
+ serve(app, { port: 3000 });
67
+ console.log('Server running at http://localhost:3000');
68
+ ```
69
+
70
+ ---
71
+
72
+ ## Routing
73
+
74
+ Register routes using HTTP method helpers:
75
+
76
+ ```typescript
77
+ app.get('/path', handler); // GET
78
+ app.post('/path', handler); // POST
79
+ app.put('/path', handler); // PUT
80
+ app.patch('/path', handler); // PATCH
81
+ app.delete('/path', handler); // DELETE
82
+ app.options('/path', handler); // OPTIONS
83
+ app.head('/path', handler); // HEAD
84
+
85
+ // All methods
86
+ app.all('/path', handler);
87
+
88
+ // Multiple methods
89
+ app.on(['GET', 'POST'], '/path', handler);
90
+ ```
91
+
92
+ ### Route Patterns
93
+
94
+ ```typescript
95
+ // Static path
96
+ app.get('/about', handler);
97
+
98
+ // Single parameter
99
+ app.get('/users/:id', handler);
100
+
101
+ // Multiple parameters
102
+ app.get('/posts/:year/:month/:slug', handler);
103
+
104
+ // Optional parameter
105
+ app.get('/files/:path?', handler);
106
+
107
+ // Wildcard (catch-all)
108
+ app.get('/assets/*', handler);
109
+
110
+ // Named wildcard
111
+ app.get('/docs/:path*', handler);
112
+ ```
113
+
114
+ ---
115
+
116
+ ## Route Parameters
117
+
118
+ Access route parameters from the context:
119
+
120
+ ```typescript
121
+ // Route: /users/:id/posts/:postId
122
+ app.get('/users/:id/posts/:postId', (c) => {
123
+ const { id, postId } = c.params;
124
+ return c.json({ userId: id, postId });
125
+ });
126
+
127
+ // Wildcard parameters
128
+ // Route: /files/*
129
+ // Request: /files/images/photo.jpg
130
+ app.get('/files/*', (c) => {
131
+ const path = c.params['*']; // "images/photo.jpg"
132
+ return c.text(`File: ${path}`);
133
+ });
134
+ ```
135
+
136
+ ### Type-Safe Parameters
137
+
138
+ ```typescript
139
+ import type { Context } from '@flight-framework/http';
140
+
141
+ interface UserParams {
142
+ id: string;
143
+ postId: string;
144
+ }
145
+
146
+ app.get('/users/:id/posts/:postId', (c: Context<UserParams>) => {
147
+ c.params.id; // string (typed)
148
+ c.params.postId; // string (typed)
149
+ });
150
+ ```
151
+
152
+ ---
153
+
154
+ ## Middleware
155
+
156
+ Middleware functions run before route handlers:
157
+
158
+ ```typescript
159
+ // Global middleware (runs on all routes)
160
+ app.use(async (c, next) => {
161
+ const start = performance.now();
162
+ const response = await next();
163
+ const duration = performance.now() - start;
164
+ console.log(`${c.req.method} ${c.req.url} - ${duration.toFixed(2)}ms`);
165
+ return response;
166
+ });
167
+
168
+ // Path-specific middleware
169
+ app.use('/api/*', async (c, next) => {
170
+ // Only runs on /api/* routes
171
+ return next();
172
+ });
173
+ ```
174
+
175
+ ### Authentication Middleware
176
+
177
+ ```typescript
178
+ const authMiddleware = async (c, next) => {
179
+ const token = c.header('Authorization')?.replace('Bearer ', '');
180
+
181
+ if (!token) {
182
+ return c.json({ error: 'Unauthorized' }, 401);
183
+ }
184
+
185
+ const user = await verifyToken(token);
186
+ if (!user) {
187
+ return c.json({ error: 'Invalid token' }, 401);
188
+ }
189
+
190
+ // Store user in context for later use
191
+ c.set('user', user);
192
+ return next();
193
+ };
194
+
195
+ // Apply to specific routes
196
+ app.use('/api/*', authMiddleware);
197
+
198
+ // Access in route handler
199
+ app.get('/api/profile', (c) => {
200
+ const user = c.get('user');
201
+ return c.json(user);
202
+ });
203
+ ```
204
+
205
+ ### Middleware Chain
206
+
207
+ Multiple middleware functions run in order:
208
+
209
+ ```typescript
210
+ app.get('/protected',
211
+ authMiddleware,
212
+ rateLimitMiddleware,
213
+ validationMiddleware,
214
+ (c) => {
215
+ return c.json({ data: 'secret' });
216
+ }
217
+ );
218
+ ```
219
+
220
+ ---
221
+
222
+ ## Context API
223
+
224
+ The context object provides access to request data and response helpers:
225
+
226
+ ```typescript
227
+ app.get('/demo', (c) => {
228
+ // Request object (Web Standard)
229
+ c.req; // Request
230
+ c.req.method; // "GET"
231
+ c.req.url; // Full URL
232
+
233
+ // Route parameters
234
+ c.params; // { id: "123" }
235
+ c.params.id; // "123"
236
+
237
+ // Query parameters
238
+ c.query('page'); // "1" or undefined
239
+ c.query('page', '1'); // "1" (with default)
240
+ c.queries('tags'); // ["a", "b"] (array)
241
+
242
+ // Headers
243
+ c.header('Content-Type'); // "application/json"
244
+ c.header('X-Custom'); // Custom header value
245
+
246
+ // Cookies
247
+ c.cookie('session'); // Cookie value
248
+
249
+ // Context storage
250
+ c.set('key', 'value'); // Store value
251
+ c.get('key'); // Retrieve value
252
+
253
+ return c.json({ ok: true });
254
+ });
255
+ ```
256
+
257
+ ---
258
+
259
+ ## Request Handling
260
+
261
+ ### JSON Body
262
+
263
+ ```typescript
264
+ app.post('/api/users', async (c) => {
265
+ const body = await c.req.json();
266
+ // body is parsed JSON
267
+ return c.json({ received: body });
268
+ });
269
+ ```
270
+
271
+ ### Form Data
272
+
273
+ ```typescript
274
+ app.post('/upload', async (c) => {
275
+ const form = await c.req.formData();
276
+ const name = form.get('name');
277
+ const file = form.get('file'); // File object
278
+
279
+ return c.json({ name, fileName: file?.name });
280
+ });
281
+ ```
282
+
283
+ ### Raw Text
284
+
285
+ ```typescript
286
+ app.post('/webhook', async (c) => {
287
+ const text = await c.req.text();
288
+ return c.text(`Received: ${text}`);
289
+ });
290
+ ```
291
+
292
+ ### Raw Binary
293
+
294
+ ```typescript
295
+ app.post('/binary', async (c) => {
296
+ const buffer = await c.req.arrayBuffer();
297
+ return c.json({ bytes: buffer.byteLength });
298
+ });
299
+ ```
300
+
301
+ ---
302
+
303
+ ## Response Helpers
304
+
305
+ ```typescript
306
+ // JSON response
307
+ c.json({ data: 'value' });
308
+ c.json({ created: true }, 201);
309
+ c.json({ error: 'Not found' }, 404);
310
+
311
+ // Text response
312
+ c.text('Hello, World!');
313
+ c.text('Created', 201);
314
+
315
+ // HTML response
316
+ c.html('<h1>Hello</h1>');
317
+ c.html('<!DOCTYPE html>...', 200);
318
+
319
+ // Redirect
320
+ c.redirect('/new-location');
321
+ c.redirect('/login', 302); // Temporary (default)
322
+ c.redirect('/moved', 301); // Permanent
323
+
324
+ // No Content
325
+ c.body(null, 204);
326
+
327
+ // Custom response
328
+ return new Response(body, {
329
+ status: 200,
330
+ headers: { 'X-Custom': 'value' },
331
+ });
332
+
333
+ // Set response headers
334
+ c.header('X-Request-Id', requestId);
335
+ c.header('Cache-Control', 'max-age=3600');
336
+
337
+ // Set cookies
338
+ c.cookie('session', token, {
339
+ httpOnly: true,
340
+ secure: true,
341
+ sameSite: 'Strict',
342
+ maxAge: 60 * 60 * 24, // 1 day
343
+ });
344
+ ```
345
+
346
+ ---
347
+
348
+ ## Error Handling
349
+
350
+ ### Global Error Handler
351
+
352
+ ```typescript
353
+ app.onError((error, c) => {
354
+ console.error('Error:', error);
355
+
356
+ if (error instanceof ValidationError) {
357
+ return c.json({ error: error.message }, 400);
358
+ }
359
+
360
+ return c.json({ error: 'Internal Server Error' }, 500);
361
+ });
362
+ ```
363
+
364
+ ### 404 Not Found
365
+
366
+ ```typescript
367
+ app.notFound((c) => {
368
+ return c.json({
369
+ error: 'Not Found',
370
+ path: new URL(c.req.url).pathname,
371
+ }, 404);
372
+ });
373
+ ```
374
+
375
+ ### Throwing Errors
376
+
377
+ ```typescript
378
+ import { HTTPException } from '@flight-framework/http';
379
+
380
+ app.get('/protected', (c) => {
381
+ if (!c.get('user')) {
382
+ throw new HTTPException(401, 'Unauthorized');
383
+ }
384
+ return c.json({ secret: 'data' });
385
+ });
386
+ ```
387
+
388
+ ---
389
+
390
+ ## Sub-Routers
391
+
392
+ Organize routes into modules:
393
+
394
+ ```typescript
395
+ // routes/users.ts
396
+ import { createServer } from '@flight-framework/http';
397
+
398
+ export const users = createServer();
399
+
400
+ users.get('/', (c) => c.json({ users: [] }));
401
+ users.get('/:id', (c) => c.json({ id: c.params.id }));
402
+ users.post('/', (c) => c.json({ created: true }));
403
+
404
+ // main.ts
405
+ import { createServer } from '@flight-framework/http';
406
+ import { users } from './routes/users';
407
+
408
+ const app = createServer();
409
+
410
+ // Mount sub-router
411
+ app.route('/api/users', users);
412
+
413
+ // Routes:
414
+ // GET /api/users
415
+ // GET /api/users/:id
416
+ // POST /api/users
417
+ ```
418
+
419
+ ---
420
+
421
+ ## Runtime Adapters
422
+
423
+ ### Node.js
424
+
425
+ ```typescript
426
+ import { createServer } from '@flight-framework/http';
427
+ import { serve } from '@flight-framework/http/node';
428
+
429
+ const app = createServer();
430
+
431
+ serve(app, {
432
+ port: 3000,
433
+ hostname: '0.0.0.0',
434
+ });
435
+ ```
436
+
437
+ ### Bun
438
+
439
+ ```typescript
440
+ import { createServer } from '@flight-framework/http';
441
+ import { serve } from '@flight-framework/http/bun';
442
+
443
+ const app = createServer();
444
+
445
+ serve(app, { port: 3000 });
446
+
447
+ // Or use Bun's native API
448
+ Bun.serve({
449
+ port: 3000,
450
+ fetch: app.fetch,
451
+ });
452
+ ```
453
+
454
+ ### Deno
455
+
456
+ ```typescript
457
+ import { createServer } from '@flight-framework/http';
458
+ import { serve } from '@flight-framework/http/deno';
459
+
460
+ const app = createServer();
461
+
462
+ serve(app, { port: 3000 });
463
+
464
+ // Or use Deno's native API
465
+ Deno.serve({ port: 3000 }, app.fetch);
466
+ ```
467
+
468
+ ### Cloudflare Workers
469
+
470
+ ```typescript
471
+ import { createServer } from '@flight-framework/http';
472
+
473
+ const app = createServer();
474
+
475
+ // ... define routes
476
+
477
+ export default {
478
+ fetch: app.fetch,
479
+ };
480
+ ```
481
+
482
+ ---
483
+
484
+ ## Static Files
485
+
486
+ Serve static files from a directory:
487
+
488
+ ```typescript
489
+ import { serveStatic } from '@flight-framework/http/static';
490
+
491
+ // Serve from 'public' directory
492
+ app.use('/static/*', serveStatic({ root: './public' }));
493
+
494
+ // With options
495
+ app.use('/assets/*', serveStatic({
496
+ root: './assets',
497
+ maxAge: 60 * 60 * 24, // 1 day cache
498
+ index: 'index.html',
499
+ }));
500
+ ```
501
+
502
+ ---
503
+
504
+ ## CORS
505
+
506
+ Enable Cross-Origin Resource Sharing:
507
+
508
+ ```typescript
509
+ import { cors } from '@flight-framework/http/cors';
510
+
511
+ // Allow all origins
512
+ app.use(cors());
513
+
514
+ // Specific origins
515
+ app.use(cors({
516
+ origin: 'https://example.com',
517
+ methods: ['GET', 'POST', 'PUT', 'DELETE'],
518
+ headers: ['Content-Type', 'Authorization'],
519
+ credentials: true,
520
+ maxAge: 86400,
521
+ }));
522
+
523
+ // Dynamic origin
524
+ app.use(cors({
525
+ origin: (origin) => {
526
+ return origin.endsWith('.example.com');
527
+ },
528
+ }));
529
+ ```
530
+
531
+ ---
532
+
533
+ ## API Reference
534
+
535
+ ### createServer(options?)
536
+
537
+ Create a new Flight HTTP server.
538
+
539
+ | Option | Type | Default | Description |
540
+ |--------|------|---------|-------------|
541
+ | `strict` | `boolean` | `true` | Strict routing (trailing slash matters) |
542
+ | `getPath` | `function` | - | Custom path extraction |
543
+
544
+ ### Context Methods
545
+
546
+ | Method | Description |
547
+ |--------|-------------|
548
+ | `c.req` | Web Standard Request object |
549
+ | `c.params` | Route parameters |
550
+ | `c.query(name, default?)` | Get query parameter |
551
+ | `c.queries(name)` | Get all values for query param |
552
+ | `c.header(name)` | Get request header |
553
+ | `c.cookie(name)` | Get cookie value |
554
+ | `c.set(key, value)` | Store value in context |
555
+ | `c.get(key)` | Retrieve value from context |
556
+ | `c.json(data, status?)` | JSON response |
557
+ | `c.text(text, status?)` | Text response |
558
+ | `c.html(html, status?)` | HTML response |
559
+ | `c.redirect(url, status?)` | Redirect response |
560
+ | `c.body(body, status?)` | Raw body response |
561
+
562
+ ### App Methods
563
+
564
+ | Method | Description |
565
+ |--------|-------------|
566
+ | `app.get/post/put/delete/patch(path, ...handlers)` | Register route |
567
+ | `app.all(path, ...handlers)` | All HTTP methods |
568
+ | `app.on(methods[], path, ...handlers)` | Specific methods |
569
+ | `app.use(...middleware)` | Add middleware |
570
+ | `app.use(path, ...middleware)` | Path-specific middleware |
571
+ | `app.route(path, subRouter)` | Mount sub-router |
572
+ | `app.notFound(handler)` | Custom 404 handler |
573
+ | `app.onError(handler)` | Custom error handler |
574
+ | `app.fetch(request)` | Handle request (Web Standard) |
575
+
576
+ ---
577
+
578
+ ## License
579
+
580
+ MIT
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/bun.ts"],"names":[],"mappings":";AAsDO,SAAS,KAAA,CACZ,GAAA,EACA,OAAA,GAAwB,EAAC,EAChB;AACT,EAAA,MAAM;AAAA,IACF,IAAA,GAAO,GAAA;AAAA,IACP,QAAA,GAAW,SAAA;AAAA,IACX;AAAA,GACJ,GAAI,OAAA;AAEJ,EAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAM;AAAA,IACrB,IAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,CAAC,OAAA,KAAY,GAAA,CAAI,MAAM,OAAO;AAAA,GACxC,CAAA;AAED,EAAA,MAAM,OAAO,EAAE,IAAA,EAAM,OAAO,IAAA,EAAM,QAAA,EAAU,OAAO,QAAA,EAAS;AAE5D,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACjB,CAAA,MAAO;AACH,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;AAAA;AAAA,oCAAA,EAGa,KAAK,IAAI,CAAA;AAAA,0BAAA,EACnB,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA;AAAA,CAChD,CAAA;AAAA,EACG;AAEA,EAAA,OAAO,MAAA;AACX","file":"bun.js","sourcesContent":["/**\n * @flight-framework/http - Bun Adapter\n * \n * Allows running Flight HTTP server on Bun runtime.\n * Bun natively supports Web Standard Request/Response.\n */\n\nimport type { FlightHttpServer, Env } from '../types.js';\n\n// ============================================================================\n// Bun Server Types\n// ============================================================================\n\ninterface BunServeOptions {\n port?: number;\n hostname?: string;\n fetch: (request: Request) => Response | Promise<Response>;\n}\n\ninterface BunServer {\n stop: () => void;\n port: number;\n hostname: string;\n}\n\n// We don't import Bun types directly to avoid build issues\ndeclare const Bun: {\n serve: (options: BunServeOptions) => BunServer;\n};\n\n// ============================================================================\n// serve() Function\n// ============================================================================\n\nexport interface ServeOptions {\n port?: number;\n hostname?: string;\n onListen?: (info: { port: number; hostname: string }) => void;\n}\n\n/**\n * Start a Bun server with the Flight app\n * \n * @example\n * ```typescript\n * import { createServer } from '@flight-framework/http';\n * import { serve } from '@flight-framework/http/bun';\n * \n * const app = createServer();\n * app.get('/', (c) => c.json({ hello: 'world' }));\n * \n * serve(app, { port: 3000 });\n * ```\n */\nexport function serve<E extends Env = Env>(\n app: FlightHttpServer<E>,\n options: ServeOptions = {}\n): BunServer {\n const {\n port = 3000,\n hostname = '0.0.0.0',\n onListen,\n } = options;\n\n const server = Bun.serve({\n port,\n hostname,\n fetch: (request) => app.fetch(request),\n });\n\n const info = { port: server.port, hostname: server.hostname };\n\n if (onListen) {\n onListen(info);\n } else {\n console.log(`\n ✈️ Flight HTTP Server (Bun) running!\n \n ➜ Local: http://localhost:${info.port}/\n ➜ Network: http://${info.hostname}:${info.port}/\n`);\n }\n\n return server;\n}\n\n// Re-export useful types\nexport type { FlightHttpServer } from '../types.js';\n"]}
1
+ {"version":3,"sources":["../../src/adapters/bun.ts"],"names":[],"mappings":";AAsDO,SAAS,KAAA,CACZ,GAAA,EACA,OAAA,GAAwB,EAAC,EAChB;AACT,EAAA,MAAM;AAAA,IACF,IAAA,GAAO,GAAA;AAAA,IACP,QAAA,GAAW,SAAA;AAAA,IACX;AAAA,GACJ,GAAI,OAAA;AAEJ,EAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAM;AAAA,IACrB,IAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,CAAC,OAAA,KAAY,GAAA,CAAI,MAAM,OAAO;AAAA,GACxC,CAAA;AAED,EAAA,MAAM,OAAO,EAAE,IAAA,EAAM,OAAO,IAAA,EAAM,QAAA,EAAU,OAAO,QAAA,EAAS;AAE5D,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACjB,CAAA,MAAO;AACH,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;AAAA;AAAA,oCAAA,EAGa,KAAK,IAAI,CAAA;AAAA,0BAAA,EACnB,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA;AAAA,CAChD,CAAA;AAAA,EACG;AAEA,EAAA,OAAO,MAAA;AACX","file":"bun.js","sourcesContent":["/**\r\n * @flight-framework/http - Bun Adapter\r\n * \r\n * Allows running Flight HTTP server on Bun runtime.\r\n * Bun natively supports Web Standard Request/Response.\r\n */\r\n\r\nimport type { FlightHttpServer, Env } from '../types.js';\r\n\r\n// ============================================================================\r\n// Bun Server Types\r\n// ============================================================================\r\n\r\ninterface BunServeOptions {\r\n port?: number;\r\n hostname?: string;\r\n fetch: (request: Request) => Response | Promise<Response>;\r\n}\r\n\r\ninterface BunServer {\r\n stop: () => void;\r\n port: number;\r\n hostname: string;\r\n}\r\n\r\n// We don't import Bun types directly to avoid build issues\r\ndeclare const Bun: {\r\n serve: (options: BunServeOptions) => BunServer;\r\n};\r\n\r\n// ============================================================================\r\n// serve() Function\r\n// ============================================================================\r\n\r\nexport interface ServeOptions {\r\n port?: number;\r\n hostname?: string;\r\n onListen?: (info: { port: number; hostname: string }) => void;\r\n}\r\n\r\n/**\r\n * Start a Bun server with the Flight app\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight-framework/http';\r\n * import { serve } from '@flight-framework/http/bun';\r\n * \r\n * const app = createServer();\r\n * app.get('/', (c) => c.json({ hello: 'world' }));\r\n * \r\n * serve(app, { port: 3000 });\r\n * ```\r\n */\r\nexport function serve<E extends Env = Env>(\r\n app: FlightHttpServer<E>,\r\n options: ServeOptions = {}\r\n): BunServer {\r\n const {\r\n port = 3000,\r\n hostname = '0.0.0.0',\r\n onListen,\r\n } = options;\r\n\r\n const server = Bun.serve({\r\n port,\r\n hostname,\r\n fetch: (request) => app.fetch(request),\r\n });\r\n\r\n const info = { port: server.port, hostname: server.hostname };\r\n\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n ✈️ Flight HTTP Server (Bun) running!\r\n \r\n ➜ Local: http://localhost:${info.port}/\r\n ➜ Network: http://${info.hostname}:${info.port}/\r\n`);\r\n }\r\n\r\n return server;\r\n}\r\n\r\n// Re-export useful types\r\nexport type { FlightHttpServer } from '../types.js';\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/deno.ts"],"names":[],"mappings":";AAmDO,SAAS,KAAA,CACZ,GAAA,EACA,OAAA,GAAwB,EAAC,EACQ;AACjC,EAAA,MAAM;AAAA,IACF,IAAA,GAAO,GAAA;AAAA,IACP,QAAA,GAAW,SAAA;AAAA,IACX;AAAA,GACJ,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA;AAAA,IAChB,CAAC,OAAA,KAAY,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAAA,IAC9B;AAAA,MACI,IAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,EAAU,QAAA,GACJ,CAAC,MAAA,KAAW,SAAS,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,UAAU,MAAA,CAAO,QAAA,EAAU,CAAA,GACrE,CAAC,MAAA,KAAW;AACV,QAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;AAAA;AAAA,oCAAA,EAGC,OAAO,IAAI,CAAA;AAAA,0BAAA,EACrB,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA;AAAA,CACpD,CAAA;AAAA,MACe;AAAA;AACR,GACJ;AAEA,EAAA,OAAO,MAAA;AACX","file":"deno.js","sourcesContent":["/**\n * @flight-framework/http - Deno Adapter\n * \n * Allows running Flight HTTP server on Deno runtime.\n * Deno natively supports Web Standard Request/Response.\n */\n\nimport type { FlightHttpServer, Env } from '../types.js';\n\n// ============================================================================\n// Deno Server Types\n// ============================================================================\n\ninterface DenoServeOptions {\n port?: number;\n hostname?: string;\n onListen?: (params: { hostname: string; port: number }) => void;\n}\n\n// We don't import Deno types directly to avoid build issues\ndeclare const Deno: {\n serve: (\n handler: (request: Request) => Response | Promise<Response>,\n options?: DenoServeOptions\n ) => { shutdown: () => Promise<void> };\n};\n\n// ============================================================================\n// serve() Function\n// ============================================================================\n\nexport interface ServeOptions {\n port?: number;\n hostname?: string;\n onListen?: (info: { port: number; hostname: string }) => void;\n}\n\n/**\n * Start a Deno server with the Flight app\n * \n * @example\n * ```typescript\n * import { createServer } from '@flight-framework/http';\n * import { serve } from '@flight-framework/http/deno';\n * \n * const app = createServer();\n * app.get('/', (c) => c.json({ hello: 'world' }));\n * \n * serve(app, { port: 3000 });\n * ```\n */\nexport function serve<E extends Env = Env>(\n app: FlightHttpServer<E>,\n options: ServeOptions = {}\n): { shutdown: () => Promise<void> } {\n const {\n port = 3000,\n hostname = '0.0.0.0',\n onListen,\n } = options;\n\n const server = Deno.serve(\n (request) => app.fetch(request),\n {\n port,\n hostname,\n onListen: onListen\n ? (params) => onListen({ port: params.port, hostname: params.hostname })\n : (params) => {\n console.log(`\n ✈️ Flight HTTP Server (Deno) running!\n \n ➜ Local: http://localhost:${params.port}/\n ➜ Network: http://${params.hostname}:${params.port}/\n`);\n },\n }\n );\n\n return server;\n}\n\n// Re-export useful types\nexport type { FlightHttpServer } from '../types.js';\n"]}
1
+ {"version":3,"sources":["../../src/adapters/deno.ts"],"names":[],"mappings":";AAmDO,SAAS,KAAA,CACZ,GAAA,EACA,OAAA,GAAwB,EAAC,EACQ;AACjC,EAAA,MAAM;AAAA,IACF,IAAA,GAAO,GAAA;AAAA,IACP,QAAA,GAAW,SAAA;AAAA,IACX;AAAA,GACJ,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA;AAAA,IAChB,CAAC,OAAA,KAAY,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAAA,IAC9B;AAAA,MACI,IAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,EAAU,QAAA,GACJ,CAAC,MAAA,KAAW,SAAS,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,UAAU,MAAA,CAAO,QAAA,EAAU,CAAA,GACrE,CAAC,MAAA,KAAW;AACV,QAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;AAAA;AAAA,oCAAA,EAGC,OAAO,IAAI,CAAA;AAAA,0BAAA,EACrB,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA;AAAA,CACpD,CAAA;AAAA,MACe;AAAA;AACR,GACJ;AAEA,EAAA,OAAO,MAAA;AACX","file":"deno.js","sourcesContent":["/**\r\n * @flight-framework/http - Deno Adapter\r\n * \r\n * Allows running Flight HTTP server on Deno runtime.\r\n * Deno natively supports Web Standard Request/Response.\r\n */\r\n\r\nimport type { FlightHttpServer, Env } from '../types.js';\r\n\r\n// ============================================================================\r\n// Deno Server Types\r\n// ============================================================================\r\n\r\ninterface DenoServeOptions {\r\n port?: number;\r\n hostname?: string;\r\n onListen?: (params: { hostname: string; port: number }) => void;\r\n}\r\n\r\n// We don't import Deno types directly to avoid build issues\r\ndeclare const Deno: {\r\n serve: (\r\n handler: (request: Request) => Response | Promise<Response>,\r\n options?: DenoServeOptions\r\n ) => { shutdown: () => Promise<void> };\r\n};\r\n\r\n// ============================================================================\r\n// serve() Function\r\n// ============================================================================\r\n\r\nexport interface ServeOptions {\r\n port?: number;\r\n hostname?: string;\r\n onListen?: (info: { port: number; hostname: string }) => void;\r\n}\r\n\r\n/**\r\n * Start a Deno server with the Flight app\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight-framework/http';\r\n * import { serve } from '@flight-framework/http/deno';\r\n * \r\n * const app = createServer();\r\n * app.get('/', (c) => c.json({ hello: 'world' }));\r\n * \r\n * serve(app, { port: 3000 });\r\n * ```\r\n */\r\nexport function serve<E extends Env = Env>(\r\n app: FlightHttpServer<E>,\r\n options: ServeOptions = {}\r\n): { shutdown: () => Promise<void> } {\r\n const {\r\n port = 3000,\r\n hostname = '0.0.0.0',\r\n onListen,\r\n } = options;\r\n\r\n const server = Deno.serve(\r\n (request) => app.fetch(request),\r\n {\r\n port,\r\n hostname,\r\n onListen: onListen\r\n ? (params) => onListen({ port: params.port, hostname: params.hostname })\r\n : (params) => {\r\n console.log(`\r\n ✈️ Flight HTTP Server (Deno) running!\r\n \r\n ➜ Local: http://localhost:${params.port}/\r\n ➜ Network: http://${params.hostname}:${params.port}/\r\n`);\r\n },\r\n }\r\n );\r\n\r\n return server;\r\n}\r\n\r\n// Re-export useful types\r\nexport type { FlightHttpServer } from '../types.js';\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/node.ts"],"names":["createNodeServer"],"mappings":"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","file":"node.js","sourcesContent":["/**\n * @flight-framework/http - Node.js Adapter\n * \n * Allows running Flight HTTP server on Node.js.\n */\n\nimport { createServer as createNodeServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport type { FlightHttpServer, Env } from '../types.js';\n\n// ============================================================================\n// Node.js Request Converter\n// ============================================================================\n\nasync function toWebRequest(req: IncomingMessage): Promise<Request> {\n const host = req.headers.host || 'localhost';\n const protocol = 'http'; // Simplified, use https detection in production\n const url = new URL(req.url || '/', `${protocol}://${host}`);\n\n // Collect body for non-GET/HEAD requests\n let body: BodyInit | null = null;\n\n if (req.method !== 'GET' && req.method !== 'HEAD') {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n body = Buffer.concat(chunks);\n }\n\n // Convert headers\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n for (const v of value) {\n headers.append(key, v);\n }\n } else {\n headers.set(key, value);\n }\n }\n }\n\n return new Request(url.toString(), {\n method: req.method || 'GET',\n headers,\n body,\n });\n}\n\n// ============================================================================\n// Node.js Response Writer\n// ============================================================================\n\nasync function writeWebResponse(webResponse: Response, res: ServerResponse): Promise<void> {\n // Set status\n res.statusCode = webResponse.status;\n res.statusMessage = webResponse.statusText;\n\n // Set headers\n webResponse.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n // Send body\n if (webResponse.body) {\n const reader = webResponse.body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n res.end();\n}\n\n// ============================================================================\n// serve() Function\n// ============================================================================\n\nexport interface ServeOptions {\n port?: number;\n hostname?: string;\n onListen?: (info: { port: number; hostname: string }) => void;\n}\n\n/**\n * Start a Node.js HTTP server with the Flight app\n * \n * @example\n * ```typescript\n * import { createServer } from '@flight-framework/http';\n * import { serve } from '@flight-framework/http/node';\n * \n * const app = createServer();\n * app.get('/', (c) => c.json({ hello: 'world' }));\n * \n * serve(app, { port: 3000 });\n * ```\n */\nexport function serve<E extends Env = Env>(\n app: FlightHttpServer<E>,\n options: ServeOptions = {}\n): ReturnType<typeof createNodeServer> {\n const {\n port = 3000,\n hostname = '0.0.0.0',\n onListen,\n } = options;\n\n const server = createNodeServer(async (req, res) => {\n try {\n const webRequest = await toWebRequest(req);\n const webResponse = await app.fetch(webRequest);\n await writeWebResponse(webResponse, res);\n } catch (error) {\n console.error('[Flight HTTP Node] Error:', error);\n res.statusCode = 500;\n res.end('Internal Server Error');\n }\n });\n\n server.listen(port, hostname, () => {\n const info = { port, hostname };\n\n if (onListen) {\n onListen(info);\n } else {\n console.log(`\n ✈️ Flight HTTP Server running!\n \n ➜ Local: http://${hostname === '0.0.0.0' ? 'localhost' : hostname}:${port}/\n ➜ Network: http://${hostname}:${port}/\n`);\n }\n });\n\n return server;\n}\n\n// Re-export useful types\nexport type { FlightHttpServer } from '../types.js';\n"]}
1
+ {"version":3,"sources":["../../src/adapters/node.ts"],"names":["createNodeServer"],"mappings":"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","file":"node.js","sourcesContent":["/**\r\n * @flight-framework/http - Node.js Adapter\r\n * \r\n * Allows running Flight HTTP server on Node.js.\r\n */\r\n\r\nimport { createServer as createNodeServer, type IncomingMessage, type ServerResponse } from 'node:http';\r\nimport type { FlightHttpServer, Env } from '../types.js';\r\n\r\n// ============================================================================\r\n// Node.js Request Converter\r\n// ============================================================================\r\n\r\nasync function toWebRequest(req: IncomingMessage): Promise<Request> {\r\n const host = req.headers.host || 'localhost';\r\n const protocol = 'http'; // Simplified, use https detection in production\r\n const url = new URL(req.url || '/', `${protocol}://${host}`);\r\n\r\n // Collect body for non-GET/HEAD requests\r\n let body: BodyInit | null = null;\r\n\r\n if (req.method !== 'GET' && req.method !== 'HEAD') {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of req) {\r\n chunks.push(chunk as Buffer);\r\n }\r\n body = Buffer.concat(chunks);\r\n }\r\n\r\n // Convert headers\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n if (Array.isArray(value)) {\r\n for (const v of value) {\r\n headers.append(key, v);\r\n }\r\n } else {\r\n headers.set(key, value);\r\n }\r\n }\r\n }\r\n\r\n return new Request(url.toString(), {\r\n method: req.method || 'GET',\r\n headers,\r\n body,\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Node.js Response Writer\r\n// ============================================================================\r\n\r\nasync function writeWebResponse(webResponse: Response, res: ServerResponse): Promise<void> {\r\n // Set status\r\n res.statusCode = webResponse.status;\r\n res.statusMessage = webResponse.statusText;\r\n\r\n // Set headers\r\n webResponse.headers.forEach((value, key) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n // Send body\r\n if (webResponse.body) {\r\n const reader = webResponse.body.getReader();\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n res.write(value);\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n res.end();\r\n}\r\n\r\n// ============================================================================\r\n// serve() Function\r\n// ============================================================================\r\n\r\nexport interface ServeOptions {\r\n port?: number;\r\n hostname?: string;\r\n onListen?: (info: { port: number; hostname: string }) => void;\r\n}\r\n\r\n/**\r\n * Start a Node.js HTTP server with the Flight app\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight-framework/http';\r\n * import { serve } from '@flight-framework/http/node';\r\n * \r\n * const app = createServer();\r\n * app.get('/', (c) => c.json({ hello: 'world' }));\r\n * \r\n * serve(app, { port: 3000 });\r\n * ```\r\n */\r\nexport function serve<E extends Env = Env>(\r\n app: FlightHttpServer<E>,\r\n options: ServeOptions = {}\r\n): ReturnType<typeof createNodeServer> {\r\n const {\r\n port = 3000,\r\n hostname = '0.0.0.0',\r\n onListen,\r\n } = options;\r\n\r\n const server = createNodeServer(async (req, res) => {\r\n try {\r\n const webRequest = await toWebRequest(req);\r\n const webResponse = await app.fetch(webRequest);\r\n await writeWebResponse(webResponse, res);\r\n } catch (error) {\r\n console.error('[Flight HTTP Node] Error:', error);\r\n res.statusCode = 500;\r\n res.end('Internal Server Error');\r\n }\r\n });\r\n\r\n server.listen(port, hostname, () => {\r\n const info = { port, hostname };\r\n\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n ✈️ Flight HTTP Server running!\r\n \r\n ➜ Local: http://${hostname === '0.0.0.0' ? 'localhost' : hostname}:${port}/\r\n ➜ Network: http://${hostname}:${port}/\r\n`);\r\n }\r\n });\r\n\r\n return server;\r\n}\r\n\r\n// Re-export useful types\r\nexport type { FlightHttpServer } from '../types.js';\r\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/router.ts","../src/context.ts","../src/server.ts"],"names":["createRadixRouter"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @flight-framework/http - Router\n * \n * Radix-tree based router for ultra-fast path matching.\n * Uses radix3 under the hood.\n */\n\nimport { createRouter as createRadixRouter, type RadixRouter } from 'radix3';\nimport type { Handler, HttpMethod, Route, Env } from './types.js';\n\n// ============================================================================\n// Router Types\n// ============================================================================\n\ninterface RouterNode<E extends Env = Env> {\n handlers: Map<HttpMethod | '*', Handler<E>>;\n}\n\ninterface MatchResult<E extends Env = Env> {\n handler: Handler<E>;\n params: Record<string, string>;\n}\n\n// ============================================================================\n// Router Class\n// ============================================================================\n\nexport class Router<E extends Env = Env> {\n private radix: RadixRouter<RouterNode<E>>;\n private routes: Route<E>[] = [];\n\n constructor() {\n this.radix = createRadixRouter<RouterNode<E>>();\n }\n\n /**\n * Add a route\n */\n add(method: HttpMethod | '*', path: string, handler: Handler<E>): void {\n // Normalize path\n const normalizedPath = this.normalizePath(path);\n\n // Get or create node\n let node = this.radix.lookup(normalizedPath);\n\n if (!node) {\n node = { handlers: new Map() };\n this.radix.insert(normalizedPath, node);\n }\n\n // Add handler for method\n node.handlers.set(method, handler);\n\n // Track route for debugging\n this.routes.push({\n method,\n path: normalizedPath,\n handler,\n middleware: [],\n });\n }\n\n /**\n * Match a request to a route\n */\n match(method: HttpMethod, path: string): MatchResult<E> | null {\n const normalizedPath = this.normalizePath(path);\n const result = this.radix.lookup(normalizedPath);\n\n if (!result) {\n return null;\n }\n\n // Try exact method first\n let handler = result.handlers.get(method);\n\n // Fall back to wildcard\n if (!handler) {\n handler = result.handlers.get('*');\n }\n\n if (!handler) {\n return null;\n }\n\n // radix3 returns params in the result via _params property\n // Also extract from the lookup result directly\n const params: Record<string, string> = (result as any).params || {};\n\n return { handler, params };\n }\n\n /**\n * Get all registered routes\n */\n getRoutes(): Route<E>[] {\n return [...this.routes];\n }\n\n /**\n * Normalize path\n */\n private normalizePath(path: string): string {\n // Ensure leading slash\n if (!path.startsWith('/')) {\n path = '/' + path;\n }\n\n // Remove trailing slash (except for root)\n if (path !== '/' && path.endsWith('/')) {\n path = path.slice(0, -1);\n }\n\n // Convert [param] to :param for radix3\n path = path.replace(/\\[([^\\]]+)\\]/g, ':$1');\n\n // Convert [...slug] to ** for catch-all\n path = path.replace(/\\[\\.\\.\\.([\\w]+)\\]/g, '**');\n\n return path;\n }\n\n /**\n * Extract params from matched path\n * @deprecated radix3 handles param extraction internally\n */\n private _extractParams(pattern: string, actualPath: string): Record<string, string> {\n const params: Record<string, string> = {};\n\n const patternParts = pattern.split('/');\n const actualParts = actualPath.split('/');\n\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n if (!patternPart) continue;\n\n if (patternPart.startsWith(':')) {\n const paramName = patternPart.slice(1);\n params[paramName] = actualParts[i] || '';\n } else if (patternPart === '**') {\n // Catch-all: collect remaining parts\n const paramName = 'slug';\n params[paramName] = actualParts.slice(i).join('/');\n break;\n }\n }\n\n return params;\n }\n}\n","/**\n * @flight-framework/http - Context\n * \n * Request/Response context object passed to handlers.\n * \n * PERFORMANCE OPTIMIZATIONS (2026):\n * - Class-based implementation (methods on prototype, not recreated per request)\n * - Lazy URL parsing (parsed once, cached)\n * - Lazy cookie parsing (parsed once, cached)\n * - Minimal allocations in hot path\n */\n\nimport type { Context, Env } from './types.js';\n\n// ============================================================================\n// Context Implementation (Class-based for performance)\n// ============================================================================\n\n/**\n * High-performance Context implementation.\n * Methods live on the prototype, not recreated per request.\n */\nclass ContextImpl<E extends Env = Env> implements Context<E> {\n // Core properties\n readonly req: Request;\n readonly env: E['Bindings'];\n readonly params: Record<string, string>;\n readonly variables: E['Variables'];\n\n // Cached values (lazy initialization)\n private _url?: URL;\n private _cookies?: Record<string, string>;\n private _variables: Record<string, unknown>;\n\n constructor(\n request: Request,\n params: Record<string, string>,\n env: E['Bindings']\n ) {\n this.req = request;\n this.params = params;\n this.env = env;\n this._variables = {};\n this.variables = this._variables as E['Variables'];\n }\n\n // ========================================================================\n // Cached Getters (Lazy initialization)\n // ========================================================================\n\n /**\n * Get parsed URL (cached after first access)\n */\n get url(): URL {\n return this._url ??= new URL(this.req.url);\n }\n\n /**\n * Get pathname from cached URL\n */\n get pathname(): string {\n return this.url.pathname;\n }\n\n /**\n * Get query string from cached URL\n */\n get query(): URLSearchParams {\n return this.url.searchParams;\n }\n\n // ========================================================================\n // Response Helpers (on prototype, not recreated)\n // ========================================================================\n\n json<T>(data: T, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\n });\n }\n\n text(text: string, status = 200): Response {\n return new Response(text, {\n status,\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n });\n }\n\n html(html: string, status = 200): Response {\n return new Response(html, {\n status,\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\n });\n }\n\n redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 302): Response {\n return new Response(null, {\n status,\n headers: { Location: url },\n });\n }\n\n // ========================================================================\n // Variable Getter/Setter\n // ========================================================================\n\n get<K extends keyof E['Variables']>(key: K): E['Variables'][K] {\n return this._variables[key as string] as E['Variables'][K];\n }\n\n set<K extends keyof E['Variables']>(key: K, value: E['Variables'][K]): void {\n this._variables[key as string] = value;\n }\n\n // ========================================================================\n // Request Helpers\n // ========================================================================\n\n header(name: string): string | null {\n return this.req.headers.get(name);\n }\n\n /**\n * Get cookie value (cookies parsed once, cached)\n */\n cookie(name: string): string | undefined {\n if (!this._cookies) {\n const cookieHeader = this.req.headers.get('cookie');\n this._cookies = cookieHeader ? parseCookies(cookieHeader) : {};\n }\n return this._cookies[name];\n }\n}\n\n// ============================================================================\n// Cookie Parser (optimized)\n// ============================================================================\n\nfunction parseCookies(cookieHeader: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n const pairs = cookieHeader.split(';');\n\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i].trim();\n const eqIdx = pair.indexOf('=');\n if (eqIdx > 0) {\n const name = pair.slice(0, eqIdx);\n const value = pair.slice(eqIdx + 1);\n cookies[name] = value;\n }\n }\n\n return cookies;\n}\n\n// ============================================================================\n// Context Factory (returns class instance)\n// ============================================================================\n\n/**\n * Create a new Context instance.\n * Uses class-based implementation for optimal performance.\n */\nexport function createContext<E extends Env = Env>(\n request: Request,\n params: Record<string, string> = {},\n env: E['Bindings'] = {} as E['Bindings']\n): Context<E> {\n return new ContextImpl<E>(request, params, env);\n}\n\n// Export class for advanced usage/testing\nexport { ContextImpl };\n","/**\n * @flight-framework/http - Server\n * \n * Main server class that implements the FlightHttpServer interface.\n * \n * PERFORMANCE OPTIMIZATIONS (2026):\n * - Middleware chains pre-compiled at route registration (not per-request)\n * - Minimal allocations in fetch() hot path\n * - Uses optimized class-based Context\n */\n\nimport { Router } from './router.js';\nimport { createContext } from './context.js';\nimport type {\n FlightHttpServer,\n Handler,\n Middleware,\n HandlerOrMiddleware,\n HttpMethod,\n Context,\n Env,\n ServerOptions,\n ListenOptions,\n FetchOptions,\n} from './types.js';\n\n// ============================================================================\n// Pre-compiled Middleware Chain\n// ============================================================================\n\n/**\n * Pre-compile middleware chain into a single handler function.\n * This avoids closure creation on every request.\n */\nfunction compileMiddlewareChain<E extends Env>(\n middlewares: Middleware<E>[],\n handler: Handler<E>\n): Handler<E> {\n // No middleware - return handler directly (zero overhead)\n if (middlewares.length === 0) {\n return handler;\n }\n\n // Single middleware - inline optimization\n if (middlewares.length === 1) {\n const mw = middlewares[0];\n return (c: Context<E>) => mw(c, () => Promise.resolve(handler(c)));\n }\n\n // Multiple middlewares - build dispatch chain\n // Pre-build the chain at compile time, not runtime\n return (c: Context<E>) => {\n let index = 0;\n\n const dispatch = (): Promise<Response> => {\n if (index < middlewares.length) {\n const middleware = middlewares[index++];\n return Promise.resolve(middleware(c, dispatch));\n }\n return Promise.resolve(handler(c));\n };\n\n return dispatch();\n };\n}\n\n// ============================================================================\n// Server Class\n// ============================================================================\n\nexport class FlightHttp<E extends Env = Env> implements FlightHttpServer<E> {\n private router: Router<E>;\n private globalMiddleware: Middleware<E>[] = [];\n private notFoundHandler: Handler<E>;\n private errorHandler: (error: Error, c: Context<E>) => Response | Promise<Response>;\n private basePath: string;\n\n // Pre-compiled handlers cache (updated when middleware changes)\n private compiledNotFoundHandler?: Handler<E>;\n private middlewareVersion = 0;\n private lastCompiledVersion = -1;\n\n constructor(options: ServerOptions = {}) {\n this.router = new Router<E>();\n this.basePath = options.basePath || '';\n\n // Default not found handler\n this.notFoundHandler = (c) => c.json(\n { error: 'Not Found', path: c.pathname },\n 404\n );\n\n // Default error handler\n this.errorHandler = (error, c) => c.json(\n { error: error.message || 'Internal Server Error' },\n 500\n );\n }\n\n // ========================================================================\n // Route Registration\n // ========================================================================\n\n get(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\n return this.addRoute('GET', path, handlers);\n }\n\n post(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\n return this.addRoute('POST', path, handlers);\n }\n\n put(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\n return this.addRoute('PUT', path, handlers);\n }\n\n delete(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\n return this.addRoute('DELETE', path, handlers);\n }\n\n patch(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\n return this.addRoute('PATCH', path, handlers);\n }\n\n options(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\n return this.addRoute('OPTIONS', path, handlers);\n }\n\n head(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\n return this.addRoute('HEAD', path, handlers);\n }\n\n all(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\n return this.addRoute('*', path, handlers);\n }\n\n // ========================================================================\n // Middleware\n // ========================================================================\n\n use(...handlers: Middleware<E>[]): FlightHttpServer<E> {\n this.globalMiddleware.push(...handlers);\n // Invalidate pre-compiled handlers\n this.middlewareVersion++;\n return this;\n }\n\n // ========================================================================\n // Sub-routing\n // ========================================================================\n\n route(path: string, router: FlightHttpServer<E>): FlightHttpServer<E> {\n if (router instanceof FlightHttp) {\n const routes = router.router.getRoutes();\n for (const route of routes) {\n const fullPath = this.basePath + path + route.path;\n this.router.add(route.method, fullPath, route.handler);\n }\n }\n return this;\n }\n\n // ========================================================================\n // Error Handling\n // ========================================================================\n\n notFound(handler: Handler<E>): FlightHttpServer<E> {\n this.notFoundHandler = handler;\n // Invalidate cached compiled handler\n this.compiledNotFoundHandler = undefined;\n return this;\n }\n\n onError(handler: (error: Error, c: Context<E>) => Response | Promise<Response>): FlightHttpServer<E> {\n this.errorHandler = handler;\n return this;\n }\n\n // ========================================================================\n // Core Fetch Handler (Optimized Hot Path)\n // ========================================================================\n\n async fetch(request: Request, options: FetchOptions = {}): Promise<Response> {\n // Fast path parsing - avoid new URL() here, let context handle it lazily\n const url = request.url;\n const pathStart = url.indexOf('/', url.indexOf('//') + 2);\n const queryStart = url.indexOf('?', pathStart);\n const path = queryStart === -1\n ? url.slice(pathStart)\n : url.slice(pathStart, queryStart);\n\n const method = request.method as HttpMethod;\n\n // Match route\n const match = this.router.match(method, path);\n\n // Create context (class-based, minimal allocations)\n const context = createContext<E>(\n request,\n match?.params || {},\n (options.env || {}) as E['Bindings']\n );\n\n try {\n if (match) {\n // Route found - execute with global middleware\n if (this.globalMiddleware.length === 0) {\n // No global middleware - direct handler call (fastest path)\n return await match.handler(context);\n } else {\n // Compile middleware chain\n const composed = compileMiddlewareChain(\n this.globalMiddleware,\n match.handler\n );\n return await composed(context);\n }\n } else {\n // No route found - execute not found handler\n return await this.getCompiledNotFoundHandler()(context);\n }\n } catch (error) {\n console.error('[Flight HTTP] Error:', error);\n return await this.errorHandler(\n error instanceof Error ? error : new Error(String(error)),\n context\n );\n }\n }\n\n // ========================================================================\n // Listen (Node.js adapter will override this)\n // ========================================================================\n\n listen(options?: ListenOptions | number): void {\n const port = typeof options === 'number' ? options : options?.port || 3000;\n console.log(`[Flight HTTP] Call adapter-specific listen() to start server on port ${port}`);\n console.log('[Flight HTTP] Import from \"@flight-framework/http/node\" or \"@flight-framework/http/bun\"');\n }\n\n // ========================================================================\n // Private Methods\n // ========================================================================\n\n private addRoute(\n method: HttpMethod | '*',\n path: string,\n handlers: HandlerOrMiddleware<E>[]\n ): FlightHttpServer<E> {\n // Last handler is the main handler\n const mainHandler = handlers[handlers.length - 1] as Handler<E>;\n const routeMiddleware = handlers.slice(0, -1) as Middleware<E>[];\n\n const fullPath = this.basePath + path;\n\n // Pre-compile route-specific middleware at registration time\n const compiledHandler = routeMiddleware.length > 0\n ? compileMiddlewareChain(routeMiddleware, mainHandler)\n : mainHandler;\n\n this.router.add(method, fullPath, compiledHandler);\n\n return this;\n }\n\n /**\n * Get pre-compiled not found handler (with global middleware)\n */\n private getCompiledNotFoundHandler(): Handler<E> {\n // Recompile if middleware changed\n if (this.lastCompiledVersion !== this.middlewareVersion || !this.compiledNotFoundHandler) {\n this.compiledNotFoundHandler = this.globalMiddleware.length > 0\n ? compileMiddlewareChain(this.globalMiddleware, this.notFoundHandler)\n : this.notFoundHandler;\n this.lastCompiledVersion = this.middlewareVersion;\n }\n return this.compiledNotFoundHandler;\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a new Flight HTTP server\n * \n * @example\n * ```typescript\n * import { createServer } from '@flight-framework/http';\n * \n * const app = createServer();\n * \n * app.get('/', (c) => c.json({ message: 'Hello Flight!' }));\n * \n * export default app;\n * ```\n */\nexport function createServer<E extends Env = Env>(\n options: ServerOptions = {}\n): FlightHttpServer<E> {\n return new FlightHttp<E>(options);\n}\n"]}
1
+ {"version":3,"sources":["../src/router.ts","../src/context.ts","../src/server.ts"],"names":["createRadixRouter"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * @flight-framework/http - Router\r\n * \r\n * Radix-tree based router for ultra-fast path matching.\r\n * Uses radix3 under the hood.\r\n */\r\n\r\nimport { createRouter as createRadixRouter, type RadixRouter } from 'radix3';\r\nimport type { Handler, HttpMethod, Route, Env } from './types.js';\r\n\r\n// ============================================================================\r\n// Router Types\r\n// ============================================================================\r\n\r\ninterface RouterNode<E extends Env = Env> {\r\n handlers: Map<HttpMethod | '*', Handler<E>>;\r\n}\r\n\r\ninterface MatchResult<E extends Env = Env> {\r\n handler: Handler<E>;\r\n params: Record<string, string>;\r\n}\r\n\r\n// ============================================================================\r\n// Router Class\r\n// ============================================================================\r\n\r\nexport class Router<E extends Env = Env> {\r\n private radix: RadixRouter<RouterNode<E>>;\r\n private routes: Route<E>[] = [];\r\n\r\n constructor() {\r\n this.radix = createRadixRouter<RouterNode<E>>();\r\n }\r\n\r\n /**\r\n * Add a route\r\n */\r\n add(method: HttpMethod | '*', path: string, handler: Handler<E>): void {\r\n // Normalize path\r\n const normalizedPath = this.normalizePath(path);\r\n\r\n // Get or create node\r\n let node = this.radix.lookup(normalizedPath);\r\n\r\n if (!node) {\r\n node = { handlers: new Map() };\r\n this.radix.insert(normalizedPath, node);\r\n }\r\n\r\n // Add handler for method\r\n node.handlers.set(method, handler);\r\n\r\n // Track route for debugging\r\n this.routes.push({\r\n method,\r\n path: normalizedPath,\r\n handler,\r\n middleware: [],\r\n });\r\n }\r\n\r\n /**\r\n * Match a request to a route\r\n */\r\n match(method: HttpMethod, path: string): MatchResult<E> | null {\r\n const normalizedPath = this.normalizePath(path);\r\n const result = this.radix.lookup(normalizedPath);\r\n\r\n if (!result) {\r\n return null;\r\n }\r\n\r\n // Try exact method first\r\n let handler = result.handlers.get(method);\r\n\r\n // Fall back to wildcard\r\n if (!handler) {\r\n handler = result.handlers.get('*');\r\n }\r\n\r\n if (!handler) {\r\n return null;\r\n }\r\n\r\n // radix3 returns params in the result via _params property\r\n // Also extract from the lookup result directly\r\n const params: Record<string, string> = (result as any).params || {};\r\n\r\n return { handler, params };\r\n }\r\n\r\n /**\r\n * Get all registered routes\r\n */\r\n getRoutes(): Route<E>[] {\r\n return [...this.routes];\r\n }\r\n\r\n /**\r\n * Normalize path\r\n */\r\n private normalizePath(path: string): string {\r\n // Ensure leading slash\r\n if (!path.startsWith('/')) {\r\n path = '/' + path;\r\n }\r\n\r\n // Remove trailing slash (except for root)\r\n if (path !== '/' && path.endsWith('/')) {\r\n path = path.slice(0, -1);\r\n }\r\n\r\n // Convert [param] to :param for radix3\r\n path = path.replace(/\\[([^\\]]+)\\]/g, ':$1');\r\n\r\n // Convert [...slug] to ** for catch-all\r\n path = path.replace(/\\[\\.\\.\\.([\\w]+)\\]/g, '**');\r\n\r\n return path;\r\n }\r\n\r\n /**\r\n * Extract params from matched path\r\n * @deprecated radix3 handles param extraction internally\r\n */\r\n private _extractParams(pattern: string, actualPath: string): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n\r\n const patternParts = pattern.split('/');\r\n const actualParts = actualPath.split('/');\r\n\r\n for (let i = 0; i < patternParts.length; i++) {\r\n const patternPart = patternParts[i];\r\n if (!patternPart) continue;\r\n\r\n if (patternPart.startsWith(':')) {\r\n const paramName = patternPart.slice(1);\r\n params[paramName] = actualParts[i] || '';\r\n } else if (patternPart === '**') {\r\n // Catch-all: collect remaining parts\r\n const paramName = 'slug';\r\n params[paramName] = actualParts.slice(i).join('/');\r\n break;\r\n }\r\n }\r\n\r\n return params;\r\n }\r\n}\r\n","/**\r\n * @flight-framework/http - Context\r\n * \r\n * Request/Response context object passed to handlers.\r\n * \r\n * PERFORMANCE OPTIMIZATIONS (2026):\r\n * - Class-based implementation (methods on prototype, not recreated per request)\r\n * - Lazy URL parsing (parsed once, cached)\r\n * - Lazy cookie parsing (parsed once, cached)\r\n * - Minimal allocations in hot path\r\n */\r\n\r\nimport type { Context, Env } from './types.js';\r\n\r\n// ============================================================================\r\n// Context Implementation (Class-based for performance)\r\n// ============================================================================\r\n\r\n/**\r\n * High-performance Context implementation.\r\n * Methods live on the prototype, not recreated per request.\r\n */\r\nclass ContextImpl<E extends Env = Env> implements Context<E> {\r\n // Core properties\r\n readonly req: Request;\r\n readonly env: E['Bindings'];\r\n readonly params: Record<string, string>;\r\n readonly variables: E['Variables'];\r\n\r\n // Cached values (lazy initialization)\r\n private _url?: URL;\r\n private _cookies?: Record<string, string>;\r\n private _variables: Record<string, unknown>;\r\n\r\n constructor(\r\n request: Request,\r\n params: Record<string, string>,\r\n env: E['Bindings']\r\n ) {\r\n this.req = request;\r\n this.params = params;\r\n this.env = env;\r\n this._variables = {};\r\n this.variables = this._variables as E['Variables'];\r\n }\r\n\r\n // ========================================================================\r\n // Cached Getters (Lazy initialization)\r\n // ========================================================================\r\n\r\n /**\r\n * Get parsed URL (cached after first access)\r\n */\r\n get url(): URL {\r\n return this._url ??= new URL(this.req.url);\r\n }\r\n\r\n /**\r\n * Get pathname from cached URL\r\n */\r\n get pathname(): string {\r\n return this.url.pathname;\r\n }\r\n\r\n /**\r\n * Get query string from cached URL\r\n */\r\n get query(): URLSearchParams {\r\n return this.url.searchParams;\r\n }\r\n\r\n // ========================================================================\r\n // Response Helpers (on prototype, not recreated)\r\n // ========================================================================\r\n\r\n json<T>(data: T, status = 200): Response {\r\n return new Response(JSON.stringify(data), {\r\n status,\r\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\r\n });\r\n }\r\n\r\n text(text: string, status = 200): Response {\r\n return new Response(text, {\r\n status,\r\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\r\n });\r\n }\r\n\r\n html(html: string, status = 200): Response {\r\n return new Response(html, {\r\n status,\r\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\r\n });\r\n }\r\n\r\n redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 302): Response {\r\n return new Response(null, {\r\n status,\r\n headers: { Location: url },\r\n });\r\n }\r\n\r\n // ========================================================================\r\n // Variable Getter/Setter\r\n // ========================================================================\r\n\r\n get<K extends keyof E['Variables']>(key: K): E['Variables'][K] {\r\n return this._variables[key as string] as E['Variables'][K];\r\n }\r\n\r\n set<K extends keyof E['Variables']>(key: K, value: E['Variables'][K]): void {\r\n this._variables[key as string] = value;\r\n }\r\n\r\n // ========================================================================\r\n // Request Helpers\r\n // ========================================================================\r\n\r\n header(name: string): string | null {\r\n return this.req.headers.get(name);\r\n }\r\n\r\n /**\r\n * Get cookie value (cookies parsed once, cached)\r\n */\r\n cookie(name: string): string | undefined {\r\n if (!this._cookies) {\r\n const cookieHeader = this.req.headers.get('cookie');\r\n this._cookies = cookieHeader ? parseCookies(cookieHeader) : {};\r\n }\r\n return this._cookies[name];\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Cookie Parser (optimized)\r\n// ============================================================================\r\n\r\nfunction parseCookies(cookieHeader: string): Record<string, string> {\r\n const cookies: Record<string, string> = {};\r\n const pairs = cookieHeader.split(';');\r\n\r\n for (let i = 0; i < pairs.length; i++) {\r\n const pair = pairs[i].trim();\r\n const eqIdx = pair.indexOf('=');\r\n if (eqIdx > 0) {\r\n const name = pair.slice(0, eqIdx);\r\n const value = pair.slice(eqIdx + 1);\r\n cookies[name] = value;\r\n }\r\n }\r\n\r\n return cookies;\r\n}\r\n\r\n// ============================================================================\r\n// Context Factory (returns class instance)\r\n// ============================================================================\r\n\r\n/**\r\n * Create a new Context instance.\r\n * Uses class-based implementation for optimal performance.\r\n */\r\nexport function createContext<E extends Env = Env>(\r\n request: Request,\r\n params: Record<string, string> = {},\r\n env: E['Bindings'] = {} as E['Bindings']\r\n): Context<E> {\r\n return new ContextImpl<E>(request, params, env);\r\n}\r\n\r\n// Export class for advanced usage/testing\r\nexport { ContextImpl };\r\n","/**\r\n * @flight-framework/http - Server\r\n * \r\n * Main server class that implements the FlightHttpServer interface.\r\n * \r\n * PERFORMANCE OPTIMIZATIONS (2026):\r\n * - Middleware chains pre-compiled at route registration (not per-request)\r\n * - Minimal allocations in fetch() hot path\r\n * - Uses optimized class-based Context\r\n */\r\n\r\nimport { Router } from './router.js';\r\nimport { createContext } from './context.js';\r\nimport type {\r\n FlightHttpServer,\r\n Handler,\r\n Middleware,\r\n HandlerOrMiddleware,\r\n HttpMethod,\r\n Context,\r\n Env,\r\n ServerOptions,\r\n ListenOptions,\r\n FetchOptions,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Pre-compiled Middleware Chain\r\n// ============================================================================\r\n\r\n/**\r\n * Pre-compile middleware chain into a single handler function.\r\n * This avoids closure creation on every request.\r\n */\r\nfunction compileMiddlewareChain<E extends Env>(\r\n middlewares: Middleware<E>[],\r\n handler: Handler<E>\r\n): Handler<E> {\r\n // No middleware - return handler directly (zero overhead)\r\n if (middlewares.length === 0) {\r\n return handler;\r\n }\r\n\r\n // Single middleware - inline optimization\r\n if (middlewares.length === 1) {\r\n const mw = middlewares[0];\r\n return (c: Context<E>) => mw(c, () => Promise.resolve(handler(c)));\r\n }\r\n\r\n // Multiple middlewares - build dispatch chain\r\n // Pre-build the chain at compile time, not runtime\r\n return (c: Context<E>) => {\r\n let index = 0;\r\n\r\n const dispatch = (): Promise<Response> => {\r\n if (index < middlewares.length) {\r\n const middleware = middlewares[index++];\r\n return Promise.resolve(middleware(c, dispatch));\r\n }\r\n return Promise.resolve(handler(c));\r\n };\r\n\r\n return dispatch();\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Server Class\r\n// ============================================================================\r\n\r\nexport class FlightHttp<E extends Env = Env> implements FlightHttpServer<E> {\r\n private router: Router<E>;\r\n private globalMiddleware: Middleware<E>[] = [];\r\n private notFoundHandler: Handler<E>;\r\n private errorHandler: (error: Error, c: Context<E>) => Response | Promise<Response>;\r\n private basePath: string;\r\n\r\n // Pre-compiled handlers cache (updated when middleware changes)\r\n private compiledNotFoundHandler?: Handler<E>;\r\n private middlewareVersion = 0;\r\n private lastCompiledVersion = -1;\r\n\r\n constructor(options: ServerOptions = {}) {\r\n this.router = new Router<E>();\r\n this.basePath = options.basePath || '';\r\n\r\n // Default not found handler\r\n this.notFoundHandler = (c) => c.json(\r\n { error: 'Not Found', path: c.pathname },\r\n 404\r\n );\r\n\r\n // Default error handler\r\n this.errorHandler = (error, c) => c.json(\r\n { error: error.message || 'Internal Server Error' },\r\n 500\r\n );\r\n }\r\n\r\n // ========================================================================\r\n // Route Registration\r\n // ========================================================================\r\n\r\n get(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('GET', path, handlers);\r\n }\r\n\r\n post(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('POST', path, handlers);\r\n }\r\n\r\n put(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('PUT', path, handlers);\r\n }\r\n\r\n delete(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('DELETE', path, handlers);\r\n }\r\n\r\n patch(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('PATCH', path, handlers);\r\n }\r\n\r\n options(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('OPTIONS', path, handlers);\r\n }\r\n\r\n head(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('HEAD', path, handlers);\r\n }\r\n\r\n all(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('*', path, handlers);\r\n }\r\n\r\n // ========================================================================\r\n // Middleware\r\n // ========================================================================\r\n\r\n use(...handlers: Middleware<E>[]): FlightHttpServer<E> {\r\n this.globalMiddleware.push(...handlers);\r\n // Invalidate pre-compiled handlers\r\n this.middlewareVersion++;\r\n return this;\r\n }\r\n\r\n // ========================================================================\r\n // Sub-routing\r\n // ========================================================================\r\n\r\n route(path: string, router: FlightHttpServer<E>): FlightHttpServer<E> {\r\n if (router instanceof FlightHttp) {\r\n const routes = router.router.getRoutes();\r\n for (const route of routes) {\r\n const fullPath = this.basePath + path + route.path;\r\n this.router.add(route.method, fullPath, route.handler);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n // ========================================================================\r\n // Error Handling\r\n // ========================================================================\r\n\r\n notFound(handler: Handler<E>): FlightHttpServer<E> {\r\n this.notFoundHandler = handler;\r\n // Invalidate cached compiled handler\r\n this.compiledNotFoundHandler = undefined;\r\n return this;\r\n }\r\n\r\n onError(handler: (error: Error, c: Context<E>) => Response | Promise<Response>): FlightHttpServer<E> {\r\n this.errorHandler = handler;\r\n return this;\r\n }\r\n\r\n // ========================================================================\r\n // Core Fetch Handler (Optimized Hot Path)\r\n // ========================================================================\r\n\r\n async fetch(request: Request, options: FetchOptions = {}): Promise<Response> {\r\n // Fast path parsing - avoid new URL() here, let context handle it lazily\r\n const url = request.url;\r\n const pathStart = url.indexOf('/', url.indexOf('//') + 2);\r\n const queryStart = url.indexOf('?', pathStart);\r\n const path = queryStart === -1\r\n ? url.slice(pathStart)\r\n : url.slice(pathStart, queryStart);\r\n\r\n const method = request.method as HttpMethod;\r\n\r\n // Match route\r\n const match = this.router.match(method, path);\r\n\r\n // Create context (class-based, minimal allocations)\r\n const context = createContext<E>(\r\n request,\r\n match?.params || {},\r\n (options.env || {}) as E['Bindings']\r\n );\r\n\r\n try {\r\n if (match) {\r\n // Route found - execute with global middleware\r\n if (this.globalMiddleware.length === 0) {\r\n // No global middleware - direct handler call (fastest path)\r\n return await match.handler(context);\r\n } else {\r\n // Compile middleware chain\r\n const composed = compileMiddlewareChain(\r\n this.globalMiddleware,\r\n match.handler\r\n );\r\n return await composed(context);\r\n }\r\n } else {\r\n // No route found - execute not found handler\r\n return await this.getCompiledNotFoundHandler()(context);\r\n }\r\n } catch (error) {\r\n console.error('[Flight HTTP] Error:', error);\r\n return await this.errorHandler(\r\n error instanceof Error ? error : new Error(String(error)),\r\n context\r\n );\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // Listen (Node.js adapter will override this)\r\n // ========================================================================\r\n\r\n listen(options?: ListenOptions | number): void {\r\n const port = typeof options === 'number' ? options : options?.port || 3000;\r\n console.log(`[Flight HTTP] Call adapter-specific listen() to start server on port ${port}`);\r\n console.log('[Flight HTTP] Import from \"@flight-framework/http/node\" or \"@flight-framework/http/bun\"');\r\n }\r\n\r\n // ========================================================================\r\n // Private Methods\r\n // ========================================================================\r\n\r\n private addRoute(\r\n method: HttpMethod | '*',\r\n path: string,\r\n handlers: HandlerOrMiddleware<E>[]\r\n ): FlightHttpServer<E> {\r\n // Last handler is the main handler\r\n const mainHandler = handlers[handlers.length - 1] as Handler<E>;\r\n const routeMiddleware = handlers.slice(0, -1) as Middleware<E>[];\r\n\r\n const fullPath = this.basePath + path;\r\n\r\n // Pre-compile route-specific middleware at registration time\r\n const compiledHandler = routeMiddleware.length > 0\r\n ? compileMiddlewareChain(routeMiddleware, mainHandler)\r\n : mainHandler;\r\n\r\n this.router.add(method, fullPath, compiledHandler);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get pre-compiled not found handler (with global middleware)\r\n */\r\n private getCompiledNotFoundHandler(): Handler<E> {\r\n // Recompile if middleware changed\r\n if (this.lastCompiledVersion !== this.middlewareVersion || !this.compiledNotFoundHandler) {\r\n this.compiledNotFoundHandler = this.globalMiddleware.length > 0\r\n ? compileMiddlewareChain(this.globalMiddleware, this.notFoundHandler)\r\n : this.notFoundHandler;\r\n this.lastCompiledVersion = this.middlewareVersion;\r\n }\r\n return this.compiledNotFoundHandler;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Factory Function\r\n// ============================================================================\r\n\r\n/**\r\n * Create a new Flight HTTP server\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight-framework/http';\r\n * \r\n * const app = createServer();\r\n * \r\n * app.get('/', (c) => c.json({ message: 'Hello Flight!' }));\r\n * \r\n * export default app;\r\n * ```\r\n */\r\nexport function createServer<E extends Env = Env>(\r\n options: ServerOptions = {}\r\n): FlightHttpServer<E> {\r\n return new FlightHttp<E>(options);\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,57 +1,57 @@
1
- {
2
- "name": "@flight-framework/http",
3
- "version": "0.0.3",
4
- "description": "Ultra-fast HTTP server for Flight Framework - Built on Web Standards",
5
- "keywords": [
6
- "flight",
7
- "http",
8
- "server",
9
- "web-standards",
10
- "edge"
11
- ],
12
- "license": "MIT",
13
- "author": "Flight Contributors",
14
- "type": "module",
15
- "exports": {
16
- ".": {
17
- "types": "./dist/index.d.ts",
18
- "import": "./dist/index.js"
19
- },
20
- "./node": {
21
- "types": "./dist/adapters/node.d.ts",
22
- "import": "./dist/adapters/node.js"
23
- },
24
- "./bun": {
25
- "types": "./dist/adapters/bun.d.ts",
26
- "import": "./dist/adapters/bun.js"
27
- },
28
- "./deno": {
29
- "types": "./dist/adapters/deno.d.ts",
30
- "import": "./dist/adapters/deno.js"
31
- }
32
- },
33
- "main": "./dist/index.js",
34
- "types": "./dist/index.d.ts",
35
- "files": [
36
- "dist"
37
- ],
38
- "dependencies": {
39
- "radix3": "^1.1.0"
40
- },
41
- "devDependencies": {
42
- "@types/node": "^22.0.0",
43
- "rimraf": "^6.0.0",
44
- "tsup": "^8.0.0",
45
- "typescript": "^5.7.0",
46
- "vitest": "^2.0.0"
47
- },
48
- "scripts": {
49
- "build": "tsup",
50
- "dev": "tsup --watch",
51
- "test": "vitest run",
52
- "test:watch": "vitest",
53
- "lint": "eslint src/",
54
- "clean": "rimraf dist",
55
- "typecheck": "tsc --noEmit"
56
- }
57
- }
1
+ {
2
+ "name": "@flight-framework/http",
3
+ "version": "0.0.4",
4
+ "description": "Ultra-fast HTTP server for Flight Framework - Built on Web Standards",
5
+ "keywords": [
6
+ "flight",
7
+ "http",
8
+ "server",
9
+ "web-standards",
10
+ "edge"
11
+ ],
12
+ "license": "MIT",
13
+ "author": "Flight Contributors",
14
+ "type": "module",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./node": {
21
+ "types": "./dist/adapters/node.d.ts",
22
+ "import": "./dist/adapters/node.js"
23
+ },
24
+ "./bun": {
25
+ "types": "./dist/adapters/bun.d.ts",
26
+ "import": "./dist/adapters/bun.js"
27
+ },
28
+ "./deno": {
29
+ "types": "./dist/adapters/deno.d.ts",
30
+ "import": "./dist/adapters/deno.js"
31
+ }
32
+ },
33
+ "main": "./dist/index.js",
34
+ "types": "./dist/index.d.ts",
35
+ "files": [
36
+ "dist"
37
+ ],
38
+ "scripts": {
39
+ "build": "tsup",
40
+ "dev": "tsup --watch",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest",
43
+ "lint": "eslint src/",
44
+ "clean": "rimraf dist",
45
+ "typecheck": "tsc --noEmit"
46
+ },
47
+ "dependencies": {
48
+ "radix3": "^1.1.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^22.0.0",
52
+ "rimraf": "^6.0.0",
53
+ "tsup": "^8.0.0",
54
+ "typescript": "^5.7.0",
55
+ "vitest": "^2.0.0"
56
+ }
57
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2024-2026 Flight Contributors
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.