@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,8 +1,8 @@
|
|
|
1
1
|
// AWS CloudFront 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('CloudFrontCDNAdapter');
|
|
6
6
|
|
|
7
7
|
export class CloudFrontCDNAdapter implements CDNAdapter {
|
|
8
8
|
private cloudfront: any;
|
|
@@ -17,7 +17,7 @@ export class CloudFrontCDNAdapter implements CDNAdapter {
|
|
|
17
17
|
this.distributionId = options.distributionId;
|
|
18
18
|
|
|
19
19
|
try {
|
|
20
|
-
const AWS = require(
|
|
20
|
+
const AWS = require('aws-sdk');
|
|
21
21
|
AWS.config.update({
|
|
22
22
|
accessKeyId: options.accessKeyId,
|
|
23
23
|
secretAccessKey: options.secretAccessKey,
|
|
@@ -25,10 +25,10 @@ export class CloudFrontCDNAdapter implements CDNAdapter {
|
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
this.cloudfront = new AWS.CloudFront();
|
|
28
|
-
logger.info(
|
|
28
|
+
logger.info('CloudFront CDN adapter initialized', 'CloudFront');
|
|
29
29
|
} catch (error) {
|
|
30
|
-
logger.error(
|
|
31
|
-
throw new Error(
|
|
30
|
+
logger.error('AWS SDK not available', 'CloudFront');
|
|
31
|
+
throw new Error('AWS SDK not installed. Run: npm install aws-sdk');
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -40,39 +40,30 @@ export class CloudFrontCDNAdapter implements CDNAdapter {
|
|
|
40
40
|
CallerReference: `moro-${Date.now()}`,
|
|
41
41
|
Paths: {
|
|
42
42
|
Quantity: urls.length,
|
|
43
|
-
Items: urls.map(
|
|
43
|
+
Items: urls.map(url => (url.startsWith('/') ? url : `/${url}`)),
|
|
44
44
|
},
|
|
45
45
|
},
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
const result = await this.cloudfront.createInvalidation(params).promise();
|
|
49
|
-
logger.info(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
{
|
|
53
|
-
invalidationId: result.Invalidation.Id,
|
|
54
|
-
},
|
|
55
|
-
);
|
|
49
|
+
logger.info(`CloudFront cache purged: ${urls.length} URLs`, 'CloudFront', {
|
|
50
|
+
invalidationId: result.Invalidation.Id,
|
|
51
|
+
});
|
|
56
52
|
} catch (error) {
|
|
57
|
-
logger.error(
|
|
53
|
+
logger.error('CloudFront purge failed', 'CloudFront', { error, urls });
|
|
58
54
|
throw error;
|
|
59
55
|
}
|
|
60
56
|
}
|
|
61
57
|
|
|
62
58
|
async prefetch(urls: string[]): Promise<void> {
|
|
63
|
-
logger.debug(
|
|
64
|
-
`CloudFront prefetch requested for ${urls.length} URLs`,
|
|
65
|
-
"CloudFront",
|
|
66
|
-
);
|
|
59
|
+
logger.debug(`CloudFront prefetch requested for ${urls.length} URLs`, 'CloudFront');
|
|
67
60
|
// CloudFront doesn't have direct prefetch, but we can simulate with requests
|
|
68
61
|
}
|
|
69
62
|
|
|
70
63
|
async getStats(): Promise<any> {
|
|
71
64
|
try {
|
|
72
65
|
const params = { Id: this.distributionId };
|
|
73
|
-
const distribution = await this.cloudfront
|
|
74
|
-
.getDistribution(params)
|
|
75
|
-
.promise();
|
|
66
|
+
const distribution = await this.cloudfront.getDistribution(params).promise();
|
|
76
67
|
|
|
77
68
|
return {
|
|
78
69
|
status: distribution.Distribution.Status,
|
|
@@ -80,13 +71,13 @@ export class CloudFrontCDNAdapter implements CDNAdapter {
|
|
|
80
71
|
enabled: distribution.Distribution.DistributionConfig.Enabled,
|
|
81
72
|
};
|
|
82
73
|
} catch (error) {
|
|
83
|
-
logger.error(
|
|
74
|
+
logger.error('CloudFront stats failed', 'CloudFront', { error });
|
|
84
75
|
return null;
|
|
85
76
|
}
|
|
86
77
|
}
|
|
87
78
|
|
|
88
79
|
setHeaders(response: any): void {
|
|
89
|
-
response.setHeader(
|
|
90
|
-
response.setHeader(
|
|
80
|
+
response.setHeader('Cache-Control', 'public, max-age=3600');
|
|
81
|
+
response.setHeader('CloudFront-Viewer-Country', 'US');
|
|
91
82
|
}
|
|
92
83
|
}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
// CDN Adapters
|
|
2
|
-
export { CloudflareCDNAdapter } from
|
|
3
|
-
export { CloudFrontCDNAdapter } from
|
|
4
|
-
export { AzureCDNAdapter } from
|
|
2
|
+
export { CloudflareCDNAdapter } from './cloudflare';
|
|
3
|
+
export { CloudFrontCDNAdapter } from './cloudfront';
|
|
4
|
+
export { AzureCDNAdapter } from './azure';
|
|
5
5
|
|
|
6
|
-
import { CloudflareCDNAdapter } from
|
|
7
|
-
import { CloudFrontCDNAdapter } from
|
|
8
|
-
import { AzureCDNAdapter } from
|
|
9
|
-
import { CDNAdapter } from
|
|
6
|
+
import { CloudflareCDNAdapter } from './cloudflare';
|
|
7
|
+
import { CloudFrontCDNAdapter } from './cloudfront';
|
|
8
|
+
import { AzureCDNAdapter } from './azure';
|
|
9
|
+
import { CDNAdapter } from '../../../../../types/cdn';
|
|
10
10
|
|
|
11
11
|
// Adapter factory function for auto-loading
|
|
12
12
|
export function createCDNAdapter(type: string, options: any = {}): CDNAdapter {
|
|
13
13
|
switch (type.toLowerCase()) {
|
|
14
|
-
case
|
|
14
|
+
case 'cloudflare':
|
|
15
15
|
return new CloudflareCDNAdapter(options);
|
|
16
|
-
case
|
|
16
|
+
case 'cloudfront':
|
|
17
17
|
return new CloudFrontCDNAdapter(options);
|
|
18
|
-
case
|
|
18
|
+
case 'azure':
|
|
19
19
|
return new AzureCDNAdapter(options);
|
|
20
20
|
default:
|
|
21
21
|
throw new Error(`Unknown CDN adapter type: ${type}`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Adapters Index
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
2
|
+
export * from './cache';
|
|
3
|
+
export * from './cdn';
|
|
4
4
|
|
|
5
5
|
// Re-export factory functions for convenience
|
|
6
|
-
export { createCacheAdapter } from
|
|
7
|
-
export { createCDNAdapter } from
|
|
6
|
+
export { createCacheAdapter } from './cache';
|
|
7
|
+
export { createCDNAdapter } from './cdn';
|
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
// Authentication Middleware
|
|
2
|
-
import { MiddlewareInterface, HookContext } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { MiddlewareInterface, HookContext } from '../../../types/hooks';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
|
-
const logger = createFrameworkLogger(
|
|
5
|
+
const logger = createFrameworkLogger('AuthMiddleware');
|
|
6
6
|
|
|
7
7
|
export const auth = (options: any = {}): MiddlewareInterface => ({
|
|
8
|
-
name:
|
|
9
|
-
version:
|
|
8
|
+
name: 'auth',
|
|
9
|
+
version: '1.0.0',
|
|
10
10
|
metadata: {
|
|
11
|
-
name:
|
|
12
|
-
version:
|
|
13
|
-
description:
|
|
14
|
-
author:
|
|
11
|
+
name: 'auth',
|
|
12
|
+
version: '1.0.0',
|
|
13
|
+
description: 'JWT authentication middleware with token validation',
|
|
14
|
+
author: 'MoroJS Team',
|
|
15
15
|
},
|
|
16
16
|
|
|
17
17
|
install: async (hooks: any, options: any = {}) => {
|
|
18
|
-
logger.debug(`Installing auth middleware with options`,
|
|
18
|
+
logger.debug(`Installing auth middleware with options`, 'Installation', {
|
|
19
19
|
options,
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
-
hooks.before(
|
|
22
|
+
hooks.before('request', async (context: HookContext) => {
|
|
23
23
|
const req = context.request as any;
|
|
24
|
-
const token = req.headers?.authorization?.replace(
|
|
24
|
+
const token = req.headers?.authorization?.replace('Bearer ', '');
|
|
25
25
|
|
|
26
26
|
if (token) {
|
|
27
27
|
try {
|
|
28
28
|
// Simple token validation (in production, use proper JWT verification)
|
|
29
|
-
if (token.startsWith(
|
|
30
|
-
req.user = { id: 1, role:
|
|
31
|
-
logger.debug(`Auth: Verified token for request`,
|
|
29
|
+
if (token.startsWith('valid_')) {
|
|
30
|
+
req.user = { id: 1, role: 'user' };
|
|
31
|
+
logger.debug(`Auth: Verified token for request`, 'TokenValidation');
|
|
32
32
|
}
|
|
33
33
|
} catch (error) {
|
|
34
|
-
throw new Error(
|
|
34
|
+
throw new Error('Invalid token');
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
});
|
|
@@ -1,50 +1,39 @@
|
|
|
1
1
|
// Built-in Cache Middleware
|
|
2
|
-
import { MiddlewareInterface, HookContext } from
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
CachedResponse,
|
|
7
|
-
} from "../../../types/cache";
|
|
8
|
-
import { createFrameworkLogger } from "../../logger";
|
|
9
|
-
import { createCacheAdapter } from "./adapters/cache";
|
|
2
|
+
import { MiddlewareInterface, HookContext } from '../../../types/hooks';
|
|
3
|
+
import { CacheAdapter, CacheOptions, CachedResponse } from '../../../types/cache';
|
|
4
|
+
import { createFrameworkLogger } from '../../logger';
|
|
5
|
+
import { createCacheAdapter } from './adapters/cache';
|
|
10
6
|
|
|
11
|
-
const logger = createFrameworkLogger(
|
|
7
|
+
const logger = createFrameworkLogger('CacheMiddleware');
|
|
12
8
|
|
|
13
9
|
export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
|
|
14
|
-
name:
|
|
15
|
-
version:
|
|
10
|
+
name: 'cache',
|
|
11
|
+
version: '1.0.0',
|
|
16
12
|
metadata: {
|
|
17
|
-
name:
|
|
18
|
-
version:
|
|
19
|
-
description:
|
|
20
|
-
author:
|
|
13
|
+
name: 'cache',
|
|
14
|
+
version: '1.0.0',
|
|
15
|
+
description: 'Built-in cache middleware with pluggable storage adapters',
|
|
16
|
+
author: 'MoroJS Team',
|
|
21
17
|
},
|
|
22
18
|
|
|
23
19
|
install: async (hooks: any, middlewareOptions: any = {}) => {
|
|
24
|
-
logger.debug(
|
|
20
|
+
logger.debug('Installing cache middleware', 'Installation');
|
|
25
21
|
|
|
26
22
|
// Initialize storage adapter
|
|
27
23
|
let storageAdapter: CacheAdapter;
|
|
28
24
|
|
|
29
|
-
if (
|
|
30
|
-
options.adapter &&
|
|
31
|
-
typeof options.adapter === "object" &&
|
|
32
|
-
"get" in options.adapter
|
|
33
|
-
) {
|
|
25
|
+
if (options.adapter && typeof options.adapter === 'object' && 'get' in options.adapter) {
|
|
34
26
|
storageAdapter = options.adapter as CacheAdapter;
|
|
35
|
-
} else if (typeof options.adapter ===
|
|
36
|
-
storageAdapter = createCacheAdapter(
|
|
37
|
-
options.adapter,
|
|
38
|
-
options.adapterOptions,
|
|
39
|
-
);
|
|
27
|
+
} else if (typeof options.adapter === 'string') {
|
|
28
|
+
storageAdapter = createCacheAdapter(options.adapter, options.adapterOptions);
|
|
40
29
|
} else {
|
|
41
30
|
// Default to memory cache
|
|
42
|
-
storageAdapter = createCacheAdapter(
|
|
31
|
+
storageAdapter = createCacheAdapter('memory');
|
|
43
32
|
}
|
|
44
33
|
|
|
45
34
|
// Cache key generation
|
|
46
35
|
const generateCacheKey = (req: any, strategy?: any): string => {
|
|
47
|
-
const prefix = options.keyPrefix ||
|
|
36
|
+
const prefix = options.keyPrefix || 'moro:cache:';
|
|
48
37
|
|
|
49
38
|
if (strategy?.key) {
|
|
50
39
|
return `${prefix}${strategy.key(req)}`;
|
|
@@ -52,7 +41,7 @@ export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
|
|
|
52
41
|
|
|
53
42
|
// Default key: method + path + query
|
|
54
43
|
const query = new URLSearchParams(req.query || {}).toString();
|
|
55
|
-
return `${prefix}${req.method}:${req.path}${query ? `?${query}` :
|
|
44
|
+
return `${prefix}${req.method}:${req.path}${query ? `?${query}` : ''}`;
|
|
56
45
|
};
|
|
57
46
|
|
|
58
47
|
// Find matching strategy
|
|
@@ -69,12 +58,12 @@ export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
|
|
|
69
58
|
return undefined;
|
|
70
59
|
};
|
|
71
60
|
|
|
72
|
-
hooks.before(
|
|
61
|
+
hooks.before('request', async (context: HookContext) => {
|
|
73
62
|
const req = context.request as any;
|
|
74
63
|
const res = context.response as any;
|
|
75
64
|
|
|
76
65
|
// Only cache GET requests by default
|
|
77
|
-
if (req.method !==
|
|
66
|
+
if (req.method !== 'GET') {
|
|
78
67
|
return;
|
|
79
68
|
}
|
|
80
69
|
|
|
@@ -91,19 +80,19 @@ export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
|
|
|
91
80
|
const cachedResponse = await storageAdapter.get(cacheKey);
|
|
92
81
|
|
|
93
82
|
if (cachedResponse) {
|
|
94
|
-
logger.debug(`Cache hit: ${cacheKey}`,
|
|
83
|
+
logger.debug(`Cache hit: ${cacheKey}`, 'CacheHit');
|
|
95
84
|
|
|
96
85
|
// Set cache headers
|
|
97
|
-
res.setHeader(
|
|
98
|
-
res.setHeader(
|
|
86
|
+
res.setHeader('X-Cache', 'HIT');
|
|
87
|
+
res.setHeader('X-Cache-Key', cacheKey);
|
|
99
88
|
|
|
100
89
|
// Set HTTP cache headers
|
|
101
90
|
if (options.maxAge) {
|
|
102
|
-
res.setHeader(
|
|
91
|
+
res.setHeader('Cache-Control', `public, max-age=${options.maxAge}`);
|
|
103
92
|
}
|
|
104
93
|
|
|
105
94
|
if (options.vary && options.vary.length > 0) {
|
|
106
|
-
res.setHeader(
|
|
95
|
+
res.setHeader('Vary', options.vary.join(', '));
|
|
107
96
|
}
|
|
108
97
|
|
|
109
98
|
// Send cached response
|
|
@@ -117,7 +106,7 @@ export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
|
|
|
117
106
|
}
|
|
118
107
|
|
|
119
108
|
if (cachedResponse.contentType) {
|
|
120
|
-
res.setHeader(
|
|
109
|
+
res.setHeader('Content-Type', cachedResponse.contentType);
|
|
121
110
|
}
|
|
122
111
|
|
|
123
112
|
res.send(cachedResponse.body);
|
|
@@ -127,11 +116,11 @@ export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
|
|
|
127
116
|
return;
|
|
128
117
|
}
|
|
129
118
|
|
|
130
|
-
logger.debug(`Cache miss: ${cacheKey}`,
|
|
131
|
-
res.setHeader(
|
|
132
|
-
res.setHeader(
|
|
119
|
+
logger.debug(`Cache miss: ${cacheKey}`, 'CacheMiss');
|
|
120
|
+
res.setHeader('X-Cache', 'MISS');
|
|
121
|
+
res.setHeader('X-Cache-Key', cacheKey);
|
|
133
122
|
} catch (error) {
|
|
134
|
-
logger.error(
|
|
123
|
+
logger.error('Cache retrieval error', 'CacheError', {
|
|
135
124
|
error,
|
|
136
125
|
key: cacheKey,
|
|
137
126
|
});
|
|
@@ -151,17 +140,14 @@ export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
|
|
|
151
140
|
body,
|
|
152
141
|
status: res.statusCode,
|
|
153
142
|
headers: res.getHeaders ? res.getHeaders() : {},
|
|
154
|
-
contentType: contentType || res.getHeader(
|
|
143
|
+
contentType: contentType || res.getHeader('Content-Type'),
|
|
155
144
|
timestamp: Date.now(),
|
|
156
145
|
};
|
|
157
146
|
|
|
158
147
|
await storageAdapter.set(cacheKey, cacheData, ttl);
|
|
159
|
-
logger.debug(
|
|
160
|
-
`Response cached: ${cacheKey} (TTL: ${ttl}s)`,
|
|
161
|
-
"CacheSet",
|
|
162
|
-
);
|
|
148
|
+
logger.debug(`Response cached: ${cacheKey} (TTL: ${ttl}s)`, 'CacheSet');
|
|
163
149
|
} catch (error) {
|
|
164
|
-
logger.error(
|
|
150
|
+
logger.error('Cache storage error', 'CacheError', {
|
|
165
151
|
error,
|
|
166
152
|
key: cacheKey,
|
|
167
153
|
});
|
|
@@ -170,7 +156,7 @@ export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
|
|
|
170
156
|
|
|
171
157
|
// Override response methods
|
|
172
158
|
res.json = function (data: any) {
|
|
173
|
-
cacheResponse(data,
|
|
159
|
+
cacheResponse(data, 'application/json');
|
|
174
160
|
return originalJson.call(this, data);
|
|
175
161
|
};
|
|
176
162
|
|
|
@@ -190,38 +176,35 @@ export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
|
|
|
190
176
|
res.cacheControl = (directives: any) => {
|
|
191
177
|
const parts: string[] = [];
|
|
192
178
|
|
|
193
|
-
if (directives.public) parts.push(
|
|
194
|
-
if (directives.private) parts.push(
|
|
195
|
-
if (directives.noCache) parts.push(
|
|
196
|
-
if (directives.noStore) parts.push(
|
|
197
|
-
if (directives.mustRevalidate) parts.push(
|
|
198
|
-
if (directives.immutable) parts.push(
|
|
199
|
-
|
|
200
|
-
if (typeof directives.maxAge ===
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
parts.push(
|
|
204
|
-
`stale-while-revalidate=${directives.staleWhileRevalidate}`,
|
|
205
|
-
);
|
|
179
|
+
if (directives.public) parts.push('public');
|
|
180
|
+
if (directives.private) parts.push('private');
|
|
181
|
+
if (directives.noCache) parts.push('no-cache');
|
|
182
|
+
if (directives.noStore) parts.push('no-store');
|
|
183
|
+
if (directives.mustRevalidate) parts.push('must-revalidate');
|
|
184
|
+
if (directives.immutable) parts.push('immutable');
|
|
185
|
+
|
|
186
|
+
if (typeof directives.maxAge === 'number') parts.push(`max-age=${directives.maxAge}`);
|
|
187
|
+
if (typeof directives.staleWhileRevalidate === 'number') {
|
|
188
|
+
parts.push(`stale-while-revalidate=${directives.staleWhileRevalidate}`);
|
|
206
189
|
}
|
|
207
190
|
|
|
208
|
-
res.setHeader(
|
|
191
|
+
res.setHeader('Cache-Control', parts.join(', '));
|
|
209
192
|
return res;
|
|
210
193
|
};
|
|
211
194
|
|
|
212
195
|
// Add ETag generation
|
|
213
196
|
if (options.etag !== false) {
|
|
214
197
|
res.generateETag = (content: string | Buffer) => {
|
|
215
|
-
const crypto = require(
|
|
216
|
-
const hash = crypto.createHash(
|
|
217
|
-
const prefix = options.etag ===
|
|
198
|
+
const crypto = require('crypto');
|
|
199
|
+
const hash = crypto.createHash('md5').update(content).digest('hex');
|
|
200
|
+
const prefix = options.etag === 'weak' ? 'W/' : '';
|
|
218
201
|
return `${prefix}"${hash}"`;
|
|
219
202
|
};
|
|
220
203
|
}
|
|
221
204
|
});
|
|
222
205
|
|
|
223
|
-
logger.info(
|
|
224
|
-
adapter: typeof options.adapter ===
|
|
206
|
+
logger.info('Cache middleware installed', 'Installation', {
|
|
207
|
+
adapter: typeof options.adapter === 'string' ? options.adapter : 'custom',
|
|
225
208
|
strategies: Object.keys(options.strategies || {}).length,
|
|
226
209
|
});
|
|
227
210
|
},
|
|
@@ -1,46 +1,39 @@
|
|
|
1
1
|
// Built-in CDN Middleware
|
|
2
|
-
import { MiddlewareInterface, HookContext } from
|
|
3
|
-
import { CDNAdapter, CDNOptions } from
|
|
4
|
-
import { createFrameworkLogger } from
|
|
5
|
-
import { createCDNAdapter } from
|
|
2
|
+
import { MiddlewareInterface, HookContext } from '../../../types/hooks';
|
|
3
|
+
import { CDNAdapter, CDNOptions } from '../../../types/cdn';
|
|
4
|
+
import { createFrameworkLogger } from '../../logger';
|
|
5
|
+
import { createCDNAdapter } from './adapters/cdn';
|
|
6
6
|
|
|
7
|
-
const logger = createFrameworkLogger(
|
|
7
|
+
const logger = createFrameworkLogger('CDNMiddleware');
|
|
8
8
|
|
|
9
9
|
export const cdn = (options: CDNOptions = {}): MiddlewareInterface => ({
|
|
10
|
-
name:
|
|
11
|
-
version:
|
|
10
|
+
name: 'cdn',
|
|
11
|
+
version: '1.0.0',
|
|
12
12
|
metadata: {
|
|
13
|
-
name:
|
|
14
|
-
version:
|
|
15
|
-
description:
|
|
16
|
-
author:
|
|
13
|
+
name: 'cdn',
|
|
14
|
+
version: '1.0.0',
|
|
15
|
+
description: 'Built-in CDN middleware with pluggable provider adapters',
|
|
16
|
+
author: 'MoroJS Team',
|
|
17
17
|
},
|
|
18
18
|
|
|
19
19
|
install: async (hooks: any, middlewareOptions: any = {}) => {
|
|
20
|
-
logger.debug(
|
|
20
|
+
logger.debug('Installing CDN middleware', 'Installation');
|
|
21
21
|
|
|
22
22
|
// Initialize CDN adapter
|
|
23
23
|
let cdnAdapter: CDNAdapter | null = null;
|
|
24
24
|
|
|
25
|
-
if (
|
|
26
|
-
options.adapter &&
|
|
27
|
-
typeof options.adapter === "object" &&
|
|
28
|
-
"purge" in options.adapter
|
|
29
|
-
) {
|
|
25
|
+
if (options.adapter && typeof options.adapter === 'object' && 'purge' in options.adapter) {
|
|
30
26
|
cdnAdapter = options.adapter as CDNAdapter;
|
|
31
|
-
} else if (typeof options.adapter ===
|
|
27
|
+
} else if (typeof options.adapter === 'string') {
|
|
32
28
|
cdnAdapter = createCDNAdapter(options.adapter, options.adapterOptions);
|
|
33
29
|
}
|
|
34
30
|
|
|
35
31
|
if (!cdnAdapter) {
|
|
36
|
-
logger.warn(
|
|
37
|
-
"No CDN adapter configured, CDN features will be disabled",
|
|
38
|
-
"Installation",
|
|
39
|
-
);
|
|
32
|
+
logger.warn('No CDN adapter configured, CDN features will be disabled', 'Installation');
|
|
40
33
|
return;
|
|
41
34
|
}
|
|
42
35
|
|
|
43
|
-
hooks.before(
|
|
36
|
+
hooks.before('request', async (context: HookContext) => {
|
|
44
37
|
const req = context.request as any;
|
|
45
38
|
const res = context.response as any;
|
|
46
39
|
|
|
@@ -52,61 +45,46 @@ export const cdn = (options: CDNOptions = {}): MiddlewareInterface => ({
|
|
|
52
45
|
// Add CDN methods to response
|
|
53
46
|
res.purgeCDN = async (urls?: string[]) => {
|
|
54
47
|
if (!cdnAdapter) {
|
|
55
|
-
logger.warn(
|
|
56
|
-
"CDN purge requested but no adapter configured",
|
|
57
|
-
"CDNPurge",
|
|
58
|
-
);
|
|
48
|
+
logger.warn('CDN purge requested but no adapter configured', 'CDNPurge');
|
|
59
49
|
return;
|
|
60
50
|
}
|
|
61
51
|
|
|
62
52
|
try {
|
|
63
53
|
const urlsToPurge = urls || [req.path];
|
|
64
54
|
await cdnAdapter.purge(urlsToPurge);
|
|
65
|
-
logger.info(
|
|
66
|
-
`CDN cache purged: ${urlsToPurge.join(", ")}`,
|
|
67
|
-
"CDNPurge",
|
|
68
|
-
);
|
|
55
|
+
logger.info(`CDN cache purged: ${urlsToPurge.join(', ')}`, 'CDNPurge');
|
|
69
56
|
} catch (error) {
|
|
70
|
-
logger.error(
|
|
57
|
+
logger.error('CDN purge failed', 'CDNError', { error, urls });
|
|
71
58
|
throw error;
|
|
72
59
|
}
|
|
73
60
|
};
|
|
74
61
|
|
|
75
62
|
res.prefetchCDN = async (urls: string[]) => {
|
|
76
63
|
if (!cdnAdapter || !cdnAdapter.prefetch) {
|
|
77
|
-
logger.warn(
|
|
78
|
-
"CDN prefetch requested but not supported by adapter",
|
|
79
|
-
"CDNPrefetch",
|
|
80
|
-
);
|
|
64
|
+
logger.warn('CDN prefetch requested but not supported by adapter', 'CDNPrefetch');
|
|
81
65
|
return;
|
|
82
66
|
}
|
|
83
67
|
|
|
84
68
|
try {
|
|
85
69
|
await cdnAdapter.prefetch(urls);
|
|
86
|
-
logger.info(
|
|
87
|
-
`CDN prefetch requested: ${urls.join(", ")}`,
|
|
88
|
-
"CDNPrefetch",
|
|
89
|
-
);
|
|
70
|
+
logger.info(`CDN prefetch requested: ${urls.join(', ')}`, 'CDNPrefetch');
|
|
90
71
|
} catch (error) {
|
|
91
|
-
logger.error(
|
|
72
|
+
logger.error('CDN prefetch failed', 'CDNError', { error, urls });
|
|
92
73
|
}
|
|
93
74
|
};
|
|
94
75
|
|
|
95
76
|
res.getCDNStats = async () => {
|
|
96
77
|
if (!cdnAdapter || !cdnAdapter.getStats) {
|
|
97
|
-
logger.warn(
|
|
98
|
-
"CDN stats requested but not supported by adapter",
|
|
99
|
-
"CDNStats",
|
|
100
|
-
);
|
|
78
|
+
logger.warn('CDN stats requested but not supported by adapter', 'CDNStats');
|
|
101
79
|
return null;
|
|
102
80
|
}
|
|
103
81
|
|
|
104
82
|
try {
|
|
105
83
|
const stats = await cdnAdapter.getStats();
|
|
106
|
-
logger.debug(
|
|
84
|
+
logger.debug('CDN stats retrieved', 'CDNStats');
|
|
107
85
|
return stats;
|
|
108
86
|
} catch (error) {
|
|
109
|
-
logger.error(
|
|
87
|
+
logger.error('CDN stats retrieval failed', 'CDNError', { error });
|
|
110
88
|
return null;
|
|
111
89
|
}
|
|
112
90
|
};
|
|
@@ -114,27 +92,22 @@ export const cdn = (options: CDNOptions = {}): MiddlewareInterface => ({
|
|
|
114
92
|
|
|
115
93
|
// Auto-invalidation on certain patterns
|
|
116
94
|
if (options.autoInvalidate && options.invalidationPatterns) {
|
|
117
|
-
hooks.after(
|
|
95
|
+
hooks.after('response', async (context: HookContext) => {
|
|
118
96
|
const req = context.request as any;
|
|
119
97
|
const res = context.response as any;
|
|
120
98
|
|
|
121
99
|
// Check if this request matches invalidation patterns
|
|
122
|
-
const shouldInvalidate = options.invalidationPatterns?.some(
|
|
123
|
-
(pattern)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
},
|
|
127
|
-
);
|
|
100
|
+
const shouldInvalidate = options.invalidationPatterns?.some(pattern => {
|
|
101
|
+
const regex = new RegExp(pattern);
|
|
102
|
+
return regex.test(req.path);
|
|
103
|
+
});
|
|
128
104
|
|
|
129
105
|
if (shouldInvalidate && cdnAdapter) {
|
|
130
106
|
try {
|
|
131
107
|
await cdnAdapter.purge([req.path]);
|
|
132
|
-
logger.debug(
|
|
133
|
-
`Auto-invalidated CDN cache for: ${req.path}`,
|
|
134
|
-
"CDNAutoInvalidate",
|
|
135
|
-
);
|
|
108
|
+
logger.debug(`Auto-invalidated CDN cache for: ${req.path}`, 'CDNAutoInvalidate');
|
|
136
109
|
} catch (error) {
|
|
137
|
-
logger.error(
|
|
110
|
+
logger.error('CDN auto-invalidation failed', 'CDNError', {
|
|
138
111
|
error,
|
|
139
112
|
path: req.path,
|
|
140
113
|
});
|
|
@@ -143,8 +116,8 @@ export const cdn = (options: CDNOptions = {}): MiddlewareInterface => ({
|
|
|
143
116
|
});
|
|
144
117
|
}
|
|
145
118
|
|
|
146
|
-
logger.info(
|
|
147
|
-
adapter: typeof options.adapter ===
|
|
119
|
+
logger.info('CDN middleware installed', 'Installation', {
|
|
120
|
+
adapter: typeof options.adapter === 'string' ? options.adapter : 'custom',
|
|
148
121
|
autoInvalidate: !!options.autoInvalidate,
|
|
149
122
|
});
|
|
150
123
|
},
|