diff --git a/moor/lib/src/web/storage.dart b/moor/lib/src/web/storage.dart index 3a886ff1..5fd9fa9b 100644 --- a/moor/lib/src/web/storage.dart +++ b/moor/lib/src/web/storage.dart @@ -36,23 +36,39 @@ abstract class MoorWebStorage { /// applications that never used the local storage implementation as a small /// performance improvement. /// + /// When the [inWebWorker] parameter (defaults to false) is set, + /// the implementation will use [WorkerGlobalScope] instead of [window] as + /// it isn't accessible from the worker. + /// /// 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 +139,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) {