@rocicorp/zero 0.25.0-canary.3 → 0.25.0-canary.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.
- package/out/chunk-ASRS2LFV.js +35 -0
- package/out/chunk-ASRS2LFV.js.map +7 -0
- package/out/{chunk-U2KJIWVC.js → chunk-EZM3XBAB.js} +2 -47
- package/out/chunk-EZM3XBAB.js.map +7 -0
- package/out/{chunk-5H7WNLPK.js → chunk-HCZQVP5R.js} +2 -2
- package/out/{chunk-SRLXXPNB.js → chunk-PFM5IJC4.js} +4 -4
- package/out/{chunk-JKP7HDC6.js → chunk-TAUDS4QP.js} +48 -7
- package/out/chunk-TAUDS4QP.js.map +7 -0
- package/out/{chunk-RYFBHAD4.js → chunk-WPAQ4EPM.js} +16 -19
- package/out/chunk-WPAQ4EPM.js.map +7 -0
- package/out/{chunk-IWL6EEA6.js → chunk-WWNKZSEE.js} +590 -73
- package/out/chunk-WWNKZSEE.js.map +7 -0
- package/out/expo-sqlite.js +4 -4
- package/out/{lazy-inspector-4CO3DXP5.js → lazy-inspector-XLKVABX2.js} +6 -6
- package/out/op-sqlite.js +3 -3
- package/out/react-native.js +4 -4
- package/out/react.js +5 -4
- package/out/react.js.map +2 -2
- package/out/replicache/src/kv/sqlite-store.d.ts +1 -7
- package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
- package/out/replicache/src/sqlite.d.ts +1 -1
- package/out/replicache/src/sqlite.d.ts.map +1 -1
- package/out/shared/src/deep-merge.d.ts +6 -3
- package/out/shared/src/deep-merge.d.ts.map +1 -1
- package/out/solid.js +5 -5
- package/out/sqlite.js +3 -5
- package/out/zero/package.json +2 -2
- package/out/zero/src/zero-cache-dev.js +57 -40
- package/out/zero/src/zero-cache-dev.js.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.d.ts +10 -0
- package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.js +16 -2
- package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
- package/out/zero-cache/src/services/change-source/column-metadata.d.ts +10 -3
- package/out/zero-cache/src/services/change-source/column-metadata.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/column-metadata.js +26 -13
- package/out/zero-cache/src/services/change-source/column-metadata.js.map +1 -1
- package/out/zero-cache/src/services/change-source/replica-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/replica-schema.js +13 -0
- package/out/zero-cache/src/services/change-source/replica-schema.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +33 -0
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +2 -24
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +4 -29
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-client/src/client/custom.d.ts +2 -2
- package/out/zero-client/src/client/custom.d.ts.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.d.ts +2 -2
- package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
- package/out/zero-client/src/mod.d.ts +1 -1
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-react/src/mod.d.ts +1 -1
- package/out/zero-react/src/mod.d.ts.map +1 -1
- package/out/zero-react/src/zero-provider.d.ts +1 -0
- package/out/zero-react/src/zero-provider.d.ts.map +1 -1
- package/out/zero.js +6 -7
- package/out/zql/src/builder/builder.d.ts +1 -1
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/planner/planner-join.js +1 -1
- package/out/zql/src/planner/planner-join.js.map +1 -1
- package/package.json +2 -2
- package/out/chunk-HYS7YLNL.js +0 -575
- package/out/chunk-HYS7YLNL.js.map +0 -7
- package/out/chunk-IWL6EEA6.js.map +0 -7
- package/out/chunk-JKP7HDC6.js.map +0 -7
- package/out/chunk-RYFBHAD4.js.map +0 -7
- package/out/chunk-U2KJIWVC.js.map +0 -7
- /package/out/{chunk-5H7WNLPK.js.map → chunk-HCZQVP5R.js.map} +0 -0
- /package/out/{chunk-SRLXXPNB.js.map → chunk-PFM5IJC4.js.map} +0 -0
- /package/out/{lazy-inspector-4CO3DXP5.js.map → lazy-inspector-XLKVABX2.js.map} +0 -0
package/out/chunk-HYS7YLNL.js
DELETED
|
@@ -1,575 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
assert,
|
|
3
|
-
assertNotNull,
|
|
4
|
-
assertNumber,
|
|
5
|
-
assertObject,
|
|
6
|
-
assertString,
|
|
7
|
-
deepFreeze,
|
|
8
|
-
deepFreezeAllowUndefined,
|
|
9
|
-
makeClientID,
|
|
10
|
-
withRead,
|
|
11
|
-
withWrite
|
|
12
|
-
} from "./chunk-U2KJIWVC.js";
|
|
13
|
-
|
|
14
|
-
// ../replicache/src/kv/idb-store.ts
|
|
15
|
-
import { resolver } from "@rocicorp/resolver";
|
|
16
|
-
|
|
17
|
-
// ../shared/src/browser-env.ts
|
|
18
|
-
var overrides = /* @__PURE__ */ new Map();
|
|
19
|
-
function getBrowserGlobal(name) {
|
|
20
|
-
if (overrides.has(name)) {
|
|
21
|
-
return overrides.get(name);
|
|
22
|
-
}
|
|
23
|
-
return globalThis[name];
|
|
24
|
-
}
|
|
25
|
-
function getBrowserGlobalMethod(name) {
|
|
26
|
-
return getBrowserGlobal(name)?.bind(globalThis);
|
|
27
|
-
}
|
|
28
|
-
function mustGetBrowserGlobal(name) {
|
|
29
|
-
const r = getBrowserGlobal(name);
|
|
30
|
-
if (r === void 0) {
|
|
31
|
-
throw new Error(
|
|
32
|
-
`Unsupported JavaScript environment: Could not find ${name}.`
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
return r;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// ../shared/src/resolved-promises.ts
|
|
39
|
-
var promiseTrue = Promise.resolve(true);
|
|
40
|
-
var promiseFalse = Promise.resolve(false);
|
|
41
|
-
var promiseUndefined = Promise.resolve(void 0);
|
|
42
|
-
var promiseVoid = Promise.resolve();
|
|
43
|
-
var promiseNever = new Promise(() => {
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// ../replicache/src/kv/throw-if-closed.ts
|
|
47
|
-
function storeError() {
|
|
48
|
-
return new Error("Store is closed");
|
|
49
|
-
}
|
|
50
|
-
function transactionError() {
|
|
51
|
-
return new Error("Transaction is closed");
|
|
52
|
-
}
|
|
53
|
-
function throwIfStoreClosed(store) {
|
|
54
|
-
if (store.closed) {
|
|
55
|
-
throw storeError();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
function throwIfTransactionClosed(transaction) {
|
|
59
|
-
if (transaction.closed) {
|
|
60
|
-
throw transactionError();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function transactionIsClosedRejection() {
|
|
64
|
-
return Promise.reject(transactionError());
|
|
65
|
-
}
|
|
66
|
-
function maybeTransactionIsClosedRejection(transaction) {
|
|
67
|
-
return transaction.closed ? transactionIsClosedRejection() : void 0;
|
|
68
|
-
}
|
|
69
|
-
function storeIsClosedRejection() {
|
|
70
|
-
return Promise.reject(storeError());
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// ../replicache/src/kv/write-impl-base.ts
|
|
74
|
-
var deleteSentinel = Symbol();
|
|
75
|
-
var WriteImplBase = class {
|
|
76
|
-
_pending = /* @__PURE__ */ new Map();
|
|
77
|
-
#read;
|
|
78
|
-
constructor(read) {
|
|
79
|
-
this.#read = read;
|
|
80
|
-
}
|
|
81
|
-
has(key) {
|
|
82
|
-
if (this.#read.closed) {
|
|
83
|
-
return transactionIsClosedRejection();
|
|
84
|
-
}
|
|
85
|
-
switch (this._pending.get(key)) {
|
|
86
|
-
case void 0:
|
|
87
|
-
return this.#read.has(key);
|
|
88
|
-
case deleteSentinel:
|
|
89
|
-
return promiseFalse;
|
|
90
|
-
default:
|
|
91
|
-
return promiseTrue;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
async get(key) {
|
|
95
|
-
if (this.#read.closed) {
|
|
96
|
-
return transactionIsClosedRejection();
|
|
97
|
-
}
|
|
98
|
-
const v = this._pending.get(key);
|
|
99
|
-
switch (v) {
|
|
100
|
-
case deleteSentinel:
|
|
101
|
-
return void 0;
|
|
102
|
-
case void 0: {
|
|
103
|
-
const v2 = await this.#read.get(key);
|
|
104
|
-
return deepFreezeAllowUndefined(v2);
|
|
105
|
-
}
|
|
106
|
-
default:
|
|
107
|
-
return v;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
put(key, value) {
|
|
111
|
-
return maybeTransactionIsClosedRejection(this.#read) ?? (this._pending.set(key, deepFreeze(value)), promiseVoid);
|
|
112
|
-
}
|
|
113
|
-
del(key) {
|
|
114
|
-
return maybeTransactionIsClosedRejection(this.#read) ?? (this._pending.set(key, deleteSentinel), promiseVoid);
|
|
115
|
-
}
|
|
116
|
-
release() {
|
|
117
|
-
this.#read.release();
|
|
118
|
-
}
|
|
119
|
-
get closed() {
|
|
120
|
-
return this.#read.closed;
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
// ../replicache/src/kv/idb-store.ts
|
|
125
|
-
var RELAXED = { durability: "relaxed" };
|
|
126
|
-
var OBJECT_STORE = "chunks";
|
|
127
|
-
var IDBStore = class {
|
|
128
|
-
#db;
|
|
129
|
-
#closed = false;
|
|
130
|
-
#idbDeleted = false;
|
|
131
|
-
constructor(name) {
|
|
132
|
-
this.#db = openDatabase(name);
|
|
133
|
-
}
|
|
134
|
-
read() {
|
|
135
|
-
if (this.#closed) {
|
|
136
|
-
return storeIsClosedRejection();
|
|
137
|
-
}
|
|
138
|
-
return this.#withReopen(readImpl);
|
|
139
|
-
}
|
|
140
|
-
write() {
|
|
141
|
-
if (this.#closed) {
|
|
142
|
-
return storeIsClosedRejection();
|
|
143
|
-
}
|
|
144
|
-
return this.#withReopen(writeImpl);
|
|
145
|
-
}
|
|
146
|
-
async close() {
|
|
147
|
-
if (!this.#idbDeleted) {
|
|
148
|
-
const db = await this.#db;
|
|
149
|
-
db.close();
|
|
150
|
-
}
|
|
151
|
-
this.#closed = true;
|
|
152
|
-
}
|
|
153
|
-
get closed() {
|
|
154
|
-
return this.#closed;
|
|
155
|
-
}
|
|
156
|
-
async #withReopen(fn) {
|
|
157
|
-
const reopenExistingDB = async (name) => {
|
|
158
|
-
const { promise, resolve, reject } = resolver();
|
|
159
|
-
const req = indexedDB.open(name);
|
|
160
|
-
req.onupgradeneeded = () => {
|
|
161
|
-
const tx = req.transaction;
|
|
162
|
-
assertNotNull(tx);
|
|
163
|
-
tx.abort();
|
|
164
|
-
this.#idbDeleted = true;
|
|
165
|
-
reject(
|
|
166
|
-
new IDBNotFoundError(
|
|
167
|
-
`Expected IndexedDB not found: ${name}. This likely means that the user deleted IndexedDB instances while the app was running. This is non-fatal. The app will continue running in memory until reload.`
|
|
168
|
-
)
|
|
169
|
-
);
|
|
170
|
-
};
|
|
171
|
-
req.onsuccess = () => resolve(req.result);
|
|
172
|
-
req.onerror = () => reject(req.error);
|
|
173
|
-
const db2 = await promise;
|
|
174
|
-
db2.onversionchange = () => db2.close();
|
|
175
|
-
return db2;
|
|
176
|
-
};
|
|
177
|
-
const db = await this.#db;
|
|
178
|
-
try {
|
|
179
|
-
return fn(db);
|
|
180
|
-
} catch (e) {
|
|
181
|
-
if (!this.#closed && e instanceof DOMException) {
|
|
182
|
-
if (e.name === "InvalidStateError") {
|
|
183
|
-
this.#db = reopenExistingDB(db.name);
|
|
184
|
-
const reopened = await this.#db;
|
|
185
|
-
return fn(reopened);
|
|
186
|
-
} else if (e.name === "NotFoundError") {
|
|
187
|
-
this.#idbDeleted = true;
|
|
188
|
-
mustGetBrowserGlobal("indexedDB").deleteDatabase(db.name);
|
|
189
|
-
throw new IDBNotFoundError(
|
|
190
|
-
`Expected IndexedDB ${db.name} missing object store. Deleting db. This is non-fatal, the app will continue working in memory until it is reloaded.`
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
throw e;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
};
|
|
198
|
-
var ReadImpl = class {
|
|
199
|
-
#tx;
|
|
200
|
-
#closed = false;
|
|
201
|
-
constructor(tx) {
|
|
202
|
-
this.#tx = tx;
|
|
203
|
-
}
|
|
204
|
-
has(key) {
|
|
205
|
-
if (this.#closed) {
|
|
206
|
-
return transactionIsClosedRejection();
|
|
207
|
-
}
|
|
208
|
-
return new Promise((resolve, reject) => {
|
|
209
|
-
const req = objectStore(this.#tx).count(key);
|
|
210
|
-
req.onsuccess = () => resolve(req.result > 0);
|
|
211
|
-
req.onerror = () => reject(req.error);
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
get(key) {
|
|
215
|
-
if (this.#closed) {
|
|
216
|
-
return transactionIsClosedRejection();
|
|
217
|
-
}
|
|
218
|
-
return new Promise((resolve, reject) => {
|
|
219
|
-
const req = objectStore(this.#tx).get(key);
|
|
220
|
-
req.onsuccess = () => resolve(deepFreezeAllowUndefined(req.result));
|
|
221
|
-
req.onerror = () => reject(req.error);
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
release() {
|
|
225
|
-
this.#closed = true;
|
|
226
|
-
}
|
|
227
|
-
get closed() {
|
|
228
|
-
return this.#closed;
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
var WriteImpl = class extends WriteImplBase {
|
|
232
|
-
#tx;
|
|
233
|
-
#closed = false;
|
|
234
|
-
constructor(tx) {
|
|
235
|
-
super(new ReadImpl(tx));
|
|
236
|
-
this.#tx = tx;
|
|
237
|
-
}
|
|
238
|
-
commit() {
|
|
239
|
-
if (this.#closed) {
|
|
240
|
-
return transactionIsClosedRejection();
|
|
241
|
-
}
|
|
242
|
-
if (this._pending.size === 0) {
|
|
243
|
-
return promiseVoid;
|
|
244
|
-
}
|
|
245
|
-
return new Promise((resolve, reject) => {
|
|
246
|
-
const tx = this.#tx;
|
|
247
|
-
const store = objectStore(tx);
|
|
248
|
-
for (const [key, val] of this._pending) {
|
|
249
|
-
if (val === deleteSentinel) {
|
|
250
|
-
store.delete(key);
|
|
251
|
-
} else {
|
|
252
|
-
store.put(val, key);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
tx.oncomplete = () => resolve();
|
|
256
|
-
tx.onerror = () => reject(tx.error);
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
release() {
|
|
260
|
-
this.#closed = true;
|
|
261
|
-
super.release();
|
|
262
|
-
}
|
|
263
|
-
get closed() {
|
|
264
|
-
return this.#closed;
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
function writeImpl(db) {
|
|
268
|
-
const tx = db.transaction(OBJECT_STORE, "readwrite", RELAXED);
|
|
269
|
-
return new WriteImpl(tx);
|
|
270
|
-
}
|
|
271
|
-
function readImpl(db) {
|
|
272
|
-
const tx = db.transaction(OBJECT_STORE, "readonly");
|
|
273
|
-
return new ReadImpl(tx);
|
|
274
|
-
}
|
|
275
|
-
function objectStore(tx) {
|
|
276
|
-
return tx.objectStore(OBJECT_STORE);
|
|
277
|
-
}
|
|
278
|
-
function openDatabase(name) {
|
|
279
|
-
const idb = mustGetBrowserGlobal("indexedDB");
|
|
280
|
-
return new Promise((resolve, reject) => {
|
|
281
|
-
const req = idb.open(name);
|
|
282
|
-
req.onupgradeneeded = () => {
|
|
283
|
-
req.result.createObjectStore(OBJECT_STORE);
|
|
284
|
-
};
|
|
285
|
-
req.onsuccess = () => {
|
|
286
|
-
const db = req.result;
|
|
287
|
-
db.onversionchange = () => db.close();
|
|
288
|
-
resolve(db);
|
|
289
|
-
};
|
|
290
|
-
req.onerror = () => reject(req.error);
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
var IDBNotFoundError = class extends Error {
|
|
294
|
-
name = "IDBNotFoundError";
|
|
295
|
-
};
|
|
296
|
-
|
|
297
|
-
// ../shared/src/navigator.ts
|
|
298
|
-
var localNavigator = typeof navigator !== "undefined" ? navigator : void 0;
|
|
299
|
-
|
|
300
|
-
// ../replicache/src/kv/mem-store.ts
|
|
301
|
-
import { RWLock } from "@rocicorp/lock";
|
|
302
|
-
|
|
303
|
-
// ../replicache/src/kv/read-impl.ts
|
|
304
|
-
var ReadImpl2 = class {
|
|
305
|
-
#map;
|
|
306
|
-
#release;
|
|
307
|
-
#closed = false;
|
|
308
|
-
constructor(map, release) {
|
|
309
|
-
this.#map = map;
|
|
310
|
-
this.#release = release;
|
|
311
|
-
}
|
|
312
|
-
release() {
|
|
313
|
-
this.#release();
|
|
314
|
-
this.#closed = true;
|
|
315
|
-
}
|
|
316
|
-
get closed() {
|
|
317
|
-
return this.#closed;
|
|
318
|
-
}
|
|
319
|
-
has(key) {
|
|
320
|
-
return maybeTransactionIsClosedRejection(this) ?? Promise.resolve(this.#map.has(key));
|
|
321
|
-
}
|
|
322
|
-
get(key) {
|
|
323
|
-
return maybeTransactionIsClosedRejection(this) ?? Promise.resolve(this.#map.get(key));
|
|
324
|
-
}
|
|
325
|
-
};
|
|
326
|
-
|
|
327
|
-
// ../replicache/src/kv/write-impl.ts
|
|
328
|
-
var WriteImpl2 = class extends WriteImplBase {
|
|
329
|
-
#map;
|
|
330
|
-
constructor(map, release) {
|
|
331
|
-
super(new ReadImpl2(map, release));
|
|
332
|
-
this.#map = map;
|
|
333
|
-
}
|
|
334
|
-
commit() {
|
|
335
|
-
if (this.closed) {
|
|
336
|
-
return transactionIsClosedRejection();
|
|
337
|
-
}
|
|
338
|
-
this._pending.forEach((value, key) => {
|
|
339
|
-
if (value === deleteSentinel) {
|
|
340
|
-
this.#map.delete(key);
|
|
341
|
-
} else {
|
|
342
|
-
this.#map.set(key, value);
|
|
343
|
-
}
|
|
344
|
-
});
|
|
345
|
-
this._pending.clear();
|
|
346
|
-
this.release();
|
|
347
|
-
return promiseVoid;
|
|
348
|
-
}
|
|
349
|
-
};
|
|
350
|
-
|
|
351
|
-
// ../replicache/src/kv/mem-store.ts
|
|
352
|
-
var stores = /* @__PURE__ */ new Map();
|
|
353
|
-
function dropMemStore(name) {
|
|
354
|
-
stores.delete(name);
|
|
355
|
-
return promiseVoid;
|
|
356
|
-
}
|
|
357
|
-
var MemStore = class {
|
|
358
|
-
#map;
|
|
359
|
-
#rwLock;
|
|
360
|
-
#closed = false;
|
|
361
|
-
constructor(name) {
|
|
362
|
-
const entry = stores.get(name);
|
|
363
|
-
let lock;
|
|
364
|
-
let map;
|
|
365
|
-
if (entry) {
|
|
366
|
-
({ lock, map } = entry);
|
|
367
|
-
} else {
|
|
368
|
-
lock = new RWLock();
|
|
369
|
-
map = /* @__PURE__ */ new Map();
|
|
370
|
-
stores.set(name, { lock, map });
|
|
371
|
-
}
|
|
372
|
-
this.#rwLock = lock;
|
|
373
|
-
this.#map = map;
|
|
374
|
-
}
|
|
375
|
-
async read() {
|
|
376
|
-
throwIfStoreClosed(this);
|
|
377
|
-
const release = await this.#rwLock.read();
|
|
378
|
-
return new ReadImpl2(this.#map, release);
|
|
379
|
-
}
|
|
380
|
-
async write() {
|
|
381
|
-
throwIfStoreClosed(this);
|
|
382
|
-
const release = await this.#rwLock.write();
|
|
383
|
-
return new WriteImpl2(this.#map, release);
|
|
384
|
-
}
|
|
385
|
-
close() {
|
|
386
|
-
this.#closed = true;
|
|
387
|
-
return promiseVoid;
|
|
388
|
-
}
|
|
389
|
-
get closed() {
|
|
390
|
-
return this.#closed;
|
|
391
|
-
}
|
|
392
|
-
};
|
|
393
|
-
|
|
394
|
-
// ../replicache/src/kv/idb-store-with-mem-fallback.ts
|
|
395
|
-
var IDBStoreWithMemFallback = class {
|
|
396
|
-
#lc;
|
|
397
|
-
#name;
|
|
398
|
-
#store;
|
|
399
|
-
constructor(lc, name) {
|
|
400
|
-
this.#lc = lc;
|
|
401
|
-
this.#name = name;
|
|
402
|
-
this.#store = new IDBStore(name);
|
|
403
|
-
}
|
|
404
|
-
read() {
|
|
405
|
-
return this.#withBrainTransplant((s) => s.read());
|
|
406
|
-
}
|
|
407
|
-
write() {
|
|
408
|
-
return this.#withBrainTransplant((s) => s.write());
|
|
409
|
-
}
|
|
410
|
-
async #withBrainTransplant(f) {
|
|
411
|
-
try {
|
|
412
|
-
return await f(this.#store);
|
|
413
|
-
} catch (e) {
|
|
414
|
-
if (isFirefoxPrivateBrowsingError(e)) {
|
|
415
|
-
if (this.#store instanceof IDBStore) {
|
|
416
|
-
this.#lc.info?.(
|
|
417
|
-
"Switching to MemStore because of Firefox private browsing error"
|
|
418
|
-
);
|
|
419
|
-
this.#store = new MemStore(this.#name);
|
|
420
|
-
}
|
|
421
|
-
return f(this.#store);
|
|
422
|
-
}
|
|
423
|
-
throw e;
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
close() {
|
|
427
|
-
return this.#store.close();
|
|
428
|
-
}
|
|
429
|
-
get closed() {
|
|
430
|
-
return this.#store.closed;
|
|
431
|
-
}
|
|
432
|
-
};
|
|
433
|
-
function isFirefoxPrivateBrowsingError(e) {
|
|
434
|
-
return isFirefox() && e instanceof DOMException && e.name === "InvalidStateError" && e.message === "A mutation operation was attempted on a database that did not allow mutations.";
|
|
435
|
-
}
|
|
436
|
-
function isFirefox() {
|
|
437
|
-
return localNavigator?.userAgent?.includes("Firefox") ?? false;
|
|
438
|
-
}
|
|
439
|
-
function newIDBStoreWithMemFallback(lc, name) {
|
|
440
|
-
if (isFirefox()) {
|
|
441
|
-
return new IDBStoreWithMemFallback(lc, name);
|
|
442
|
-
}
|
|
443
|
-
return new IDBStore(name);
|
|
444
|
-
}
|
|
445
|
-
function dropIDBStoreWithMemFallback(name) {
|
|
446
|
-
if (!isFirefox()) {
|
|
447
|
-
return dropIDBStore(name);
|
|
448
|
-
}
|
|
449
|
-
try {
|
|
450
|
-
return dropIDBStore(name);
|
|
451
|
-
} catch (e) {
|
|
452
|
-
if (isFirefoxPrivateBrowsingError(e)) {
|
|
453
|
-
return dropMemStore(name);
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
return promiseVoid;
|
|
457
|
-
}
|
|
458
|
-
function dropIDBStore(name) {
|
|
459
|
-
return new Promise((resolve, reject) => {
|
|
460
|
-
const req = indexedDB.deleteDatabase(name);
|
|
461
|
-
req.onsuccess = () => resolve();
|
|
462
|
-
req.onerror = () => reject(req.error);
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
// ../replicache/src/persist/idb-databases-store-db-name.ts
|
|
467
|
-
var IDB_DATABASES_VERSION = 0;
|
|
468
|
-
var IDB_DATABASES_DB_NAME = "replicache-dbs-v" + IDB_DATABASES_VERSION;
|
|
469
|
-
var testNamespace = "";
|
|
470
|
-
function getIDBDatabasesDBName() {
|
|
471
|
-
return testNamespace + IDB_DATABASES_DB_NAME;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
// ../replicache/src/persist/idb-databases-store.ts
|
|
475
|
-
var DBS_KEY = "dbs";
|
|
476
|
-
var PROFILE_ID_KEY = "profileId";
|
|
477
|
-
function assertIndexedDBDatabaseRecord(value) {
|
|
478
|
-
assertObject(value);
|
|
479
|
-
for (const [name, db] of Object.entries(value)) {
|
|
480
|
-
assertString(name);
|
|
481
|
-
assertIndexedDBDatabase(db);
|
|
482
|
-
assert(name === db.name);
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
function assertIndexedDBDatabase(value) {
|
|
486
|
-
assertObject(value);
|
|
487
|
-
assertString(value.name);
|
|
488
|
-
assertString(value.replicacheName);
|
|
489
|
-
assertNumber(value.replicacheFormatVersion);
|
|
490
|
-
assertString(value.schemaVersion);
|
|
491
|
-
if (value.lastOpenedTimestampMS !== void 0) {
|
|
492
|
-
assertNumber(value.lastOpenedTimestampMS);
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
var IDBDatabasesStore = class {
|
|
496
|
-
#kvStore;
|
|
497
|
-
constructor(createKVStore) {
|
|
498
|
-
this.#kvStore = createKVStore(getIDBDatabasesDBName());
|
|
499
|
-
}
|
|
500
|
-
putDatabase(db) {
|
|
501
|
-
return this.#putDatabase({ ...db, lastOpenedTimestampMS: Date.now() });
|
|
502
|
-
}
|
|
503
|
-
putDatabaseForTesting(db) {
|
|
504
|
-
return this.#putDatabase(db);
|
|
505
|
-
}
|
|
506
|
-
#putDatabase(db) {
|
|
507
|
-
return withWrite(this.#kvStore, async (write) => {
|
|
508
|
-
const oldDbRecord = await getDatabases(write);
|
|
509
|
-
const dbRecord = {
|
|
510
|
-
...oldDbRecord,
|
|
511
|
-
[db.name]: db
|
|
512
|
-
};
|
|
513
|
-
await write.put(DBS_KEY, dbRecord);
|
|
514
|
-
return dbRecord;
|
|
515
|
-
});
|
|
516
|
-
}
|
|
517
|
-
clearDatabases() {
|
|
518
|
-
return withWrite(this.#kvStore, (write) => write.del(DBS_KEY));
|
|
519
|
-
}
|
|
520
|
-
deleteDatabases(names) {
|
|
521
|
-
return withWrite(this.#kvStore, async (write) => {
|
|
522
|
-
const oldDbRecord = await getDatabases(write);
|
|
523
|
-
const dbRecord = {
|
|
524
|
-
...oldDbRecord
|
|
525
|
-
};
|
|
526
|
-
for (const name of names) {
|
|
527
|
-
delete dbRecord[name];
|
|
528
|
-
}
|
|
529
|
-
await write.put(DBS_KEY, dbRecord);
|
|
530
|
-
});
|
|
531
|
-
}
|
|
532
|
-
getDatabases() {
|
|
533
|
-
return withRead(this.#kvStore, getDatabases);
|
|
534
|
-
}
|
|
535
|
-
close() {
|
|
536
|
-
return this.#kvStore.close();
|
|
537
|
-
}
|
|
538
|
-
getProfileID() {
|
|
539
|
-
return withWrite(this.#kvStore, async (write) => {
|
|
540
|
-
let profileId = await write.get(PROFILE_ID_KEY);
|
|
541
|
-
if (profileId === void 0) {
|
|
542
|
-
profileId = `p${makeClientID()}`;
|
|
543
|
-
await write.put(PROFILE_ID_KEY, profileId);
|
|
544
|
-
}
|
|
545
|
-
assertString(profileId);
|
|
546
|
-
return profileId;
|
|
547
|
-
});
|
|
548
|
-
}
|
|
549
|
-
};
|
|
550
|
-
async function getDatabases(read) {
|
|
551
|
-
let dbRecord = await read.get(DBS_KEY);
|
|
552
|
-
if (!dbRecord) {
|
|
553
|
-
dbRecord = deepFreeze({});
|
|
554
|
-
}
|
|
555
|
-
assertIndexedDBDatabaseRecord(dbRecord);
|
|
556
|
-
return dbRecord;
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
export {
|
|
560
|
-
getBrowserGlobal,
|
|
561
|
-
getBrowserGlobalMethod,
|
|
562
|
-
mustGetBrowserGlobal,
|
|
563
|
-
promiseVoid,
|
|
564
|
-
throwIfStoreClosed,
|
|
565
|
-
throwIfTransactionClosed,
|
|
566
|
-
IDBStore,
|
|
567
|
-
IDBNotFoundError,
|
|
568
|
-
localNavigator,
|
|
569
|
-
dropMemStore,
|
|
570
|
-
MemStore,
|
|
571
|
-
newIDBStoreWithMemFallback,
|
|
572
|
-
dropIDBStoreWithMemFallback,
|
|
573
|
-
IDBDatabasesStore
|
|
574
|
-
};
|
|
575
|
-
//# sourceMappingURL=chunk-HYS7YLNL.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../replicache/src/kv/idb-store.ts", "../../shared/src/browser-env.ts", "../../shared/src/resolved-promises.ts", "../../replicache/src/kv/throw-if-closed.ts", "../../replicache/src/kv/write-impl-base.ts", "../../shared/src/navigator.ts", "../../replicache/src/kv/mem-store.ts", "../../replicache/src/kv/read-impl.ts", "../../replicache/src/kv/write-impl.ts", "../../replicache/src/kv/idb-store-with-mem-fallback.ts", "../../replicache/src/persist/idb-databases-store-db-name.ts", "../../replicache/src/persist/idb-databases-store.ts"],
|
|
4
|
-
"sourcesContent": ["import {resolver} from '@rocicorp/resolver';\nimport {assertNotNull} from '../../../shared/src/asserts.ts';\nimport {mustGetBrowserGlobal} from '../../../shared/src/browser-env.ts';\nimport {promiseVoid} from '../../../shared/src/resolved-promises.ts';\nimport {\n type FrozenJSONValue,\n deepFreezeAllowUndefined,\n} from '../frozen-json.ts';\nimport type {Read, Store, Write} from './store.ts';\nimport {\n storeIsClosedRejection,\n transactionIsClosedRejection,\n} from './throw-if-closed.ts';\nimport {WriteImplBase, deleteSentinel} from './write-impl-base.ts';\n\nconst RELAXED = {durability: 'relaxed'} as const;\nconst OBJECT_STORE = 'chunks';\n\nexport class IDBStore implements Store {\n #db: Promise<IDBDatabase>;\n #closed = false;\n #idbDeleted = false;\n\n constructor(name: string) {\n this.#db = openDatabase(name);\n }\n\n read(): Promise<Read> {\n if (this.#closed) {\n return storeIsClosedRejection();\n }\n return this.#withReopen(readImpl);\n }\n\n write(): Promise<Write> {\n if (this.#closed) {\n return storeIsClosedRejection();\n }\n return this.#withReopen(writeImpl);\n }\n\n async close(): Promise<void> {\n if (!this.#idbDeleted) {\n const db = await this.#db;\n db.close();\n }\n this.#closed = true;\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n\n async #withReopen<R>(fn: (db: IDBDatabase) => R): Promise<R> {\n // Tries to reopen an IndexedDB, and rejects if the database needs\n // upgrading (is missing for whatever reason).\n const reopenExistingDB = async (name: string): Promise<IDBDatabase> => {\n const {promise, resolve, reject} = resolver<IDBDatabase>();\n const req = indexedDB.open(name);\n\n req.onupgradeneeded = () => {\n const tx = req.transaction;\n assertNotNull(tx);\n tx.abort();\n this.#idbDeleted = true;\n reject(\n new IDBNotFoundError(\n `Expected IndexedDB not found: ${name}. This likely means that the user deleted IndexedDB instances while the app was running. This is non-fatal. The app will continue running in memory until reload.`,\n ),\n );\n };\n\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n\n const db = await promise;\n db.onversionchange = () => db.close();\n return db;\n };\n\n // We abstract on `readImpl` to work around an issue in Safari. Safari does\n // not allow any microtask between a transaction is created until it is\n // first used. We used to use `await read()` here instead of `await\n // this._db` but then there is a microtask between the creation of the\n // transaction and the return of this function. By doing `await this._db`\n // here we only await the db and no await is involved with the transaction.\n // See https://github.com/jakearchibald/idb-keyval/commit/1af0a00b1a70a678d2f9cf5e74c55a22e57324c5#r55989916\n const db = await this.#db;\n\n try {\n return fn(db);\n } catch (e: unknown) {\n if (!this.#closed && e instanceof DOMException) {\n if (e.name === 'InvalidStateError') {\n this.#db = reopenExistingDB(db.name);\n const reopened = await this.#db;\n return fn(reopened);\n } else if (e.name === 'NotFoundError') {\n // This edge-case can happen if the db has been deleted and the\n // user/developer has DevTools open in certain browsers.\n // See discussion at https://github.com/rocicorp/replicache-internal/pull/216\n this.#idbDeleted = true;\n mustGetBrowserGlobal('indexedDB').deleteDatabase(db.name);\n throw new IDBNotFoundError(\n `Expected IndexedDB ${db.name} missing object store. Deleting db. This is non-fatal, the app will continue working in memory until it is reloaded.`,\n );\n }\n }\n throw e;\n }\n }\n}\n\nclass ReadImpl implements Read {\n readonly #tx: IDBTransaction;\n #closed = false;\n\n constructor(tx: IDBTransaction) {\n this.#tx = tx;\n }\n\n has(key: string): Promise<boolean> {\n if (this.#closed) {\n return transactionIsClosedRejection();\n }\n return new Promise((resolve, reject) => {\n const req = objectStore(this.#tx).count(key);\n req.onsuccess = () => resolve(req.result > 0);\n req.onerror = () => reject(req.error);\n });\n }\n\n get(key: string): Promise<FrozenJSONValue | undefined> {\n if (this.#closed) {\n return transactionIsClosedRejection();\n }\n return new Promise((resolve, reject) => {\n const req = objectStore(this.#tx).get(key);\n req.onsuccess = () => resolve(deepFreezeAllowUndefined(req.result));\n req.onerror = () => reject(req.error);\n });\n }\n\n release(): void {\n this.#closed = true;\n // Do nothing. We rely on IDB locking.\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n}\n\nclass WriteImpl extends WriteImplBase {\n readonly #tx: IDBTransaction;\n #closed = false;\n\n constructor(tx: IDBTransaction) {\n super(new ReadImpl(tx));\n this.#tx = tx;\n }\n\n commit(): Promise<void> {\n if (this.#closed) {\n return transactionIsClosedRejection();\n }\n if (this._pending.size === 0) {\n return promiseVoid;\n }\n\n return new Promise((resolve, reject) => {\n const tx = this.#tx;\n const store = objectStore(tx);\n for (const [key, val] of this._pending) {\n if (val === deleteSentinel) {\n store.delete(key);\n } else {\n store.put(val, key);\n }\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n }\n\n release(): void {\n // We rely on IDB locking so no need to do anything here.\n this.#closed = true;\n super.release();\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n}\n\nfunction writeImpl(db: IDBDatabase): Write {\n const tx = db.transaction(OBJECT_STORE, 'readwrite', RELAXED);\n return new WriteImpl(tx);\n}\n\nfunction readImpl(db: IDBDatabase): Read {\n const tx = db.transaction(OBJECT_STORE, 'readonly');\n return new ReadImpl(tx);\n}\n\nfunction objectStore(tx: IDBTransaction): IDBObjectStore {\n return tx.objectStore(OBJECT_STORE);\n}\n\nfunction openDatabase(name: string): Promise<IDBDatabase> {\n const idb = mustGetBrowserGlobal('indexedDB');\n return new Promise((resolve, reject) => {\n const req = idb.open(name);\n req.onupgradeneeded = () => {\n req.result.createObjectStore(OBJECT_STORE);\n };\n req.onsuccess = () => {\n const db = req.result;\n // Another tab/process wants to modify the db, so release it.\n db.onversionchange = () => db.close();\n resolve(db);\n };\n req.onerror = () => reject(req.error);\n });\n}\n\n/**\n * This error is thrown when we detect that the IndexedDB has been removed. This\n * does not normally happen but can happen during development if the user has\n * DevTools open and deletes the IndexedDB from there.\n */\nexport class IDBNotFoundError extends Error {\n name = 'IDBNotFoundError';\n}\n", "// Helpers for some objects from the browser environment. These are wrapped in\n// functions because Replicache runs in environments that do not have these\n// objects (such as Web Workers, Deno etc).\n\ntype GlobalThis = typeof globalThis;\n\nconst overrides = new Map<keyof GlobalThis, GlobalThis[keyof GlobalThis]>();\n\nexport function overrideBrowserGlobal<T extends keyof GlobalThis>(\n name: T,\n value: GlobalThis[T],\n) {\n overrides.set(name, value);\n}\n\nexport function clearBrowserOverrides() {\n overrides.clear();\n}\n\nexport function getBrowserGlobal<T extends keyof GlobalThis>(\n name: T,\n): GlobalThis[T] | undefined {\n if (overrides.has(name)) {\n return overrides.get(name);\n }\n return globalThis[name];\n}\n\n/**\n * Returns the global method with the given name, bound to the global object.\n * This is important because some methods (e.g. `requestAnimationFrame`) are not\n * bound to the global object by default.\n *\n * If you end up using {@linkcode getBrowserGlobal} instead in a case like this:\n *\n * ```js\n * this.#raf = getBrowserGlobal('requestAnimationFrame') ?? rafFallback;\n * ...\n * this.#raf(() => ...);\n * ```\n *\n * You will end up with `Uncaught TypeError: Illegal invocation` because `this`\n * is not bound to the global object\n */\nexport function getBrowserGlobalMethod<T extends keyof GlobalThis>(\n name: T,\n): GlobalThis[T] | undefined {\n return getBrowserGlobal(name)?.bind(globalThis);\n}\n\nexport function mustGetBrowserGlobal<T extends keyof GlobalThis>(\n name: T,\n): GlobalThis[T] {\n const r = getBrowserGlobal(name);\n if (r === undefined) {\n throw new Error(\n `Unsupported JavaScript environment: Could not find ${name}.`,\n );\n }\n return r;\n}\n", "export const promiseTrue = Promise.resolve(true as const);\nexport const promiseFalse = Promise.resolve(false as const);\nexport const promiseUndefined = Promise.resolve(undefined);\nexport const promiseVoid = Promise.resolve();\n\n/**\n * A promise that never resolves.\n */\nexport const promiseNever = new Promise<never>(() => {});\n", "function storeError(): Error {\n return new Error('Store is closed');\n}\n\nfunction transactionError(): Error {\n return new Error('Transaction is closed');\n}\n\nexport function throwIfStoreClosed(store: {readonly closed: boolean}): void {\n if (store.closed) {\n throw storeError();\n }\n}\n\nexport function throwIfTransactionClosed(transaction: {\n readonly closed: boolean;\n}): void {\n if (transaction.closed) {\n throw transactionError();\n }\n}\n\nexport function transactionIsClosedRejection() {\n return Promise.reject(transactionError());\n}\n\nexport function maybeTransactionIsClosedRejection(transaction: {\n readonly closed: boolean;\n}): Promise<never> | undefined {\n return transaction.closed ? transactionIsClosedRejection() : undefined;\n}\n\nexport function storeIsClosedRejection() {\n return Promise.reject(storeError());\n}\n", "import type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {\n promiseFalse,\n promiseTrue,\n promiseVoid,\n} from '../../../shared/src/resolved-promises.ts';\nimport {\n type FrozenJSONValue,\n deepFreeze,\n deepFreezeAllowUndefined,\n} from '../frozen-json.ts';\nimport type {Read} from './store.ts';\nimport {\n maybeTransactionIsClosedRejection,\n transactionIsClosedRejection,\n} from './throw-if-closed.ts';\n\nexport const deleteSentinel = Symbol();\ntype DeleteSentinel = typeof deleteSentinel;\n\nexport class WriteImplBase {\n protected readonly _pending: Map<string, FrozenJSONValue | DeleteSentinel> =\n new Map();\n readonly #read: Read;\n\n constructor(read: Read) {\n this.#read = read;\n }\n\n has(key: string): Promise<boolean> {\n if (this.#read.closed) {\n return transactionIsClosedRejection();\n }\n switch (this._pending.get(key)) {\n case undefined:\n return this.#read.has(key);\n case deleteSentinel:\n return promiseFalse;\n default:\n return promiseTrue;\n }\n }\n\n async get(key: string): Promise<FrozenJSONValue | undefined> {\n if (this.#read.closed) {\n return transactionIsClosedRejection();\n }\n const v = this._pending.get(key);\n switch (v) {\n case deleteSentinel:\n return undefined;\n case undefined: {\n const v = await this.#read.get(key);\n return deepFreezeAllowUndefined(v);\n }\n default:\n return v;\n }\n }\n\n put(key: string, value: ReadonlyJSONValue) {\n return (\n maybeTransactionIsClosedRejection(this.#read) ??\n (this._pending.set(key, deepFreeze(value)), promiseVoid)\n );\n }\n\n del(key: string): Promise<void> {\n return (\n maybeTransactionIsClosedRejection(this.#read) ??\n (this._pending.set(key, deleteSentinel), promiseVoid)\n );\n }\n\n release(): void {\n this.#read.release();\n }\n\n get closed(): boolean {\n return this.#read.closed;\n }\n}\n", "type Navigator = {\n onLine: boolean;\n userAgent: string;\n // add more as needed\n};\n\nconst localNavigator: Navigator | undefined =\n typeof navigator !== 'undefined' ? navigator : undefined;\n\nexport {localNavigator as navigator};\n", "import {RWLock} from '@rocicorp/lock';\nimport {promiseVoid} from '../../../shared/src/resolved-promises.ts';\nimport type {FrozenJSONValue} from '../frozen-json.ts';\nimport {ReadImpl} from './read-impl.ts';\nimport type {Read, Store, Write} from './store.ts';\nimport {throwIfStoreClosed} from './throw-if-closed.ts';\nimport {WriteImpl} from './write-impl.ts';\n\ntype StorageMap = Map<string, FrozenJSONValue>;\n\ntype Value = {readonly lock: RWLock; readonly map: StorageMap};\n\nconst stores = new Map<string, Value>();\n\nexport function clearAllNamedMemStoresForTesting(): void {\n stores.clear();\n}\n\nexport function dropMemStore(name: string): Promise<void> {\n stores.delete(name);\n return promiseVoid;\n}\n\nexport function hasMemStore(name: string): boolean {\n return stores.has(name);\n}\n\n/**\n * A named in-memory Store implementation.\n *\n * Two (or more) named memory stores with the same name will share the same\n * underlying storage. They will also share the same read/write locks, so that\n * only one write transaction can be running at the same time.\n *\n * @experimental This class is experimental and might be removed or changed\n * in the future without following semver versioning. Please be cautious.\n */\nexport class MemStore implements Store {\n readonly #map: StorageMap;\n readonly #rwLock: RWLock;\n #closed = false;\n\n constructor(name: string) {\n const entry = stores.get(name);\n let lock: RWLock;\n let map: StorageMap;\n if (entry) {\n ({lock, map} = entry);\n } else {\n lock = new RWLock();\n map = new Map();\n stores.set(name, {lock, map});\n }\n this.#rwLock = lock;\n this.#map = map;\n }\n\n async read(): Promise<Read> {\n throwIfStoreClosed(this);\n const release = await this.#rwLock.read();\n return new ReadImpl(this.#map, release);\n }\n\n async write(): Promise<Write> {\n throwIfStoreClosed(this);\n const release = await this.#rwLock.write();\n return new WriteImpl(this.#map, release);\n }\n\n close(): Promise<void> {\n this.#closed = true;\n return promiseVoid;\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n}\n", "import type {FrozenJSONValue} from '../frozen-json.ts';\nimport type {Read} from './store.ts';\nimport {maybeTransactionIsClosedRejection} from './throw-if-closed.ts';\n\nexport class ReadImpl implements Read {\n readonly #map: Map<string, FrozenJSONValue>;\n readonly #release: () => void;\n #closed = false;\n\n constructor(map: Map<string, FrozenJSONValue>, release: () => void) {\n this.#map = map;\n this.#release = release;\n }\n\n release() {\n this.#release();\n this.#closed = true;\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n\n has(key: string): Promise<boolean> {\n return (\n maybeTransactionIsClosedRejection(this) ??\n Promise.resolve(this.#map.has(key))\n );\n }\n\n get(key: string): Promise<FrozenJSONValue | undefined> {\n return (\n maybeTransactionIsClosedRejection(this) ??\n Promise.resolve(this.#map.get(key))\n );\n }\n}\n", "import {promiseVoid} from '../../../shared/src/resolved-promises.ts';\nimport type {FrozenJSONValue} from '../frozen-json.ts';\nimport {ReadImpl} from './read-impl.ts';\nimport type {Write} from './store.ts';\nimport {transactionIsClosedRejection} from './throw-if-closed.ts';\nimport {deleteSentinel, WriteImplBase} from './write-impl-base.ts';\n\nexport class WriteImpl extends WriteImplBase implements Write {\n readonly #map: Map<string, FrozenJSONValue>;\n\n constructor(map: Map<string, FrozenJSONValue>, release: () => void) {\n super(new ReadImpl(map, release));\n this.#map = map;\n }\n\n commit(): Promise<void> {\n if (this.closed) {\n return transactionIsClosedRejection();\n }\n\n // HOT. Do not allocate entry tuple and destructure.\n this._pending.forEach((value, key) => {\n if (value === deleteSentinel) {\n this.#map.delete(key);\n } else {\n this.#map.set(key, value);\n }\n });\n this._pending.clear();\n this.release();\n return promiseVoid;\n }\n}\n", "import type {LogContext} from '@rocicorp/logger';\nimport {navigator} from '../../../shared/src/navigator.ts';\nimport {promiseVoid} from '../../../shared/src/resolved-promises.ts';\nimport {IDBStore} from './idb-store.ts';\nimport {MemStore, dropMemStore} from './mem-store.ts';\nimport type {Read, Store, Write} from './store.ts';\n\n/**\n * This store uses an {@link IDBStore} by default. If the {@link IDBStore} fails\n * to open the DB with an exception that matches\n * {@link isFirefoxPrivateBrowsingError} we switch out the implementation to use\n * a {@link MemStore} instead.\n *\n * The reason this is relatively complicated is that when {@link IDBStore} is\n * created, it calls `openDatabase` synchronously, but that returns a `Promise`\n * that will reject in the case of Firefox private browsing. We don't await this\n * promise until we call `read` or `write` so we cannot do the switch until\n * then.\n */\n\nexport class IDBStoreWithMemFallback implements Store {\n readonly #lc: LogContext;\n readonly #name: string;\n #store: Store;\n constructor(lc: LogContext, name: string) {\n this.#lc = lc;\n this.#name = name;\n this.#store = new IDBStore(name);\n }\n\n read(): Promise<Read> {\n return this.#withBrainTransplant(s => s.read());\n }\n\n write(): Promise<Write> {\n return this.#withBrainTransplant(s => s.write());\n }\n\n async #withBrainTransplant<T extends Read>(\n f: (store: Store) => Promise<T>,\n ): Promise<T> {\n try {\n return await f(this.#store);\n } catch (e) {\n if (isFirefoxPrivateBrowsingError(e)) {\n // It is possible that we end up with multiple pending read/write and\n // they all reject. Make sure we only replace the implementation once.\n if (this.#store instanceof IDBStore) {\n this.#lc.info?.(\n 'Switching to MemStore because of Firefox private browsing error',\n );\n this.#store = new MemStore(this.#name);\n }\n return f(this.#store);\n }\n throw e;\n }\n }\n\n close(): Promise<void> {\n return this.#store.close();\n }\n\n get closed(): boolean {\n return this.#store.closed;\n }\n}\n\nfunction isFirefoxPrivateBrowsingError(e: unknown): e is DOMException {\n return (\n isFirefox() &&\n e instanceof DOMException &&\n e.name === 'InvalidStateError' &&\n e.message ===\n 'A mutation operation was attempted on a database that did not allow mutations.'\n );\n}\n\nfunction isFirefox(): boolean {\n return navigator?.userAgent?.includes('Firefox') ?? false;\n}\n\nexport function newIDBStoreWithMemFallback(\n lc: LogContext,\n name: string,\n): Store {\n if (isFirefox()) {\n return new IDBStoreWithMemFallback(lc, name);\n }\n return new IDBStore(name);\n}\n\nexport function dropIDBStoreWithMemFallback(name: string): Promise<void> {\n if (!isFirefox()) {\n return dropIDBStore(name);\n }\n try {\n return dropIDBStore(name);\n } catch (e) {\n if (isFirefoxPrivateBrowsingError(e)) {\n return dropMemStore(name);\n }\n }\n return promiseVoid;\n}\n\nfunction dropIDBStore(name: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.deleteDatabase(name);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n}\n", "import {randomUint64} from '../../../shared/src/random-uint64.ts';\nimport {dropIDBStoreWithMemFallback} from '../kv/idb-store-with-mem-fallback.ts';\n\nconst IDB_DATABASES_VERSION = 0;\nconst IDB_DATABASES_DB_NAME = 'replicache-dbs-v' + IDB_DATABASES_VERSION;\n\nlet testNamespace = '';\n\n/** Namespace db name in test to isolate tests' indexeddb state. */\nexport function setupForTest(): void {\n testNamespace = randomUint64().toString(36);\n}\n\nexport function teardownForTest(): Promise<void> {\n const idbDatabasesDBName = getIDBDatabasesDBName();\n testNamespace = '';\n return dropIDBStoreWithMemFallback(idbDatabasesDBName);\n}\n\nexport function getIDBDatabasesDBName(): string {\n return testNamespace + IDB_DATABASES_DB_NAME;\n}\n", "import {\n assert,\n assertNumber,\n assertObject,\n assertString,\n} from '../../../shared/src/asserts.ts';\nimport {deepFreeze} from '../frozen-json.ts';\nimport type {CreateStore, Read, Store} from '../kv/store.ts';\nimport {withRead, withWrite} from '../with-transactions.ts';\nimport {getIDBDatabasesDBName} from './idb-databases-store-db-name.ts';\nimport {makeClientID} from './make-client-id.ts';\n\nconst DBS_KEY = 'dbs';\nconst PROFILE_ID_KEY = 'profileId';\n\n// TODO: make an opaque type\nexport type IndexedDBName = string;\n\nexport type IndexedDBDatabase = {\n readonly name: IndexedDBName;\n readonly replicacheName: string;\n readonly replicacheFormatVersion: number;\n readonly schemaVersion: string;\n readonly lastOpenedTimestampMS?: number;\n};\n\nexport type IndexedDBDatabaseRecord = {\n readonly [name: IndexedDBName]: IndexedDBDatabase;\n};\n\nfunction assertIndexedDBDatabaseRecord(\n value: unknown,\n): asserts value is IndexedDBDatabaseRecord {\n assertObject(value);\n for (const [name, db] of Object.entries(value)) {\n assertString(name);\n assertIndexedDBDatabase(db);\n assert(name === db.name);\n }\n}\n\nfunction assertIndexedDBDatabase(\n value: unknown,\n): asserts value is IndexedDBDatabase {\n assertObject(value);\n assertString(value.name);\n assertString(value.replicacheName);\n assertNumber(value.replicacheFormatVersion);\n assertString(value.schemaVersion);\n if (value.lastOpenedTimestampMS !== undefined) {\n assertNumber(value.lastOpenedTimestampMS);\n }\n}\n\nexport class IDBDatabasesStore {\n readonly #kvStore: Store;\n\n constructor(createKVStore: CreateStore) {\n this.#kvStore = createKVStore(getIDBDatabasesDBName());\n }\n\n putDatabase(db: IndexedDBDatabase): Promise<IndexedDBDatabaseRecord> {\n return this.#putDatabase({...db, lastOpenedTimestampMS: Date.now()});\n }\n\n putDatabaseForTesting(\n db: IndexedDBDatabase,\n ): Promise<IndexedDBDatabaseRecord> {\n return this.#putDatabase(db);\n }\n\n #putDatabase(db: IndexedDBDatabase): Promise<IndexedDBDatabaseRecord> {\n return withWrite(this.#kvStore, async write => {\n const oldDbRecord = await getDatabases(write);\n const dbRecord = {\n ...oldDbRecord,\n [db.name]: db,\n };\n await write.put(DBS_KEY, dbRecord);\n return dbRecord;\n });\n }\n\n clearDatabases(): Promise<void> {\n return withWrite(this.#kvStore, write => write.del(DBS_KEY));\n }\n\n deleteDatabases(names: Iterable<IndexedDBName>): Promise<void> {\n return withWrite(this.#kvStore, async write => {\n const oldDbRecord = await getDatabases(write);\n const dbRecord = {\n ...oldDbRecord,\n };\n for (const name of names) {\n delete dbRecord[name];\n }\n await write.put(DBS_KEY, dbRecord);\n });\n }\n\n getDatabases(): Promise<IndexedDBDatabaseRecord> {\n return withRead(this.#kvStore, getDatabases);\n }\n\n close(): Promise<void> {\n return this.#kvStore.close();\n }\n\n getProfileID(): Promise<string> {\n return withWrite(this.#kvStore, async write => {\n let profileId = await write.get(PROFILE_ID_KEY);\n if (profileId === undefined) {\n // Profile id is 'p' followed by a random number.\n profileId = `p${makeClientID()}`;\n await write.put(PROFILE_ID_KEY, profileId);\n }\n assertString(profileId);\n return profileId;\n });\n }\n}\n\nasync function getDatabases(read: Read): Promise<IndexedDBDatabaseRecord> {\n let dbRecord = await read.get(DBS_KEY);\n if (!dbRecord) {\n dbRecord = deepFreeze({});\n }\n assertIndexedDBDatabaseRecord(dbRecord);\n return dbRecord;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["v", "db", "ReadImpl", "WriteImpl", "ReadImpl", "ReadImpl", "WriteImpl"]
|
|
7
|
-
}
|