@fairfox/polly 0.61.0 → 0.62.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.
@@ -69,6 +69,90 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
69
69
  throw Error('Dynamic require of "' + x + '" is not supported');
70
70
  });
71
71
 
72
+ // src/shared/lib/idb-helpers.ts
73
+ function openIDB(options) {
74
+ return new Promise((resolve, reject) => {
75
+ const start = Date.now();
76
+ const request = indexedDB.open(options.name, options.version);
77
+ let settled = false;
78
+ const timer = setTimeout(() => {
79
+ if (settled)
80
+ return;
81
+ settled = true;
82
+ const elapsedMs = Date.now() - start;
83
+ reject(new Error(`Polly IndexedDB open of '${options.name}' timed out after ${elapsedMs}ms (cross-tab lock or zombie connection?)`));
84
+ }, IDB_OPEN_TIMEOUT_MS);
85
+ request.onerror = () => {
86
+ if (settled)
87
+ return;
88
+ settled = true;
89
+ clearTimeout(timer);
90
+ reject(request.error);
91
+ };
92
+ request.onsuccess = () => {
93
+ if (settled)
94
+ return;
95
+ settled = true;
96
+ clearTimeout(timer);
97
+ resolve(request.result);
98
+ };
99
+ request.onupgradeneeded = (event) => {
100
+ const db = event.target.result;
101
+ options.upgrade(db, event);
102
+ };
103
+ });
104
+ }
105
+ function cachedOpen(ref, options) {
106
+ if (ref.promise)
107
+ return ref.promise;
108
+ const pending = openIDB(options);
109
+ pending.catch(() => {
110
+ if (ref.promise === pending)
111
+ ref.promise = null;
112
+ });
113
+ ref.promise = pending;
114
+ return pending;
115
+ }
116
+ function runRequest(request) {
117
+ return new Promise((resolve, reject) => {
118
+ request.onsuccess = () => resolve(request.result);
119
+ request.onerror = () => reject(request.error);
120
+ });
121
+ }
122
+ function runTx(db, storeName, mode, fn) {
123
+ return new Promise((resolve, reject) => {
124
+ const tx = db.transaction(storeName, mode);
125
+ const store = tx.objectStore(storeName);
126
+ tx.oncomplete = () => resolve();
127
+ tx.onerror = () => reject(tx.error);
128
+ tx.onabort = () => reject(tx.error);
129
+ try {
130
+ fn(store);
131
+ } catch (err) {
132
+ try {
133
+ tx.abort();
134
+ } catch {}
135
+ reject(err);
136
+ }
137
+ });
138
+ }
139
+ function iterateCursor(db, storeName, visit) {
140
+ return new Promise((resolve, reject) => {
141
+ const tx = db.transaction(storeName, "readonly");
142
+ const store = tx.objectStore(storeName);
143
+ const request = store.openCursor();
144
+ request.onsuccess = () => {
145
+ const cursor = request.result;
146
+ if (!cursor)
147
+ return resolve();
148
+ visit(cursor.key, cursor.value);
149
+ cursor.continue();
150
+ };
151
+ request.onerror = () => reject(request.error);
152
+ });
153
+ }
154
+ var IDB_OPEN_TIMEOUT_MS = 5000;
155
+
72
156
  // src/shared/lib/storage-adapter.ts
73
157
  var exports_storage_adapter = {};
