Skip to content

Commit a5e6a96

Browse files
committed
Add methods for exchanging database connections
1 parent eb144be commit a5e6a96

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

packages/sqlite_async/lib/src/web/database.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import 'package:sqlite3/common.dart';
55
import 'package:sqlite3_web/sqlite3_web.dart';
66
import 'package:sqlite_async/sqlite_async.dart';
77
import 'package:sqlite_async/src/utils/shared_utils.dart';
8+
import 'package:sqlite_async/web.dart';
89
import 'protocol.dart';
910

1011
class WebDatabase
1112
with SqliteQueries, SqliteDatabaseMixin
12-
implements SqliteDatabase {
13+
implements SqliteDatabase, WebSqliteConnection {
1314
final Database _database;
1415
final Mutex? _mutex;
1516

@@ -56,6 +57,11 @@ class WebDatabase
5657
/// Not relevant for web.
5758
Never get openFactory => throw UnimplementedError();
5859

60+
@override
61+
Future<SqliteWebEndpoint> exposeEndpoint() async {
62+
return await _database.additionalConnection();
63+
}
64+
5965
@override
6066
Future<T> readLock<T>(Future<T> Function(SqliteReadContext tx) callback,
6167
{Duration? lockTimeout, String? debugContext}) async {

packages/sqlite_async/lib/web.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
///
2+
library sqlite_async.web;
3+
4+
import 'package:sqlite3_web/sqlite3_web.dart';
5+
import 'sqlite_async.dart';
6+
import 'src/web/database.dart';
7+
8+
/// A [SqliteConnection] interface implemented by opened connections when
9+
/// running on the web.
10+
///
11+
/// This adds the [exposeEndpoint], which uses `dart:js_interop` types not
12+
/// supported on native Dart platforms. The method can be used to access an
13+
/// opened database across different JavaScript contexts
14+
/// (e.g. document windows and workers).
15+
abstract class WebSqliteConnection implements SqliteConnection {
16+
/// Returns a [SqliteWebEndpoint] from `package:sqlite3/web.dart` - a
17+
/// structure that consists only of types that can be transferred across a
18+
/// `MessagePort` in JavaScript.
19+
///
20+
/// After transferring this endpoint to another JavaScript context (e.g. a
21+
/// worker), the worker can call [connectToEndpoint] to obtain a connection to
22+
/// the same sqlite database.
23+
Future<SqliteWebEndpoint> exposeEndpoint();
24+
25+
/// Connect to an endpoint obtained through [exposeEndpoint].
26+
///
27+
/// The endpoint is transferrable in JavaScript, allowing multiple JavaScript
28+
/// contexts to exchange opened database connections.
29+
static Future<WebSqliteConnection> connectToEndpoint(
30+
SqliteWebEndpoint endpoint) async {
31+
final rawSqlite = await WebSqlite.connectToPort(endpoint);
32+
final database = WebDatabase(rawSqlite, null);
33+
return database;
34+
}
35+
}

0 commit comments

Comments
 (0)