@pegasusheavy/threads-mcp 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 (44) hide show
  1. package/.cursorrules/no-summaries.mdc +1 -0
  2. package/.cursorrules/update-website.mdc +8 -0
  3. package/.husky/README.md +37 -0
  4. package/.husky/commit-msg +3 -0
  5. package/.husky/pre-commit +12 -0
  6. package/.husky/pre-push +31 -0
  7. package/CHANGELOG.md +49 -0
  8. package/LICENSE +22 -0
  9. package/README.md +336 -0
  10. package/commitlint.config.js +27 -0
  11. package/dist/client/enhanced-threads-client.d.ts +49 -0
  12. package/dist/client/enhanced-threads-client.d.ts.map +1 -0
  13. package/dist/client/enhanced-threads-client.js +175 -0
  14. package/dist/client/enhanced-threads-client.js.map +1 -0
  15. package/dist/client/threads-client.d.ts +23 -0
  16. package/dist/client/threads-client.d.ts.map +1 -0
  17. package/dist/client/threads-client.js +208 -0
  18. package/dist/client/threads-client.js.map +1 -0
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +41 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/server.d.ts +10 -0
  24. package/dist/server.d.ts.map +1 -0
  25. package/dist/server.js +382 -0
  26. package/dist/server.js.map +1 -0
  27. package/dist/types/threads.d.ts +298 -0
  28. package/dist/types/threads.d.ts.map +1 -0
  29. package/dist/types/threads.js +76 -0
  30. package/dist/types/threads.js.map +1 -0
  31. package/dist/utils/cache.d.ts +42 -0
  32. package/dist/utils/cache.d.ts.map +1 -0
  33. package/dist/utils/cache.js +147 -0
  34. package/dist/utils/cache.js.map +1 -0
  35. package/dist/utils/rate-limiter.d.ts +31 -0
  36. package/dist/utils/rate-limiter.d.ts.map +1 -0
  37. package/dist/utils/rate-limiter.js +99 -0
  38. package/dist/utils/rate-limiter.js.map +1 -0
  39. package/dist/utils/webhook.d.ts +67 -0
  40. package/dist/utils/webhook.d.ts.map +1 -0
  41. package/dist/utils/webhook.js +187 -0
  42. package/dist/utils/webhook.js.map +1 -0
  43. package/llms.txt +197 -0
  44. package/package.json +65 -0
