Basic support for Web Workers (#468)

This commit is contained in:
Marc Grau Benaiges 2020-04-03 12:24:26 +02:00
parent aed9b40c30
commit e0c3f4b647
1 changed files with 27 additions and 10 deletions

View File

@ -39,20 +39,32 @@ abstract class MoorWebStorage {
/// However, older browsers might not support IndexedDB. /// However, older browsers might not support IndexedDB.
@experimental @experimental
factory MoorWebStorage.indexedDb(String name, factory MoorWebStorage.indexedDb(String name,
{bool migrateFromLocalStorage}) = _IndexedDbStorage; {bool migrateFromLocalStorage, bool inWebWorker}) = _IndexedDbStorage;
/// Uses [MoorWebStorage.indexedDb] if the current browser supports it. /// Uses [MoorWebStorage.indexedDb] if the current browser supports it.
/// Otherwise, falls back to the local storage based implementation. /// Otherwise, falls back to the local storage based implementation.
factory MoorWebStorage.indexedDbIfSupported(String name) { factory MoorWebStorage.indexedDbIfSupported(String name,
return supportsIndexedDb {bool inWebWorker = false}) {
? MoorWebStorage.indexedDb(name) return supportsIndexedDb(inWebWorker: inWebWorker)
? MoorWebStorage.indexedDb(name, inWebWorker: inWebWorker)
: MoorWebStorage(name); : MoorWebStorage(name);
} }
/// Attempts to check whether the current browser supports the /// Attempts to check whether the current browser supports the
/// [MoorWebStorage.indexedDb] storage implementation. /// [MoorWebStorage.indexedDb] storage implementation.
static bool get supportsIndexedDb => static bool supportsIndexedDb({bool inWebWorker = false}) {
IdbFactory.supported && context.hasProperty('FileReader'); var isIndexedDbSupported = false;
if (inWebWorker && WorkerGlobalScope.instance.indexedDB != null) {
isIndexedDbSupported = true;
} else {
try {
isIndexedDbSupported = IdbFactory.supported;
} catch (error) {
isIndexedDbSupported = false;
}
}
return isIndexedDbSupported && context.hasProperty('FileReader');
}
} }
abstract class _CustomSchemaVersionSave implements MoorWebStorage { abstract class _CustomSchemaVersionSave implements MoorWebStorage {
@ -123,16 +135,21 @@ class _IndexedDbStorage implements MoorWebStorage {
final String name; final String name;
final bool migrateFromLocalStorage; final bool migrateFromLocalStorage;
final bool inWebWorker;
Database _database; Database _database;
_IndexedDbStorage(this.name, {this.migrateFromLocalStorage = true}); _IndexedDbStorage(this.name,
{this.migrateFromLocalStorage = true, this.inWebWorker = false});
@override @override
Future<void> open() async { Future<void> open() async {
var wasCreated = false; var wasCreated = false;
_database = await window.indexedDB.open( final indexedDb =
inWebWorker ? WorkerGlobalScope.instance.indexedDB : window.indexedDB;
_database = await indexedDb.open(
_objectStoreName, _objectStoreName,
version: 1, version: 1,
onUpgradeNeeded: (event) { onUpgradeNeeded: (event) {