@fairfox/polly 0.60.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,42 +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
- this.dbPromise = new Promise((resolve, reject) => {
92
- const request = indexedDB.open(this.dbName, 1);
93
- request.onerror = () => reject(request.error);
94
- request.onsuccess = () => resolve(request.result);
95
- request.onupgradeneeded = (event) => {
96
- const db = event.target.result;
173
+ return cachedOpen(this.dbRef, {
174
+ name: this.dbName,
175
+ version: 1,
176
+ upgrade: (db) => {
97
177
  if (!db.objectStoreNames.contains(this.storeName)) {
98
178
  db.createObjectStore(this.storeName);
99
179
  }
100
- };
180
+ }
101
181
  });
102
- return this.dbPromise;
103
182
  }
104
183
  async get(keys) {
105
184
  try {
106
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))]));
107
189
  const result = {};
108
- await Promise.all(keys.map((key) => new Promise((resolve, reject) => {
109
- const transaction = db.transaction([this.storeName], "readonly");
110
- const store = transaction.objectStore(this.storeName);
111
- const request = store.get(key);
112
- request.onerror = () => reject(request.error);
113
- request.onsuccess = () => {
114
- if (request.result !== undefined) {
115
- result[key] = request.result;
116
- }
117
- resolve();
118
- };
119
- })));
190
+ for (const [key, value] of pairs) {
191
+ if (value !== undefined)
192
+ result[key] = value;
193
+ }
120
194
  return result;
121
195
  } catch (error) {
122
196
  console.warn("[Polly] IndexedDB get failed:", error);
@@ -126,13 +200,11 @@ class IndexedDBAdapter {
126
200
  async set(items) {
127
201
  try {
128
202
  const db = await this.getDB();
129
- await Promise.all(Object.entries(items).map(([key, value]) => new Promise((resolve, reject) => {
130
- const transaction = db.transaction([this.storeName], "readwrite");
131
- const store = transaction.objectStore(this.storeName);
132
- const request = store.put(value, key);
133
- request.onerror = () => reject(request.error);
134
- request.onsuccess = () => resolve();
135
- })));
203
+ await runTx(db, this.storeName, "readwrite", (store) => {
204
+ for (const [key, value] of Object.entries(items)) {
205
+ store.put(value, key);
206
+ }
207
+ });
136
208
  } catch (error) {
137
209
  console.warn("[Polly] IndexedDB set failed:", error);
138
210
  }
@@ -140,13 +212,10 @@ class IndexedDBAdapter {
140
212
  async remove(keys) {
141
213
  try {
142
214
  const db = await this.getDB();
143
- await Promise.all(keys.map((key) => new Promise((resolve, reject) => {
144
- const transaction = db.transaction([this.storeName], "readwrite");
145
- const store = transaction.objectStore(this.storeName);
146
- const request = store.delete(key);
147
- request.onerror = () => reject(request.error);
148
- request.onsuccess = () => resolve();
149
- })));
215
+ await runTx(db, this.storeName, "readwrite", (store) => {
216
+ for (const key of keys)
217
+ store.delete(key);
218
+ });
150
219
  } catch (error) {
151
220
  console.warn("[Polly] IndexedDB remove failed:", error);
152
221
  }
@@ -219,6 +288,7 @@ function createStorageAdapter() {
219
288
  }
220
289
  return new MemoryStorageAdapter;
221
290
  }
291
+ var init_storage_adapter = () => {};
222
292
 
223
293
  // src/shared/lib/sync-adapter.ts
224
294
  var exports_sync_adapter = {};
@@ -722,6 +792,7 @@ class MessageLoggerAdapter {
722
792
  }
723
793
 
724
794
  // src/shared/lib/adapter-factory.ts
795
+ init_storage_adapter();
725
796
  function createStateAdapters(options = {}) {
726
797
  if (options.storage && options.sync) {
727
798
  return {
@@ -742,7 +813,7 @@ function createStateAdapters(options = {}) {
742
813
  return { storage, sync };
743
814
  }
744
815
  function createChromeAdapters() {
745
- const { ChromeStorageAdapter: ChromeStorageAdapter3 } = __toCommonJS(exports_storage_adapter);
816
+ const { ChromeStorageAdapter: ChromeStorageAdapter3 } = (init_storage_adapter(), __toCommonJS(exports_storage_adapter));
746
817
  const { ChromeRuntimeSyncAdapter: ChromeRuntimeSyncAdapter2 } = __toCommonJS(exports_sync_adapter);
747
818
  return {
748
819
  storage: new ChromeStorageAdapter3,
@@ -750,14 +821,14 @@ function createChromeAdapters() {
750
821
  };
751
822
  }
752
823
  function createWebAdapters(options = {}) {
753
- const { IndexedDBAdapter: IndexedDBAdapter2 } = __toCommonJS(exports_storage_adapter);
824
+ const { IndexedDBAdapter: IndexedDBAdapter2 } = (init_storage_adapter(), __toCommonJS(exports_storage_adapter));
754
825
  const { BroadcastChannelSyncAdapter: BroadcastChannelSyncAdapter2, NoOpSyncAdapter: NoOpSyncAdapter2 } = __toCommonJS(exports_sync_adapter);
755
826
  const storage = new IndexedDBAdapter2(options.dbName);
756
827
  const sync = options.singleTab ? new NoOpSyncAdapter2 : new BroadcastChannelSyncAdapter2(options.channelName);
757
828
  return { storage, sync };
758
829
  }
759
830
  function createNodeAdapters() {
760
- const { MemoryStorageAdapter: MemoryStorageAdapter2 } = __toCommonJS(exports_storage_adapter);
831
+ const { MemoryStorageAdapter: MemoryStorageAdapter2 } = (init_storage_adapter(), __toCommonJS(exports_storage_adapter));
761
832
  const { NoOpSyncAdapter: NoOpSyncAdapter2 } = __toCommonJS(exports_sync_adapter);
762
833
  return {
763
834
  storage: new MemoryStorageAdapter2,
@@ -765,7 +836,7 @@ function createNodeAdapters() {
765
836
  };
766
837
  }
767
838
  function createMockAdapters() {
768
- const { MemoryStorageAdapter: MemoryStorageAdapter2 } = __toCommonJS(exports_storage_adapter);
839
+ const { MemoryStorageAdapter: MemoryStorageAdapter2 } = (init_storage_adapter(), __toCommonJS(exports_storage_adapter));
769
840
  const { NoOpSyncAdapter: NoOpSyncAdapter2 } = __toCommonJS(exports_sync_adapter);
770
841
  return {
771
842
  storage: new MemoryStorageAdapter2,
@@ -774,6 +845,7 @@ function createMockAdapters() {
774
845
  }
775
846
 
776
847
  // src/shared/adapters/index.ts
848
+ init_storage_adapter();
777
849
  function createChromeAdapters2(context, options) {
778
850
  const runtime2 = new ChromeRuntimeAdapter;
779
851
  return {
@@ -1830,4 +1902,4 @@ export {
1830
1902
  MessageRouter
1831
1903
  };
1832
1904
 
1833
- //# debugId=F33341DE5D01217564756E2164756E21
1905
+ //# debugId=8436B69E95CFD03264756E2164756E21