-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathrunOnSchemaChange.ts
31 lines (28 loc) · 1.1 KB
/
runOnSchemaChange.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import { AbstractPowerSyncDatabase, SQLWatchOptions } from './AbstractPowerSyncDatabase.js';
export function runOnSchemaChange(
callback: (signal: AbortSignal) => void,
db: AbstractPowerSyncDatabase,
options?: SQLWatchOptions
): void {
const triggerWatchedQuery = () => {
const abortController = new AbortController();
let disposeSchemaListener: (() => void) | null = null;
const stopWatching = () => {
abortController.abort('Abort triggered');
disposeSchemaListener?.();
disposeSchemaListener = null;
// Stop listening to upstream abort for this watch
options?.signal?.removeEventListener('abort', stopWatching);
};
options?.signal?.addEventListener('abort', stopWatching);
disposeSchemaListener = db.registerListener({
schemaChanged: async () => {
stopWatching();
// Re trigger the watched query (recursively), setTimeout ensures that we don't modify the list of listeners while iterating through them
setTimeout(() => triggerWatchedQuery(), 0);
}
});
callback(abortController.signal);
};
triggerWatchedQuery();
}