rxdb
Version:
A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/
134 lines (129 loc) • 4.14 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.awaitCollectionsHaveEqualState = awaitCollectionsHaveEqualState;
exports.clearAllLocalIndexedDB = clearAllLocalIndexedDB;
exports.clearAllLocalOPFS = clearAllLocalOPFS;
exports.clearAllLocalStorage = clearAllLocalStorage;
exports.ensureCollectionsHaveEqualState = ensureCollectionsHaveEqualState;
exports.ensureReplicationHasNoErrors = ensureReplicationHasNoErrors;
exports.testMultipleTimes = testMultipleTimes;
var _assert = _interopRequireDefault(require("assert"));
var _index = require("../utils/index.js");
function testMultipleTimes(times, title, test) {
new Array(times).fill(0).forEach(() => {
it(title, test);
});
}
async function ensureCollectionsHaveEqualState(c1, c2, logContext) {
await (0, _index.requestIdlePromise)();
var getJson = async collection => {
var docs = await collection.find().exec();
return docs.map(d => d.toJSON());
};
var json1 = await getJson(c1);
var json2 = await getJson(c2);
try {
_assert.default.deepStrictEqual(json1, json2);
} catch (err) {
console.error('ensureCollectionsHaveEqualState(' + logContext + ') states not equal (c1:' + c1.name + ', c2:' + c2.name + '):');
console.dir({
c1: json1,
c2: json2
});
console.log('----------');
throw err;
}
}
/**
* Waits until the collections have the equal state.
*/
async function awaitCollectionsHaveEqualState(c1, c2, logContext, timeout = 8000) {
var i = 0;
var startTime = Date.now();
while (true) {
i++;
try {
await ensureCollectionsHaveEqualState(c1, c2, logContext);
return;
} catch (err) {
if (Date.now() - startTime > timeout) {
throw err;
} else {
await (0, _index.promiseWait)(50 * i);
}
}
}
}
/**
* Deletes all locally stored IndexedDB databases.
* Noop if IndexedDB is not available (e.g. in Node.js)
* or if the .databases() method is not supported.
*/
async function clearAllLocalIndexedDB() {
if (typeof indexedDB === 'undefined' || typeof indexedDB.databases !== 'function') {
return;
}
var databases = await indexedDB.databases();
await Promise.all(databases.filter(db => !!db.name).map(db => {
return new Promise((resolve, reject) => {
var req = indexedDB.deleteDatabase(db.name);
req.onsuccess = () => resolve();
req.onerror = () => reject(req.error);
});
}));
}
/**
* Deletes all files and directories stored in the
* Origin Private File System (OPFS).
* Noop if OPFS is not available (e.g. in Node.js).
*/
async function clearAllLocalOPFS(maxRetries = 20, delayMs = 200) {
if (typeof navigator === 'undefined' || !navigator.storage || typeof navigator.storage.getDirectory !== 'function') {
return;
}
var root = await navigator.storage.getDirectory();
// @ts-ignore entries() is not in all TS lib definitions
for await (var [name] of root.entries()) {
for (var attempt = 0; attempt < maxRetries; attempt++) {
try {
await root.removeEntry(name, {
recursive: true
});
break;
} catch (err) {
if (err?.name === 'NoModificationAllowedError' && attempt < maxRetries - 1) {
await new Promise(resolve => setTimeout(resolve, delayMs));
} else {
throw err;
}
}
}
}
}
/**
* Clears all localStorage data.
* Noop if localStorage is not available (e.g. in Node.js).
*/
async function clearAllLocalStorage() {
if (typeof localStorage === 'undefined' || typeof localStorage.clear !== 'function') {
return;
}
localStorage.clear();
}
function ensureReplicationHasNoErrors(replicationState) {
/**
* We do not have to unsubscribe because the observable will cancel anyway.
*/
replicationState.error$.subscribe(err => {
console.error('ensureReplicationHasNoErrors() has error:');
console.log(err);
if (err?.parameters?.errors) {
throw err.parameters.errors[0];
}
throw err;
});
}
//# sourceMappingURL=test-util.js.map