@@ -182,9 +182,12 @@ final class _ClientConnection extends ProtocolChannel
182182 try {
183183 database =
184184 _runner.findDatabase (request.databaseName, request.storageMode);
185- await database.opened;
185+
186+ await (request.onlyOpenVfs ? database.vfs : database.opened);
187+
186188 connectionDatabase = _ConnectionDatabase (database);
187189 _openedDatabases.add (connectionDatabase);
190+
188191 return SimpleSuccessResponse (
189192 response: database.id.toJS, requestId: request.requestId);
190193 } catch (e) {
@@ -242,22 +245,20 @@ final class _ClientConnection extends ProtocolChannel
242245 return SimpleSuccessResponse (
243246 response: null , requestId: request.requestId);
244247 case FileSystemFlushRequest ():
245- if (database? .database.vfs case IndexedDbFileSystem idb) {
248+ if (await database? .database.vfs case IndexedDbFileSystem idb) {
246249 await idb.flush ();
247250 }
248251
249252 return SimpleSuccessResponse (
250253 response: null , requestId: request.requestId);
251254 case FileSystemExistsQuery (: final fsType):
252- await database! .database.opened;
253- final vfs = database.database.vfs! ;
255+ final vfs = await database! .database.vfs;
254256 final exists = vfs.xAccess (fsType.pathInVfs, 0 ) == 1 ;
255257
256258 return SimpleSuccessResponse (
257259 response: exists.toJS, requestId: request.requestId);
258260 case FileSystemAccess (: final buffer, : final fsType):
259- await database! .database.opened;
260- final vfs = database.database.vfs! ;
261+ final vfs = await database! .database.vfs;
261262 final file = vfs
262263 .xOpen (
263264 Sqlite3Filename (fsType.pathInVfs), SqlFlag .SQLITE_OPEN_CREATE )
@@ -321,23 +322,23 @@ final class DatabaseState {
321322 int refCount = 1 ;
322323
323324 Future <WorkerDatabase >? _database;
325+ Future <void >? _openVfs;
326+ VirtualFileSystem ? _resolvedVfs;
324327
325328 /// Runs additional async work, such as flushing the VFS to IndexedDB when
326329 /// the database is closed.
327330 FutureOr <void > Function ()? closeHandler;
328- VirtualFileSystem ? vfs;
329331
330332 DatabaseState (
331333 {required this .id,
332334 required this .runner,
333335 required this .name,
334336 required this .mode});
335337
336- Future <WorkerDatabase > get opened async {
337- final database = _database ?? = Future .sync (() async {
338- final sqlite3 = await runner._sqlite3! ;
339- final vfsName = 'vfs-web-$id ' ;
338+ String get vfsName => 'vfs-web-$id ' ;
340339
340+ Future <VirtualFileSystem > get vfs async {
341+ await (_openVfs ?? = Future .sync (() async {
341342 switch (mode) {
342343 case FileSystemImplementation .opfsLocks:
343344 final options = WasmVfs .createOptions (root: pathForOpfs (name));
@@ -349,22 +350,31 @@ final class DatabaseState {
349350 await EventStreamProviders .messageEvent.forTarget (worker).first;
350351
351352 final wasmVfs =
352- vfs = WasmVfs (workerOptions: options, vfsName: vfsName);
353+ _resolvedVfs = WasmVfs (workerOptions: options, vfsName: vfsName);
353354 closeHandler = wasmVfs.close;
354355 case FileSystemImplementation .opfsShared:
355- final simple = vfs = await SimpleOpfsFileSystem . loadFromStorage (
356- pathForOpfs (name),
357- vfsName: vfsName);
356+ final simple = _resolvedVfs =
357+ await SimpleOpfsFileSystem . loadFromStorage ( pathForOpfs (name),
358+ vfsName: vfsName);
358359 closeHandler = simple.close;
359360 case FileSystemImplementation .indexedDb:
360- final idb = vfs =
361+ final idb = _resolvedVfs =
361362 await IndexedDbFileSystem .open (dbName: name, vfsName: vfsName);
362363 closeHandler = idb.close;
363364 case FileSystemImplementation .inMemory:
364- vfs = InMemoryFileSystem (name: vfsName);
365+ _resolvedVfs = InMemoryFileSystem (name: vfsName);
365366 }
367+ }));
368+
369+ return _resolvedVfs! ;
370+ }
371+
372+ Future <WorkerDatabase > get opened async {
373+ final database = _database ?? = Future .sync (() async {
374+ final sqlite3 = await runner._sqlite3! ;
375+ final fileSystem = await vfs;
366376
367- sqlite3.registerVirtualFileSystem (vfs ! );
377+ sqlite3.registerVirtualFileSystem (fileSystem );
368378 return await runner._controller.openDatabase (
369379 sqlite3,
370380 // We're currently using /database as the in-VFS path. This is because
@@ -391,7 +401,7 @@ final class DatabaseState {
391401 final database = await _database! ;
392402
393403 database.database.dispose ();
394- if (vfs case final vfs? ) {
404+ if (_resolvedVfs case final vfs? ) {
395405 sqlite3.unregisterVirtualFileSystem (vfs);
396406 }
397407
0 commit comments