@verdant-web/store 2.0.5 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/sync/PresenceManager.d.ts +2 -0
- package/dist/cjs/sync/PresenceManager.js +9 -0
- package/dist/cjs/sync/PresenceManager.js.map +1 -1
- package/dist/cjs/sync/Sync.d.ts +12 -2
- package/dist/cjs/sync/Sync.js +24 -13
- package/dist/cjs/sync/Sync.js.map +1 -1
- package/dist/esm/sync/PresenceManager.d.ts +2 -0
- package/dist/esm/sync/PresenceManager.js +9 -0
- package/dist/esm/sync/PresenceManager.js.map +1 -1
- package/dist/esm/sync/Sync.d.ts +12 -2
- package/dist/esm/sync/Sync.js +24 -13
- package/dist/esm/sync/Sync.js.map +1 -1
- package/dist/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/sync/PresenceManager.ts +10 -0
- package/src/sync/Sync.ts +36 -15
|
@@ -11,6 +11,7 @@ export declare class PresenceManager<Profile = any, Presence = any> extends Even
|
|
|
11
11
|
}> {
|
|
12
12
|
private _peers;
|
|
13
13
|
private _self;
|
|
14
|
+
private _selfReplicaIds;
|
|
14
15
|
private _peerIds;
|
|
15
16
|
private _updateBatcher;
|
|
16
17
|
private _updateBatch;
|
|
@@ -20,6 +21,7 @@ export declare class PresenceManager<Profile = any, Presence = any> extends Even
|
|
|
20
21
|
get everyone(): {
|
|
21
22
|
[x: string]: UserInfo<Profile, Presence>;
|
|
22
23
|
};
|
|
24
|
+
get selfReplicaIds(): Set<string>;
|
|
23
25
|
constructor({ initialPresence, updateBatchTimeout, defaultProfile, }: {
|
|
24
26
|
initialPresence: Presence;
|
|
25
27
|
defaultProfile: Profile;
|
|
@@ -19,10 +19,15 @@ class PresenceManager extends common_1.EventSubscriber {
|
|
|
19
19
|
everyone[this.self.id] = this.self;
|
|
20
20
|
return everyone;
|
|
21
21
|
}
|
|
22
|
+
get selfReplicaIds() {
|
|
23
|
+
return this._selfReplicaIds;
|
|
24
|
+
}
|
|
22
25
|
constructor({ initialPresence, updateBatchTimeout = 200, defaultProfile, }) {
|
|
23
26
|
super();
|
|
24
27
|
this._peers = {};
|
|
25
28
|
this._self = { profile: {} };
|
|
29
|
+
// keep track of own replica IDs - applications may care if we're "alone" but with multiple devices.
|
|
30
|
+
this._selfReplicaIds = new Set();
|
|
26
31
|
this._peerIds = new Array();
|
|
27
32
|
/**
|
|
28
33
|
* Decides if an update is for the local user or not. Even if it's a different replica
|
|
@@ -35,6 +40,7 @@ class PresenceManager extends common_1.EventSubscriber {
|
|
|
35
40
|
*/
|
|
36
41
|
this.isSelf = (localReplicaInfo, userInfo) => {
|
|
37
42
|
return (localReplicaInfo.id === userInfo.replicaId ||
|
|
43
|
+
this._selfReplicaIds.has(userInfo.replicaId) ||
|
|
38
44
|
this._self.id === userInfo.id);
|
|
39
45
|
};
|
|
40
46
|
this[_a] = async (localReplicaInfo, message) => {
|
|
@@ -43,6 +49,7 @@ class PresenceManager extends common_1.EventSubscriber {
|
|
|
43
49
|
if (message.type === 'presence-changed') {
|
|
44
50
|
if (this.isSelf(localReplicaInfo, message.userInfo)) {
|
|
45
51
|
this._self = message.userInfo;
|
|
52
|
+
this._selfReplicaIds.add(message.userInfo.replicaId);
|
|
46
53
|
this.emit('selfChanged', message.userInfo);
|
|
47
54
|
}
|
|
48
55
|
else {
|
|
@@ -59,6 +66,7 @@ class PresenceManager extends common_1.EventSubscriber {
|
|
|
59
66
|
for (const [id, userInfo] of Object.entries(message.peerPresence)) {
|
|
60
67
|
if (this.isSelf(localReplicaInfo, userInfo)) {
|
|
61
68
|
this._self = userInfo;
|
|
69
|
+
this._selfReplicaIds.add(userInfo.replicaId);
|
|
62
70
|
this.emit('selfChanged', userInfo);
|
|
63
71
|
}
|
|
64
72
|
else {
|
|
@@ -71,6 +79,7 @@ class PresenceManager extends common_1.EventSubscriber {
|
|
|
71
79
|
}
|
|
72
80
|
else if (message.type === 'presence-offline') {
|
|
73
81
|
peerIdsSet.delete(message.userId);
|
|
82
|
+
this._selfReplicaIds.delete(message.replicaId);
|
|
74
83
|
const lastPresence = this._peers[message.userId];
|
|
75
84
|
delete this._peers[message.userId];
|
|
76
85
|
peersChanged = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PresenceManager.js","sourceRoot":"","sources":["../../../src/sync/PresenceManager.ts"],"names":[],"mappings":";;;;AAAA,gDAK6B;AAIhB,QAAA,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AAEtD,MAAa,eAGX,SAAQ,wBAMR;
|
|
1
|
+
{"version":3,"file":"PresenceManager.js","sourceRoot":"","sources":["../../../src/sync/PresenceManager.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/sync/Sync.d.ts
CHANGED
|
@@ -67,13 +67,19 @@ export interface ServerSyncOptions<Profile = any, Presence = any> extends Server
|
|
|
67
67
|
* HTTP push/pull to sync changes. If another user joins, both users will
|
|
68
68
|
* be upgraded to websockets.
|
|
69
69
|
*
|
|
70
|
+
* Provide `peers-only` to only automatically use websockets if other
|
|
71
|
+
* users connect, but not if another device for the current user connects.
|
|
72
|
+
* By default, automatic transport selection will upgrade to websockets if
|
|
73
|
+
* another device from the current user connects, but if realtime sync is
|
|
74
|
+
* not necessary for such cases, you can save bandwidth by disabling this.
|
|
75
|
+
*
|
|
70
76
|
* Turning off this feature allows you more control over the transport
|
|
71
77
|
* which can be useful for low-power devices or to save server traffic.
|
|
72
78
|
* To modify transport modes manually, utilize `client.sync.setMode`.
|
|
73
79
|
* The built-in behavior is essentially switching modes based on
|
|
74
80
|
* the number of peers detected by client.sync.presence.
|
|
75
81
|
*/
|
|
76
|
-
automaticTransportSelection?: boolean;
|
|
82
|
+
automaticTransportSelection?: boolean | 'peers-only';
|
|
77
83
|
initialTransport?: SyncTransportMode;
|
|
78
84
|
autoStart?: boolean;
|
|
79
85
|
/**
|
|
@@ -93,7 +99,9 @@ export interface ServerSyncOptions<Profile = any, Presence = any> extends Server
|
|
|
93
99
|
*/
|
|
94
100
|
useBroadcastChannel?: boolean;
|
|
95
101
|
}
|
|
96
|
-
export declare class ServerSync<Profile = any, Presence = any> extends EventSubscriber<SyncEvents
|
|
102
|
+
export declare class ServerSync<Profile = any, Presence = any> extends EventSubscriber<SyncEvents & {
|
|
103
|
+
syncingChange: (syncing: boolean) => void;
|
|
104
|
+
}> implements Sync {
|
|
97
105
|
private webSocketSync;
|
|
98
106
|
private pushPullSync;
|
|
99
107
|
private fileSync;
|
|
@@ -101,6 +109,7 @@ export declare class ServerSync<Profile = any, Presence = any> extends EventSubs
|
|
|
101
109
|
private endpointProvider;
|
|
102
110
|
private onData;
|
|
103
111
|
private broadcastChannel;
|
|
112
|
+
private _activelySyncing;
|
|
104
113
|
private meta;
|
|
105
114
|
readonly presence: PresenceManager<Profile, Presence>;
|
|
106
115
|
private log;
|
|
@@ -114,6 +123,7 @@ export declare class ServerSync<Profile = any, Presence = any> extends EventSubs
|
|
|
114
123
|
}) => Promise<void>;
|
|
115
124
|
});
|
|
116
125
|
get canDoRealtime(): boolean;
|
|
126
|
+
get syncing(): boolean;
|
|
117
127
|
private handleBroadcastChannelMessage;
|
|
118
128
|
private handleMessage;
|
|
119
129
|
private handleOnlineChange;
|
package/dist/cjs/sync/Sync.js
CHANGED
|
@@ -44,6 +44,7 @@ class ServerSync extends common_1.EventSubscriber {
|
|
|
44
44
|
constructor({ authEndpoint, fetchAuth, initialPresence, automaticTransportSelection = true, autoStart, initialTransport, pullInterval, presenceUpdateBatchTimeout, defaultProfile, useBroadcastChannel, }, { meta, log, onData, }) {
|
|
45
45
|
super();
|
|
46
46
|
this.broadcastChannel = null;
|
|
47
|
+
this._activelySyncing = false;
|
|
47
48
|
this.handleBroadcastChannelMessage = (event) => {
|
|
48
49
|
if (event.data.type === 'sync') {
|
|
49
50
|
this.handleMessage(event.data.message);
|
|
@@ -72,6 +73,8 @@ class ServerSync extends common_1.EventSubscriber {
|
|
|
72
73
|
await this.meta.setGlobalAck(message.timestamp);
|
|
73
74
|
break;
|
|
74
75
|
case 'sync-resp':
|
|
76
|
+
this._activelySyncing = true;
|
|
77
|
+
this.emit('syncingChange', true);
|
|
75
78
|
await this.onData({
|
|
76
79
|
operations: message.operations,
|
|
77
80
|
baselines: message.baselines,
|
|
@@ -81,6 +84,8 @@ class ServerSync extends common_1.EventSubscriber {
|
|
|
81
84
|
await this.meta.setGlobalAck(message.globalAckTimestamp);
|
|
82
85
|
}
|
|
83
86
|
await this.meta.updateLastSynced(message.ackedTimestamp);
|
|
87
|
+
this._activelySyncing = false;
|
|
88
|
+
this.emit('syncingChange', false);
|
|
84
89
|
break;
|
|
85
90
|
case 'need-since':
|
|
86
91
|
this.activeSync.send(await this.meta.messageCreator.createSyncStep1(message.since));
|
|
@@ -208,31 +213,34 @@ class ServerSync extends common_1.EventSubscriber {
|
|
|
208
213
|
this.webSocketSync.subscribe('onlineChange', this.handleOnlineChange);
|
|
209
214
|
this.pushPullSync.subscribe('message', this.handleMessage);
|
|
210
215
|
this.pushPullSync.subscribe('onlineChange', this.handleOnlineChange);
|
|
211
|
-
if (automaticTransportSelection) {
|
|
216
|
+
if (automaticTransportSelection && this.canDoRealtime) {
|
|
212
217
|
// automatically shift between transport modes depending
|
|
213
218
|
// on whether any peers are present
|
|
214
|
-
|
|
215
|
-
this.presence.subscribe('peersChanged', (peers) => {
|
|
219
|
+
const decideIfUpgrade = () => {
|
|
216
220
|
if (switchoverTimeout) {
|
|
217
221
|
clearTimeout(switchoverTimeout);
|
|
218
222
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
}
|
|
223
|
+
const hasPeers = Object.keys(this.presence.peers).length > 0;
|
|
224
|
+
const shouldUpgrade = hasPeers ||
|
|
225
|
+
(automaticTransportSelection !== 'peers-only' &&
|
|
226
|
+
this.presence.selfReplicaIds.size > 1);
|
|
227
|
+
if (shouldUpgrade && this.mode === 'pull') {
|
|
228
|
+
this.setMode('realtime');
|
|
226
229
|
}
|
|
227
|
-
else if (this.mode === 'realtime') {
|
|
228
|
-
// wait 1 second then switch to pull mode if still
|
|
230
|
+
else if (!shouldUpgrade && this.mode === 'realtime') {
|
|
231
|
+
// wait 1 second then switch to pull mode if still empty
|
|
229
232
|
switchoverTimeout = setTimeout(() => {
|
|
230
233
|
if (Object.keys(this.presence.peers).length === 0) {
|
|
231
234
|
this.setMode('pull');
|
|
232
235
|
}
|
|
233
236
|
}, 1000);
|
|
234
237
|
}
|
|
235
|
-
}
|
|
238
|
+
};
|
|
239
|
+
let switchoverTimeout;
|
|
240
|
+
this.presence.subscribe('peersChanged', decideIfUpgrade);
|
|
241
|
+
if (automaticTransportSelection !== 'peers-only') {
|
|
242
|
+
this.presence.subscribe('selfChanged', decideIfUpgrade);
|
|
243
|
+
}
|
|
236
244
|
}
|
|
237
245
|
if (autoStart) {
|
|
238
246
|
this.start();
|
|
@@ -243,6 +251,9 @@ class ServerSync extends common_1.EventSubscriber {
|
|
|
243
251
|
this.endpointProvider.type === common_1.ReplicaType.PassiveRealtime ||
|
|
244
252
|
this.endpointProvider.type === common_1.ReplicaType.ReadOnlyRealtime);
|
|
245
253
|
}
|
|
254
|
+
get syncing() {
|
|
255
|
+
return this._activelySyncing;
|
|
256
|
+
}
|
|
246
257
|
get pullInterval() {
|
|
247
258
|
return this.pushPullSync.interval;
|
|
248
259
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sync.js","sourceRoot":"","sources":["../../../src/sync/Sync.ts"],"names":[],"mappings":";;;AAAA,gDAQ6B;AAE7B,6DAAuE;AAEvE,+CAA2E;AAC3E,uDAAiD;AACjD,mFAGyC;AACzC,yDAAmD;AAyCnD,MAAa,MAAO,SAAQ,wBAA2B;IAAvD;;QACU,SAAI,GAAG,MAAM,CAAC;QAQhB,YAAO,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QAOV,gBAAW,GAAG,KAAK,CAAC;QACpB,WAAM,GAAG,QAAQ,CAAC;QAClB,iBAAY,GAAG,CAAC,CAAC;QAEjB,aAAQ,GAAG,IAAI,oCAAe,CAAC;YAC9C,eAAe,EAAE,EAAE;YACnB,cAAc,EAAE,EAAE;SAClB,CAAC,CAAC;QAEH,eAAU,GAAG,KAAK,IAAI,EAAE;YACvB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK;aACZ,CAAC;QACH,CAAC,CAAC;QAEF,YAAO,GAAG,KAAK,IAA6B,EAAE;YAC7C,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK;aACZ,CAAC;QACH,CAAC,CAAC;IACH,CAAC;IAnCO,IAAI,KAAU,CAAC;IAEf,KAAK,KAAU,CAAC;IAEhB,IAAI,KAAU,CAAC;IAIf,SAAS,KAAU,CAAC;IAEpB,OAAO,KAAU,CAAC;IAClB,eAAe,KAAU,CAAC;CAwBjC;AAtCD,wBAsCC;
|
|
1
|
+
{"version":3,"file":"Sync.js","sourceRoot":"","sources":["../../../src/sync/Sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ export declare class PresenceManager<Profile = any, Presence = any> extends Even
|
|
|
11
11
|
}> {
|
|
12
12
|
private _peers;
|
|
13
13
|
private _self;
|
|
14
|
+
private _selfReplicaIds;
|
|
14
15
|
private _peerIds;
|
|
15
16
|
private _updateBatcher;
|
|
16
17
|
private _updateBatch;
|
|
@@ -20,6 +21,7 @@ export declare class PresenceManager<Profile = any, Presence = any> extends Even
|
|
|
20
21
|
get everyone(): {
|
|
21
22
|
[x: string]: UserInfo<Profile, Presence>;
|
|
22
23
|
};
|
|
24
|
+
get selfReplicaIds(): Set<string>;
|
|
23
25
|
constructor({ initialPresence, updateBatchTimeout, defaultProfile, }: {
|
|
24
26
|
initialPresence: Presence;
|
|
25
27
|
defaultProfile: Profile;
|
|
@@ -16,10 +16,15 @@ export class PresenceManager extends EventSubscriber {
|
|
|
16
16
|
everyone[this.self.id] = this.self;
|
|
17
17
|
return everyone;
|
|
18
18
|
}
|
|
19
|
+
get selfReplicaIds() {
|
|
20
|
+
return this._selfReplicaIds;
|
|
21
|
+
}
|
|
19
22
|
constructor({ initialPresence, updateBatchTimeout = 200, defaultProfile, }) {
|
|
20
23
|
super();
|
|
21
24
|
this._peers = {};
|
|
22
25
|
this._self = { profile: {} };
|
|
26
|
+
// keep track of own replica IDs - applications may care if we're "alone" but with multiple devices.
|
|
27
|
+
this._selfReplicaIds = new Set();
|
|
23
28
|
this._peerIds = new Array();
|
|
24
29
|
/**
|
|
25
30
|
* Decides if an update is for the local user or not. Even if it's a different replica
|
|
@@ -32,6 +37,7 @@ export class PresenceManager extends EventSubscriber {
|
|
|
32
37
|
*/
|
|
33
38
|
this.isSelf = (localReplicaInfo, userInfo) => {
|
|
34
39
|
return (localReplicaInfo.id === userInfo.replicaId ||
|
|
40
|
+
this._selfReplicaIds.has(userInfo.replicaId) ||
|
|
35
41
|
this._self.id === userInfo.id);
|
|
36
42
|
};
|
|
37
43
|
this[_a] = async (localReplicaInfo, message) => {
|
|
@@ -40,6 +46,7 @@ export class PresenceManager extends EventSubscriber {
|
|
|
40
46
|
if (message.type === 'presence-changed') {
|
|
41
47
|
if (this.isSelf(localReplicaInfo, message.userInfo)) {
|
|
42
48
|
this._self = message.userInfo;
|
|
49
|
+
this._selfReplicaIds.add(message.userInfo.replicaId);
|
|
43
50
|
this.emit('selfChanged', message.userInfo);
|
|
44
51
|
}
|
|
45
52
|
else {
|
|
@@ -56,6 +63,7 @@ export class PresenceManager extends EventSubscriber {
|
|
|
56
63
|
for (const [id, userInfo] of Object.entries(message.peerPresence)) {
|
|
57
64
|
if (this.isSelf(localReplicaInfo, userInfo)) {
|
|
58
65
|
this._self = userInfo;
|
|
66
|
+
this._selfReplicaIds.add(userInfo.replicaId);
|
|
59
67
|
this.emit('selfChanged', userInfo);
|
|
60
68
|
}
|
|
61
69
|
else {
|
|
@@ -68,6 +76,7 @@ export class PresenceManager extends EventSubscriber {
|
|
|
68
76
|
}
|
|
69
77
|
else if (message.type === 'presence-offline') {
|
|
70
78
|
peerIdsSet.delete(message.userId);
|
|
79
|
+
this._selfReplicaIds.delete(message.replicaId);
|
|
71
80
|
const lastPresence = this._peers[message.userId];
|
|
72
81
|
delete this._peers[message.userId];
|
|
73
82
|
peersChanged = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PresenceManager.js","sourceRoot":"","sources":["../../../src/sync/PresenceManager.ts"],"names":[],"mappings":";AAAA,OAAO,EAEN,eAAe,EACf,OAAO,GAEP,MAAM,qBAAqB,CAAC;AAI7B,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AAEtD,MAAM,OAAO,eAGX,SAAQ,eAMR;
|
|
1
|
+
{"version":3,"file":"PresenceManager.js","sourceRoot":"","sources":["../../../src/sync/PresenceManager.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/sync/Sync.d.ts
CHANGED
|
@@ -67,13 +67,19 @@ export interface ServerSyncOptions<Profile = any, Presence = any> extends Server
|
|
|
67
67
|
* HTTP push/pull to sync changes. If another user joins, both users will
|
|
68
68
|
* be upgraded to websockets.
|
|
69
69
|
*
|
|
70
|
+
* Provide `peers-only` to only automatically use websockets if other
|
|
71
|
+
* users connect, but not if another device for the current user connects.
|
|
72
|
+
* By default, automatic transport selection will upgrade to websockets if
|
|
73
|
+
* another device from the current user connects, but if realtime sync is
|
|
74
|
+
* not necessary for such cases, you can save bandwidth by disabling this.
|
|
75
|
+
*
|
|
70
76
|
* Turning off this feature allows you more control over the transport
|
|
71
77
|
* which can be useful for low-power devices or to save server traffic.
|
|
72
78
|
* To modify transport modes manually, utilize `client.sync.setMode`.
|
|
73
79
|
* The built-in behavior is essentially switching modes based on
|
|
74
80
|
* the number of peers detected by client.sync.presence.
|
|
75
81
|
*/
|
|
76
|
-
automaticTransportSelection?: boolean;
|
|
82
|
+
automaticTransportSelection?: boolean | 'peers-only';
|
|
77
83
|
initialTransport?: SyncTransportMode;
|
|
78
84
|
autoStart?: boolean;
|
|
79
85
|
/**
|
|
@@ -93,7 +99,9 @@ export interface ServerSyncOptions<Profile = any, Presence = any> extends Server
|
|
|
93
99
|
*/
|
|
94
100
|
useBroadcastChannel?: boolean;
|
|
95
101
|
}
|
|
96
|
-
export declare class ServerSync<Profile = any, Presence = any> extends EventSubscriber<SyncEvents
|
|
102
|
+
export declare class ServerSync<Profile = any, Presence = any> extends EventSubscriber<SyncEvents & {
|
|
103
|
+
syncingChange: (syncing: boolean) => void;
|
|
104
|
+
}> implements Sync {
|
|
97
105
|
private webSocketSync;
|
|
98
106
|
private pushPullSync;
|
|
99
107
|
private fileSync;
|
|
@@ -101,6 +109,7 @@ export declare class ServerSync<Profile = any, Presence = any> extends EventSubs
|
|
|
101
109
|
private endpointProvider;
|
|
102
110
|
private onData;
|
|
103
111
|
private broadcastChannel;
|
|
112
|
+
private _activelySyncing;
|
|
104
113
|
private meta;
|
|
105
114
|
readonly presence: PresenceManager<Profile, Presence>;
|
|
106
115
|
private log;
|
|
@@ -114,6 +123,7 @@ export declare class ServerSync<Profile = any, Presence = any> extends EventSubs
|
|
|
114
123
|
}) => Promise<void>;
|
|
115
124
|
});
|
|
116
125
|
get canDoRealtime(): boolean;
|
|
126
|
+
get syncing(): boolean;
|
|
117
127
|
private handleBroadcastChannelMessage;
|
|
118
128
|
private handleMessage;
|
|
119
129
|
private handleOnlineChange;
|
package/dist/esm/sync/Sync.js
CHANGED
|
@@ -40,6 +40,7 @@ export class ServerSync extends EventSubscriber {
|
|
|
40
40
|
constructor({ authEndpoint, fetchAuth, initialPresence, automaticTransportSelection = true, autoStart, initialTransport, pullInterval, presenceUpdateBatchTimeout, defaultProfile, useBroadcastChannel, }, { meta, log, onData, }) {
|
|
41
41
|
super();
|
|
42
42
|
this.broadcastChannel = null;
|
|
43
|
+
this._activelySyncing = false;
|
|
43
44
|
this.handleBroadcastChannelMessage = (event) => {
|
|
44
45
|
if (event.data.type === 'sync') {
|
|
45
46
|
this.handleMessage(event.data.message);
|
|
@@ -68,6 +69,8 @@ export class ServerSync extends EventSubscriber {
|
|
|
68
69
|
await this.meta.setGlobalAck(message.timestamp);
|
|
69
70
|
break;
|
|
70
71
|
case 'sync-resp':
|
|
72
|
+
this._activelySyncing = true;
|
|
73
|
+
this.emit('syncingChange', true);
|
|
71
74
|
await this.onData({
|
|
72
75
|
operations: message.operations,
|
|
73
76
|
baselines: message.baselines,
|
|
@@ -77,6 +80,8 @@ export class ServerSync extends EventSubscriber {
|
|
|
77
80
|
await this.meta.setGlobalAck(message.globalAckTimestamp);
|
|
78
81
|
}
|
|
79
82
|
await this.meta.updateLastSynced(message.ackedTimestamp);
|
|
83
|
+
this._activelySyncing = false;
|
|
84
|
+
this.emit('syncingChange', false);
|
|
80
85
|
break;
|
|
81
86
|
case 'need-since':
|
|
82
87
|
this.activeSync.send(await this.meta.messageCreator.createSyncStep1(message.since));
|
|
@@ -204,31 +209,34 @@ export class ServerSync extends EventSubscriber {
|
|
|
204
209
|
this.webSocketSync.subscribe('onlineChange', this.handleOnlineChange);
|
|
205
210
|
this.pushPullSync.subscribe('message', this.handleMessage);
|
|
206
211
|
this.pushPullSync.subscribe('onlineChange', this.handleOnlineChange);
|
|
207
|
-
if (automaticTransportSelection) {
|
|
212
|
+
if (automaticTransportSelection && this.canDoRealtime) {
|
|
208
213
|
// automatically shift between transport modes depending
|
|
209
214
|
// on whether any peers are present
|
|
210
|
-
|
|
211
|
-
this.presence.subscribe('peersChanged', (peers) => {
|
|
215
|
+
const decideIfUpgrade = () => {
|
|
212
216
|
if (switchoverTimeout) {
|
|
213
217
|
clearTimeout(switchoverTimeout);
|
|
214
218
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
219
|
+
const hasPeers = Object.keys(this.presence.peers).length > 0;
|
|
220
|
+
const shouldUpgrade = hasPeers ||
|
|
221
|
+
(automaticTransportSelection !== 'peers-only' &&
|
|
222
|
+
this.presence.selfReplicaIds.size > 1);
|
|
223
|
+
if (shouldUpgrade && this.mode === 'pull') {
|
|
224
|
+
this.setMode('realtime');
|
|
222
225
|
}
|
|
223
|
-
else if (this.mode === 'realtime') {
|
|
224
|
-
// wait 1 second then switch to pull mode if still
|
|
226
|
+
else if (!shouldUpgrade && this.mode === 'realtime') {
|
|
227
|
+
// wait 1 second then switch to pull mode if still empty
|
|
225
228
|
switchoverTimeout = setTimeout(() => {
|
|
226
229
|
if (Object.keys(this.presence.peers).length === 0) {
|
|
227
230
|
this.setMode('pull');
|
|
228
231
|
}
|
|
229
232
|
}, 1000);
|
|
230
233
|
}
|
|
231
|
-
}
|
|
234
|
+
};
|
|
235
|
+
let switchoverTimeout;
|
|
236
|
+
this.presence.subscribe('peersChanged', decideIfUpgrade);
|
|
237
|
+
if (automaticTransportSelection !== 'peers-only') {
|
|
238
|
+
this.presence.subscribe('selfChanged', decideIfUpgrade);
|
|
239
|
+
}
|
|
232
240
|
}
|
|
233
241
|
if (autoStart) {
|
|
234
242
|
this.start();
|
|
@@ -239,6 +247,9 @@ export class ServerSync extends EventSubscriber {
|
|
|
239
247
|
this.endpointProvider.type === ReplicaType.PassiveRealtime ||
|
|
240
248
|
this.endpointProvider.type === ReplicaType.ReadOnlyRealtime);
|
|
241
249
|
}
|
|
250
|
+
get syncing() {
|
|
251
|
+
return this._activelySyncing;
|
|
252
|
+
}
|
|
242
253
|
get pullInterval() {
|
|
243
254
|
return this.pushPullSync.interval;
|
|
244
255
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sync.js","sourceRoot":"","sources":["../../../src/sync/Sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,eAAe,EAGf,WAAW,GAEX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAkB,QAAQ,EAAoB,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACN,0BAA0B,GAE1B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAyCnD,MAAM,OAAO,MAAO,SAAQ,eAA2B;IAAvD;;QACU,SAAI,GAAG,MAAM,CAAC;QAQhB,YAAO,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QAOV,gBAAW,GAAG,KAAK,CAAC;QACpB,WAAM,GAAG,QAAQ,CAAC;QAClB,iBAAY,GAAG,CAAC,CAAC;QAEjB,aAAQ,GAAG,IAAI,eAAe,CAAC;YAC9C,eAAe,EAAE,EAAE;YACnB,cAAc,EAAE,EAAE;SAClB,CAAC,CAAC;QAEH,eAAU,GAAG,KAAK,IAAI,EAAE;YACvB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK;aACZ,CAAC;QACH,CAAC,CAAC;QAEF,YAAO,GAAG,KAAK,IAA6B,EAAE;YAC7C,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK;aACZ,CAAC;QACH,CAAC,CAAC;IACH,CAAC;IAnCO,IAAI,KAAU,CAAC;IAEf,KAAK,KAAU,CAAC;IAEhB,IAAI,KAAU,CAAC;IAIf,SAAS,KAAU,CAAC;IAEpB,OAAO,KAAU,CAAC;IAClB,eAAe,KAAU,CAAC;CAwBjC;
|
|
1
|
+
{"version":3,"file":"Sync.js","sourceRoot":"","sources":["../../../src/sync/Sync.ts"],"names":[],"mappings":"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"}
|