@reveldigital/mcp-graphql-proxy 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 (70) hide show
  1. package/dist/bin/cli.d.ts +6 -0
  2. package/dist/bin/cli.d.ts.map +1 -0
  3. package/dist/bin/cli.js +7 -0
  4. package/dist/bin/cli.js.map +1 -0
  5. package/dist/core/cache.d.ts +61 -0
  6. package/dist/core/cache.d.ts.map +1 -0
  7. package/dist/core/cache.js +147 -0
  8. package/dist/core/cache.js.map +1 -0
  9. package/dist/core/graphql-client.d.ts +48 -0
  10. package/dist/core/graphql-client.d.ts.map +1 -0
  11. package/dist/core/graphql-client.js +210 -0
  12. package/dist/core/graphql-client.js.map +1 -0
  13. package/dist/core/query-builder.d.ts +90 -0
  14. package/dist/core/query-builder.d.ts.map +1 -0
  15. package/dist/core/query-builder.js +259 -0
  16. package/dist/core/query-builder.js.map +1 -0
  17. package/dist/core/response-optimizer.d.ts +59 -0
  18. package/dist/core/response-optimizer.d.ts.map +1 -0
  19. package/dist/core/response-optimizer.js +197 -0
  20. package/dist/core/response-optimizer.js.map +1 -0
  21. package/dist/index.d.ts +16 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +377 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/types/auth.d.ts +146 -0
  26. package/dist/types/auth.d.ts.map +1 -0
  27. package/dist/types/auth.js +22 -0
  28. package/dist/types/auth.js.map +1 -0
  29. package/dist/types/cache.d.ts +162 -0
  30. package/dist/types/cache.d.ts.map +1 -0
  31. package/dist/types/cache.js +34 -0
  32. package/dist/types/cache.js.map +1 -0
  33. package/dist/types/config.d.ts +108 -0
  34. package/dist/types/config.d.ts.map +1 -0
  35. package/dist/types/config.js +37 -0
  36. package/dist/types/config.js.map +1 -0
  37. package/dist/types/graphql-proxy.d.ts +243 -0
  38. package/dist/types/graphql-proxy.d.ts.map +1 -0
  39. package/dist/types/graphql-proxy.js +142 -0
  40. package/dist/types/graphql-proxy.js.map +1 -0
  41. package/dist/types/index.d.ts +15 -0
  42. package/dist/types/index.d.ts.map +1 -0
  43. package/dist/types/index.js +16 -0
  44. package/dist/types/index.js.map +1 -0
  45. package/dist/types/logging.d.ts +223 -0
  46. package/dist/types/logging.d.ts.map +1 -0
  47. package/dist/types/logging.js +67 -0
  48. package/dist/types/logging.js.map +1 -0
  49. package/dist/types/mcp.d.ts +160 -0
  50. package/dist/types/mcp.d.ts.map +1 -0
  51. package/dist/types/mcp.js +126 -0
  52. package/dist/types/mcp.js.map +1 -0
  53. package/dist/types/metrics.d.ts +237 -0
  54. package/dist/types/metrics.d.ts.map +1 -0
  55. package/dist/types/metrics.js +26 -0
  56. package/dist/types/metrics.js.map +1 -0
  57. package/dist/types/rate-limit.d.ts +144 -0
  58. package/dist/types/rate-limit.d.ts.map +1 -0
  59. package/dist/types/rate-limit.js +43 -0
  60. package/dist/types/rate-limit.js.map +1 -0
  61. package/dist/types/tenant.d.ts +176 -0
  62. package/dist/types/tenant.d.ts.map +1 -0
  63. package/dist/types/tenant.js +63 -0
  64. package/dist/types/tenant.js.map +1 -0
  65. package/dist/types/transformation.d.ts +198 -0
  66. package/dist/types/transformation.d.ts.map +1 -0
  67. package/dist/types/transformation.js +51 -0
  68. package/dist/types/transformation.js.map +1 -0
  69. package/package.json +77 -0
  70. package/src/types/schema.graphql +2712 -0
