opencode-cursor-proxy 1.0.1

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 (121) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -0
  3. package/README.zh-CN.md +136 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +2 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/api/agent-service.d.ts +136 -0
  8. package/dist/lib/api/agent-service.js +938 -0
  9. package/dist/lib/api/agent-service.js.map +1 -0
  10. package/dist/lib/api/ai-service.d.ts +26 -0
  11. package/dist/lib/api/ai-service.js +38 -0
  12. package/dist/lib/api/ai-service.js.map +1 -0
  13. package/dist/lib/api/cursor-client.d.ts +119 -0
  14. package/dist/lib/api/cursor-client.js +511 -0
  15. package/dist/lib/api/cursor-client.js.map +1 -0
  16. package/dist/lib/api/cursor-models.d.ts +13 -0
  17. package/dist/lib/api/cursor-models.js +34 -0
  18. package/dist/lib/api/cursor-models.js.map +1 -0
  19. package/dist/lib/api/openai-compat.d.ts +10 -0
  20. package/dist/lib/api/openai-compat.js +262 -0
  21. package/dist/lib/api/openai-compat.js.map +1 -0
  22. package/dist/lib/api/proto/agent-messages.d.ts +25 -0
  23. package/dist/lib/api/proto/agent-messages.js +132 -0
  24. package/dist/lib/api/proto/agent-messages.js.map +1 -0
  25. package/dist/lib/api/proto/bidi.d.ts +17 -0
  26. package/dist/lib/api/proto/bidi.js +24 -0
  27. package/dist/lib/api/proto/bidi.js.map +1 -0
  28. package/dist/lib/api/proto/decoding.d.ts +19 -0
  29. package/dist/lib/api/proto/decoding.js +118 -0
  30. package/dist/lib/api/proto/decoding.js.map +1 -0
  31. package/dist/lib/api/proto/encoding.d.ts +64 -0
  32. package/dist/lib/api/proto/encoding.js +180 -0
  33. package/dist/lib/api/proto/encoding.js.map +1 -0
  34. package/dist/lib/api/proto/exec.d.ts +12 -0
  35. package/dist/lib/api/proto/exec.js +383 -0
  36. package/dist/lib/api/proto/exec.js.map +1 -0
  37. package/dist/lib/api/proto/index.d.ts +13 -0
  38. package/dist/lib/api/proto/index.js +10 -0
  39. package/dist/lib/api/proto/index.js.map +1 -0
  40. package/dist/lib/api/proto/interaction.d.ts +15 -0
  41. package/dist/lib/api/proto/interaction.js +99 -0
  42. package/dist/lib/api/proto/interaction.js.map +1 -0
  43. package/dist/lib/api/proto/kv.d.ts +52 -0
  44. package/dist/lib/api/proto/kv.js +156 -0
  45. package/dist/lib/api/proto/kv.js.map +1 -0
  46. package/dist/lib/api/proto/tool-calls.d.ts +9 -0
  47. package/dist/lib/api/proto/tool-calls.js +144 -0
  48. package/dist/lib/api/proto/tool-calls.js.map +1 -0
  49. package/dist/lib/api/proto/types.d.ts +201 -0
  50. package/dist/lib/api/proto/types.js +10 -0
  51. package/dist/lib/api/proto/types.js.map +1 -0
  52. package/dist/lib/auth/helpers.d.ts +40 -0
  53. package/dist/lib/auth/helpers.js +103 -0
  54. package/dist/lib/auth/helpers.js.map +1 -0
  55. package/dist/lib/auth/index.d.ts +7 -0
  56. package/dist/lib/auth/index.js +10 -0
  57. package/dist/lib/auth/index.js.map +1 -0
  58. package/dist/lib/auth/login.d.ts +55 -0
  59. package/dist/lib/auth/login.js +184 -0
  60. package/dist/lib/auth/login.js.map +1 -0
  61. package/dist/lib/config.d.ts +153 -0
  62. package/dist/lib/config.js +182 -0
  63. package/dist/lib/config.js.map +1 -0
  64. package/dist/lib/openai-compat/handler.d.ts +40 -0
  65. package/dist/lib/openai-compat/handler.js +808 -0
  66. package/dist/lib/openai-compat/handler.js.map +1 -0
  67. package/dist/lib/openai-compat/index.d.ts +9 -0
  68. package/dist/lib/openai-compat/index.js +13 -0
  69. package/dist/lib/openai-compat/index.js.map +1 -0
  70. package/dist/lib/openai-compat/types.d.ts +127 -0
  71. package/dist/lib/openai-compat/types.js +6 -0
  72. package/dist/lib/openai-compat/types.js.map +1 -0
  73. package/dist/lib/openai-compat/utils.d.ts +143 -0
  74. package/dist/lib/openai-compat/utils.js +348 -0
  75. package/dist/lib/openai-compat/utils.js.map +1 -0
  76. package/dist/lib/session-reuse.d.ts +88 -0
  77. package/dist/lib/session-reuse.js +198 -0
  78. package/dist/lib/session-reuse.js.map +1 -0
  79. package/dist/lib/storage.d.ts +55 -0
  80. package/dist/lib/storage.js +159 -0
  81. package/dist/lib/storage.js.map +1 -0
  82. package/dist/lib/utils/cache.d.ts +131 -0
  83. package/dist/lib/utils/cache.js +297 -0
  84. package/dist/lib/utils/cache.js.map +1 -0
  85. package/dist/lib/utils/fetch.d.ts +84 -0
  86. package/dist/lib/utils/fetch.js +261 -0
  87. package/dist/lib/utils/fetch.js.map +1 -0
  88. package/dist/lib/utils/index.d.ts +13 -0
  89. package/dist/lib/utils/index.js +22 -0
  90. package/dist/lib/utils/index.js.map +1 -0
  91. package/dist/lib/utils/jwt.d.ts +40 -0
  92. package/dist/lib/utils/jwt.js +102 -0
  93. package/dist/lib/utils/jwt.js.map +1 -0
  94. package/dist/lib/utils/logger.d.ts +107 -0
  95. package/dist/lib/utils/logger.js +227 -0
  96. package/dist/lib/utils/logger.js.map +1 -0
  97. package/dist/lib/utils/model-resolver.d.ts +49 -0
  98. package/dist/lib/utils/model-resolver.js +503 -0
  99. package/dist/lib/utils/model-resolver.js.map +1 -0
  100. package/dist/lib/utils/request-pool.d.ts +38 -0
  101. package/dist/lib/utils/request-pool.js +105 -0
  102. package/dist/lib/utils/request-pool.js.map +1 -0
  103. package/dist/lib/utils/request-transformer.d.ts +87 -0
  104. package/dist/lib/utils/request-transformer.js +154 -0
  105. package/dist/lib/utils/request-transformer.js.map +1 -0
  106. package/dist/lib/utils/tokenizer.d.ts +14 -0
  107. package/dist/lib/utils/tokenizer.js +76 -0
  108. package/dist/lib/utils/tokenizer.js.map +1 -0
  109. package/dist/plugin/index.d.ts +8 -0
  110. package/dist/plugin/index.js +9 -0
  111. package/dist/plugin/index.js.map +1 -0
  112. package/dist/plugin/plugin.d.ts +21 -0
  113. package/dist/plugin/plugin.js +309 -0
  114. package/dist/plugin/plugin.js.map +1 -0
  115. package/dist/plugin/types.d.ts +120 -0
  116. package/dist/plugin/types.js +7 -0
  117. package/dist/plugin/types.js.map +1 -0
  118. package/dist/server.d.ts +15 -0
  119. package/dist/server.js +95 -0
  120. package/dist/server.js.map +1 -0
  121. package/package.json +79 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Credential Storage
