Skip to content

Commit 4d51235

Browse files
authored
Add EventManager class (#48)
1 parent 38005f4 commit 4d51235

18 files changed

Lines changed: 502 additions & 138 deletions

File tree

PowerSync/PowerSync.Common/CHANGELOG.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,49 @@
22

33
## 0.0.11-alpha.1
44

5+
- `StatusUpdated` and `StatusChanged` now both emit `SyncStatus` objects instead of just `StatusChanged`.
6+
- Converted most instances of a class inheriting from `EventStream<T>` into a class with an `EventManager` property called `Events`. This allows for subscribing to individual events instead of subscribing to all events and then filtering events manually.
7+
8+
```csharp
9+
// Old
10+
var listener = db.Listen(cts.Token);
11+
foreach (PowerSyncDBEvent update in listener)
12+
{
13+
// Manually filter updates
14+
if (update.StatusChanged != null)
15+
{
16+
Console.WriteLine("status changed: " + update.StatusChanged!);
17+
}
18+
}
19+
20+
// Old (async)
21+
var listener = db.ListenAsync(cts.Token);
22+
await foreach (PowerSyncDBEvent update in listener)
23+
{
24+
// Manually filter updates
25+
if (update.StatusChanged != null)
26+
{
27+
Console.WriteLine("status changed: " + update.StatusChanged!);
28+
}
29+
}
30+
31+
// New
32+
var listener = db.Events.OnStatusChanged.Listen(cts.Token);
33+
await foreach (PowerSyncDBEvents.StatusChanged update in listener)
34+
{
35+
// Events are filtered inherently
36+
Console.WriteLine("status changed: " + update.Status);
37+
}
38+
39+
// New (async) - recommended for most use cases
40+
var listener = db.Events.OnStatusChanged.ListenAsync(cts.Token);
41+
await foreach (PowerSyncDBEvents.StatusChanged update in listener)
42+
{
43+
// Events are filtered inherently
44+
Console.WriteLine("status changed: " + update.Status);
45+
}
46+
```
47+
548
- Pool read connections in `MDSQLiteAdapter`, improving performance in any case where multiple queries run simultaneously (eg. via `Watch`). The number of connections can be set via `MDSQLiteOptions.ReadPoolSize` and defaults to 5.
649
- Updated to the latest version (0.4.11) of the core extension.
750
- `MDSQLiteConnection` now runs query operations on another thread, which stops the caller thread from blocking.

PowerSync/PowerSync.Common/Client/ConnectionManager.cs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,25 @@ public class StoredConnectionOptions(
7979
public PowerSyncConnectionOptions Options { get; set; } = options;
8080
}
8181

82-
public class ConnectionManagerEvent
82+
public class ConnectionManagerEvents : EventManager
8383
{
84-
public StreamingSyncImplementation? SyncStreamCreated { get; set; }
84+
public interface IConnectionManagerEvent;
85+
86+
public class SyncStreamCreatedEvent(StreamingSyncImplementation ssi) : IConnectionManagerEvent
87+
{
88+
public StreamingSyncImplementation SyncStreamCreated { get; set; } = ssi;
89+
}
90+
91+
public EventStream<SyncStreamCreatedEvent> OnSyncStreamCreated { get; } = new();
92+
93+
public ConnectionManagerEvents()
94+
{
95+
Register(OnSyncStreamCreated);
96+
}
8597
}
8698

87-
public class ConnectionManager : EventStream<ConnectionManagerEvent>
99+
public class ConnectionManager : ICloseable
88100
{
89-
90101
/// <summary>
91102
/// Tracks active connection attempts
92103
/// </summary>
@@ -122,6 +133,7 @@ public class ConnectionManager : EventStream<ConnectionManagerEvent>
122133

123134
public IPowerSyncBackendConnector? Connector => PendingConnectionOptions?.Connector;
124135

136+
public ConnectionManagerEvents Events { get; protected set; } = new();
125137

126138
public PowerSyncConnectionOptions? ConnectionOptions => PendingConnectionOptions?.Options;
127139

@@ -148,9 +160,9 @@ public ConnectionManager(Func<IPowerSyncBackendConnector, CreateSyncImplementati
148160
SyncDisposer = null;
149161
}
150162

151-
public new void Close()
163+
public void Close()
152164
{
153-
base.Close();
165+
Events.Close();
154166
SyncStreamImplementation?.Close();
155167
SyncDisposer?.Invoke();
156168
}
@@ -274,7 +286,7 @@ async Task InitSyncStream()
274286
RetryDelayMs = options.RetryDelayMs,
275287
});
276288

277-
Emit(new ConnectionManagerEvent { SyncStreamCreated = result.Sync });
289+
Events.Emit(new ConnectionManagerEvents.SyncStreamCreatedEvent(result.Sync));
278290
SyncStreamImplementation = result.Sync;
279291
SyncDisposer = result.OnDispose;
280292
await SyncStreamImplementation.WaitForReady();

0 commit comments

Comments
 (0)