package/dist/index.js ADDED
@@ -0,0 +1,377 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Revel Digital MCP GraphQL Proxy Server
4
+ *
5
+ * An MCP server that enables AI agents to interact with the Revel Digital
6
+ * GraphQL API for digital signage management.
7
+ *
8
+ * Features:
9
+ * - Execute custom GraphQL queries
10
+ * - Build optimized queries with field selection
11
+ * - Authentication header proxying
12
+ * - Response caching
13
+ * - Context window optimization
14
+ */
15
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
16
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
17
+ import { z } from 'zod';
18
+ import { GraphQLClient } from './core/graphql-client.js';
19
+ import { ResponseCache } from './core/cache.js';
20
+ import { QueryBuilder } from './core/query-builder.js';
21
+ import { ResponseOptimizer } from './core/response-optimizer.js';
22
+ import { defaultGraphQLProxyConfig, } from './types/graphql-proxy.js';
23
+ // ============================================================================
24
+ // Server Configuration
25
+ // ============================================================================
26
+ const config = {
27
+ ...defaultGraphQLProxyConfig,
28
+ endpoint: process.env.REVELDIGITAL_GRAPHQL_ENDPOINT ?? defaultGraphQLProxyConfig.endpoint,
29
+ // REVELDIGITAL_AUTH_TOKEN → Authorization: Bearer header
30
+ authToken: process.env.REVELDIGITAL_AUTH_TOKEN,
31
+ timeout: parseInt(process.env.REQUEST_TIMEOUT ?? '30000', 10),
32
+ enableCache: process.env.ENABLE_CACHE !== 'false',
33
+ cacheTtl: parseInt(process.env.CACHE_TTL ?? '300', 10),
34
+ maxResponseSize: parseInt(process.env.MAX_RESPONSE_SIZE ?? '50000', 10),
35
+ debug: process.env.DEBUG === 'true',
36
+ };
37
+ // ============================================================================
38
+ // Initialize Components
39
+ // ============================================================================
40
+ const graphqlClient = new GraphQLClient(config);
41
+ const cache = new ResponseCache(config.cacheTtl);
42
+ const optimizer = new ResponseOptimizer(config.maxResponseSize);
43
+ // ============================================================================
44
+ // MCP Server Setup
45
+ // ============================================================================
46
+ const server = new McpServer({
47
+ name: 'reveldigital-graphql-proxy',
48
+ version: '1.0.0',
49
+ });
50
+ // ============================================================================
51
+ // Tool: Execute GraphQL Query
52
+ // ============================================================================
53
+ server.tool('execute_query', 'Execute a GraphQL query against the Revel Digital API. Supports custom queries with variables.', {
54
+ query: z.string().describe('The GraphQL query string to execute'),
55
+ variables: z.record(z.unknown()).optional().describe('Query variables as a JSON object'),
56
+ operationName: z.string().optional().describe('Operation name if query contains multiple operations'),
57
+ useCache: z.boolean().optional().default(true).describe('Whether to use cached results if available'),
58
+ }, async (args) => {
59
+ const startTime = Date.now();
60
+ try {
61
+ // Check cache first
62
+ if (args.useCache && config.enableCache) {
63
+ const cached = cache.get(args.query, args.variables);
64
+ if (cached) {
65
+ const result = {
66
+ success: true,
67
+ data: cached,
68
+ metadata: {
69
+ queryTime: Date.now() - startTime,
70
+ cached: true,
71
+ },
72
+ };
73
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
74
+ }
75
+ }
76
+ // Execute query
77
+ const response = await graphqlClient.query(args.query, args.variables, args.operationName);
78
+ // Handle errors
79
+ if (response.errors && response.errors.length > 0) {
80
+ const result = {
81
+ success: false,
82
+ error: response.errors.map((e) => e.message).join('; '),
83
+ data: response.data,
84
+ };
85
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
86
+ }
87
+ // Cache successful response
88
+ if (args.useCache && config.enableCache && response.data) {
89
+ cache.set(args.query, args.variables, response.data);
90
+ }
91
+ // Optimize response for context window
92
+ const optimized = optimizer.optimize(response.data);
93
+ const result = {
94
+ success: true,
95
+ data: optimized.data,
96
+ metadata: {
97
+ queryTime: Date.now() - startTime,
98
+ cached: false,
99
+ ...optimized.metadata,
100
+ },
101
+ };
102
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
103
+ }
104
+ catch (error) {
105
+ const result = {
106
+ success: false,
107
+ error: error instanceof Error ? error.message : 'Unknown error',
108
+ };
109
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
110
+ }
111
+ });
112
+ // ============================================================================
113
+ // Tool: Build Optimized Query
114
+ // ============================================================================
115
+ server.tool('build_query', 'Build an optimized GraphQL query with field selection, filtering, and sorting. Returns query and variables ready for execution.', {
116
+ operation: z.enum([
117
+ 'device', 'deviceGroups', 'media', 'mediaGroups',
118
+ 'playlist', 'playlistGroups', 'schedule', 'scheduleGroups',
119
+ 'template', 'templateGroups', 'user',
120
+ 'playLogs', 'pingLogs', 'eventLogs', 'impressions',
121
+ 'deviceMetrics', 'audienceMetrics', 'mediaPlayStats',
122
+ ]).describe('The query operation to perform'),
123
+ fields: z.array(z.string()).describe('Fields to select. Use dot notation for nested fields (e.g., "pingData.cpuUsage")'),
124
+ preset: z.enum(['minimal', 'basic', 'status', 'location', 'full']).optional()
125
+ .describe('Use a predefined field set instead of specifying fields'),
126
+ filter: z.record(z.unknown()).optional().describe('Filter conditions (e.g., {"isOnline": true})'),
127
+ limit: z.number().optional().describe('Maximum number of results to return'),
128
+ orderBy: z.string().optional().describe('Field to sort by'),
129
+ orderDirection: z.enum(['ASC', 'DESC']).optional().default('ASC').describe('Sort direction'),
130
+ startDate: z.string().optional().describe('Start date for analytics queries (ISO 8601 format)'),
131
+ endDate: z.string().optional().describe('End date for analytics queries (ISO 8601 format)'),
132
+ deviceId: z.array(z.string()).optional().describe('Filter by device IDs (for analytics)'),
133
+ }, async (args) => {
134
+ try {
135
+ const queryArgs = {};
136
+ // Add date range for analytics queries
137
+ if (args.startDate)
138
+ queryArgs.startDate = args.startDate;
139
+ if (args.endDate)
140
+ queryArgs.endDate = args.endDate;
141
+ if (args.deviceId)
142
+ queryArgs.deviceId = args.deviceId;
143
+ if (args.limit)
144
+ queryArgs.limit = args.limit;
145
+ const { query, variables } = QueryBuilder.build({
146
+ operation: args.operation,
147
+ fields: args.fields ?? [],
148
+ preset: args.preset,
149
+ arguments: queryArgs,
150
+ filter: args.filter,
151
+ orderBy: args.orderBy ? { field: args.orderBy, direction: args.orderDirection ?? 'ASC' } : undefined,
152
+ });
153
+ const result = {
154
+ success: true,
155
+ query,
156
+ variables,
157
+ tip: 'Use execute_query tool with this query and variables to run it.',
158
+ };
159
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
160
+ }
161
+ catch (error) {
162
+ const result = {
163
+ success: false,
164
+ error: error instanceof Error ? error.message : 'Unknown error',
165
+ };
166
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
167
+ }
168
+ });
169
+ // ============================================================================
170
+ // Tool: Introspect Schema
171
+ // ============================================================================
172
+ server.tool('introspect_schema', 'Get information about the Revel Digital GraphQL schema. Use this to discover available types, fields, and query parameters.', {
173
+ typeName: z.string().optional().describe('Specific type name to introspect (e.g., "Device", "Media"). If not provided, returns overview.'),
174
+ }, async (args) => {
175
+ try {
176
+ let response;
177
+ if (args.typeName) {
178
+ response = await graphqlClient.introspectType(args.typeName);
179
+ }
180
+ else {
181
+ // Return a summary of available queries instead of full introspection
182
+ const operations = QueryBuilder.getOperations();
183
+ const result = {
184
+ success: true,
185
+ data: {
186
+ availableQueries: operations,
187
+ contentManagement: ['device', 'deviceGroups', 'media', 'mediaGroups', 'playlist', 'playlistGroups', 'schedule', 'scheduleGroups', 'template', 'templateGroups', 'user'],
188
+ analytics: ['playLogs', 'pingLogs', 'eventLogs', 'impressions', 'deviceMetrics', 'audienceMetrics', 'mediaPlayStats'],
189
+ fieldPresets: {
190
+ device: Object.keys(QueryBuilder.getFieldPresets('device') ?? {}),
191
+ media: Object.keys(QueryBuilder.getFieldPresets('media') ?? {}),
192
+ playlist: Object.keys(QueryBuilder.getFieldPresets('playlist') ?? {}),
193
+ schedule: Object.keys(QueryBuilder.getFieldPresets('schedule') ?? {}),
194
+ },
195
+ tip: 'Use introspect_schema with typeName parameter to get details about specific types.',
196
+ },
197
+ };
198
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
199
+ }
200
+ // Optimize introspection response
201
+ const optimized = optimizer.optimize(response.data, { maxSize: 30000 });
202
+ const result = {
203
+ success: true,
204
+ data: optimized.data,
205
+ metadata: optimized.metadata,
206
+ };
207
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
208
+ }
209
+ catch (error) {
210
+ const result = {
211
+ success: false,
212
+ error: error instanceof Error ? error.message : 'Unknown error',
213
+ };
214
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
215
+ }
216
+ });
217
+ // ============================================================================
218
+ // Tool: Quick Queries
219
+ // ============================================================================
220
+ server.tool('quick_query', 'Execute common pre-built queries for typical use cases.', {
221
+ queryType: z.enum([
222
+ 'devices_status',
223
+ 'online_devices',
224
+ 'recent_media',
225
+ 'active_schedules',
226
+ 'play_logs',
227
+ ]).describe('Type of quick query to execute'),
228
+ startDate: z.string().optional().describe('Start date for analytics (required for play_logs)'),
229
+ endDate: z.string().optional().describe('End date for analytics (required for play_logs)'),
230
+ deviceId: z.array(z.string()).optional().describe('Device IDs to filter by (for play_logs)'),
231
+ limit: z.number().optional().default(50).describe('Maximum results to return'),
232
+ }, async (args) => {
233
+ try {
234
+ let queryConfig;
235
+ switch (args.queryType) {
236
+ case 'devices_status':
237
+ queryConfig = QueryBuilder.quick.devicesStatus();
238
+ break;
239
+ case 'online_devices':
240
+ queryConfig = QueryBuilder.quick.onlineDevices();
241
+ break;
242
+ case 'recent_media':
243
+ queryConfig = QueryBuilder.quick.recentMedia(args.limit);
244
+ break;
245
+ case 'active_schedules':
246
+ queryConfig = QueryBuilder.quick.activeSchedules();
247
+ break;
248
+ case 'play_logs':
249
+ if (!args.startDate || !args.endDate) {
250
+ throw new Error('play_logs requires startDate and endDate');
251
+ }
252
+ queryConfig = QueryBuilder.quick.playLogs(args.startDate, args.endDate, args.deviceId);
253
+ break;
254
+ default:
255
+ throw new Error(`Unknown query type: ${args.queryType}`);
256
+ }
257
+ const response = await graphqlClient.query(queryConfig.query, queryConfig.variables);
258
+ if (response.errors && response.errors.length > 0) {
259
+ const result = {
260
+ success: false,
261
+ error: response.errors.map((e) => e.message).join('; '),
262
+ };
263
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
264
+ }
265
+ const optimized = optimizer.optimize(response.data);
266
+ const result = {
267
+ success: true,
268
+ data: optimized.data,
269
+ metadata: optimized.metadata,
270
+ };
271
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
272
+ }
273
+ catch (error) {
274
+ const result = {
275
+ success: false,
276
+ error: error instanceof Error ? error.message : 'Unknown error',
277
+ };
278
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
279
+ }
280
+ });
281
+ // ============================================================================
282
+ // Tool: Cache Management
283
+ // ============================================================================
284
+ server.tool('manage_cache', 'Manage the response cache - view statistics or clear cached data.', {
285
+ action: z.enum(['stats', 'clear', 'cleanup']).describe('Cache action to perform'),
286
+ }, async (args) => {
287
+ switch (args.action) {
288
+ case 'stats': {
289
+ const stats = cache.getStats();
290
+ const hitRate = cache.getHitRate();
291
+ const result = {
292
+ success: true,
293
+ data: {
294
+ ...stats,
295
+ hitRate: `${(hitRate * 100).toFixed(1)}%`,
296
+ sizeFormatted: ResponseOptimizer.formatSize(stats.size),
297
+ },
298
+ };
299
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
300
+ }
301
+ case 'clear':
302
+ cache.clear();
303
+ return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Cache cleared' }, null, 2) }] };
304
+ case 'cleanup': {
305
+ const removed = cache.cleanup();
306
+ return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: `Removed ${removed} expired entries` }, null, 2) }] };
307
+ }
308
+ }
309
+ });
310
+ // ============================================================================
311
+ // Resources: Schema Documentation
312
+ // ============================================================================
313
+ server.resource('schema://reveldigital/graphql', 'Revel Digital GraphQL Schema', async () => {
314
+ const schemaContent = `# Revel Digital GraphQL API
315
+
316
+ ## Available Queries
317
+
318
+ ### Content Management
319
+ - device - Query devices (players)
320
+ - deviceGroups - Query device groups
321
+ - media - Query media files
322
+ - mediaGroups - Query media groups
323
+ - playlist - Query playlists
324
+ - playlistGroups - Query playlist groups
325
+ - schedule - Query schedules
326
+ - scheduleGroups - Query schedule groups
327
+ - template - Query templates
328
+ - templateGroups - Query template groups
329
+ - user - Query users
330
+
331
+ ### Analytics (require date range)
332
+ - playLogs - Content playback records
333
+ - pingLogs - Device health/heartbeat logs
334
+ - eventLogs - Custom event logs
335
+ - impressions - Audience detection data
336
+ - deviceMetrics - Aggregated device health
337
+ - audienceMetrics - Aggregated audience data
338
+ - mediaPlayStats - Media performance stats
339
+
340
+ ## Field Presets
341
+ Use the build_query tool with preset parameter:
342
+ - minimal - Just ID and name
343
+ - basic - Common fields
344
+ - status - Include health/status data
345
+ - location - Include location data
346
+ - full - All available fields
347
+
348
+ ## Authentication
349
+ Set API key via environment variable REVELDIGITAL_API_KEY
350
+ or use set_auth tool at runtime.
351
+ `;
352
+ return {
353
+ contents: [{
354
+ uri: 'schema://reveldigital/graphql',
355
+ text: schemaContent,
356
+ mimeType: 'text/markdown'
357
+ }]
358
+ };
359
+ });
360
+ // ============================================================================
361
+ // Start Server
362
+ // ============================================================================
363
+ async function main() {
364
+ const transport = new StdioServerTransport();
365
+ if (config.debug) {
366
+ console.error('[MCP] Starting Revel Digital GraphQL Proxy Server');
367
+ console.error(`[MCP] Endpoint: ${config.endpoint}`);
368
+ console.error(`[MCP] Cache enabled: ${config.enableCache}`);
369
+ console.error(`[MCP] Auth Token (Bearer): ${config.authToken ? 'configured' : 'NOT SET - authentication required!'}`);
370
+ }
371
+ await server.connect(transport);
372
+ }
373
+ main().catch((error) => {
374
+ console.error('[MCP] Fatal error:', error);
375
+ process.exit(1);
376
+ });
377
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Authentication Types
3
+ *
4
+ * Authentication configuration and runtime context interfaces.
5
+ */
6
+ /**
7
+ * Authentication configuration
8
+ */
9
+ export interface AuthConfig {
10
+ /** Default authentication method */
11
+ defaultMethod: AuthMethod;
12
+ /** API key configurations (for multi-tenant) */
13
+ apiKeys: ApiKeyConfig[];
14
+ /** Header injection settings */
15
+ headerInjection: HeaderInjectionConfig;
16
+ /** Session management */
17
+ session: SessionConfig;
18
+ }
19
+ /**
20
+ * Supported authentication methods for Revel Digital API
21
+ */
22
+ export type AuthMethod = 'bearer' | 'api-key-header' | 'query-param';
23
+ /**
24
+ * API key configuration for a tenant or client
25
+ */
26
+ export interface ApiKeyConfig {
27
+ /** Unique identifier for this API key configuration */
28
+ id: string;
29
+ /** Display name */
30
+ name: string;
31
+ /** The actual API key (or reference to secret store) */
32
+ key: string;
33
+ /** Associated tenant ID */
34
+ tenantId?: string;
35
+ /** Authentication method to use */
36
+ method: AuthMethod;
37
+ /** Custom header name for api-key-header method (default: X-RevelDigital-API) */
38
+ headerName?: string;
39
+ /** Query parameter name for query-param method (default: apiKey) */
40
+ queryParam?: string;
41
+ /** Scopes/permissions for this key */
42
+ scopes?: string[];
43
+ /** Expiration timestamp */
44
+ expiresAt?: Date;
45
+ /** Is this key active? */
46
+ active: boolean;
47
+ /** Key metadata */
48
+ metadata?: Record<string, unknown>;
49
+ }
50
+ /**
51
+ * Header injection configuration
52
+ */
53
+ export interface HeaderInjectionConfig {
54
+ /** Headers to inject on every request */
55
+ static: Record<string, string>;
56
+ /** Dynamic header generation rules */
57
+ dynamic: DynamicHeaderRule[];
58
+ }
59
+ /**
60
+ * Dynamic header generation rule
61
+ */
62
+ export interface DynamicHeaderRule {
63
+ /** Header name to inject */
64
+ name: string;
65
+ /** Source of the value */
66
+ source: HeaderValueSource;
67
+ /** Source path or key */
68
+ path: string;
69
+ /** Transformation to apply */
70
+ transform?: string;
71
+ /** Condition for applying this header */
72
+ condition?: string;
73
+ }
74
+ /**
75
+ * Sources for dynamic header values
76
+ */
77
+ export type HeaderValueSource = 'env' | 'config' | 'request' | 'computed' | 'context';
78
+ /**
79
+ * Session management configuration
80
+ */
81
+ export interface SessionConfig {
82
+ /** Enable session tracking */
83
+ enabled: boolean;
84
+ /** Session timeout in milliseconds */
85
+ timeoutMs: number;
86
+ /** Session storage type */
87
+ storage: 'memory' | 'redis';
88
+ /** Redis connection options if storage is 'redis' */
89
+ redisOptions?: RedisSessionOptions;
90
+ }
91
+ /**
92
+ * Redis session storage options
93
+ */
94
+ export interface RedisSessionOptions {
95
+ /** Redis host */
96
+ host: string;
97
+ /** Redis port */
98
+ port: number;
99
+ /** Redis password */
100
+ password?: string;
101
+ /** Redis database number */
102
+ db?: number;
103
+ /** Key prefix for session data */
104
+ keyPrefix?: string;
105
+ }
106
+ /**
107
+ * Runtime authentication context resolved for a request
108
+ */
109
+ export interface AuthContext {
110
+ /** Resolved tenant ID */
111
+ tenantId: string;
112
+ /** API key configuration used */
113
+ apiKeyConfig: ApiKeyConfig;
114
+ /** Session ID if sessions enabled */
115
+ sessionId?: string;
116
+ /** Scopes available in this context */
117
+ scopes: string[];
118
+ /** Timestamp of authentication */
119
+ authenticatedAt: Date;
120
+ /** Is the authentication valid? */
121
+ isValid: boolean;
122
+ /** Error message if not valid */
123
+ errorMessage?: string;
124
+ }
125
+ /**
126
+ * Authentication result from validation
127
+ */
128
+ export interface AuthResult {
129
+ /** Was authentication successful? */
130
+ success: boolean;
131
+ /** Auth context if successful */
132
+ context?: AuthContext;
133
+ /** Error code if failed */
134
+ errorCode?: AuthErrorCode;
135
+ /** Error message if failed */
136
+ errorMessage?: string;
137
+ }
138
+ /**
139
+ * Authentication error codes
140
+ */
141
+ export type AuthErrorCode = 'MISSING_CREDENTIALS' | 'INVALID_API_KEY' | 'EXPIRED_API_KEY' | 'INACTIVE_API_KEY' | 'INSUFFICIENT_SCOPE' | 'INVALID_SESSION' | 'SESSION_EXPIRED';
142
+ /**
143
+ * Default authentication configuration
144
+ */
145
+ export declare const DEFAULT_AUTH_CONFIG: AuthConfig;
146
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Authentication Types
3
+ *
4
+ * Authentication configuration and runtime context interfaces.
5
+ */
6
+ /**
7
+ * Default authentication configuration
8
+ */
9
+ export const DEFAULT_AUTH_CONFIG = {
10
+ defaultMethod: 'api-key-header',
11
+ apiKeys: [],
12
+ headerInjection: {
13
+ static: {},
14
+ dynamic: [],
15
+ },
16
+ session: {
17
+ enabled: false,
18
+ timeoutMs: 3600000, // 1 hour
19
+ storage: 'memory',
20
+ },
21
+ };
22
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8LH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,aAAa,EAAE,gBAAgB;IAC/B,OAAO,EAAE,EAAE;IACX,eAAe,EAAE;QACf,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;KACZ;IACD,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,OAAO,EAAE,QAAQ;KAClB;CACF,CAAC"}