@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.
- package/dist/src/background/index.js +114 -42
- package/dist/src/background/index.js.map +5 -4
- package/dist/src/background/message-router.js +114 -42
- package/dist/src/background/message-router.js.map +5 -4
- package/dist/src/index.js +115 -42
- package/dist/src/index.js.map +5 -4
- package/dist/src/mesh.d.ts +3 -3
- package/dist/src/mesh.js +181 -77
- package/dist/src/mesh.js.map +8 -7
- package/dist/src/shared/adapters/index.js +114 -42
- package/dist/src/shared/adapters/index.js.map +5 -4
- package/dist/src/shared/lib/blob-cache.d.ts +1 -1
- package/dist/src/shared/lib/context-helpers.js +114 -42
- package/dist/src/shared/lib/context-helpers.js.map +5 -4
- package/dist/src/shared/lib/idb-helpers.d.ts +38 -0
- package/dist/src/shared/lib/mesh-client.d.ts +45 -1
- package/dist/src/shared/lib/mesh-state.d.ts +37 -0
- package/dist/src/shared/lib/message-bus.js +114 -42
- package/dist/src/shared/lib/message-bus.js.map +5 -4
- package/dist/src/shared/lib/resource.js +109 -38
- package/dist/src/shared/lib/resource.js.map +5 -4
- package/dist/src/shared/lib/state.js +109 -38
- package/dist/src/shared/lib/state.js.map +5 -4
- package/dist/src/shared/lib/storage-adapter.d.ts +3 -3
- package/dist/src/shared/state/app-state.js +109 -38
- package/dist/src/shared/state/app-state.js.map +5 -4
- package/package.json +1 -1
|
@@ -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
|
-
|
|
168
|
+
dbRef = { promise: null };
|
|
85
169
|
constructor(dbName = "polly-state") {
|
|
86
170
|
this.dbName = dbName;
|
|
87
171
|
}
|
|
88
172
|
getDB() {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
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=
|
|
1905
|
+
//# debugId=8436B69E95CFD03264756E2164756E21
|