@engjts/nexus 0.1.8 → 0.1.9
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/package.json +1 -1
- package/BENCHMARK_REPORT.md +0 -343
- package/documentation/01-getting-started.md +0 -240
- package/documentation/02-context.md +0 -335
- package/documentation/03-routing.md +0 -397
- package/documentation/04-middleware.md +0 -483
- package/documentation/05-validation.md +0 -514
- package/documentation/06-error-handling.md +0 -465
- package/documentation/07-performance.md +0 -364
- package/documentation/08-adapters.md +0 -470
- package/documentation/09-api-reference.md +0 -548
- package/documentation/10-examples.md +0 -582
- package/documentation/11-deployment.md +0 -477
- package/documentation/12-sentry.md +0 -620
- package/documentation/13-sentry-data-storage.md +0 -996
- package/documentation/14-sentry-data-reference.md +0 -457
- package/documentation/15-sentry-summary.md +0 -409
- package/documentation/16-alerts-system.md +0 -745
- package/documentation/17-alert-adapters.md +0 -696
- package/documentation/18-alerts-implementation-summary.md +0 -385
- package/documentation/19-class-based-routing.md +0 -840
- package/documentation/20-websocket-realtime.md +0 -813
- package/documentation/21-cache-system.md +0 -510
- package/documentation/22-job-queue.md +0 -772
- package/documentation/23-sentry-plugin.md +0 -551
- package/documentation/24-testing-utilities.md +0 -1287
- package/documentation/25-api-versioning.md +0 -533
- package/documentation/26-context-store.md +0 -607
- package/documentation/27-dependency-injection.md +0 -329
- package/documentation/28-lifecycle-hooks.md +0 -521
- package/documentation/29-package-structure.md +0 -196
- package/documentation/30-plugin-system.md +0 -414
- package/documentation/31-jwt-authentication.md +0 -597
- package/documentation/32-cli.md +0 -268
- package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
- package/documentation/ALERTS-INDEX.md +0 -330
- package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
- package/documentation/README.md +0 -178
- package/documentation/index.html +0 -34
- package/modern_framework_paper.md +0 -1870
- package/public/css/style.css +0 -87
- package/public/index.html +0 -34
- package/public/js/app.js +0 -27
- package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
- package/src/advanced/cache/MultiTierCache.ts +0 -194
- package/src/advanced/cache/RedisCacheStore.ts +0 -341
- package/src/advanced/cache/index.ts +0 -5
- package/src/advanced/cache/types.ts +0 -40
- package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
- package/src/advanced/graphql/index.ts +0 -22
- package/src/advanced/graphql/server.ts +0 -252
- package/src/advanced/graphql/types.ts +0 -42
- package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
- package/src/advanced/jobs/JobQueue.ts +0 -556
- package/src/advanced/jobs/RedisQueueStore.ts +0 -367
- package/src/advanced/jobs/index.ts +0 -5
- package/src/advanced/jobs/types.ts +0 -70
- package/src/advanced/observability/APMManager.ts +0 -163
- package/src/advanced/observability/AlertManager.ts +0 -109
- package/src/advanced/observability/MetricRegistry.ts +0 -151
- package/src/advanced/observability/ObservabilityCenter.ts +0 -304
- package/src/advanced/observability/StructuredLogger.ts +0 -154
- package/src/advanced/observability/TracingManager.ts +0 -117
- package/src/advanced/observability/adapters.ts +0 -304
- package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
- package/src/advanced/observability/index.ts +0 -11
- package/src/advanced/observability/types.ts +0 -174
- package/src/advanced/playground/extractPathParams.ts +0 -6
- package/src/advanced/playground/generateFieldExample.ts +0 -31
- package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1956
- package/src/advanced/playground/generateSummary.ts +0 -19
- package/src/advanced/playground/getTagFromPath.ts +0 -9
- package/src/advanced/playground/index.ts +0 -8
- package/src/advanced/playground/playground.ts +0 -250
- package/src/advanced/playground/types.ts +0 -49
- package/src/advanced/playground/zodToExample.ts +0 -16
- package/src/advanced/playground/zodToParams.ts +0 -15
- package/src/advanced/postman/buildAuth.ts +0 -31
- package/src/advanced/postman/buildBody.ts +0 -15
- package/src/advanced/postman/buildQueryParams.ts +0 -27
- package/src/advanced/postman/buildRequestItem.ts +0 -36
- package/src/advanced/postman/buildResponses.ts +0 -11
- package/src/advanced/postman/buildUrl.ts +0 -33
- package/src/advanced/postman/capitalize.ts +0 -4
- package/src/advanced/postman/generateCollection.ts +0 -59
- package/src/advanced/postman/generateEnvironment.ts +0 -34
- package/src/advanced/postman/generateExampleFromZod.ts +0 -21
- package/src/advanced/postman/generateFieldExample.ts +0 -45
- package/src/advanced/postman/generateName.ts +0 -20
- package/src/advanced/postman/generateUUID.ts +0 -11
- package/src/advanced/postman/getTagFromPath.ts +0 -10
- package/src/advanced/postman/index.ts +0 -28
- package/src/advanced/postman/postman.ts +0 -156
- package/src/advanced/postman/slugify.ts +0 -7
- package/src/advanced/postman/types.ts +0 -140
- package/src/advanced/realtime/index.ts +0 -18
- package/src/advanced/realtime/websocket.ts +0 -231
- package/src/advanced/sentry/index.ts +0 -1236
- package/src/advanced/sentry/types.ts +0 -355
- package/src/advanced/static/generateDirectoryListing.ts +0 -47
- package/src/advanced/static/generateETag.ts +0 -7
- package/src/advanced/static/getMimeType.ts +0 -9
- package/src/advanced/static/index.ts +0 -32
- package/src/advanced/static/isSafePath.ts +0 -13
- package/src/advanced/static/publicDir.ts +0 -21
- package/src/advanced/static/serveStatic.ts +0 -225
- package/src/advanced/static/spa.ts +0 -24
- package/src/advanced/static/types.ts +0 -159
- package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
- package/src/advanced/swagger/buildOperation.ts +0 -61
- package/src/advanced/swagger/buildParameters.ts +0 -61
- package/src/advanced/swagger/buildRequestBody.ts +0 -21
- package/src/advanced/swagger/buildResponses.ts +0 -54
- package/src/advanced/swagger/capitalize.ts +0 -5
- package/src/advanced/swagger/convertPath.ts +0 -9
- package/src/advanced/swagger/createSwagger.ts +0 -12
- package/src/advanced/swagger/generateOperationId.ts +0 -21
- package/src/advanced/swagger/generateSpec.ts +0 -105
- package/src/advanced/swagger/generateSummary.ts +0 -24
- package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
- package/src/advanced/swagger/generateThemeCss.ts +0 -53
- package/src/advanced/swagger/index.ts +0 -25
- package/src/advanced/swagger/swagger.ts +0 -237
- package/src/advanced/swagger/types.ts +0 -206
- package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
- package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
- package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
- package/src/advanced/testing/factory.ts +0 -509
- package/src/advanced/testing/harness.ts +0 -612
- package/src/advanced/testing/index.ts +0 -430
- package/src/advanced/testing/load-test.ts +0 -618
- package/src/advanced/testing/mock-server.ts +0 -498
- package/src/advanced/testing/mock.ts +0 -670
- package/src/cli/bin.ts +0 -9
- package/src/cli/cli.ts +0 -158
- package/src/cli/commands/add.ts +0 -178
- package/src/cli/commands/build.ts +0 -73
- package/src/cli/commands/create.ts +0 -166
- package/src/cli/commands/dev.ts +0 -85
- package/src/cli/commands/generate.ts +0 -99
- package/src/cli/commands/help.ts +0 -95
- package/src/cli/commands/init.ts +0 -91
- package/src/cli/commands/version.ts +0 -38
- package/src/cli/index.ts +0 -6
- package/src/cli/templates/generators.ts +0 -359
- package/src/cli/templates/index.ts +0 -680
- package/src/cli/utils/exec.ts +0 -52
- package/src/cli/utils/file-system.ts +0 -78
- package/src/cli/utils/logger.ts +0 -111
- package/src/core/adapter.ts +0 -88
- package/src/core/application.ts +0 -1453
- package/src/core/context-pool.ts +0 -79
- package/src/core/context.ts +0 -856
- package/src/core/index.ts +0 -94
- package/src/core/middleware.ts +0 -272
- package/src/core/performance/buffer-pool.ts +0 -108
- package/src/core/performance/middleware-optimizer.ts +0 -162
- package/src/core/plugin/PluginManager.ts +0 -435
- package/src/core/plugin/builder.ts +0 -358
- package/src/core/plugin/index.ts +0 -50
- package/src/core/plugin/types.ts +0 -214
- package/src/core/router/file-router.ts +0 -623
- package/src/core/router/index.ts +0 -260
- package/src/core/router/radix-tree.ts +0 -242
- package/src/core/serializer.ts +0 -397
- package/src/core/store/index.ts +0 -30
- package/src/core/store/registry.ts +0 -178
- package/src/core/store/request-store.ts +0 -240
- package/src/core/store/types.ts +0 -233
- package/src/core/types.ts +0 -616
- package/src/database/adapter.ts +0 -35
- package/src/database/adapters/index.ts +0 -1
- package/src/database/adapters/mysql.ts +0 -669
- package/src/database/database.ts +0 -70
- package/src/database/dialect.ts +0 -388
- package/src/database/index.ts +0 -12
- package/src/database/migrations.ts +0 -86
- package/src/database/optimizer.ts +0 -125
- package/src/database/query-builder.ts +0 -404
- package/src/database/realtime.ts +0 -53
- package/src/database/schema.ts +0 -71
- package/src/database/transactions.ts +0 -56
- package/src/database/types.ts +0 -87
- package/src/deployment/cluster.ts +0 -471
- package/src/deployment/config.ts +0 -454
- package/src/deployment/docker.ts +0 -599
- package/src/deployment/graceful-shutdown.ts +0 -373
- package/src/deployment/index.ts +0 -56
- package/src/index.ts +0 -281
- package/src/security/adapter.ts +0 -318
- package/src/security/auth/JWTPlugin.ts +0 -234
- package/src/security/auth/JWTProvider.ts +0 -316
- package/src/security/auth/adapter.ts +0 -12
- package/src/security/auth/jwt.ts +0 -234
- package/src/security/auth/middleware.ts +0 -188
- package/src/security/csrf.ts +0 -220
- package/src/security/headers.ts +0 -108
- package/src/security/index.ts +0 -60
- package/src/security/rate-limit/adapter.ts +0 -7
- package/src/security/rate-limit/memory.ts +0 -108
- package/src/security/rate-limit/middleware.ts +0 -181
- package/src/security/sanitization.ts +0 -75
- package/src/security/types.ts +0 -240
- package/src/security/utils.ts +0 -52
- package/tsconfig.json +0 -39
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rate Limiting Middleware
|
|
3
|
-
*
|
|
4
|
-
* Adaptive rate limiting with various strategies
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { Context, Next, Middleware } from '../../core/types';
|
|
8
|
-
import type { RateLimitConfig, RateLimitInfo } from '../types';
|
|
9
|
-
import type { RateLimitAdapter } from '../adapter';
|
|
10
|
-
import { MemoryRateLimiter } from './memory';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Parse time window string to milliseconds
|
|
14
|
-
*/
|
|
15
|
-
function parseWindow(window: number | string): number {
|
|
16
|
-
if (typeof window === 'number') {
|
|
17
|
-
return window;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const match = window.match(/^(\d+)([smhd])$/);
|
|
21
|
-
if (!match) {
|
|
22
|
-
throw new Error('Invalid window format');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const value = parseInt(match[1]);
|
|
26
|
-
const unit = match[2];
|
|
27
|
-
|
|
28
|
-
const multipliers: Record<string, number> = {
|
|
29
|
-
s: 1000,
|
|
30
|
-
m: 60000,
|
|
31
|
-
h: 3600000,
|
|
32
|
-
d: 86400000
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
return value * multipliers[unit];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Default key generator - uses IP address
|
|
40
|
-
*/
|
|
41
|
-
function defaultKeyGenerator(ctx: Context): string {
|
|
42
|
-
// Try to get real IP from headers
|
|
43
|
-
const forwardedRaw = ctx.headers['x-forwarded-for'] || ctx.headers['X-Forwarded-For'];
|
|
44
|
-
if (forwardedRaw) {
|
|
45
|
-
const forwarded = Array.isArray(forwardedRaw) ? forwardedRaw[0] : forwardedRaw;
|
|
46
|
-
if (forwarded) {
|
|
47
|
-
return forwarded.split(',')[0].trim();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const realIpRaw = ctx.headers['x-real-ip'] || ctx.headers['X-Real-IP'];
|
|
52
|
-
if (realIpRaw) {
|
|
53
|
-
const realIp = Array.isArray(realIpRaw) ? realIpRaw[0] : realIpRaw;
|
|
54
|
-
if (realIp) {
|
|
55
|
-
return realIp;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Fallback to generic key
|
|
60
|
-
return 'unknown';
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Create rate limiting middleware
|
|
65
|
-
*
|
|
66
|
-
* @example
|
|
67
|
-
* ```ts
|
|
68
|
-
* app.use(rateLimit({
|
|
69
|
-
* window: '15m',
|
|
70
|
-
* max: 100,
|
|
71
|
-
* routes: {
|
|
72
|
-
* 'POST /api/login': { max: 5, window: '5m' }
|
|
73
|
-
* }
|
|
74
|
-
* }));
|
|
75
|
-
* ```
|
|
76
|
-
*/
|
|
77
|
-
export function rateLimit(
|
|
78
|
-
config: RateLimitConfig,
|
|
79
|
-
adapter?: RateLimitAdapter
|
|
80
|
-
): Middleware {
|
|
81
|
-
const store = adapter || new MemoryRateLimiter();
|
|
82
|
-
const keyGenerator = config.keyGenerator || defaultKeyGenerator;
|
|
83
|
-
const message = config.message || 'Too many requests';
|
|
84
|
-
const statusCode = config.statusCode || 429;
|
|
85
|
-
|
|
86
|
-
return async (ctx: Context, next: Next, _deps: any) => {
|
|
87
|
-
// Generate rate limit key
|
|
88
|
-
const baseKey = keyGenerator(ctx);
|
|
89
|
-
|
|
90
|
-
// Check for route-specific limits
|
|
91
|
-
let routeConfig = config;
|
|
92
|
-
if (config.routes) {
|
|
93
|
-
const routeKey = `${ctx.method} ${ctx.path}`;
|
|
94
|
-
|
|
95
|
-
// Try exact match
|
|
96
|
-
if (config.routes[routeKey]) {
|
|
97
|
-
routeConfig = {
|
|
98
|
-
...config,
|
|
99
|
-
...config.routes[routeKey]
|
|
100
|
-
};
|
|
101
|
-
} else {
|
|
102
|
-
// Try wildcard match
|
|
103
|
-
for (const [pattern, limits] of Object.entries(config.routes)) {
|
|
104
|
-
const regex = new RegExp('^' + pattern.replace('*', '.*') + '$');
|
|
105
|
-
if (regex.test(routeKey)) {
|
|
106
|
-
routeConfig = {
|
|
107
|
-
...config,
|
|
108
|
-
...limits
|
|
109
|
-
};
|
|
110
|
-
break;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const finalWindowMs = parseWindow(routeConfig.window);
|
|
117
|
-
const finalMax = routeConfig.max;
|
|
118
|
-
const key = `ratelimit:${baseKey}:${ctx.path}`;
|
|
119
|
-
|
|
120
|
-
// Increment counter
|
|
121
|
-
const { count, resetTime } = await store.increment(key, finalWindowMs);
|
|
122
|
-
|
|
123
|
-
// Attach rate limit info to context
|
|
124
|
-
const rateLimitInfo: RateLimitInfo = {
|
|
125
|
-
limit: finalMax,
|
|
126
|
-
remaining: Math.max(0, finalMax - count),
|
|
127
|
-
reset: Math.floor(resetTime / 1000),
|
|
128
|
-
retryAfter: count > finalMax ? Math.ceil((resetTime - Date.now()) / 1000) : undefined
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
(ctx as any).rateLimit = rateLimitInfo;
|
|
132
|
-
|
|
133
|
-
// Check if limit exceeded
|
|
134
|
-
if (count > finalMax) {
|
|
135
|
-
return {
|
|
136
|
-
statusCode,
|
|
137
|
-
headers: {
|
|
138
|
-
'Content-Type': 'application/json',
|
|
139
|
-
'X-RateLimit-Limit': finalMax.toString(),
|
|
140
|
-
'X-RateLimit-Remaining': '0',
|
|
141
|
-
'X-RateLimit-Reset': rateLimitInfo.reset.toString(),
|
|
142
|
-
'Retry-After': rateLimitInfo.retryAfter?.toString() || '60'
|
|
143
|
-
},
|
|
144
|
-
body: JSON.stringify({
|
|
145
|
-
error: message,
|
|
146
|
-
retryAfter: rateLimitInfo.retryAfter
|
|
147
|
-
})
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Add rate limit headers
|
|
152
|
-
const response = await next(ctx);
|
|
153
|
-
|
|
154
|
-
response.headers['X-RateLimit-Limit'] = finalMax.toString();
|
|
155
|
-
response.headers['X-RateLimit-Remaining'] = rateLimitInfo.remaining.toString();
|
|
156
|
-
response.headers['X-RateLimit-Reset'] = rateLimitInfo.reset.toString();
|
|
157
|
-
|
|
158
|
-
return response;
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Strict rate limiting for sensitive endpoints
|
|
164
|
-
*/
|
|
165
|
-
export function strictRateLimit(max: number = 5, window: string | number = '5m'): Middleware {
|
|
166
|
-
return rateLimit({
|
|
167
|
-
window,
|
|
168
|
-
max,
|
|
169
|
-
message: 'Too many attempts, please try again later'
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Lenient rate limiting for public endpoints
|
|
175
|
-
*/
|
|
176
|
-
export function lenientRateLimit(max: number = 1000, window: string | number = '15m'): Middleware {
|
|
177
|
-
return rateLimit({
|
|
178
|
-
window,
|
|
179
|
-
max
|
|
180
|
-
});
|
|
181
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Input Sanitization Middleware
|
|
3
|
-
*
|
|
4
|
-
* Automatically sanitizes request inputs to prevent common attacks
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { Context, Next, Middleware } from '../core/types';
|
|
8
|
-
import type { SanitizationConfig } from './types';
|
|
9
|
-
import type { SanitizationAdapter } from './adapter';
|
|
10
|
-
import { DefaultSanitizationAdapter } from './adapter';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Create input sanitization middleware
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```ts
|
|
17
|
-
* app.use(sanitizeInput({
|
|
18
|
-
* fields: ['body', 'query', 'params'],
|
|
19
|
-
* strict: false
|
|
20
|
-
* }));
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
export function sanitizeInput(
|
|
24
|
-
config: SanitizationConfig = {},
|
|
25
|
-
adapter?: SanitizationAdapter
|
|
26
|
-
): Middleware {
|
|
27
|
-
const adapterInstance = adapter || new DefaultSanitizationAdapter();
|
|
28
|
-
const fields = config.fields || ['body', 'query', 'params'];
|
|
29
|
-
const enabled = config.enabled !== false;
|
|
30
|
-
|
|
31
|
-
return async (ctx: Context, next: Next) => {
|
|
32
|
-
if (!enabled) {
|
|
33
|
-
return next(ctx);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Sanitize specified fields
|
|
37
|
-
for (const field of fields) {
|
|
38
|
-
if (field in ctx && ctx[field]) {
|
|
39
|
-
try {
|
|
40
|
-
(ctx as any)[field] = adapterInstance.sanitize(
|
|
41
|
-
ctx[field],
|
|
42
|
-
config
|
|
43
|
-
);
|
|
44
|
-
} catch (error) {
|
|
45
|
-
// In strict mode, adapter throws on malicious input
|
|
46
|
-
throw new Error(`Malicious input detected in ${field}`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return next(ctx);
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Strict sanitization - throws on malicious input
|
|
57
|
-
*/
|
|
58
|
-
export function strictSanitization(customConfig: Partial<SanitizationConfig> = {}): Middleware {
|
|
59
|
-
return sanitizeInput({
|
|
60
|
-
fields: ['body', 'query', 'params'],
|
|
61
|
-
strict: true,
|
|
62
|
-
...customConfig
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Lenient sanitization - silently removes malicious content
|
|
68
|
-
*/
|
|
69
|
-
export function lenientSanitization(customConfig: Partial<SanitizationConfig> = {}): Middleware {
|
|
70
|
-
return sanitizeInput({
|
|
71
|
-
fields: ['body', 'query', 'params'],
|
|
72
|
-
strict: false,
|
|
73
|
-
...customConfig
|
|
74
|
-
});
|
|
75
|
-
}
|
package/src/security/types.ts
DELETED
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Security Layer Type Definitions
|
|
3
|
-
*
|
|
4
|
-
* Core types for security features including auth, RBAC, rate limiting
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { Context } from '../core/types';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* User type for authenticated contexts
|
|
11
|
-
*/
|
|
12
|
-
export interface User {
|
|
13
|
-
id: string | number;
|
|
14
|
-
email?: string;
|
|
15
|
-
username?: string;
|
|
16
|
-
roles?: string[];
|
|
17
|
-
permissions?: string[];
|
|
18
|
-
[key: string]: any;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Context with authenticated user
|
|
23
|
-
*/
|
|
24
|
-
export interface AuthContext extends Context {
|
|
25
|
-
user: User;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Security headers configuration
|
|
30
|
-
*/
|
|
31
|
-
export interface SecurityHeadersConfig {
|
|
32
|
-
/** Preset mode: 'strict' | 'moderate' | 'loose' */
|
|
33
|
-
mode?: 'strict' | 'moderate' | 'loose';
|
|
34
|
-
|
|
35
|
-
/** Custom headers to add/override */
|
|
36
|
-
customHeaders?: Record<string, string>;
|
|
37
|
-
|
|
38
|
-
/** Content Security Policy configuration */
|
|
39
|
-
csp?: {
|
|
40
|
-
directives?: Record<string, string[]>;
|
|
41
|
-
reportUri?: string;
|
|
42
|
-
reportOnly?: boolean;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/** Enable auto-nonce generation for CSP */
|
|
46
|
-
autoNonce?: boolean;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Sanitization pattern configuration
|
|
51
|
-
*/
|
|
52
|
-
export interface SanitizationPattern {
|
|
53
|
-
name: string;
|
|
54
|
-
pattern: RegExp;
|
|
55
|
-
replacement?: string;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Input sanitization configuration
|
|
60
|
-
*/
|
|
61
|
-
export interface SanitizationConfig {
|
|
62
|
-
/** Enable auto-sanitization */
|
|
63
|
-
enabled?: boolean;
|
|
64
|
-
|
|
65
|
-
/** Custom patterns to detect */
|
|
66
|
-
patterns?: SanitizationPattern[];
|
|
67
|
-
|
|
68
|
-
/** Fields to sanitize (body, query, params) */
|
|
69
|
-
fields?: ('body' | 'query' | 'params')[];
|
|
70
|
-
|
|
71
|
-
/** Throw error on detection vs silent sanitization */
|
|
72
|
-
strict?: boolean;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* JWT authentication configuration
|
|
77
|
-
*/
|
|
78
|
-
export interface JWTConfig {
|
|
79
|
-
/** Secret key for signing */
|
|
80
|
-
secret: string;
|
|
81
|
-
|
|
82
|
-
/** Algorithm (default: HS256) */
|
|
83
|
-
algorithm?: 'HS256' | 'HS384' | 'HS512' | 'RS256' | 'RS384' | 'RS512';
|
|
84
|
-
|
|
85
|
-
/** Token expiration */
|
|
86
|
-
expiresIn?: string | number;
|
|
87
|
-
|
|
88
|
-
/** Refresh token configuration */
|
|
89
|
-
refresh?: {
|
|
90
|
-
enabled: boolean;
|
|
91
|
-
expiresIn?: string | number;
|
|
92
|
-
rotateSecret?: boolean;
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
/** Token extraction strategy */
|
|
96
|
-
getToken?: (ctx: Context) => string | null;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* OAuth configuration (placeholder for future implementation)
|
|
101
|
-
*/
|
|
102
|
-
export interface OAuthConfig {
|
|
103
|
-
provider: 'google' | 'github' | 'facebook' | string;
|
|
104
|
-
clientId: string;
|
|
105
|
-
clientSecret: string;
|
|
106
|
-
callbackUrl: string;
|
|
107
|
-
scope?: string[];
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Session configuration (placeholder for future implementation)
|
|
112
|
-
*/
|
|
113
|
-
export interface SessionConfig {
|
|
114
|
-
store: 'memory' | 'redis' | string;
|
|
115
|
-
secret: string;
|
|
116
|
-
cookie?: {
|
|
117
|
-
secure?: boolean;
|
|
118
|
-
httpOnly?: boolean;
|
|
119
|
-
sameSite?: 'strict' | 'lax' | 'none';
|
|
120
|
-
maxAge?: number;
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Authentication strategies
|
|
126
|
-
*/
|
|
127
|
-
export interface AuthStrategies {
|
|
128
|
-
jwt?: JWTConfig;
|
|
129
|
-
oauth?: OAuthConfig;
|
|
130
|
-
session?: SessionConfig;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Role definition for RBAC
|
|
135
|
-
*/
|
|
136
|
-
export interface RoleDefinition {
|
|
137
|
-
name: string;
|
|
138
|
-
permissions: string[];
|
|
139
|
-
inherits?: string[];
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Permission check result
|
|
144
|
-
*/
|
|
145
|
-
export interface PermissionCheckResult {
|
|
146
|
-
allowed: boolean;
|
|
147
|
-
missing?: string[];
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Rate limit configuration
|
|
152
|
-
*/
|
|
153
|
-
export interface RateLimitConfig {
|
|
154
|
-
/** Time window in milliseconds or string format (e.g., '15m', '1h') */
|
|
155
|
-
window: number | string;
|
|
156
|
-
|
|
157
|
-
/** Maximum requests per window */
|
|
158
|
-
max: number;
|
|
159
|
-
|
|
160
|
-
/** Storage backend */
|
|
161
|
-
store?: 'memory' | 'redis' | string;
|
|
162
|
-
|
|
163
|
-
/** Key generator function */
|
|
164
|
-
keyGenerator?: (ctx: Context) => string;
|
|
165
|
-
|
|
166
|
-
/** Per-route limits */
|
|
167
|
-
routes?: Record<string, { max: number; window: number | string }>;
|
|
168
|
-
|
|
169
|
-
/** Suspicious behavior detection */
|
|
170
|
-
suspicious?: {
|
|
171
|
-
failedLogins?: {
|
|
172
|
-
max: number;
|
|
173
|
-
window: number | string;
|
|
174
|
-
action: 'captcha' | 'block' | 'throttle';
|
|
175
|
-
};
|
|
176
|
-
rapidRequests?: {
|
|
177
|
-
threshold: number;
|
|
178
|
-
window: number | string;
|
|
179
|
-
action: 'throttle' | 'block';
|
|
180
|
-
};
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
/** Message to send when rate limited */
|
|
184
|
-
message?: string;
|
|
185
|
-
|
|
186
|
-
/** Status code to send when rate limited */
|
|
187
|
-
statusCode?: number;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Rate limit info attached to context
|
|
192
|
-
*/
|
|
193
|
-
export interface RateLimitInfo {
|
|
194
|
-
limit: number;
|
|
195
|
-
remaining: number;
|
|
196
|
-
reset: number; // timestamp
|
|
197
|
-
retryAfter?: number; // seconds
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* CSRF protection configuration
|
|
202
|
-
*/
|
|
203
|
-
export interface CSRFConfig {
|
|
204
|
-
/** Enable automatic token generation and validation */
|
|
205
|
-
auto?: boolean;
|
|
206
|
-
|
|
207
|
-
/** Cookie configuration */
|
|
208
|
-
cookie?: {
|
|
209
|
-
name?: string;
|
|
210
|
-
sameSite?: 'strict' | 'lax' | 'none';
|
|
211
|
-
secure?: boolean;
|
|
212
|
-
httpOnly?: boolean;
|
|
213
|
-
};
|
|
214
|
-
|
|
215
|
-
/** Token field name in body */
|
|
216
|
-
tokenField?: string;
|
|
217
|
-
|
|
218
|
-
/** Header field name */
|
|
219
|
-
headerField?: string;
|
|
220
|
-
|
|
221
|
-
/** Methods to exclude from CSRF check */
|
|
222
|
-
excludeMethods?: string[];
|
|
223
|
-
|
|
224
|
-
/** Routes to exclude from CSRF check */
|
|
225
|
-
excludeRoutes?: string[];
|
|
226
|
-
|
|
227
|
-
/** Token length */
|
|
228
|
-
tokenLength?: number;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Security event for logging/monitoring
|
|
233
|
-
*/
|
|
234
|
-
export interface SecurityEvent {
|
|
235
|
-
type: 'auth_failed' | 'rate_limit' | 'csrf_failed' | 'xss_detected' | 'sql_injection_detected';
|
|
236
|
-
timestamp: number;
|
|
237
|
-
ip: string;
|
|
238
|
-
path: string;
|
|
239
|
-
details?: any;
|
|
240
|
-
}
|
package/src/security/utils.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Security Utility Helpers
|
|
3
|
-
*
|
|
4
|
-
* Helper functions for working with security features
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { Context } from '../core/types';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Get header value as string (handles string | string[] | undefined)
|
|
11
|
-
*/
|
|
12
|
-
export function getHeader(ctx: Context, name: string): string | null {
|
|
13
|
-
const value = ctx.headers[name.toLowerCase()];
|
|
14
|
-
|
|
15
|
-
if (!value) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
if (Array.isArray(value)) {
|
|
20
|
-
return value[0] || null;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return value;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Get all header values as array
|
|
28
|
-
*/
|
|
29
|
-
export function getHeaderValues(ctx: Context, name: string): string[] {
|
|
30
|
-
const value = ctx.headers[name.toLowerCase()];
|
|
31
|
-
|
|
32
|
-
if (!value) {
|
|
33
|
-
return [];
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (Array.isArray(value)) {
|
|
37
|
-
return value;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return [value];
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Set response header safely
|
|
45
|
-
*/
|
|
46
|
-
export function setResponseHeader(
|
|
47
|
-
headers: Record<string, string>,
|
|
48
|
-
name: string,
|
|
49
|
-
value: string
|
|
50
|
-
): void {
|
|
51
|
-
headers[name] = value;
|
|
52
|
-
}
|
package/tsconfig.json
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "commonjs",
|
|
5
|
-
"lib": [
|
|
6
|
-
"ES2022"
|
|
7
|
-
],
|
|
8
|
-
"outDir": "./dist",
|
|
9
|
-
"rootDir": "./src",
|
|
10
|
-
"strict": false,
|
|
11
|
-
"esModuleInterop": true,
|
|
12
|
-
"skipLibCheck": true,
|
|
13
|
-
"forceConsistentCasingInFileNames": true,
|
|
14
|
-
"declaration": true,
|
|
15
|
-
"declarationMap": true,
|
|
16
|
-
"sourceMap": true,
|
|
17
|
-
"moduleResolution": "node",
|
|
18
|
-
"resolveJsonModule": true,
|
|
19
|
-
"allowSyntheticDefaultImports": true,
|
|
20
|
-
"noUnusedLocals": false,
|
|
21
|
-
"noUnusedParameters": false,
|
|
22
|
-
"noImplicitReturns": false,
|
|
23
|
-
"noFallthroughCasesInSwitch": true,
|
|
24
|
-
"strictNullChecks": false,
|
|
25
|
-
"strictFunctionTypes": false,
|
|
26
|
-
"strictBindCallApply": false,
|
|
27
|
-
"strictPropertyInitialization": false,
|
|
28
|
-
"noImplicitThis": false,
|
|
29
|
-
"alwaysStrict": false
|
|
30
|
-
},
|
|
31
|
-
"include": [
|
|
32
|
-
"src/**/*"
|
|
33
|
-
],
|
|
34
|
-
"exclude": [
|
|
35
|
-
"node_modules",
|
|
36
|
-
"dist",
|
|
37
|
-
"**/*.test.ts"
|
|
38
|
-
]
|
|
39
|
-
}
|