Support lock-based OPFS implementation in worker

This commit is contained in:
Simon Binder 2023-05-31 18:07:09 +02:00
parent 0060e0ea44
commit d79633ee6b
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
4 changed files with 14 additions and 6 deletions

View File

@ -88,8 +88,11 @@ Future<WasmDatabaseResult> openWasmDatabase({
await workerMessages.next as DedicatedWorkerCompatibilityResult; await workerMessages.next as DedicatedWorkerCompatibilityResult;
missingFeatures.addAll(status.missingFeatures); missingFeatures.addAll(status.missingFeatures);
if (status.canAccessOpfs && status.supportsSharedArrayBuffers) { if (status.supportsNestedWorkers &&
// todo send second worker to first one status.canAccessOpfs &&
status.supportsSharedArrayBuffers) {
return connect(WasmStorageImplementation.opfsLocks,
(msg) => msg.sendToWorker(dedicatedWorker));
} else if (status.supportsIndexedDb) { } else if (status.supportsIndexedDb) {
return connect(WasmStorageImplementation.unsafeIndexedDb, return connect(WasmStorageImplementation.unsafeIndexedDb,
(msg) => msg.sendToWorker(dedicatedWorker)); (msg) => msg.sendToWorker(dedicatedWorker));
@ -105,6 +108,4 @@ Future<WasmDatabaseResult> openWasmDatabase({
missingFeatures, missingFeatures,
); );
} }
throw 'todo';
} }

View File

@ -35,6 +35,7 @@ class DedicatedDriftWorker {
final supportsIndexedDb = await checkIndexedDbSupport(); final supportsIndexedDb = await checkIndexedDbSupport();
DedicatedWorkerCompatibilityResult( DedicatedWorkerCompatibilityResult(
supportsNestedWorkers: hasProperty(globalThis, 'Worker'),
canAccessOpfs: supportsOpfs, canAccessOpfs: supportsOpfs,
supportsIndexedDb: supportsIndexedDb, supportsIndexedDb: supportsIndexedDb,
supportsSharedArrayBuffers: supportsSharedArrayBuffers:
@ -64,7 +65,9 @@ class DedicatedDriftWorker {
}); });
server.serve(message.port.channel()); server.serve(message.port.channel());
break; case StartFileSystemServer(sqlite3Options: final options):
final worker = await VfsWorker.create(options);
await worker.start();
default: default:
break; break;
} }

View File

@ -173,11 +173,13 @@ final class DedicatedWorkerCompatibilityResult
extends WasmInitializationMessage { extends WasmInitializationMessage {
static const type = 'DedicatedWorkerCompatibilityResult'; static const type = 'DedicatedWorkerCompatibilityResult';
final bool supportsNestedWorkers;
final bool canAccessOpfs; final bool canAccessOpfs;
final bool supportsSharedArrayBuffers; final bool supportsSharedArrayBuffers;
final bool supportsIndexedDb; final bool supportsIndexedDb;
DedicatedWorkerCompatibilityResult({ DedicatedWorkerCompatibilityResult({
required this.supportsNestedWorkers,
required this.canAccessOpfs, required this.canAccessOpfs,
required this.supportsSharedArrayBuffers, required this.supportsSharedArrayBuffers,
required this.supportsIndexedDb, required this.supportsIndexedDb,
@ -185,6 +187,7 @@ final class DedicatedWorkerCompatibilityResult
factory DedicatedWorkerCompatibilityResult.fromJsPayload(Object payload) { factory DedicatedWorkerCompatibilityResult.fromJsPayload(Object payload) {
return DedicatedWorkerCompatibilityResult( return DedicatedWorkerCompatibilityResult(
supportsNestedWorkers: getProperty(payload, 'supportsNestedWorkers'),
canAccessOpfs: getProperty(payload, 'canAccessOpfs'), canAccessOpfs: getProperty(payload, 'canAccessOpfs'),
supportsSharedArrayBuffers: supportsSharedArrayBuffers:
getProperty(payload, 'supportsSharedArrayBuffers'), getProperty(payload, 'supportsSharedArrayBuffers'),
@ -195,6 +198,8 @@ final class DedicatedWorkerCompatibilityResult
@override @override
void _send(_PostMessage sender) { void _send(_PostMessage sender) {
final object = newObject<Object>(); final object = newObject<Object>();
setProperty(object, 'supportsNestedWorkers', supportsNestedWorkers);
setProperty(object, 'canAccessOpfs', canAccessOpfs); setProperty(object, 'canAccessOpfs', canAccessOpfs);
setProperty(object, 'supportsIndexedDb', supportsIndexedDb); setProperty(object, 'supportsIndexedDb', supportsIndexedDb);
setProperty( setProperty(

View File

@ -6,7 +6,6 @@ import 'package:drift/wasm.dart';
import 'package:js/js_util.dart'; import 'package:js/js_util.dart';
import 'protocol.dart'; import 'protocol.dart';
import 'shared.dart';
class SharedDriftWorker { class SharedDriftWorker {
final SharedWorkerGlobalScope self; final SharedWorkerGlobalScope self;