@@ -0,0 +1,298 @@
1
+ import { z } from 'zod';
2
+ export declare const ThreadsUserSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ username: z.ZodString;
5
+ name: z.ZodOptional<z.ZodString>;
6
+ threads_profile_picture_url: z.ZodOptional<z.ZodString>;
7
+ threads_biography: z.ZodOptional<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ id: string;
10
+ username: string;
11
+ name?: string | undefined;
12
+ threads_profile_picture_url?: string | undefined;
13
+ threads_biography?: string | undefined;
14
+ }, {
15
+ id: string;
16
+ username: string;
17
+ name?: string | undefined;
18
+ threads_profile_picture_url?: string | undefined;
19
+ threads_biography?: string | undefined;
20
+ }>;
21
+ export declare const ThreadsMediaSchema: z.ZodObject<{
22
+ id: z.ZodString;
23
+ media_product_type: z.ZodString;
24
+ media_type: z.ZodEnum<["TEXT", "IMAGE", "VIDEO", "CAROUSEL_ALBUM"]>;
25
+ media_url: z.ZodOptional<z.ZodString>;
26
+ permalink: z.ZodString;
27
+ username: z.ZodOptional<z.ZodString>;
28
+ text: z.ZodOptional<z.ZodString>;
29
+ timestamp: z.ZodString;
30
+ shortcode: z.ZodOptional<z.ZodString>;
31
+ thumbnail_url: z.ZodOptional<z.ZodString>;
32
+ children: z.ZodOptional<z.ZodObject<{
33
+ data: z.ZodArray<z.ZodObject<{
34
+ id: z.ZodString;
35
+ }, "strip", z.ZodTypeAny, {
36
+ id: string;
37
+ }, {
38
+ id: string;
39
+ }>, "many">;
40
+ }, "strip", z.ZodTypeAny, {
41
+ data: {
42
+ id: string;
43
+ }[];
44
+ }, {
45
+ data: {
46
+ id: string;
47
+ }[];
48
+ }>>;
49
+ is_quote_post: z.ZodOptional<z.ZodBoolean>;
50
+ }, "strip", z.ZodTypeAny, {
51
+ id: string;
52
+ media_product_type: string;
53
+ media_type: "TEXT" | "IMAGE" | "VIDEO" | "CAROUSEL_ALBUM";
54
+ permalink: string;
55
+ timestamp: string;
56
+ username?: string | undefined;
57
+ media_url?: string | undefined;
58
+ text?: string | undefined;
59
+ shortcode?: string | undefined;
60
+ thumbnail_url?: string | undefined;
61
+ children?: {
62
+ data: {
63
+ id: string;
64
+ }[];
65
+ } | undefined;
66
+ is_quote_post?: boolean | undefined;
67
+ }, {
68
+ id: string;
69
+ media_product_type: string;
70
+ media_type: "TEXT" | "IMAGE" | "VIDEO" | "CAROUSEL_ALBUM";
71
+ permalink: string;
72
+ timestamp: string;
73
+ username?: string | undefined;
74
+ media_url?: string | undefined;
75
+ text?: string | undefined;
76
+ shortcode?: string | undefined;
77
+ thumbnail_url?: string | undefined;
78
+ children?: {
79
+ data: {
80
+ id: string;
81
+ }[];
82
+ } | undefined;
83
+ is_quote_post?: boolean | undefined;
84
+ }>;
85
+ export declare const ThreadsInsightsSchema: z.ZodObject<{
86
+ name: z.ZodString;
87
+ period: z.ZodString;
88
+ values: z.ZodArray<z.ZodObject<{
89
+ value: z.ZodNumber;
90
+ }, "strip", z.ZodTypeAny, {
91
+ value: number;
92
+ }, {
93
+ value: number;
94
+ }>, "many">;
95
+ title: z.ZodOptional<z.ZodString>;
96
+ description: z.ZodOptional<z.ZodString>;
97
+ id: z.ZodOptional<z.ZodString>;
98
+ }, "strip", z.ZodTypeAny, {
99
+ name: string;
100
+ values: {
101
+ value: number;
102
+ }[];
103
+ period: string;
104
+ id?: string | undefined;
105
+ title?: string | undefined;
106
+ description?: string | undefined;
107
+ }, {
108
+ name: string;
109
+ values: {
110
+ value: number;
111
+ }[];
112
+ period: string;
113
+ id?: string | undefined;
114
+ title?: string | undefined;
115
+ description?: string | undefined;
116
+ }>;
117
+ export declare const ThreadsRepliesSchema: z.ZodObject<{
118
+ data: z.ZodArray<z.ZodObject<{
119
+ id: z.ZodString;
120
+ text: z.ZodOptional<z.ZodString>;
121
+ username: z.ZodOptional<z.ZodString>;
122
+ permalink: z.ZodOptional<z.ZodString>;
123
+ timestamp: z.ZodOptional<z.ZodString>;
124
+ }, "strip", z.ZodTypeAny, {
125
+ id: string;
126
+ username?: string | undefined;
127
+ permalink?: string | undefined;
128
+ text?: string | undefined;
129
+ timestamp?: string | undefined;
130
+ }, {
131
+ id: string;
132
+ username?: string | undefined;
133
+ permalink?: string | undefined;
134
+ text?: string | undefined;
135
+ timestamp?: string | undefined;
136
+ }>, "many">;
137
+ paging: z.ZodOptional<z.ZodObject<{
138
+ cursors: z.ZodObject<{
139
+ before: z.ZodOptional<z.ZodString>;
140
+ after: z.ZodOptional<z.ZodString>;
141
+ }, "strip", z.ZodTypeAny, {
142
+ before?: string | undefined;
143
+ after?: string | undefined;
144
+ }, {
145
+ before?: string | undefined;
146
+ after?: string | undefined;
147
+ }>;
148
+ }, "strip", z.ZodTypeAny, {
149
+ cursors: {
150
+ before?: string | undefined;
151
+ after?: string | undefined;
152
+ };
153
+ }, {
154
+ cursors: {
155
+ before?: string | undefined;
156
+ after?: string | undefined;
157
+ };
158
+ }>>;
159
+ }, "strip", z.ZodTypeAny, {
160
+ data: {
161
+ id: string;
162
+ username?: string | undefined;
163
+ permalink?: string | undefined;
164
+ text?: string | undefined;
165
+ timestamp?: string | undefined;
166
+ }[];
167
+ paging?: {
168
+ cursors: {
169
+ before?: string | undefined;
170
+ after?: string | undefined;
171
+ };
172
+ } | undefined;
173
+ }, {
174
+ data: {
175
+ id: string;
176
+ username?: string | undefined;
177
+ permalink?: string | undefined;
178
+ text?: string | undefined;
179
+ timestamp?: string | undefined;
180
+ }[];
181
+ paging?: {
182
+ cursors: {
183
+ before?: string | undefined;
184
+ after?: string | undefined;
185
+ };
186
+ } | undefined;
187
+ }>;
188
+ export declare const ThreadsConversationSchema: z.ZodObject<{
189
+ data: z.ZodArray<z.ZodObject<{
190
+ id: z.ZodString;
191
+ text: z.ZodOptional<z.ZodString>;
192
+ username: z.ZodOptional<z.ZodString>;
193
+ permalink: z.ZodOptional<z.ZodString>;
194
+ timestamp: z.ZodOptional<z.ZodString>;
195
+ }, "strip", z.ZodTypeAny, {
196
+ id: string;
197
+ username?: string | undefined;
198
+ permalink?: string | undefined;
199
+ text?: string | undefined;
200
+ timestamp?: string | undefined;
201
+ }, {
202
+ id: string;
203
+ username?: string | undefined;
204
+ permalink?: string | undefined;
205
+ text?: string | undefined;
206
+ timestamp?: string | undefined;
207
+ }>, "many">;
208
+ paging: z.ZodOptional<z.ZodObject<{
209
+ cursors: z.ZodObject<{
210
+ before: z.ZodOptional<z.ZodString>;
211
+ after: z.ZodOptional<z.ZodString>;
212
+ }, "strip", z.ZodTypeAny, {
213
+ before?: string | undefined;
214
+ after?: string | undefined;
215
+ }, {
216
+ before?: string | undefined;
217
+ after?: string | undefined;
218
+ }>;
219
+ }, "strip", z.ZodTypeAny, {
220
+ cursors: {
221
+ before?: string | undefined;
222
+ after?: string | undefined;
223
+ };
224
+ }, {
225
+ cursors: {
226
+ before?: string | undefined;
227
+ after?: string | undefined;
228
+ };
229
+ }>>;
230
+ }, "strip", z.ZodTypeAny, {
231
+ data: {
232
+ id: string;
233
+ username?: string | undefined;
234
+ permalink?: string | undefined;
235
+ text?: string | undefined;
236
+ timestamp?: string | undefined;
237
+ }[];
238
+ paging?: {
239
+ cursors: {
240
+ before?: string | undefined;
241
+ after?: string | undefined;
242
+ };
243
+ } | undefined;
244
+ }, {
245
+ data: {
246
+ id: string;
247
+ username?: string | undefined;
248
+ permalink?: string | undefined;
249
+ text?: string | undefined;
250
+ timestamp?: string | undefined;
251
+ }[];
252
+ paging?: {
253
+ cursors: {
254
+ before?: string | undefined;
255
+ after?: string | undefined;
256
+ };
257
+ } | undefined;
258
+ }>;
259
+ export declare const CreateThreadResponseSchema: z.ZodObject<{
260
+ id: z.ZodString;
261
+ }, "strip", z.ZodTypeAny, {
262
+ id: string;
263
+ }, {
264
+ id: string;
265
+ }>;
266
+ export type ThreadsUser = z.infer<typeof ThreadsUserSchema>;
267
+ export type ThreadsMedia = z.infer<typeof ThreadsMediaSchema>;
268
+ export type ThreadsInsights = z.infer<typeof ThreadsInsightsSchema>;
269
+ export type ThreadsReplies = z.infer<typeof ThreadsRepliesSchema>;
270
+ export type ThreadsConversation = z.infer<typeof ThreadsConversationSchema>;
271
+ export type CreateThreadResponse = z.infer<typeof CreateThreadResponseSchema>;
272
+ export interface ThreadsConfig {
273
+ accessToken: string;
274
+ userId: string;
275
+ apiVersion?: string;
276
+ }
277
+ export type { ThreadsConfig as ThreadsClientConfig };
278
+ export interface CreateThreadParams {
279
+ text?: string;
280
+ imageUrl?: string;
281
+ videoUrl?: string;
282
+ replyToId?: string;
283
+ replyControl?: 'everyone' | 'accounts_you_follow' | 'mentioned_only';
284
+ }
285
+ export interface GetMediaParams {
286
+ fields?: string[];
287
+ limit?: number;
288
+ }
289
+ export interface GetInsightsParams {
290
+ metric: string[];
291
+ since?: number;
292
+ until?: number;
293
+ }
294
+ export interface GetRepliesParams {
295
+ fields?: string[];
296
+ reverse?: boolean;
297
+ }
298
+ //# sourceMappingURL=threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../src/types/threads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;EAM5B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqB7B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWhC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkB/B,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBpC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;EAErC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAG9E,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,YAAY,EAAE,aAAa,IAAI,mBAAmB,EAAE,CAAC;AAGrD,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,GAAG,qBAAqB,GAAG,gBAAgB,CAAC;CACtE;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -0,0 +1,76 @@
1
+ import { z } from 'zod';
2
+ export const ThreadsUserSchema = z.object({
3
+ id: z.string(),
4
+ username: z.string(),
5
+ name: z.string().optional(),
6
+ threads_profile_picture_url: z.string().optional(),
7
+ threads_biography: z.string().optional(),
8
+ });
9
+ export const ThreadsMediaSchema = z.object({
10
+ id: z.string(),
11
+ media_product_type: z.string(),
12
+ media_type: z.enum(['TEXT', 'IMAGE', 'VIDEO', 'CAROUSEL_ALBUM']),
13
+ media_url: z.string().optional(),
14
+ permalink: z.string(),
15
+ username: z.string().optional(),
16
+ text: z.string().optional(),
17
+ timestamp: z.string(),
18
+ shortcode: z.string().optional(),
19
+ thumbnail_url: z.string().optional(),
20
+ children: z
21
+ .object({
22
+ data: z.array(z.object({
23
+ id: z.string(),
24
+ })),
25
+ })
26
+ .optional(),
27
+ is_quote_post: z.boolean().optional(),
28
+ });
29
+ export const ThreadsInsightsSchema = z.object({
30
+ name: z.string(),
31
+ period: z.string(),
32
+ values: z.array(z.object({
33
+ value: z.number(),
34
+ })),
35
+ title: z.string().optional(),
36
+ description: z.string().optional(),
37
+ id: z.string().optional(),
38
+ });
39
+ export const ThreadsRepliesSchema = z.object({
40
+ data: z.array(z.object({
41
+ id: z.string(),
42
+ text: z.string().optional(),
43
+ username: z.string().optional(),
44
+ permalink: z.string().optional(),
45
+ timestamp: z.string().optional(),
46
+ })),
47
+ paging: z
48
+ .object({
49
+ cursors: z.object({
50
+ before: z.string().optional(),
51
+ after: z.string().optional(),
52
+ }),
53
+ })
54
+ .optional(),
55
+ });
56
+ export const ThreadsConversationSchema = z.object({
57
+ data: z.array(z.object({
58
+ id: z.string(),
59
+ text: z.string().optional(),
60
+ username: z.string().optional(),
61
+ permalink: z.string().optional(),
62
+ timestamp: z.string().optional(),
63
+ })),
64
+ paging: z
65
+ .object({
66
+ cursors: z.object({
67
+ before: z.string().optional(),
68
+ after: z.string().optional(),
69
+ }),
70
+ })
71
+ .optional(),
72
+ });
73
+ export const CreateThreadResponseSchema = z.object({
74
+ id: z.string(),
75
+ });
76
+ //# sourceMappingURL=threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/types/threads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface CacheOptions {
2
+ ttl?: number;
3
+ maxSize?: number;
4
+ onEvict?: (key: string, value: any) => void;
5
+ }
6
+ export declare class Cache<T = any> {
7
+ private cache;
8
+ private readonly ttl;
9
+ private readonly maxSize;
10
+ private readonly onEvict?;
11
+ constructor(options?: CacheOptions);
12
+ get(key: string): T | undefined;
13
+ set(key: string, value: T, ttl?: number): void;
14
+ delete(key: string): boolean;
15
+ has(key: string): boolean;
16
+ clear(): void;
17
+ size(): number;
18
+ private evictLRU;
19
+ cleanExpired(): void;
20
+ keys(): string[];
21
+ stats(): {
22
+ size: number;
23
+ maxSize: number;
24
+ ttl: number;
25
+ entries: {
26
+ key: string;
27
+ expiresIn: number;
28
+ lastAccessed: number;
29
+ }[];
30
+ };
31
+ }
32
+ export declare function Cached(cache: Cache, keyGenerator?: (...args: any[]) => string): (_target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
33
+ export declare class AutoCleanCache<T = any> extends Cache<T> {
34
+ private cleanupInterval;
35
+ constructor(options?: CacheOptions & {
36
+ cleanupIntervalMs?: number;
37
+ });
38
+ private startCleanup;
39
+ stopCleanup(): void;
40
+ clear(): void;
41
+ }
42
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CAC7C;AAQD,qBAAa,KAAK,CAAC,CAAC,GAAG,GAAG;IACxB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAkC;gBAE/C,OAAO,GAAE,YAAiB;IAUtC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAqB/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAmB9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAW5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAiBzB,KAAK,IAAI,IAAI;IAYb,IAAI,IAAI,MAAM;IAOd,OAAO,CAAC,QAAQ;IAmBhB,YAAY,IAAI,IAAI;IAgBpB,IAAI,IAAI,MAAM,EAAE;IAOhB,KAAK,IAAI;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACrE;CAeF;AAKD,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,IAE1E,SAAS,GAAG,EACZ,aAAa,MAAM,EACnB,YAAY,kBAAkB,wBAuBjC;AAKD,qBAAa,cAAc,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,eAAe,CAA+B;gBAE1C,OAAO,GAAE,YAAY,GAAG;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAO;IAUvE,OAAO,CAAC,YAAY;IASpB,WAAW,IAAI,IAAI;IAUV,KAAK,IAAI,IAAI;CAIvB"}
@@ -0,0 +1,147 @@
1
+ export class Cache {
2
+ cache;
3
+ ttl;
4
+ maxSize;
5
+ onEvict;
6
+ constructor(options = {}) {
7
+ this.cache = new Map();
8
+ this.ttl = options.ttl || 60000;
9
+ this.maxSize = options.maxSize || 1000;
10
+ this.onEvict = options.onEvict;
11
+ }
12
+ get(key) {
13
+ const entry = this.cache.get(key);
14
+ if (!entry) {
15
+ return undefined;
16
+ }
17
+ if (Date.now() > entry.expires) {
18
+ this.delete(key);
19
+ return undefined;
20
+ }
21
+ entry.lastAccessed = Date.now();
22
+ return entry.value;
23
+ }
24
+ set(key, value, ttl) {
25
+ if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
26
+ this.evictLRU();
27
+ }
28
+ const expiresIn = ttl || this.ttl;
29
+ const entry = {
30
+ value,
31
+ expires: Date.now() + expiresIn,
32
+ lastAccessed: Date.now(),
33
+ };
34
+ this.cache.set(key, entry);
35
+ }
36
+ delete(key) {
37
+ const entry = this.cache.get(key);
38
+ if (entry && this.onEvict) {
39
+ this.onEvict(key, entry.value);
40
+ }
41
+ return this.cache.delete(key);
42
+ }
43
+ has(key) {
44
+ const entry = this.cache.get(key);
45
+ if (!entry) {
46
+ return false;
47
+ }
48
+ if (Date.now() > entry.expires) {
49
+ this.delete(key);
50
+ return false;
51
+ }
52
+ return true;
53
+ }
54
+ clear() {
55
+ if (this.onEvict) {
56
+ this.cache.forEach((entry, key) => {
57
+ this.onEvict(key, entry.value);
58
+ });
59
+ }
60
+ this.cache.clear();
61
+ }
62
+ size() {
63
+ return this.cache.size;
64
+ }
65
+ evictLRU() {
66
+ let oldestKey = null;
67
+ let oldestTime = Infinity;
68
+ this.cache.forEach((entry, key) => {
69
+ if (entry.lastAccessed < oldestTime) {
70
+ oldestTime = entry.lastAccessed;
71
+ oldestKey = key;
72
+ }
73
+ });
74
+ if (oldestKey) {
75
+ this.delete(oldestKey);
76
+ }
77
+ }
78
+ cleanExpired() {
79
+ const now = Date.now();
80
+ const keysToDelete = [];
81
+ this.cache.forEach((entry, key) => {
82
+ if (now > entry.expires) {
83
+ keysToDelete.push(key);
84
+ }
85
+ });
86
+ keysToDelete.forEach((key) => this.delete(key));
87
+ }
88
+ keys() {
89
+ return Array.from(this.cache.keys());
90
+ }
91
+ stats() {
92
+ const now = Date.now();
93
+ const entries = Array.from(this.cache.entries()).map(([key, entry]) => ({
94
+ key,
95
+ expiresIn: entry.expires - now,
96
+ lastAccessed: now - entry.lastAccessed,
97
+ }));
98
+ return {
99
+ size: this.cache.size,
100
+ maxSize: this.maxSize,
101
+ ttl: this.ttl,
102
+ entries,
103
+ };
104
+ }
105
+ }
106
+ export function Cached(cache, keyGenerator) {
107
+ return function (_target, propertyKey, descriptor) {
108
+ const originalMethod = descriptor.value;
109
+ descriptor.value = async function (...args) {
110
+ const cacheKey = keyGenerator
111
+ ? keyGenerator(...args)
112
+ : `${propertyKey}:${JSON.stringify(args)}`;
113
+ const cached = cache.get(cacheKey);
114
+ if (cached !== undefined) {
115
+ return cached;
116
+ }
117
+ const result = await originalMethod.apply(this, args);
118
+ cache.set(cacheKey, result);
119
+ return result;
120
+ };
121
+ return descriptor;
122
+ };
123
+ }
124
+ export class AutoCleanCache extends Cache {
125
+ cleanupInterval = null;
126
+ constructor(options = {}) {
127
+ super(options);
128
+ const cleanupIntervalMs = options.cleanupIntervalMs || 60000;
129
+ this.startCleanup(cleanupIntervalMs);
130
+ }
131
+ startCleanup(intervalMs) {
132
+ this.cleanupInterval = setInterval(() => {
133
+ this.cleanExpired();
134
+ }, intervalMs);
135
+ }
136
+ stopCleanup() {
137
+ if (this.cleanupInterval) {
138
+ clearInterval(this.cleanupInterval);
139
+ this.cleanupInterval = null;
140
+ }
141
+ }
142
+ clear() {
143
+ this.stopCleanup();
144
+ super.clear();
145
+ }
146
+ }
147
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface RateLimiterOptions {
2
+ maxTokens: number;
3
+ refillRate: number;
4
+ refillInterval?: number;
5
+ }
6
+ export declare class RateLimiter {
7
+ private tokens;
8
+ private lastRefill;
9
+ private readonly maxTokens;
10
+ private readonly refillRate;
11
+ private readonly refillInterval;
12
+ constructor(options: RateLimiterOptions);
13
+ private refill;
14
+ tryConsume(tokens?: number): boolean;
15
+ consume(tokens?: number): Promise<void>;
16
+ getWaitTime(tokens?: number): number;
17
+ getTokens(): number;
18
+ reset(): void;
19
+ }
20
+ export declare class RateLimiterManager {
21
+ private limiters;
22
+ constructor();
23
+ register(endpoint: string, options: RateLimiterOptions): void;
24
+ tryConsume(endpoint: string, tokens?: number): boolean;
25
+ consume(endpoint: string, tokens?: number): Promise<void>;
26
+ getWaitTime(endpoint: string, tokens?: number): number;
27
+ reset(endpoint: string): void;
28
+ resetAll(): void;
29
+ }
30
+ export declare function RateLimited(limiter: RateLimiter, tokens?: number): (_target: any, _propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
31
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,OAAO,EAAE,kBAAkB;IAWvC,OAAO,CAAC,MAAM;IAed,UAAU,CAAC,MAAM,GAAE,MAAU,GAAG,OAAO;IAejC,OAAO,CAAC,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAYhD,WAAW,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM;IAevC,SAAS,IAAI,MAAM;IAQnB,KAAK,IAAI,IAAI;CAId;AAKD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAA2B;;IAS3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAO7D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,OAAO;IAWnD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM;IAQzD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAU7B,QAAQ,IAAI,IAAI;CAGjB;AAKD,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,GAAE,MAAU,IAEhE,SAAS,GAAG,EACZ,cAAc,MAAM,EACpB,YAAY,kBAAkB,wBAWjC"}