@verdant-web/store 3.9.0 → 3.11.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/bundle/index.js +6 -6
- package/dist/bundle/index.js.map +4 -4
- package/dist/esm/client/ClientDescriptor.d.ts +1 -1
- package/dist/esm/entities/Entity.d.ts +4 -0
- package/dist/esm/entities/Entity.js +8 -0
- package/dist/esm/entities/Entity.js.map +1 -1
- package/dist/esm/entities/types.d.ts +3 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/metadata/MessageCreator.d.ts +5 -2
- package/dist/esm/metadata/MessageCreator.js +3 -2
- package/dist/esm/metadata/MessageCreator.js.map +1 -1
- package/dist/esm/sync/PresenceManager.d.ts +22 -3
- package/dist/esm/sync/PresenceManager.js +65 -7
- package/dist/esm/sync/PresenceManager.js.map +1 -1
- package/dist/esm/sync/PushPullSync.js +1 -1
- package/dist/esm/sync/PushPullSync.js.map +1 -1
- package/dist/esm/sync/Sync.js +6 -5
- package/dist/esm/sync/Sync.js.map +1 -1
- package/dist/esm/sync/WebSocketSync.js +1 -1
- package/dist/esm/sync/WebSocketSync.js.map +1 -1
- package/dist/esm/sync/cliSync.d.ts +10 -0
- package/dist/esm/sync/cliSync.js +13 -0
- package/dist/esm/sync/cliSync.js.map +1 -0
- package/package.json +2 -2
- package/src/client/ClientDescriptor.ts +1 -1
- package/src/entities/Entity.ts +9 -0
- package/src/entities/types.ts +11 -1
- package/src/index.ts +2 -0
- package/src/metadata/MessageCreator.ts +7 -4
- package/src/sync/PresenceManager.ts +94 -9
- package/src/sync/PushPullSync.ts +1 -3
- package/src/sync/Sync.ts +10 -5
- package/src/sync/WebSocketSync.ts +1 -3
- package/src/sync/cliSync.ts +18 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketSync.js","sourceRoot":"","sources":["../../../src/sync/WebSocketSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,eAAe,GAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK3C,MAAM,OAAO,aACZ,SAAQ,eAAoC;IA2B5C,YAAY,EACX,gBAAgB,EAChB,IAAI,EACJ,QAAQ,EACR,GAAG,GAMH;QACA,KAAK,EAAE,CAAC;QAjCD,WAAM,GAAqB,IAAI,CAAC;QACxC,iDAAiD;QACzC,iBAAY,GAAoB,EAAE,CAAC;QAC3C,0CAA0C;QAClC,cAAS,GAAoB,EAAE,CAAC;QACxC,sCAAsC;QAC9B,kBAAa,GAAoB,EAAE,CAAC;QAEpC,YAAO,GAAwB,QAAQ,CAAC;QACxC,WAAM,GAAG,KAAK,CAAC;QACf,mBAAc,GAAG,KAAK,CAAC;QACvB,oBAAe,GAAG,KAAK,CAAC;QAEvB,SAAI,GAAG,UAAU,CAAC;QACnB,QAAG,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE,GAAE,CAAC,CAAC;QAE7B,cAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAE5B,uBAAkB,GAAG,IAAI,gBAAgB,CAChD,IAAI,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAC3B,CAAC;QA2BM,WAAM,GAAG,GAAG,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrC,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvC,CAAC;gBACD,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC3B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACjC,CAAC,CAAC;QAEM,mBAAc,GAAG,KAAK,EAAE,MAAe,EAAE,EAAE;YAClD,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO;YACR,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC,IAAI,CACR,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"WebSocketSync.js","sourceRoot":"","sources":["../../../src/sync/WebSocketSync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function cliSync<Presence extends any = any>(libraryId: string, { port, initialPresence, }?: {
|
|
2
|
+
port?: number;
|
|
3
|
+
initialPresence?: Presence;
|
|
4
|
+
}): {
|
|
5
|
+
defaultProfile: {
|
|
6
|
+
id: string;
|
|
7
|
+
};
|
|
8
|
+
initialPresence: Presence;
|
|
9
|
+
authEndpoint: string;
|
|
10
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function cliSync(libraryId, { port = 3242, initialPresence = {}, } = {}) {
|
|
2
|
+
let userId = localStorage.getItem('verdant-userId');
|
|
3
|
+
if (!userId) {
|
|
4
|
+
userId = `user-${Math.random().toString(36).slice(2)}`;
|
|
5
|
+
localStorage.setItem('verdant-userId', userId);
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
defaultProfile: { id: userId },
|
|
9
|
+
initialPresence,
|
|
10
|
+
authEndpoint: `http://localhost:${port}/auth/${libraryId}?userId=${userId}`,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=cliSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliSync.js","sourceRoot":"","sources":["../../../src/sync/cliSync.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CACtB,SAAiB,EACjB,EACC,IAAI,GAAG,IAAI,EACX,eAAe,GAAG,EAAS,MACuB,EAAE;IAErD,IAAI,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,OAAO;QACN,cAAc,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;QAC9B,eAAe;QACf,YAAY,EAAE,oBAAoB,IAAI,SAAS,SAAS,WAAW,MAAM,EAAE;KAC3E,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdant-web/store",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.11.0",
|
|
4
4
|
"access": "public",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"jwt-decode": "^3.1.2",
|
|
28
28
|
"kysely": "^0.27.3",
|
|
29
29
|
"weak-event": "^2.0.5",
|
|
30
|
-
"@verdant-web/common": "2.
|
|
30
|
+
"@verdant-web/common": "2.5.1"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "20.10.5",
|
|
@@ -91,7 +91,7 @@ export interface ClientDescriptorOptions<Presence = any, Profile = any> {
|
|
|
91
91
|
export class ClientDescriptor<
|
|
92
92
|
Presence = any,
|
|
93
93
|
Profile = any,
|
|
94
|
-
ClientImpl extends Client = Client,
|
|
94
|
+
ClientImpl extends Client = Client<Presence, Profile>,
|
|
95
95
|
> {
|
|
96
96
|
private readonly _readyPromise: Promise<ClientImpl>;
|
|
97
97
|
// assertions because these are defined by plucking them from
|
package/src/entities/Entity.ts
CHANGED
|
@@ -396,6 +396,15 @@ export class Entity<
|
|
|
396
396
|
return !!this.access;
|
|
397
397
|
}
|
|
398
398
|
|
|
399
|
+
/**
|
|
400
|
+
* Introspects the schema of a child field of this entity.
|
|
401
|
+
*/
|
|
402
|
+
getFieldSchema = (key: any): StorageFieldSchema => {
|
|
403
|
+
const fieldSchema = getChildFieldSchema(this.schema, key);
|
|
404
|
+
assert(fieldSchema, `No schema for key ${key}`);
|
|
405
|
+
return fieldSchema;
|
|
406
|
+
};
|
|
407
|
+
|
|
399
408
|
/**
|
|
400
409
|
* Pruning - when entities have invalid children, we 'prune' that
|
|
401
410
|
* data up to the nearest prunable point - a nullable field,
|
package/src/entities/types.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ObjectIdentifier } from '@verdant-web/common';
|
|
1
|
+
import { ObjectIdentifier, StorageFieldSchema } from '@verdant-web/common';
|
|
2
2
|
import type { Entity } from './Entity.js';
|
|
3
3
|
|
|
4
4
|
export type AccessibleEntityProperty<T> = T extends Array<any>
|
|
@@ -75,6 +75,9 @@ export interface BaseEntity<
|
|
|
75
75
|
get<Key extends keyof Value>(key: Key): Value[Key];
|
|
76
76
|
getAll(): Value;
|
|
77
77
|
getSnapshot(): Snapshot;
|
|
78
|
+
getFieldSchema<FieldName extends keyof Value>(
|
|
79
|
+
key: FieldName,
|
|
80
|
+
): StorageFieldSchema;
|
|
78
81
|
readonly deleted: boolean;
|
|
79
82
|
readonly updatedAt: number;
|
|
80
83
|
readonly uid: string;
|
|
@@ -209,3 +212,10 @@ export type EntityDestructured<T extends AnyEntity<any, any, any> | null> =
|
|
|
209
212
|
? KeyValue
|
|
210
213
|
: never)
|
|
211
214
|
| (T extends null ? null : never);
|
|
215
|
+
|
|
216
|
+
export type EntityInit<T extends AnyEntity<any, any, any>> =
|
|
217
|
+
T extends ListEntity<infer Init, any, any>
|
|
218
|
+
? Init
|
|
219
|
+
: T extends ObjectEntity<infer Init, any, any>
|
|
220
|
+
? Init
|
|
221
|
+
: never;
|
package/src/index.ts
CHANGED
|
@@ -19,6 +19,7 @@ export type {
|
|
|
19
19
|
AccessibleEntityProperty,
|
|
20
20
|
AnyEntity,
|
|
21
21
|
EntityDestructured,
|
|
22
|
+
EntityInit,
|
|
22
23
|
} from './entities/types.js';
|
|
23
24
|
export { ServerSync } from './sync/Sync.js';
|
|
24
25
|
export type { SyncTransportMode } from './sync/Sync.js';
|
|
@@ -56,3 +57,4 @@ export { MigrationPathError } from './migration/errors.js';
|
|
|
56
57
|
export * from './utils/id.js';
|
|
57
58
|
export { UndoHistory } from './UndoHistory.js';
|
|
58
59
|
export * from './authorization.js';
|
|
60
|
+
export * from './sync/cliSync.js';
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
PresenceUpdateMessage,
|
|
11
11
|
SyncAckMessage,
|
|
12
12
|
SyncMessage,
|
|
13
|
+
VerdantInternalPresence,
|
|
13
14
|
} from '@verdant-web/common';
|
|
14
15
|
|
|
15
16
|
import { Metadata } from './Metadata.js';
|
|
@@ -110,14 +111,16 @@ export class MessageCreator {
|
|
|
110
111
|
};
|
|
111
112
|
};
|
|
112
113
|
|
|
113
|
-
createPresenceUpdate = async (
|
|
114
|
-
presence
|
|
115
|
-
|
|
114
|
+
createPresenceUpdate = async (data: {
|
|
115
|
+
presence?: any;
|
|
116
|
+
internal?: VerdantInternalPresence;
|
|
117
|
+
}): Promise<PresenceUpdateMessage> => {
|
|
116
118
|
const localReplicaInfo = await this.meta.localReplica.get();
|
|
117
119
|
return {
|
|
118
120
|
type: 'presence-update',
|
|
119
|
-
presence,
|
|
121
|
+
presence: data.presence,
|
|
120
122
|
replicaId: localReplicaInfo.id,
|
|
123
|
+
internal: data.internal,
|
|
121
124
|
};
|
|
122
125
|
};
|
|
123
126
|
|
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
EventSubscriber,
|
|
4
4
|
Batcher,
|
|
5
5
|
Batch,
|
|
6
|
+
VerdantInternalPresence,
|
|
7
|
+
initialInternalPresence,
|
|
6
8
|
} from '@verdant-web/common';
|
|
7
9
|
import type { UserInfo } from '../index.js';
|
|
8
10
|
import {
|
|
@@ -30,8 +32,13 @@ export class PresenceManager<
|
|
|
30
32
|
/** Fired when a peer presence goes offline */
|
|
31
33
|
peerLeft: (userId: string, lastPresence: UserInfo<Profile, Presence>) => void;
|
|
32
34
|
/** Fired after local presence changes are flushed to the server. */
|
|
33
|
-
update: (
|
|
35
|
+
update: (data: {
|
|
36
|
+
presence?: Presence;
|
|
37
|
+
internal?: VerdantInternalPresence;
|
|
38
|
+
}) => void;
|
|
34
39
|
load: () => void;
|
|
40
|
+
/** Fired on any change to a peer or the local user */
|
|
41
|
+
change: () => void;
|
|
35
42
|
}> {
|
|
36
43
|
private _peers = {} as Record<string, UserInfo<Profile, Presence>>;
|
|
37
44
|
private _self = { profile: {} } as UserInfo<Profile, Presence>;
|
|
@@ -39,7 +46,10 @@ export class PresenceManager<
|
|
|
39
46
|
private _selfReplicaIds = new Set<string>();
|
|
40
47
|
private _peerIds = new Array<string>();
|
|
41
48
|
private _updateBatcher;
|
|
42
|
-
private _updateBatch: Batch<
|
|
49
|
+
private _updateBatch: Batch<{
|
|
50
|
+
presence?: Partial<Presence>;
|
|
51
|
+
internal?: Partial<VerdantInternalPresence>;
|
|
52
|
+
}>;
|
|
43
53
|
|
|
44
54
|
get self() {
|
|
45
55
|
return this._self;
|
|
@@ -77,6 +87,7 @@ export class PresenceManager<
|
|
|
77
87
|
super();
|
|
78
88
|
this.self.presence = initialPresence;
|
|
79
89
|
this.self.profile = defaultProfile;
|
|
90
|
+
this.self.internal = initialInternalPresence;
|
|
80
91
|
this.self.id = '';
|
|
81
92
|
this.self.replicaId = '';
|
|
82
93
|
|
|
@@ -119,12 +130,14 @@ export class PresenceManager<
|
|
|
119
130
|
message: ServerMessage,
|
|
120
131
|
) => {
|
|
121
132
|
let peersChanged = false;
|
|
133
|
+
let selfChanged = false;
|
|
122
134
|
const peerIdsSet = new Set<string>(this.peerIds);
|
|
123
135
|
|
|
124
136
|
if (message.type === 'presence-changed') {
|
|
125
137
|
if (this.isSelf(localReplicaInfo, message.userInfo)) {
|
|
126
138
|
this._self = message.userInfo;
|
|
127
139
|
this._selfReplicaIds.add(message.userInfo.replicaId);
|
|
140
|
+
selfChanged = true;
|
|
128
141
|
this.emit('selfChanged', message.userInfo);
|
|
129
142
|
} else {
|
|
130
143
|
peerIdsSet.add(message.userInfo.id);
|
|
@@ -141,6 +154,7 @@ export class PresenceManager<
|
|
|
141
154
|
if (this.isSelf(localReplicaInfo, userInfo)) {
|
|
142
155
|
this._self = userInfo;
|
|
143
156
|
this._selfReplicaIds.add(userInfo.replicaId);
|
|
157
|
+
selfChanged = true;
|
|
144
158
|
this.emit('selfChanged', userInfo);
|
|
145
159
|
} else {
|
|
146
160
|
peersChanged = true;
|
|
@@ -158,24 +172,95 @@ export class PresenceManager<
|
|
|
158
172
|
this.emit('peerLeft', message.userId, lastPresence);
|
|
159
173
|
}
|
|
160
174
|
if (peersChanged) {
|
|
161
|
-
this
|
|
175
|
+
// important that this stays sorted to keep stable order, don't want
|
|
176
|
+
// peers swapping around.
|
|
177
|
+
this._peerIds = Array.from(peerIdsSet).sort();
|
|
162
178
|
this.emit('peersChanged', this._peers);
|
|
163
179
|
}
|
|
180
|
+
if (peersChanged || selfChanged) {
|
|
181
|
+
this.emit('change');
|
|
182
|
+
}
|
|
164
183
|
};
|
|
165
184
|
|
|
166
185
|
update = async (presence: Partial<Presence>) => {
|
|
167
186
|
this._updateBatch.update({
|
|
168
|
-
items: [presence],
|
|
187
|
+
items: [{ presence }],
|
|
169
188
|
});
|
|
170
189
|
// proactively update the local presence
|
|
171
190
|
this.self.presence = { ...this.self.presence, ...presence };
|
|
172
191
|
this.emit('selfChanged', this.self);
|
|
192
|
+
this.emit('change');
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
flushPresenceUpdates = (
|
|
196
|
+
presenceUpdates: {
|
|
197
|
+
presence?: Partial<Presence>;
|
|
198
|
+
internal?: Partial<VerdantInternalPresence>;
|
|
199
|
+
}[],
|
|
200
|
+
) => {
|
|
201
|
+
const data = {
|
|
202
|
+
presence: this.self.presence,
|
|
203
|
+
internal: this.self.internal,
|
|
204
|
+
};
|
|
205
|
+
for (const update of presenceUpdates) {
|
|
206
|
+
if (update.presence) {
|
|
207
|
+
Object.assign(data.presence as any, update.presence);
|
|
208
|
+
}
|
|
209
|
+
if (update.internal) {
|
|
210
|
+
Object.assign(data.internal, update.internal);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
this.emit('update', data);
|
|
173
214
|
};
|
|
174
215
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}
|
|
179
|
-
this.
|
|
216
|
+
setViewId = (viewId: string | undefined) => {
|
|
217
|
+
this._updateBatch.update({
|
|
218
|
+
items: [{ internal: { viewId } }],
|
|
219
|
+
});
|
|
220
|
+
this.self.internal.viewId = viewId;
|
|
221
|
+
this.emit('selfChanged', this.self);
|
|
222
|
+
this.emit('change');
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
setFieldId = (fieldId: string | undefined, timestamp = Date.now()) => {
|
|
226
|
+
this._updateBatch.update({
|
|
227
|
+
items: [
|
|
228
|
+
{ internal: { lastFieldId: fieldId, lastFieldTimestamp: timestamp } },
|
|
229
|
+
],
|
|
230
|
+
});
|
|
231
|
+
this.self.internal.lastFieldId = fieldId;
|
|
232
|
+
this.emit('selfChanged', this.self);
|
|
233
|
+
this.emit('change');
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Get all peers that are in the same view as the local user.
|
|
238
|
+
*/
|
|
239
|
+
getViewPeers = () => {
|
|
240
|
+
return (
|
|
241
|
+
this._peerIds
|
|
242
|
+
.map((id) => this._peers[id])
|
|
243
|
+
// undefined view matches all peers. otherwise,
|
|
244
|
+
// filter to only those in the same view.
|
|
245
|
+
.filter(
|
|
246
|
+
(peer) =>
|
|
247
|
+
this.self.internal.viewId === undefined ||
|
|
248
|
+
peer.internal.viewId === this.self.internal.viewId,
|
|
249
|
+
)
|
|
250
|
+
);
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Get all peers that have interacted with the specified
|
|
255
|
+
* field most recently.
|
|
256
|
+
*/
|
|
257
|
+
getFieldPeers = (fieldId: string, expirationPeriod = 60 * 1000) => {
|
|
258
|
+
return this._peerIds
|
|
259
|
+
.map((id) => this._peers[id])
|
|
260
|
+
.filter(
|
|
261
|
+
(peer) =>
|
|
262
|
+
peer.internal.lastFieldId === fieldId &&
|
|
263
|
+
Date.now() - peer.internal.lastFieldTimestamp! < expirationPeriod,
|
|
264
|
+
);
|
|
180
265
|
};
|
|
181
266
|
}
|
package/src/sync/PushPullSync.ts
CHANGED
|
@@ -204,9 +204,7 @@ export class PushPullSync
|
|
|
204
204
|
// will include the client's own presence info and fill in missing profile
|
|
205
205
|
// data on the first request. otherwise it would have to wait for the second.
|
|
206
206
|
this.sendRequest([
|
|
207
|
-
await this.meta.messageCreator.createPresenceUpdate(
|
|
208
|
-
this.presence.self.presence,
|
|
209
|
-
),
|
|
207
|
+
await this.meta.messageCreator.createPresenceUpdate(this.presence.self),
|
|
210
208
|
await this.meta.messageCreator.createSyncStep1(),
|
|
211
209
|
]);
|
|
212
210
|
};
|
package/src/sync/Sync.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
rewriteAuthzOriginator,
|
|
9
9
|
ServerMessage,
|
|
10
10
|
VerdantError,
|
|
11
|
+
VerdantInternalPresence,
|
|
11
12
|
} from '@verdant-web/common';
|
|
12
13
|
import { Metadata } from '../metadata/Metadata.js';
|
|
13
14
|
import { HANDLE_MESSAGE, PresenceManager } from './PresenceManager.js';
|
|
@@ -299,12 +300,13 @@ export class ServerSync<Presence = any, Profile = any>
|
|
|
299
300
|
|
|
300
301
|
if (automaticTransportSelection && this.canDoRealtime) {
|
|
301
302
|
// automatically shift between transport modes depending
|
|
302
|
-
// on whether any peers are present
|
|
303
|
+
// on whether any peers are present (matching view if
|
|
304
|
+
// applicable)
|
|
303
305
|
const decideIfUpgrade = () => {
|
|
304
306
|
if (switchoverTimeout) {
|
|
305
307
|
clearTimeout(switchoverTimeout);
|
|
306
308
|
}
|
|
307
|
-
const hasPeers =
|
|
309
|
+
const hasPeers = this.presence.getViewPeers().length > 0;
|
|
308
310
|
const shouldUpgrade =
|
|
309
311
|
hasPeers ||
|
|
310
312
|
(automaticTransportSelection !== 'peers-only' &&
|
|
@@ -314,7 +316,7 @@ export class ServerSync<Presence = any, Profile = any>
|
|
|
314
316
|
} else if (!shouldUpgrade && this.mode === 'realtime') {
|
|
315
317
|
// wait 1 second then switch to pull mode if still empty
|
|
316
318
|
switchoverTimeout = setTimeout(() => {
|
|
317
|
-
if (
|
|
319
|
+
if (this.presence.getViewPeers().length === 0) {
|
|
318
320
|
this.setMode('pull');
|
|
319
321
|
}
|
|
320
322
|
}, 1000);
|
|
@@ -422,8 +424,11 @@ export class ServerSync<Presence = any, Profile = any>
|
|
|
422
424
|
private handleOnlineChange = (online: boolean) => {
|
|
423
425
|
this.emit('onlineChange', online);
|
|
424
426
|
};
|
|
425
|
-
private handlePresenceUpdate = async (
|
|
426
|
-
|
|
427
|
+
private handlePresenceUpdate = async (data: {
|
|
428
|
+
presence?: Presence;
|
|
429
|
+
internal?: VerdantInternalPresence;
|
|
430
|
+
}) => {
|
|
431
|
+
this.send(await this.meta.messageCreator.createPresenceUpdate(data));
|
|
427
432
|
};
|
|
428
433
|
|
|
429
434
|
setMode = (transport: SyncTransportMode) => {
|
|
@@ -94,9 +94,7 @@ export class WebSocketSync
|
|
|
94
94
|
this.hasStartedSync = true;
|
|
95
95
|
this.synced = false;
|
|
96
96
|
this.send(
|
|
97
|
-
await this.meta.messageCreator.createPresenceUpdate(
|
|
98
|
-
this.presence.self.presence,
|
|
99
|
-
),
|
|
97
|
+
await this.meta.messageCreator.createPresenceUpdate(this.presence.self),
|
|
100
98
|
);
|
|
101
99
|
this.send(await this.meta.messageCreator.createSyncStep1());
|
|
102
100
|
this.heartbeat.start();
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function cliSync<Presence extends any = any>(
|
|
2
|
+
libraryId: string,
|
|
3
|
+
{
|
|
4
|
+
port = 3242,
|
|
5
|
+
initialPresence = {} as any,
|
|
6
|
+
}: { port?: number; initialPresence?: Presence } = {},
|
|
7
|
+
) {
|
|
8
|
+
let userId = localStorage.getItem('verdant-userId');
|
|
9
|
+
if (!userId) {
|
|
10
|
+
userId = `user-${Math.random().toString(36).slice(2)}`;
|
|
11
|
+
localStorage.setItem('verdant-userId', userId);
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
defaultProfile: { id: userId },
|
|
15
|
+
initialPresence,
|
|
16
|
+
authEndpoint: `http://localhost:${port}/auth/${libraryId}?userId=${userId}`,
|
|
17
|
+
};
|
|
18
|
+
}
|