74
158
  __export(exports_storage_adapter, {
@@ -81,68 +165,32 @@ __export(exports_storage_adapter, {
81
165
  class IndexedDBAdapter {
82
166
  dbName;
83
167
  storeName = "state";
84
- dbPromise = null;
168
+ dbRef = { promise: null };
85
169
  constructor(dbName = "polly-state") {
86
170
  this.dbName = dbName;
87
171
  }
88
172
  getDB() {
89
- if (this.dbPromise)
90
- return this.dbPromise;
91
- const pending = new Promise((resolve, reject) => {
92
- const start = Date.now();
93
- const request = indexedDB.open(this.dbName, 1);
94
- let settled = false;
95
- const timer = setTimeout(() => {
96
- if (settled)
97
- return;
98
- settled = true;
99
- const elapsedMs = Date.now() - start;
100
- reject(new Error(`Polly IndexedDB open of '${this.dbName}' timed out after ${elapsedMs}ms (cross-tab lock or zombie connection?)`));
101
- }, IDB_OPEN_TIMEOUT_MS);
102
- request.onerror = () => {
103
- if (settled)
104
- return;
105
- settled = true;
106
- clearTimeout(timer);
107
- reject(request.error);
108
- };
109
- request.onsuccess = () => {
110
- if (settled)
111
- return;
112
- settled = true;
113
- clearTimeout(timer);
114
- resolve(request.result);
115
- };
116
- request.onupgradeneeded = (event) => {
117
- const db = event.target.result;
173
+ return cachedOpen(this.dbRef, {
174
+ name: this.dbName,
175
+ version: 1,
176
+ upgrade: (db) => {
118
177
  if (!db.objectStoreNames.contains(this.storeName)) {
119
178
  db.createObjectStore(this.storeName);
120
179
  }
121
- };
122
- });
123
- pending.catch(() => {
124
- if (this.dbPromise === pending)
125
- this.dbPromise = null;
180
+ }
126
181
  });
127
- this.dbPromise = pending;
128
- return pending;
129
182
  }
130
183
  async get(keys) {
131
184
  try {
132
185
  const db = await this.getDB();
186
+ const tx = db.transaction(this.storeName, "readonly");
187
+ const store = tx.objectStore(this.storeName);
188
+ const pairs = await Promise.all(keys.map(async (key) => [key, await runRequest(store.get(key))]));
133
189
  const result = {};
134
- await Promise.all(keys.map((key) => new Promise((resolve, reject) => {
135
- const transaction = db.transaction([this.storeName], "readonly");
136
- const store = transaction.objectStore(this.storeName);
137
- const request = store.get(key);
138
- request.onerror = () => reject(request.error);
139
- request.onsuccess = () => {
140
- if (request.result !== undefined) {
141
- result[key] = request.result;
142
- }
143
- resolve();
144
- };
145
- })));
190
+ for (const [key, value] of pairs) {
191
+ if (value !== undefined)
192
+ result[key] = value;
193
+ }
146
194
  return result;
147
195
  } catch (error) {
148
196
  console.warn("[Polly] IndexedDB get failed:", error);
@@ -152,13 +200,11 @@ class IndexedDBAdapter {
152
200
  async set(items) {
153
201
  try {
154
202
  const db = await this.getDB();
155
- await Promise.all(Object.entries(items).map(([key, value]) => new Promise((resolve, reject) => {
156
- const transaction = db.transaction([this.storeName], "readwrite");
157
- const store = transaction.objectStore(this.storeName);
158
- const request = store.put(value, key);
159
- request.onerror = () => reject(request.error);
160
- request.onsuccess = () => resolve();
161
- })));
203
+ await runTx(db, this.storeName, "readwrite", (store) => {
204
+ for (const [key, value] of Object.entries(items)) {
205
+ store.put(value, key);
206
+ }
207
+ });
162
208
  } catch (error) {
163
209
  console.warn("[Polly] IndexedDB set failed:", error);
164
210
  }
@@ -166,13 +212,10 @@ class IndexedDBAdapter {
166
212
  async remove(keys) {
167
213
  try {
168
214
  const db = await this.getDB();
169
- await Promise.all(keys.map((key) => new Promise((resolve, reject) => {
170
- const transaction = db.transaction([this.storeName], "readwrite");
171
- const store = transaction.objectStore(this.storeName);
172
- const request = store.delete(key);
173
- request.onerror = () => reject(request.error);
174
- request.onsuccess = () => resolve();
175
- })));
215
+ await runTx(db, this.storeName, "readwrite", (store) => {
216
+ for (const key of keys)
217
+ store.delete(key);
218
+ });
176
219
  } catch (error) {
177
220
  console.warn("[Polly] IndexedDB remove failed:", error);
178
221
  }
@@ -245,7 +288,7 @@ function createStorageAdapter() {
245
288
  }
246
289
  return new MemoryStorageAdapter;
247
290
  }
248
- var IDB_OPEN_TIMEOUT_MS = 5000;
291
+ var init_storage_adapter = () => {};
249
292
 
250
293
  // src/shared/lib/sync-adapter.ts
251
294
  var exports_sync_adapter = {};
@@ -749,6 +792,7 @@ class MessageLoggerAdapter {
749
792
  }
750
793
 
751
794
  // src/shared/lib/adapter-factory.ts
795
+ init_storage_adapter();
752
796
  function createStateAdapters(options = {}) {
753
797
  if (options.storage && options.sync) {
754
798
  return {
@@ -769,7 +813,7 @@ function createStateAdapters(options = {}) {
769
813
  return { storage, sync };
770
814
  }
771
815
  function createChromeAdapters() {
772
- const { ChromeStorageAdapter: ChromeStorageAdapter3 } = __toCommonJS(exports_storage_adapter);
816
+ const { ChromeStorageAdapter: ChromeStorageAdapter3 } = (init_storage_adapter(), __toCommonJS(exports_storage_adapter));
773
817
  const { ChromeRuntimeSyncAdapter: ChromeRuntimeSyncAdapter2 } = __toCommonJS(exports_sync_adapter);
774
818
  return {
775
819
  storage: new ChromeStorageAdapter3,
@@ -777,14 +821,14 @@ function createChromeAdapters() {
777
821
  };
778
822
  }
779
823
  function createWebAdapters(options = {}) {
780
- const { IndexedDBAdapter: IndexedDBAdapter2 } = __toCommonJS(exports_storage_adapter);
824
+ const { IndexedDBAdapter: IndexedDBAdapter2 } = (init_storage_adapter(), __toCommonJS(exports_storage_adapter));
781
825
  const { BroadcastChannelSyncAdapter: BroadcastChannelSyncAdapter2, NoOpSyncAdapter: NoOpSyncAdapter2 } = __toCommonJS(exports_sync_adapter);
782
826
  const storage = new IndexedDBAdapter2(options.dbName);
783
827
  const sync = options.singleTab ? new NoOpSyncAdapter2 : new BroadcastChannelSyncAdapter2(options.channelName);
784
828
  return { storage, sync };
785
829
  }
786
830
  function createNodeAdapters() {
787
- const { MemoryStorageAdapter: MemoryStorageAdapter2 } = __toCommonJS(exports_storage_adapter);
831
+ const { MemoryStorageAdapter: MemoryStorageAdapter2 } = (init_storage_adapter(), __toCommonJS(exports_storage_adapter));
788
832
  const { NoOpSyncAdapter: NoOpSyncAdapter2 } = __toCommonJS(exports_sync_adapter);
789
833
  return {
790
834
  storage: new MemoryStorageAdapter2,
@@ -792,7 +836,7 @@ function createNodeAdapters() {
792
836
  };
793
837
  }
794
838
  function createMockAdapters() {
795
- const { MemoryStorageAdapter: MemoryStorageAdapter2 } = __toCommonJS(exports_storage_adapter);
839
+ const { MemoryStorageAdapter: MemoryStorageAdapter2 } = (init_storage_adapter(), __toCommonJS(exports_storage_adapter));
796
840
  const { NoOpSyncAdapter: NoOpSyncAdapter2 } = __toCommonJS(exports_sync_adapter);
797
841
  return {
798
842
  storage: new MemoryStorageAdapter2,
@@ -801,6 +845,7 @@ function createMockAdapters() {
801
845
  }
802
846
 
803
847
  // src/shared/adapters/index.ts
848
+ init_storage_adapter();
804
849
  function createChromeAdapters2(context, options) {
805
850
  const runtime2 = new ChromeRuntimeAdapter;
806
851
  return {
@@ -1857,4 +1902,4 @@ export {
1857
1902
  MessageRouter
1858
1903
  };
1859
1904
 
1860
- //# debugId=8B9539FBFEA7D97464756E2164756E21
1905
+ //# debugId=8436B69E95CFD03264756E2164756E21