@dynlabs/react-native-immutable-file-cache 1.0.0-alpha.1 → 1.0.0-alpha.3

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 (74) hide show
  1. package/README.md +183 -261
  2. package/lib/commonjs/adapters/memoryAdapter.js +1 -0
  3. package/lib/commonjs/adapters/memoryAdapter.js.map +1 -1
  4. package/lib/commonjs/adapters/rnfsAdapter.js +9 -4
  5. package/lib/commonjs/adapters/rnfsAdapter.js.map +1 -1
  6. package/lib/commonjs/adapters/webAdapter.js +1 -0
  7. package/lib/commonjs/adapters/webAdapter.js.map +1 -1
  8. package/lib/commonjs/core/adapter.js +54 -0
  9. package/lib/commonjs/core/adapter.js.map +1 -1
  10. package/lib/commonjs/core/cacheEngine.js +452 -59
  11. package/lib/commonjs/core/cacheEngine.js.map +1 -1
  12. package/lib/commonjs/core/errors.js +9 -6
  13. package/lib/commonjs/core/errors.js.map +1 -1
  14. package/lib/commonjs/core/hash.js +3 -3
  15. package/lib/commonjs/core/hash.js.map +1 -1
  16. package/lib/commonjs/core/indexStore.js +85 -8
  17. package/lib/commonjs/core/indexStore.js.map +1 -1
  18. package/lib/commonjs/core/prune.js +42 -11
  19. package/lib/commonjs/core/prune.js.map +1 -1
  20. package/lib/commonjs/core/types.js +132 -0
  21. package/lib/commonjs/core/types.js.map +1 -1
  22. package/lib/commonjs/index.js +33 -0
  23. package/lib/commonjs/index.js.map +1 -1
  24. package/lib/module/adapters/memoryAdapter.js +1 -0
  25. package/lib/module/adapters/memoryAdapter.js.map +1 -1
  26. package/lib/module/adapters/rnfsAdapter.js +9 -4
  27. package/lib/module/adapters/rnfsAdapter.js.map +1 -1
  28. package/lib/module/adapters/webAdapter.js +1 -0
  29. package/lib/module/adapters/webAdapter.js.map +1 -1
  30. package/lib/module/core/adapter.js +48 -0
  31. package/lib/module/core/adapter.js.map +1 -1
  32. package/lib/module/core/cacheEngine.js +453 -60
  33. package/lib/module/core/cacheEngine.js.map +1 -1
  34. package/lib/module/core/errors.js +9 -6
  35. package/lib/module/core/errors.js.map +1 -1
  36. package/lib/module/core/hash.js +3 -3
  37. package/lib/module/core/hash.js.map +1 -1
  38. package/lib/module/core/indexStore.js +86 -8
  39. package/lib/module/core/indexStore.js.map +1 -1
  40. package/lib/module/core/prune.js +40 -11
  41. package/lib/module/core/prune.js.map +1 -1
  42. package/lib/module/core/types.js +130 -1
  43. package/lib/module/core/types.js.map +1 -1
  44. package/lib/module/index.js +4 -0
  45. package/lib/module/index.js.map +1 -1
  46. package/lib/typescript/src/adapters/memoryAdapter.d.ts.map +1 -1
  47. package/lib/typescript/src/adapters/rnfsAdapter.d.ts.map +1 -1
  48. package/lib/typescript/src/adapters/webAdapter.d.ts.map +1 -1
  49. package/lib/typescript/src/core/adapter.d.ts +16 -0
  50. package/lib/typescript/src/core/adapter.d.ts.map +1 -1
  51. package/lib/typescript/src/core/cacheEngine.d.ts +120 -1
  52. package/lib/typescript/src/core/cacheEngine.d.ts.map +1 -1
  53. package/lib/typescript/src/core/errors.d.ts +6 -5
  54. package/lib/typescript/src/core/errors.d.ts.map +1 -1
  55. package/lib/typescript/src/core/indexStore.d.ts +7 -0
  56. package/lib/typescript/src/core/indexStore.d.ts.map +1 -1
  57. package/lib/typescript/src/core/prune.d.ts +22 -8
  58. package/lib/typescript/src/core/prune.d.ts.map +1 -1
  59. package/lib/typescript/src/core/types.d.ts +153 -0
  60. package/lib/typescript/src/core/types.d.ts.map +1 -1
  61. package/lib/typescript/src/index.d.ts +5 -2
  62. package/lib/typescript/src/index.d.ts.map +1 -1
  63. package/package.json +1 -1
  64. package/src/adapters/memoryAdapter.ts +3 -0
  65. package/src/adapters/rnfsAdapter.ts +11 -4
  66. package/src/adapters/webAdapter.ts +1 -0
  67. package/src/core/adapter.ts +28 -0
  68. package/src/core/cacheEngine.ts +476 -62
  69. package/src/core/errors.ts +8 -6
  70. package/src/core/hash.ts +3 -3
  71. package/src/core/indexStore.ts +99 -11
  72. package/src/core/prune.ts +44 -14
  73. package/src/core/types.ts +194 -0
  74. package/src/index.ts +22 -0
