mcp-http-webhook 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/.eslintrc.json +16 -0
  2. package/.prettierrc.json +8 -0
  3. package/ARCHITECTURE.md +269 -0
  4. package/CONTRIBUTING.md +136 -0
  5. package/GETTING_STARTED.md +310 -0
  6. package/IMPLEMENTATION.md +294 -0
  7. package/LICENSE +21 -0
  8. package/MIGRATION_TO_SDK.md +263 -0
  9. package/README.md +496 -0
  10. package/SDK_INTEGRATION_COMPLETE.md +300 -0
  11. package/STANDARD_SUBSCRIPTIONS.md +268 -0
  12. package/STANDARD_SUBSCRIPTIONS_COMPLETE.md +309 -0
  13. package/SUMMARY.md +272 -0
  14. package/Spec.md +2778 -0
  15. package/dist/errors/index.d.ts +52 -0
  16. package/dist/errors/index.d.ts.map +1 -0
  17. package/dist/errors/index.js +81 -0
  18. package/dist/errors/index.js.map +1 -0
  19. package/dist/index.d.ts +9 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +37 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/protocol/ProtocolHandler.d.ts +37 -0
  24. package/dist/protocol/ProtocolHandler.d.ts.map +1 -0
  25. package/dist/protocol/ProtocolHandler.js +172 -0
  26. package/dist/protocol/ProtocolHandler.js.map +1 -0
  27. package/dist/server.d.ts +6 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +502 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/stores/InMemoryStore.d.ts +27 -0
  32. package/dist/stores/InMemoryStore.d.ts.map +1 -0
  33. package/dist/stores/InMemoryStore.js +73 -0
  34. package/dist/stores/InMemoryStore.js.map +1 -0
  35. package/dist/stores/RedisStore.d.ts +18 -0
  36. package/dist/stores/RedisStore.d.ts.map +1 -0
  37. package/dist/stores/RedisStore.js +45 -0
  38. package/dist/stores/RedisStore.js.map +1 -0
  39. package/dist/stores/index.d.ts +3 -0
  40. package/dist/stores/index.d.ts.map +1 -0
  41. package/dist/stores/index.js +9 -0
  42. package/dist/stores/index.js.map +1 -0
  43. package/dist/subscriptions/SubscriptionManager.d.ts +49 -0
  44. package/dist/subscriptions/SubscriptionManager.d.ts.map +1 -0
  45. package/dist/subscriptions/SubscriptionManager.js +181 -0
  46. package/dist/subscriptions/SubscriptionManager.js.map +1 -0
  47. package/dist/types/index.d.ts +271 -0
  48. package/dist/types/index.d.ts.map +1 -0
  49. package/dist/types/index.js +16 -0
  50. package/dist/types/index.js.map +1 -0
  51. package/dist/utils/index.d.ts +51 -0
  52. package/dist/utils/index.d.ts.map +1 -0
  53. package/dist/utils/index.js +154 -0
  54. package/dist/utils/index.js.map +1 -0
  55. package/dist/webhooks/WebhookManager.d.ts +27 -0
  56. package/dist/webhooks/WebhookManager.d.ts.map +1 -0
  57. package/dist/webhooks/WebhookManager.js +174 -0
  58. package/dist/webhooks/WebhookManager.js.map +1 -0
  59. package/examples/GITHUB_LIVE_EXAMPLE.md +308 -0
  60. package/examples/GITHUB_LIVE_SETUP.md +253 -0
  61. package/examples/QUICKSTART.md +130 -0
  62. package/examples/basic-setup.ts +142 -0
  63. package/examples/github-server-live.ts +690 -0
  64. package/examples/github-server.ts +223 -0
  65. package/examples/google-drive-server-live.ts +773 -0
  66. package/examples/start-github-live.sh +53 -0
  67. package/jest.config.js +20 -0
  68. package/package.json +58 -0
  69. package/src/errors/index.ts +81 -0
  70. package/src/index.ts +19 -0
  71. package/src/server.ts +595 -0
  72. package/src/stores/InMemoryStore.ts +87 -0
  73. package/src/stores/RedisStore.ts +51 -0
  74. package/src/stores/index.ts +2 -0
  75. package/src/subscriptions/SubscriptionManager.ts +240 -0
  76. package/src/types/index.ts +341 -0
  77. package/src/utils/index.ts +156 -0
  78. package/src/webhooks/WebhookManager.ts +230 -0
  79. package/test-sdk-integration.sh +157 -0
  80. package/tsconfig.json +21 -0