3
+ *
4
+ * File-based credential storage for cross-platform compatibility.
5
+ * Stores authentication tokens in a JSON file.
6
+ */
7
+ export interface StoredCredentials {
8
+ accessToken?: string;
9
+ refreshToken?: string;
10
+ apiKey?: string;
11
+ }
12
+ export interface CredentialManager {
13
+ getAccessToken(): Promise<string | undefined>;
14
+ getRefreshToken(): Promise<string | undefined>;
15
+ getApiKey(): Promise<string | undefined>;
16
+ getAllCredentials(): Promise<StoredCredentials>;
17
+ setAuthentication(accessToken: string, refreshToken: string, apiKey?: string): Promise<void>;
18
+ clearAuthentication(): Promise<void>;
19
+ getStoragePath(): string;
20
+ }
21
+ /**
22
+ * FileCredentialManager - File-based credential storage
23
+ *
24
+ * Storage Locations:
25
+ * - Windows: %APPDATA%\<TitleCase(domain)>\auth.json
26
+ * - macOS: ~/.<domain>/auth.json
27
+ * - Linux: $XDG_CONFIG_HOME/<domain>/auth.json or ~/.config/<domain>/auth.json
28
+ */
29
+ export declare class FileCredentialManager implements CredentialManager {
30
+ private cachedAccessToken;
31
+ private cachedRefreshToken;
32
+ private cachedApiKey;
33
+ private authFilePath;
34
+ constructor(domain?: string);
35
+ private toWindowsTitleCase;
36
+ private getAuthFilePath;
37
+ getStoragePath(): string;
38
+ private ensureDirectoryExists;
39
+ private readAuthData;
40
+ private writeAuthData;
41
+ setAuthentication(accessToken: string, refreshToken: string, apiKey?: string): Promise<void>;
42
+ getAccessToken(): Promise<string | undefined>;
43
+ getRefreshToken(): Promise<string | undefined>;
44
+ getApiKey(): Promise<string | undefined>;
45
+ getAllCredentials(): Promise<StoredCredentials>;
46
+ clearAuthentication(): Promise<void>;
47
+ /**
48
+ * Clear cached values to force reload from disk
49
+ */
50
+ clearCache(): void;
51
+ }
52
+ /**
53
+ * Create a credential manager for the specified domain
54
+ */
55
+ export declare function createCredentialManager(domain?: string): FileCredentialManager;
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Credential Storage
3
+ *
4
+ * File-based credential storage for cross-platform compatibility.
5
+ * Stores authentication tokens in a JSON file.
6
+ */
7
+ import { platform, homedir } from "node:os";
8
+ import { join, dirname } from "node:path";
9
+ import { promises as fs } from "node:fs";
10
+ /**
11
+ * FileCredentialManager - File-based credential storage
12
+ *
13
+ * Storage Locations:
14
+ * - Windows: %APPDATA%\<TitleCase(domain)>\auth.json
15
+ * - macOS: ~/.<domain>/auth.json
16
+ * - Linux: $XDG_CONFIG_HOME/<domain>/auth.json or ~/.config/<domain>/auth.json
17
+ */
18
+ export class FileCredentialManager {
19
+ cachedAccessToken = null;
20
+ cachedRefreshToken = null;
21
+ cachedApiKey = null;
22
+ authFilePath;
23
+ constructor(domain = "cursor") {
24
+ this.authFilePath = this.getAuthFilePath(domain);
25
+ }
26
+ toWindowsTitleCase(domain) {
27
+ if (domain.length === 0)
28
+ return domain;
29
+ return domain.charAt(0).toUpperCase() + domain.slice(1).toLowerCase();
30
+ }
31
+ getAuthFilePath(domain) {
32
+ const currentPlatform = platform();
33
+ switch (currentPlatform) {
34
+ case "win32": {
35
+ const appData = process.env.APPDATA || join(homedir(), "AppData", "Roaming");
36
+ const folder = this.toWindowsTitleCase(domain);
37
+ return join(appData, folder, "auth.json");
38
+ }
39
+ case "darwin":
40
+ return join(homedir(), `.${domain}`, "auth.json");
41
+ default: {
42
+ const configDir = process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
43
+ return join(configDir, domain, "auth.json");
44
+ }
45
+ }
46
+ }
47
+ getStoragePath() {
48
+ return this.authFilePath;
49
+ }
50
+ async ensureDirectoryExists() {
51
+ const dir = dirname(this.authFilePath);
52
+ try {
53
+ await fs.mkdir(dir, { recursive: true });
54
+ }
55
+ catch (error) {
56
+ if (error.code !== "EEXIST")
57
+ throw error;
58
+ }
59
+ }
60
+ async readAuthData() {
61
+ try {
62
+ const data = await fs.readFile(this.authFilePath, "utf-8");
63
+ return JSON.parse(data);
64
+ }
65
+ catch (error) {
66
+ if (error.code === "ENOENT")
67
+ return null;
68
+ return null;
69
+ }
70
+ }
71
+ async writeAuthData(data) {
72
+ await this.ensureDirectoryExists();
73
+ await fs.writeFile(this.authFilePath, JSON.stringify(data, null, 2), "utf-8");
74
+ }
75
+ async setAuthentication(accessToken, refreshToken, apiKey) {
76
+ await this.writeAuthData({ accessToken, refreshToken, apiKey });
77
+ this.cachedAccessToken = accessToken;
78
+ this.cachedRefreshToken = refreshToken;
79
+ this.cachedApiKey = apiKey ?? null;
80
+ }
81
+ async getAccessToken() {
82
+ if (this.cachedAccessToken)
83
+ return this.cachedAccessToken;
84
+ const authData = await this.readAuthData();
85
+ if (authData?.accessToken) {
86
+ this.cachedAccessToken = authData.accessToken;
87
+ this.cachedRefreshToken = authData.refreshToken ?? null;
88
+ this.cachedApiKey = authData.apiKey ?? null;
89
+ return authData.accessToken;
90
+ }
91
+ return undefined;
92
+ }
93
+ async getRefreshToken() {
94
+ if (this.cachedRefreshToken)
95
+ return this.cachedRefreshToken;
96
+ const authData = await this.readAuthData();
97
+ if (authData?.refreshToken) {
98
+ this.cachedAccessToken = authData.accessToken ?? null;
99
+ this.cachedRefreshToken = authData.refreshToken;
100
+ this.cachedApiKey = authData.apiKey ?? null;
101
+ return authData.refreshToken;
102
+ }
103
+ return undefined;
104
+ }
105
+ async getApiKey() {
106
+ if (this.cachedApiKey)
107
+ return this.cachedApiKey;
108
+ const authData = await this.readAuthData();
109
+ if (authData?.apiKey) {
110
+ this.cachedApiKey = authData.apiKey;
111
+ return authData.apiKey;
112
+ }
113
+ return undefined;
114
+ }
115
+ async getAllCredentials() {
116
+ if (this.cachedAccessToken !== null && this.cachedRefreshToken !== null) {
117
+ return {
118
+ accessToken: this.cachedAccessToken || undefined,
119
+ refreshToken: this.cachedRefreshToken || undefined,
120
+ apiKey: this.cachedApiKey || undefined,
121
+ };
122
+ }
123
+ const authData = await this.readAuthData();
124
+ if (authData) {
125
+ this.cachedAccessToken = authData.accessToken || null;
126
+ this.cachedRefreshToken = authData.refreshToken || null;
127
+ this.cachedApiKey = authData.apiKey || null;
128
+ return authData;
129
+ }
130
+ return {};
131
+ }
132
+ async clearAuthentication() {
133
+ try {
134
+ await fs.unlink(this.authFilePath);
135
+ }
136
+ catch (error) {
137
+ if (error.code !== "ENOENT")
138
+ throw error;
139
+ }
140
+ this.cachedAccessToken = null;
141
+ this.cachedRefreshToken = null;
142
+ this.cachedApiKey = null;
143
+ }
144
+ /**
145
+ * Clear cached values to force reload from disk
146
+ */
147
+ clearCache() {
148
+ this.cachedAccessToken = null;
149
+ this.cachedRefreshToken = null;
150
+ this.cachedApiKey = null;
151
+ }
152
+ }
153
+ /**
154
+ * Create a credential manager for the specified domain
155
+ */
156
+ export function createCredentialManager(domain = "cursor") {
157
+ return new FileCredentialManager(domain);
158
+ }
159
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/lib/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * LRU Cache Utilities
3
+ *
4
+ * Provides memory-efficient caching with:
5
+ * - Least Recently Used eviction
6
+ * - Time-based expiration (TTL)
7
+ * - Size limits
8
+ * - Optional dispose callbacks
9
+ */
10
+ export interface LRUCacheOptions<V> {
11
+ /** Maximum number of items in cache */
12
+ max: number;
13
+ /** Time-to-live in milliseconds (0 = no expiration) */
14
+ ttl?: number;
15
+ /** Callback when an item is evicted */
16
+ onEvict?: (key: string, value: V) => void;
17
+ }
18
+ /**
19
+ * Simple LRU Cache with TTL support
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const cache = new LRUCache<User>({ max: 100, ttl: 60000 });
24
+ *
25
+ * cache.set("user:1", { id: 1, name: "Alice" });
26
+ * const user = cache.get("user:1");
27
+ *
28
+ * // With dispose callback
29
+ * const sessions = new LRUCache<Session>({
30
+ * max: 50,
31
+ * ttl: 15 * 60 * 1000,
32
+ * onEvict: (key, session) => session.close(),
33
+ * });
34
+ * ```
35
+ */
36
+ export declare class LRUCache<V> {
37
+ private cache;
38
+ private max;
39
+ private ttl;
40
+ private onEvict?;
41
+ constructor(options: LRUCacheOptions<V>);
42
+ /**
43
+ * Get an item from the cache
44
+ * Returns undefined if not found or expired
45
+ */
46
+ get(key: string): V | undefined;
47
+ /**
48
+ * Set an item in the cache
49
+ */
50
+ set(key: string, value: V, ttl?: number): this;
51
+ /**
52
+ * Check if a key exists and is not expired
53
+ */
54
+ has(key: string): boolean;
55
+ /**
56
+ * Delete an item from the cache
57
+ */
58
+ delete(key: string): boolean;
59
+ /**
60
+ * Clear all items from the cache
61
+ */
62
+ clear(): void;
63
+ /**
64
+ * Get the number of items in the cache
65
+ */
66
+ get size(): number;
67
+ /**
68
+ * Get all keys in the cache
69
+ */
70
+ keys(): IterableIterator<string>;
71
+ /**
72
+ * Get all values in the cache (excluding expired)
73
+ */
74
+ values(): IterableIterator<V>;
75
+ /**
76
+ * Get all entries in the cache (excluding expired)
77
+ */
78
+ entries(): IterableIterator<[string, V]>;
79
+ /**
80
+ * Remove expired entries
81
+ */
82
+ prune(): number;
83
+ /**
84
+ * Get cache statistics
85
+ */
86
+ stats(): {
87
+ size: number;
88
+ max: number;
89
+ ttl: number;
90
+ };
91
+ }
92
+ /**
93
+ * A Map that automatically evicts oldest entries when max size is reached
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * const blobs = new BoundedMap<Uint8Array>(1000);
98
+ * blobs.set("key", new Uint8Array([1, 2, 3]));
99
+ * ```
100
+ */
101
+ export declare class BoundedMap<V> {
102
+ private map;
103
+ private max;
104
+ private onEvict?;
105
+ constructor(max: number, onEvict?: (key: string, value: V) => void);
106
+ get(key: string): V | undefined;
107
+ set(key: string, value: V): this;
108
+ has(key: string): boolean;
109
+ delete(key: string): boolean;
110
+ clear(): void;
111
+ get size(): number;
112
+ keys(): IterableIterator<string>;
113
+ values(): IterableIterator<V>;
114
+ entries(): IterableIterator<[string, V]>;
115
+ forEach(callback: (value: V, key: string, map: BoundedMap<V>) => void): void;
116
+ }
117
+ /**
118
+ * Memoize an async function with cache
119
+ *
120
+ * @example
121
+ * ```ts
122
+ * const fetchUser = memoizeAsync(
123
+ * async (id: string) => await api.getUser(id),
124
+ * { max: 100, ttl: 60000 }
125
+ * );
126
+ *
127
+ * const user = await fetchUser("user:1"); // Fetches from API
128
+ * const cached = await fetchUser("user:1"); // Returns cached value
129
+ * ```
130
+ */
131
+ export declare function memoizeAsync<T>(fn: (key: string) => Promise<T>, options: LRUCacheOptions<T>): (key: string) => Promise<T>;
@@ -0,0 +1,297 @@
1
+ /**
2
+ * LRU Cache Utilities
3
+ *
4
+ * Provides memory-efficient caching with:
5
+ * - Least Recently Used eviction
6
+ * - Time-based expiration (TTL)
7
+ * - Size limits
8
+ * - Optional dispose callbacks
9
+ */
10
+ // --- LRU Cache Implementation ---
11
+ /**
12
+ * Simple LRU Cache with TTL support
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const cache = new LRUCache<User>({ max: 100, ttl: 60000 });
17
+ *
18
+ * cache.set("user:1", { id: 1, name: "Alice" });
19
+ * const user = cache.get("user:1");
20
+ *
21
+ * // With dispose callback
22
+ * const sessions = new LRUCache<Session>({
23
+ * max: 50,
24
+ * ttl: 15 * 60 * 1000,
25
+ * onEvict: (key, session) => session.close(),
26
+ * });
27
+ * ```
28
+ */
29
+ export class LRUCache {
30
+ cache;
31
+ max;
32
+ ttl;
33
+ onEvict;
34
+ constructor(options) {
35
+ this.cache = new Map();
36
+ this.max = options.max;
37
+ this.ttl = options.ttl ?? 0;
38
+ this.onEvict = options.onEvict;
39
+ }
40
+ /**
41
+ * Get an item from the cache
42
+ * Returns undefined if not found or expired
43
+ */
44
+ get(key) {
45
+ const entry = this.cache.get(key);
46
+ if (!entry) {
47
+ return undefined;
48
+ }
49
+ // Check expiration
50
+ if (entry.expiresAt !== null && Date.now() > entry.expiresAt) {
51
+ this.delete(key);
52
+ return undefined;
53
+ }
54
+ // Move to end (most recently used)
55
+ this.cache.delete(key);
56
+ this.cache.set(key, entry);
57
+ return entry.value;
58
+ }
59
+ /**
60
+ * Set an item in the cache
61
+ */
62
+ set(key, value, ttl) {
63
+ // Delete existing entry if present
64
+ if (this.cache.has(key)) {
65
+ this.cache.delete(key);
66
+ }
67
+ // Evict oldest entries if at capacity
68
+ while (this.cache.size >= this.max) {
69
+ const oldestKey = this.cache.keys().next().value;
70
+ if (oldestKey !== undefined) {
71
+ this.delete(oldestKey);
72
+ }
73
+ }
74
+ // Calculate expiration
75
+ const effectiveTtl = ttl ?? this.ttl;
76
+ const expiresAt = effectiveTtl > 0 ? Date.now() + effectiveTtl : null;
77
+ // Add new entry
78
+ this.cache.set(key, { value, expiresAt });
79
+ return this;
80
+ }
81
+ /**
82
+ * Check if a key exists and is not expired
83
+ */
84
+ has(key) {
85
+ const entry = this.cache.get(key);
86
+ if (!entry)
87
+ return false;
88
+ if (entry.expiresAt !== null && Date.now() > entry.expiresAt) {
89
+ this.delete(key);
90
+ return false;
91
+ }
92
+ return true;
93
+ }
94
+ /**
95
+ * Delete an item from the cache
96
+ */
97
+ delete(key) {
98
+ const entry = this.cache.get(key);
99
+ if (entry && this.onEvict) {
100
+ this.onEvict(key, entry.value);
101
+ }
102
+ return this.cache.delete(key);
103
+ }
104
+ /**
105
+ * Clear all items from the cache
106
+ */
107
+ clear() {
108
+ if (this.onEvict) {
109
+ for (const [key, entry] of this.cache) {
110
+ this.onEvict(key, entry.value);
111
+ }
112
+ }
113
+ this.cache.clear();
114
+ }
115
+ /**
116
+ * Get the number of items in the cache
117
+ */
118
+ get size() {
119
+ return this.cache.size;
120
+ }
121
+ /**
122
+ * Get all keys in the cache
123
+ */
124
+ keys() {
125
+ return this.cache.keys();
126
+ }
127
+ /**
128
+ * Get all values in the cache (excluding expired)
129
+ */
130
+ *values() {
131
+ const now = Date.now();
132
+ for (const [key, entry] of this.cache) {
133
+ if (entry.expiresAt !== null && now > entry.expiresAt) {
134
+ this.delete(key);
135
+ continue;
136
+ }
137
+ yield entry.value;
138
+ }
139
+ }
140
+ /**
141
+ * Get all entries in the cache (excluding expired)
142
+ */
143
+ *entries() {
144
+ const now = Date.now();
145
+ for (const [key, entry] of this.cache) {
146
+ if (entry.expiresAt !== null && now > entry.expiresAt) {
147
+ this.delete(key);
148
+ continue;
149
+ }
150
+ yield [key, entry.value];
151
+ }
152
+ }
153
+ /**
154
+ * Remove expired entries
155
+ */
156
+ prune() {
157
+ const now = Date.now();
158
+ let pruned = 0;
159
+ for (const [key, entry] of this.cache) {
160
+ if (entry.expiresAt !== null && now > entry.expiresAt) {
161
+ this.delete(key);
162
+ pruned++;
163
+ }
164
+ }
165
+ return pruned;
166
+ }
167
+ /**
168
+ * Get cache statistics
169
+ */
170
+ stats() {
171
+ return {
172
+ size: this.cache.size,
173
+ max: this.max,
174
+ ttl: this.ttl,
175
+ };
176
+ }
177
+ }
178
+ // --- Bounded Map (Size-Limited) ---
179
+ /**
180
+ * A Map that automatically evicts oldest entries when max size is reached
181
+ *
182
+ * @example
183
+ * ```ts
184
+ * const blobs = new BoundedMap<Uint8Array>(1000);
185
+ * blobs.set("key", new Uint8Array([1, 2, 3]));
186
+ * ```
187
+ */
188
+ export class BoundedMap {
189
+ map;
190
+ max;
191
+ onEvict;
192
+ constructor(max, onEvict) {
193
+ this.map = new Map();
194
+ this.max = max;
195
+ this.onEvict = onEvict;
196
+ }
197
+ get(key) {
198
+ return this.map.get(key);
199
+ }
200
+ set(key, value) {
201
+ // Delete existing if present
202
+ if (this.map.has(key)) {
203
+ this.map.delete(key);
204
+ }
205
+ // Evict oldest if at capacity
206
+ while (this.map.size >= this.max) {
207
+ const oldestKey = this.map.keys().next().value;
208
+ if (oldestKey !== undefined) {
209
+ const oldValue = this.map.get(oldestKey);
210
+ if (oldValue !== undefined && this.onEvict) {
211
+ this.onEvict(oldestKey, oldValue);
212
+ }
213
+ this.map.delete(oldestKey);
214
+ }
215
+ }
216
+ this.map.set(key, value);
217
+ return this;
218
+ }
219
+ has(key) {
220
+ return this.map.has(key);
221
+ }
222
+ delete(key) {
223
+ const value = this.map.get(key);
224
+ if (value !== undefined && this.onEvict) {
225
+ this.onEvict(key, value);
226
+ }
227
+ return this.map.delete(key);
228
+ }
229
+ clear() {
230
+ if (this.onEvict) {
231
+ for (const [key, value] of this.map) {
232
+ this.onEvict(key, value);
233
+ }
234
+ }
235
+ this.map.clear();
236
+ }
237
+ get size() {
238
+ return this.map.size;
239
+ }
240
+ keys() {
241
+ return this.map.keys();
242
+ }
243
+ values() {
244
+ return this.map.values();
245
+ }
246
+ entries() {
247
+ return this.map.entries();
248
+ }
249
+ forEach(callback) {
250
+ this.map.forEach((value, key) => callback(value, key, this));
251
+ }
252
+ }
253
+ // --- Async Memoization ---
254
+ /**
255
+ * Memoize an async function with cache
256
+ *
257
+ * @example
258
+ * ```ts
259
+ * const fetchUser = memoizeAsync(
260
+ * async (id: string) => await api.getUser(id),
261
+ * { max: 100, ttl: 60000 }
262
+ * );
263
+ *
264
+ * const user = await fetchUser("user:1"); // Fetches from API
265
+ * const cached = await fetchUser("user:1"); // Returns cached value
266
+ * ```
267
+ */
268
+ export function memoizeAsync(fn, options) {
269
+ const cache = new LRUCache(options);
270
+ const pending = new Map();
271
+ return async (key) => {
272
+ // Return cached value if available
273
+ const cached = cache.get(key);
274
+ if (cached !== undefined) {
275
+ return cached;
276
+ }
277
+ // Return pending promise if already fetching
278
+ const pendingPromise = pending.get(key);
279
+ if (pendingPromise) {
280
+ return pendingPromise;
281
+ }
282
+ // Fetch and cache
283
+ const promise = fn(key)
284
+ .then((value) => {
285
+ cache.set(key, value);
286
+ pending.delete(key);
287
+ return value;
288
+ })
289
+ .catch((error) => {
290
+ pending.delete(key);
291
+ throw error;
292
+ });
293
+ pending.set(key, promise);
294
+ return promise;
295
+ };
296
+ }
297
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/lib/utils/cache.ts"],"names":[],"mappings":"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"}