@minejs/server 0.0.2 → 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 +40 -6
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +332 -0
- package/dist/index.d.ts +332 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +8 -7
- package/dist/main.cjs +0 -3
- package/dist/main.cjs.map +0 -1
- package/dist/main.d.cts +0 -511
- package/dist/main.d.ts +0 -511
- package/dist/main.js +0 -3
- package/dist/main.js.map +0 -1
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { DB } from '@minejs/db';
|
|
2
|
+
export { ColumnDefinition, ColumnType, DB, QueryBuilder, SqlValue, TableSchema, WhereCondition, blob, column, defaultValue, index, integer, notNull, numeric, primaryKey, real, references, table, text, unique } from '@minejs/db';
|
|
3
|
+
import { I18nManager, I18nConfig } from '@minejs/i18n';
|
|
4
|
+
export { I18nConfig, I18nManager, LazyLoader, TranslationSet, TranslationToken, fetchTranslations, getI18n, getLanguage, getSupportedLanguages, loadLanguage, loadTranslations, setLanguage, setupAuto, setupI18n, setupLazy, t, tLang, tParse } from '@minejs/i18n';
|
|
5
|
+
|
|
6
|
+
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD';
|
|
7
|
+
type RouteHandler$1 = (c: AppContext) => Response | Promise<Response>;
|
|
8
|
+
type AppMiddleware = (c: AppContext, next: () => Promise<void>) => void | Promise<void>;
|
|
9
|
+
interface AppContext {
|
|
10
|
+
ip: string;
|
|
11
|
+
request: Request;
|
|
12
|
+
params: Record<string, string>;
|
|
13
|
+
query: Record<string, string>;
|
|
14
|
+
body: any;
|
|
15
|
+
headers: Headers;
|
|
16
|
+
db: DB | undefined;
|
|
17
|
+
logger: Logger$1 | null;
|
|
18
|
+
i18n: I18nManager | null;
|
|
19
|
+
lang?: string;
|
|
20
|
+
user?: unknown;
|
|
21
|
+
requestId: string;
|
|
22
|
+
state: Record<string, unknown>;
|
|
23
|
+
json(data: unknown, status?: number): Response;
|
|
24
|
+
text(data: string, status?: number): Response;
|
|
25
|
+
html(data: string, status?: number): Response;
|
|
26
|
+
redirect(url: string, status?: number): Response;
|
|
27
|
+
file(path: string, contentType?: string): Response;
|
|
28
|
+
setCookie(name: string, value: string, options?: CookieOptions): AppContext;
|
|
29
|
+
getCookie(name: string): string | undefined;
|
|
30
|
+
deleteCookie(name: string, options?: Partial<CookieOptions>): AppContext;
|
|
31
|
+
setHeader(key: string, value: string): AppContext;
|
|
32
|
+
getHeader(key: string): string | undefined;
|
|
33
|
+
status(code: number): AppContext;
|
|
34
|
+
statusCode: number;
|
|
35
|
+
_setCookieHeaders(): Record<string, string | string[]>;
|
|
36
|
+
}
|
|
37
|
+
interface StaticConfig$1 {
|
|
38
|
+
path: string;
|
|
39
|
+
directory: string;
|
|
40
|
+
maxAge?: number;
|
|
41
|
+
index?: string[];
|
|
42
|
+
dotfiles?: 'allow' | 'deny' | 'ignore';
|
|
43
|
+
etag?: boolean;
|
|
44
|
+
lastModified?: boolean;
|
|
45
|
+
immutable?: boolean;
|
|
46
|
+
extensions?: string[];
|
|
47
|
+
fallthrough?: boolean;
|
|
48
|
+
setHeaders?: (ctx: AppContext, path: string) => void;
|
|
49
|
+
}
|
|
50
|
+
interface CookieOptions {
|
|
51
|
+
maxAge?: number;
|
|
52
|
+
expires?: Date;
|
|
53
|
+
path?: string;
|
|
54
|
+
domain?: string;
|
|
55
|
+
secure?: boolean;
|
|
56
|
+
httpOnly?: boolean;
|
|
57
|
+
sameSite?: 'Strict' | 'Lax' | 'None';
|
|
58
|
+
}
|
|
59
|
+
interface ValidationSchema {
|
|
60
|
+
body?: unknown;
|
|
61
|
+
query?: unknown;
|
|
62
|
+
params?: unknown;
|
|
63
|
+
}
|
|
64
|
+
interface RouteDefinition {
|
|
65
|
+
method: HttpMethod | HttpMethod[];
|
|
66
|
+
path: string;
|
|
67
|
+
handler: RouteHandler$1;
|
|
68
|
+
validate?: ValidationSchema;
|
|
69
|
+
middlewares?: AppMiddleware[];
|
|
70
|
+
timeout?: number;
|
|
71
|
+
rateLimit?: {
|
|
72
|
+
max: number;
|
|
73
|
+
windowMs: number;
|
|
74
|
+
};
|
|
75
|
+
cache?: number;
|
|
76
|
+
tags?: string[];
|
|
77
|
+
}
|
|
78
|
+
interface DatabaseConfig {
|
|
79
|
+
name?: string;
|
|
80
|
+
connection: string;
|
|
81
|
+
schema?: Record<string, unknown>;
|
|
82
|
+
timeout?: number;
|
|
83
|
+
}
|
|
84
|
+
interface SecurityConfig {
|
|
85
|
+
cors?: boolean | CorsConfig;
|
|
86
|
+
rateLimit?: boolean | RateLimitConfig;
|
|
87
|
+
csrf?: boolean | CsrfConfig;
|
|
88
|
+
helmet?: boolean | HelmetConfig;
|
|
89
|
+
auth?: boolean | AuthConfig;
|
|
90
|
+
validation?: boolean;
|
|
91
|
+
sanitize?: boolean;
|
|
92
|
+
}
|
|
93
|
+
interface CorsConfig {
|
|
94
|
+
origin?: string | string[] | ((origin: string) => boolean);
|
|
95
|
+
methods?: HttpMethod[];
|
|
96
|
+
allowedHeaders?: string[];
|
|
97
|
+
credentials?: boolean;
|
|
98
|
+
maxAge?: number;
|
|
99
|
+
}
|
|
100
|
+
interface RateLimitConfig {
|
|
101
|
+
windowMs?: number;
|
|
102
|
+
max?: number;
|
|
103
|
+
keyGenerator?: (c: AppContext) => string;
|
|
104
|
+
message?: string;
|
|
105
|
+
}
|
|
106
|
+
interface CsrfConfig {
|
|
107
|
+
secret?: string;
|
|
108
|
+
headerName?: string;
|
|
109
|
+
tokenTTL?: number;
|
|
110
|
+
}
|
|
111
|
+
interface HelmetConfig {
|
|
112
|
+
contentSecurityPolicy?: Record<string, string[]> | boolean;
|
|
113
|
+
hsts?: boolean | {
|
|
114
|
+
maxAge?: number;
|
|
115
|
+
includeSubDomains?: boolean;
|
|
116
|
+
preload?: boolean;
|
|
117
|
+
};
|
|
118
|
+
frameguard?: boolean | {
|
|
119
|
+
action: 'deny' | 'sameorigin';
|
|
120
|
+
};
|
|
121
|
+
noSniff?: boolean;
|
|
122
|
+
xssFilter?: boolean;
|
|
123
|
+
referrerPolicy?: string | boolean;
|
|
124
|
+
}
|
|
125
|
+
interface AuthConfig {
|
|
126
|
+
jwt?: boolean | {
|
|
127
|
+
secret: string;
|
|
128
|
+
expiresIn?: string;
|
|
129
|
+
};
|
|
130
|
+
apiKey?: boolean | {
|
|
131
|
+
header?: string;
|
|
132
|
+
};
|
|
133
|
+
bearer?: boolean;
|
|
134
|
+
}
|
|
135
|
+
type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
136
|
+
interface LoggingConfig {
|
|
137
|
+
level?: LogLevel;
|
|
138
|
+
pretty?: boolean;
|
|
139
|
+
}
|
|
140
|
+
interface ServerConfig {
|
|
141
|
+
port?: number | string;
|
|
142
|
+
hostname?: string;
|
|
143
|
+
requestTimeout?: number;
|
|
144
|
+
maxRequestSize?: number;
|
|
145
|
+
maxJsonSize?: number;
|
|
146
|
+
database?: DatabaseConfig | DatabaseConfig[];
|
|
147
|
+
security?: boolean | SecurityConfig;
|
|
148
|
+
compression?: boolean | {
|
|
149
|
+
threshold?: number;
|
|
150
|
+
};
|
|
151
|
+
logging?: boolean | LoggingConfig;
|
|
152
|
+
i18n?: boolean | I18nConfig;
|
|
153
|
+
static?: StaticConfig$1 | StaticConfig$1[];
|
|
154
|
+
routes?: RouteDefinition[];
|
|
155
|
+
middlewares?: AppMiddleware[];
|
|
156
|
+
errorHandler?: (error: Error, context: AppContext) => void | Promise<void>;
|
|
157
|
+
onError?: (statusCode: number, path: string, method: string) => Response | Promise<Response>;
|
|
158
|
+
onStartup?: (app: any) => void | Promise<void>;
|
|
159
|
+
onReady?: (app: ServerInstance, db: Map<string, DB>) => void | Promise<void>;
|
|
160
|
+
onShutdown?: () => void | Promise<void>;
|
|
161
|
+
apiPrefix?: string;
|
|
162
|
+
apiVersion?: string;
|
|
163
|
+
gracefulShutdownTimeout?: number;
|
|
164
|
+
}
|
|
165
|
+
interface ServerInstance {
|
|
166
|
+
app: unknown;
|
|
167
|
+
logger: Logger$1 | null;
|
|
168
|
+
db: Map<string, unknown>;
|
|
169
|
+
bunServer: unknown;
|
|
170
|
+
start: () => Promise<void>;
|
|
171
|
+
stop: () => Promise<void>;
|
|
172
|
+
addRoute: (route: RouteDefinition) => void;
|
|
173
|
+
addRoutes: (routes: RouteDefinition[]) => void;
|
|
174
|
+
getRoutes: () => RouteDefinition[];
|
|
175
|
+
}
|
|
176
|
+
interface Logger$1 {
|
|
177
|
+
debug(data: unknown, msg?: string): void;
|
|
178
|
+
info(data: unknown, msg?: string): void;
|
|
179
|
+
warn(data: unknown, msg?: string): void;
|
|
180
|
+
error(data: unknown, msg?: string): void;
|
|
181
|
+
fatal(data: unknown, msg?: string): void;
|
|
182
|
+
}
|
|
183
|
+
declare class AppError extends Error {
|
|
184
|
+
message: string;
|
|
185
|
+
statusCode: number;
|
|
186
|
+
code?: string | undefined;
|
|
187
|
+
constructor(message: string, statusCode?: number, code?: string | undefined);
|
|
188
|
+
}
|
|
189
|
+
declare class ValidationError extends AppError {
|
|
190
|
+
issues?: unknown | undefined;
|
|
191
|
+
constructor(message: string, issues?: unknown | undefined);
|
|
192
|
+
}
|
|
193
|
+
declare class DatabaseError extends AppError {
|
|
194
|
+
constructor(message: string);
|
|
195
|
+
}
|
|
196
|
+
declare class TimeoutError extends AppError {
|
|
197
|
+
constructor(message?: string);
|
|
198
|
+
}
|
|
199
|
+
declare class RateLimitError extends AppError {
|
|
200
|
+
constructor(message?: string);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
type RouteHandler = (ctx: AppContext) => Response | Promise<Response>;
|
|
204
|
+
interface RouteMatch {
|
|
205
|
+
handler: RouteHandler;
|
|
206
|
+
params: Record<string, string>;
|
|
207
|
+
metadata?: unknown;
|
|
208
|
+
}
|
|
209
|
+
interface RouteInfo {
|
|
210
|
+
method: string;
|
|
211
|
+
path: string;
|
|
212
|
+
handler: RouteHandler;
|
|
213
|
+
}
|
|
214
|
+
declare class Router {
|
|
215
|
+
private routes;
|
|
216
|
+
private regexRoutes;
|
|
217
|
+
match(method: string, path: string): RouteMatch | null;
|
|
218
|
+
getAll(): RouteInfo[];
|
|
219
|
+
clear(): void;
|
|
220
|
+
remove(method: string, path: string): boolean;
|
|
221
|
+
register(method: string, path: string, handler: RouteHandler, metadata?: unknown): void;
|
|
222
|
+
private pathToRegex;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
interface RequestLogEntry {
|
|
226
|
+
timestamp: string;
|
|
227
|
+
method: string;
|
|
228
|
+
path: string;
|
|
229
|
+
ip: string;
|
|
230
|
+
status: number;
|
|
231
|
+
duration: number;
|
|
232
|
+
}
|
|
233
|
+
interface SecurityStats {
|
|
234
|
+
rateLimitEntries: number;
|
|
235
|
+
csrfTokens: number;
|
|
236
|
+
requestLogs: number;
|
|
237
|
+
}
|
|
238
|
+
declare class SecurityManager {
|
|
239
|
+
private rateLimitStore;
|
|
240
|
+
private csrfTokens;
|
|
241
|
+
private requestLog;
|
|
242
|
+
private readonly MAX_REQUEST_LOG_SIZE;
|
|
243
|
+
checkRateLimit(key: string, max: number, windowMs: number): boolean;
|
|
244
|
+
cleanupRateLimit(): void;
|
|
245
|
+
generateCsrfToken(sessionId: string, ttl?: number): string;
|
|
246
|
+
validateCsrfToken(token: string, sessionId: string): boolean;
|
|
247
|
+
cleanupCsrfTokens(): void;
|
|
248
|
+
sanitizeHtml(html: string): string;
|
|
249
|
+
sanitizeSql(input: string): string;
|
|
250
|
+
logRequest(id: string, method: string, path: string, ip: string, status: number, duration: number): void;
|
|
251
|
+
getRequestLog(id: string): RequestLogEntry | undefined;
|
|
252
|
+
getAllRequestLogs(): RequestLogEntry[];
|
|
253
|
+
clearAll(): void;
|
|
254
|
+
getStats(): SecurityStats;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
declare class Logger {
|
|
258
|
+
private level;
|
|
259
|
+
private pretty;
|
|
260
|
+
private prefix;
|
|
261
|
+
private levels;
|
|
262
|
+
private colors;
|
|
263
|
+
constructor(level?: 'debug' | 'info' | 'warn' | 'error', pretty?: boolean, prefix?: string);
|
|
264
|
+
debug(data: unknown, msg?: string): void;
|
|
265
|
+
info(data: unknown, msg?: string): void;
|
|
266
|
+
warn(data: unknown, msg?: string): void;
|
|
267
|
+
error(data: unknown, msg?: string): void;
|
|
268
|
+
fatal(data: unknown, msg?: string): void;
|
|
269
|
+
child(prefix: string): Logger;
|
|
270
|
+
private log;
|
|
271
|
+
private prettyLog;
|
|
272
|
+
private colorizeMethod;
|
|
273
|
+
private colorizeStatus;
|
|
274
|
+
private getLevelIcon;
|
|
275
|
+
private getLevelColor;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
interface StaticConfig {
|
|
279
|
+
path: string;
|
|
280
|
+
directory: string;
|
|
281
|
+
maxAge?: number;
|
|
282
|
+
index?: string[];
|
|
283
|
+
dotfiles?: 'allow' | 'deny' | 'ignore';
|
|
284
|
+
etag?: boolean;
|
|
285
|
+
lastModified?: boolean;
|
|
286
|
+
immutable?: boolean;
|
|
287
|
+
extensions?: string[];
|
|
288
|
+
fallthrough?: boolean;
|
|
289
|
+
setHeaders?: (ctx: AppContext, path: string) => void;
|
|
290
|
+
}
|
|
291
|
+
declare class StaticFileServer {
|
|
292
|
+
private config;
|
|
293
|
+
private resolvedDir;
|
|
294
|
+
private fileCache;
|
|
295
|
+
private readonly CACHE_MAX_SIZE;
|
|
296
|
+
constructor(config: StaticConfig);
|
|
297
|
+
/**
|
|
298
|
+
* Create request handler for static files
|
|
299
|
+
*/
|
|
300
|
+
handler(): (ctx: AppContext) => Promise<Response>;
|
|
301
|
+
/**
|
|
302
|
+
* Get URL path pattern for router
|
|
303
|
+
*/
|
|
304
|
+
getPathPattern(): string;
|
|
305
|
+
private resolveFilePath;
|
|
306
|
+
private isPathSafe;
|
|
307
|
+
private serveDirectory;
|
|
308
|
+
private serveFile;
|
|
309
|
+
private buildHeaders;
|
|
310
|
+
private generateEtag;
|
|
311
|
+
private getMimeType;
|
|
312
|
+
private handleNotFound;
|
|
313
|
+
/**
|
|
314
|
+
* Clear file cache
|
|
315
|
+
*/
|
|
316
|
+
clearCache(): void;
|
|
317
|
+
/**
|
|
318
|
+
* Get cache statistics
|
|
319
|
+
*/
|
|
320
|
+
getCacheStats(): {
|
|
321
|
+
entries: number;
|
|
322
|
+
maxSize: number;
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Helper function to create static file server
|
|
327
|
+
*/
|
|
328
|
+
declare function createStatic(config: StaticConfig): StaticFileServer;
|
|
329
|
+
|
|
330
|
+
declare function server(config?: ServerConfig): ServerInstance;
|
|
331
|
+
|
|
332
|
+
export { type AppContext, AppError, type AppMiddleware, type AuthConfig, type CookieOptions, type CorsConfig, type CsrfConfig, type DatabaseConfig, DatabaseError, type HelmetConfig, type HttpMethod, type LogLevel, Logger, type LoggingConfig, type RateLimitConfig, RateLimitError, type RouteDefinition, type RouteHandler$1 as RouteHandler, Router, type SecurityConfig, SecurityManager, type ServerConfig, type ServerInstance, type StaticConfig, StaticFileServer, TimeoutError, ValidationError, type ValidationSchema, createStatic, server as default, server };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { DB } from '@minejs/db';
|
|
2
|
+
export { ColumnDefinition, ColumnType, DB, QueryBuilder, SqlValue, TableSchema, WhereCondition, blob, column, defaultValue, index, integer, notNull, numeric, primaryKey, real, references, table, text, unique } from '@minejs/db';
|
|
3
|
+
import { I18nManager, I18nConfig } from '@minejs/i18n';
|
|
4
|
+
export { I18nConfig, I18nManager, LazyLoader, TranslationSet, TranslationToken, fetchTranslations, getI18n, getLanguage, getSupportedLanguages, loadLanguage, loadTranslations, setLanguage, setupAuto, setupI18n, setupLazy, t, tLang, tParse } from '@minejs/i18n';
|
|
5
|
+
|
|
6
|
+
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD';
|
|
7
|
+
type RouteHandler$1 = (c: AppContext) => Response | Promise<Response>;
|
|
8
|
+
type AppMiddleware = (c: AppContext, next: () => Promise<void>) => void | Promise<void>;
|
|
9
|
+
interface AppContext {
|
|
10
|
+
ip: string;
|
|
11
|
+
request: Request;
|
|
12
|
+
params: Record<string, string>;
|
|
13
|
+
query: Record<string, string>;
|
|
14
|
+
body: any;
|
|
15
|
+
headers: Headers;
|
|
16
|
+
db: DB | undefined;
|
|
17
|
+
logger: Logger$1 | null;
|
|
18
|
+
i18n: I18nManager | null;
|
|
19
|
+
lang?: string;
|
|
20
|
+
user?: unknown;
|
|
21
|
+
requestId: string;
|
|
22
|
+
state: Record<string, unknown>;
|
|
23
|
+
json(data: unknown, status?: number): Response;
|
|
24
|
+
text(data: string, status?: number): Response;
|
|
25
|
+
html(data: string, status?: number): Response;
|
|
26
|
+
redirect(url: string, status?: number): Response;
|
|
27
|
+
file(path: string, contentType?: string): Response;
|
|
28
|
+
setCookie(name: string, value: string, options?: CookieOptions): AppContext;
|
|
29
|
+
getCookie(name: string): string | undefined;
|
|
30
|
+
deleteCookie(name: string, options?: Partial<CookieOptions>): AppContext;
|
|
31
|
+
setHeader(key: string, value: string): AppContext;
|
|
32
|
+
getHeader(key: string): string | undefined;
|
|
33
|
+
status(code: number): AppContext;
|
|
34
|
+
statusCode: number;
|
|
35
|
+
_setCookieHeaders(): Record<string, string | string[]>;
|
|
36
|
+
}
|
|
37
|
+
interface StaticConfig$1 {
|
|
38
|
+
path: string;
|
|
39
|
+
directory: string;
|
|
40
|
+
maxAge?: number;
|
|
41
|
+
index?: string[];
|
|
42
|
+
dotfiles?: 'allow' | 'deny' | 'ignore';
|
|
43
|
+
etag?: boolean;
|
|
44
|
+
lastModified?: boolean;
|
|
45
|
+
immutable?: boolean;
|
|
46
|
+
extensions?: string[];
|
|
47
|
+
fallthrough?: boolean;
|
|
48
|
+
setHeaders?: (ctx: AppContext, path: string) => void;
|
|
49
|
+
}
|
|
50
|
+
interface CookieOptions {
|
|
51
|
+
maxAge?: number;
|
|
52
|
+
expires?: Date;
|
|
53
|
+
path?: string;
|
|
54
|
+
domain?: string;
|
|
55
|
+
secure?: boolean;
|
|
56
|
+
httpOnly?: boolean;
|
|
57
|
+
sameSite?: 'Strict' | 'Lax' | 'None';
|
|
58
|
+
}
|
|
59
|
+
interface ValidationSchema {
|
|
60
|
+
body?: unknown;
|
|
61
|
+
query?: unknown;
|
|
62
|
+
params?: unknown;
|
|
63
|
+
}
|
|
64
|
+
interface RouteDefinition {
|
|
65
|
+
method: HttpMethod | HttpMethod[];
|
|
66
|
+
path: string;
|
|
67
|
+
handler: RouteHandler$1;
|
|
68
|
+
validate?: ValidationSchema;
|
|
69
|
+
middlewares?: AppMiddleware[];
|
|
70
|
+
timeout?: number;
|
|
71
|
+
rateLimit?: {
|
|
72
|
+
max: number;
|
|
73
|
+
windowMs: number;
|
|
74
|
+
};
|
|
75
|
+
cache?: number;
|
|
76
|
+
tags?: string[];
|
|
77
|
+
}
|
|
78
|
+
interface DatabaseConfig {
|
|
79
|
+
name?: string;
|
|
80
|
+
connection: string;
|
|
81
|
+
schema?: Record<string, unknown>;
|
|
82
|
+
timeout?: number;
|
|
83
|
+
}
|
|
84
|
+
interface SecurityConfig {
|
|
85
|
+
cors?: boolean | CorsConfig;
|
|
86
|
+
rateLimit?: boolean | RateLimitConfig;
|
|
87
|
+
csrf?: boolean | CsrfConfig;
|
|
88
|
+
helmet?: boolean | HelmetConfig;
|
|
89
|
+
auth?: boolean | AuthConfig;
|
|
90
|
+
validation?: boolean;
|
|
91
|
+
sanitize?: boolean;
|
|
92
|
+
}
|
|
93
|
+
interface CorsConfig {
|
|
94
|
+
origin?: string | string[] | ((origin: string) => boolean);
|
|
95
|
+
methods?: HttpMethod[];
|
|
96
|
+
allowedHeaders?: string[];
|
|
97
|
+
credentials?: boolean;
|
|
98
|
+
maxAge?: number;
|
|
99
|
+
}
|
|
100
|
+
interface RateLimitConfig {
|
|
101
|
+
windowMs?: number;
|
|
102
|
+
max?: number;
|
|
103
|
+
keyGenerator?: (c: AppContext) => string;
|
|
104
|
+
message?: string;
|
|
105
|
+
}
|
|
106
|
+
interface CsrfConfig {
|
|
107
|
+
secret?: string;
|
|
108
|
+
headerName?: string;
|
|
109
|
+
tokenTTL?: number;
|
|
110
|
+
}
|
|
111
|
+
interface HelmetConfig {
|
|
112
|
+
contentSecurityPolicy?: Record<string, string[]> | boolean;
|
|
113
|
+
hsts?: boolean | {
|
|
114
|
+
maxAge?: number;
|
|
115
|
+
includeSubDomains?: boolean;
|
|
116
|
+
preload?: boolean;
|
|
117
|
+
};
|
|
118
|
+
frameguard?: boolean | {
|
|
119
|
+
action: 'deny' | 'sameorigin';
|
|
120
|
+
};
|
|
121
|
+
noSniff?: boolean;
|
|
122
|
+
xssFilter?: boolean;
|
|
123
|
+
referrerPolicy?: string | boolean;
|
|
124
|
+
}
|
|
125
|
+
interface AuthConfig {
|
|
126
|
+
jwt?: boolean | {
|
|
127
|
+
secret: string;
|
|
128
|
+
expiresIn?: string;
|
|
129
|
+
};
|
|
130
|
+
apiKey?: boolean | {
|
|
131
|
+
header?: string;
|
|
132
|
+
};
|
|
133
|
+
bearer?: boolean;
|
|
134
|
+
}
|
|
135
|
+
type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
136
|
+
interface LoggingConfig {
|
|
137
|
+
level?: LogLevel;
|
|
138
|
+
pretty?: boolean;
|
|
139
|
+
}
|
|
140
|
+
interface ServerConfig {
|
|
141
|
+
port?: number | string;
|
|
142
|
+
hostname?: string;
|
|
143
|
+
requestTimeout?: number;
|
|
144
|
+
maxRequestSize?: number;
|
|
145
|
+
maxJsonSize?: number;
|
|
146
|
+
database?: DatabaseConfig | DatabaseConfig[];
|
|
147
|
+
security?: boolean | SecurityConfig;
|
|
148
|
+
compression?: boolean | {
|
|
149
|
+
threshold?: number;
|
|
150
|
+
};
|
|
151
|
+
logging?: boolean | LoggingConfig;
|
|
152
|
+
i18n?: boolean | I18nConfig;
|
|
153
|
+
static?: StaticConfig$1 | StaticConfig$1[];
|
|
154
|
+
routes?: RouteDefinition[];
|
|
155
|
+
middlewares?: AppMiddleware[];
|
|
156
|
+
errorHandler?: (error: Error, context: AppContext) => void | Promise<void>;
|
|
157
|
+
onError?: (statusCode: number, path: string, method: string) => Response | Promise<Response>;
|
|
158
|
+
onStartup?: (app: any) => void | Promise<void>;
|
|
159
|
+
onReady?: (app: ServerInstance, db: Map<string, DB>) => void | Promise<void>;
|
|
160
|
+
onShutdown?: () => void | Promise<void>;
|
|
161
|
+
apiPrefix?: string;
|
|
162
|
+
apiVersion?: string;
|
|
163
|
+
gracefulShutdownTimeout?: number;
|
|
164
|
+
}
|
|
165
|
+
interface ServerInstance {
|
|
166
|
+
app: unknown;
|
|
167
|
+
logger: Logger$1 | null;
|
|
168
|
+
db: Map<string, unknown>;
|
|
169
|
+
bunServer: unknown;
|
|
170
|
+
start: () => Promise<void>;
|
|
171
|
+
stop: () => Promise<void>;
|
|
172
|
+
addRoute: (route: RouteDefinition) => void;
|
|
173
|
+
addRoutes: (routes: RouteDefinition[]) => void;
|
|
174
|
+
getRoutes: () => RouteDefinition[];
|
|
175
|
+
}
|
|
176
|
+
interface Logger$1 {
|
|
177
|
+
debug(data: unknown, msg?: string): void;
|
|
178
|
+
info(data: unknown, msg?: string): void;
|
|
179
|
+
warn(data: unknown, msg?: string): void;
|
|
180
|
+
error(data: unknown, msg?: string): void;
|
|
181
|
+
fatal(data: unknown, msg?: string): void;
|
|
182
|
+
}
|
|
183
|
+
declare class AppError extends Error {
|
|
184
|
+
message: string;
|
|
185
|
+
statusCode: number;
|
|
186
|
+
code?: string | undefined;
|
|
187
|
+
constructor(message: string, statusCode?: number, code?: string | undefined);
|
|
188
|
+
}
|
|
189
|
+
declare class ValidationError extends AppError {
|
|
190
|
+
issues?: unknown | undefined;
|
|
191
|
+
constructor(message: string, issues?: unknown | undefined);
|
|
192
|
+
}
|
|
193
|
+
declare class DatabaseError extends AppError {
|
|
194
|
+
constructor(message: string);
|
|
195
|
+
}
|
|
196
|
+
declare class TimeoutError extends AppError {
|
|
197
|
+
constructor(message?: string);
|
|
198
|
+
}
|
|
199
|
+
declare class RateLimitError extends AppError {
|
|
200
|
+
constructor(message?: string);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
type RouteHandler = (ctx: AppContext) => Response | Promise<Response>;
|
|
204
|
+
interface RouteMatch {
|
|
205
|
+
handler: RouteHandler;
|
|
206
|
+
params: Record<string, string>;
|
|
207
|
+
metadata?: unknown;
|
|
208
|
+
}
|
|
209
|
+
interface RouteInfo {
|
|
210
|
+
method: string;
|
|
211
|
+
path: string;
|
|
212
|
+
handler: RouteHandler;
|
|
213
|
+
}
|
|
214
|
+
declare class Router {
|
|
215
|
+
private routes;
|
|
216
|
+
private regexRoutes;
|
|
217
|
+
match(method: string, path: string): RouteMatch | null;
|
|
218
|
+
getAll(): RouteInfo[];
|
|
219
|
+
clear(): void;
|
|
220
|
+
remove(method: string, path: string): boolean;
|
|
221
|
+
register(method: string, path: string, handler: RouteHandler, metadata?: unknown): void;
|
|
222
|
+
private pathToRegex;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
interface RequestLogEntry {
|
|
226
|
+
timestamp: string;
|
|
227
|
+
method: string;
|
|
228
|
+
path: string;
|
|
229
|
+
ip: string;
|
|
230
|
+
status: number;
|
|
231
|
+
duration: number;
|
|
232
|
+
}
|
|
233
|
+
interface SecurityStats {
|
|
234
|
+
rateLimitEntries: number;
|
|
235
|
+
csrfTokens: number;
|
|
236
|
+
requestLogs: number;
|
|
237
|
+
}
|
|
238
|
+
declare class SecurityManager {
|
|
239
|
+
private rateLimitStore;
|
|
240
|
+
private csrfTokens;
|
|
241
|
+
private requestLog;
|
|
242
|
+
private readonly MAX_REQUEST_LOG_SIZE;
|
|
243
|
+
checkRateLimit(key: string, max: number, windowMs: number): boolean;
|
|
244
|
+
cleanupRateLimit(): void;
|
|
245
|
+
generateCsrfToken(sessionId: string, ttl?: number): string;
|
|
246
|
+
validateCsrfToken(token: string, sessionId: string): boolean;
|
|
247
|
+
cleanupCsrfTokens(): void;
|
|
248
|
+
sanitizeHtml(html: string): string;
|
|
249
|
+
sanitizeSql(input: string): string;
|
|
250
|
+
logRequest(id: string, method: string, path: string, ip: string, status: number, duration: number): void;
|
|
251
|
+
getRequestLog(id: string): RequestLogEntry | undefined;
|
|
252
|
+
getAllRequestLogs(): RequestLogEntry[];
|
|
253
|
+
clearAll(): void;
|
|
254
|
+
getStats(): SecurityStats;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
declare class Logger {
|
|
258
|
+
private level;
|
|
259
|
+
private pretty;
|
|
260
|
+
private prefix;
|
|
261
|
+
private levels;
|
|
262
|
+
private colors;
|
|
263
|
+
constructor(level?: 'debug' | 'info' | 'warn' | 'error', pretty?: boolean, prefix?: string);
|
|
264
|
+
debug(data: unknown, msg?: string): void;
|
|
265
|
+
info(data: unknown, msg?: string): void;
|
|
266
|
+
warn(data: unknown, msg?: string): void;
|
|
267
|
+
error(data: unknown, msg?: string): void;
|
|
268
|
+
fatal(data: unknown, msg?: string): void;
|
|
269
|
+
child(prefix: string): Logger;
|
|
270
|
+
private log;
|
|
271
|
+
private prettyLog;
|
|
272
|
+
private colorizeMethod;
|
|
273
|
+
private colorizeStatus;
|
|
274
|
+
private getLevelIcon;
|
|
275
|
+
private getLevelColor;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
interface StaticConfig {
|
|
279
|
+
path: string;
|
|
280
|
+
directory: string;
|
|
281
|
+
maxAge?: number;
|
|
282
|
+
index?: string[];
|
|
283
|
+
dotfiles?: 'allow' | 'deny' | 'ignore';
|
|
284
|
+
etag?: boolean;
|
|
285
|
+
lastModified?: boolean;
|
|
286
|
+
immutable?: boolean;
|
|
287
|
+
extensions?: string[];
|
|
288
|
+
fallthrough?: boolean;
|
|
289
|
+
setHeaders?: (ctx: AppContext, path: string) => void;
|
|
290
|
+
}
|
|
291
|
+
declare class StaticFileServer {
|
|
292
|
+
private config;
|
|
293
|
+
private resolvedDir;
|
|
294
|
+
private fileCache;
|
|
295
|
+
private readonly CACHE_MAX_SIZE;
|
|
296
|
+
constructor(config: StaticConfig);
|
|
297
|
+
/**
|
|
298
|
+
* Create request handler for static files
|
|
299
|
+
*/
|
|
300
|
+
handler(): (ctx: AppContext) => Promise<Response>;
|
|
301
|
+
/**
|
|
302
|
+
* Get URL path pattern for router
|
|
303
|
+
*/
|
|
304
|
+
getPathPattern(): string;
|
|
305
|
+
private resolveFilePath;
|
|
306
|
+
private isPathSafe;
|
|
307
|
+
private serveDirectory;
|
|
308
|
+
private serveFile;
|
|
309
|
+
private buildHeaders;
|
|
310
|
+
private generateEtag;
|
|
311
|
+
private getMimeType;
|
|
312
|
+
private handleNotFound;
|
|
313
|
+
/**
|
|
314
|
+
* Clear file cache
|
|
315
|
+
*/
|
|
316
|
+
clearCache(): void;
|
|
317
|
+
/**
|
|
318
|
+
* Get cache statistics
|
|
319
|
+
*/
|
|
320
|
+
getCacheStats(): {
|
|
321
|
+
entries: number;
|
|
322
|
+
maxSize: number;
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Helper function to create static file server
|
|
327
|
+
*/
|
|
328
|
+
declare function createStatic(config: StaticConfig): StaticFileServer;
|
|
329
|
+
|
|
330
|
+
declare function server(config?: ServerConfig): ServerInstance;
|
|
331
|
+
|
|
332
|
+
export { type AppContext, AppError, type AppMiddleware, type AuthConfig, type CookieOptions, type CorsConfig, type CsrfConfig, type DatabaseConfig, DatabaseError, type HelmetConfig, type HttpMethod, type LogLevel, Logger, type LoggingConfig, type RateLimitConfig, RateLimitError, type RouteDefinition, type RouteHandler$1 as RouteHandler, Router, type SecurityConfig, SecurityManager, type ServerConfig, type ServerInstance, type StaticConfig, StaticFileServer, TimeoutError, ValidationError, type ValidationSchema, createStatic, server as default, server };
|