-
Notifications
You must be signed in to change notification settings - Fork 4
/
AbstractWebPowerSyncDatabaseOpenFactory.ts
89 lines (78 loc) · 2.81 KB
/
AbstractWebPowerSyncDatabaseOpenFactory.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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import {
AbstractPowerSyncDatabase,
AbstractPowerSyncDatabaseOpenFactory,
PowerSyncDatabaseOptions,
PowerSyncOpenFactoryOptions
} from '@powersync/common';
import { PowerSyncDatabase, WebPowerSyncDatabaseOptions, WebPowerSyncFlags } from '../../db/PowerSyncDatabase';
import { SSRDBAdapter } from './SSRDBAdapter';
export interface WebPowerSyncOpenFlags extends WebPowerSyncFlags {
disableSSRWarning?: boolean;
}
export interface WebPowerSyncOpenFactoryOptions extends PowerSyncOpenFactoryOptions {
flags?: WebPowerSyncOpenFlags;
}
export const DEFAULT_POWERSYNC_FLAGS: WebPowerSyncOpenFlags = {
/**
* Multiple tabs are by default not supported on Android, iOS and Safari.
* Other platforms will have multiple tabs enabled by default.
*/
enableMultiTabs:
typeof globalThis.navigator !== 'undefined' && // For SSR purposes
typeof SharedWorker !== 'undefined' &&
!navigator.userAgent.match(/(Android|iPhone|iPod|iPad)/i) &&
!(window as any).safari,
broadcastLogs: true
};
/**
* Intermediate PowerSync Database Open factory for Web which uses a mock
* SSR DB Adapter if running on server side.
* Most SQLite DB implementations only run on client side, this will safely return
* empty query results in SSR which will allow for generating server partial views.
*/
export abstract class AbstractWebPowerSyncDatabaseOpenFactory extends AbstractPowerSyncDatabaseOpenFactory {
protected isServerSide() {
return typeof window == 'undefined';
}
constructor(protected options: WebPowerSyncOpenFactoryOptions) {
super(options);
}
generateOptions(): WebPowerSyncDatabaseOptions {
const isServerSide = this.isServerSide();
if (isServerSide && !this.options.flags?.disableSSRWarning) {
console.warn(
`
Running PowerSync in SSR mode.
Only empty query results will be returned.
Disable this warning by setting 'disableSSRWarning: true' in options.`
);
}
// Resolve flags for PowerSync DB client
const resolvedFlags = this.resolveDBFlags();
if (!resolvedFlags.enableMultiTabs) {
console.warn(
'Multiple tab support is not enabled. Using this site across multiple tabs may not function correctly.'
);
}
return {
...this.options,
database: isServerSide ? new SSRDBAdapter() : this.openDB(),
schema: this.schema,
flags: resolvedFlags
};
}
protected resolveDBFlags(): WebPowerSyncFlags {
const flags = {
...DEFAULT_POWERSYNC_FLAGS,
ssrMode: this.isServerSide(),
...(this.options.flags ?? {})
};
if (typeof this.options.flags?.enableMultiTabs != 'undefined') {
flags.enableMultiTabs = this.options.flags.enableMultiTabs;
}
return flags;
}
generateInstance(options: PowerSyncDatabaseOptions): AbstractPowerSyncDatabase {
return new PowerSyncDatabase(options);
}
}