mcp-wordpress 1.1.7 → 1.2.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 +388 -66
- package/dist/cache/CacheInvalidation.d.ts +118 -0
- package/dist/cache/CacheInvalidation.d.ts.map +1 -0
- package/dist/cache/CacheInvalidation.js +349 -0
- package/dist/cache/CacheInvalidation.js.map +1 -0
- package/dist/cache/CacheManager.d.ts +143 -0
- package/dist/cache/CacheManager.d.ts.map +1 -0
- package/dist/cache/CacheManager.js +308 -0
- package/dist/cache/CacheManager.js.map +1 -0
- package/dist/cache/HttpCacheWrapper.d.ts +121 -0
- package/dist/cache/HttpCacheWrapper.d.ts.map +1 -0
- package/dist/cache/HttpCacheWrapper.js +280 -0
- package/dist/cache/HttpCacheWrapper.js.map +1 -0
- package/dist/cache/__tests__/CacheInvalidation.test.d.ts +5 -0
- package/dist/cache/__tests__/CacheInvalidation.test.d.ts.map +1 -0
- package/dist/cache/__tests__/CacheInvalidation.test.js +236 -0
- package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -0
- package/dist/cache/__tests__/CacheManager.test.d.ts +5 -0
- package/dist/cache/__tests__/CacheManager.test.d.ts.map +1 -0
- package/dist/cache/__tests__/CacheManager.test.js +233 -0
- package/dist/cache/__tests__/CacheManager.test.js.map +1 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.d.ts +5 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.d.ts.map +1 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.js +228 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts +5 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts.map +1 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.js +296 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -0
- package/dist/cache/index.d.ts +12 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +9 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/client/CachedWordPressClient.d.ts +160 -0
- package/dist/client/CachedWordPressClient.d.ts.map +1 -0
- package/dist/client/CachedWordPressClient.js +338 -0
- package/dist/client/CachedWordPressClient.js.map +1 -0
- package/dist/client/WordPressClient.d.ts +81 -0
- package/dist/client/WordPressClient.d.ts.map +1 -0
- package/dist/client/WordPressClient.js +354 -0
- package/dist/client/WordPressClient.js.map +1 -0
- package/dist/config/ConfigurationSchema.d.ts +281 -0
- package/dist/config/ConfigurationSchema.d.ts.map +1 -0
- package/dist/config/ConfigurationSchema.js +205 -0
- package/dist/config/ConfigurationSchema.js.map +1 -0
- package/dist/config/ServerConfiguration.d.ts +38 -0
- package/dist/config/ServerConfiguration.d.ts.map +1 -0
- package/dist/config/ServerConfiguration.js +158 -0
- package/dist/config/ServerConfiguration.js.map +1 -0
- package/dist/docs/DocumentationGenerator.d.ts +184 -0
- package/dist/docs/DocumentationGenerator.d.ts.map +1 -0
- package/dist/docs/DocumentationGenerator.js +735 -0
- package/dist/docs/DocumentationGenerator.js.map +1 -0
- package/dist/docs/MarkdownFormatter.d.ts +84 -0
- package/dist/docs/MarkdownFormatter.d.ts.map +1 -0
- package/dist/docs/MarkdownFormatter.js +448 -0
- package/dist/docs/MarkdownFormatter.js.map +1 -0
- package/dist/docs/index.d.ts +8 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +7 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -212
- package/dist/index.js.map +1 -1
- package/dist/performance/AnomalyDetector.d.ts +63 -0
- package/dist/performance/AnomalyDetector.d.ts.map +1 -0
- package/dist/performance/AnomalyDetector.js +222 -0
- package/dist/performance/AnomalyDetector.js.map +1 -0
- package/dist/performance/BenchmarkAnalyzer.d.ts +67 -0
- package/dist/performance/BenchmarkAnalyzer.d.ts.map +1 -0
- package/dist/performance/BenchmarkAnalyzer.js +301 -0
- package/dist/performance/BenchmarkAnalyzer.js.map +1 -0
- package/dist/performance/MetricsCollector.d.ts +139 -0
- package/dist/performance/MetricsCollector.d.ts.map +1 -0
- package/dist/performance/MetricsCollector.js +320 -0
- package/dist/performance/MetricsCollector.js.map +1 -0
- package/dist/performance/PerformanceAnalytics.d.ts +162 -0
- package/dist/performance/PerformanceAnalytics.d.ts.map +1 -0
- package/dist/performance/PerformanceAnalytics.js +554 -0
- package/dist/performance/PerformanceAnalytics.js.map +1 -0
- package/dist/performance/PerformanceMonitor.d.ts +202 -0
- package/dist/performance/PerformanceMonitor.d.ts.map +1 -0
- package/dist/performance/PerformanceMonitor.js +478 -0
- package/dist/performance/PerformanceMonitor.js.map +1 -0
- package/dist/performance/TrendAnalyzer.d.ts +69 -0
- package/dist/performance/TrendAnalyzer.d.ts.map +1 -0
- package/dist/performance/TrendAnalyzer.js +203 -0
- package/dist/performance/TrendAnalyzer.js.map +1 -0
- package/dist/performance/index.d.ts +11 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +8 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/security/InputValidator.d.ts +215 -0
- package/dist/security/InputValidator.d.ts.map +1 -0
- package/dist/security/InputValidator.js +278 -0
- package/dist/security/InputValidator.js.map +1 -0
- package/dist/security/SecurityConfig.d.ts +129 -0
- package/dist/security/SecurityConfig.d.ts.map +1 -0
- package/dist/security/SecurityConfig.js +262 -0
- package/dist/security/SecurityConfig.js.map +1 -0
- package/dist/server/ConnectionTester.d.ts +24 -0
- package/dist/server/ConnectionTester.d.ts.map +1 -0
- package/dist/server/ConnectionTester.js +61 -0
- package/dist/server/ConnectionTester.js.map +1 -0
- package/dist/server/ToolRegistry.d.ts +46 -0
- package/dist/server/ToolRegistry.d.ts.map +1 -0
- package/dist/server/ToolRegistry.js +148 -0
- package/dist/server/ToolRegistry.js.map +1 -0
- package/dist/tools/BaseToolClass.d.ts +76 -0
- package/dist/tools/BaseToolClass.d.ts.map +1 -0
- package/dist/tools/BaseToolClass.js +104 -0
- package/dist/tools/BaseToolClass.js.map +1 -0
- package/dist/tools/BaseToolManager.d.ts +26 -0
- package/dist/tools/BaseToolManager.d.ts.map +1 -0
- package/dist/tools/BaseToolManager.js +56 -0
- package/dist/tools/BaseToolManager.js.map +1 -0
- package/dist/tools/base.d.ts +37 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +60 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/cache.d.ts +260 -0
- package/dist/tools/cache.d.ts.map +1 -0
- package/dist/tools/cache.js +237 -0
- package/dist/tools/cache.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/performance.d.ts +63 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js +865 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/types/client.d.ts +1 -0
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/client.js.map +1 -1
- package/dist/utils/toolWrapper.d.ts +4 -0
- package/dist/utils/toolWrapper.d.ts.map +1 -1
- package/dist/utils/toolWrapper.js +11 -0
- package/dist/utils/toolWrapper.js.map +1 -1
- package/dist/utils/validation.d.ts +68 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +185 -0
- package/dist/utils/validation.js.map +1 -0
- package/docs/CACHING.md +340 -0
- package/docs/DOCKER.md +451 -0
- package/docs/PERFORMANCE_MONITORING.md +471 -0
- package/docs/SECURITY_TESTING.md +393 -0
- package/docs/api/README.md +200 -0
- package/docs/api/categories/auth.md +40 -0
- package/docs/api/categories/cache.md +41 -0
- package/docs/api/categories/comment.md +44 -0
- package/docs/api/categories/media.md +43 -0
- package/docs/api/categories/page.md +43 -0
- package/docs/api/categories/performance.md +44 -0
- package/docs/api/categories/post.md +43 -0
- package/docs/api/categories/site.md +43 -0
- package/docs/api/categories/taxonomy.md +47 -0
- package/docs/api/categories/user.md +43 -0
- package/docs/api/openapi.json +3305 -0
- package/docs/api/summary.json +12 -0
- package/docs/api/tools/wp_approve_comment.md +98 -0
- package/docs/api/tools/wp_cache_clear.md +120 -0
- package/docs/api/tools/wp_cache_info.md +119 -0
- package/docs/api/tools/wp_cache_stats.md +119 -0
- package/docs/api/tools/wp_cache_warm.md +119 -0
- package/docs/api/tools/wp_create_application_password.md +102 -0
- package/docs/api/tools/wp_create_category.md +102 -0
- package/docs/api/tools/wp_create_comment.md +128 -0
- package/docs/api/tools/wp_create_page.md +135 -0
- package/docs/api/tools/wp_create_post.md +147 -0
- package/docs/api/tools/wp_create_tag.md +101 -0
- package/docs/api/tools/wp_create_user.md +135 -0
- package/docs/api/tools/wp_delete_application_password.md +101 -0
- package/docs/api/tools/wp_delete_category.md +100 -0
- package/docs/api/tools/wp_delete_comment.md +101 -0
- package/docs/api/tools/wp_delete_media.md +108 -0
- package/docs/api/tools/wp_delete_page.md +108 -0
- package/docs/api/tools/wp_delete_post.md +117 -0
- package/docs/api/tools/wp_delete_tag.md +100 -0
- package/docs/api/tools/wp_delete_user.md +108 -0
- package/docs/api/tools/wp_get_application_passwords.md +103 -0
- package/docs/api/tools/wp_get_auth_status.md +101 -0
- package/docs/api/tools/wp_get_category.md +103 -0
- package/docs/api/tools/wp_get_comment.md +103 -0
- package/docs/api/tools/wp_get_current_user.md +101 -0
- package/docs/api/tools/wp_get_media.md +103 -0
- package/docs/api/tools/wp_get_page.md +103 -0
- package/docs/api/tools/wp_get_page_revisions.md +103 -0
- package/docs/api/tools/wp_get_post.md +112 -0
- package/docs/api/tools/wp_get_post_revisions.md +103 -0
- package/docs/api/tools/wp_get_site_settings.md +108 -0
- package/docs/api/tools/wp_get_tag.md +103 -0
- package/docs/api/tools/wp_get_user.md +103 -0
- package/docs/api/tools/wp_list_categories.md +111 -0
- package/docs/api/tools/wp_list_comments.md +111 -0
- package/docs/api/tools/wp_list_media.md +145 -0
- package/docs/api/tools/wp_list_pages.md +145 -0
- package/docs/api/tools/wp_list_posts.md +156 -0
- package/docs/api/tools/wp_list_tags.md +110 -0
- package/docs/api/tools/wp_list_users.md +111 -0
- package/docs/api/tools/wp_performance_alerts.md +162 -0
- package/docs/api/tools/wp_performance_benchmark.md +160 -0
- package/docs/api/tools/wp_performance_export.md +162 -0
- package/docs/api/tools/wp_performance_history.md +161 -0
- package/docs/api/tools/wp_performance_optimize.md +162 -0
- package/docs/api/tools/wp_performance_stats.md +160 -0
- package/docs/api/tools/wp_search_site.md +99 -0
- package/docs/api/tools/wp_spam_comment.md +98 -0
- package/docs/api/tools/wp_switch_auth_method.md +122 -0
- package/docs/api/tools/wp_test_auth.md +96 -0
- package/docs/api/tools/wp_update_category.md +102 -0
- package/docs/api/tools/wp_update_comment.md +127 -0
- package/docs/api/tools/wp_update_media.md +129 -0
- package/docs/api/tools/wp_update_page.md +135 -0
- package/docs/api/tools/wp_update_post.md +144 -0
- package/docs/api/tools/wp_update_site_settings.md +127 -0
- package/docs/api/tools/wp_update_tag.md +102 -0
- package/docs/api/tools/wp_update_user.md +134 -0
- package/docs/api/tools/wp_upload_media.md +131 -0
- package/docs/api/types/WordPressPost.md +39 -0
- package/docs/contract-testing.md +183 -0
- package/docs/developer/NPM_AUTH_SETUP.md +3 -3
- package/docs/wordpress-rest-api-authentication-troubleshooting.md +218 -0
- package/package.json +84 -64
- package/src/cache/CacheInvalidation.ts +421 -0
- package/src/cache/CacheManager.ts +391 -0
- package/src/cache/HttpCacheWrapper.ts +372 -0
- package/src/cache/__tests__/CacheInvalidation.test.ts +299 -0
- package/src/cache/__tests__/CacheManager.test.ts +300 -0
- package/src/cache/__tests__/CachedWordPressClient.test.ts +304 -0
- package/src/cache/__tests__/HttpCacheWrapper.test.ts +359 -0
- package/src/cache/index.ts +26 -0
- package/src/client/CachedWordPressClient.ts +442 -0
- package/src/config/ConfigurationSchema.ts +246 -0
- package/src/config/ServerConfiguration.ts +215 -0
- package/src/docs/DocumentationGenerator.ts +952 -0
- package/src/docs/MarkdownFormatter.ts +494 -0
- package/src/docs/index.ts +21 -0
- package/src/index.ts +14 -274
- package/src/performance/MetricsCollector.ts +447 -0
- package/src/performance/PerformanceAnalytics.ts +762 -0
- package/src/performance/PerformanceMonitor.ts +649 -0
- package/src/performance/index.ts +28 -0
- package/src/security/InputValidator.ts +319 -0
- package/src/security/SecurityConfig.ts +301 -0
- package/src/server/ConnectionTester.ts +74 -0
- package/src/server/ToolRegistry.ts +194 -0
- package/src/tools/BaseToolManager.ts +66 -0
- package/src/tools/cache.ts +259 -0
- package/src/tools/index.ts +2 -0
- package/src/tools/performance.ts +948 -0
- package/src/types/client.ts +1 -0
- package/src/utils/toolWrapper.ts +11 -0
- package/src/utils/validation.ts +259 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent cache invalidation strategies for WordPress MCP Server
|
|
3
|
+
* Implements event-based and pattern-based invalidation
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { HttpCacheWrapper } from './HttpCacheWrapper.js';
|
|
7
|
+
|
|
8
|
+
export interface InvalidationRule {
|
|
9
|
+
trigger: string;
|
|
10
|
+
patterns: string[];
|
|
11
|
+
immediate?: boolean;
|
|
12
|
+
cascade?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface InvalidationEvent {
|
|
16
|
+
type: 'create' | 'update' | 'delete';
|
|
17
|
+
resource: string;
|
|
18
|
+
id?: number | undefined;
|
|
19
|
+
siteId: string;
|
|
20
|
+
timestamp: number;
|
|
21
|
+
data?: any;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Cache invalidation manager that handles intelligent cache clearing
|
|
26
|
+
*/
|
|
27
|
+
export class CacheInvalidation {
|
|
28
|
+
private invalidationRules: Map<string, InvalidationRule[]> = new Map();
|
|
29
|
+
private eventQueue: InvalidationEvent[] = [];
|
|
30
|
+
private processing = false;
|
|
31
|
+
|
|
32
|
+
constructor(private httpCache: HttpCacheWrapper) {
|
|
33
|
+
this.setupDefaultRules();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Register invalidation rule
|
|
38
|
+
*/
|
|
39
|
+
registerRule(resource: string, rule: InvalidationRule): void {
|
|
40
|
+
if (!this.invalidationRules.has(resource)) {
|
|
41
|
+
this.invalidationRules.set(resource, []);
|
|
42
|
+
}
|
|
43
|
+
this.invalidationRules.get(resource)!.push(rule);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Trigger invalidation event
|
|
48
|
+
*/
|
|
49
|
+
async trigger(event: InvalidationEvent): Promise<void> {
|
|
50
|
+
this.eventQueue.push(event);
|
|
51
|
+
|
|
52
|
+
if (!this.processing) {
|
|
53
|
+
await this.processQueue();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Invalidate cache for specific resource
|
|
59
|
+
*/
|
|
60
|
+
async invalidateResource(
|
|
61
|
+
resource: string,
|
|
62
|
+
id?: number,
|
|
63
|
+
type: 'create' | 'update' | 'delete' = 'update'
|
|
64
|
+
): Promise<void> {
|
|
65
|
+
const event: InvalidationEvent = {
|
|
66
|
+
type,
|
|
67
|
+
resource,
|
|
68
|
+
id,
|
|
69
|
+
siteId: this.httpCache['siteId'], // Access private property
|
|
70
|
+
timestamp: Date.now()
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
await this.trigger(event);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Setup default invalidation rules
|
|
78
|
+
*/
|
|
79
|
+
private setupDefaultRules(): void {
|
|
80
|
+
// Post invalidation rules
|
|
81
|
+
this.registerRule('posts', {
|
|
82
|
+
trigger: 'create',
|
|
83
|
+
patterns: [
|
|
84
|
+
'posts', // All posts listings
|
|
85
|
+
'posts/\\d+', // Specific post
|
|
86
|
+
'categories', // Category listings (if post has categories)
|
|
87
|
+
'tags', // Tag listings (if post has tags)
|
|
88
|
+
'search' // Search results
|
|
89
|
+
],
|
|
90
|
+
immediate: true,
|
|
91
|
+
cascade: true
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
this.registerRule('posts', {
|
|
95
|
+
trigger: 'update',
|
|
96
|
+
patterns: [
|
|
97
|
+
'posts/\\d+', // Specific post
|
|
98
|
+
'posts.*', // All posts with parameters
|
|
99
|
+
'search' // Search results
|
|
100
|
+
],
|
|
101
|
+
immediate: true
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
this.registerRule('posts', {
|
|
105
|
+
trigger: 'delete',
|
|
106
|
+
patterns: [
|
|
107
|
+
'posts', // All posts listings
|
|
108
|
+
'posts/\\d+', // Specific post
|
|
109
|
+
'categories', // Category counts might change
|
|
110
|
+
'tags', // Tag counts might change
|
|
111
|
+
'search' // Search results
|
|
112
|
+
],
|
|
113
|
+
immediate: true,
|
|
114
|
+
cascade: true
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// Page invalidation rules
|
|
118
|
+
this.registerRule('pages', {
|
|
119
|
+
trigger: 'create',
|
|
120
|
+
patterns: ['pages', 'pages/\\d+'],
|
|
121
|
+
immediate: true
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
this.registerRule('pages', {
|
|
125
|
+
trigger: 'update',
|
|
126
|
+
patterns: ['pages/\\d+', 'pages.*'],
|
|
127
|
+
immediate: true
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
this.registerRule('pages', {
|
|
131
|
+
trigger: 'delete',
|
|
132
|
+
patterns: ['pages', 'pages/\\d+'],
|
|
133
|
+
immediate: true
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// Comment invalidation rules
|
|
137
|
+
this.registerRule('comments', {
|
|
138
|
+
trigger: 'create',
|
|
139
|
+
patterns: [
|
|
140
|
+
'comments',
|
|
141
|
+
'comments.*',
|
|
142
|
+
'posts/\\d+.*' // Parent post cache
|
|
143
|
+
],
|
|
144
|
+
immediate: true
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
this.registerRule('comments', {
|
|
148
|
+
trigger: 'update',
|
|
149
|
+
patterns: [
|
|
150
|
+
'comments/\\d+',
|
|
151
|
+
'comments.*',
|
|
152
|
+
'posts/\\d+.*' // Parent post cache
|
|
153
|
+
],
|
|
154
|
+
immediate: true
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
this.registerRule('comments', {
|
|
158
|
+
trigger: 'delete',
|
|
159
|
+
patterns: [
|
|
160
|
+
'comments',
|
|
161
|
+
'comments/\\d+',
|
|
162
|
+
'posts/\\d+.*' // Parent post cache
|
|
163
|
+
],
|
|
164
|
+
immediate: true
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Media invalidation rules
|
|
168
|
+
this.registerRule('media', {
|
|
169
|
+
trigger: 'create',
|
|
170
|
+
patterns: ['media', 'media.*'],
|
|
171
|
+
immediate: true
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
this.registerRule('media', {
|
|
175
|
+
trigger: 'update',
|
|
176
|
+
patterns: ['media/\\d+', 'media.*'],
|
|
177
|
+
immediate: true
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
this.registerRule('media', {
|
|
181
|
+
trigger: 'delete',
|
|
182
|
+
patterns: ['media', 'media/\\d+'],
|
|
183
|
+
immediate: true
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// User invalidation rules
|
|
187
|
+
this.registerRule('users', {
|
|
188
|
+
trigger: 'create',
|
|
189
|
+
patterns: ['users', 'users.*'],
|
|
190
|
+
immediate: true
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
this.registerRule('users', {
|
|
194
|
+
trigger: 'update',
|
|
195
|
+
patterns: [
|
|
196
|
+
'users/\\d+',
|
|
197
|
+
'users.*',
|
|
198
|
+
'users/me' // Current user info
|
|
199
|
+
],
|
|
200
|
+
immediate: true
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
this.registerRule('users', {
|
|
204
|
+
trigger: 'delete',
|
|
205
|
+
patterns: ['users', 'users/\\d+'],
|
|
206
|
+
immediate: true
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// Category invalidation rules
|
|
210
|
+
this.registerRule('categories', {
|
|
211
|
+
trigger: 'create',
|
|
212
|
+
patterns: ['categories', 'categories.*', 'posts.*'],
|
|
213
|
+
immediate: true,
|
|
214
|
+
cascade: true
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
this.registerRule('categories', {
|
|
218
|
+
trigger: 'update',
|
|
219
|
+
patterns: ['categories/\\d+', 'categories.*', 'posts.*'],
|
|
220
|
+
immediate: true,
|
|
221
|
+
cascade: true
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
this.registerRule('categories', {
|
|
225
|
+
trigger: 'delete',
|
|
226
|
+
patterns: ['categories', 'categories/\\d+', 'posts.*'],
|
|
227
|
+
immediate: true,
|
|
228
|
+
cascade: true
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// Tag invalidation rules
|
|
232
|
+
this.registerRule('tags', {
|
|
233
|
+
trigger: 'create',
|
|
234
|
+
patterns: ['tags', 'tags.*', 'posts.*'],
|
|
235
|
+
immediate: true,
|
|
236
|
+
cascade: true
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
this.registerRule('tags', {
|
|
240
|
+
trigger: 'update',
|
|
241
|
+
patterns: ['tags/\\d+', 'tags.*', 'posts.*'],
|
|
242
|
+
immediate: true,
|
|
243
|
+
cascade: true
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
this.registerRule('tags', {
|
|
247
|
+
trigger: 'delete',
|
|
248
|
+
patterns: ['tags', 'tags/\\d+', 'posts.*'],
|
|
249
|
+
immediate: true,
|
|
250
|
+
cascade: true
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Settings invalidation rules (rarely change)
|
|
254
|
+
this.registerRule('settings', {
|
|
255
|
+
trigger: 'update',
|
|
256
|
+
patterns: ['settings.*'],
|
|
257
|
+
immediate: true,
|
|
258
|
+
cascade: false
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Process invalidation event queue
|
|
264
|
+
*/
|
|
265
|
+
private async processQueue(): Promise<void> {
|
|
266
|
+
if (this.processing || this.eventQueue.length === 0) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
this.processing = true;
|
|
271
|
+
|
|
272
|
+
try {
|
|
273
|
+
while (this.eventQueue.length > 0) {
|
|
274
|
+
const event = this.eventQueue.shift()!;
|
|
275
|
+
await this.processEvent(event);
|
|
276
|
+
}
|
|
277
|
+
} finally {
|
|
278
|
+
this.processing = false;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Process single invalidation event
|
|
284
|
+
*/
|
|
285
|
+
private async processEvent(event: InvalidationEvent): Promise<void> {
|
|
286
|
+
const rules = this.invalidationRules.get(event.resource) || [];
|
|
287
|
+
|
|
288
|
+
for (const rule of rules) {
|
|
289
|
+
if (rule.trigger === event.type || rule.trigger === '*') {
|
|
290
|
+
await this.applyInvalidationRule(event, rule);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Apply invalidation rule to cache
|
|
297
|
+
*/
|
|
298
|
+
private async applyInvalidationRule(
|
|
299
|
+
event: InvalidationEvent,
|
|
300
|
+
rule: InvalidationRule
|
|
301
|
+
): Promise<void> {
|
|
302
|
+
for (const pattern of rule.patterns) {
|
|
303
|
+
let invalidationPattern = pattern;
|
|
304
|
+
|
|
305
|
+
// Replace placeholders with actual values
|
|
306
|
+
if (event.id) {
|
|
307
|
+
invalidationPattern = invalidationPattern.replace('\\d+', event.id.toString());
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Invalidate matching cache entries
|
|
311
|
+
const invalidated = this.httpCache.invalidatePattern(invalidationPattern);
|
|
312
|
+
|
|
313
|
+
if (invalidated > 0) {
|
|
314
|
+
console.log(`Invalidated ${invalidated} cache entries for pattern: ${invalidationPattern}`);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Get invalidation statistics
|
|
321
|
+
*/
|
|
322
|
+
getStats(): {
|
|
323
|
+
queueSize: number;
|
|
324
|
+
rulesCount: number;
|
|
325
|
+
processing: boolean;
|
|
326
|
+
} {
|
|
327
|
+
return {
|
|
328
|
+
queueSize: this.eventQueue.length,
|
|
329
|
+
rulesCount: Array.from(this.invalidationRules.values()).reduce((acc, rules) => acc + rules.length, 0),
|
|
330
|
+
processing: this.processing
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Clear all invalidation rules
|
|
336
|
+
*/
|
|
337
|
+
clearRules(): void {
|
|
338
|
+
this.invalidationRules.clear();
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Get all registered rules
|
|
343
|
+
*/
|
|
344
|
+
getRules(): Record<string, InvalidationRule[]> {
|
|
345
|
+
const rules: Record<string, InvalidationRule[]> = {};
|
|
346
|
+
for (const [resource, ruleList] of this.invalidationRules.entries()) {
|
|
347
|
+
rules[resource] = [...ruleList];
|
|
348
|
+
}
|
|
349
|
+
return rules;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Cache invalidation patterns for common WordPress operations
|
|
355
|
+
*/
|
|
356
|
+
export class WordPressCachePatterns {
|
|
357
|
+
/**
|
|
358
|
+
* Invalidate all content-related caches
|
|
359
|
+
*/
|
|
360
|
+
static invalidateContent(cache: HttpCacheWrapper): number {
|
|
361
|
+
return cache.invalidatePattern('(posts|pages|comments|media)');
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Invalidate all taxonomy-related caches
|
|
366
|
+
*/
|
|
367
|
+
static invalidateTaxonomies(cache: HttpCacheWrapper): number {
|
|
368
|
+
return cache.invalidatePattern('(categories|tags|taxonomies)');
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Invalidate all user-related caches
|
|
373
|
+
*/
|
|
374
|
+
static invalidateUsers(cache: HttpCacheWrapper): number {
|
|
375
|
+
return cache.invalidatePattern('users');
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Invalidate search-related caches
|
|
380
|
+
*/
|
|
381
|
+
static invalidateSearch(cache: HttpCacheWrapper): number {
|
|
382
|
+
return cache.invalidatePattern('search');
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Invalidate all caches (nuclear option)
|
|
387
|
+
*/
|
|
388
|
+
static invalidateAll(cache: HttpCacheWrapper): number {
|
|
389
|
+
return cache.invalidateAll();
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Cache warming strategies for common WordPress data
|
|
395
|
+
*/
|
|
396
|
+
export class CacheWarmer {
|
|
397
|
+
constructor(private httpCache: HttpCacheWrapper) {}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Warm cache with essential WordPress data
|
|
401
|
+
*/
|
|
402
|
+
async warmEssentials(): Promise<void> {
|
|
403
|
+
// Implementation would depend on your specific WordPress client
|
|
404
|
+
// This is a placeholder for the structure
|
|
405
|
+
console.log('Warming essential caches...');
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Warm cache with taxonomy data
|
|
410
|
+
*/
|
|
411
|
+
async warmTaxonomies(): Promise<void> {
|
|
412
|
+
console.log('Warming taxonomy caches...');
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Warm cache with user data
|
|
417
|
+
*/
|
|
418
|
+
async warmUsers(): Promise<void> {
|
|
419
|
+
console.log('Warming user caches...');
|
|
420
|
+
}
|
|
421
|
+
}
|