@morojs/moro 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +233 -0
- package/dist/core/config/index.d.ts +19 -0
- package/dist/core/config/index.js +59 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/config/loader.d.ts +6 -0
- package/dist/core/config/loader.js +288 -0
- package/dist/core/config/loader.js.map +1 -0
- package/dist/core/config/schema.d.ts +335 -0
- package/dist/core/config/schema.js +286 -0
- package/dist/core/config/schema.js.map +1 -0
- package/dist/core/config/utils.d.ts +50 -0
- package/dist/core/config/utils.js +185 -0
- package/dist/core/config/utils.js.map +1 -0
- package/dist/core/database/adapters/drizzle.d.ts +29 -0
- package/dist/core/database/adapters/drizzle.js +366 -0
- package/dist/core/database/adapters/drizzle.js.map +1 -0
- package/dist/core/database/adapters/index.d.ts +8 -0
- package/dist/core/database/adapters/index.js +48 -0
- package/dist/core/database/adapters/index.js.map +1 -0
- package/dist/core/database/adapters/mongodb.d.ts +35 -0
- package/dist/core/database/adapters/mongodb.js +215 -0
- package/dist/core/database/adapters/mongodb.js.map +1 -0
- package/dist/core/database/adapters/mysql.d.ts +23 -0
- package/dist/core/database/adapters/mysql.js +149 -0
- package/dist/core/database/adapters/mysql.js.map +1 -0
- package/dist/core/database/adapters/postgresql.d.ts +24 -0
- package/dist/core/database/adapters/postgresql.js +160 -0
- package/dist/core/database/adapters/postgresql.js.map +1 -0
- package/dist/core/database/adapters/redis.d.ts +50 -0
- package/dist/core/database/adapters/redis.js +266 -0
- package/dist/core/database/adapters/redis.js.map +1 -0
- package/dist/core/database/adapters/sqlite.d.ts +23 -0
- package/dist/core/database/adapters/sqlite.js +194 -0
- package/dist/core/database/adapters/sqlite.js.map +1 -0
- package/dist/core/database/index.d.ts +2 -0
- package/dist/core/database/index.js +20 -0
- package/dist/core/database/index.js.map +1 -0
- package/dist/core/docs/index.d.ts +63 -0
- package/dist/core/docs/index.js +170 -0
- package/dist/core/docs/index.js.map +1 -0
- package/dist/core/docs/openapi-generator.d.ts +124 -0
- package/dist/core/docs/openapi-generator.js +413 -0
- package/dist/core/docs/openapi-generator.js.map +1 -0
- package/dist/core/docs/simple-docs.d.ts +21 -0
- package/dist/core/docs/simple-docs.js +268 -0
- package/dist/core/docs/simple-docs.js.map +1 -0
- package/dist/core/docs/swagger-ui.d.ts +28 -0
- package/dist/core/docs/swagger-ui.js +317 -0
- package/dist/core/docs/swagger-ui.js.map +1 -0
- package/dist/core/docs/zod-to-openapi.d.ts +29 -0
- package/dist/core/docs/zod-to-openapi.js +414 -0
- package/dist/core/docs/zod-to-openapi.js.map +1 -0
- package/dist/core/events/event-bus.d.ts +27 -0
- package/dist/core/events/event-bus.js +193 -0
- package/dist/core/events/event-bus.js.map +1 -0
- package/dist/core/events/index.d.ts +2 -0
- package/dist/core/events/index.js +7 -0
- package/dist/core/events/index.js.map +1 -0
- package/dist/core/framework.d.ts +57 -0
- package/dist/core/framework.js +432 -0
- package/dist/core/framework.js.map +1 -0
- package/dist/core/http/http-server.d.ts +114 -0
- package/dist/core/http/http-server.js +1154 -0
- package/dist/core/http/http-server.js.map +1 -0
- package/dist/core/http/index.d.ts +3 -0
- package/dist/core/http/index.js +10 -0
- package/dist/core/http/index.js.map +1 -0
- package/dist/core/http/router.d.ts +14 -0
- package/dist/core/http/router.js +113 -0
- package/dist/core/http/router.js.map +1 -0
- package/dist/core/logger/filters.d.ts +9 -0
- package/dist/core/logger/filters.js +134 -0
- package/dist/core/logger/filters.js.map +1 -0
- package/dist/core/logger/index.d.ts +3 -0
- package/dist/core/logger/index.js +26 -0
- package/dist/core/logger/index.js.map +1 -0
- package/dist/core/logger/logger.d.ts +49 -0
- package/dist/core/logger/logger.js +332 -0
- package/dist/core/logger/logger.js.map +1 -0
- package/dist/core/logger/outputs.d.ts +42 -0
- package/dist/core/logger/outputs.js +110 -0
- package/dist/core/logger/outputs.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +15 -0
- package/dist/core/middleware/built-in/adapters/cache/file.js +128 -0
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +5 -0
- package/dist/core/middleware/built-in/adapters/cache/index.js +28 -0
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +11 -0
- package/dist/core/middleware/built-in/adapters/cache/memory.js +65 -0
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +17 -0
- package/dist/core/middleware/built-in/adapters/cache/redis.js +91 -0
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +21 -0
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +40 -0
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +14 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +77 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +15 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +73 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +5 -0
- package/dist/core/middleware/built-in/adapters/cdn/index.js +28 -0
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -0
- package/dist/core/middleware/built-in/adapters/index.js +26 -0
- package/dist/core/middleware/built-in/adapters/index.js.map +1 -0
- package/dist/core/middleware/built-in/auth.d.ts +2 -0
- package/dist/core/middleware/built-in/auth.js +38 -0
- package/dist/core/middleware/built-in/auth.js.map +1 -0
- package/dist/core/middleware/built-in/cache.d.ts +3 -0
- package/dist/core/middleware/built-in/cache.js +188 -0
- package/dist/core/middleware/built-in/cache.js.map +1 -0
- package/dist/core/middleware/built-in/cdn.d.ts +3 -0
- package/dist/core/middleware/built-in/cdn.js +115 -0
- package/dist/core/middleware/built-in/cdn.js.map +1 -0
- package/dist/core/middleware/built-in/cookie.d.ts +14 -0
- package/dist/core/middleware/built-in/cookie.js +68 -0
- package/dist/core/middleware/built-in/cookie.js.map +1 -0
- package/dist/core/middleware/built-in/cors.d.ts +2 -0
- package/dist/core/middleware/built-in/cors.js +29 -0
- package/dist/core/middleware/built-in/cors.js.map +1 -0
- package/dist/core/middleware/built-in/csp.d.ts +22 -0
- package/dist/core/middleware/built-in/csp.js +74 -0
- package/dist/core/middleware/built-in/csp.js.map +1 -0
- package/dist/core/middleware/built-in/csrf.d.ts +9 -0
- package/dist/core/middleware/built-in/csrf.js +66 -0
- package/dist/core/middleware/built-in/csrf.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker.d.ts +1 -0
- package/dist/core/middleware/built-in/error-tracker.js +19 -0
- package/dist/core/middleware/built-in/error-tracker.js.map +1 -0
- package/dist/core/middleware/built-in/index.d.ts +70 -0
- package/dist/core/middleware/built-in/index.js +70 -0
- package/dist/core/middleware/built-in/index.js.map +1 -0
- package/dist/core/middleware/built-in/performance-monitor.d.ts +1 -0
- package/dist/core/middleware/built-in/performance-monitor.js +22 -0
- package/dist/core/middleware/built-in/performance-monitor.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit.d.ts +6 -0
- package/dist/core/middleware/built-in/rate-limit.js +47 -0
- package/dist/core/middleware/built-in/rate-limit.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger.d.ts +1 -0
- package/dist/core/middleware/built-in/request-logger.js +15 -0
- package/dist/core/middleware/built-in/request-logger.js.map +1 -0
- package/dist/core/middleware/built-in/session.d.ts +41 -0
- package/dist/core/middleware/built-in/session.js +209 -0
- package/dist/core/middleware/built-in/session.js.map +1 -0
- package/dist/core/middleware/built-in/sse.d.ts +6 -0
- package/dist/core/middleware/built-in/sse.js +73 -0
- package/dist/core/middleware/built-in/sse.js.map +1 -0
- package/dist/core/middleware/built-in/validation.d.ts +2 -0
- package/dist/core/middleware/built-in/validation.js +31 -0
- package/dist/core/middleware/built-in/validation.js.map +1 -0
- package/dist/core/middleware/index.d.ts +21 -0
- package/dist/core/middleware/index.js +152 -0
- package/dist/core/middleware/index.js.map +1 -0
- package/dist/core/modules/auto-discovery.d.ts +27 -0
- package/dist/core/modules/auto-discovery.js +255 -0
- package/dist/core/modules/auto-discovery.js.map +1 -0
- package/dist/core/modules/index.d.ts +2 -0
- package/dist/core/modules/index.js +11 -0
- package/dist/core/modules/index.js.map +1 -0
- package/dist/core/modules/modules.d.ts +10 -0
- package/dist/core/modules/modules.js +137 -0
- package/dist/core/modules/modules.js.map +1 -0
- package/dist/core/networking/index.d.ts +2 -0
- package/dist/core/networking/index.js +9 -0
- package/dist/core/networking/index.js.map +1 -0
- package/dist/core/networking/service-discovery.d.ts +38 -0
- package/dist/core/networking/service-discovery.js +233 -0
- package/dist/core/networking/service-discovery.js.map +1 -0
- package/dist/core/networking/websocket-manager.d.ts +27 -0
- package/dist/core/networking/websocket-manager.js +211 -0
- package/dist/core/networking/websocket-manager.js.map +1 -0
- package/dist/core/routing/app-integration.d.ts +42 -0
- package/dist/core/routing/app-integration.js +152 -0
- package/dist/core/routing/app-integration.js.map +1 -0
- package/dist/core/routing/index.d.ts +106 -0
- package/dist/core/routing/index.js +343 -0
- package/dist/core/routing/index.js.map +1 -0
- package/dist/core/runtime/aws-lambda-adapter.d.ts +43 -0
- package/dist/core/runtime/aws-lambda-adapter.js +108 -0
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -0
- package/dist/core/runtime/base-adapter.d.ts +16 -0
- package/dist/core/runtime/base-adapter.js +105 -0
- package/dist/core/runtime/base-adapter.js.map +1 -0
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +18 -0
- package/dist/core/runtime/cloudflare-workers-adapter.js +131 -0
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -0
- package/dist/core/runtime/index.d.ts +14 -0
- package/dist/core/runtime/index.js +56 -0
- package/dist/core/runtime/index.js.map +1 -0
- package/dist/core/runtime/node-adapter.d.ts +15 -0
- package/dist/core/runtime/node-adapter.js +204 -0
- package/dist/core/runtime/node-adapter.js.map +1 -0
- package/dist/core/runtime/vercel-edge-adapter.d.ts +10 -0
- package/dist/core/runtime/vercel-edge-adapter.js +106 -0
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -0
- package/dist/core/utilities/circuit-breaker.d.ts +14 -0
- package/dist/core/utilities/circuit-breaker.js +42 -0
- package/dist/core/utilities/circuit-breaker.js.map +1 -0
- package/dist/core/utilities/container.d.ts +116 -0
- package/dist/core/utilities/container.js +529 -0
- package/dist/core/utilities/container.js.map +1 -0
- package/dist/core/utilities/hooks.d.ts +24 -0
- package/dist/core/utilities/hooks.js +131 -0
- package/dist/core/utilities/hooks.js.map +1 -0
- package/dist/core/utilities/index.d.ts +4 -0
- package/dist/core/utilities/index.js +22 -0
- package/dist/core/utilities/index.js.map +1 -0
- package/dist/core/validation/index.d.ts +30 -0
- package/dist/core/validation/index.js +144 -0
- package/dist/core/validation/index.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/moro.d.ts +82 -0
- package/dist/moro.js +679 -0
- package/dist/moro.js.map +1 -0
- package/dist/types/cache.d.ts +34 -0
- package/dist/types/cache.js +3 -0
- package/dist/types/cache.js.map +1 -0
- package/dist/types/cdn.d.ts +19 -0
- package/dist/types/cdn.js +3 -0
- package/dist/types/cdn.js.map +1 -0
- package/dist/types/core.d.ts +13 -0
- package/dist/types/core.js +3 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/database.d.ts +29 -0
- package/dist/types/database.js +3 -0
- package/dist/types/database.js.map +1 -0
- package/dist/types/discovery.d.ts +6 -0
- package/dist/types/discovery.js +3 -0
- package/dist/types/discovery.js.map +1 -0
- package/dist/types/events.d.ts +116 -0
- package/dist/types/events.js +3 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/hooks.d.ts +38 -0
- package/dist/types/hooks.js +3 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/http.d.ts +51 -0
- package/dist/types/http.js +3 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/logger.d.ts +77 -0
- package/dist/types/logger.js +3 -0
- package/dist/types/logger.js.map +1 -0
- package/dist/types/module.d.ts +91 -0
- package/dist/types/module.js +3 -0
- package/dist/types/module.js.map +1 -0
- package/dist/types/runtime.d.ts +48 -0
- package/dist/types/runtime.js +3 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/session.d.ts +66 -0
- package/dist/types/session.js +3 -0
- package/dist/types/session.js.map +1 -0
- package/package.json +176 -0
- package/src/core/config/index.ts +47 -0
- package/src/core/config/loader.ts +366 -0
- package/src/core/config/schema.ts +346 -0
- package/src/core/config/utils.ts +220 -0
- package/src/core/database/README.md +228 -0
- package/src/core/database/adapters/drizzle.ts +425 -0
- package/src/core/database/adapters/index.ts +45 -0
- package/src/core/database/adapters/mongodb.ts +292 -0
- package/src/core/database/adapters/mysql.ts +217 -0
- package/src/core/database/adapters/postgresql.ts +211 -0
- package/src/core/database/adapters/redis.ts +331 -0
- package/src/core/database/adapters/sqlite.ts +255 -0
- package/src/core/database/index.ts +3 -0
- package/src/core/docs/index.ts +245 -0
- package/src/core/docs/openapi-generator.ts +588 -0
- package/src/core/docs/simple-docs.ts +305 -0
- package/src/core/docs/swagger-ui.ts +370 -0
- package/src/core/docs/zod-to-openapi.ts +532 -0
- package/src/core/events/event-bus.ts +249 -0
- package/src/core/events/index.ts +12 -0
- package/src/core/framework.ts +621 -0
- package/src/core/http/http-server.ts +1421 -0
- package/src/core/http/index.ts +11 -0
- package/src/core/http/router.ts +153 -0
- package/src/core/logger/filters.ts +148 -0
- package/src/core/logger/index.ts +20 -0
- package/src/core/logger/logger.ts +434 -0
- package/src/core/logger/outputs.ts +136 -0
- package/src/core/middleware/built-in/adapters/cache/file.ts +106 -0
- package/src/core/middleware/built-in/adapters/cache/index.ts +26 -0
- package/src/core/middleware/built-in/adapters/cache/memory.ts +73 -0
- package/src/core/middleware/built-in/adapters/cache/redis.ts +103 -0
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +68 -0
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +100 -0
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +92 -0
- package/src/core/middleware/built-in/adapters/cdn/index.ts +23 -0
- package/src/core/middleware/built-in/adapters/index.ts +7 -0
- package/src/core/middleware/built-in/auth.ts +39 -0
- package/src/core/middleware/built-in/cache.ts +228 -0
- package/src/core/middleware/built-in/cdn.ts +151 -0
- package/src/core/middleware/built-in/cookie.ts +90 -0
- package/src/core/middleware/built-in/cors.ts +38 -0
- package/src/core/middleware/built-in/csp.ts +107 -0
- package/src/core/middleware/built-in/csrf.ts +87 -0
- package/src/core/middleware/built-in/error-tracker.ts +16 -0
- package/src/core/middleware/built-in/index.ts +57 -0
- package/src/core/middleware/built-in/performance-monitor.ts +25 -0
- package/src/core/middleware/built-in/rate-limit.ts +60 -0
- package/src/core/middleware/built-in/request-logger.ts +14 -0
- package/src/core/middleware/built-in/session.ts +311 -0
- package/src/core/middleware/built-in/sse.ts +91 -0
- package/src/core/middleware/built-in/validation.ts +33 -0
- package/src/core/middleware/index.ts +188 -0
- package/src/core/modules/auto-discovery.ts +265 -0
- package/src/core/modules/index.ts +6 -0
- package/src/core/modules/modules.ts +125 -0
- package/src/core/networking/index.ts +7 -0
- package/src/core/networking/service-discovery.ts +309 -0
- package/src/core/networking/websocket-manager.ts +259 -0
- package/src/core/routing/app-integration.ts +229 -0
- package/src/core/routing/index.ts +519 -0
- package/src/core/runtime/aws-lambda-adapter.ts +157 -0
- package/src/core/runtime/base-adapter.ts +140 -0
- package/src/core/runtime/cloudflare-workers-adapter.ts +166 -0
- package/src/core/runtime/index.ts +74 -0
- package/src/core/runtime/node-adapter.ts +210 -0
- package/src/core/runtime/vercel-edge-adapter.ts +125 -0
- package/src/core/utilities/circuit-breaker.ts +46 -0
- package/src/core/utilities/container.ts +760 -0
- package/src/core/utilities/hooks.ts +148 -0
- package/src/core/utilities/index.ts +16 -0
- package/src/core/validation/index.ts +216 -0
- package/src/index.ts +120 -0
- package/src/moro.ts +842 -0
- package/src/types/cache.ts +38 -0
- package/src/types/cdn.ts +22 -0
- package/src/types/core.ts +17 -0
- package/src/types/database.ts +40 -0
- package/src/types/discovery.ts +7 -0
- package/src/types/events.ts +90 -0
- package/src/types/hooks.ts +47 -0
- package/src/types/http.ts +70 -0
- package/src/types/logger.ts +109 -0
- package/src/types/module.ts +87 -0
- package/src/types/runtime.ts +91 -0
- package/src/types/session.ts +89 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Memory Cache Adapter
|
|
2
|
+
import { CacheAdapter } from "../../../../../types/cache";
|
|
3
|
+
import { createFrameworkLogger } from "../../../../logger";
|
|
4
|
+
|
|
5
|
+
const logger = createFrameworkLogger("MemoryCacheAdapter");
|
|
6
|
+
|
|
7
|
+
export class MemoryCacheAdapter implements CacheAdapter {
|
|
8
|
+
private cache = new Map<string, { value: any; expires: number }>();
|
|
9
|
+
private timers = new Map<string, NodeJS.Timeout>();
|
|
10
|
+
|
|
11
|
+
async get(key: string): Promise<any> {
|
|
12
|
+
const item = this.cache.get(key);
|
|
13
|
+
if (!item) return null;
|
|
14
|
+
|
|
15
|
+
if (Date.now() > item.expires) {
|
|
16
|
+
await this.del(key);
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return item.value;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async set(key: string, value: any, ttl: number = 3600): Promise<void> {
|
|
24
|
+
const expires = Date.now() + ttl * 1000;
|
|
25
|
+
|
|
26
|
+
// Clear existing timer
|
|
27
|
+
const existingTimer = this.timers.get(key);
|
|
28
|
+
if (existingTimer) {
|
|
29
|
+
clearTimeout(existingTimer);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Set new value
|
|
33
|
+
this.cache.set(key, { value, expires });
|
|
34
|
+
|
|
35
|
+
// Set expiration timer
|
|
36
|
+
const timer = setTimeout(() => {
|
|
37
|
+
this.cache.delete(key);
|
|
38
|
+
this.timers.delete(key);
|
|
39
|
+
}, ttl * 1000);
|
|
40
|
+
|
|
41
|
+
this.timers.set(key, timer);
|
|
42
|
+
logger.debug(`Cached item: ${key} (TTL: ${ttl}s)`, "MemoryCache");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async del(key: string): Promise<void> {
|
|
46
|
+
this.cache.delete(key);
|
|
47
|
+
const timer = this.timers.get(key);
|
|
48
|
+
if (timer) {
|
|
49
|
+
clearTimeout(timer);
|
|
50
|
+
this.timers.delete(key);
|
|
51
|
+
}
|
|
52
|
+
logger.debug(`Deleted cache item: ${key}`, "MemoryCache");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async clear(): Promise<void> {
|
|
56
|
+
this.cache.clear();
|
|
57
|
+
this.timers.forEach((timer) => clearTimeout(timer));
|
|
58
|
+
this.timers.clear();
|
|
59
|
+
logger.debug("Cleared all cache items", "MemoryCache");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async exists(key: string): Promise<boolean> {
|
|
63
|
+
return this.cache.has(key) && Date.now() <= this.cache.get(key)!.expires;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async ttl(key: string): Promise<number> {
|
|
67
|
+
const item = this.cache.get(key);
|
|
68
|
+
if (!item) return -1;
|
|
69
|
+
|
|
70
|
+
const remaining = Math.floor((item.expires - Date.now()) / 1000);
|
|
71
|
+
return remaining > 0 ? remaining : -1;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// Redis Cache Adapter
|
|
2
|
+
import { CacheAdapter } from "../../../../../types/cache";
|
|
3
|
+
import { createFrameworkLogger } from "../../../../logger";
|
|
4
|
+
|
|
5
|
+
const logger = createFrameworkLogger("RedisCacheAdapter");
|
|
6
|
+
|
|
7
|
+
export class RedisCacheAdapter implements CacheAdapter {
|
|
8
|
+
private client: any;
|
|
9
|
+
|
|
10
|
+
constructor(
|
|
11
|
+
options: {
|
|
12
|
+
host?: string;
|
|
13
|
+
port?: number;
|
|
14
|
+
password?: string;
|
|
15
|
+
db?: number;
|
|
16
|
+
keyPrefix?: string;
|
|
17
|
+
} = {},
|
|
18
|
+
) {
|
|
19
|
+
try {
|
|
20
|
+
const redis = require("redis");
|
|
21
|
+
this.client = redis.createClient({
|
|
22
|
+
host: options.host || "localhost",
|
|
23
|
+
port: options.port || 6379,
|
|
24
|
+
password: options.password,
|
|
25
|
+
db: options.db || 0,
|
|
26
|
+
key_prefix: options.keyPrefix || "moro:cache:",
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
this.client.on("error", (err: Error) => {
|
|
30
|
+
logger.error("Redis cache error", "RedisCache", { error: err.message });
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
logger.info("Redis cache adapter initialized", "RedisCache");
|
|
34
|
+
} catch (error) {
|
|
35
|
+
logger.error(
|
|
36
|
+
"Redis not available, falling back to memory cache",
|
|
37
|
+
"RedisCache",
|
|
38
|
+
);
|
|
39
|
+
throw new Error("Redis package not installed. Run: npm install redis");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async get(key: string): Promise<any> {
|
|
44
|
+
try {
|
|
45
|
+
const value = await this.client.get(key);
|
|
46
|
+
return value ? JSON.parse(value) : null;
|
|
47
|
+
} catch (error) {
|
|
48
|
+
logger.error("Redis get error", "RedisCache", { key, error });
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async set(key: string, value: any, ttl: number = 3600): Promise<void> {
|
|
54
|
+
try {
|
|
55
|
+
const serialized = JSON.stringify(value);
|
|
56
|
+
if (ttl > 0) {
|
|
57
|
+
await this.client.setex(key, ttl, serialized);
|
|
58
|
+
} else {
|
|
59
|
+
await this.client.set(key, serialized);
|
|
60
|
+
}
|
|
61
|
+
logger.debug(`Cached item in Redis: ${key} (TTL: ${ttl}s)`, "RedisCache");
|
|
62
|
+
} catch (error) {
|
|
63
|
+
logger.error("Redis set error", "RedisCache", { key, error });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async del(key: string): Promise<void> {
|
|
68
|
+
try {
|
|
69
|
+
await this.client.del(key);
|
|
70
|
+
logger.debug(`Deleted Redis cache item: ${key}`, "RedisCache");
|
|
71
|
+
} catch (error) {
|
|
72
|
+
logger.error("Redis del error", "RedisCache", { key, error });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async clear(): Promise<void> {
|
|
77
|
+
try {
|
|
78
|
+
await this.client.flushdb();
|
|
79
|
+
logger.debug("Cleared all Redis cache items", "RedisCache");
|
|
80
|
+
} catch (error) {
|
|
81
|
+
logger.error("Redis clear error", "RedisCache", { error });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async exists(key: string): Promise<boolean> {
|
|
86
|
+
try {
|
|
87
|
+
const exists = await this.client.exists(key);
|
|
88
|
+
return exists === 1;
|
|
89
|
+
} catch (error) {
|
|
90
|
+
logger.error("Redis exists error", "RedisCache", { key, error });
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async ttl(key: string): Promise<number> {
|
|
96
|
+
try {
|
|
97
|
+
return await this.client.ttl(key);
|
|
98
|
+
} catch (error) {
|
|
99
|
+
logger.error("Redis TTL error", "RedisCache", { key, error });
|
|
100
|
+
return -1;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Azure CDN Adapter
|
|
2
|
+
import { CDNAdapter } from "../../../../../types/cdn";
|
|
3
|
+
import { createFrameworkLogger } from "../../../../logger";
|
|
4
|
+
|
|
5
|
+
const logger = createFrameworkLogger("AzureCDNAdapter");
|
|
6
|
+
|
|
7
|
+
export class AzureCDNAdapter implements CDNAdapter {
|
|
8
|
+
private endpoint: string;
|
|
9
|
+
private subscriptionId: string;
|
|
10
|
+
private resourceGroup: string;
|
|
11
|
+
private profileName: string;
|
|
12
|
+
private endpointName: string;
|
|
13
|
+
|
|
14
|
+
constructor(options: {
|
|
15
|
+
subscriptionId: string;
|
|
16
|
+
resourceGroup: string;
|
|
17
|
+
profileName: string;
|
|
18
|
+
endpointName: string;
|
|
19
|
+
endpoint: string;
|
|
20
|
+
clientId?: string;
|
|
21
|
+
clientSecret?: string;
|
|
22
|
+
tenantId?: string;
|
|
23
|
+
}) {
|
|
24
|
+
this.subscriptionId = options.subscriptionId;
|
|
25
|
+
this.resourceGroup = options.resourceGroup;
|
|
26
|
+
this.profileName = options.profileName;
|
|
27
|
+
this.endpointName = options.endpointName;
|
|
28
|
+
this.endpoint = options.endpoint;
|
|
29
|
+
|
|
30
|
+
logger.info("Azure CDN adapter initialized", "AzureCDN");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async purge(urls: string[]): Promise<void> {
|
|
34
|
+
try {
|
|
35
|
+
const purgeUrl = `https://management.azure.com/subscriptions/${this.subscriptionId}/resourceGroups/${this.resourceGroup}/providers/Microsoft.Cdn/profiles/${this.profileName}/endpoints/${this.endpointName}/purge`;
|
|
36
|
+
|
|
37
|
+
const purgeData = {
|
|
38
|
+
contentPaths: urls.map((url) =>
|
|
39
|
+
url.startsWith("/") ? url : `/${url}`,
|
|
40
|
+
),
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
logger.info(
|
|
44
|
+
`Azure CDN cache purge requested: ${urls.length} URLs`,
|
|
45
|
+
"AzureCDN",
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
// Implementation would use Azure SDK or REST API calls
|
|
49
|
+
// const response = await fetch(purgeUrl, { method: 'POST', body: JSON.stringify(purgeData) });
|
|
50
|
+
} catch (error) {
|
|
51
|
+
logger.error("Azure CDN purge failed", "AzureCDN", { error, urls });
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async prefetch(urls: string[]): Promise<void> {
|
|
57
|
+
logger.debug(
|
|
58
|
+
`Azure CDN prefetch requested for ${urls.length} URLs`,
|
|
59
|
+
"AzureCDN",
|
|
60
|
+
);
|
|
61
|
+
// Azure CDN prefetch implementation
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
setHeaders(response: any): void {
|
|
65
|
+
response.setHeader("Cache-Control", "public, max-age=3600");
|
|
66
|
+
response.setHeader("Azure-CDN-Edge-Location", "US-East");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Cloudflare CDN Adapter
|
|
2
|
+
import { CDNAdapter } from "../../../../../types/cdn";
|
|
3
|
+
import { createFrameworkLogger } from "../../../../logger";
|
|
4
|
+
|
|
5
|
+
const logger = createFrameworkLogger("CloudflareCDNAdapter");
|
|
6
|
+
|
|
7
|
+
export class CloudflareCDNAdapter implements CDNAdapter {
|
|
8
|
+
private apiToken: string;
|
|
9
|
+
private zoneId: string;
|
|
10
|
+
|
|
11
|
+
constructor(options: { apiToken: string; zoneId: string }) {
|
|
12
|
+
this.apiToken = options.apiToken;
|
|
13
|
+
this.zoneId = options.zoneId;
|
|
14
|
+
|
|
15
|
+
logger.info("Cloudflare CDN adapter initialized", "Cloudflare");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async purge(urls: string[]): Promise<void> {
|
|
19
|
+
try {
|
|
20
|
+
const response = await this.cfRequest(
|
|
21
|
+
"POST",
|
|
22
|
+
`/zones/${this.zoneId}/purge_cache`,
|
|
23
|
+
{
|
|
24
|
+
files: urls,
|
|
25
|
+
},
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
if (response.success) {
|
|
29
|
+
logger.info(
|
|
30
|
+
`Cloudflare cache purged: ${urls.length} URLs`,
|
|
31
|
+
"Cloudflare",
|
|
32
|
+
);
|
|
33
|
+
} else {
|
|
34
|
+
throw new Error("Cloudflare purge failed");
|
|
35
|
+
}
|
|
36
|
+
} catch (error) {
|
|
37
|
+
logger.error("Cloudflare purge failed", "Cloudflare", { error, urls });
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async prefetch(urls: string[]): Promise<void> {
|
|
43
|
+
try {
|
|
44
|
+
logger.debug(
|
|
45
|
+
`Cloudflare prefetch requested for ${urls.length} URLs`,
|
|
46
|
+
"Cloudflare",
|
|
47
|
+
);
|
|
48
|
+
// Cloudflare doesn't have direct prefetch, but we can use preload links
|
|
49
|
+
for (const url of urls) {
|
|
50
|
+
// Implementation would depend on Cloudflare Workers or edge functions
|
|
51
|
+
}
|
|
52
|
+
} catch (error) {
|
|
53
|
+
logger.error("Cloudflare prefetch failed", "Cloudflare", { error, urls });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async getStats(): Promise<any> {
|
|
58
|
+
try {
|
|
59
|
+
const response = await this.cfRequest(
|
|
60
|
+
"GET",
|
|
61
|
+
`/zones/${this.zoneId}/analytics/dashboard`,
|
|
62
|
+
);
|
|
63
|
+
return response.result;
|
|
64
|
+
} catch (error) {
|
|
65
|
+
logger.error("Cloudflare stats failed", "Cloudflare", { error });
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
setHeaders(response: any): void {
|
|
71
|
+
response.setHeader("Cache-Control", "public, max-age=3600");
|
|
72
|
+
response.setHeader("CF-Cache-Status", "DYNAMIC");
|
|
73
|
+
response.setHeader("CF-Ray", `${Math.random().toString(36)}-DFW`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private async cfRequest(
|
|
77
|
+
method: string,
|
|
78
|
+
endpoint: string,
|
|
79
|
+
data?: any,
|
|
80
|
+
): Promise<any> {
|
|
81
|
+
const url = `https://api.cloudflare.com/client/v4${endpoint}`;
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
// In a real implementation, you'd use fetch or axios
|
|
85
|
+
const response = {
|
|
86
|
+
success: true,
|
|
87
|
+
result: data || {},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
return response;
|
|
91
|
+
} catch (error) {
|
|
92
|
+
logger.error("Cloudflare API request failed", "Cloudflare", {
|
|
93
|
+
error,
|
|
94
|
+
method,
|
|
95
|
+
endpoint,
|
|
96
|
+
});
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// AWS CloudFront CDN Adapter
|
|
2
|
+
import { CDNAdapter } from "../../../../../types/cdn";
|
|
3
|
+
import { createFrameworkLogger } from "../../../../logger";
|
|
4
|
+
|
|
5
|
+
const logger = createFrameworkLogger("CloudFrontCDNAdapter");
|
|
6
|
+
|
|
7
|
+
export class CloudFrontCDNAdapter implements CDNAdapter {
|
|
8
|
+
private cloudfront: any;
|
|
9
|
+
private distributionId: string;
|
|
10
|
+
|
|
11
|
+
constructor(options: {
|
|
12
|
+
accessKeyId: string;
|
|
13
|
+
secretAccessKey: string;
|
|
14
|
+
region: string;
|
|
15
|
+
distributionId: string;
|
|
16
|
+
}) {
|
|
17
|
+
this.distributionId = options.distributionId;
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
const AWS = require("aws-sdk");
|
|
21
|
+
AWS.config.update({
|
|
22
|
+
accessKeyId: options.accessKeyId,
|
|
23
|
+
secretAccessKey: options.secretAccessKey,
|
|
24
|
+
region: options.region,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
this.cloudfront = new AWS.CloudFront();
|
|
28
|
+
logger.info("CloudFront CDN adapter initialized", "CloudFront");
|
|
29
|
+
} catch (error) {
|
|
30
|
+
logger.error("AWS SDK not available", "CloudFront");
|
|
31
|
+
throw new Error("AWS SDK not installed. Run: npm install aws-sdk");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async purge(urls: string[]): Promise<void> {
|
|
36
|
+
try {
|
|
37
|
+
const params = {
|
|
38
|
+
DistributionId: this.distributionId,
|
|
39
|
+
InvalidationBatch: {
|
|
40
|
+
CallerReference: `moro-${Date.now()}`,
|
|
41
|
+
Paths: {
|
|
42
|
+
Quantity: urls.length,
|
|
43
|
+
Items: urls.map((url) => (url.startsWith("/") ? url : `/${url}`)),
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const result = await this.cloudfront.createInvalidation(params).promise();
|
|
49
|
+
logger.info(
|
|
50
|
+
`CloudFront cache purged: ${urls.length} URLs`,
|
|
51
|
+
"CloudFront",
|
|
52
|
+
{
|
|
53
|
+
invalidationId: result.Invalidation.Id,
|
|
54
|
+
},
|
|
55
|
+
);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
logger.error("CloudFront purge failed", "CloudFront", { error, urls });
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async prefetch(urls: string[]): Promise<void> {
|
|
63
|
+
logger.debug(
|
|
64
|
+
`CloudFront prefetch requested for ${urls.length} URLs`,
|
|
65
|
+
"CloudFront",
|
|
66
|
+
);
|
|
67
|
+
// CloudFront doesn't have direct prefetch, but we can simulate with requests
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async getStats(): Promise<any> {
|
|
71
|
+
try {
|
|
72
|
+
const params = { Id: this.distributionId };
|
|
73
|
+
const distribution = await this.cloudfront
|
|
74
|
+
.getDistribution(params)
|
|
75
|
+
.promise();
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
status: distribution.Distribution.Status,
|
|
79
|
+
domainName: distribution.Distribution.DomainName,
|
|
80
|
+
enabled: distribution.Distribution.DistributionConfig.Enabled,
|
|
81
|
+
};
|
|
82
|
+
} catch (error) {
|
|
83
|
+
logger.error("CloudFront stats failed", "CloudFront", { error });
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
setHeaders(response: any): void {
|
|
89
|
+
response.setHeader("Cache-Control", "public, max-age=3600");
|
|
90
|
+
response.setHeader("CloudFront-Viewer-Country", "US");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// CDN Adapters
|
|
2
|
+
export { CloudflareCDNAdapter } from "./cloudflare";
|
|
3
|
+
export { CloudFrontCDNAdapter } from "./cloudfront";
|
|
4
|
+
export { AzureCDNAdapter } from "./azure";
|
|
5
|
+
|
|
6
|
+
import { CloudflareCDNAdapter } from "./cloudflare";
|
|
7
|
+
import { CloudFrontCDNAdapter } from "./cloudfront";
|
|
8
|
+
import { AzureCDNAdapter } from "./azure";
|
|
9
|
+
import { CDNAdapter } from "../../../../../types/cdn";
|
|
10
|
+
|
|
11
|
+
// Adapter factory function for auto-loading
|
|
12
|
+
export function createCDNAdapter(type: string, options: any = {}): CDNAdapter {
|
|
13
|
+
switch (type.toLowerCase()) {
|
|
14
|
+
case "cloudflare":
|
|
15
|
+
return new CloudflareCDNAdapter(options);
|
|
16
|
+
case "cloudfront":
|
|
17
|
+
return new CloudFrontCDNAdapter(options);
|
|
18
|
+
case "azure":
|
|
19
|
+
return new AzureCDNAdapter(options);
|
|
20
|
+
default:
|
|
21
|
+
throw new Error(`Unknown CDN adapter type: ${type}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Authentication Middleware
|
|
2
|
+
import { MiddlewareInterface, HookContext } from "../../../types/hooks";
|
|
3
|
+
import { createFrameworkLogger } from "../../logger";
|
|
4
|
+
|
|
5
|
+
const logger = createFrameworkLogger("AuthMiddleware");
|
|
6
|
+
|
|
7
|
+
export const auth = (options: any = {}): MiddlewareInterface => ({
|
|
8
|
+
name: "auth",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
metadata: {
|
|
11
|
+
name: "auth",
|
|
12
|
+
version: "1.0.0",
|
|
13
|
+
description: "JWT authentication middleware with token validation",
|
|
14
|
+
author: "MoroJS Team",
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
install: async (hooks: any, options: any = {}) => {
|
|
18
|
+
logger.debug(`Installing auth middleware with options`, "Installation", {
|
|
19
|
+
options,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
hooks.before("request", async (context: HookContext) => {
|
|
23
|
+
const req = context.request as any;
|
|
24
|
+
const token = req.headers?.authorization?.replace("Bearer ", "");
|
|
25
|
+
|
|
26
|
+
if (token) {
|
|
27
|
+
try {
|
|
28
|
+
// Simple token validation (in production, use proper JWT verification)
|
|
29
|
+
if (token.startsWith("valid_")) {
|
|
30
|
+
req.user = { id: 1, role: "user" };
|
|
31
|
+
logger.debug(`Auth: Verified token for request`, "TokenValidation");
|
|
32
|
+
}
|
|
33
|
+
} catch (error) {
|
|
34
|
+
throw new Error("Invalid token");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
});
|