Skip to content

Commit 487ff58

Browse files
simolus3msvargas
andcommitted
Tauri: Use numeric event identifiers for databases
Co-authored-by: msvargas <msvargas97@gmail.com>
1 parent 037eef0 commit 487ff58

6 files changed

Lines changed: 47 additions & 16 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'tauri-plugin-powersync': patch
3+
'@powersync/tauri-plugin': patch
4+
---
5+
6+
Fix PowerSync using invalid tauri event names.

packages/tauri/guest-js/command.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,13 @@ export interface ExecuteBatchResult {
5757
changes: number;
5858
}
5959

60+
export interface CreatedDatabase {
61+
handle: number;
62+
event_key: number;
63+
}
64+
6065
export type CommandResult =
66+
| { CreatedDatabase: CreatedDatabase }
6167
| { CreatedHandle: number }
6268
| { ExecuteSqlResult: ExecuteSqlResult }
6369
| { ExecuteBatchResult: ExecuteBatchResult }

packages/tauri/guest-js/database.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
SyncStreamSubscription
1414
} from '@powersync/common';
1515
import { LateHandle, RustDatabaseAdapter } from './pool';
16-
import { powersyncCommand } from './command';
16+
import { CreatedDatabase, powersyncCommand } from './command';
1717
import { listen, UnlistenFn } from '@tauri-apps/api/event';
1818
import { join } from '@tauri-apps/api/path';
1919

@@ -166,26 +166,27 @@ export class PowerSyncTauriDatabase extends AbstractPowerSyncDatabase {
166166

167167
async _initialize(): Promise<void> {
168168
const path = await this.resolvePath();
169-
this.tableUpdateListener = await listen<string[]>(`table-updates:${path}`, (event) => {
169+
const result = await powersyncCommand({
170+
OpenDatabase: {
171+
name: path,
172+
schema: this.schema.toJSON()
173+
}
174+
});
175+
176+
const { handle, event_key } = (result as any).CreatedDatabase as CreatedDatabase;
177+
this.tableUpdateListener = await listen<string[]>(`table-updates:${event_key}`, (event) => {
170178
const adapter = this.database;
171179
if (adapter instanceof RustDatabaseAdapter) {
172180
adapter.iterateListeners((l) =>
173181
l.tablesUpdated?.({ tables: event.payload, rawUpdates: [], groupedUpdates: {} })
174182
);
175183
}
176184
});
177-
this.syncStatusListener = await listen<SyncStatusOptions>(`sync-status:${path}`, (event) => {
185+
this.syncStatusListener = await listen<SyncStatusOptions>(`sync-status:${event_key}`, (event) => {
178186
this.updateSyncStatusFromRust(event.payload);
179187
});
180188

181-
const result = await powersyncCommand({
182-
OpenDatabase: {
183-
name: path,
184-
schema: this.schema.toJSON()
185-
}
186-
});
187-
188-
this.handle.handle = (result as any).CreatedHandle as number;
189+
this.handle.handle = handle;
189190
if (this.database instanceof RustDatabaseAdapter) {
190191
this.database.name = path;
191192
}

packages/tauri/src/commands.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ pub struct SubscribeToStream {
249249

250250
#[derive(Serialize)]
251251
pub enum CommandResult {
252+
CreatedDatabase {
253+
handle: Handle,
254+
event_key: i32,
255+
},
252256
CreatedHandle(Handle),
253257
ExecuteSqlResult(ExecuteSqlResult),
254258
ExecuteBatchResult {
@@ -273,7 +277,11 @@ pub(crate) async fn powersync<R: Runtime>(
273277
SchemaOrCustom::from(open.schema.as_ref()),
274278
)?;
275279

276-
CommandResult::CreatedHandle(powersync.handles.put(SharedWithJavaScript::Database(db)))
280+
let event_key = db.event_key;
281+
CommandResult::CreatedDatabase {
282+
handle: powersync.handles.put(SharedWithJavaScript::Database(db)),
283+
event_key,
284+
}
277285
}
278286
Command::CloseHandle(handle) => {
279287
powersync.handles.delete(handle)?;

packages/tauri/src/database.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,21 @@ use tokio_stream::StreamExt;
99

1010
pub struct TauriDatabaseState {
1111
pub database: PowerSyncDatabase,
12+
pub event_key: i32,
1213
forward_updates: JoinHandle<()>,
1314
forward_sync_status: JoinHandle<()>,
1415
}
1516

1617
impl TauriDatabaseState {
17-
pub fn new<R: Runtime>(handle: AppHandle<R>, name: &str, source: PowerSyncDatabase) -> Self {
18+
pub fn new<R: Runtime>(
19+
handle: AppHandle<R>,
20+
event_key: i32,
21+
source: PowerSyncDatabase,
22+
) -> Self {
1823
let forward_updates = {
1924
let handle = handle.clone();
2025
let db = source.clone();
21-
let event_key = format!("table-updates:{}", name);
26+
let event_key = format!("table-updates:{}", event_key);
2227

2328
tokio::spawn(async move {
2429
let mut stream = db.watch_all_updates();
@@ -32,7 +37,7 @@ impl TauriDatabaseState {
3237
};
3338
let forward_sync_status = {
3439
let db = source.clone();
35-
let event_key = format!("sync-status:{}", name);
40+
let event_key = format!("sync-status:{}", event_key);
3641

3742
tokio::spawn(async move {
3843
let mut stream = db.watch_status();
@@ -46,6 +51,7 @@ impl TauriDatabaseState {
4651

4752
Self {
4853
database: source,
54+
event_key,
4955
forward_updates,
5056
forward_sync_status,
5157
}

packages/tauri/src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use powersync::{env::PowerSyncEnvironment, ConnectionPool, PowerSyncDatabase};
44
use rusqlite::Connection;
55
use std::collections::hash_map::Entry;
66
use std::marker::PhantomData;
7+
use std::sync::atomic::{AtomicI32, Ordering};
78
use std::sync::{Arc, Weak};
89
use std::{collections::HashMap, sync::Mutex};
910
use tauri::{
@@ -35,6 +36,7 @@ impl<R: Runtime, T: Manager<R>> PowerSyncExt<R> for T {
3536
pub struct PowerSync<R: Runtime> {
3637
app: PhantomData<AppHandle<R>>,
3738
databases: Mutex<HashMap<String, Weak<TauriDatabaseState>>>,
39+
event_id_counter: AtomicI32,
3840
pub(crate) handles: JavaScriptHandles,
3941
}
4042

@@ -72,7 +74,8 @@ impl<R: Runtime> PowerSync<R> {
7274
let database = PowerSyncDatabase::new(env, schema);
7375
database.async_tasks().spawn_with_tokio();
7476

75-
let db = Arc::new(TauriDatabaseState::new(app, name, database));
77+
let event_id = self.event_id_counter.fetch_add(1, Ordering::SeqCst);
78+
let db = Arc::new(TauriDatabaseState::new(app, event_id, database));
7679
entry.insert_entry(Arc::downgrade(&db));
7780

7881
Ok(db)
@@ -95,6 +98,7 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
9598
app: PhantomData::<AppHandle<R>>,
9699
databases: Default::default(),
97100
handles: Default::default(),
101+
event_id_counter: Default::default(),
98102
};
99103
app.manage(powersync);
100104
Ok(())

0 commit comments

Comments
 (0)