@@ -227,15 +227,19 @@ final class WorkerConnection extends ProtocolChannel {
227227final class DatabaseClient implements WebSqlite {
228228 final Uri workerUri;
229229 final Uri wasmUri;
230+ final DatabaseController _localController;
230231
231232 final Lock _startWorkersLock = Lock ();
232233 bool _startedWorkers = false ;
233234 WorkerConnection ? _connectionToDedicated;
234235 WorkerConnection ? _connectionToShared;
235236 WorkerConnection ? _connectionToDedicatedInShared;
237+
238+ WorkerConnection ? _connectionToLocal;
239+
236240 final Set <MissingBrowserFeature > _missingFeatures = {};
237241
238- DatabaseClient (this .workerUri, this .wasmUri);
242+ DatabaseClient (this .workerUri, this .wasmUri, this ._localController );
239243
240244 Future <void > startWorkers () {
241245 return _startWorkersLock.synchronized (() async {
@@ -291,6 +295,22 @@ final class DatabaseClient implements WebSqlite {
291295 });
292296 }
293297
298+ Future <WorkerConnection > _connectToLocal () async {
299+ return _startWorkersLock.synchronized (() async {
300+ if (_connectionToLocal case final conn? ) {
301+ return conn;
302+ }
303+
304+ final local = Local ();
305+ final (endpoint, channel) = await createChannel ();
306+ WorkerRunner (_localController, environment: local).handleRequests ();
307+ local
308+ .addTopLevelMessage (ConnectRequest (requestId: 0 , endpoint: endpoint));
309+
310+ return _connectionToLocal = WorkerConnection (channel);
311+ });
312+ }
313+
294314 @override
295315 Future <void > deleteDatabase (
296316 {required String name, required StorageMode storage}) async {
@@ -310,6 +330,7 @@ final class DatabaseClient implements WebSqlite {
310330
311331 final existing = < ExistingDatabase > {};
312332 final available = < (StorageMode , AccessMode )> [];
333+ var workersReportedIndexedDbSupport = false ;
313334
314335 if (_connectionToDedicated case final connection? ) {
315336 final response = await connection.sendRequest (
@@ -327,6 +348,8 @@ final class DatabaseClient implements WebSqlite {
327348 if (result.canUseIndexedDb) {
328349 available
329350 .add ((StorageMode .indexedDb, AccessMode .throughDedicatedWorker));
351+
352+ workersReportedIndexedDbSupport = true ;
330353 } else {
331354 _missingFeatures.add (MissingBrowserFeature .indexedDb);
332355 }
@@ -363,6 +386,7 @@ final class DatabaseClient implements WebSqlite {
363386 final result = CompatibilityResult .fromJS (response.response as JSObject );
364387
365388 if (result.canUseIndexedDb) {
389+ workersReportedIndexedDbSupport = true ;
366390 available.add ((StorageMode .indexedDb, AccessMode .throughSharedWorker));
367391 } else {
368392 _missingFeatures.add (MissingBrowserFeature .indexedDb);
@@ -383,6 +407,12 @@ final class DatabaseClient implements WebSqlite {
383407 }
384408 }
385409
410+ available.add ((StorageMode .inMemory, AccessMode .inCurrentContext));
411+ if (workersReportedIndexedDbSupport || await checkIndexedDbSupport ()) {
412+ // If the workers can use IndexedDb, so can we.
413+ available.add ((StorageMode .indexedDb, AccessMode .inCurrentContext));
414+ }
415+
386416 return FeatureDetectionResult (
387417 missingFeatures: _missingFeatures.toList (),
388418 existingDatabases: existing.toList (),
@@ -425,7 +455,8 @@ final class DatabaseClient implements WebSqlite {
425455 connection = _connectionToDedicated! ;
426456 shared = false ;
427457 case AccessMode .inCurrentContext:
428- throw UnimplementedError ('todo: Open database locally' );
458+ connection = await _connectToLocal ();
459+ shared = false ;
429460 }
430461
431462 final response = await connection.sendRequest (
0 commit comments