@permissionless-technologies/upp-sdk 0.5.3 → 0.5.4

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.
@@ -1,399 +0,0 @@
1
- import { __export, __esm, __toCommonJS } from './chunk-Z6ZWNWWR.js';
2
-
3
- // src/indexer/storage/indexedDB.ts
4
- var indexedDB_exports = {};
5
- __export(indexedDB_exports, {
6
- createIndexedDBAdapter: () => createIndexedDBAdapter,
7
- indexedDBAdapter: () => indexedDBAdapter
8
- });
9
- function createIndexedDBAdapter(prefix = "") {
10
- return new IndexedDBAdapter(prefix);
11
- }
12
- var DB_NAME, DB_VERSION, STORE_NAME, IndexedDBAdapter, indexedDBAdapter;
13
- var init_indexedDB = __esm({
14
- "src/indexer/storage/indexedDB.ts"() {
15
- DB_NAME = "upp-indexer";
16
- DB_VERSION = 1;
17
- STORE_NAME = "keyval";
18
- IndexedDBAdapter = class {
19
- dbPromise = null;
20
- prefix;
21
- constructor(prefix = "") {
22
- this.prefix = prefix;
23
- }
24
- /**
25
- * Check if IndexedDB is available
26
- */
27
- isAvailable() {
28
- if (typeof window === "undefined") return false;
29
- return "indexedDB" in window;
30
- }
31
- /**
32
- * Get the database instance
33
- */
34
- async getDB() {
35
- if (!this.isAvailable()) {
36
- throw new Error("IndexedDB is not available");
37
- }
38
- if (this.dbPromise) {
39
- return this.dbPromise;
40
- }
41
- this.dbPromise = new Promise((resolve, reject) => {
42
- const request = indexedDB.open(DB_NAME, DB_VERSION);
43
- request.onerror = () => {
44
- reject(new Error(`Failed to open IndexedDB: ${request.error?.message}`));
45
- };
46
- request.onsuccess = () => {
47
- resolve(request.result);
48
- };
49
- request.onupgradeneeded = (event) => {
50
- const db = event.target.result;
51
- if (!db.objectStoreNames.contains(STORE_NAME)) {
52
- db.createObjectStore(STORE_NAME);
53
- }
54
- };
55
- });
56
- return this.dbPromise;
57
- }
58
- /**
59
- * Get the full key with prefix
60
- */
61
- getKey(key) {
62
- return this.prefix ? `${this.prefix}:${key}` : key;
63
- }
64
- /**
65
- * Get a value by key
66
- */
67
- async get(key) {
68
- const db = await this.getDB();
69
- const fullKey = this.getKey(key);
70
- return new Promise((resolve, reject) => {
71
- const transaction = db.transaction(STORE_NAME, "readonly");
72
- const store = transaction.objectStore(STORE_NAME);
73
- const request = store.get(fullKey);
74
- request.onerror = () => {
75
- reject(new Error(`Failed to get key "${fullKey}": ${request.error?.message}`));
76
- };
77
- request.onsuccess = () => {
78
- resolve(request.result ?? null);
79
- };
80
- });
81
- }
82
- /**
83
- * Set a value
84
- */
85
- async set(key, value) {
86
- const db = await this.getDB();
87
- const fullKey = this.getKey(key);
88
- return new Promise((resolve, reject) => {
89
- const transaction = db.transaction(STORE_NAME, "readwrite");
90
- const store = transaction.objectStore(STORE_NAME);
91
- const request = store.put(value, fullKey);
92
- request.onerror = () => {
93
- reject(new Error(`Failed to set key "${fullKey}": ${request.error?.message}`));
94
- };
95
- request.onsuccess = () => {
96
- resolve();
97
- };
98
- });
99
- }
100
- /**
101
- * Delete a value
102
- */
103
- async delete(key) {
104
- const db = await this.getDB();
105
- const fullKey = this.getKey(key);
106
- return new Promise((resolve, reject) => {
107
- const transaction = db.transaction(STORE_NAME, "readwrite");
108
- const store = transaction.objectStore(STORE_NAME);
109
- const request = store.delete(fullKey);
110
- request.onerror = () => {
111
- reject(new Error(`Failed to delete key "${fullKey}": ${request.error?.message}`));
112
- };
113
- request.onsuccess = () => {
114
- resolve();
115
- };
116
- });
117
- }
118
- /**
119
- * Clear all data with this prefix
120
- */
121
- async clear() {
122
- const db = await this.getDB();
123
- return new Promise((resolve, reject) => {
124
- const transaction = db.transaction(STORE_NAME, "readwrite");
125
- const store = transaction.objectStore(STORE_NAME);
126
- if (!this.prefix) {
127
- const request = store.clear();
128
- request.onerror = () => reject(new Error(`Failed to clear: ${request.error?.message}`));
129
- request.onsuccess = () => resolve();
130
- } else {
131
- const request = store.openCursor();
132
- const keysToDelete = [];
133
- request.onerror = () => reject(new Error(`Failed to iterate: ${request.error?.message}`));
134
- request.onsuccess = (event) => {
135
- const cursor = event.target.result;
136
- if (cursor) {
137
- const key = cursor.key;
138
- if (typeof key === "string" && key.startsWith(`${this.prefix}:`)) {
139
- keysToDelete.push(key);
140
- }
141
- cursor.continue();
142
- } else {
143
- Promise.all(
144
- keysToDelete.map(
145
- (k) => new Promise((res, rej) => {
146
- const deleteReq = store.delete(k);
147
- deleteReq.onerror = () => rej(deleteReq.error);
148
- deleteReq.onsuccess = () => res();
149
- })
150
- )
151
- ).then(() => resolve()).catch(reject);
152
- }
153
- };
154
- }
155
- });
156
- }
157
- };
158
- indexedDBAdapter = createIndexedDBAdapter();
159
- }
160
- });
161
-
162
- // src/indexer/storage/localStorage.ts
163
- var localStorage_exports = {};
164
- __export(localStorage_exports, {
165
- createLocalStorageAdapter: () => createLocalStorageAdapter,
166
- localStorageAdapter: () => localStorageAdapter
167
- });
168
- function createLocalStorageAdapter(prefix = "") {
169
- return new LocalStorageAdapter(prefix);
170
- }
171
- var LocalStorageAdapter, localStorageAdapter;
172
- var init_localStorage = __esm({
173
- "src/indexer/storage/localStorage.ts"() {
174
- LocalStorageAdapter = class {
175
- prefix;
176
- constructor(prefix = "") {
177
- this.prefix = prefix;
178
- }
179
- /**
180
- * Check if localStorage is available
181
- */
182
- isAvailable() {
183
- if (typeof window === "undefined") return false;
184
- try {
185
- const test = "__storage_test__";
186
- window.localStorage.setItem(test, test);
187
- window.localStorage.removeItem(test);
188
- return true;
189
- } catch {
190
- return false;
191
- }
192
- }
193
- /**
194
- * Get the full key with prefix
195
- */
196
- getKey(key) {
197
- return this.prefix ? `upp:${this.prefix}:${key}` : `upp:${key}`;
198
- }
199
- /**
200
- * Get a value by key
201
- */
202
- async get(key) {
203
- if (!this.isAvailable()) {
204
- throw new Error("localStorage is not available");
205
- }
206
- const fullKey = this.getKey(key);
207
- const value = localStorage.getItem(fullKey);
208
- if (value === null) {
209
- return null;
210
- }
211
- try {
212
- return JSON.parse(value);
213
- } catch {
214
- console.warn(`Failed to parse localStorage value for key "${fullKey}"`);
215
- return null;
216
- }
217
- }
218
- /**
219
- * Set a value
220
- */
221
- async set(key, value) {
222
- if (!this.isAvailable()) {
223
- throw new Error("localStorage is not available");
224
- }
225
- const fullKey = this.getKey(key);
226
- try {
227
- const serialized = JSON.stringify(value);
228
- localStorage.setItem(fullKey, serialized);
229
- } catch (e) {
230
- if (e instanceof Error && e.name === "QuotaExceededError") {
231
- throw new Error("localStorage quota exceeded. Consider using IndexedDB instead.");
232
- }
233
- throw e;
234
- }
235
- }
236
- /**
237
- * Delete a value
238
- */
239
- async delete(key) {
240
- if (!this.isAvailable()) {
241
- throw new Error("localStorage is not available");
242
- }
243
- const fullKey = this.getKey(key);
244
- localStorage.removeItem(fullKey);
245
- }
246
- /**
247
- * Clear all data with this prefix
248
- */
249
- async clear() {
250
- if (!this.isAvailable()) {
251
- throw new Error("localStorage is not available");
252
- }
253
- const prefix = this.prefix ? `upp:${this.prefix}:` : "upp:";
254
- const keysToRemove = [];
255
- for (let i = 0; i < localStorage.length; i++) {
256
- const key = localStorage.key(i);
257
- if (key && key.startsWith(prefix)) {
258
- keysToRemove.push(key);
259
- }
260
- }
261
- for (const key of keysToRemove) {
262
- localStorage.removeItem(key);
263
- }
264
- }
265
- };
266
- localStorageAdapter = createLocalStorageAdapter();
267
- }
268
- });
269
-
270
- // src/indexer/storage/memory.ts
271
- var memory_exports = {};
272
- __export(memory_exports, {
273
- createMemoryAdapter: () => createMemoryAdapter,
274
- memoryAdapter: () => memoryAdapter
275
- });
276
- function createMemoryAdapter(prefix = "") {
277
- return new MemoryAdapter(prefix);
278
- }
279
- var MemoryAdapter, memoryAdapter;
280
- var init_memory = __esm({
281
- "src/indexer/storage/memory.ts"() {
282
- MemoryAdapter = class {
283
- store;
284
- prefix;
285
- constructor(prefix = "") {
286
- this.store = /* @__PURE__ */ new Map();
287
- this.prefix = prefix;
288
- }
289
- /**
290
- * Always available
291
- */
292
- isAvailable() {
293
- return true;
294
- }
295
- /**
296
- * Get the full key with prefix
297
- */
298
- getKey(key) {
299
- return this.prefix ? `${this.prefix}:${key}` : key;
300
- }
301
- /**
302
- * Get a value by key
303
- */
304
- async get(key) {
305
- const fullKey = this.getKey(key);
306
- const value = this.store.get(fullKey);
307
- return value ?? null;
308
- }
309
- /**
310
- * Set a value
311
- */
312
- async set(key, value) {
313
- const fullKey = this.getKey(key);
314
- this.store.set(fullKey, structuredClone(value));
315
- }
316
- /**
317
- * Delete a value
318
- */
319
- async delete(key) {
320
- const fullKey = this.getKey(key);
321
- this.store.delete(fullKey);
322
- }
323
- /**
324
- * Clear all data with this prefix
325
- */
326
- async clear() {
327
- if (!this.prefix) {
328
- this.store.clear();
329
- } else {
330
- const keysToDelete = [];
331
- for (const key of this.store.keys()) {
332
- if (key.startsWith(`${this.prefix}:`)) {
333
- keysToDelete.push(key);
334
- }
335
- }
336
- for (const key of keysToDelete) {
337
- this.store.delete(key);
338
- }
339
- }
340
- }
341
- /**
342
- * Get the number of stored items (for testing)
343
- */
344
- size() {
345
- if (!this.prefix) {
346
- return this.store.size;
347
- }
348
- let count = 0;
349
- for (const key of this.store.keys()) {
350
- if (key.startsWith(`${this.prefix}:`)) {
351
- count++;
352
- }
353
- }
354
- return count;
355
- }
356
- /**
357
- * Get all keys (for testing)
358
- */
359
- keys() {
360
- const result = [];
361
- const prefixToRemove = this.prefix ? `${this.prefix}:` : "";
362
- for (const key of this.store.keys()) {
363
- if (!this.prefix || key.startsWith(prefixToRemove)) {
364
- result.push(this.prefix ? key.slice(prefixToRemove.length) : key);
365
- }
366
- }
367
- return result;
368
- }
369
- };
370
- memoryAdapter = createMemoryAdapter();
371
- }
372
- });
373
-
374
- // src/indexer/storage/index.ts
375
- init_indexedDB();
376
- init_localStorage();
377
- init_memory();
378
- function createAutoAdapter(prefix = "") {
379
- if (typeof window !== "undefined" && "indexedDB" in window) {
380
- const { createIndexedDBAdapter: createIndexedDBAdapter2 } = (init_indexedDB(), __toCommonJS(indexedDB_exports));
381
- return createIndexedDBAdapter2(prefix);
382
- }
383
- if (typeof window !== "undefined" && typeof localStorage !== "undefined") {
384
- try {
385
- const test = "__storage_test__";
386
- localStorage.setItem(test, test);
387
- localStorage.removeItem(test);
388
- const { createLocalStorageAdapter: createLocalStorageAdapter2 } = (init_localStorage(), __toCommonJS(localStorage_exports));
389
- return createLocalStorageAdapter2(prefix);
390
- } catch {
391
- }
392
- }
393
- const { createMemoryAdapter: createMemoryAdapter2 } = (init_memory(), __toCommonJS(memory_exports));
394
- return createMemoryAdapter2(prefix);
395
- }
396
-
397
- export { createAutoAdapter, createIndexedDBAdapter, createLocalStorageAdapter, createMemoryAdapter, indexedDBAdapter, localStorageAdapter, memoryAdapter };
398
- //# sourceMappingURL=chunk-XV72HNHN.js.map
399
- //# sourceMappingURL=chunk-XV72HNHN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/indexer/storage/indexedDB.ts","../src/indexer/storage/localStorage.ts","../src/indexer/storage/memory.ts","../src/indexer/storage/index.ts"],"names":["createIndexedDBAdapter","createLocalStorageAdapter","createMemoryAdapter"],"mappings":"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","file":"chunk-XV72HNHN.js","sourcesContent":["/**\n * IndexedDB Storage Adapter\n *\n * Provides persistent storage using IndexedDB for browser environments.\n * This is the default and recommended storage adapter for production use.\n *\n * Benefits:\n * - Large capacity (no 5MB limit like localStorage)\n * - Async API (non-blocking)\n * - Supports storing large objects like Merkle trees\n * - Transactional (data integrity)\n */\n\nimport type { StorageAdapter } from '../types.js'\n\nconst DB_NAME = 'upp-indexer'\nconst DB_VERSION = 1\nconst STORE_NAME = 'keyval'\n\n/**\n * IndexedDB storage adapter\n */\nclass IndexedDBAdapter implements StorageAdapter {\n private dbPromise: Promise<IDBDatabase> | null = null\n private prefix: string\n\n constructor(prefix: string = '') {\n this.prefix = prefix\n }\n\n /**\n * Check if IndexedDB is available\n */\n isAvailable(): boolean {\n if (typeof window === 'undefined') return false\n return 'indexedDB' in window\n }\n\n /**\n * Get the database instance\n */\n private async getDB(): Promise<IDBDatabase> {\n if (!this.isAvailable()) {\n throw new Error('IndexedDB is not available')\n }\n\n if (this.dbPromise) {\n return this.dbPromise\n }\n\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION)\n\n request.onerror = () => {\n reject(new Error(`Failed to open IndexedDB: ${request.error?.message}`))\n }\n\n request.onsuccess = () => {\n resolve(request.result)\n }\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n\n // Create object store if it doesn't exist\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME)\n }\n }\n })\n\n return this.dbPromise\n }\n\n /**\n * Get the full key with prefix\n */\n private getKey(key: string): string {\n return this.prefix ? `${this.prefix}:${key}` : key\n }\n\n /**\n * Get a value by key\n */\n async get<T>(key: string): Promise<T | null> {\n const db = await this.getDB()\n const fullKey = this.getKey(key)\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.get(fullKey)\n\n request.onerror = () => {\n reject(new Error(`Failed to get key \"${fullKey}\": ${request.error?.message}`))\n }\n\n request.onsuccess = () => {\n resolve(request.result ?? null)\n }\n })\n }\n\n /**\n * Set a value\n */\n async set<T>(key: string, value: T): Promise<void> {\n const db = await this.getDB()\n const fullKey = this.getKey(key)\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.put(value, fullKey)\n\n request.onerror = () => {\n reject(new Error(`Failed to set key \"${fullKey}\": ${request.error?.message}`))\n }\n\n request.onsuccess = () => {\n resolve()\n }\n })\n }\n\n /**\n * Delete a value\n */\n async delete(key: string): Promise<void> {\n const db = await this.getDB()\n const fullKey = this.getKey(key)\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.delete(fullKey)\n\n request.onerror = () => {\n reject(new Error(`Failed to delete key \"${fullKey}\": ${request.error?.message}`))\n }\n\n request.onsuccess = () => {\n resolve()\n }\n })\n }\n\n /**\n * Clear all data with this prefix\n */\n async clear(): Promise<void> {\n const db = await this.getDB()\n\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n\n if (!this.prefix) {\n // Clear all if no prefix\n const request = store.clear()\n request.onerror = () => reject(new Error(`Failed to clear: ${request.error?.message}`))\n request.onsuccess = () => resolve()\n } else {\n // Only clear keys with this prefix\n const request = store.openCursor()\n const keysToDelete: IDBValidKey[] = []\n\n request.onerror = () => reject(new Error(`Failed to iterate: ${request.error?.message}`))\n\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n const key = cursor.key\n if (typeof key === 'string' && key.startsWith(`${this.prefix}:`)) {\n keysToDelete.push(key)\n }\n cursor.continue()\n } else {\n // Delete all matching keys\n Promise.all(\n keysToDelete.map(\n (k) =>\n new Promise<void>((res, rej) => {\n const deleteReq = store.delete(k)\n deleteReq.onerror = () => rej(deleteReq.error)\n deleteReq.onsuccess = () => res()\n })\n )\n )\n .then(() => resolve())\n .catch(reject)\n }\n }\n }\n })\n }\n}\n\n/**\n * Create an IndexedDB storage adapter\n *\n * @param prefix - Optional prefix for keys (useful for multi-account)\n * @returns StorageAdapter instance\n *\n * @example\n * ```ts\n * const storage = createIndexedDBAdapter('account_0x123')\n * await storage.set('notes', myNotes)\n * const notes = await storage.get('notes')\n * ```\n */\nexport function createIndexedDBAdapter(prefix: string = ''): StorageAdapter {\n return new IndexedDBAdapter(prefix)\n}\n\n/**\n * Default IndexedDB adapter instance (no prefix)\n */\nexport const indexedDBAdapter = createIndexedDBAdapter()\n","/**\n * localStorage Storage Adapter\n *\n * Provides persistent storage using localStorage for browser environments.\n * This is a fallback adapter when IndexedDB is not available or for simpler use cases.\n *\n * Limitations:\n * - 5MB storage limit per origin\n * - Synchronous API (blocks main thread on large operations)\n * - Data must be JSON serializable\n */\n\nimport type { StorageAdapter } from '../types.js'\n\n/**\n * localStorage storage adapter\n */\nclass LocalStorageAdapter implements StorageAdapter {\n private prefix: string\n\n constructor(prefix: string = '') {\n this.prefix = prefix\n }\n\n /**\n * Check if localStorage is available\n */\n isAvailable(): boolean {\n if (typeof window === 'undefined') return false\n try {\n const test = '__storage_test__'\n window.localStorage.setItem(test, test)\n window.localStorage.removeItem(test)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Get the full key with prefix\n */\n private getKey(key: string): string {\n return this.prefix ? `upp:${this.prefix}:${key}` : `upp:${key}`\n }\n\n /**\n * Get a value by key\n */\n async get<T>(key: string): Promise<T | null> {\n if (!this.isAvailable()) {\n throw new Error('localStorage is not available')\n }\n\n const fullKey = this.getKey(key)\n const value = localStorage.getItem(fullKey)\n\n if (value === null) {\n return null\n }\n\n try {\n return JSON.parse(value) as T\n } catch {\n // If JSON parse fails, return null\n console.warn(`Failed to parse localStorage value for key \"${fullKey}\"`)\n return null\n }\n }\n\n /**\n * Set a value\n */\n async set<T>(key: string, value: T): Promise<void> {\n if (!this.isAvailable()) {\n throw new Error('localStorage is not available')\n }\n\n const fullKey = this.getKey(key)\n\n try {\n const serialized = JSON.stringify(value)\n localStorage.setItem(fullKey, serialized)\n } catch (e) {\n if (e instanceof Error && e.name === 'QuotaExceededError') {\n throw new Error('localStorage quota exceeded. Consider using IndexedDB instead.')\n }\n throw e\n }\n }\n\n /**\n * Delete a value\n */\n async delete(key: string): Promise<void> {\n if (!this.isAvailable()) {\n throw new Error('localStorage is not available')\n }\n\n const fullKey = this.getKey(key)\n localStorage.removeItem(fullKey)\n }\n\n /**\n * Clear all data with this prefix\n */\n async clear(): Promise<void> {\n if (!this.isAvailable()) {\n throw new Error('localStorage is not available')\n }\n\n const prefix = this.prefix ? `upp:${this.prefix}:` : 'upp:'\n const keysToRemove: string[] = []\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key && key.startsWith(prefix)) {\n keysToRemove.push(key)\n }\n }\n\n for (const key of keysToRemove) {\n localStorage.removeItem(key)\n }\n }\n}\n\n/**\n * Create a localStorage storage adapter\n *\n * @param prefix - Optional prefix for keys (useful for multi-account)\n * @returns StorageAdapter instance\n *\n * @example\n * ```ts\n * const storage = createLocalStorageAdapter('account_0x123')\n * await storage.set('notes', myNotes)\n * const notes = await storage.get('notes')\n * ```\n */\nexport function createLocalStorageAdapter(prefix: string = ''): StorageAdapter {\n return new LocalStorageAdapter(prefix)\n}\n\n/**\n * Default localStorage adapter instance (no prefix)\n */\nexport const localStorageAdapter = createLocalStorageAdapter()\n","/**\n * In-Memory Storage Adapter\n *\n * Provides non-persistent storage for testing and development.\n * Data is lost when the process ends or the adapter is cleared.\n *\n * Use cases:\n * - Unit tests\n * - Server-side rendering (where IndexedDB/localStorage aren't available)\n * - Development without persistence\n */\n\nimport type { StorageAdapter } from '../types.js'\n\n/**\n * In-memory storage adapter\n */\nclass MemoryAdapter implements StorageAdapter {\n private store: Map<string, unknown>\n private prefix: string\n\n constructor(prefix: string = '') {\n this.store = new Map()\n this.prefix = prefix\n }\n\n /**\n * Always available\n */\n isAvailable(): boolean {\n return true\n }\n\n /**\n * Get the full key with prefix\n */\n private getKey(key: string): string {\n return this.prefix ? `${this.prefix}:${key}` : key\n }\n\n /**\n * Get a value by key\n */\n async get<T>(key: string): Promise<T | null> {\n const fullKey = this.getKey(key)\n const value = this.store.get(fullKey)\n return (value as T) ?? null\n }\n\n /**\n * Set a value\n */\n async set<T>(key: string, value: T): Promise<void> {\n const fullKey = this.getKey(key)\n // Deep clone to prevent external mutations\n this.store.set(fullKey, structuredClone(value))\n }\n\n /**\n * Delete a value\n */\n async delete(key: string): Promise<void> {\n const fullKey = this.getKey(key)\n this.store.delete(fullKey)\n }\n\n /**\n * Clear all data with this prefix\n */\n async clear(): Promise<void> {\n if (!this.prefix) {\n this.store.clear()\n } else {\n const keysToDelete: string[] = []\n for (const key of this.store.keys()) {\n if (key.startsWith(`${this.prefix}:`)) {\n keysToDelete.push(key)\n }\n }\n for (const key of keysToDelete) {\n this.store.delete(key)\n }\n }\n }\n\n /**\n * Get the number of stored items (for testing)\n */\n size(): number {\n if (!this.prefix) {\n return this.store.size\n }\n let count = 0\n for (const key of this.store.keys()) {\n if (key.startsWith(`${this.prefix}:`)) {\n count++\n }\n }\n return count\n }\n\n /**\n * Get all keys (for testing)\n */\n keys(): string[] {\n const result: string[] = []\n const prefixToRemove = this.prefix ? `${this.prefix}:` : ''\n for (const key of this.store.keys()) {\n if (!this.prefix || key.startsWith(prefixToRemove)) {\n result.push(this.prefix ? key.slice(prefixToRemove.length) : key)\n }\n }\n return result\n }\n}\n\n/**\n * Create an in-memory storage adapter\n *\n * @param prefix - Optional prefix for keys\n * @returns StorageAdapter instance\n *\n * @example\n * ```ts\n * const storage = createMemoryAdapter()\n * await storage.set('notes', myNotes)\n * const notes = await storage.get('notes')\n * ```\n */\nexport function createMemoryAdapter(prefix: string = ''): StorageAdapter & {\n size(): number\n keys(): string[]\n} {\n return new MemoryAdapter(prefix)\n}\n\n/**\n * Default in-memory adapter instance (no prefix)\n */\nexport const memoryAdapter = createMemoryAdapter()\n","/**\n * Storage Adapters\n *\n * Pluggable storage backends for the indexer.\n *\n * @example\n * ```ts\n * import { createIndexedDBAdapter, createLocalStorageAdapter, createMemoryAdapter } from '@upp/sdk/indexer'\n *\n * // Production (recommended)\n * const storage = createIndexedDBAdapter('account_0x123')\n *\n * // Fallback for simpler environments\n * const storage = createLocalStorageAdapter('account_0x123')\n *\n * // Testing\n * const storage = createMemoryAdapter()\n * ```\n */\n\n// Types\nexport type { StorageAdapter, IndexerState, SyncState, SerializedNote } from './types.js'\n\n// IndexedDB adapter (default, recommended)\nexport { createIndexedDBAdapter, indexedDBAdapter } from './indexedDB.js'\n\n// localStorage adapter (fallback)\nexport { createLocalStorageAdapter, localStorageAdapter } from './localStorage.js'\n\n// In-memory adapter (testing)\nexport { createMemoryAdapter, memoryAdapter } from './memory.js'\n\n/**\n * Create the best available storage adapter\n *\n * Tries IndexedDB first, falls back to localStorage, then memory.\n *\n * @param prefix - Optional prefix for keys\n * @returns The best available StorageAdapter\n */\nexport function createAutoAdapter(prefix: string = ''): import('./types.js').StorageAdapter {\n // Try IndexedDB first\n if (typeof window !== 'undefined' && 'indexedDB' in window) {\n const { createIndexedDBAdapter } = require('./indexedDB.js')\n return createIndexedDBAdapter(prefix)\n }\n\n // Fall back to localStorage\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n const test = '__storage_test__'\n localStorage.setItem(test, test)\n localStorage.removeItem(test)\n const { createLocalStorageAdapter } = require('./localStorage.js')\n return createLocalStorageAdapter(prefix)\n } catch {\n // localStorage not available\n }\n }\n\n // Last resort: in-memory (data won't persist)\n const { createMemoryAdapter } = require('./memory.js')\n return createMemoryAdapter(prefix)\n}\n"]}