@pyreon/storage 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,540 @@
1
+ import { signal } from "@pyreon/reactivity";
2
+
3
+ //#region src/registry.ts
4
+
5
+ /**
6
+ * Build a composite key from backend type + storage key to avoid
7
+ * collisions between different backends using the same key name.
8
+ */
9
+ function registryKey(backend, key) {
10
+ return `${backend}:${key}`;
11
+ }
12
+ /**
13
+ * Get an existing signal from the registry.
14
+ */
15
+ function getEntry(backend, key) {
16
+ return registry.get(registryKey(backend, key));
17
+ }
18
+ /**
19
+ * Register a new signal in the registry.
20
+ */
21
+ function setEntry(backend, key, signal, defaultValue) {
22
+ registry.set(registryKey(backend, key), {
23
+ signal,
24
+ defaultValue,
25
+ backend
26
+ });
27
+ }
28
+ /**
29
+ * Remove an entry from the registry.
30
+ */
31
+ function removeEntry(backend, key) {
32
+ registry.delete(registryKey(backend, key));
33
+ }
34
+ /**
35
+ * Get all entries for a specific backend.
36
+ */
37
+ function getEntriesByBackend(backend) {
38
+ const entries = [];
39
+ for (const entry of registry.values()) if (entry.backend === backend) entries.push(entry);
40
+ return entries;
41
+ }
42
+ /**
43
+ * Clear all entries from the registry. Used for testing.
44
+ */
45
+ function _resetRegistry() {
46
+ registry.clear();
47
+ }
48
+
49
+ //#endregion
50
+ //#region src/utils.ts
51
+ /**
52
+ * Check if we're running in a browser environment.
53
+ */
54
+ function isBrowser() {
55
+ return typeof window !== "undefined" && typeof document !== "undefined";
56
+ }
57
+ /**
58
+ * Serialize a value to a string for storage.
59
+ */
60
+ function serialize(value, serializer) {
61
+ if (serializer) return serializer(value);
62
+ return JSON.stringify(value);
63
+ }
64
+ /**
65
+ * Deserialize a raw string from storage back to a typed value.
66
+ * Returns the default value if deserialization fails.
67
+ */
68
+ function deserialize(raw, defaultValue, deserializer, onError) {
69
+ try {
70
+ if (deserializer) return deserializer(raw);
71
+ return JSON.parse(raw);
72
+ } catch (e) {
73
+ if (onError) {
74
+ const result = onError(e);
75
+ return result !== void 0 ? result : defaultValue;
76
+ }
77
+ return defaultValue;
78
+ }
79
+ }
80
+ /**
81
+ * Safely get a Web Storage instance (localStorage or sessionStorage).
82
+ * Returns null if not available (SSR, security restrictions, etc.).
83
+ */
84
+ function getWebStorage(type) {
85
+ if (!isBrowser()) return null;
86
+ try {
87
+ const storage = type === "local" ? window.localStorage : window.sessionStorage;
88
+ const testKey = "__pyreon_storage_test__";
89
+ storage.setItem(testKey, "1");
90
+ storage.removeItem(testKey);
91
+ return storage;
92
+ } catch {
93
+ return null;
94
+ }
95
+ }
96
+
97
+ //#endregion
98
+ //#region src/cookie.ts
99
+
100
+ /**
101
+ * Set the cookie source string for SSR. Call this once per request
102
+ * with the raw Cookie header value.
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * // In your SSR request handler
107
+ * setCookieSource(request.headers.get('cookie') ?? '')
108
+ * ```
109
+ */
110
+ function setCookieSource(cookieHeader) {
111
+ serverCookieString = cookieHeader;
112
+ }
113
+ function parseCookies(cookieString) {
114
+ const cookies = /* @__PURE__ */new Map();
115
+ if (!cookieString) return cookies;
116
+ for (const pair of cookieString.split(";")) {
117
+ const eqIndex = pair.indexOf("=");
118
+ if (eqIndex === -1) continue;
119
+ const name = pair.slice(0, eqIndex).trim();
120
+ const value = pair.slice(eqIndex + 1).trim();
121
+ if (name) cookies.set(name, decodeURIComponent(value));
122
+ }
123
+ return cookies;
124
+ }
125
+ function getCookieString() {
126
+ if (isBrowser()) return document.cookie;
127
+ return serverCookieString;
128
+ }
129
+ function readCookie(key) {
130
+ return parseCookies(getCookieString()).get(key) ?? null;
131
+ }
132
+ function writeCookie(key, value, options) {
133
+ if (!isBrowser()) return;
134
+ const serialized = serialize(value, options.serializer);
135
+ let cookie = `${encodeURIComponent(key)}=${encodeURIComponent(serialized)}`;
136
+ if (options.maxAge !== void 0) cookie += `; max-age=${options.maxAge}`;
137
+ if (options.expires) cookie += `; expires=${options.expires.toUTCString()}`;
138
+ cookie += `; path=${options.path ?? "/"}`;
139
+ if (options.domain) cookie += `; domain=${options.domain}`;
140
+ if (options.secure) cookie += "; secure";
141
+ cookie += `; samesite=${options.sameSite ?? "lax"}`;
142
+ document.cookie = cookie;
143
+ }
144
+ function deleteCookie(key, options) {
145
+ if (!isBrowser()) return;
146
+ let cookie = `${encodeURIComponent(key)}=; max-age=0`;
147
+ cookie += `; path=${options.path ?? "/"}`;
148
+ if (options.domain) cookie += `; domain=${options.domain}`;
149
+ document.cookie = cookie;
150
+ }
151
+ /**
152
+ * Reactive signal backed by a browser cookie. SSR-compatible when
153
+ * used with setCookieSource().
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * const locale = useCookie('locale', 'en', {
158
+ * maxAge: 60 * 60 * 24 * 365, // 1 year
159
+ * path: '/',
160
+ * sameSite: 'lax',
161
+ * })
162
+ * locale() // 'en'
163
+ * locale.set('de') // sets cookie + updates signal
164
+ * locale.remove() // deletes cookie, resets to default
165
+ * ```
166
+ */
167
+ function useCookie(key, defaultValue, options = {}) {
168
+ const existing = getEntry("cookie", key);
169
+ if (existing) return existing.signal;
170
+ const raw = readCookie(key);
171
+ const sig = signal(raw !== null ? deserialize(raw, defaultValue, options.deserializer, options.onError) : defaultValue);
172
+ const storageSig = () => sig();
173
+ storageSig.peek = () => sig.peek();
174
+ storageSig.subscribe = listener => sig.subscribe(listener);
175
+ storageSig.direct = updater => sig.direct(updater);
176
+ storageSig.debug = () => sig.debug();
177
+ Object.defineProperty(storageSig, "label", {
178
+ get: () => sig.label,
179
+ set: v => {
180
+ sig.label = v;
181
+ }
182
+ });
183
+ storageSig.set = value => {
184
+ sig.set(value);
185
+ writeCookie(key, value, options);
186
+ };
187
+ storageSig.update = fn => {
188
+ const newValue = fn(sig.peek());
189
+ storageSig.set(newValue);
190
+ };
191
+ storageSig.remove = () => {
192
+ sig.set(defaultValue);
193
+ deleteCookie(key, options);
194
+ removeEntry("cookie", key);
195
+ };
196
+ setEntry("cookie", key, storageSig, defaultValue);
197
+ return storageSig;
198
+ }
199
+
200
+ //#endregion
201
+ //#region src/custom.ts
202
+ /**
203
+ * Create a custom storage hook backed by any synchronous storage backend.
204
+ * Useful for encrypted storage, in-memory storage, or custom adapters.
205
+ *
206
+ * @example
207
+ * ```ts
208
+ * const useEncrypted = createStorage({
209
+ * get: (key) => decrypt(localStorage.getItem(key)),
210
+ * set: (key, value) => localStorage.setItem(key, encrypt(value)),
211
+ * remove: (key) => localStorage.removeItem(key),
212
+ * })
213
+ *
214
+ * const secret = useEncrypted('api-key', '')
215
+ * ```
216
+ */
217
+ function createStorage(backend, backendName) {
218
+ const name = backendName ?? "custom";
219
+ return function useCustomStorage(key, defaultValue, options) {
220
+ const existing = getEntry(name, key);
221
+ if (existing) return existing.signal;
222
+ let initialValue = defaultValue;
223
+ try {
224
+ const raw = backend.get(key);
225
+ if (raw !== null) initialValue = deserialize(raw, defaultValue, options?.deserializer, options?.onError);
226
+ } catch {}
227
+ const sig = signal(initialValue);
228
+ const storageSig = () => sig();
229
+ storageSig.peek = () => sig.peek();
230
+ storageSig.subscribe = listener => sig.subscribe(listener);
231
+ storageSig.direct = updater => sig.direct(updater);
232
+ storageSig.debug = () => sig.debug();
233
+ Object.defineProperty(storageSig, "label", {
234
+ get: () => sig.label,
235
+ set: v => {
236
+ sig.label = v;
237
+ }
238
+ });
239
+ storageSig.set = value => {
240
+ sig.set(value);
241
+ try {
242
+ backend.set(key, serialize(value, options?.serializer));
243
+ } catch {}
244
+ };
245
+ storageSig.update = fn => {
246
+ const newValue = fn(sig.peek());
247
+ storageSig.set(newValue);
248
+ };
249
+ storageSig.remove = () => {
250
+ sig.set(defaultValue);
251
+ try {
252
+ backend.remove(key);
253
+ } catch {}
254
+ removeEntry(name, key);
255
+ };
256
+ setEntry(name, key, storageSig, defaultValue);
257
+ return storageSig;
258
+ };
259
+ }
260
+ /**
261
+ * In-memory storage backend. Useful for SSR, testing, or ephemeral state.
262
+ * Values are lost on page unload.
263
+ *
264
+ * @example
265
+ * ```ts
266
+ * import { useMemoryStorage } from '@pyreon/storage'
267
+ *
268
+ * const temp = useMemoryStorage('key', 'default')
269
+ * ```
270
+ */
271
+
272
+ function openDB(dbName, storeName) {
273
+ const cacheKey = `${dbName}:${storeName}`;
274
+ const cached = dbCache.get(cacheKey);
275
+ if (cached) return cached;
276
+ const promise = new Promise((resolve, reject) => {
277
+ const request = indexedDB.open(dbName, 1);
278
+ request.onupgradeneeded = () => {
279
+ const db = request.result;
280
+ if (!db.objectStoreNames.contains(storeName)) db.createObjectStore(storeName);
281
+ };
282
+ request.onsuccess = () => resolve(request.result);
283
+ request.onerror = () => reject(request.error);
284
+ });
285
+ dbCache.set(cacheKey, promise);
286
+ return promise;
287
+ }
288
+ function idbGet(db, storeName, key) {
289
+ return new Promise((resolve, reject) => {
290
+ const request = db.transaction(storeName, "readonly").objectStore(storeName).get(key);
291
+ request.onsuccess = () => resolve(request.result !== void 0 ? request.result : null);
292
+ request.onerror = () => reject(request.error);
293
+ });
294
+ }
295
+ function idbSet(db, storeName, key, value) {
296
+ return new Promise((resolve, reject) => {
297
+ const request = db.transaction(storeName, "readwrite").objectStore(storeName).put(value, key);
298
+ request.onsuccess = () => resolve();
299
+ request.onerror = () => reject(request.error);
300
+ });
301
+ }
302
+ function idbDelete(db, storeName, key) {
303
+ return new Promise((resolve, reject) => {
304
+ const request = db.transaction(storeName, "readwrite").objectStore(storeName).delete(key);
305
+ request.onsuccess = () => resolve();
306
+ request.onerror = () => reject(request.error);
307
+ });
308
+ }
309
+ /**
310
+ * Reactive signal backed by IndexedDB. Suitable for large or structured
311
+ * data that exceeds localStorage limits. Writes are debounced.
312
+ *
313
+ * The signal starts with `defaultValue` and updates asynchronously
314
+ * when the stored value is read from IndexedDB.
315
+ *
316
+ * @example
317
+ * ```ts
318
+ * const draft = useIndexedDB('article-draft', { title: '', body: '' })
319
+ * draft() // { title: '', body: '' } initially, then stored value
320
+ * draft.set({ title: 'My Post', body: '...' }) // signal updates immediately, IDB write is debounced
321
+ * ```
322
+ */
323
+ function useIndexedDB(key, defaultValue, options = {}) {
324
+ const existing = getEntry("indexeddb", key);
325
+ if (existing) return existing.signal;
326
+ const dbName = options.dbName ?? "pyreon-storage";
327
+ const storeName = options.storeName ?? "kv";
328
+ const debounceMs = options.debounceMs ?? 100;
329
+ const sig = signal(defaultValue);
330
+ if (isBrowser() && typeof indexedDB !== "undefined") openDB(dbName, storeName).then(db => idbGet(db, storeName, key)).then(raw => {
331
+ if (raw !== null) {
332
+ const value = deserialize(raw, defaultValue, options.deserializer, options.onError);
333
+ sig.set(value);
334
+ }
335
+ }).catch(() => {});
336
+ let writeTimer = null;
337
+ let pendingValue;
338
+ function flushWrite() {
339
+ if (pendingValue === void 0) return;
340
+ const value = pendingValue;
341
+ pendingValue = void 0;
342
+ if (!isBrowser() || typeof indexedDB === "undefined") return;
343
+ openDB(dbName, storeName).then(db => idbSet(db, storeName, key, serialize(value, options.serializer))).catch(() => {});
344
+ }
345
+ function scheduleWrite(value) {
346
+ pendingValue = value;
347
+ if (writeTimer !== null) clearTimeout(writeTimer);
348
+ writeTimer = setTimeout(flushWrite, debounceMs);
349
+ }
350
+ const storageSig = () => sig();
351
+ storageSig.peek = () => sig.peek();
352
+ storageSig.subscribe = listener => sig.subscribe(listener);
353
+ storageSig.direct = updater => sig.direct(updater);
354
+ storageSig.debug = () => sig.debug();
355
+ Object.defineProperty(storageSig, "label", {
356
+ get: () => sig.label,
357
+ set: v => {
358
+ sig.label = v;
359
+ }
360
+ });
361
+ storageSig.set = value => {
362
+ sig.set(value);
363
+ scheduleWrite(value);
364
+ };
365
+ storageSig.update = fn => {
366
+ const newValue = fn(sig.peek());
367
+ storageSig.set(newValue);
368
+ };
369
+ storageSig.remove = () => {
370
+ sig.set(defaultValue);
371
+ pendingValue = void 0;
372
+ if (writeTimer !== null) clearTimeout(writeTimer);
373
+ if (isBrowser() && typeof indexedDB !== "undefined") openDB(dbName, storeName).then(db => idbDelete(db, storeName, key)).catch(() => {});
374
+ removeEntry("indexeddb", key);
375
+ };
376
+ setEntry("indexeddb", key, storageSig, defaultValue);
377
+ return storageSig;
378
+ }
379
+ /**
380
+ * Reset the database cache. For testing only.
381
+ */
382
+ function _resetDBCache() {
383
+ dbCache.clear();
384
+ }
385
+
386
+ //#endregion
387
+ //#region src/local.ts
388
+
389
+ function attachStorageListener() {
390
+ if (listenerAttached || !isBrowser()) return;
391
+ listenerAttached = true;
392
+ window.addEventListener("storage", e => {
393
+ if (!e.key) return;
394
+ const entry = getEntry("local", e.key);
395
+ if (!entry) return;
396
+ const newValue = e.newValue !== null ? deserialize(e.newValue, entry.defaultValue) : entry.defaultValue;
397
+ entry.signal.set(newValue);
398
+ });
399
+ }
400
+ /**
401
+ * Reactive signal backed by localStorage. Automatically syncs across
402
+ * browser tabs via the native `storage` event.
403
+ *
404
+ * @example
405
+ * ```ts
406
+ * const theme = useStorage('theme', 'light')
407
+ * theme() // 'light' (or stored value)
408
+ * theme.set('dark') // updates signal + localStorage
409
+ * theme.remove() // clears storage, resets to default
410
+ * ```
411
+ */
412
+ function useStorage(key, defaultValue, options) {
413
+ const existing = getEntry("local", key);
414
+ if (existing) return existing.signal;
415
+ const storage = getWebStorage("local");
416
+ let initialValue = defaultValue;
417
+ if (storage) {
418
+ const raw = storage.getItem(key);
419
+ if (raw !== null) initialValue = deserialize(raw, defaultValue, options?.deserializer, options?.onError);
420
+ }
421
+ const storageSig = createStorageSignal(signal(initialValue), key, defaultValue, "local", options);
422
+ setEntry("local", key, storageSig, defaultValue);
423
+ attachStorageListener();
424
+ return storageSig;
425
+ }
426
+ /**
427
+ * Wraps a base signal with storage persistence behavior.
428
+ * Used by both useStorage and useSessionStorage.
429
+ */
430
+ function createStorageSignal(sig, key, defaultValue, backend, options) {
431
+ const storage = getWebStorage(backend);
432
+ const storageSig = () => sig();
433
+ storageSig.peek = () => sig.peek();
434
+ storageSig.subscribe = listener => sig.subscribe(listener);
435
+ storageSig.direct = updater => sig.direct(updater);
436
+ storageSig.debug = () => sig.debug();
437
+ Object.defineProperty(storageSig, "label", {
438
+ get: () => sig.label,
439
+ set: v => {
440
+ sig.label = v;
441
+ }
442
+ });
443
+ storageSig.set = value => {
444
+ sig.set(value);
445
+ if (storage) try {
446
+ storage.setItem(key, serialize(value, options?.serializer));
447
+ } catch {}
448
+ };
449
+ storageSig.update = fn => {
450
+ const newValue = fn(sig.peek());
451
+ storageSig.set(newValue);
452
+ };
453
+ storageSig.remove = () => {
454
+ sig.set(defaultValue);
455
+ if (storage) storage.removeItem(key);
456
+ removeEntry(backend, key);
457
+ };
458
+ return storageSig;
459
+ }
460
+
461
+ //#endregion
462
+ //#region src/session.ts
463
+ /**
464
+ * Reactive signal backed by sessionStorage. Scoped to the current
465
+ * browser tab — does not sync across tabs.
466
+ *
467
+ * @example
468
+ * ```ts
469
+ * const step = useSessionStorage('wizard-step', 0)
470
+ * step() // 0 (or stored value)
471
+ * step.set(3) // updates signal + sessionStorage
472
+ * step.remove() // clears storage, resets to default
473
+ * ```
474
+ */
475
+ function useSessionStorage(key, defaultValue, options) {
476
+ const existing = getEntry("session", key);
477
+ if (existing) return existing.signal;
478
+ const storage = getWebStorage("session");
479
+ let initialValue = defaultValue;
480
+ if (storage) {
481
+ const raw = storage.getItem(key);
482
+ if (raw !== null) initialValue = deserialize(raw, defaultValue, options?.deserializer, options?.onError);
483
+ }
484
+ const storageSig = createStorageSignal(signal(initialValue), key, defaultValue, "session", options);
485
+ setEntry("session", key, storageSig, defaultValue);
486
+ return storageSig;
487
+ }
488
+
489
+ //#endregion
490
+ //#region src/clear.ts
491
+ /**
492
+ * Remove a specific key from storage and reset its signal to the default value.
493
+ *
494
+ * @example
495
+ * ```ts
496
+ * removeStorage('theme') // from localStorage
497
+ * removeStorage('step', { type: 'session' }) // from sessionStorage
498
+ * removeStorage('locale', { type: 'cookie' }) // deletes cookie
499
+ * ```
500
+ */
501
+ function removeStorage(key, options) {
502
+ const type = options?.type ?? "local";
503
+ const entry = getEntry(type, key);
504
+ if (entry) entry.signal.remove();else {
505
+ if (type === "local" || type === "session") {
506
+ const storage = getWebStorage(type);
507
+ if (storage) storage.removeItem(key);
508
+ } else if (type === "cookie" && isBrowser()) document.cookie = `${encodeURIComponent(key)}=; max-age=0; path=/`;
509
+ removeEntry(type, key);
510
+ }
511
+ }
512
+ /**
513
+ * Clear all managed storage entries for a specific backend, or all backends.
514
+ *
515
+ * @example
516
+ * ```ts
517
+ * clearStorage() // clear all localStorage entries managed by @pyreon/storage
518
+ * clearStorage('session') // clear all sessionStorage entries
519
+ * clearStorage('cookie') // clear all managed cookies
520
+ * clearStorage('all') // clear everything
521
+ * ```
522
+ */
523
+ function clearStorage(type = "local") {
524
+ if (type === "all") {
525
+ clearBackend("local");
526
+ clearBackend("session");
527
+ clearBackend("cookie");
528
+ clearBackend("indexeddb");
529
+ return;
530
+ }
531
+ clearBackend(type);
532
+ }
533
+ function clearBackend(type) {
534
+ const entries = getEntriesByBackend(type);
535
+ for (const entry of entries) entry.signal.remove();
536
+ }
537
+
538
+ //#endregion
539
+ export { _resetDBCache, _resetRegistry, clearStorage, createStorage, removeStorage, setCookieSource, useCookie, useIndexedDB, useMemoryStorage, useSessionStorage, useStorage };
540
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/registry.ts","../../src/utils.ts","../../src/cookie.ts","../../src/custom.ts","../../src/indexed-db.ts","../../src/local.ts","../../src/session.ts","../../src/clear.ts"],"mappings":"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"}