@morojs/moro 1.0.0 → 1.0.2
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 +1 -1
- package/dist/core/config/index.d.ts +5 -5
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +58 -82
- package/dist/core/config/loader.js.map +1 -1
- package/dist/core/config/schema.d.ts +1 -1
- package/dist/core/config/schema.js +52 -111
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +2 -2
- package/dist/core/config/utils.js +18 -18
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +39 -55
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +11 -11
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -1
- package/dist/core/database/adapters/mongodb.js +19 -23
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -1
- package/dist/core/database/adapters/mysql.js +31 -27
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +1 -1
- package/dist/core/database/adapters/postgresql.js +27 -35
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -1
- package/dist/core/database/adapters/redis.js +24 -24
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -1
- package/dist/core/database/adapters/sqlite.js +36 -36
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/docs/index.d.ts +7 -7
- package/dist/core/docs/index.js +13 -15
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +5 -5
- package/dist/core/docs/openapi-generator.js +93 -94
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +25 -28
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +46 -51
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.d.ts +1 -1
- package/dist/core/docs/zod-to-openapi.js +115 -125
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +15 -21
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/framework.d.ts +5 -5
- package/dist/core/framework.js +55 -60
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +2 -2
- package/dist/core/http/http-server.js +228 -261
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -3
- package/dist/core/http/router.d.ts +1 -1
- package/dist/core/http/router.js +15 -17
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +16 -16
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/logger.d.ts +1 -1
- package/dist/core/logger/logger.js +48 -59
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +4 -4
- package/dist/core/logger/outputs.js +16 -20
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +19 -19
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +5 -5
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +18 -18
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +8 -8
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +14 -14
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +13 -15
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/auth.d.ts +1 -1
- package/dist/core/middleware/built-in/auth.js +14 -14
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +43 -45
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +27 -29
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +2 -2
- package/dist/core/middleware/built-in/cookie.js +17 -17
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +13 -13
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +22 -25
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +21 -24
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +2 -2
- package/dist/core/middleware/built-in/index.d.ts +14 -14
- package/dist/core/middleware/built-in/performance-monitor.js +2 -2
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +12 -12
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +5 -5
- package/dist/core/middleware/built-in/session.js +35 -38
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +20 -22
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +13 -13
- package/dist/core/middleware/index.d.ts +5 -5
- package/dist/core/middleware/index.js +16 -16
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -2
- package/dist/core/modules/auto-discovery.js +12 -13
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +3 -6
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.d.ts +2 -2
- package/dist/core/networking/service-discovery.js +27 -27
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +15 -16
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +13 -13
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +3 -3
- package/dist/core/routing/index.js +43 -52
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +14 -16
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +11 -12
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +20 -21
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +9 -9
- package/dist/core/runtime/index.js +4 -4
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +5 -5
- package/dist/core/runtime/node-adapter.js +35 -35
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +12 -15
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +6 -6
- package/dist/core/utilities/container.d.ts +1 -1
- package/dist/core/utilities/container.js +17 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +3 -3
- package/dist/core/utilities/hooks.js +11 -11
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -4
- package/dist/core/validation/index.d.ts +3 -3
- package/dist/core/validation/index.js +15 -15
- package/dist/core/validation/index.js.map +1 -1
- package/dist/index.d.ts +41 -30
- package/dist/index.js +50 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +14 -14
- package/dist/moro.js +79 -88
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +1 -1
- package/dist/types/core.d.ts +2 -2
- package/dist/types/events.d.ts +19 -19
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/http.d.ts +2 -2
- package/dist/types/logger.d.ts +3 -3
- package/dist/types/module.d.ts +2 -2
- package/dist/types/runtime.d.ts +2 -2
- package/dist/types/session.d.ts +4 -4
- package/package.json +183 -165
- package/src/core/config/index.ts +7 -9
- package/src/core/config/loader.ts +86 -158
- package/src/core/config/schema.ts +59 -122
- package/src/core/config/utils.ts +27 -45
- package/src/core/database/adapters/drizzle.ts +53 -75
- package/src/core/database/adapters/index.ts +26 -29
- package/src/core/database/adapters/mongodb.ts +31 -54
- package/src/core/database/adapters/mysql.ts +40 -50
- package/src/core/database/adapters/postgresql.ts +32 -42
- package/src/core/database/adapters/redis.ts +31 -36
- package/src/core/database/adapters/sqlite.ts +43 -51
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +25 -39
- package/src/core/docs/openapi-generator.ts +104 -117
- package/src/core/docs/simple-docs.ts +29 -39
- package/src/core/docs/swagger-ui.ts +57 -76
- package/src/core/docs/zod-to-openapi.ts +121 -153
- package/src/core/events/event-bus.ts +22 -45
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +119 -197
- package/src/core/http/http-server.ts +260 -360
- package/src/core/http/index.ts +3 -8
- package/src/core/http/router.ts +19 -31
- package/src/core/logger/filters.ts +19 -22
- package/src/core/logger/index.ts +3 -3
- package/src/core/logger/logger.ts +59 -100
- package/src/core/logger/outputs.ts +23 -27
- package/src/core/middleware/built-in/adapters/cache/file.ts +21 -23
- package/src/core/middleware/built-in/adapters/cache/index.ts +11 -14
- package/src/core/middleware/built-in/adapters/cache/memory.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/redis.ts +21 -24
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +10 -18
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +19 -36
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +17 -26
- package/src/core/middleware/built-in/adapters/cdn/index.ts +10 -10
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth.ts +16 -16
- package/src/core/middleware/built-in/cache.ts +50 -67
- package/src/core/middleware/built-in/cdn.ts +34 -61
- package/src/core/middleware/built-in/cookie.ts +23 -28
- package/src/core/middleware/built-in/cors.ts +17 -17
- package/src/core/middleware/built-in/csp.ts +25 -31
- package/src/core/middleware/built-in/csrf.ts +24 -29
- package/src/core/middleware/built-in/error-tracker.ts +3 -3
- package/src/core/middleware/built-in/index.ts +28 -28
- package/src/core/middleware/built-in/performance-monitor.ts +4 -4
- package/src/core/middleware/built-in/rate-limit.ts +15 -15
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +47 -70
- package/src/core/middleware/built-in/sse.ts +23 -28
- package/src/core/middleware/built-in/validation.ts +15 -15
- package/src/core/middleware/index.ts +26 -37
- package/src/core/modules/auto-discovery.ts +21 -31
- package/src/core/modules/index.ts +2 -5
- package/src/core/modules/modules.ts +11 -20
- package/src/core/networking/index.ts +2 -6
- package/src/core/networking/service-discovery.ts +41 -61
- package/src/core/networking/websocket-manager.ts +27 -36
- package/src/core/routing/app-integration.ts +19 -32
- package/src/core/routing/index.ts +57 -88
- package/src/core/runtime/aws-lambda-adapter.ts +20 -30
- package/src/core/runtime/base-adapter.ts +17 -27
- package/src/core/runtime/cloudflare-workers-adapter.ts +28 -42
- package/src/core/runtime/index.ts +21 -33
- package/src/core/runtime/node-adapter.ts +59 -73
- package/src/core/runtime/vercel-edge-adapter.ts +18 -29
- package/src/core/utilities/circuit-breaker.ts +7 -7
- package/src/core/utilities/container.ts +52 -89
- package/src/core/utilities/hooks.ts +17 -23
- package/src/core/utilities/index.ts +4 -4
- package/src/core/validation/index.ts +25 -51
- package/src/index.ts +104 -60
- package/src/moro.ts +119 -191
- package/src/types/cache.ts +1 -1
- package/src/types/core.ts +2 -2
- package/src/types/database.ts +2 -10
- package/src/types/events.ts +23 -31
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +5 -8
- package/src/types/logger.ts +7 -23
- package/src/types/module.ts +2 -2
- package/src/types/runtime.ts +6 -21
- package/src/types/session.ts +4 -4
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
// Advanced Logger Outputs
|
|
2
|
-
import { writeFile, appendFile, mkdir } from
|
|
3
|
-
import { join, dirname } from
|
|
4
|
-
import { LogEntry, LogOutput } from
|
|
2
|
+
import { writeFile, appendFile, mkdir } from 'fs/promises';
|
|
3
|
+
import { join, dirname } from 'path';
|
|
4
|
+
import { LogEntry, LogOutput } from '../../types/logger';
|
|
5
5
|
|
|
6
6
|
// File output for persistent logging
|
|
7
7
|
export class FileOutput implements LogOutput {
|
|
8
|
-
name =
|
|
8
|
+
name = 'file';
|
|
9
9
|
|
|
10
10
|
constructor(
|
|
11
11
|
private filePath: string,
|
|
12
12
|
private options: {
|
|
13
|
-
format?:
|
|
13
|
+
format?: 'json' | 'pretty';
|
|
14
14
|
maxSize?: number; // MB
|
|
15
15
|
rotate?: boolean;
|
|
16
|
-
} = {}
|
|
16
|
+
} = {}
|
|
17
17
|
) {}
|
|
18
18
|
|
|
19
19
|
async write(entry: LogEntry): Promise<void> {
|
|
@@ -21,28 +21,26 @@ export class FileOutput implements LogOutput {
|
|
|
21
21
|
// Ensure directory exists
|
|
22
22
|
await mkdir(dirname(this.filePath), { recursive: true });
|
|
23
23
|
|
|
24
|
-
const format = this.options.format ||
|
|
24
|
+
const format = this.options.format || 'json';
|
|
25
25
|
const line =
|
|
26
|
-
format ===
|
|
27
|
-
? JSON.stringify(entry) + "\n"
|
|
28
|
-
: this.formatPretty(entry) + "\n";
|
|
26
|
+
format === 'json' ? JSON.stringify(entry) + '\n' : this.formatPretty(entry) + '\n';
|
|
29
27
|
|
|
30
|
-
await appendFile(this.filePath, line,
|
|
28
|
+
await appendFile(this.filePath, line, 'utf8');
|
|
31
29
|
|
|
32
30
|
// TODO: Implement log rotation if needed
|
|
33
31
|
} catch (error) {
|
|
34
|
-
console.error(
|
|
32
|
+
console.error('File logger error:', error);
|
|
35
33
|
}
|
|
36
34
|
}
|
|
37
35
|
|
|
38
36
|
private formatPretty(entry: LogEntry): string {
|
|
39
37
|
const timestamp = entry.timestamp.toISOString();
|
|
40
38
|
const level = entry.level.toUpperCase().padEnd(5);
|
|
41
|
-
const context = entry.context ? `[${entry.context}] ` :
|
|
39
|
+
const context = entry.context ? `[${entry.context}] ` : '';
|
|
42
40
|
const metadata =
|
|
43
41
|
entry.metadata && Object.keys(entry.metadata).length > 0
|
|
44
42
|
? ` ${JSON.stringify(entry.metadata)}`
|
|
45
|
-
:
|
|
43
|
+
: '';
|
|
46
44
|
|
|
47
45
|
return `${timestamp} ${level} ${context}${entry.message}${metadata}`;
|
|
48
46
|
}
|
|
@@ -50,7 +48,7 @@ export class FileOutput implements LogOutput {
|
|
|
50
48
|
|
|
51
49
|
// HTTP webhook output for external logging services
|
|
52
50
|
export class WebhookOutput implements LogOutput {
|
|
53
|
-
name =
|
|
51
|
+
name = 'webhook';
|
|
54
52
|
|
|
55
53
|
constructor(
|
|
56
54
|
private url: string,
|
|
@@ -59,15 +57,15 @@ export class WebhookOutput implements LogOutput {
|
|
|
59
57
|
batch?: boolean;
|
|
60
58
|
batchSize?: number;
|
|
61
59
|
timeout?: number;
|
|
62
|
-
} = {}
|
|
60
|
+
} = {}
|
|
63
61
|
) {}
|
|
64
62
|
|
|
65
63
|
async write(entry: LogEntry): Promise<void> {
|
|
66
64
|
try {
|
|
67
65
|
const response = await fetch(this.url, {
|
|
68
|
-
method:
|
|
66
|
+
method: 'POST',
|
|
69
67
|
headers: {
|
|
70
|
-
|
|
68
|
+
'Content-Type': 'application/json',
|
|
71
69
|
...this.options.headers,
|
|
72
70
|
},
|
|
73
71
|
body: JSON.stringify(entry),
|
|
@@ -78,14 +76,14 @@ export class WebhookOutput implements LogOutput {
|
|
|
78
76
|
throw new Error(`Webhook failed: ${response.status}`);
|
|
79
77
|
}
|
|
80
78
|
} catch (error) {
|
|
81
|
-
console.error(
|
|
79
|
+
console.error('Webhook logger error:', error);
|
|
82
80
|
}
|
|
83
81
|
}
|
|
84
82
|
}
|
|
85
83
|
|
|
86
84
|
// Memory buffer output for testing and debugging
|
|
87
85
|
export class MemoryOutput implements LogOutput {
|
|
88
|
-
name =
|
|
86
|
+
name = 'memory';
|
|
89
87
|
private buffer: LogEntry[] = [];
|
|
90
88
|
|
|
91
89
|
constructor(private maxSize: number = 1000) {}
|
|
@@ -108,21 +106,19 @@ export class MemoryOutput implements LogOutput {
|
|
|
108
106
|
|
|
109
107
|
// Stream output for custom processing
|
|
110
108
|
export class StreamOutput implements LogOutput {
|
|
111
|
-
name =
|
|
112
|
-
format?:
|
|
109
|
+
name = 'stream';
|
|
110
|
+
format?: 'pretty' | 'json' | 'compact';
|
|
113
111
|
|
|
114
112
|
constructor(
|
|
115
113
|
private stream: NodeJS.WritableStream,
|
|
116
|
-
format:
|
|
114
|
+
format: 'json' | 'pretty' = 'json'
|
|
117
115
|
) {
|
|
118
116
|
this.format = format;
|
|
119
117
|
}
|
|
120
118
|
|
|
121
119
|
write(entry: LogEntry): void {
|
|
122
120
|
const data =
|
|
123
|
-
this.format ===
|
|
124
|
-
? JSON.stringify(entry) + "\n"
|
|
125
|
-
: this.formatPretty(entry) + "\n";
|
|
121
|
+
this.format === 'json' ? JSON.stringify(entry) + '\n' : this.formatPretty(entry) + '\n';
|
|
126
122
|
|
|
127
123
|
this.stream.write(data);
|
|
128
124
|
}
|
|
@@ -130,7 +126,7 @@ export class StreamOutput implements LogOutput {
|
|
|
130
126
|
private formatPretty(entry: LogEntry): string {
|
|
131
127
|
const timestamp = entry.timestamp.toISOString();
|
|
132
128
|
const level = entry.level.toUpperCase().padEnd(5);
|
|
133
|
-
const context = entry.context ? `[${entry.context}] ` :
|
|
129
|
+
const context = entry.context ? `[${entry.context}] ` : '';
|
|
134
130
|
return `${timestamp} ${level} ${context}${entry.message}`;
|
|
135
131
|
}
|
|
136
132
|
}
|
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
// File System Cache Adapter
|
|
2
|
-
import { CacheAdapter } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { CacheAdapter } from '../../../../../types/cache';
|
|
3
|
+
import { createFrameworkLogger } from '../../../../logger';
|
|
4
4
|
|
|
5
|
-
const logger = createFrameworkLogger(
|
|
5
|
+
const logger = createFrameworkLogger('FileCacheAdapter');
|
|
6
6
|
|
|
7
7
|
export class FileCacheAdapter implements CacheAdapter {
|
|
8
8
|
private cacheDir: string;
|
|
9
9
|
|
|
10
10
|
constructor(options: { cacheDir?: string } = {}) {
|
|
11
|
-
this.cacheDir = options.cacheDir ||
|
|
11
|
+
this.cacheDir = options.cacheDir || './cache';
|
|
12
12
|
this.ensureCacheDir();
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
private async ensureCacheDir(): Promise<void> {
|
|
16
|
-
const fs = await import(
|
|
16
|
+
const fs = await import('fs/promises');
|
|
17
17
|
try {
|
|
18
18
|
await fs.mkdir(this.cacheDir, { recursive: true });
|
|
19
19
|
} catch (error) {
|
|
20
|
-
logger.error(
|
|
20
|
+
logger.error('Failed to create cache directory', 'FileCache', { error });
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
private getFilePath(key: string): string {
|
|
25
|
-
const crypto = require(
|
|
26
|
-
const hash = crypto.createHash(
|
|
25
|
+
const crypto = require('crypto');
|
|
26
|
+
const hash = crypto.createHash('md5').update(key).digest('hex');
|
|
27
27
|
return `${this.cacheDir}/${hash}.json`;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
async get(key: string): Promise<any> {
|
|
31
31
|
try {
|
|
32
|
-
const fs = await import(
|
|
32
|
+
const fs = await import('fs/promises');
|
|
33
33
|
const filePath = this.getFilePath(key);
|
|
34
|
-
const data = await fs.readFile(filePath,
|
|
34
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
35
35
|
const parsed = JSON.parse(data);
|
|
36
36
|
|
|
37
37
|
if (Date.now() > parsed.expires) {
|
|
@@ -47,24 +47,24 @@ export class FileCacheAdapter implements CacheAdapter {
|
|
|
47
47
|
|
|
48
48
|
async set(key: string, value: any, ttl: number = 3600): Promise<void> {
|
|
49
49
|
try {
|
|
50
|
-
const fs = await import(
|
|
50
|
+
const fs = await import('fs/promises');
|
|
51
51
|
const filePath = this.getFilePath(key);
|
|
52
52
|
const expires = Date.now() + ttl * 1000;
|
|
53
53
|
const data = JSON.stringify({ value, expires });
|
|
54
54
|
|
|
55
55
|
await fs.writeFile(filePath, data);
|
|
56
|
-
logger.debug(`Cached item to file: ${key} (TTL: ${ttl}s)`,
|
|
56
|
+
logger.debug(`Cached item to file: ${key} (TTL: ${ttl}s)`, 'FileCache');
|
|
57
57
|
} catch (error) {
|
|
58
|
-
logger.error(
|
|
58
|
+
logger.error('File cache set error', 'FileCache', { key, error });
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
async del(key: string): Promise<void> {
|
|
63
63
|
try {
|
|
64
|
-
const fs = await import(
|
|
64
|
+
const fs = await import('fs/promises');
|
|
65
65
|
const filePath = this.getFilePath(key);
|
|
66
66
|
await fs.unlink(filePath);
|
|
67
|
-
logger.debug(`Deleted file cache item: ${key}`,
|
|
67
|
+
logger.debug(`Deleted file cache item: ${key}`, 'FileCache');
|
|
68
68
|
} catch (error) {
|
|
69
69
|
// File might not exist, which is okay
|
|
70
70
|
}
|
|
@@ -72,16 +72,14 @@ export class FileCacheAdapter implements CacheAdapter {
|
|
|
72
72
|
|
|
73
73
|
async clear(): Promise<void> {
|
|
74
74
|
try {
|
|
75
|
-
const fs = await import(
|
|
75
|
+
const fs = await import('fs/promises');
|
|
76
76
|
const files = await fs.readdir(this.cacheDir);
|
|
77
77
|
|
|
78
|
-
await Promise.all(
|
|
79
|
-
files.map((file) => fs.unlink(`${this.cacheDir}/${file}`)),
|
|
80
|
-
);
|
|
78
|
+
await Promise.all(files.map(file => fs.unlink(`${this.cacheDir}/${file}`)));
|
|
81
79
|
|
|
82
|
-
logger.debug(
|
|
80
|
+
logger.debug('Cleared all file cache items', 'FileCache');
|
|
83
81
|
} catch (error) {
|
|
84
|
-
logger.error(
|
|
82
|
+
logger.error('File cache clear error', 'FileCache', { error });
|
|
85
83
|
}
|
|
86
84
|
}
|
|
87
85
|
|
|
@@ -92,9 +90,9 @@ export class FileCacheAdapter implements CacheAdapter {
|
|
|
92
90
|
|
|
93
91
|
async ttl(key: string): Promise<number> {
|
|
94
92
|
try {
|
|
95
|
-
const fs = await import(
|
|
93
|
+
const fs = await import('fs/promises');
|
|
96
94
|
const filePath = this.getFilePath(key);
|
|
97
|
-
const data = await fs.readFile(filePath,
|
|
95
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
98
96
|
const parsed = JSON.parse(data);
|
|
99
97
|
|
|
100
98
|
const remaining = Math.floor((parsed.expires - Date.now()) / 1000);
|
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
// Cache Adapters
|
|
2
|
-
export { MemoryCacheAdapter } from
|
|
3
|
-
export { RedisCacheAdapter } from
|
|
4
|
-
export { FileCacheAdapter } from
|
|
2
|
+
export { MemoryCacheAdapter } from './memory';
|
|
3
|
+
export { RedisCacheAdapter } from './redis';
|
|
4
|
+
export { FileCacheAdapter } from './file';
|
|
5
5
|
|
|
6
|
-
import { MemoryCacheAdapter } from
|
|
7
|
-
import { RedisCacheAdapter } from
|
|
8
|
-
import { FileCacheAdapter } from
|
|
9
|
-
import { CacheAdapter } from
|
|
6
|
+
import { MemoryCacheAdapter } from './memory';
|
|
7
|
+
import { RedisCacheAdapter } from './redis';
|
|
8
|
+
import { FileCacheAdapter } from './file';
|
|
9
|
+
import { CacheAdapter } from '../../../../../types/cache';
|
|
10
10
|
|
|
11
11
|
// Adapter factory function for auto-loading
|
|
12
|
-
export function createCacheAdapter(
|
|
13
|
-
type: string,
|
|
14
|
-
options: any = {},
|
|
15
|
-
): CacheAdapter {
|
|
12
|
+
export function createCacheAdapter(type: string, options: any = {}): CacheAdapter {
|
|
16
13
|
switch (type.toLowerCase()) {
|
|
17
|
-
case
|
|
14
|
+
case 'memory':
|
|
18
15
|
return new MemoryCacheAdapter();
|
|
19
|
-
case
|
|
16
|
+
case 'redis':
|
|
20
17
|
return new RedisCacheAdapter(options);
|
|
21
|
-
case
|
|
18
|
+
case 'file':
|
|
22
19
|
return new FileCacheAdapter(options);
|
|
23
20
|
default:
|
|
24
21
|
throw new Error(`Unknown cache adapter type: ${type}`);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Memory Cache Adapter
|
|
2
|
-
import { CacheAdapter } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { CacheAdapter } from '../../../../../types/cache';
|
|
3
|
+
import { createFrameworkLogger } from '../../../../logger';
|
|
4
4
|
|
|
5
|
-
const logger = createFrameworkLogger(
|
|
5
|
+
const logger = createFrameworkLogger('MemoryCacheAdapter');
|
|
6
6
|
|
|
7
7
|
export class MemoryCacheAdapter implements CacheAdapter {
|
|
8
8
|
private cache = new Map<string, { value: any; expires: number }>();
|
|
@@ -39,7 +39,7 @@ export class MemoryCacheAdapter implements CacheAdapter {
|
|
|
39
39
|
}, ttl * 1000);
|
|
40
40
|
|
|
41
41
|
this.timers.set(key, timer);
|
|
42
|
-
logger.debug(`Cached item: ${key} (TTL: ${ttl}s)`,
|
|
42
|
+
logger.debug(`Cached item: ${key} (TTL: ${ttl}s)`, 'MemoryCache');
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
async del(key: string): Promise<void> {
|
|
@@ -49,14 +49,14 @@ export class MemoryCacheAdapter implements CacheAdapter {
|
|
|
49
49
|
clearTimeout(timer);
|
|
50
50
|
this.timers.delete(key);
|
|
51
51
|
}
|
|
52
|
-
logger.debug(`Deleted cache item: ${key}`,
|
|
52
|
+
logger.debug(`Deleted cache item: ${key}`, 'MemoryCache');
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
async clear(): Promise<void> {
|
|
56
56
|
this.cache.clear();
|
|
57
|
-
this.timers.forEach(
|
|
57
|
+
this.timers.forEach(timer => clearTimeout(timer));
|
|
58
58
|
this.timers.clear();
|
|
59
|
-
logger.debug(
|
|
59
|
+
logger.debug('Cleared all cache items', 'MemoryCache');
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
async exists(key: string): Promise<boolean> {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Redis Cache Adapter
|
|
2
|
-
import { CacheAdapter } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { CacheAdapter } from '../../../../../types/cache';
|
|
3
|
+
import { createFrameworkLogger } from '../../../../logger';
|
|
4
4
|
|
|
5
|
-
const logger = createFrameworkLogger(
|
|
5
|
+
const logger = createFrameworkLogger('RedisCacheAdapter');
|
|
6
6
|
|
|
7
7
|
export class RedisCacheAdapter implements CacheAdapter {
|
|
8
8
|
private client: any;
|
|
@@ -14,29 +14,26 @@ export class RedisCacheAdapter implements CacheAdapter {
|
|
|
14
14
|
password?: string;
|
|
15
15
|
db?: number;
|
|
16
16
|
keyPrefix?: string;
|
|
17
|
-
} = {}
|
|
17
|
+
} = {}
|
|
18
18
|
) {
|
|
19
19
|
try {
|
|
20
|
-
const redis = require(
|
|
20
|
+
const redis = require('redis');
|
|
21
21
|
this.client = redis.createClient({
|
|
22
|
-
host: options.host ||
|
|
22
|
+
host: options.host || 'localhost',
|
|
23
23
|
port: options.port || 6379,
|
|
24
24
|
password: options.password,
|
|
25
25
|
db: options.db || 0,
|
|
26
|
-
key_prefix: options.keyPrefix ||
|
|
26
|
+
key_prefix: options.keyPrefix || 'moro:cache:',
|
|
27
27
|
});
|
|
28
28
|
|
|
29
|
-
this.client.on(
|
|
30
|
-
logger.error(
|
|
29
|
+
this.client.on('error', (err: Error) => {
|
|
30
|
+
logger.error('Redis cache error', 'RedisCache', { error: err.message });
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
-
logger.info(
|
|
33
|
+
logger.info('Redis cache adapter initialized', 'RedisCache');
|
|
34
34
|
} catch (error) {
|
|
35
|
-
logger.error(
|
|
36
|
-
|
|
37
|
-
"RedisCache",
|
|
38
|
-
);
|
|
39
|
-
throw new Error("Redis package not installed. Run: npm install redis");
|
|
35
|
+
logger.error('Redis not available, falling back to memory cache', 'RedisCache');
|
|
36
|
+
throw new Error('Redis package not installed. Run: npm install redis');
|
|
40
37
|
}
|
|
41
38
|
}
|
|
42
39
|
|
|
@@ -45,7 +42,7 @@ export class RedisCacheAdapter implements CacheAdapter {
|
|
|
45
42
|
const value = await this.client.get(key);
|
|
46
43
|
return value ? JSON.parse(value) : null;
|
|
47
44
|
} catch (error) {
|
|
48
|
-
logger.error(
|
|
45
|
+
logger.error('Redis get error', 'RedisCache', { key, error });
|
|
49
46
|
return null;
|
|
50
47
|
}
|
|
51
48
|
}
|
|
@@ -58,27 +55,27 @@ export class RedisCacheAdapter implements CacheAdapter {
|
|
|
58
55
|
} else {
|
|
59
56
|
await this.client.set(key, serialized);
|
|
60
57
|
}
|
|
61
|
-
logger.debug(`Cached item in Redis: ${key} (TTL: ${ttl}s)`,
|
|
58
|
+
logger.debug(`Cached item in Redis: ${key} (TTL: ${ttl}s)`, 'RedisCache');
|
|
62
59
|
} catch (error) {
|
|
63
|
-
logger.error(
|
|
60
|
+
logger.error('Redis set error', 'RedisCache', { key, error });
|
|
64
61
|
}
|
|
65
62
|
}
|
|
66
63
|
|
|
67
64
|
async del(key: string): Promise<void> {
|
|
68
65
|
try {
|
|
69
66
|
await this.client.del(key);
|
|
70
|
-
logger.debug(`Deleted Redis cache item: ${key}`,
|
|
67
|
+
logger.debug(`Deleted Redis cache item: ${key}`, 'RedisCache');
|
|
71
68
|
} catch (error) {
|
|
72
|
-
logger.error(
|
|
69
|
+
logger.error('Redis del error', 'RedisCache', { key, error });
|
|
73
70
|
}
|
|
74
71
|
}
|
|
75
72
|
|
|
76
73
|
async clear(): Promise<void> {
|
|
77
74
|
try {
|
|
78
75
|
await this.client.flushdb();
|
|
79
|
-
logger.debug(
|
|
76
|
+
logger.debug('Cleared all Redis cache items', 'RedisCache');
|
|
80
77
|
} catch (error) {
|
|
81
|
-
logger.error(
|
|
78
|
+
logger.error('Redis clear error', 'RedisCache', { error });
|
|
82
79
|
}
|
|
83
80
|
}
|
|
84
81
|
|
|
@@ -87,7 +84,7 @@ export class RedisCacheAdapter implements CacheAdapter {
|
|
|
87
84
|
const exists = await this.client.exists(key);
|
|
88
85
|
return exists === 1;
|
|
89
86
|
} catch (error) {
|
|
90
|
-
logger.error(
|
|
87
|
+
logger.error('Redis exists error', 'RedisCache', { key, error });
|
|
91
88
|
return false;
|
|
92
89
|
}
|
|
93
90
|
}
|
|
@@ -96,7 +93,7 @@ export class RedisCacheAdapter implements CacheAdapter {
|
|
|
96
93
|
try {
|
|
97
94
|
return await this.client.ttl(key);
|
|
98
95
|
} catch (error) {
|
|
99
|
-
logger.error(
|
|
96
|
+
logger.error('Redis TTL error', 'RedisCache', { key, error });
|
|
100
97
|
return -1;
|
|
101
98
|
}
|
|
102
99
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Azure CDN Adapter
|
|
2
|
-
import { CDNAdapter } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { CDNAdapter } from '../../../../../types/cdn';
|
|
3
|
+
import { createFrameworkLogger } from '../../../../logger';
|
|
4
4
|
|
|
5
|
-
const logger = createFrameworkLogger(
|
|
5
|
+
const logger = createFrameworkLogger('AzureCDNAdapter');
|
|
6
6
|
|
|
7
7
|
export class AzureCDNAdapter implements CDNAdapter {
|
|
8
8
|
private endpoint: string;
|
|
@@ -27,7 +27,7 @@ export class AzureCDNAdapter implements CDNAdapter {
|
|
|
27
27
|
this.endpointName = options.endpointName;
|
|
28
28
|
this.endpoint = options.endpoint;
|
|
29
29
|
|
|
30
|
-
logger.info(
|
|
30
|
+
logger.info('Azure CDN adapter initialized', 'AzureCDN');
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
async purge(urls: string[]): Promise<void> {
|
|
@@ -35,34 +35,26 @@ export class AzureCDNAdapter implements CDNAdapter {
|
|
|
35
35
|
const purgeUrl = `https://management.azure.com/subscriptions/${this.subscriptionId}/resourceGroups/${this.resourceGroup}/providers/Microsoft.Cdn/profiles/${this.profileName}/endpoints/${this.endpointName}/purge`;
|
|
36
36
|
|
|
37
37
|
const purgeData = {
|
|
38
|
-
contentPaths: urls.map((url)
|
|
39
|
-
url.startsWith("/") ? url : `/${url}`,
|
|
40
|
-
),
|
|
38
|
+
contentPaths: urls.map(url => (url.startsWith('/') ? url : `/${url}`)),
|
|
41
39
|
};
|
|
42
40
|
|
|
43
|
-
logger.info(
|
|
44
|
-
`Azure CDN cache purge requested: ${urls.length} URLs`,
|
|
45
|
-
"AzureCDN",
|
|
46
|
-
);
|
|
41
|
+
logger.info(`Azure CDN cache purge requested: ${urls.length} URLs`, 'AzureCDN');
|
|
47
42
|
|
|
48
43
|
// Implementation would use Azure SDK or REST API calls
|
|
49
44
|
// const response = await fetch(purgeUrl, { method: 'POST', body: JSON.stringify(purgeData) });
|
|
50
45
|
} catch (error) {
|
|
51
|
-
logger.error(
|
|
46
|
+
logger.error('Azure CDN purge failed', 'AzureCDN', { error, urls });
|
|
52
47
|
throw error;
|
|
53
48
|
}
|
|
54
49
|
}
|
|
55
50
|
|
|
56
51
|
async prefetch(urls: string[]): Promise<void> {
|
|
57
|
-
logger.debug(
|
|
58
|
-
`Azure CDN prefetch requested for ${urls.length} URLs`,
|
|
59
|
-
"AzureCDN",
|
|
60
|
-
);
|
|
52
|
+
logger.debug(`Azure CDN prefetch requested for ${urls.length} URLs`, 'AzureCDN');
|
|
61
53
|
// Azure CDN prefetch implementation
|
|
62
54
|
}
|
|
63
55
|
|
|
64
56
|
setHeaders(response: any): void {
|
|
65
|
-
response.setHeader(
|
|
66
|
-
response.setHeader(
|
|
57
|
+
response.setHeader('Cache-Control', 'public, max-age=3600');
|
|
58
|
+
response.setHeader('Azure-CDN-Edge-Location', 'US-East');
|
|
67
59
|
}
|
|
68
60
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Cloudflare CDN Adapter
|
|
2
|
-
import { CDNAdapter } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { CDNAdapter } from '../../../../../types/cdn';
|
|
3
|
+
import { createFrameworkLogger } from '../../../../logger';
|
|
4
4
|
|
|
5
|
-
const logger = createFrameworkLogger(
|
|
5
|
+
const logger = createFrameworkLogger('CloudflareCDNAdapter');
|
|
6
6
|
|
|
7
7
|
export class CloudflareCDNAdapter implements CDNAdapter {
|
|
8
8
|
private apiToken: string;
|
|
@@ -12,72 +12,55 @@ export class CloudflareCDNAdapter implements CDNAdapter {
|
|
|
12
12
|
this.apiToken = options.apiToken;
|
|
13
13
|
this.zoneId = options.zoneId;
|
|
14
14
|
|
|
15
|
-
logger.info(
|
|
15
|
+
logger.info('Cloudflare CDN adapter initialized', 'Cloudflare');
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
async purge(urls: string[]): Promise<void> {
|
|
19
19
|
try {
|
|
20
|
-
const response = await this.cfRequest(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
{
|
|
24
|
-
files: urls,
|
|
25
|
-
},
|
|
26
|
-
);
|
|
20
|
+
const response = await this.cfRequest('POST', `/zones/${this.zoneId}/purge_cache`, {
|
|
21
|
+
files: urls,
|
|
22
|
+
});
|
|
27
23
|
|
|
28
24
|
if (response.success) {
|
|
29
|
-
logger.info(
|
|
30
|
-
`Cloudflare cache purged: ${urls.length} URLs`,
|
|
31
|
-
"Cloudflare",
|
|
32
|
-
);
|
|
25
|
+
logger.info(`Cloudflare cache purged: ${urls.length} URLs`, 'Cloudflare');
|
|
33
26
|
} else {
|
|
34
|
-
throw new Error(
|
|
27
|
+
throw new Error('Cloudflare purge failed');
|
|
35
28
|
}
|
|
36
29
|
} catch (error) {
|
|
37
|
-
logger.error(
|
|
30
|
+
logger.error('Cloudflare purge failed', 'Cloudflare', { error, urls });
|
|
38
31
|
throw error;
|
|
39
32
|
}
|
|
40
33
|
}
|
|
41
34
|
|
|
42
35
|
async prefetch(urls: string[]): Promise<void> {
|
|
43
36
|
try {
|
|
44
|
-
logger.debug(
|
|
45
|
-
`Cloudflare prefetch requested for ${urls.length} URLs`,
|
|
46
|
-
"Cloudflare",
|
|
47
|
-
);
|
|
37
|
+
logger.debug(`Cloudflare prefetch requested for ${urls.length} URLs`, 'Cloudflare');
|
|
48
38
|
// Cloudflare doesn't have direct prefetch, but we can use preload links
|
|
49
39
|
for (const url of urls) {
|
|
50
40
|
// Implementation would depend on Cloudflare Workers or edge functions
|
|
51
41
|
}
|
|
52
42
|
} catch (error) {
|
|
53
|
-
logger.error(
|
|
43
|
+
logger.error('Cloudflare prefetch failed', 'Cloudflare', { error, urls });
|
|
54
44
|
}
|
|
55
45
|
}
|
|
56
46
|
|
|
57
47
|
async getStats(): Promise<any> {
|
|
58
48
|
try {
|
|
59
|
-
const response = await this.cfRequest(
|
|
60
|
-
"GET",
|
|
61
|
-
`/zones/${this.zoneId}/analytics/dashboard`,
|
|
62
|
-
);
|
|
49
|
+
const response = await this.cfRequest('GET', `/zones/${this.zoneId}/analytics/dashboard`);
|
|
63
50
|
return response.result;
|
|
64
51
|
} catch (error) {
|
|
65
|
-
logger.error(
|
|
52
|
+
logger.error('Cloudflare stats failed', 'Cloudflare', { error });
|
|
66
53
|
return null;
|
|
67
54
|
}
|
|
68
55
|
}
|
|
69
56
|
|
|
70
57
|
setHeaders(response: any): void {
|
|
71
|
-
response.setHeader(
|
|
72
|
-
response.setHeader(
|
|
73
|
-
response.setHeader(
|
|
58
|
+
response.setHeader('Cache-Control', 'public, max-age=3600');
|
|
59
|
+
response.setHeader('CF-Cache-Status', 'DYNAMIC');
|
|
60
|
+
response.setHeader('CF-Ray', `${Math.random().toString(36)}-DFW`);
|
|
74
61
|
}
|
|
75
62
|
|
|
76
|
-
private async cfRequest(
|
|
77
|
-
method: string,
|
|
78
|
-
endpoint: string,
|
|
79
|
-
data?: any,
|
|
80
|
-
): Promise<any> {
|
|
63
|
+
private async cfRequest(method: string, endpoint: string, data?: any): Promise<any> {
|
|
81
64
|
const url = `https://api.cloudflare.com/client/v4${endpoint}`;
|
|
82
65
|
|
|
83
66
|
try {
|
|
@@ -89,7 +72,7 @@ export class CloudflareCDNAdapter implements CDNAdapter {
|
|
|
89
72
|
|
|
90
73
|
return response;
|
|
91
74
|
} catch (error) {
|
|
92
|
-
logger.error(
|
|
75
|
+
logger.error('Cloudflare API request failed', 'Cloudflare', {
|
|
93
76
|
error,
|
|
94
77
|
method,
|
|
95
78
|
endpoint,
|