Merge pull request #469 from marcgraub/develop

Basic support for Web Workers
This commit is contained in:
Simon Binder 2020-04-06 11:21:19 +02:00 committed by GitHub
commit 606d11d589
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 29 additions and 8 deletions

View File

@ -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<void> 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) {