@altazion/commerce-sdk-core 1.0.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.
- package/dist/assets/cache.worker-BX4nA-m-.js +131 -0
- package/dist/assets/cache.worker-BX4nA-m-.js.map +1 -0
- package/dist/index.cjs +861 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +998 -0
- package/dist/index.iife.js +864 -0
- package/dist/index.iife.js.map +1 -0
- package/dist/index.js +860 -0
- package/dist/index.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
const DB_NAME = "altazion-cache";
|
|
2
|
+
const DB_VERSION = 1;
|
|
3
|
+
const STORE_NAME = "entries";
|
|
4
|
+
let db = null;
|
|
5
|
+
function openDb() {
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
if (db) {
|
|
8
|
+
resolve(db);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const request = indexedDB.open(DB_NAME, DB_VERSION);
|
|
12
|
+
request.onupgradeneeded = (event) => {
|
|
13
|
+
const target = event.target;
|
|
14
|
+
const database = target.result;
|
|
15
|
+
if (!database.objectStoreNames.contains(STORE_NAME)) {
|
|
16
|
+
database.createObjectStore(STORE_NAME, { keyPath: "key" });
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
request.onsuccess = (event) => {
|
|
20
|
+
db = event.target.result;
|
|
21
|
+
resolve(db);
|
|
22
|
+
};
|
|
23
|
+
request.onerror = () => reject(request.error);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async function getEntry(key) {
|
|
27
|
+
const database = await openDb();
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const tx = database.transaction(STORE_NAME, "readonly");
|
|
30
|
+
const req = tx.objectStore(STORE_NAME).get(key);
|
|
31
|
+
req.onsuccess = () => {
|
|
32
|
+
const entry = req.result;
|
|
33
|
+
if (!entry) {
|
|
34
|
+
resolve(null);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (Date.now() > entry.expiresAt) {
|
|
38
|
+
void deleteEntry(key);
|
|
39
|
+
resolve(null);
|
|
40
|
+
} else {
|
|
41
|
+
resolve(entry.data);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
req.onerror = () => reject(req.error);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async function setEntry(key, data, ttlMs) {
|
|
48
|
+
const database = await openDb();
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
const entry = { key, data, expiresAt: Date.now() + ttlMs };
|
|
51
|
+
const tx = database.transaction(STORE_NAME, "readwrite");
|
|
52
|
+
const req = tx.objectStore(STORE_NAME).put(entry);
|
|
53
|
+
req.onsuccess = () => resolve();
|
|
54
|
+
req.onerror = () => reject(req.error);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async function deleteEntry(key) {
|
|
58
|
+
const database = await openDb();
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
const tx = database.transaction(STORE_NAME, "readwrite");
|
|
61
|
+
const req = tx.objectStore(STORE_NAME).delete(key);
|
|
62
|
+
req.onsuccess = () => resolve();
|
|
63
|
+
req.onerror = () => reject(req.error);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async function invalidateByPattern(pattern) {
|
|
67
|
+
const database = await openDb();
|
|
68
|
+
const regex = new RegExp(pattern);
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
const tx = database.transaction(STORE_NAME, "readwrite");
|
|
71
|
+
const store = tx.objectStore(STORE_NAME);
|
|
72
|
+
const keysRequest = store.getAllKeys();
|
|
73
|
+
keysRequest.onsuccess = () => {
|
|
74
|
+
const keys = keysRequest.result;
|
|
75
|
+
for (const key of keys) {
|
|
76
|
+
if (regex.test(key)) {
|
|
77
|
+
store.delete(key);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
tx.oncomplete = () => resolve();
|
|
82
|
+
tx.onerror = () => reject(tx.error);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async function clearAll() {
|
|
86
|
+
const database = await openDb();
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
const tx = database.transaction(STORE_NAME, "readwrite");
|
|
89
|
+
const req = tx.objectStore(STORE_NAME).clear();
|
|
90
|
+
req.onsuccess = () => resolve();
|
|
91
|
+
req.onerror = () => reject(req.error);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async function handleMessage(message, port) {
|
|
95
|
+
try {
|
|
96
|
+
switch (message.type) {
|
|
97
|
+
case "GET": {
|
|
98
|
+
const result = await getEntry(message.key);
|
|
99
|
+
port.postMessage({ id: message.id, result });
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case "SET": {
|
|
103
|
+
await setEntry(message.key, message.data, message.ttl);
|
|
104
|
+
port.postMessage({ id: message.id, result: true });
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case "INVALIDATE": {
|
|
108
|
+
await invalidateByPattern(message.pattern);
|
|
109
|
+
port.postMessage({ id: message.id, result: true });
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
case "CLEAR_ALL": {
|
|
113
|
+
await clearAll();
|
|
114
|
+
port.postMessage({ id: message.id, result: true });
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
} catch (err) {
|
|
119
|
+
const message_ = err instanceof Error ? err.message : String(err);
|
|
120
|
+
port.postMessage({ id: message.id, error: message_ });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
self.addEventListener("connect", (event) => {
|
|
124
|
+
const connectEvent = event;
|
|
125
|
+
const port = connectEvent.ports[0];
|
|
126
|
+
port.addEventListener("message", (e) => {
|
|
127
|
+
void handleMessage(e.data, port);
|
|
128
|
+
});
|
|
129
|
+
port.start();
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=cache.worker-BX4nA-m-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.worker-BX4nA-m-.js","sources":["../src/workers/cache.worker.ts"],"sourcesContent":["/**\n * SharedWorker de cache pour Altazion Commerce SDK.\n *\n * Exécuté dans un contexte SharedWorker partagé entre tous les onglets\n * du même domaine. Persiste les réponses API dans IndexedDB avec un TTL.\n *\n * Messages entrants (main thread → worker) :\n * { id, type: 'GET', key }\n * { id, type: 'SET', key, data, ttl }\n * { id, type: 'INVALIDATE', pattern }\n * { id, type: 'CLEAR_ALL' }\n *\n * Messages sortants (worker → main thread) :\n * { id, result: T | null }\n * { id, error: string }\n */\n\nconst DB_NAME = 'altazion-cache'\nconst DB_VERSION = 1\nconst STORE_NAME = 'entries'\n\ninterface CacheEntry {\n key: string\n data: unknown\n expiresAt: number\n}\n\ntype IncomingMessage =\n | { id: string; type: 'GET'; key: string }\n | { id: string; type: 'SET'; key: string; data: unknown; ttl: number }\n | { id: string; type: 'INVALIDATE'; pattern: string }\n | { id: string; type: 'CLEAR_ALL' }\n\nlet db: IDBDatabase | null = null\n\nfunction openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n if (db) { resolve(db); return }\n\n const request = indexedDB.open(DB_NAME, DB_VERSION)\n\n request.onupgradeneeded = (event) => {\n const target = event.target as IDBOpenDBRequest\n const database = target.result\n if (!database.objectStoreNames.contains(STORE_NAME)) {\n database.createObjectStore(STORE_NAME, { keyPath: 'key' })\n }\n }\n\n request.onsuccess = (event) => {\n db = (event.target as IDBOpenDBRequest).result\n resolve(db)\n }\n\n request.onerror = () => reject(request.error)\n })\n}\n\nasync function getEntry(key: string): Promise<unknown | null> {\n const database = await openDb()\n return new Promise((resolve, reject) => {\n const tx = database.transaction(STORE_NAME, 'readonly')\n const req = tx.objectStore(STORE_NAME).get(key)\n\n req.onsuccess = () => {\n const entry = req.result as CacheEntry | undefined\n if (!entry) { resolve(null); return }\n if (Date.now() > entry.expiresAt) {\n // Entrée expirée — on la supprime en tâche de fond\n void deleteEntry(key)\n resolve(null)\n } else {\n resolve(entry.data)\n }\n }\n req.onerror = () => reject(req.error)\n })\n}\n\nasync function setEntry(key: string, data: unknown, ttlMs: number): Promise<void> {\n const database = await openDb()\n return new Promise((resolve, reject) => {\n const entry: CacheEntry = { key, data, expiresAt: Date.now() + ttlMs }\n const tx = database.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).put(entry)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n}\n\nasync function deleteEntry(key: string): Promise<void> {\n const database = await openDb()\n return new Promise((resolve, reject) => {\n const tx = database.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).delete(key)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n}\n\nasync function invalidateByPattern(pattern: string): Promise<void> {\n const database = await openDb()\n const regex = new RegExp(pattern)\n return new Promise((resolve, reject) => {\n const tx = database.transaction(STORE_NAME, 'readwrite')\n const store = tx.objectStore(STORE_NAME)\n const keysRequest = store.getAllKeys()\n\n keysRequest.onsuccess = () => {\n const keys = keysRequest.result as string[]\n for (const key of keys) {\n if (regex.test(key)) {\n store.delete(key)\n }\n }\n }\n\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nasync function clearAll(): Promise<void> {\n const database = await openDb()\n return new Promise((resolve, reject) => {\n const tx = database.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).clear()\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n}\n\nasync function handleMessage(message: IncomingMessage, port: MessagePort): Promise<void> {\n try {\n switch (message.type) {\n case 'GET': {\n const result = await getEntry(message.key)\n port.postMessage({ id: message.id, result })\n break\n }\n case 'SET': {\n await setEntry(message.key, message.data, message.ttl)\n port.postMessage({ id: message.id, result: true })\n break\n }\n case 'INVALIDATE': {\n await invalidateByPattern(message.pattern)\n port.postMessage({ id: message.id, result: true })\n break\n }\n case 'CLEAR_ALL': {\n await clearAll()\n port.postMessage({ id: message.id, result: true })\n break\n }\n }\n } catch (err) {\n const message_ = err instanceof Error ? err.message : String(err)\n port.postMessage({ id: (message as { id: string }).id, error: message_ })\n }\n}\n\n// Entrée du SharedWorker\nself.addEventListener('connect', (event: Event) => {\n const connectEvent = event as MessageEvent\n const port = connectEvent.ports[0]\n\n port.addEventListener('message', (e: MessageEvent<IncomingMessage>) => {\n void handleMessage(e.data, port)\n })\n\n port.start()\n})\n"],"names":[],"mappings":"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"}
|