Skip to content

Commit ebd6a88

Browse files
committed
Fix closing web databases
1 parent 5362f82 commit ebd6a88

2 files changed

Lines changed: 34 additions & 22 deletions

File tree

sqlite3_web/lib/src/client.dart

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ final class _CommitOrRollbackStream {
2323
final class RemoteDatabase implements Database {
2424
final WorkerConnection connection;
2525
final int databaseId;
26-
27-
var _isClosed = false;
26+
final Completer<Object?> _isClosed = Completer();
2827

2928
StreamSubscription<Notification>? _updateNotificationSubscription;
3029
final StreamController<SqliteUpdate> _updates = StreamController.broadcast();
@@ -33,6 +32,15 @@ final class RemoteDatabase implements Database {
3332
final _CommitOrRollbackStream _rollbacks = _CommitOrRollbackStream();
3433

3534
RemoteDatabase({required this.connection, required this.databaseId}) {
35+
connection.closed.then((_) {
36+
if (!isClosed) {
37+
_isClosed.complete();
38+
_updates.close();
39+
_rollbacks.controller.close();
40+
_commits.controller.close();
41+
}
42+
});
43+
3644
_updates
3745
..onListen = (() {
3846
_updateNotificationSubscription ??= connection.notifications.stream
@@ -44,7 +52,7 @@ final class RemoteDatabase implements Database {
4452
}
4553
}
4654
});
47-
if (!_isClosed) {
55+
if (!isClosed) {
4856
connection.sendRequest(
4957
newUpdateStreamRequest(
5058
action: true,
@@ -58,7 +66,7 @@ final class RemoteDatabase implements Database {
5866
..onCancel = (() {
5967
_updateNotificationSubscription?.cancel();
6068
_updateNotificationSubscription = null;
61-
if (!_isClosed) {
69+
if (!isClosed) {
6270
connection.sendRequest(
6371
newUpdateStreamRequest(
6472
action: false,
@@ -105,7 +113,7 @@ final class RemoteDatabase implements Database {
105113
stream.controller.add(null);
106114
}
107115
});
108-
if (!_isClosed) {
116+
if (!isClosed) {
109117
connection.sendRequest(
110118
generateRequest(true),
111119
MessageType.simpleSuccessResponse,
@@ -115,7 +123,7 @@ final class RemoteDatabase implements Database {
115123
..onCancel = (() {
116124
stream.workerSubscription?.cancel();
117125
stream.workerSubscription = null;
118-
if (!_isClosed) {
126+
if (!isClosed) {
119127
connection.sendRequest(
120128
generateRequest(false),
121129
MessageType.simpleSuccessResponse,
@@ -125,27 +133,28 @@ final class RemoteDatabase implements Database {
125133
}
126134

127135
@override
128-
Future<void> get closed {
129-
return connection.closed;
130-
}
136+
bool get isClosed => _isClosed.isCompleted;
137+
138+
@override
139+
Future<void> get closed => _isClosed.future;
131140

132141
@override
133142
Future<void> dispose() async {
134-
if (_isClosed) {
135-
return await closed;
143+
if (!isClosed) {
144+
_isClosed.complete(
145+
(
146+
_updates.close(),
147+
_rollbacks.controller.close(),
148+
_commits.controller.close(),
149+
connection.sendRequest(
150+
newCloseDatabase(requestId: 0, databaseId: databaseId),
151+
MessageType.simpleSuccessResponse,
152+
),
153+
).wait,
154+
);
136155
}
137156

138-
_isClosed = true;
139-
await (
140-
_updates.close(),
141-
_rollbacks.controller.close(),
142-
_commits.controller.close(),
143-
connection.sendRequest(
144-
newCloseDatabase(requestId: 0, databaseId: databaseId),
145-
MessageType.simpleSuccessResponse,
146-
),
147-
).wait;
148-
await connection.close();
157+
return await closed;
149158
}
150159

151160
@override

sqlite3_web/lib/src/database.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ abstract class Database {
129129
/// is useful to react to databases closing.
130130
Future<void> get closed;
131131

132+
/// Whether the database is currently closed.
133+
bool get isClosed;
134+
132135
/// Closes this database and instructs the worker to release associated
133136
/// resources.
134137
///

0 commit comments

Comments
 (0)