mcp-server-rocketchat-threads 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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +332 -0
  3. package/dist/api/client.d.ts +119 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +305 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/index.d.ts +6 -0
  8. package/dist/api/index.d.ts.map +1 -0
  9. package/dist/api/index.js +22 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/api/schemas.d.ts +10636 -0
  12. package/dist/api/schemas.d.ts.map +1 -0
  13. package/dist/api/schemas.js +267 -0
  14. package/dist/api/schemas.js.map +1 -0
  15. package/dist/api/types.d.ts +263 -0
  16. package/dist/api/types.d.ts.map +1 -0
  17. package/dist/api/types.js +7 -0
  18. package/dist/api/types.js.map +1 -0
  19. package/dist/config/config.d.ts +37 -0
  20. package/dist/config/config.d.ts.map +1 -0
  21. package/dist/config/config.js +79 -0
  22. package/dist/config/config.js.map +1 -0
  23. package/dist/config/index.d.ts +5 -0
  24. package/dist/config/index.d.ts.map +1 -0
  25. package/dist/config/index.js +21 -0
  26. package/dist/config/index.js.map +1 -0
  27. package/dist/di/container.d.ts +101 -0
  28. package/dist/di/container.d.ts.map +1 -0
  29. package/dist/di/container.js +214 -0
  30. package/dist/di/container.js.map +1 -0
  31. package/dist/di/index.d.ts +6 -0
  32. package/dist/di/index.d.ts.map +1 -0
  33. package/dist/di/index.js +12 -0
  34. package/dist/di/index.js.map +1 -0
  35. package/dist/formatters/index.d.ts +6 -0
  36. package/dist/formatters/index.d.ts.map +1 -0
  37. package/dist/formatters/index.js +22 -0
  38. package/dist/formatters/index.js.map +1 -0
  39. package/dist/formatters/message-formatter.d.ts +64 -0
  40. package/dist/formatters/message-formatter.d.ts.map +1 -0
  41. package/dist/formatters/message-formatter.js +161 -0
  42. package/dist/formatters/message-formatter.js.map +1 -0
  43. package/dist/formatters/response-builder.d.ts +60 -0
  44. package/dist/formatters/response-builder.d.ts.map +1 -0
  45. package/dist/formatters/response-builder.js +108 -0
  46. package/dist/formatters/response-builder.js.map +1 -0
  47. package/dist/guards/index.d.ts +12 -0
  48. package/dist/guards/index.d.ts.map +1 -0
  49. package/dist/guards/index.js +42 -0
  50. package/dist/guards/index.js.map +1 -0
  51. package/dist/guards/input-validator.d.ts +89 -0
  52. package/dist/guards/input-validator.d.ts.map +1 -0
  53. package/dist/guards/input-validator.js +266 -0
  54. package/dist/guards/input-validator.js.map +1 -0
  55. package/dist/guards/rate-limiter.d.ts +115 -0
  56. package/dist/guards/rate-limiter.d.ts.map +1 -0
  57. package/dist/guards/rate-limiter.js +226 -0
  58. package/dist/guards/rate-limiter.js.map +1 -0
  59. package/dist/guards/sanitizer.d.ts +35 -0
  60. package/dist/guards/sanitizer.d.ts.map +1 -0
  61. package/dist/guards/sanitizer.js +111 -0
  62. package/dist/guards/sanitizer.js.map +1 -0
  63. package/dist/guards/write-guard.d.ts +33 -0
  64. package/dist/guards/write-guard.d.ts.map +1 -0
  65. package/dist/guards/write-guard.js +90 -0
  66. package/dist/guards/write-guard.js.map +1 -0
  67. package/dist/http-server.d.ts +9 -0
  68. package/dist/http-server.d.ts.map +1 -0
  69. package/dist/http-server.js +190 -0
  70. package/dist/http-server.js.map +1 -0
  71. package/dist/index.d.ts +14 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +114 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/tools/base.d.ts +85 -0
  76. package/dist/tools/base.d.ts.map +1 -0
  77. package/dist/tools/base.js +184 -0
  78. package/dist/tools/base.js.map +1 -0
  79. package/dist/tools/channel-tools.d.ts +18 -0
  80. package/dist/tools/channel-tools.d.ts.map +1 -0
  81. package/dist/tools/channel-tools.js +151 -0
  82. package/dist/tools/channel-tools.js.map +1 -0
  83. package/dist/tools/handler-utils.d.ts +75 -0
  84. package/dist/tools/handler-utils.d.ts.map +1 -0
  85. package/dist/tools/handler-utils.js +105 -0
  86. package/dist/tools/handler-utils.js.map +1 -0
  87. package/dist/tools/index.d.ts +17 -0
  88. package/dist/tools/index.d.ts.map +1 -0
  89. package/dist/tools/index.js +40 -0
  90. package/dist/tools/index.js.map +1 -0
  91. package/dist/tools/message-tools.d.ts +20 -0
  92. package/dist/tools/message-tools.d.ts.map +1 -0
  93. package/dist/tools/message-tools.js +194 -0
  94. package/dist/tools/message-tools.js.map +1 -0
  95. package/dist/tools/thread-tools.d.ts +23 -0
  96. package/dist/tools/thread-tools.d.ts.map +1 -0
  97. package/dist/tools/thread-tools.js +243 -0
  98. package/dist/tools/thread-tools.js.map +1 -0
  99. package/dist/tools/user-tools.d.ts +14 -0
  100. package/dist/tools/user-tools.d.ts.map +1 -0
  101. package/dist/tools/user-tools.js +120 -0
  102. package/dist/tools/user-tools.js.map +1 -0
  103. package/dist/tools/write-tools.d.ts +15 -0
  104. package/dist/tools/write-tools.d.ts.map +1 -0
  105. package/dist/tools/write-tools.js +181 -0
  106. package/dist/tools/write-tools.js.map +1 -0
  107. package/dist/utils/cache.d.ts +47 -0
  108. package/dist/utils/cache.d.ts.map +1 -0
  109. package/dist/utils/cache.js +116 -0
  110. package/dist/utils/cache.js.map +1 -0
  111. package/dist/utils/error-handler.d.ts +64 -0
  112. package/dist/utils/error-handler.d.ts.map +1 -0
  113. package/dist/utils/error-handler.js +148 -0
  114. package/dist/utils/error-handler.js.map +1 -0
  115. package/dist/utils/index.d.ts +12 -0
  116. package/dist/utils/index.d.ts.map +1 -0
  117. package/dist/utils/index.js +33 -0
  118. package/dist/utils/index.js.map +1 -0
  119. package/dist/utils/logger.d.ts +50 -0
  120. package/dist/utils/logger.d.ts.map +1 -0
  121. package/dist/utils/logger.js +118 -0
  122. package/dist/utils/logger.js.map +1 -0
  123. package/dist/utils/time-parser.d.ts +37 -0
  124. package/dist/utils/time-parser.d.ts.map +1 -0
  125. package/dist/utils/time-parser.js +98 -0
  126. package/dist/utils/time-parser.js.map +1 -0
  127. package/dist/utils/token-counter.d.ts +42 -0
  128. package/dist/utils/token-counter.d.ts.map +1 -0
  129. package/dist/utils/token-counter.js +81 -0
  130. package/dist/utils/token-counter.js.map +1 -0
  131. package/package.json +68 -0
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /**
3
+ * Message Formatter
4
+ * Transforms Rocket.Chat API responses into MCP-friendly formats
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.formatMessage = formatMessage;
8
+ exports.formatMessages = formatMessages;
9
+ exports.formatChannel = formatChannel;
10
+ exports.formatChannels = formatChannels;
11
+ exports.formatThread = formatThread;
12
+ exports.formatThreads = formatThreads;
13
+ exports.formatUser = formatUser;
14
+ exports.formatUsers = formatUsers;
15
+ exports.formatThreadWithReplies = formatThreadWithReplies;
16
+ exports.createSearchSummary = createSearchSummary;
17
+ /**
18
+ * Format a single message for MCP response
19
+ * Supports both regular messages and search results with OpenSearch fields
20
+ */
21
+ function formatMessage(msg) {
22
+ const searchMsg = msg;
23
+ const result = {
24
+ id: msg._id,
25
+ roomId: msg.rid,
26
+ text: msg.msg,
27
+ author: {
28
+ id: msg.u._id,
29
+ username: msg.u.username,
30
+ displayName: msg.u.name
31
+ },
32
+ timestamp: msg.ts,
33
+ threadId: msg.tmid,
34
+ replyCount: msg.tcount,
35
+ lastReplyAt: msg.tlm,
36
+ reactions: msg.reactions
37
+ ? Object.fromEntries(Object.entries(msg.reactions).map(([emoji, data]) => [emoji, data.usernames.length]))
38
+ : undefined,
39
+ hasAttachments: (msg.attachments?.length || 0) > 0,
40
+ isPinned: msg.pinned || false
41
+ };
42
+ // Add OpenSearch fields if present
43
+ if (searchMsg._highlight) {
44
+ result.highlight = searchMsg._highlight;
45
+ }
46
+ if (searchMsg._score !== undefined) {
47
+ result.score = searchMsg._score;
48
+ }
49
+ return result;
50
+ }
51
+ /**
52
+ * Format multiple messages
53
+ */
54
+ function formatMessages(messages) {
55
+ return messages.map(formatMessage);
56
+ }
57
+ /**
58
+ * Format a channel for MCP response
59
+ */
60
+ function formatChannel(room) {
61
+ const typeMap = {
62
+ 'c': 'public',
63
+ 'p': 'private',
64
+ 'd': 'direct',
65
+ 'l': 'livechat'
66
+ };
67
+ return {
68
+ id: room._id,
69
+ name: room.name || room._id,
70
+ displayName: room.fname,
71
+ type: typeMap[room.t] || 'public',
72
+ memberCount: room.usersCount,
73
+ messageCount: room.msgs,
74
+ topic: room.topic,
75
+ description: room.description,
76
+ isReadOnly: room.ro || false,
77
+ lastActivity: room._updatedAt
78
+ };
79
+ }
80
+ /**
81
+ * Format multiple channels
82
+ */
83
+ function formatChannels(rooms) {
84
+ return rooms.map(formatChannel);
85
+ }
86
+ /**
87
+ * Format a thread for MCP response
88
+ */
89
+ function formatThread(msg, roomName) {
90
+ // Truncate title to first 100 characters
91
+ const title = msg.msg.length > 100
92
+ ? msg.msg.substring(0, 100) + '...'
93
+ : msg.msg;
94
+ return {
95
+ id: msg._id,
96
+ roomId: msg.rid,
97
+ roomName,
98
+ title,
99
+ author: {
100
+ id: msg.u._id,
101
+ username: msg.u.username,
102
+ displayName: msg.u.name
103
+ },
104
+ createdAt: msg.ts,
105
+ replyCount: msg.tcount || 0,
106
+ lastReplyAt: msg.tlm || msg.ts,
107
+ participants: msg.replies || []
108
+ };
109
+ }
110
+ /**
111
+ * Format multiple threads
112
+ */
113
+ function formatThreads(messages, roomName) {
114
+ return messages.map(msg => formatThread(msg, roomName));
115
+ }
116
+ /**
117
+ * Format a user for MCP response
118
+ */
119
+ function formatUser(user) {
120
+ return {
121
+ id: user._id,
122
+ username: user.username,
123
+ displayName: user.name,
124
+ email: user.emails?.[0]?.address,
125
+ status: user.status || 'offline',
126
+ roles: user.roles || []
127
+ };
128
+ }
129
+ /**
130
+ * Format multiple users
131
+ */
132
+ function formatUsers(users) {
133
+ return users.map(formatUser);
134
+ }
135
+ function formatThreadWithReplies(parentMsg, replies, roomName) {
136
+ return {
137
+ thread: formatThread(parentMsg, roomName),
138
+ parentMessage: formatMessage(parentMsg),
139
+ replies: formatMessages(replies),
140
+ totalReplies: parentMsg.tcount || replies.length
141
+ };
142
+ }
143
+ function createSearchSummary(query, messages, totalResults) {
144
+ const timestamps = messages.map(m => new Date(m.ts).getTime());
145
+ const threadIds = new Set(messages.filter(m => m.tmid).map(m => m.tmid));
146
+ const channelIds = new Set(messages.map(m => m.rid));
147
+ return {
148
+ query,
149
+ totalResults,
150
+ channels: channelIds.size,
151
+ threads: threadIds.size,
152
+ messages: messages.length,
153
+ timeRange: messages.length > 0
154
+ ? {
155
+ oldest: new Date(Math.min(...timestamps)).toISOString(),
156
+ newest: new Date(Math.max(...timestamps)).toISOString()
157
+ }
158
+ : undefined
159
+ };
160
+ }
161
+ //# sourceMappingURL=message-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-formatter.js","sourceRoot":"","sources":["../../src/formatters/message-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Response Builder
3
+ * Creates standardized MCP tool responses with consistent structure
4
+ */
5
+ export interface McpToolResponse {
6
+ success: boolean;
7
+ data?: unknown;
8
+ error?: {
9
+ code: string;
10
+ message: string;
11
+ details?: string;
12
+ suggestion?: string;
13
+ };
14
+ metadata?: {
15
+ count?: number;
16
+ total?: number;
17
+ offset?: number;
18
+ truncated?: boolean;
19
+ executionTime?: number;
20
+ };
21
+ }
22
+ /**
23
+ * Build a successful response
24
+ */
25
+ export declare function buildSuccessResponse<T>(data: T, metadata?: McpToolResponse['metadata']): McpToolResponse;
26
+ /**
27
+ * Build a paginated success response
28
+ */
29
+ export declare function buildPaginatedResponse<T>(items: T[], total: number, offset: number, truncated?: boolean): McpToolResponse;
30
+ /**
31
+ * Build an error response following What-Why-How pattern
32
+ */
33
+ export declare function buildErrorResponse(code: string, what: string, why?: string, how?: string): McpToolResponse;
34
+ /**
35
+ * Common error responses
36
+ */
37
+ export declare const CommonErrors: {
38
+ NOT_FOUND: (resource: string, identifier: string) => McpToolResponse;
39
+ UNAUTHORIZED: () => McpToolResponse;
40
+ FORBIDDEN: (action: string, resource: string) => McpToolResponse;
41
+ WRITE_DISABLED: () => McpToolResponse;
42
+ ROOM_NOT_WRITABLE: (roomId: string, whitelist: string[]) => McpToolResponse;
43
+ RATE_LIMITED: (retryAfter?: number) => McpToolResponse;
44
+ VALIDATION_ERROR: (field: string, requirement: string) => McpToolResponse;
45
+ API_ERROR: (statusCode: number, message: string) => McpToolResponse;
46
+ CONNECTION_ERROR: () => McpToolResponse;
47
+ TIMEOUT: () => McpToolResponse;
48
+ };
49
+ /**
50
+ * Serialize response to JSON string with token limiting
51
+ */
52
+ export declare function serializeResponse(response: McpToolResponse): string;
53
+ /**
54
+ * Format response for MCP text content
55
+ */
56
+ export declare function formatAsTextContent(response: McpToolResponse): {
57
+ type: 'text';
58
+ text: string;
59
+ }[];
60
+ //# sourceMappingURL=response-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-builder.d.ts","sourceRoot":"","sources":["../../src/formatters/response-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACL;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAClC,IAAI,EAAE,CAAC,EACP,QAAQ,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,GACvC,eAAe,CAMjB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACpC,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,OAAe,GAC3B,eAAe,CAWjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACb,eAAe,CAUjB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;0BACC,MAAM,cAAc,MAAM;;wBAc5B,MAAM,YAAY,MAAM;;gCAchB,MAAM,aAAa,MAAM,EAAE;gCAS3B,MAAM;8BASR,MAAM,eAAe,MAAM;4BAO7B,MAAM,WAAW,MAAM;;;CAoBlD,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CA+BnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAK/F"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * Response Builder
4
+ * Creates standardized MCP tool responses with consistent structure
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.CommonErrors = void 0;
8
+ exports.buildSuccessResponse = buildSuccessResponse;
9
+ exports.buildPaginatedResponse = buildPaginatedResponse;
10
+ exports.buildErrorResponse = buildErrorResponse;
11
+ exports.serializeResponse = serializeResponse;
12
+ exports.formatAsTextContent = formatAsTextContent;
13
+ const token_counter_js_1 = require("../utils/token-counter.js");
14
+ /**
15
+ * Build a successful response
16
+ */
17
+ function buildSuccessResponse(data, metadata) {
18
+ return {
19
+ success: true,
20
+ data,
21
+ metadata
22
+ };
23
+ }
24
+ /**
25
+ * Build a paginated success response
26
+ */
27
+ function buildPaginatedResponse(items, total, offset, truncated = false) {
28
+ return {
29
+ success: true,
30
+ data: items,
31
+ metadata: {
32
+ count: items.length,
33
+ total,
34
+ offset,
35
+ truncated
36
+ }
37
+ };
38
+ }
39
+ /**
40
+ * Build an error response following What-Why-How pattern
41
+ */
42
+ function buildErrorResponse(code, what, why, how) {
43
+ return {
44
+ success: false,
45
+ error: {
46
+ code,
47
+ message: what,
48
+ details: why,
49
+ suggestion: how
50
+ }
51
+ };
52
+ }
53
+ /**
54
+ * Common error responses
55
+ */
56
+ exports.CommonErrors = {
57
+ NOT_FOUND: (resource, identifier) => buildErrorResponse('NOT_FOUND', `${resource} not found`, `No ${resource} with identifier "${identifier}" exists`, `Check the ${resource} ID or name and try again`),
58
+ UNAUTHORIZED: () => buildErrorResponse('UNAUTHORIZED', 'Authentication failed', 'Invalid or expired authentication token', 'Check ROCKETCHAT_AUTH_TOKEN and ROCKETCHAT_USER_ID environment variables'),
59
+ FORBIDDEN: (action, resource) => buildErrorResponse('FORBIDDEN', `Cannot ${action} ${resource}`, 'You do not have permission to perform this action', 'Request access from a channel administrator'),
60
+ WRITE_DISABLED: () => buildErrorResponse('WRITE_DISABLED', 'Write operations are disabled', 'The MCP server is configured in read-only mode', 'Set ROCKETCHAT_WRITE_ENABLED=true to enable write operations'),
61
+ ROOM_NOT_WRITABLE: (roomId, whitelist) => buildErrorResponse('ROOM_NOT_WRITABLE', 'Cannot write to this room', `Room "${roomId}" is not in the allowed write list`, whitelist.length > 0
62
+ ? `Allowed rooms: ${whitelist.join(', ')}`
63
+ : 'Configure ROCKETCHAT_WRITE_ROOMS to allow write access'),
64
+ RATE_LIMITED: (retryAfter) => buildErrorResponse('RATE_LIMITED', 'Too many requests', 'The Rocket.Chat API rate limit has been exceeded', retryAfter
65
+ ? `Wait ${retryAfter} seconds before retrying`
66
+ : 'Reduce request frequency and try again'),
67
+ VALIDATION_ERROR: (field, requirement) => buildErrorResponse('VALIDATION_ERROR', `Invalid parameter: ${field}`, requirement, `Provide a valid value for "${field}"`),
68
+ API_ERROR: (statusCode, message) => buildErrorResponse('API_ERROR', `Rocket.Chat API error (${statusCode})`, message, 'Check the Rocket.Chat server status and logs'),
69
+ CONNECTION_ERROR: () => buildErrorResponse('CONNECTION_ERROR', 'Cannot connect to Rocket.Chat server', 'The server may be down or the URL is incorrect', 'Verify ROCKETCHAT_URL and ensure the server is running'),
70
+ TIMEOUT: () => buildErrorResponse('TIMEOUT', 'Request timed out', 'The Rocket.Chat server took too long to respond', 'Try again with smaller limits or a more specific query')
71
+ };
72
+ /**
73
+ * Serialize response to JSON string with token limiting
74
+ */
75
+ function serializeResponse(response) {
76
+ const json = JSON.stringify(response, null, 2);
77
+ // Check if response exceeds token limit
78
+ if (token_counter_js_1.TokenCounter.wouldExceedLimit(json)) {
79
+ // If response is an array, truncate items
80
+ if (Array.isArray(response.data)) {
81
+ const { items, truncated } = token_counter_js_1.TokenCounter.truncateToFit(response.data, item => JSON.stringify(item));
82
+ const truncatedResponse = {
83
+ ...response,
84
+ data: items,
85
+ metadata: {
86
+ ...response.metadata,
87
+ truncated: truncated,
88
+ count: items.length
89
+ }
90
+ };
91
+ return JSON.stringify(truncatedResponse, null, 2);
92
+ }
93
+ // For non-array data, truncate the JSON string
94
+ const { text } = token_counter_js_1.TokenCounter.truncateText(json);
95
+ return text;
96
+ }
97
+ return json;
98
+ }
99
+ /**
100
+ * Format response for MCP text content
101
+ */
102
+ function formatAsTextContent(response) {
103
+ return [{
104
+ type: 'text',
105
+ text: serializeResponse(response)
106
+ }];
107
+ }
108
+ //# sourceMappingURL=response-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-builder.js","sourceRoot":"","sources":["../../src/formatters/response-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Guards module - Security and access control
3
+ */
4
+ export { WriteGuard, getWriteGuard, resetWriteGuard } from './write-guard.js';
5
+ export type { WriteCheckResult } from './write-guard.js';
6
+ export { MessageSanitizer, getSanitizer, resetSanitizer } from './sanitizer.js';
7
+ export type { SanitizeResult } from './sanitizer.js';
8
+ export { InputValidator, validateRoomId, validateMessageId, validateUserId, validateUsername, validateQuery, validateMessageText, validateEmoji, validateLimit, validateOffset, escapeHtml, MAX_LENGTHS } from './input-validator.js';
9
+ export type { ValidationResult } from './input-validator.js';
10
+ export { RateLimiter, RateLimiterManager, getRateLimiterManager, resetRateLimiterManager, checkRateLimit, checkApiRateLimit, checkWriteRateLimit, checkSearchRateLimit, DEFAULT_LIMITS } from './rate-limiter.js';
11
+ export type { RateLimitConfig, RateLimitResult } from './rate-limiter.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guards/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC9E,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChF,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,EACH,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,cAAc,EACd,UAAU,EACV,WAAW,EACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EACH,WAAW,EACX,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * Guards module - Security and access control
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_LIMITS = exports.checkSearchRateLimit = exports.checkWriteRateLimit = exports.checkApiRateLimit = exports.checkRateLimit = exports.resetRateLimiterManager = exports.getRateLimiterManager = exports.RateLimiterManager = exports.RateLimiter = exports.MAX_LENGTHS = exports.escapeHtml = exports.validateOffset = exports.validateLimit = exports.validateEmoji = exports.validateMessageText = exports.validateQuery = exports.validateUsername = exports.validateUserId = exports.validateMessageId = exports.validateRoomId = exports.InputValidator = exports.resetSanitizer = exports.getSanitizer = exports.MessageSanitizer = exports.resetWriteGuard = exports.getWriteGuard = exports.WriteGuard = void 0;
7
+ // Write guard
8
+ var write_guard_js_1 = require("./write-guard.js");
9
+ Object.defineProperty(exports, "WriteGuard", { enumerable: true, get: function () { return write_guard_js_1.WriteGuard; } });
10
+ Object.defineProperty(exports, "getWriteGuard", { enumerable: true, get: function () { return write_guard_js_1.getWriteGuard; } });
11
+ Object.defineProperty(exports, "resetWriteGuard", { enumerable: true, get: function () { return write_guard_js_1.resetWriteGuard; } });
12
+ // Message sanitizer
13
+ var sanitizer_js_1 = require("./sanitizer.js");
14
+ Object.defineProperty(exports, "MessageSanitizer", { enumerable: true, get: function () { return sanitizer_js_1.MessageSanitizer; } });
15
+ Object.defineProperty(exports, "getSanitizer", { enumerable: true, get: function () { return sanitizer_js_1.getSanitizer; } });
16
+ Object.defineProperty(exports, "resetSanitizer", { enumerable: true, get: function () { return sanitizer_js_1.resetSanitizer; } });
17
+ // Input validator
18
+ var input_validator_js_1 = require("./input-validator.js");
19
+ Object.defineProperty(exports, "InputValidator", { enumerable: true, get: function () { return input_validator_js_1.InputValidator; } });
20
+ Object.defineProperty(exports, "validateRoomId", { enumerable: true, get: function () { return input_validator_js_1.validateRoomId; } });
21
+ Object.defineProperty(exports, "validateMessageId", { enumerable: true, get: function () { return input_validator_js_1.validateMessageId; } });
22
+ Object.defineProperty(exports, "validateUserId", { enumerable: true, get: function () { return input_validator_js_1.validateUserId; } });
23
+ Object.defineProperty(exports, "validateUsername", { enumerable: true, get: function () { return input_validator_js_1.validateUsername; } });
24
+ Object.defineProperty(exports, "validateQuery", { enumerable: true, get: function () { return input_validator_js_1.validateQuery; } });
25
+ Object.defineProperty(exports, "validateMessageText", { enumerable: true, get: function () { return input_validator_js_1.validateMessageText; } });
26
+ Object.defineProperty(exports, "validateEmoji", { enumerable: true, get: function () { return input_validator_js_1.validateEmoji; } });
27
+ Object.defineProperty(exports, "validateLimit", { enumerable: true, get: function () { return input_validator_js_1.validateLimit; } });
28
+ Object.defineProperty(exports, "validateOffset", { enumerable: true, get: function () { return input_validator_js_1.validateOffset; } });
29
+ Object.defineProperty(exports, "escapeHtml", { enumerable: true, get: function () { return input_validator_js_1.escapeHtml; } });
30
+ Object.defineProperty(exports, "MAX_LENGTHS", { enumerable: true, get: function () { return input_validator_js_1.MAX_LENGTHS; } });
31
+ // Rate limiter
32
+ var rate_limiter_js_1 = require("./rate-limiter.js");
33
+ Object.defineProperty(exports, "RateLimiter", { enumerable: true, get: function () { return rate_limiter_js_1.RateLimiter; } });
34
+ Object.defineProperty(exports, "RateLimiterManager", { enumerable: true, get: function () { return rate_limiter_js_1.RateLimiterManager; } });
35
+ Object.defineProperty(exports, "getRateLimiterManager", { enumerable: true, get: function () { return rate_limiter_js_1.getRateLimiterManager; } });
36
+ Object.defineProperty(exports, "resetRateLimiterManager", { enumerable: true, get: function () { return rate_limiter_js_1.resetRateLimiterManager; } });
37
+ Object.defineProperty(exports, "checkRateLimit", { enumerable: true, get: function () { return rate_limiter_js_1.checkRateLimit; } });
38
+ Object.defineProperty(exports, "checkApiRateLimit", { enumerable: true, get: function () { return rate_limiter_js_1.checkApiRateLimit; } });
39
+ Object.defineProperty(exports, "checkWriteRateLimit", { enumerable: true, get: function () { return rate_limiter_js_1.checkWriteRateLimit; } });
40
+ Object.defineProperty(exports, "checkSearchRateLimit", { enumerable: true, get: function () { return rate_limiter_js_1.checkSearchRateLimit; } });
41
+ Object.defineProperty(exports, "DEFAULT_LIMITS", { enumerable: true, get: function () { return rate_limiter_js_1.DEFAULT_LIMITS; } });
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guards/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,cAAc;AACd,mDAA8E;AAArE,4GAAA,UAAU,OAAA;AAAE,+GAAA,aAAa,OAAA;AAAE,iHAAA,eAAe,OAAA;AAGnD,oBAAoB;AACpB,+CAAgF;AAAvE,gHAAA,gBAAgB,OAAA;AAAE,4GAAA,YAAY,OAAA;AAAE,8GAAA,cAAc,OAAA;AAGvD,kBAAkB;AAClB,2DAa8B;AAZ1B,oHAAA,cAAc,OAAA;AACd,oHAAA,cAAc,OAAA;AACd,uHAAA,iBAAiB,OAAA;AACjB,oHAAA,cAAc,OAAA;AACd,sHAAA,gBAAgB,OAAA;AAChB,mHAAA,aAAa,OAAA;AACb,yHAAA,mBAAmB,OAAA;AACnB,mHAAA,aAAa,OAAA;AACb,mHAAA,aAAa,OAAA;AACb,oHAAA,cAAc,OAAA;AACd,gHAAA,UAAU,OAAA;AACV,iHAAA,WAAW,OAAA;AAIf,eAAe;AACf,qDAU2B;AATvB,8GAAA,WAAW,OAAA;AACX,qHAAA,kBAAkB,OAAA;AAClB,wHAAA,qBAAqB,OAAA;AACrB,0HAAA,uBAAuB,OAAA;AACvB,iHAAA,cAAc,OAAA;AACd,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,uHAAA,oBAAoB,OAAA;AACpB,iHAAA,cAAc,OAAA"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Input Validator - Validates and sanitizes input parameters
3
+ * Provides defense against injection attacks and malformed input
4
+ */
5
+ /**
6
+ * Validation result
7
+ */
8
+ export interface ValidationResult {
9
+ valid: boolean;
10
+ error?: string;
11
+ sanitized?: string;
12
+ }
13
+ /**
14
+ * Maximum lengths for various input types
15
+ */
16
+ export declare const MAX_LENGTHS: {
17
+ readonly roomId: 64;
18
+ readonly messageId: 64;
19
+ readonly threadId: 64;
20
+ readonly userId: 64;
21
+ readonly username: 128;
22
+ readonly query: 500;
23
+ readonly messageText: 10000;
24
+ readonly emoji: 64;
25
+ };
26
+ /**
27
+ * Input validator class
28
+ */
29
+ export declare class InputValidator {
30
+ /**
31
+ * Validate a room ID
32
+ */
33
+ static validateRoomId(roomId: unknown): ValidationResult;
34
+ /**
35
+ * Validate a message ID
36
+ */
37
+ static validateMessageId(messageId: unknown): ValidationResult;
38
+ /**
39
+ * Validate a user ID
40
+ */
41
+ static validateUserId(userId: unknown): ValidationResult;
42
+ /**
43
+ * Validate a username
44
+ */
45
+ static validateUsername(username: unknown): ValidationResult;
46
+ /**
47
+ * Validate a search query
48
+ */
49
+ static validateQuery(query: unknown): ValidationResult;
50
+ /**
51
+ * Validate message text
52
+ */
53
+ static validateMessageText(text: unknown): ValidationResult;
54
+ /**
55
+ * Validate an emoji
56
+ */
57
+ static validateEmoji(emoji: unknown): ValidationResult;
58
+ /**
59
+ * Validate pagination limit
60
+ */
61
+ static validateLimit(limit: unknown, min?: number, max?: number, defaultValue?: number): number;
62
+ /**
63
+ * Validate pagination offset
64
+ */
65
+ static validateOffset(offset: unknown, defaultValue?: number): number;
66
+ /**
67
+ * Check if string contains dangerous patterns
68
+ */
69
+ private static containsDangerousPattern;
70
+ /**
71
+ * Escape HTML entities for safe display
72
+ */
73
+ static escapeHtml(text: string): string;
74
+ /**
75
+ * Validate and sanitize a generic string input
76
+ */
77
+ static validateString(value: unknown, fieldName: string, maxLength: number, required?: boolean): ValidationResult;
78
+ }
79
+ export declare const validateRoomId: typeof InputValidator.validateRoomId;
80
+ export declare const validateMessageId: typeof InputValidator.validateMessageId;
81
+ export declare const validateUserId: typeof InputValidator.validateUserId;
82
+ export declare const validateUsername: typeof InputValidator.validateUsername;
83
+ export declare const validateQuery: typeof InputValidator.validateQuery;
84
+ export declare const validateMessageText: typeof InputValidator.validateMessageText;
85
+ export declare const validateEmoji: typeof InputValidator.validateEmoji;
86
+ export declare const validateLimit: typeof InputValidator.validateLimit;
87
+ export declare const validateOffset: typeof InputValidator.validateOffset;
88
+ export declare const escapeHtml: typeof InputValidator.escapeHtml;
89
+ //# sourceMappingURL=input-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-validator.d.ts","sourceRoot":"","sources":["../../src/guards/input-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAoCX;;GAEG;AACH,qBAAa,cAAc;IACvB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB;IAsBxD;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB;IAoB9D;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB;IAoBxD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,gBAAgB;IAuB5D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB;IAkBtD;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB;IAgB3D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB;IAsBtD;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,SAAI,EAAE,GAAG,SAAM,EAAE,YAAY,SAAK,GAAG,MAAM;IAanF;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,SAAI,GAAG,MAAM;IAahE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAIvC;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAWvC;;OAEG;IACH,MAAM,CAAC,cAAc,CACjB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,UAAO,GAChB,gBAAgB;CAwBtB;AAGD,eAAO,MAAM,cAAc,sCAAqD,CAAC;AACjF,eAAO,MAAM,iBAAiB,yCAAwD,CAAC;AACvF,eAAO,MAAM,cAAc,sCAAqD,CAAC;AACjF,eAAO,MAAM,gBAAgB,wCAAuD,CAAC;AACrF,eAAO,MAAM,aAAa,qCAAoD,CAAC;AAC/E,eAAO,MAAM,mBAAmB,2CAA0D,CAAC;AAC3F,eAAO,MAAM,aAAa,qCAAoD,CAAC;AAC/E,eAAO,MAAM,aAAa,qCAAoD,CAAC;AAC/E,eAAO,MAAM,cAAc,sCAAqD,CAAC;AACjF,eAAO,MAAM,UAAU,kCAAiD,CAAC"}