@@ -1 +1 @@
1
- {"version":3,"file":"memoryAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/memoryAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,iBAAiB,CAAC;AASzB;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,2CAA2C;IAC3C,MAAM,IAAI,IAAI,CAAC;IACf,oDAAoD;IACpD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAClD,0CAA0C;IAC1C,YAAY,IAAI,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CA0QtE"}
1
+ {"version":3,"file":"memoryAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/memoryAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,iBAAiB,CAAC;AASzB;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,2CAA2C;IAC3C,MAAM,IAAI,IAAI,CAAC;IACf,oDAAoD;IACpD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAClD,0CAA0C;IAC1C,YAAY,IAAI,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CA6QtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"rnfsAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/rnfsAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,eAAe,CA2OhF"}
1
+ {"version":3,"file":"rnfsAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/rnfsAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,eAAe,CA4OhF"}
@@ -1 +1 @@
1
- {"version":3,"file":"webAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/webAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB;IACjB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAUD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,eAAe,CA+a9E;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,eAAe;IAC7D,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qCAAqC;IACrC,aAAa,IAAI,IAAI,CAAC;CACvB"}
1
+ {"version":3,"file":"webAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/webAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB;IACjB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAUD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,eAAe,CAgb9E;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,eAAe;IAC7D,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qCAAqC;IACrC,aAAa,IAAI,IAAI,CAAC;CACvB"}
@@ -3,6 +3,10 @@
3
3
  * All paths are relative to the adapter's root.
4
4
  */
5
5
  export type TAdapterPath = string;
6
+ /**
7
+ * Binary source type identifier.
8
+ */
9
+ export type TBinarySourceType = TBinarySource["type"];
6
10
  /**
7
11
  * Discriminated union for binary content sources.
8
12
  * Adapters support the subset they can handle; throw UnsupportedSourceError otherwise.
@@ -56,6 +60,13 @@ export interface IStorageAdapter {
56
60
  readonly kind: string;
57
61
  /** A stable root identifier (e.g., absolute cache root on native, cache name on web). */
58
62
  readonly rootId: string;
63
+ /**
64
+ * Set of binary source types this adapter supports.
65
+ * Used for capability checking before attempting operations.
66
+ * If not provided, all source types are assumed to be potentially supported
67
+ * (with UnsupportedSourceError thrown at runtime for unsupported types).
68
+ */
69
+ readonly supportedSources?: ReadonlySet<TBinarySourceType>;
59
70
  /**
60
71
  * Ensures a directory exists at the given path, creating it recursively if needed.
61
72
  */
@@ -102,4 +113,9 @@ export interface IStorageAdapter {
102
113
  */
103
114
  getPublicUri(path: TAdapterPath): Promise<string>;
104
115
  }
116
+ /**
117
+ * Checks if an adapter supports a given binary source type.
118
+ * Returns true if the adapter declares support or if no capability declaration exists.
119
+ */
120
+ export declare function adapterSupportsSource(adapter: IStorageAdapter, sourceType: TBinarySourceType): boolean;
105
121
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/core/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAMxB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IAMlE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhE;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtF;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7C;;;;OAIG;IACH,iBAAiB,CACf,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE/B;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnD"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/core/adapter.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { IStorageAdapter } from "./adapter";
2
- import type { ICacheConfig, ICacheEntry, IPutOptions, IPutResult, IGetResult, IListOptions, IPruneResult, ICacheStats } from "./types";
2
+ import type { ICacheConfig, ICacheEntry, IPutOptions, IPutResult, IGetResult, IGetOrPutResult, TFetcher, IListOptions, IPruneResult, ICacheStats } from "./types";
3
3
  /**
4
4
  * Main cache engine implementation.
5
5
  * Coordinates all cache operations through the storage adapter.
@@ -11,9 +11,58 @@ export declare class CacheEngine {
11
11
  private readonly _indexMutex;
12
12
  private readonly _keyMutex;
13
13
  private readonly _hashFn;
14
+ private readonly _now;
15
+ private readonly _debounceMs;
14
16
  private _index;
15
17
  private _initialized;
18
+ private _indexDirty;
19
+ private _debounceTimer;
16
20
  constructor(config: ICacheConfig, adapter: IStorageAdapter);
21
+ /**
22
+ * Returns whether the cache has been initialized.
23
+ * Use this to check initialization state without throwing.
24
+ */
25
+ get isInitialized(): boolean;
26
+ /**
27
+ * Returns the configured namespace.
28
+ */
29
+ get namespace(): string;
30
+ /**
31
+ * Returns the storage adapter.
32
+ */
33
+ get adapter(): IStorageAdapter;
34
+ /**
35
+ * Returns whether there are pending index writes.
36
+ * Useful for checking if flush() should be called before shutdown.
37
+ */
38
+ get hasPendingWrites(): boolean;
39
+ /**
40
+ * Schedules an index save, respecting debounce configuration.
41
+ * If debounceMs is 0, saves immediately.
42
+ */
43
+ private _scheduleIndexSave;
44
+ /**
45
+ * Internal flush implementation.
46
+ */
47
+ private _flushIndex;
48
+ /**
49
+ * Flushes any pending index writes immediately.
50
+ * Call this before app shutdown or when you need to ensure persistence.
51
+ */
52
+ flush(): Promise<void>;
53
+ /**
54
+ * Destroys the cache engine, releasing resources.
55
+ * - Flushes any pending index writes
56
+ * - Clears debounce timers
57
+ * - Marks engine as uninitialized
58
+ *
59
+ * After calling destroy(), the engine cannot be used until init() is called again.
60
+ */
61
+ destroy(): Promise<void>;
62
+ /**
63
+ * Emits an event to the configured event handler (if any).
64
+ */
65
+ private _emit;
17
66
  /**
18
67
  * Initialize cache (ensure directories, load index).
19
68
  */
@@ -52,6 +101,67 @@ export declare class CacheEngine {
52
101
  * Get entry metadata without updating lastAccessedAt.
53
102
  */
54
103
  peek(key: string): Promise<ICacheEntry | null>;
104
+ /**
105
+ * Get the public URI for a cached entry without updating lastAccessedAt.
106
+ * Useful for scenarios where you need the URI but don't want to affect LRU ordering.
107
+ * Returns null if entry doesn't exist or is expired.
108
+ */
109
+ getUri(key: string): Promise<string | null>;
110
+ /**
111
+ * Manually update the lastAccessedAt timestamp for an entry.
112
+ * Useful for refreshing LRU ordering without reading the entry.
113
+ * Returns true if entry was touched, false if not found or expired.
114
+ */
115
+ touch(key: string): Promise<boolean>;
116
+ /**
117
+ * Set the TTL for an existing entry.
118
+ * @param key - The cache key
119
+ * @param ttlMs - TTL in milliseconds from now. Use undefined to remove expiration.
120
+ * @returns true if entry was updated, false if not found or already expired
121
+ */
122
+ setTtl(key: string, ttlMs: number | undefined): Promise<boolean>;
123
+ /**
124
+ * Extend the TTL of an existing entry by an additional duration.
125
+ * If the entry has no expiration, this is a no-op (returns true).
126
+ * @param key - The cache key
127
+ * @param additionalMs - Additional milliseconds to add to current expiration
128
+ * @returns true if entry was updated, false if not found or already expired
129
+ */
130
+ extendTtl(key: string, additionalMs: number): Promise<boolean>;
131
+ /**
132
+ * Read-through cache helper: get from cache or fetch and store.
133
+ *
134
+ * This implements the common pattern:
135
+ * 1. Try to get from cache
136
+ * 2. If not found/expired, call fetcher to get data
137
+ * 3. Store the fetched data in cache
138
+ * 4. Return the entry
139
+ *
140
+ * @param key - The cache key
141
+ * @param fetcher - Async function that returns bytes to cache if key doesn't exist
142
+ * @returns The cached entry with URI and whether it was fetched
143
+ *
144
+ * @example
145
+ * ```typescript
146
+ * const result = await cache.getOrPut("user:123:avatar", async (key) => {
147
+ * const response = await fetch(`https://api.example.com/avatar/${key}`);
148
+ * const bytes = new Uint8Array(await response.arrayBuffer());
149
+ * return { bytes, ext: ".png", ttlMs: 86400000 };
150
+ * });
151
+ * console.log(result.uri, result.fetched);
152
+ * ```
153
+ */
154
+ getOrPut(key: string, fetcher: TFetcher): Promise<IGetOrPutResult>;
155
+ /**
156
+ * Get all valid (non-expired) cache keys.
157
+ * More efficient than list() when you only need keys.
158
+ */
159
+ keys(): Promise<ReadonlyArray<string>>;
160
+ /**
161
+ * Get the count of valid (non-expired) entries.
162
+ * More efficient than list().length when you only need the count.
163
+ */
164
+ count(): Promise<number>;
55
165
  /**
56
166
  * List entries with sorting, filtering, pagination.
57
167
  */
@@ -91,8 +201,17 @@ export declare class CacheEngine {
91
201
  repaired: boolean;
92
202
  issues: string[];
93
203
  }>;
204
+ /**
205
+ * Throws if the engine has not been initialized.
206
+ */
94
207
  private _ensureInitialized;
208
+ /**
209
+ * Constructs a full cache entry with path from metadata.
210
+ */
95
211
  private _entryWithPath;
212
+ /**
213
+ * Extracts file extension from binary source if possible.
214
+ */
96
215
  private _extractExtension;
97
216
  private _autoPrune;
98
217
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cacheEngine.d.ts","sourceRoot":"","sources":["../../../../src/core/cacheEngine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,WAAW,CAAC;AAChE,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAEX,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EAEZ,MAAM,SAAS,CAAC;AAgBjB;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CACT;IACf,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8C;IAEtE,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe;IAW1D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB3B;;;OAGG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAStF;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAQ5F;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAQtF;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAQ9F;;OAEG;YACW,IAAI;IA+ElB;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA2BlD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBxC;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqBpD;;OAEG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IA6CvE;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC;IA0CnC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ3C;;OAEG;YACW,YAAY;IAoB1B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC;IAiB5C;;OAEG;IACG,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAgB3D;;OAEG;YACW,cAAc;IA8B5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAiD3E,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,iBAAiB;YA6CX,UAAU;CASzB"}
1
+ {"version":3,"file":"cacheEngine.d.ts","sourceRoot":"","sources":["../../../../src/core/cacheEngine.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,13 @@
1
1
  import type { TBinarySource } from "./adapter";
2
2
  /**
3
3
  * Base error class for cache operations.
4
+ * Supports ES2022 Error.cause for proper error chaining.
4
5
  */
5
6
  export declare abstract class CacheError extends Error {
6
7
  abstract readonly code: string;
7
- constructor(message: string);
8
+ constructor(message: string, options?: {
9
+ cause?: Error;
10
+ });
8
11
  }
9
12
  /**
10
13
  * Thrown when an adapter receives a TBinarySource type it cannot handle.
@@ -21,18 +24,16 @@ export declare class UnsupportedSourceError extends CacheError {
21
24
  export declare class AdapterIOError extends CacheError {
22
25
  readonly operation: string;
23
26
  readonly path: string;
24
- readonly cause?: Error | undefined;
25
27
  readonly code: "ADAPTER_IO_ERROR";
26
- constructor(operation: string, path: string, cause?: Error | undefined);
28
+ constructor(operation: string, path: string, cause?: Error);
27
29
  }
28
30
  /**
29
31
  * Thrown when the cache index is corrupt and cannot be parsed.
30
32
  */
31
33
  export declare class CorruptIndexError extends CacheError {
32
34
  readonly reason: string;
33
- readonly cause?: Error | undefined;
34
35
  readonly code: "CORRUPT_INDEX";
35
- constructor(reason: string, cause?: Error | undefined);
36
+ constructor(reason: string, cause?: Error);
36
37
  }
37
38
  /**
38
39
  * Internal error when attempting to overwrite an immutable entry.
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;GAEG;AACH,8BAAsB,UAAW,SAAQ,KAAK;IAC5C,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEnB,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,UAAU;aAIlC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC;aACjC,WAAW,EAAE,MAAM;IAJrC,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAU;gBAG5B,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,EACjC,WAAW,EAAE,MAAM;CAItC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,UAAU;aAI1B,SAAS,EAAE,MAAM;aACjB,IAAI,EAAE,MAAM;aACZ,KAAK,CAAC,EAAE,KAAK;IAL/B,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAU;gBAG1B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,KAAK,YAAA;CAMhC;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;aAI7B,MAAM,EAAE,MAAM;aACd,KAAK,CAAC,EAAE,KAAK;IAJ/B,QAAQ,CAAC,IAAI,EAAG,eAAe,CAAU;gBAGvB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,KAAK,YAAA;CAIhC;AAED;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,UAAU;aAGxB,GAAG,EAAE,MAAM;IAFvC,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAU;gBAElB,GAAG,EAAE,MAAM;CAGxC;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,UAAU;aAGpB,GAAG,EAAE,MAAM;IAFvC,QAAQ,CAAC,IAAI,EAAG,iBAAiB,CAAU;gBAEf,GAAG,EAAE,MAAM;CAGxC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;GAGG;AACH,8BAAsB,UAAW,SAAQ,KAAK;IAC5C,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEnB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAKzD;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,UAAU;aAIlC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC;aACjC,WAAW,EAAE,MAAM;IAJrC,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAU;gBAG5B,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,EACjC,WAAW,EAAE,MAAM;CAItC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,UAAU;aAI1B,SAAS,EAAE,MAAM;aACjB,IAAI,EAAE,MAAM;IAJ9B,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAU;gBAG1B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EAC5B,KAAK,CAAC,EAAE,KAAK;CAOhB;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;aAI7B,MAAM,EAAE,MAAM;IAHhC,QAAQ,CAAC,IAAI,EAAG,eAAe,CAAU;gBAGvB,MAAM,EAAE,MAAM,EAC9B,KAAK,CAAC,EAAE,KAAK;CAIhB;AAED;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,UAAU;aAGxB,GAAG,EAAE,MAAM;IAFvC,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAU;gBAElB,GAAG,EAAE,MAAM;CAGxC;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,UAAU;aAGpB,GAAG,EAAE,MAAM;IAFvC,QAAQ,CAAC,IAAI,EAAG,iBAAiB,CAAU;gBAEf,GAAG,EAAE,MAAM;CAGxC"}
@@ -22,6 +22,13 @@ export declare class IndexStore {
22
22
  * Scans the entries directory and reconstructs metadata.
23
23
  */
24
24
  rebuild(entriesDir: TAdapterPath): Promise<ICacheIndex>;
25
+ /**
26
+ * Applies migrations to upgrade an index from an older version to current.
27
+ * @param parsed - The parsed index object (may be any version)
28
+ * @returns The migrated index at current version
29
+ * @throws CorruptIndexError if version is unsupported or migration fails
30
+ */
31
+ private _migrateIndex;
25
32
  /**
26
33
  * Validates that the parsed object is a valid ICacheIndex.
27
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"indexStore.d.ts","sourceRoot":"","sources":["../../../../src/core/indexStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,SAAS,CAAC;AAM5D;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;gBAE9B,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY;IAK7D;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IA0BlC;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C;;;OAGG;IACG,OAAO,CAAC,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAqD7D;;OAEG;IACH,OAAO,CAAC,cAAc;IAyCtB;;OAEG;IACH,OAAO,CAAC,cAAc;CAqBvB"}
1
+ {"version":3,"file":"indexStore.d.ts","sourceRoot":"","sources":["../../../../src/core/indexStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,SAAS,CAAC;AAyC5D;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;gBAE9B,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY;IAK7D;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IA0BlC;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C;;;OAGG;IACG,OAAO,CAAC,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAqD7D;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,OAAO,CAAC,cAAc;IA8CtB;;OAEG;IACH,OAAO,CAAC,cAAc;CAqBvB"}
@@ -1,11 +1,18 @@
1
1
  import type { ICacheIndex, ICacheEntryMeta } from "./types";
2
2
  /**
3
- * Options for pruning operations.
3
+ * Checks if a cache entry has expired.
4
+ * @param entry - The cache entry to check
5
+ * @param now - Current timestamp in milliseconds (defaults to Date.now())
6
+ * @returns true if the entry has expired, false otherwise
4
7
  */
5
- export interface IPruneOptions {
6
- readonly maxSizeBytes?: number;
7
- readonly now?: number;
8
- }
8
+ export declare function isEntryExpired(entry: ICacheEntryMeta, now?: number): boolean;
9
+ /**
10
+ * Checks if a cache entry is valid (not expired).
11
+ * @param entry - The cache entry to check
12
+ * @param now - Current timestamp in milliseconds (defaults to Date.now())
13
+ * @returns true if the entry is valid, false if expired
14
+ */
15
+ export declare function isEntryValid(entry: ICacheEntryMeta, now?: number): boolean;
9
16
  /**
10
17
  * Identifies entries to remove based on TTL expiration.
11
18
  * Returns entries that have expired (expiresAt < now).
@@ -20,13 +27,19 @@ export declare function getLruPruneTargets(index: ICacheIndex, maxSizeBytes: num
20
27
  /**
21
28
  * Creates a new index with the specified entries removed.
22
29
  * Returns a new ICacheIndex without mutating the original.
30
+ * @param index - The source index
31
+ * @param keysToRemove - Keys to remove from the index
32
+ * @param now - Optional timestamp for lastModifiedAt (defaults to Date.now())
23
33
  */
24
- export declare function removeEntriesFromIndex(index: ICacheIndex, keysToRemove: ReadonlyArray<string>): ICacheIndex;
34
+ export declare function removeEntriesFromIndex(index: ICacheIndex, keysToRemove: ReadonlyArray<string>, now?: number): ICacheIndex;
25
35
  /**
26
36
  * Adds or updates an entry in the index.
27
37
  * Returns a new ICacheIndex without mutating the original.
38
+ * @param index - The source index
39
+ * @param entry - The entry to add or update
40
+ * @param now - Optional timestamp for lastModifiedAt (defaults to Date.now())
28
41
  */
29
- export declare function addEntryToIndex(index: ICacheIndex, entry: ICacheEntryMeta): ICacheIndex;
42
+ export declare function addEntryToIndex(index: ICacheIndex, entry: ICacheEntryMeta, now?: number): ICacheIndex;
30
43
  /**
31
44
  * Updates the lastAccessedAt timestamp for an entry.
32
45
  * Returns a new ICacheIndex without mutating the original.
@@ -34,6 +47,7 @@ export declare function addEntryToIndex(index: ICacheIndex, entry: ICacheEntryMe
34
47
  export declare function touchEntry(index: ICacheIndex, key: string, accessedAt?: number): ICacheIndex;
35
48
  /**
36
49
  * Creates an empty cache index.
50
+ * @param now - Optional timestamp for lastModifiedAt (defaults to Date.now())
37
51
  */
38
- export declare function createEmptyIndex(): ICacheIndex;
52
+ export declare function createEmptyIndex(now?: number): ICacheIndex;
39
53
  //# sourceMappingURL=prune.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../../../src/core/prune.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,GAAG,GAAE,MAAmB,GACvB,aAAa,CAAC,eAAe,CAAC,CAUhC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,MAAM,GACnB,aAAa,CAAC,eAAe,CAAC,CAsBhC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,GAClC,WAAW,CAkBb;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,GAAG,WAAW,CAavF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,MAAmB,GAC9B,WAAW,CAiBb;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CAO9C"}
1
+ {"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../../../src/core/prune.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ5D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAExF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAEtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,GAAG,GAAE,MAAmB,GACvB,aAAa,CAAC,eAAe,CAAC,CAUhC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,MAAM,GACnB,aAAa,CAAC,eAAe,CAAC,CAsBhC;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,EACnC,GAAG,GAAE,MAAmB,GACvB,WAAW,CAkBb;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,eAAe,EACtB,GAAG,GAAE,MAAmB,GACvB,WAAW,CAab;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,MAAmB,GAC9B,WAAW,CAiBb;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAmB,GAAG,WAAW,CAOtE"}
@@ -1,4 +1,106 @@
1
1
  import type { IStorageAdapter, TAdapterPath } from "./adapter";
2
+ /**
3
+ * Represents a successful result.
4
+ */
5
+ export interface IOk<T> {
6
+ readonly ok: true;
7
+ readonly value: T;
8
+ }
9
+ /**
10
+ * Represents a failure result.
11
+ */
12
+ export interface IErr<E> {
13
+ readonly ok: false;
14
+ readonly error: E;
15
+ }
16
+ /**
17
+ * Discriminated union for operation results.
18
+ * Enables explicit error handling without exceptions.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * function divide(a: number, b: number): TResult<number, string> {
23
+ * if (b === 0) return { ok: false, error: "Division by zero" };
24
+ * return { ok: true, value: a / b };
25
+ * }
26
+ *
27
+ * const result = divide(10, 2);
28
+ * if (result.ok) {
29
+ * console.log(result.value); // 5
30
+ * } else {
31
+ * console.error(result.error);
32
+ * }
33
+ * ```
34
+ */
35
+ export type TResult<T, E = Error> = IOk<T> | IErr<E>;
36
+ /**
37
+ * Helper to create a success result.
38
+ */
39
+ export declare function ok<T>(value: T): IOk<T>;
40
+ /**
41
+ * Helper to create a failure result.
42
+ */
43
+ export declare function err<E>(error: E): IErr<E>;
44
+ /**
45
+ * Event emitted when a cache hit occurs.
46
+ */
47
+ export interface ICacheHitEvent {
48
+ readonly type: "cache_hit";
49
+ readonly key: string;
50
+ readonly sizeBytes: number;
51
+ readonly ageMs: number;
52
+ }
53
+ /**
54
+ * Event emitted when a cache miss occurs.
55
+ */
56
+ export interface ICacheMissEvent {
57
+ readonly type: "cache_miss";
58
+ readonly key: string;
59
+ readonly reason: "not_found" | "expired";
60
+ }
61
+ /**
62
+ * Event emitted when an entry is created.
63
+ */
64
+ export interface ICacheWriteEvent {
65
+ readonly type: "cache_write";
66
+ readonly key: string;
67
+ readonly sizeBytes: number;
68
+ readonly source: "url" | "file" | "blob" | "bytes";
69
+ readonly durationMs: number;
70
+ }
71
+ /**
72
+ * Event emitted when an entry is removed.
73
+ */
74
+ export interface ICacheRemoveEvent {
75
+ readonly type: "cache_remove";
76
+ readonly key: string;
77
+ readonly reason: "explicit" | "expired" | "lru";
78
+ }
79
+ /**
80
+ * Event emitted during pruning operations.
81
+ */
82
+ export interface ICachePruneEvent {
83
+ readonly type: "cache_prune";
84
+ readonly reason: "expired" | "lru";
85
+ readonly removedCount: number;
86
+ readonly freedBytes: number;
87
+ }
88
+ /**
89
+ * Event emitted on errors (non-fatal).
90
+ */
91
+ export interface ICacheErrorEvent {
92
+ readonly type: "cache_error";
93
+ readonly operation: string;
94
+ readonly error: Error;
95
+ }
96
+ /**
97
+ * Union of all cache events.
98
+ */
99
+ export type TCacheEvent = ICacheHitEvent | ICacheMissEvent | ICacheWriteEvent | ICacheRemoveEvent | ICachePruneEvent | ICacheErrorEvent;
100
+ /**
101
+ * Callback for receiving cache events.
102
+ */
103
+ export type TCacheEventHandler = (event: TCacheEvent) => void;
2
104
  export interface ICacheConfig {
3
105
  /**
4
106
  * Namespace for cache isolation. Creates separate storage area.
@@ -29,6 +131,26 @@ export interface ICacheConfig {
29
131
  * @default SHA-256 hex
30
132
  */
31
133
  readonly hashFn?: (input: string) => string | Promise<string>;
134
+ /**
135
+ * Event handler for observability/instrumentation.
136
+ * Called on cache hits, misses, writes, removes, and errors.
137
+ * @default undefined (no events emitted)
138
+ */
139
+ readonly onEvent?: TCacheEventHandler;
140
+ /**
141
+ * Custom time source function for testing.
142
+ * Returns current time in milliseconds since epoch.
143
+ * @default Date.now
144
+ */
145
+ readonly now?: () => number;
146
+ /**
147
+ * Debounce time for index writes in milliseconds.
148
+ * When > 0, index writes are batched and written after this delay.
149
+ * Use 0 for immediate writes (default behavior).
150
+ * Call flush() to force immediate persistence when using debounce.
151
+ * @default 0 (immediate writes)
152
+ */
153
+ readonly indexWriteDebounceMs?: number;
32
154
  }
33
155
  export interface ICacheEntryMeta {
34
156
  /** User-provided unique key. */
@@ -106,4 +228,35 @@ export interface ICacheStats {
106
228
  readonly oldestEntry?: ICacheEntryMeta;
107
229
  readonly newestEntry?: ICacheEntryMeta;
108
230
  }
231
+ /**
232
+ * Fetcher result for getOrPut operations.
233
+ * Provides the data to cache along with optional configuration.
234
+ */
235
+ export interface IFetcherResult {
236
+ /** The data to cache, as Uint8Array bytes. */
237
+ readonly bytes: Uint8Array;
238
+ /** Optional TTL override for this entry. */
239
+ readonly ttlMs?: number;
240
+ /** Optional file extension (e.g., ".json"). */
241
+ readonly ext?: string;
242
+ /** Optional user metadata. */
243
+ readonly metadata?: Readonly<Record<string, unknown>>;
244
+ }
245
+ /**
246
+ * Fetcher function type for getOrPut.
247
+ * Called when the key doesn't exist in cache.
248
+ * Should return the data to be cached, or throw to skip caching.
249
+ */
250
+ export type TFetcher = (key: string) => Promise<IFetcherResult>;
251
+ /**
252
+ * Result of a getOrPut operation.
253
+ */
254
+ export interface IGetOrPutResult {
255
+ /** The cached entry. */
256
+ readonly entry: ICacheEntry;
257
+ /** The public URI for accessing the entry. */
258
+ readonly uri: string;
259
+ /** Whether the entry was fetched (true) or already cached (false). */
260
+ readonly fetched: boolean;
261
+ }
109
262
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,10 @@
3
3
  *
4
4
  * Cross-platform immutable file cache with pluggable storage adapters.
5
5
  */
6
- export type { IStorageAdapter, TAdapterPath, TBinarySource, IBinaryWriteResult, IBinaryWriteOptions, IFileStat, TProgressCallback, } from "./core/adapter";
7
- export type { ICacheConfig, ICacheEntry, ICacheEntryMeta, ICacheIndex, IPutOptions, IPutResult, IGetResult, IListOptions, IPruneResult, ICacheStats, TPutStatus, TSortField, TSortOrder, } from "./core/types";
6
+ export type { IStorageAdapter, TAdapterPath, TBinarySource, TBinarySourceType, IBinaryWriteResult, IBinaryWriteOptions, IFileStat, TProgressCallback, } from "./core/adapter";
7
+ export { adapterSupportsSource } from "./core/adapter";
8
+ export type { ICacheConfig, ICacheEntry, ICacheEntryMeta, ICacheIndex, IPutOptions, IPutResult, IGetResult, IGetOrPutResult, TFetcher, IFetcherResult, IListOptions, IPruneResult, ICacheStats, TPutStatus, TSortField, TSortOrder, TResult, IOk, IErr, TCacheEvent, TCacheEventHandler, ICacheHitEvent, ICacheMissEvent, ICacheWriteEvent, ICacheRemoveEvent, ICachePruneEvent, ICacheErrorEvent, } from "./core/types";
9
+ export { ok, err } from "./core/types";
8
10
  export { CacheError, UnsupportedSourceError, AdapterIOError, CorruptIndexError, ImmutableConflictError, EntryNotFoundError, } from "./core/errors";
9
11
  export { CacheEngine } from "./core/cacheEngine";
10
12
  export { createImmutableFileCache, createCacheEngineSync } from "./factory";
@@ -17,4 +19,5 @@ export { createMemoryAdapter } from "./adapters/memoryAdapter";
17
19
  export type { IMemoryAdapter } from "./adapters/memoryAdapter";
18
20
  export { hash, hashSync } from "./core/hash";
19
21
  export { Mutex, KeyedMutex } from "./core/mutex";
22
+ export { isEntryExpired, isEntryValid } from "./core/prune";
20
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,YAAY,EACV,eAAe,EACf,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EACT,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EACf,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,cAAc,CAAC;AAMtB,OAAO,EACL,UAAU,EACV,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMjD,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE5E,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAMrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAExF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAM/D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,YAAY,EACV,eAAe,EACf,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EACT,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,YAAY,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EACf,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,eAAe,EACf,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EAEV,OAAO,EACP,GAAG,EACH,IAAI,EAEJ,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAMvC,OAAO,EACL,UAAU,EACV,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMjD,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE5E,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAMrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAExF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAM/D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynlabs/react-native-immutable-file-cache",
3
- "version": "1.0.0-alpha.1",
3
+ "version": "1.0.0-alpha.3",
4
4
  "description": "Cross-platform immutable file cache with pluggable storage adapters for React Native and Web",
5
5
  "author": "dienp",
6
6
  "license": "MIT",
@@ -67,6 +67,9 @@ export function createMemoryAdapter(namespace?: string): IMemoryAdapter {
67
67
  const adapter: IMemoryAdapter = {
68
68
  kind: "memory",
69
69
  rootId,
70
+ supportedSources: new Set(["url", "file", "blob", "bytes"]) as ReadonlySet<
71
+ TBinarySource["type"]
72
+ >,
70
73
 
71
74
  // ─────────────────────────────────────────────────────────────────
72
75
  // Directory Management
@@ -56,6 +56,7 @@ export function createRnfsAdapter(options?: IRnfsAdapterOptions): IStorageAdapte
56
56
  const adapter: IStorageAdapter = {
57
57
  kind: "native-fs",
58
58
  rootId: rootPath,
59
+ supportedSources: new Set(["url", "file", "bytes"]) as ReadonlySet<TBinarySource["type"]>,
59
60
 
60
61
  // ─────────────────────────────────────────────────────────────────
61
62
  // Directory Management
@@ -273,11 +274,17 @@ export function createRnfsAdapter(options?: IRnfsAdapterOptions): IStorageAdapte
273
274
 
274
275
  /**
275
276
  * Converts Uint8Array to base64 string.
277
+ * Uses chunked approach for better performance with large arrays.
276
278
  */
277
279
  function uint8ArrayToBase64(bytes: Uint8Array): string {
278
- let binary = "";
279
- for (let i = 0; i < bytes.length; i++) {
280
- binary += String.fromCharCode(bytes[i]);
280
+ // Process in chunks to avoid call stack issues with large arrays
281
+ const CHUNK_SIZE = 0x8000; // 32KB chunks
282
+ const chunks: string[] = [];
283
+
284
+ for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {
285
+ const chunk = bytes.subarray(i, i + CHUNK_SIZE);
286
+ chunks.push(String.fromCharCode.apply(null, chunk as unknown as number[]));
281
287
  }
282
- return btoa(binary);
288
+
289
+ return btoa(chunks.join(""));
283
290
  }
@@ -180,6 +180,7 @@ export function createWebAdapter(options?: IWebAdapterOptions): IStorageAdapter
180
180
  const adapter: IStorageAdapter = {
181
181
  kind: "web",
182
182
  rootId,
183
+ supportedSources: new Set(["url", "blob", "bytes"]) as ReadonlySet<TBinarySource["type"]>,
183
184
 
184
185
  // ─────────────────────────────────────────────────────────────────
185
186
  // Directory Management