@databuddy/sdk 2.1.5 → 2.1.6

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.
@@ -6,113 +6,37 @@ import { useEffect, createElement } from 'react';
6
6
  import '../shared/@databuddy/sdk.RYpOP8Ko.mjs';
7
7
 
8
8
  class FlagStorage {
9
- dbName = "databuddy-flags";
10
- version = 1;
11
- storeName = "flags";
12
9
  ttl = 24 * 60 * 60 * 1e3;
13
10
  // 24 hours in milliseconds
14
11
  async get(key) {
15
- try {
16
- const db = await this.openDB();
17
- const transaction = db.transaction(this.storeName, "readonly");
18
- const store = transaction.objectStore(this.storeName);
19
- return new Promise((resolve) => {
20
- const request = store.get(key);
21
- request.onsuccess = () => {
22
- const result = request.result;
23
- if (result && this.isExpired(result.expiresAt)) {
24
- this.delete(key);
25
- resolve(null);
26
- } else {
27
- resolve(result?.value);
28
- }
29
- };
30
- request.onerror = () => resolve(null);
31
- });
32
- } catch {
33
- return this.getFromLocalStorage(key);
34
- }
12
+ return this.getFromLocalStorage(key);
35
13
  }
36
14
  async set(key, value) {
37
- try {
38
- const db = await this.openDB();
39
- const transaction = db.transaction(this.storeName, "readwrite");
40
- const store = transaction.objectStore(this.storeName);
41
- const expiresAt = Date.now() + this.ttl;
42
- store.put({ key, value, timestamp: Date.now(), expiresAt });
43
- } catch {
44
- this.setToLocalStorage(key, value);
45
- }
15
+ this.setToLocalStorage(key, value);
46
16
  }
47
17
  async getAll() {
48
- try {
49
- const db = await this.openDB();
50
- const transaction = db.transaction(this.storeName, "readonly");
51
- const store = transaction.objectStore(this.storeName);
52
- return new Promise((resolve) => {
53
- const request = store.getAll();
54
- request.onsuccess = () => {
55
- const result = {};
56
- const expiredKeys = [];
57
- for (const item of request.result || []) {
58
- if (this.isExpired(item.expiresAt)) {
59
- expiredKeys.push(item.key);
60
- } else {
61
- result[item.key] = item.value;
62
- }
63
- }
64
- if (expiredKeys.length > 0) {
65
- this.deleteMultiple(expiredKeys);
66
- }
67
- resolve(result);
68
- };
69
- request.onerror = () => resolve({});
70
- });
71
- } catch {
72
- const result = {};
73
- const now = Date.now();
74
- Object.keys(localStorage).filter((key) => key.startsWith("db-flag-")).forEach((key) => {
75
- const flagKey = key.replace("db-flag-", "");
76
- try {
77
- const item = localStorage.getItem(key);
78
- if (item) {
79
- const parsed = JSON.parse(item);
80
- if (parsed.expiresAt && now > parsed.expiresAt) {
81
- localStorage.removeItem(key);
82
- } else {
83
- result[flagKey] = parsed.value || parsed;
84
- }
18
+ const result = {};
19
+ const now = Date.now();
20
+ Object.keys(localStorage).filter((key) => key.startsWith("db-flag-")).forEach((key) => {
21
+ const flagKey = key.replace("db-flag-", "");
22
+ try {
23
+ const item = localStorage.getItem(key);
24
+ if (item) {
25
+ const parsed = JSON.parse(item);
26
+ if (parsed.expiresAt && now > parsed.expiresAt) {
27
+ localStorage.removeItem(key);
28
+ } else {
29
+ result[flagKey] = parsed.value || parsed;
85
30
  }
86
- } catch {
87
31
  }
88
- });
89
- return result;
90
- }
32
+ } catch {
33
+ }
34
+ });
35
+ return result;
91
36
  }
92
37
  async clear() {
93
- try {
94
- const db = await this.openDB();
95
- const transaction = db.transaction(this.storeName, "readwrite");
96
- const store = transaction.objectStore(this.storeName);
97
- store.clear();
98
- } catch {
99
- Object.keys(localStorage).filter((key) => key.startsWith("db-flag-")).forEach((key) => {
100
- localStorage.removeItem(key);
101
- });
102
- return;
103
- }
104
- }
105
- async openDB() {
106
- return new Promise((resolve, reject) => {
107
- const request = indexedDB.open(this.dbName, this.version);
108
- request.onerror = () => reject(request.error);
109
- request.onsuccess = () => resolve(request.result);
110
- request.onupgradeneeded = () => {
111
- const db = request.result;
112
- if (!db.objectStoreNames.contains(this.storeName)) {
113
- db.createObjectStore(this.storeName, { keyPath: "key" });
114
- }
115
- };
38
+ Object.keys(localStorage).filter((key) => key.startsWith("db-flag-")).forEach((key) => {
39
+ localStorage.removeItem(key);
116
40
  });
117
41
  }
118
42
  getFromLocalStorage(key) {
@@ -152,27 +76,11 @@ class FlagStorage {
152
76
  return Date.now() > expiresAt;
153
77
  }
154
78
  async delete(key) {
155
- try {
156
- const db = await this.openDB();
157
- const transaction = db.transaction(this.storeName, "readwrite");
158
- const store = transaction.objectStore(this.storeName);
159
- store.delete(key);
160
- } catch {
161
- localStorage.removeItem(`db-flag-${key}`);
162
- }
79
+ localStorage.removeItem(`db-flag-${key}`);
163
80
  }
164
81
  async deleteMultiple(keys) {
165
- try {
166
- const db = await this.openDB();
167
- const transaction = db.transaction(this.storeName, "readwrite");
168
- const store = transaction.objectStore(this.storeName);
169
- for (const key of keys) {
170
- store.delete(key);
171
- }
172
- } catch {
173
- for (const key of keys) {
174
- localStorage.removeItem(`db-flag-${key}`);
175
- }
82
+ for (const key of keys) {
83
+ localStorage.removeItem(`db-flag-${key}`);
176
84
  }
177
85
  }
178
86
  async setAll(flags) {
@@ -188,44 +96,20 @@ class FlagStorage {
188
96
  }
189
97
  }
190
98
  async cleanupExpired() {
191
- try {
192
- const db = await this.openDB();
193
- const transaction = db.transaction(this.storeName, "readwrite");
194
- const store = transaction.objectStore(this.storeName);
195
- return new Promise((resolve) => {
196
- const request = store.getAll();
197
- request.onsuccess = () => {
198
- const expiredKeys = [];
199
- for (const item of request.result || []) {
200
- if (this.isExpired(item.expiresAt)) {
201
- expiredKeys.push(item.key);
202
- }
203
- }
204
- if (expiredKeys.length > 0) {
205
- this.deleteMultiple(expiredKeys).then(() => resolve()).catch(() => resolve());
206
- } else {
207
- resolve();
208
- }
209
- };
210
- request.onerror = () => resolve();
211
- });
212
- } catch {
213
- this.cleanupExpired();
214
- const now = Date.now();
215
- Object.keys(localStorage).filter((key) => key.startsWith("db-flag-")).forEach((key) => {
216
- try {
217
- const item = localStorage.getItem(key);
218
- if (item) {
219
- const parsed = JSON.parse(item);
220
- if (parsed.expiresAt && now > parsed.expiresAt) {
221
- localStorage.removeItem(key);
222
- }
99
+ const now = Date.now();
100
+ Object.keys(localStorage).filter((key) => key.startsWith("db-flag-")).forEach((key) => {
101
+ try {
102
+ const item = localStorage.getItem(key);
103
+ if (item) {
104
+ const parsed = JSON.parse(item);
105
+ if (parsed.expiresAt && now > parsed.expiresAt) {
106
+ localStorage.removeItem(key);
223
107
  }
224
- } catch {
225
- localStorage.removeItem(key);
226
108
  }
227
- });
228
- }
109
+ } catch {
110
+ localStorage.removeItem(key);
111
+ }
112
+ });
229
113
  }
230
114
  }
231
115
  const flagStorage = new FlagStorage();
@@ -285,54 +169,22 @@ function FlagsProvider({ children, ...config }) {
285
169
  if (config2.skipStorage) {
286
170
  return;
287
171
  }
288
- try {
289
- const cachedFlags = {};
290
- const flagKeys = Object.keys(localStorage).filter(
291
- (key) => key.startsWith("db-flag-")
292
- );
293
- for (const key of flagKeys) {
294
- const flagKey = key.replace("db-flag-", "");
295
- try {
296
- const value = localStorage.getItem(key);
297
- if (value) {
298
- cachedFlags[flagKey] = JSON.parse(value);
299
- }
300
- } catch {
301
- }
302
- }
303
- if (Object.keys(cachedFlags).length > 0) {
304
- flagsStore.set(memoryFlagsAtom, cachedFlags);
305
- if (config2.debug) {
306
- console.log(
307
- "[Databuddy Flags] Loaded cached flags immediately:",
308
- Object.keys(cachedFlags)
309
- );
310
- }
311
- }
312
- } catch (err) {
313
- if (config2.debug) {
314
- console.warn(
315
- "[Databuddy Flags] Error loading cached flags immediately:",
316
- err
317
- );
318
- }
319
- }
320
172
  flagStorage.getAll().then((cachedFlags) => {
321
173
  if (Object.keys(cachedFlags).length > 0) {
322
- flagsStore.set(memoryFlagsAtom, (prev) => ({
323
- ...prev,
324
- ...cachedFlags
325
- }));
174
+ flagsStore.set(
175
+ memoryFlagsAtom,
176
+ cachedFlags
177
+ );
326
178
  if (config2.debug) {
327
179
  console.log(
328
- "[Databuddy Flags] Loaded cached flags from IndexedDB:",
180
+ "[Databuddy Flags] Loaded cached flags:",
329
181
  Object.keys(cachedFlags)
330
182
  );
331
183
  }
332
184
  }
333
185
  }).catch((err) => {
334
186
  if (config2.debug) {
335
- console.warn("[Databuddy Flags] Error loading from IndexedDB:", err);
187
+ console.warn("[Databuddy Flags] Error loading cached flags:", err);
336
188
  }
337
189
  });
338
190
  };
@@ -146,11 +146,11 @@ declare const Databuddy: vue.DefineComponent<{
146
146
  required: false;
147
147
  } | undefined;
148
148
  }, () => null, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, string, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<{} & {
149
+ sdk?: string | undefined;
149
150
  clientId?: string | undefined;
150
151
  clientSecret?: string | undefined;
151
152
  apiUrl?: string | undefined;
152
153
  scriptUrl?: string | undefined;
153
- sdk?: string | undefined;
154
154
  sdkVersion?: string | undefined;
155
155
  disabled?: boolean | undefined;
156
156
  debug?: boolean | undefined;
@@ -146,11 +146,11 @@ declare const Databuddy: vue.DefineComponent<{
146
146
  required: false;
147
147
  } | undefined;
148
148
  }, () => null, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, string, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<{} & {
149
+ sdk?: string | undefined;
149
150
  clientId?: string | undefined;
150
151
  clientSecret?: string | undefined;
151
152
  apiUrl?: string | undefined;
152
153
  scriptUrl?: string | undefined;
153
- sdk?: string | undefined;
154
154
  sdkVersion?: string | undefined;
155
155
  disabled?: boolean | undefined;
156
156
  debug?: boolean | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@databuddy/sdk",
3
- "version": "2.1.5",
3
+ "version": "2.1.6",
4
4
  "description": "Official Databuddy Analytics SDK",
5
5
  "main": "./dist/core/index.mjs",
6
6
  "types": "./dist/core/index.d.ts",