package/dist/server.js ADDED
@@ -0,0 +1,502 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createMCPServer = createMCPServer;
7
+ const express_1 = __importDefault(require("express"));
8
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
9
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
10
+ const zod_1 = require("zod");
11
+ const SubscriptionManager_1 = require("./subscriptions/SubscriptionManager");
12
+ const WebhookManager_1 = require("./webhooks/WebhookManager");
13
+ const errors_1 = require("./errors");
14
+ const utils_1 = require("./utils");
15
+ const cors_1 = __importDefault(require("cors"));
16
+ /**
17
+ * Default console logger
18
+ */
19
+ const defaultLogger = {
20
+ debug: (msg, meta) => console.debug(msg, meta),
21
+ info: (msg, meta) => console.info(msg, meta),
22
+ warn: (msg, meta) => console.warn(msg, meta),
23
+ error: (msg, meta) => console.error(msg, meta),
24
+ };
25
+ /**
26
+ * Convert JSON Schema to Zod schema (simplified version)
27
+ * Handles basic types and nested objects
28
+ */
29
+ function convertToZodSchema(jsonSchema) {
30
+ const schema = {};
31
+ if (!jsonSchema || !jsonSchema.properties) {
32
+ return schema;
33
+ }
34
+ const required = jsonSchema.required || [];
35
+ for (const [key, value] of Object.entries(jsonSchema.properties)) {
36
+ let zodType;
37
+ if (value.type === 'string') {
38
+ zodType = zod_1.z.string();
39
+ }
40
+ else if (value.type === 'number' || value.type === 'integer') {
41
+ zodType = zod_1.z.number();
42
+ }
43
+ else if (value.type === 'boolean') {
44
+ zodType = zod_1.z.boolean();
45
+ }
46
+ else if (value.type === 'array') {
47
+ // Handle array items
48
+ if (value.items?.type === 'string') {
49
+ zodType = zod_1.z.array(zod_1.z.string());
50
+ }
51
+ else if (value.items?.type === 'number') {
52
+ zodType = zod_1.z.array(zod_1.z.number());
53
+ }
54
+ else if (value.items?.type === 'object') {
55
+ zodType = zod_1.z.array(zod_1.z.object(convertToZodSchema(value.items)));
56
+ }
57
+ else {
58
+ zodType = zod_1.z.array(zod_1.z.any());
59
+ }
60
+ }
61
+ else if (value.type === 'object') {
62
+ zodType = zod_1.z.object(convertToZodSchema(value));
63
+ }
64
+ else {
65
+ zodType = zod_1.z.any();
66
+ }
67
+ // Mark as optional if not in required array
68
+ if (!required.includes(key)) {
69
+ zodType = zodType.optional();
70
+ }
71
+ schema[key] = zodType;
72
+ }
73
+ return schema;
74
+ }
75
+ /**
76
+ * Create MCP HTTP Webhook Server using standard MCP SDK
77
+ */
78
+ function createMCPServer(config) {
79
+ const logger = config.logger || defaultLogger;
80
+ const basePath = config.basePath || '/mcp';
81
+ const port = config.port || 3000;
82
+ const host = config.host || '0.0.0.0';
83
+ // Validate configuration
84
+ validateConfig(config);
85
+ // Create Express app
86
+ const app = (0, express_1.default)();
87
+ // Middleware
88
+ app.use(express_1.default.json());
89
+ // allow cors
90
+ app.use((0, cors_1.default)());
91
+ // Custom middleware
92
+ if (config.middleware) {
93
+ config.middleware.forEach((mw) => app.use(mw));
94
+ }
95
+ // Create MCP SDK server
96
+ const sdkServer = new mcp_js_1.McpServer({
97
+ name: config.name,
98
+ version: config.version,
99
+ }, {
100
+ capabilities: {
101
+ resources: {
102
+ subscribe: true,
103
+ listChanged: true,
104
+ },
105
+ experimental: {
106
+ isConnector: true,
107
+ },
108
+ },
109
+ });
110
+ // Initialize managers for webhook subscriptions
111
+ const subscriptionManager = new SubscriptionManager_1.SubscriptionManager(config.store, config.resources, config.publicUrl, logger);
112
+ const webhookManager = new WebhookManager_1.WebhookManager(config.webhooks, config.resources, logger);
113
+ // Register tools with MCP SDK
114
+ config.tools.forEach((toolDef) => {
115
+ sdkServer.registerTool(toolDef.name, {
116
+ title: toolDef.description,
117
+ description: toolDef.description,
118
+ inputSchema: convertToZodSchema(toolDef.inputSchema),
119
+ }, async (input) => {
120
+ // Get auth context from request metadata if available
121
+ const context = sdkServer._currentContext || { userId: 'anonymous' };
122
+ const result = await toolDef.handler(input, context);
123
+ return {
124
+ content: [
125
+ {
126
+ type: 'text',
127
+ text: JSON.stringify(result, null, 2),
128
+ },
129
+ ],
130
+ structuredContent: result,
131
+ };
132
+ });
133
+ });
134
+ // Register resources with MCP SDK
135
+ config.resources.forEach((resourceDef) => {
136
+ // Check if URI is a template (contains {})
137
+ const isTemplate = resourceDef.uri.includes('{') && resourceDef.uri.includes('}');
138
+ if (isTemplate && resourceDef.list) {
139
+ // Use ResourceTemplate for templated URIs
140
+ const template = new mcp_js_1.ResourceTemplate(resourceDef.uri, {
141
+ list: async () => {
142
+ const context = sdkServer._currentContext || { userId: 'anonymous' };
143
+ const resources = await resourceDef.list(context);
144
+ // Map to MCP SDK Resource format with index signature
145
+ return {
146
+ resources: resources.map((r) => ({
147
+ uri: r.uri,
148
+ name: r.name,
149
+ description: r.description,
150
+ mimeType: resourceDef.mimeType,
151
+ ...r, // Spread to add index signature
152
+ })),
153
+ };
154
+ },
155
+ });
156
+ sdkServer.registerResource(resourceDef.name, template, {
157
+ description: resourceDef.description,
158
+ mimeType: resourceDef.mimeType || 'application/json',
159
+ }, async (uri, _variables, _extra) => {
160
+ const context = sdkServer._currentContext || { userId: 'anonymous' };
161
+ const result = await resourceDef.read(uri.href, context);
162
+ return {
163
+ contents: Array.isArray(result.contents)
164
+ ? result.contents.map((content) => ({
165
+ uri: uri.href,
166
+ text: typeof content === 'string' ? content : JSON.stringify(content),
167
+ mimeType: resourceDef.mimeType || 'text/plain',
168
+ }))
169
+ : [{
170
+ uri: uri.href,
171
+ text: typeof result.contents === 'string' ? result.contents : JSON.stringify(result.contents),
172
+ mimeType: resourceDef.mimeType || 'text/plain',
173
+ }],
174
+ };
175
+ });
176
+ }
177
+ else {
178
+ // Static resource - simple URI
179
+ sdkServer.registerResource(resourceDef.name, resourceDef.uri, {
180
+ description: resourceDef.description,
181
+ mimeType: resourceDef.mimeType || 'application/json',
182
+ }, async (uri, _extra) => {
183
+ const context = sdkServer._currentContext || { userId: 'anonymous' };
184
+ const result = await resourceDef.read(uri.href, context);
185
+ return {
186
+ contents: Array.isArray(result.contents)
187
+ ? result.contents.map((content) => ({
188
+ uri: uri.href,
189
+ text: typeof content === 'string' ? content : JSON.stringify(content),
190
+ mimeType: resourceDef.mimeType || 'application/json',
191
+ }))
192
+ : [{
193
+ uri: uri.href,
194
+ text: typeof result.contents === 'string' ? result.contents : JSON.stringify(result.contents),
195
+ mimeType: resourceDef.mimeType || 'application/json',
196
+ }],
197
+ };
198
+ });
199
+ }
200
+ });
201
+ // Register prompts with MCP SDK
202
+ if (config.prompts) {
203
+ config.prompts.forEach((promptDef) => {
204
+ sdkServer.registerPrompt(promptDef.name, {
205
+ title: promptDef.name,
206
+ description: promptDef.description,
207
+ argsSchema: promptDef.arguments?.reduce((schema, arg) => {
208
+ schema[arg.name] = zod_1.z.string();
209
+ return schema;
210
+ }, {}) || {},
211
+ }, async (args) => {
212
+ const context = sdkServer._currentContext || { userId: 'anonymous' };
213
+ const result = await promptDef.handler(args, context);
214
+ // Convert to MCP SDK message format
215
+ return {
216
+ messages: result.messages.map((msg) => ({
217
+ role: msg.role,
218
+ content: {
219
+ type: 'text',
220
+ text: msg.content,
221
+ },
222
+ })),
223
+ };
224
+ });
225
+ });
226
+ }
227
+ // Health check endpoints
228
+ app.get('/health', (_req, res) => {
229
+ res.json({ status: 'ok' });
230
+ });
231
+ app.get('/ready', async (_req, res) => {
232
+ try {
233
+ // Test store connectivity
234
+ await config.store.set('health-check', 'ok', 10);
235
+ await config.store.delete('health-check');
236
+ res.json({ status: 'ready' });
237
+ }
238
+ catch (error) {
239
+ res.status(503).json({ status: 'not ready', error: String(error) });
240
+ }
241
+ });
242
+ // Standard MCP endpoint with StreamableHTTPServerTransport
243
+ app.post(basePath, asyncHandler(async (req, res) => {
244
+ // Authenticate and store context
245
+ const context = await authenticate(req, config);
246
+ sdkServer._currentContext = context;
247
+ // Intercept resources/subscribe to support webhook callbacks
248
+ if (req.body.method === 'resources/subscribe') {
249
+ const { uri } = req.body.params || {};
250
+ const webhookUrl = req.body.params?._meta?.webhookUrl || req.body.params?.webhookUrl;
251
+ const webhookSecret = req.body.params?._meta?.webhookSecret || req.body.params?.webhookSecret;
252
+ if (webhookUrl) {
253
+ // Handle webhook-based subscription
254
+ logger.info('Standard MCP subscribe with webhook support', { uri, webhookUrl });
255
+ if (!(0, utils_1.isValidUrl)(webhookUrl)) {
256
+ return res.json({
257
+ jsonrpc: '2.0',
258
+ id: req.body.id,
259
+ error: {
260
+ code: -32602,
261
+ message: 'Invalid webhookUrl in _meta'
262
+ }
263
+ });
264
+ }
265
+ try {
266
+ await subscriptionManager.createSubscription({
267
+ uri,
268
+ clientCallbackUrl: webhookUrl,
269
+ clientCallbackSecret: webhookSecret,
270
+ context,
271
+ });
272
+ // Return standard MCP response
273
+ return res.json({
274
+ jsonrpc: '2.0',
275
+ id: req.body.id,
276
+ method: 'notifications/resources/updated',
277
+ params: {
278
+ uri: uri,
279
+ }
280
+ });
281
+ }
282
+ catch (error) {
283
+ return res.json({
284
+ jsonrpc: '2.0',
285
+ id: req.body.id,
286
+ error: {
287
+ code: -32603,
288
+ message: error.message || 'Failed to create subscription'
289
+ }
290
+ });
291
+ }
292
+ }
293
+ else {
294
+ // No webhookUrl - throw error
295
+ return res.json({
296
+ jsonrpc: '2.0',
297
+ id: req.body.id,
298
+ error: {
299
+ code: -32602,
300
+ message: 'Invalid webhookUrl in _meta'
301
+ }
302
+ });
303
+ }
304
+ }
305
+ // Intercept resources/unsubscribe to support webhook cleanup
306
+ if (req.body.method === 'resources/unsubscribe') {
307
+ const subscriptionId = req.body.params?._meta?.subscriptionId || req.body.params?.subscriptionId;
308
+ if (subscriptionId) {
309
+ logger.info('Standard MCP unsubscribe with webhook cleanup', { subscriptionId });
310
+ try {
311
+ await subscriptionManager.deleteSubscription(subscriptionId, context);
312
+ return res.json({
313
+ jsonrpc: '2.0',
314
+ id: req.body.id,
315
+ result: {
316
+ success: true,
317
+ _meta: {
318
+ webhookEnabled: true
319
+ }
320
+ }
321
+ });
322
+ }
323
+ catch (error) {
324
+ return res.json({
325
+ jsonrpc: '2.0',
326
+ id: req.body.id,
327
+ error: {
328
+ code: -32603,
329
+ message: error.message || 'Failed to unsubscribe'
330
+ }
331
+ });
332
+ }
333
+ }
334
+ }
335
+ // Standard MCP request handling
336
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
337
+ sessionIdGenerator: undefined,
338
+ enableJsonResponse: true,
339
+ });
340
+ res.on('close', () => {
341
+ transport.close();
342
+ delete sdkServer._currentContext;
343
+ });
344
+ await sdkServer.connect(transport);
345
+ await transport.handleRequest(req, res, req.body);
346
+ }));
347
+ // Additional webhook subscription endpoints (extensions to MCP)
348
+ app.post(`${basePath}/resources/subscribe`, asyncHandler(async (req, res) => {
349
+ const context = await authenticate(req, config);
350
+ const { uri, callbackUrl, callbackSecret } = req.body.params || req.body;
351
+ if (!uri || !callbackUrl) {
352
+ throw new errors_1.ValidationError('uri and callbackUrl are required');
353
+ }
354
+ if (!(0, utils_1.isValidUrl)(callbackUrl)) {
355
+ throw new errors_1.ValidationError('Invalid callbackUrl');
356
+ }
357
+ const result = await subscriptionManager.createSubscription({
358
+ uri,
359
+ clientCallbackUrl: callbackUrl,
360
+ clientCallbackSecret: callbackSecret,
361
+ context,
362
+ });
363
+ res.json(result);
364
+ }));
365
+ app.post(`${basePath}/resources/unsubscribe`, asyncHandler(async (req, res) => {
366
+ const context = await authenticate(req, config);
367
+ const { subscriptionId } = req.body.params || req.body;
368
+ if (!subscriptionId) {
369
+ throw new errors_1.ValidationError('subscriptionId is required');
370
+ }
371
+ await subscriptionManager.deleteSubscription(subscriptionId, context);
372
+ res.json({ status: 'unsubscribed' });
373
+ }));
374
+ // Webhook endpoints
375
+ const webhookPath = config.webhooks?.incomingPath || '/webhooks/incoming';
376
+ app.post(`${webhookPath}/:subscriptionId`, asyncHandler(async (req, res) => {
377
+ const { subscriptionId } = req.params;
378
+ const payload = req.body;
379
+ const headers = req.headers;
380
+ logger.debug('Received webhook', { subscriptionId });
381
+ // Load subscription
382
+ const subscription = await subscriptionManager.getSubscription(subscriptionId);
383
+ if (!subscription) {
384
+ logger.warn('Subscription not found', { subscriptionId });
385
+ return res.status(404).json({ error: 'Subscription not found' });
386
+ }
387
+ // Process webhook
388
+ const changeInfo = await webhookManager.processIncomingWebhook(subscriptionId, payload, headers, subscription);
389
+ if (changeInfo) {
390
+ // Notify client (async, don't wait)
391
+ webhookManager.notifyClient(subscription, changeInfo).catch((error) => {
392
+ logger.error('Failed to notify client', {
393
+ subscriptionId,
394
+ error: error instanceof Error ? error.message : String(error),
395
+ });
396
+ });
397
+ }
398
+ res.json({ received: true });
399
+ }));
400
+ // Error handler
401
+ app.use((err, _req, res, _next) => {
402
+ if (err instanceof errors_1.MCPError) {
403
+ logger.warn('MCP Error', { code: err.code, message: err.message });
404
+ return res.status(400).json(err.toJSON());
405
+ }
406
+ logger.error('Unexpected error', {
407
+ error: err.message,
408
+ stack: err.stack,
409
+ });
410
+ res.status(500).json({
411
+ error: {
412
+ code: -1,
413
+ message: 'Internal server error',
414
+ },
415
+ });
416
+ });
417
+ // Server instance
418
+ let server;
419
+ const mcpServer = {
420
+ async start() {
421
+ return new Promise((resolve) => {
422
+ server = app.listen(port, host, () => {
423
+ logger.info(`MCP Server started`, {
424
+ name: config.name,
425
+ version: config.version,
426
+ host,
427
+ port,
428
+ publicUrl: config.publicUrl,
429
+ });
430
+ resolve();
431
+ });
432
+ });
433
+ },
434
+ async stop() {
435
+ if (server) {
436
+ return new Promise((resolve) => {
437
+ server.close(() => {
438
+ logger.info('MCP Server stopped');
439
+ resolve();
440
+ });
441
+ });
442
+ }
443
+ },
444
+ getApp() {
445
+ return app;
446
+ },
447
+ };
448
+ return mcpServer;
449
+ }
450
+ /**
451
+ * Validate server configuration
452
+ */
453
+ function validateConfig(config) {
454
+ if (!config.name) {
455
+ throw new Error('Server name is required');
456
+ }
457
+ if (!config.version) {
458
+ throw new Error('Server version is required');
459
+ }
460
+ if (!config.publicUrl) {
461
+ throw new Error('publicUrl is required');
462
+ }
463
+ if (!(0, utils_1.isValidUrl)(config.publicUrl)) {
464
+ throw new Error('Invalid publicUrl');
465
+ }
466
+ if (process.env.NODE_ENV === 'production' && !(0, utils_1.isHttpsUrl)(config.publicUrl)) {
467
+ throw new Error('publicUrl must use HTTPS in production');
468
+ }
469
+ if (!config.store) {
470
+ throw new Error('Store is required');
471
+ }
472
+ if (!Array.isArray(config.tools)) {
473
+ throw new Error('tools must be an array');
474
+ }
475
+ if (!Array.isArray(config.resources)) {
476
+ throw new Error('resources must be an array');
477
+ }
478
+ }
479
+ /**
480
+ * Authenticate request
481
+ */
482
+ async function authenticate(req, config) {
483
+ if (!config.authenticate) {
484
+ // No authentication configured - return default context
485
+ return { userId: 'anonymous' };
486
+ }
487
+ try {
488
+ return await config.authenticate(req);
489
+ }
490
+ catch (error) {
491
+ throw new errors_1.AuthenticationError(error instanceof Error ? error.message : 'Authentication failed');
492
+ }
493
+ }
494
+ /**
495
+ * Async handler wrapper
496
+ */
497
+ function asyncHandler(fn) {
498
+ return (req, res, next) => {
499
+ Promise.resolve(fn(req, res)).catch(next);
500
+ };
501
+ }
502
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { KeyValueStore } from '../types';
2
+ /**
3
+ * In-memory store implementation (for development/testing only)
4
+ * DO NOT USE IN PRODUCTION
5
+ */
6
+ export declare class InMemoryStore implements KeyValueStore {
7
+ private data;
8
+ private cleanupInterval;
9
+ constructor();
10
+ get(key: string): Promise<string | null>;
11
+ set(key: string, value: string, ttl?: number): Promise<void>;
12
+ delete(key: string): Promise<void>;
13
+ scan(pattern: string): Promise<string[]>;
14
+ /**
15
+ * Cleanup expired keys
16
+ */
17
+ private cleanup;
18
+ /**
19
+ * Clear all data
20
+ */
21
+ clear(): void;
22
+ /**
23
+ * Destroy store and cleanup interval
24
+ */
25
+ destroy(): void;
26
+ }
27
+ //# sourceMappingURL=InMemoryStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryStore.d.ts","sourceRoot":"","sources":["../../src/stores/InMemoryStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;GAGG;AACH,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,IAAI,CAAiE;IAC7E,OAAO,CAAC,eAAe,CAAiB;;IAOlC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAc9C;;OAEG;IACH,OAAO,CAAC,OAAO;IAUf;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryStore = void 0;
4
+ /**
5
+ * In-memory store implementation (for development/testing only)
6
+ * DO NOT USE IN PRODUCTION
7
+ */
8
+ class InMemoryStore {
9
+ constructor() {
10
+ this.data = new Map();
11
+ // Cleanup expired keys every minute
12
+ this.cleanupInterval = setInterval(() => this.cleanup(), 60000);
13
+ }
14
+ async get(key) {
15
+ const item = this.data.get(key);
16
+ if (!item) {
17
+ return null;
18
+ }
19
+ // Check expiration
20
+ if (item.expiresAt && item.expiresAt < Date.now()) {
21
+ this.data.delete(key);
22
+ return null;
23
+ }
24
+ return item.value;
25
+ }
26
+ async set(key, value, ttl) {
27
+ const item = { value };
28
+ if (ttl) {
29
+ item.expiresAt = Date.now() + ttl * 1000;
30
+ }
31
+ this.data.set(key, item);
32
+ }
33
+ async delete(key) {
34
+ this.data.delete(key);
35
+ }
36
+ async scan(pattern) {
37
+ // Simple glob pattern matching
38
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
39
+ const keys = [];
40
+ for (const key of this.data.keys()) {
41
+ if (regex.test(key)) {
42
+ keys.push(key);
43
+ }
44
+ }
45
+ return keys;
46
+ }
47
+ /**
48
+ * Cleanup expired keys
49
+ */
50
+ cleanup() {
51
+ const now = Date.now();
52
+ for (const [key, item] of this.data.entries()) {
53
+ if (item.expiresAt && item.expiresAt < now) {
54
+ this.data.delete(key);
55
+ }
56
+ }
57
+ }
58
+ /**
59
+ * Clear all data
60
+ */
61
+ clear() {
62
+ this.data.clear();
63
+ }
64
+ /**
65
+ * Destroy store and cleanup interval
66
+ */
67
+ destroy() {
68
+ clearInterval(this.cleanupInterval);
69
+ this.clear();
70
+ }
71
+ }
72
+ exports.InMemoryStore = InMemoryStore;
73
+ //# sourceMappingURL=InMemoryStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryStore.js","sourceRoot":"","sources":["../../src/stores/InMemoryStore.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,aAAa;IAIxB;QAHQ,SAAI,GAAuD,IAAI,GAAG,EAAE,CAAC;QAI3E,oCAAoC;QACpC,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,GAAY;QAChD,MAAM,IAAI,GAA0C,EAAE,KAAK,EAAE,CAAC;QAE9D,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,+BAA+B;QAC/B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACnE,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF;AAhFD,sCAgFC"}
@@ -0,0 +1,18 @@
1
+ import { KeyValueStore } from '../types';
2
+ /**
3
+ * Redis store implementation
4
+ * Requires ioredis package
5
+ */
6
+ export declare class RedisStore implements KeyValueStore {
7
+ private redis;
8
+ constructor(redis: any);
9
+ get(key: string): Promise<string | null>;
10
+ set(key: string, value: string, ttl?: number): Promise<void>;
11
+ delete(key: string): Promise<void>;
12
+ scan(pattern: string): Promise<string[]>;
13
+ }
14
+ /**
15
+ * Create Redis store from connection URL
16
+ */
17
+ export declare function createRedisStore(redis: any): KeyValueStore;
18
+ //# sourceMappingURL=RedisStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisStore.d.ts","sourceRoot":"","sources":["../../src/stores/RedisStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;GAGG;AACH,qBAAa,UAAW,YAAW,aAAa;IAClC,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,GAAG;IAExB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAkB/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,GAAG,aAAa,CAE1D"}