react-native-nitro-storage 0.5.4 → 0.5.5

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 (35) hide show
  1. package/README.md +45 -5
  2. package/android/build.gradle +5 -5
  3. package/android/src/main/java/com/nitrostorage/AndroidStorageAdapter.kt +12 -25
  4. package/app.plugin.js +114 -9
  5. package/docs/api-reference.md +39 -36
  6. package/docs/batch-transactions-migrations.md +1 -1
  7. package/docs/recipes.md +1 -1
  8. package/docs/secure-storage.md +15 -4
  9. package/docs/web-backends.md +5 -0
  10. package/lib/commonjs/index.js +49 -9
  11. package/lib/commonjs/index.js.map +1 -1
  12. package/lib/commonjs/index.web.js +71 -11
  13. package/lib/commonjs/index.web.js.map +1 -1
  14. package/lib/commonjs/indexeddb-backend.js +28 -0
  15. package/lib/commonjs/indexeddb-backend.js.map +1 -1
  16. package/lib/commonjs/web-storage-backend.js.map +1 -1
  17. package/lib/module/index.js +49 -9
  18. package/lib/module/index.js.map +1 -1
  19. package/lib/module/index.web.js +71 -11
  20. package/lib/module/index.web.js.map +1 -1
  21. package/lib/module/indexeddb-backend.js +28 -0
  22. package/lib/module/indexeddb-backend.js.map +1 -1
  23. package/lib/module/web-storage-backend.js.map +1 -1
  24. package/lib/typescript/index.d.ts +10 -3
  25. package/lib/typescript/index.d.ts.map +1 -1
  26. package/lib/typescript/index.web.d.ts +10 -3
  27. package/lib/typescript/index.web.d.ts.map +1 -1
  28. package/lib/typescript/indexeddb-backend.d.ts.map +1 -1
  29. package/lib/typescript/web-storage-backend.d.ts +1 -0
  30. package/lib/typescript/web-storage-backend.d.ts.map +1 -1
  31. package/package.json +3 -3
  32. package/src/index.ts +80 -9
  33. package/src/index.web.ts +107 -11
  34. package/src/indexeddb-backend.ts +30 -0
  35. package/src/web-storage-backend.ts +1 -0
@@ -74,6 +74,7 @@ export async function createIndexedDBBackend(
74
74
  const pendingWrites = new Set<Promise<void>>();
75
75
  const pendingErrors: Error[] = [];
76
76
  const subscribers = new Set<(event: WebStorageChangeEvent) => void>();
77
+ let closed = false;
77
78
  const sourceId = `nitro-storage-${Math.random().toString(36).slice(2)}`;
78
79
  const channelName =
79
80
  options.channelName ?? `nitro-storage:${dbName}:${storeName}`;
@@ -82,6 +83,12 @@ export async function createIndexedDBBackend(
82
83
  ? new BroadcastChannel(channelName)
83
84
  : null;
84
85
 
86
+ function assertOpen(): void {
87
+ if (closed) {
88
+ throw new Error(`IndexedDB backend "${dbName}/${storeName}" is closed.`);
89
+ }
90
+ }
91
+
85
92
  function emitExternal(event: WebStorageChangeEvent): void {
86
93
  subscribers.forEach((subscriber) => {
87
94
  subscriber(event);
@@ -98,6 +105,10 @@ export async function createIndexedDBBackend(
98
105
  }
99
106
 
100
107
  channel?.addEventListener("message", (event: MessageEvent) => {
108
+ if (closed) {
109
+ return;
110
+ }
111
+
101
112
  const data = event.data as
102
113
  | (WebStorageChangeEvent & { sourceId?: string })
103
114
  | undefined;
@@ -209,34 +220,41 @@ export async function createIndexedDBBackend(
209
220
  const backend: WebSecureStorageBackend = {
210
221
  name: `indexeddb:${dbName}/${storeName}`,
211
222
  getItem(key: string): string | null {
223
+ assertOpen();
212
224
  return cache.get(key) ?? null;
213
225
  },
214
226
 
215
227
  setItem(key: string, value: string): void {
228
+ assertOpen();
216
229
  cache.set(key, value);
217
230
  persistSet(key, value);
218
231
  publish({ key, newValue: value });
219
232
  },
220
233
 
221
234
  removeItem(key: string): void {
235
+ assertOpen();
222
236
  cache.delete(key);
223
237
  persistDelete(key);
224
238
  publish({ key, newValue: null });
225
239
  },
226
240
 
227
241
  clear(): void {
242
+ assertOpen();
228
243
  cache.clear();
229
244
  persistClear();
230
245
  publish({ key: null, newValue: null });
231
246
  },
232
247
 
233
248
  getAllKeys(): string[] {
249
+ assertOpen();
234
250
  return Array.from(cache.keys());
235
251
  },
236
252
  getMany(keys: string[]): (string | null)[] {
253
+ assertOpen();
237
254
  return keys.map((key) => cache.get(key) ?? null);
238
255
  },
239
256
  setMany(entries): void {
257
+ assertOpen();
240
258
  entries.forEach(([key, value]) => {
241
259
  cache.set(key, value);
242
260
  });
@@ -253,6 +271,7 @@ export async function createIndexedDBBackend(
253
271
  }
254
272
  },
255
273
  removeMany(keys: string[]): void {
274
+ assertOpen();
256
275
  keys.forEach((key) => {
257
276
  cache.delete(key);
258
277
  });
@@ -269,9 +288,11 @@ export async function createIndexedDBBackend(
269
288
  }
270
289
  },
271
290
  size(): number {
291
+ assertOpen();
272
292
  return cache.size;
273
293
  },
274
294
  subscribe(listener): () => void {
295
+ assertOpen();
275
296
  subscribers.add(listener);
276
297
  return () => {
277
298
  subscribers.delete(listener);
@@ -286,6 +307,15 @@ export async function createIndexedDBBackend(
286
307
  const [error] = pendingErrors.splice(0);
287
308
  throw error;
288
309
  },
310
+ close(): void {
311
+ if (closed) {
312
+ return;
313
+ }
314
+ closed = true;
315
+ subscribers.clear();
316
+ channel?.close();
317
+ db.close();
318
+ },
289
319
  };
290
320
 
291
321
  return backend;
@@ -21,6 +21,7 @@ export type WebStorageBackend = {
21
21
  size?: () => number;
22
22
  subscribe?: (listener: (event: WebStorageChangeEvent) => void) => () => void;
23
23
  flush?: () => Promise<void>;
24
+ close?: () => void;
24
25
  name?: string;
25
26
  };
26
27