From e0c3f4b647d5d271d42134336f04ad58434b2223 Mon Sep 17 00:00:00 2001 From: Marc Grau Benaiges Date: Fri, 3 Apr 2020 12:24:26 +0200 Subject: [PATCH] Basic support for Web Workers (#468) --- moor/lib/src/web/storage.dart | 37 +++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/moor/lib/src/web/storage.dart b/moor/lib/src/web/storage.dart index 3a886ff1..855a198a 100644 --- a/moor/lib/src/web/storage.dart +++ b/moor/lib/src/web/storage.dart @@ -39,20 +39,32 @@ abstract class MoorWebStorage { /// However, older browsers might not support IndexedDB. @experimental factory MoorWebStorage.indexedDb(String name, - {bool migrateFromLocalStorage}) = _IndexedDbStorage; + {bool migrateFromLocalStorage, bool inWebWorker}) = _IndexedDbStorage; /// Uses [MoorWebStorage.indexedDb] if the current browser supports it. /// Otherwise, falls back to the local storage based implementation. - factory MoorWebStorage.indexedDbIfSupported(String name) { - return supportsIndexedDb - ? MoorWebStorage.indexedDb(name) + factory MoorWebStorage.indexedDbIfSupported(String name, + {bool inWebWorker = false}) { + return supportsIndexedDb(inWebWorker: inWebWorker) + ? MoorWebStorage.indexedDb(name, inWebWorker: inWebWorker) : MoorWebStorage(name); } /// Attempts to check whether the current browser supports the /// [MoorWebStorage.indexedDb] storage implementation. - static bool get supportsIndexedDb => - IdbFactory.supported && context.hasProperty('FileReader'); + static bool supportsIndexedDb({bool inWebWorker = false}) { + 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 { @@ -123,16 +135,21 @@ class _IndexedDbStorage implements MoorWebStorage { final String name; final bool migrateFromLocalStorage; + final bool inWebWorker; Database _database; - _IndexedDbStorage(this.name, {this.migrateFromLocalStorage = true}); + _IndexedDbStorage(this.name, + {this.migrateFromLocalStorage = true, this.inWebWorker = false}); @override Future open() async { var wasCreated = false; - _database = await window.indexedDB.open( + final indexedDb = + inWebWorker ? WorkerGlobalScope.instance.indexedDB : window.indexedDB; + + _database = await indexedDb.open( _objectStoreName, version: 1, onUpgradeNeeded: (event) { @@ -159,7 +176,7 @@ class _IndexedDbStorage implements MoorWebStorage { @override Future store(Uint8List data) async { final transaction = - _database.transactionStore(_objectStoreName, 'readwrite'); + _database.transactionStore(_objectStoreName, 'readwrite'); final store = transaction.objectStore(_objectStoreName); await store.put(Blob([data]), name); @@ -169,7 +186,7 @@ class _IndexedDbStorage implements MoorWebStorage { @override Future restore() async { final transaction = - _database.transactionStore(_objectStoreName, 'readonly'); + _database.transactionStore(_objectStoreName, 'readonly'); final store = transaction.objectStore(_objectStoreName); final result = await store.getObject(name) as Blob /*?*/;