@peers-app/peers-device 0.8.7 → 0.8.8

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.
@@ -28,12 +28,72 @@ export declare class NetworkManager {
28
28
  private readonly onConnectionRemovedSubscription;
29
29
  private readonly unsubscribeFunctions;
30
30
  private checkForWellConnectedPromise;
31
+ /** Tracks all devices we know about across all groups */
32
+ private readonly trackedDevices;
33
+ /** Tracks connection state per group */
34
+ private readonly groupConnectionStates;
35
+ /** Cache of deviceId -> userId mappings */
36
+ private readonly deviceUserIdCache;
31
37
  constructor(connectionManager: ConnectionManager, protocolManagers?: IProtocolManager[]);
32
38
  private sortProtocolManagers;
33
39
  /**
34
40
  * Register handlers for device messages
35
41
  */
36
42
  private setupHandler;
43
+ /**
44
+ * Track a device we learn about (from connections, network info, device discovery, etc.)
45
+ */
46
+ private trackDevice;
47
+ /**
48
+ * Update device status after connection attempt
49
+ */
50
+ private updateDeviceStatus;
51
+ /**
52
+ * Check if a device should be retried (respects cooldown for failed attempts)
53
+ */
54
+ private shouldRetryDevice;
55
+ /**
56
+ * Look up userId for a deviceId (cache + Devices table fallback)
57
+ */
58
+ private getDeviceUserId;
59
+ /**
60
+ * Update which devices are preferred for a group (from network info)
61
+ */
62
+ private updatePreferredDevicesFromNetworkInfo;
63
+ /**
64
+ * Update tracking state when a connection is added or removed
65
+ */
66
+ private updateTrackingFromConnection;
67
+ /**
68
+ * Recompute connected users for a group after a connection change
69
+ */
70
+ private recomputeConnectedUsers;
71
+ /**
72
+ * Get or create group connection state
73
+ */
74
+ private getOrCreateGroupState;
75
+ /**
76
+ * Populate memberUserIds from GroupMembers table
77
+ */
78
+ private updateGroupMembership;
79
+ /**
80
+ * Get target user count for a group (based on membership, capped at MAX_USERS_PER_GROUP)
81
+ */
82
+ private getTargetUserCount;
83
+ /**
84
+ * Get own devices to connect to (all if ≤MAX_OWN_DEVICES, else top by preference/status)
85
+ */
86
+ private getOwnDevicesToConnect;
87
+ /**
88
+ * Get the best devices to connect to for a GROUP (5-tier priority, user-diverse)
89
+ *
90
+ * Tier 1: Preferred devices of OTHER users (not yet connected to that user)
91
+ * Tier 2: Non-preferred devices of OTHER users (not yet connected to that user)
92
+ * Tier 3: Devices of OTHER users we're already connected to (preferred first)
93
+ * Tier 4: Preferred devices of MY OWN user
94
+ * Tier 5: Non-preferred devices of MY OWN user
95
+ */
96
+ private getDevicesToConnect;
37
97
  /**
38
98
  * Check if we're well connected to all personal devices and establish connections if needed.
39
99
  * This is called when connections are added or removed.
@@ -42,7 +102,10 @@ export declare class NetworkManager {
42
102
  private checkForWellConnected;
43
103
  /**
44
104
  * Internal implementation of well-connected check.
45
- * Ensures we have good connections (libp2p, https, wss, or wrtc) to all personal devices.
105
+ *
106
+ * Phase 1: Connect to own devices (for personal data sync, capped at MAX_OWN_DEVICES)
107
+ * Phase 2: Gather network info from peers to learn about devices and preferences
108
+ * Phase 3: For each group, ensure user-diverse connections using 5-tier priority
46
109
  */
47
110
  private _checkForWellConnected;
48
111
  connectToDevice(deviceId: string, dataContextId?: string, protocol?: string): Promise<void>;
@@ -2,7 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NetworkManager = void 0;
4
4
  const peers_sdk_1 = require("@peers-app/peers-sdk");
5
+ const lodash_1 = require("lodash");
5
6
  const connection_manager_1 = require("./connection-manager");
7
+ /** Maximum own devices to connect to */
8
+ const MAX_OWN_DEVICES = 8;
9
+ /** Maximum other users to connect to per group */
10
+ const MAX_USERS_PER_GROUP = 5;
11
+ /** Cooldown period before retrying a failed connection (ms) */
12
+ const RETRY_COOLDOWN_MS = 60_000;
6
13
  /**
7
14
  * NetworkManager is responsible for deciding when and which devices to connect to,
8
15
  * and which protocol to use for those connections.
@@ -31,16 +38,28 @@ class NetworkManager {
31
38
  onConnectionRemovedSubscription;
32
39
  unsubscribeFunctions = [];
33
40
  checkForWellConnectedPromise = Promise.resolve();
41
+ /** Tracks all devices we know about across all groups */
42
+ trackedDevices = new Map();
43
+ /** Tracks connection state per group */
44
+ groupConnectionStates = new Map();
45
+ /** Cache of deviceId -> userId mappings */
46
+ deviceUserIdCache = new Map();
34
47
  constructor(connectionManager, protocolManagers = []) {
35
48
  this.connectionManager = connectionManager;
36
49
  this.protocolManagers = protocolManagers;
37
50
  // Register handler for protocol support queries
38
51
  this.setupHandler();
39
- // Subscribe to connection changes to trigger well-connected checks
52
+ // Subscribe to connection changes to trigger well-connected checks and update tracking
40
53
  this.onConnectionAddedSubscription = this.connectionManager.onConnectionAdded.subscribe(connection => {
54
+ if (connection) {
55
+ this.updateTrackingFromConnection(connection, false);
56
+ }
41
57
  this.checkForWellConnected(connection);
42
58
  });
43
- this.onConnectionRemovedSubscription = this.connectionManager.onConnectionRemoved.subscribe(() => {
59
+ this.onConnectionRemovedSubscription = this.connectionManager.onConnectionRemoved.subscribe(connection => {
60
+ if (connection) {
61
+ this.updateTrackingFromConnection(connection, true);
62
+ }
44
63
  this.checkForWellConnected();
45
64
  });
46
65
  this.connectionManager.onUserConnectExchangeFinished.subscribe(deviceId => {
@@ -52,12 +71,12 @@ class NetworkManager {
52
71
  }
53
72
  sortProtocolManagers() {
54
73
  const protocolPriority = {
55
- 'wss': 1, // TLS websockets
56
- 'https': 1, // TLS websockets
74
+ 'wss': 1, // TLS websockets - fast and reliable
75
+ 'https': 1, // TLS websockets - fast and reliable
57
76
  'ws': 10, // slower due to Peers high-level encryption
58
77
  'http': 10, // slower due to Peers high-level encryption
59
- 'wrtc': 20, // wrtc has the best chance of connecting but is the slowest connection
60
- 'libp2p': 30, // basically tcp under the hood
78
+ 'libp2p': 20, // basically tcp under the hood
79
+ 'wrtc': 30, // wrtc has the best chance of connecting but is the slowest connection
61
80
  };
62
81
  const defaultPriority = 99; // protocols not listed will sort last
63
82
  this.protocolManagers.sort((a, b) => (protocolPriority[a.protocolName] ?? defaultPriority) -
@@ -92,6 +111,264 @@ class NetworkManager {
92
111
  });
93
112
  this.unsubscribeFunctions.push(protocolSupportSub);
94
113
  }
114
+ // ============================================================================
115
+ // Device Tracking Methods
116
+ // ============================================================================
117
+ /**
118
+ * Track a device we learn about (from connections, network info, device discovery, etc.)
119
+ */
120
+ trackDevice(deviceId, userId, groupIds) {
121
+ if (deviceId === (0, peers_sdk_1.thisDeviceId)())
122
+ return;
123
+ let tracked = this.trackedDevices.get(deviceId);
124
+ if (!tracked) {
125
+ tracked = {
126
+ deviceId,
127
+ userId,
128
+ status: 'notTried',
129
+ failureCount: 0,
130
+ groupIds: new Set(groupIds),
131
+ preferredForGroups: new Set(),
132
+ };
133
+ this.trackedDevices.set(deviceId, tracked);
134
+ }
135
+ else {
136
+ // Update userId if we didn't have it
137
+ if (!tracked.userId && userId) {
138
+ tracked.userId = userId;
139
+ }
140
+ // Add new group associations
141
+ for (const groupId of groupIds) {
142
+ tracked.groupIds.add(groupId);
143
+ }
144
+ }
145
+ // Cache the userId mapping
146
+ if (userId) {
147
+ this.deviceUserIdCache.set(deviceId, userId);
148
+ }
149
+ }
150
+ /**
151
+ * Update device status after connection attempt
152
+ */
153
+ updateDeviceStatus(deviceId, status) {
154
+ const tracked = this.trackedDevices.get(deviceId);
155
+ if (!tracked)
156
+ return;
157
+ tracked.status = status;
158
+ tracked.lastAttemptTime = Date.now();
159
+ if (status === 'triedButFailed') {
160
+ tracked.failureCount++;
161
+ }
162
+ else if (status === 'connected') {
163
+ tracked.failureCount = 0;
164
+ }
165
+ }
166
+ /**
167
+ * Check if a device should be retried (respects cooldown for failed attempts)
168
+ */
169
+ shouldRetryDevice(deviceId) {
170
+ const tracked = this.trackedDevices.get(deviceId);
171
+ if (!tracked)
172
+ return true; // Unknown device, try it
173
+ if (tracked.status === 'connected')
174
+ return false; // Already connected
175
+ if (tracked.status === 'triedButFailed' && tracked.lastAttemptTime) {
176
+ const timeSinceAttempt = Date.now() - tracked.lastAttemptTime;
177
+ if (timeSinceAttempt < RETRY_COOLDOWN_MS) {
178
+ return false; // Still in cooldown
179
+ }
180
+ }
181
+ return true;
182
+ }
183
+ /**
184
+ * Look up userId for a deviceId (cache + Devices table fallback)
185
+ */
186
+ async getDeviceUserId(deviceId) {
187
+ // Check cache first
188
+ const cached = this.deviceUserIdCache.get(deviceId);
189
+ if (cached)
190
+ return cached;
191
+ // Fall back to Devices table lookup
192
+ try {
193
+ const userContext = this.connectionManager.userContext;
194
+ const device = await (0, peers_sdk_1.Devices)(userContext.userDataContext).get(deviceId);
195
+ if (device?.userId) {
196
+ this.deviceUserIdCache.set(deviceId, device.userId);
197
+ return device.userId;
198
+ }
199
+ }
200
+ catch (e) {
201
+ // Ignore errors
202
+ }
203
+ return undefined;
204
+ }
205
+ /**
206
+ * Update which devices are preferred for a group (from network info)
207
+ */
208
+ updatePreferredDevicesFromNetworkInfo(groupId, networkInfo) {
209
+ for (const deviceId of networkInfo.preferredDeviceIds) {
210
+ const tracked = this.trackedDevices.get(deviceId);
211
+ if (tracked) {
212
+ tracked.preferredForGroups.add(groupId);
213
+ }
214
+ }
215
+ }
216
+ /**
217
+ * Update tracking state when a connection is added or removed
218
+ */
219
+ updateTrackingFromConnection(connection, removed) {
220
+ const deviceId = connection.remoteDeviceInfo.deviceId;
221
+ const userId = connection.remoteDeviceInfo.userId;
222
+ if (!deviceId)
223
+ return;
224
+ // Cache the userId
225
+ if (userId) {
226
+ this.deviceUserIdCache.set(deviceId, userId);
227
+ }
228
+ if (removed) {
229
+ this.updateDeviceStatus(deviceId, 'connectedThenDisconnected');
230
+ // Update all group states that had this device
231
+ for (const [groupId, groupState] of this.groupConnectionStates) {
232
+ if (groupState.connectedDeviceIds.has(deviceId)) {
233
+ groupState.connectedDeviceIds.delete(deviceId);
234
+ this.recomputeConnectedUsers(groupId);
235
+ }
236
+ }
237
+ }
238
+ else {
239
+ // Track the device (groups will be determined later when we check well-connected)
240
+ this.trackDevice(deviceId, userId, []);
241
+ this.updateDeviceStatus(deviceId, 'connected');
242
+ }
243
+ }
244
+ /**
245
+ * Recompute connected users for a group after a connection change
246
+ */
247
+ recomputeConnectedUsers(groupId) {
248
+ const groupState = this.groupConnectionStates.get(groupId);
249
+ if (!groupState)
250
+ return;
251
+ groupState.connectedUserIds.clear();
252
+ for (const deviceId of groupState.connectedDeviceIds) {
253
+ const userId = this.deviceUserIdCache.get(deviceId);
254
+ if (userId) {
255
+ groupState.connectedUserIds.add(userId);
256
+ }
257
+ }
258
+ }
259
+ /**
260
+ * Get or create group connection state
261
+ */
262
+ getOrCreateGroupState(groupId) {
263
+ let state = this.groupConnectionStates.get(groupId);
264
+ if (!state) {
265
+ state = {
266
+ groupId,
267
+ connectedDeviceIds: new Set(),
268
+ connectedUserIds: new Set(),
269
+ memberUserIds: new Set(),
270
+ };
271
+ this.groupConnectionStates.set(groupId, state);
272
+ }
273
+ return state;
274
+ }
275
+ /**
276
+ * Populate memberUserIds from GroupMembers table
277
+ */
278
+ async updateGroupMembership(groupId, groupDataContext) {
279
+ const groupState = this.getOrCreateGroupState(groupId);
280
+ try {
281
+ const groupMembers = await (0, peers_sdk_1.GroupMembers)(groupDataContext).list({ deleted: { $ne: true } });
282
+ groupState.memberUserIds.clear();
283
+ for (const member of groupMembers) {
284
+ groupState.memberUserIds.add(member.userId);
285
+ }
286
+ }
287
+ catch (e) {
288
+ // Ignore errors - group membership will be incomplete
289
+ }
290
+ }
291
+ /**
292
+ * Get target user count for a group (based on membership, capped at MAX_USERS_PER_GROUP)
293
+ */
294
+ getTargetUserCount(groupId) {
295
+ const groupState = this.groupConnectionStates.get(groupId);
296
+ if (!groupState)
297
+ return MAX_USERS_PER_GROUP;
298
+ const myUserId = this.connectionManager.userContext.userId;
299
+ const otherUserCount = [...groupState.memberUserIds].filter(id => id !== myUserId).length;
300
+ // Target: all other users, capped at MAX_USERS_PER_GROUP
301
+ return Math.min(otherUserCount || MAX_USERS_PER_GROUP, MAX_USERS_PER_GROUP);
302
+ }
303
+ /**
304
+ * Get own devices to connect to (all if ≤MAX_OWN_DEVICES, else top by preference/status)
305
+ */
306
+ getOwnDevicesToConnect() {
307
+ const myUserId = this.connectionManager.userContext.userId;
308
+ const ownDevices = Array.from(this.trackedDevices.values())
309
+ .filter(d => d.userId === myUserId && d.deviceId !== (0, peers_sdk_1.thisDeviceId)())
310
+ .filter(d => d.status !== 'connected')
311
+ .filter(d => this.shouldRetryDevice(d.deviceId));
312
+ if (ownDevices.length <= MAX_OWN_DEVICES) {
313
+ return ownDevices.map(d => d.deviceId);
314
+ }
315
+ // More than MAX_OWN_DEVICES: prioritize preferred, then by status
316
+ const isPreferred = (d) => d.preferredForGroups.size > 0;
317
+ const preferred = ownDevices.filter(isPreferred);
318
+ const nonPreferred = ownDevices.filter(d => !isPreferred(d));
319
+ const sortByStatus = (devices) => (0, lodash_1.sortBy)(devices, d => d.status === 'connectedThenDisconnected' ? 0 :
320
+ d.status === 'notTried' ? 1 : 2);
321
+ return [
322
+ ...sortByStatus(preferred),
323
+ ...sortByStatus(nonPreferred),
324
+ ].slice(0, MAX_OWN_DEVICES).map(d => d.deviceId);
325
+ }
326
+ /**
327
+ * Get the best devices to connect to for a GROUP (5-tier priority, user-diverse)
328
+ *
329
+ * Tier 1: Preferred devices of OTHER users (not yet connected to that user)
330
+ * Tier 2: Non-preferred devices of OTHER users (not yet connected to that user)
331
+ * Tier 3: Devices of OTHER users we're already connected to (preferred first)
332
+ * Tier 4: Preferred devices of MY OWN user
333
+ * Tier 5: Non-preferred devices of MY OWN user
334
+ */
335
+ getDevicesToConnect(groupId, targetCount) {
336
+ if (targetCount <= 0)
337
+ return [];
338
+ const groupState = this.groupConnectionStates.get(groupId);
339
+ const myUserId = this.connectionManager.userContext.userId;
340
+ // Get all known devices for this group that we can retry
341
+ const groupDevices = Array.from(this.trackedDevices.values())
342
+ .filter(d => d.groupIds.has(groupId) && d.deviceId !== (0, peers_sdk_1.thisDeviceId)())
343
+ .filter(d => d.status !== 'connected')
344
+ .filter(d => this.shouldRetryDevice(d.deviceId));
345
+ const connectedUserIds = groupState?.connectedUserIds ?? new Set();
346
+ // Helper: is this device preferred for this group?
347
+ const isPreferred = (d) => d.preferredForGroups.has(groupId);
348
+ // Helper: sort by connection status within a tier
349
+ const sortByStatus = (devices) => (0, lodash_1.sortBy)(devices, d => d.status === 'connectedThenDisconnected' ? 0 :
350
+ d.status === 'notTried' ? 1 : 2);
351
+ // Partition devices into groups
352
+ const otherUserUnconnected = groupDevices.filter(d => d.userId && d.userId !== myUserId && !connectedUserIds.has(d.userId));
353
+ const otherUserConnected = groupDevices.filter(d => d.userId && d.userId !== myUserId && connectedUserIds.has(d.userId));
354
+ const ownDevices = groupDevices.filter(d => d.userId === myUserId);
355
+ // Tier 1: Preferred devices of OTHER users (unconnected users)
356
+ const tier1 = sortByStatus(otherUserUnconnected.filter(isPreferred));
357
+ // Tier 2: Non-preferred devices of OTHER users (unconnected users)
358
+ const tier2 = sortByStatus(otherUserUnconnected.filter(d => !isPreferred(d)));
359
+ // Tier 3: Devices of OTHER users we're already connected to (preferred first)
360
+ const tier3 = [
361
+ ...sortByStatus(otherUserConnected.filter(isPreferred)),
362
+ ...sortByStatus(otherUserConnected.filter(d => !isPreferred(d))),
363
+ ];
364
+ // Tier 4: Preferred devices of MY OWN user
365
+ const tier4 = sortByStatus(ownDevices.filter(isPreferred));
366
+ // Tier 5: Non-preferred devices of MY OWN user
367
+ const tier5 = sortByStatus(ownDevices.filter(d => !isPreferred(d)));
368
+ return [...tier1, ...tier2, ...tier3, ...tier4, ...tier5]
369
+ .slice(0, targetCount)
370
+ .map(d => d.deviceId);
371
+ }
95
372
  /**
96
373
  * Check if we're well connected to all personal devices and establish connections if needed.
97
374
  * This is called when connections are added or removed.
@@ -110,57 +387,135 @@ class NetworkManager {
110
387
  }
111
388
  /**
112
389
  * Internal implementation of well-connected check.
113
- * Ensures we have good connections (libp2p, https, wss, or wrtc) to all personal devices.
390
+ *
391
+ * Phase 1: Connect to own devices (for personal data sync, capped at MAX_OWN_DEVICES)
392
+ * Phase 2: Gather network info from peers to learn about devices and preferences
393
+ * Phase 3: For each group, ensure user-diverse connections using 5-tier priority
114
394
  */
115
395
  async _checkForWellConnected(newConnection) {
116
396
  if (newConnection) {
117
- await (0, peers_sdk_1.sleep)(10_000); // wait for connection to stabilize
397
+ await (0, peers_sdk_1.sleep)(3_000); // wait for connection to stabilize
118
398
  }
119
399
  console.log(`[NetworkManager] Checking for well-connected devices (pending calls: ${this.pendingCallCnt})`);
120
400
  const userContext = this.connectionManager.userContext;
121
- // Step 1 - I always want to be connected to ALL of my own devices
122
- // TODO: revisit this for a user with >10 devices
123
- const myDevices = (0, peers_sdk_1.Devices)(userContext.userDataContext).cursor({
124
- userId: userContext.userId
125
- });
126
- for await (const myRemoteDevice of myDevices) {
127
- await this.connectToDevice(myRemoteDevice.deviceId, userContext.userId);
401
+ // ========================================================================
402
+ // PHASE 1: Connect to own devices (for personal data sync)
403
+ // ========================================================================
404
+ // First, track all own devices from the Devices table
405
+ const myDevicesList = await (0, peers_sdk_1.Devices)(userContext.userDataContext).list({ userId: userContext.userId });
406
+ for (const device of myDevicesList) {
407
+ if (device.deviceId !== (0, peers_sdk_1.thisDeviceId)()) {
408
+ this.trackDevice(device.deviceId, userContext.userId, [userContext.userId]);
409
+ }
410
+ }
411
+ // Select which own devices to connect to (all if ≤MAX_OWN_DEVICES, else top by preference/status)
412
+ const ownDevicesToConnect = this.getOwnDevicesToConnect();
413
+ for (const deviceId of ownDevicesToConnect) {
414
+ await this.connectToDevice(deviceId, userContext.userId);
128
415
  await (0, peers_sdk_1.sleep)(100);
129
416
  }
130
417
  await (0, peers_sdk_1.sleep)(1000);
131
- // Step 2 - I want at least 1, and preferably 2 or 3, connections for all my groups
132
- const dataContexts = Array.from(userContext.groupDataContexts.values());
133
- for (const groupDataContext of [userContext.userDataContext, ...dataContexts]) {
418
+ // ========================================================================
419
+ // PHASE 2: Gather network info from connected peers
420
+ // ========================================================================
421
+ // Collect all data contexts (personal + groups)
422
+ const allDataContexts = [userContext.userDataContext, ...userContext.groupDataContexts.values()];
423
+ for (const groupDataContext of allDataContexts) {
424
+ const groupId = groupDataContext.dataContextId;
134
425
  const syncGroup = this.connectionManager.getPeerGroupDevice(groupDataContext);
135
426
  const connections = syncGroup.getConnections();
136
- if (connections.length > 2) {
137
- continue;
427
+ // Update group state with current connections
428
+ const groupState = this.getOrCreateGroupState(groupId);
429
+ groupState.connectedDeviceIds.clear();
430
+ groupState.connectedUserIds.clear();
431
+ for (const conn of connections) {
432
+ groupState.connectedDeviceIds.add(conn.deviceId);
433
+ const userId = await this.getDeviceUserId(conn.deviceId);
434
+ if (userId) {
435
+ groupState.connectedUserIds.add(userId);
436
+ }
138
437
  }
438
+ // Query each connected peer for their network info to learn about other devices
439
+ for (const conn of connections) {
440
+ try {
441
+ const networkInfo = await syncGroup.getRemoteNetworkInfo(conn.deviceId);
442
+ // Track all devices this peer knows about
443
+ for (const remoteConn of networkInfo.connections) {
444
+ const userId = await this.getDeviceUserId(remoteConn.deviceId);
445
+ if (userId) {
446
+ this.trackDevice(remoteConn.deviceId, userId, [groupId]);
447
+ }
448
+ }
449
+ // Update which devices are preferred for this group
450
+ this.updatePreferredDevicesFromNetworkInfo(groupId, networkInfo);
451
+ }
452
+ catch (e) {
453
+ // Ignore errors from individual peers
454
+ }
455
+ }
456
+ }
457
+ // ========================================================================
458
+ // PHASE 3: Ensure user-diverse connections for each group
459
+ // ========================================================================
460
+ // Handle personal data context - just ensure we have some connections
461
+ {
462
+ const personalContext = userContext.userDataContext;
463
+ const personalGroupId = personalContext.dataContextId;
464
+ const syncGroup = this.connectionManager.getPeerGroupDevice(personalContext);
465
+ const connections = syncGroup.getConnections();
139
466
  if (connections.length === 0) {
140
- // use sendDevice to try to find a device for this group
467
+ // Bootstrap: use sendDeviceMessage to try to find a device
141
468
  const response = await this.connectionManager.sendDeviceMessage({
142
- dataContextId: groupDataContext.dataContextId,
469
+ dataContextId: personalGroupId,
143
470
  payload: 0,
144
471
  toDeviceId: '',
145
472
  });
146
473
  if (response?.statusCode === 200) {
147
474
  const hops = response.hops;
148
475
  const targetDeviceId = hops.pop();
149
- await this.connectToDevice(targetDeviceId, groupDataContext.dataContextId);
476
+ if (targetDeviceId) {
477
+ await this.connectToDevice(targetDeviceId, personalGroupId);
478
+ }
150
479
  }
151
480
  }
152
- else {
153
- // use existing connections to try to find new ones
154
- for (const connection of connections) {
155
- const networkInfo = await syncGroup.getRemoteNetworkInfo(connection.deviceId);
156
- for (const remoteDeviceId of networkInfo.preferredDeviceIds) {
157
- const existingConnection = this.connectionManager.getDeviceConnection(remoteDeviceId);
158
- if (!existingConnection) {
159
- await this.connectToDevice(remoteDeviceId);
160
- return;
161
- }
481
+ }
482
+ await (0, peers_sdk_1.sleep)(500);
483
+ // Handle group data contexts with user-diverse connection strategy
484
+ for (const groupDataContext of userContext.groupDataContexts.values()) {
485
+ const groupId = groupDataContext.dataContextId;
486
+ const syncGroup = this.connectionManager.getPeerGroupDevice(groupDataContext);
487
+ const connections = syncGroup.getConnections();
488
+ // Update group membership from GroupMembers table
489
+ await this.updateGroupMembership(groupId, groupDataContext);
490
+ const groupState = this.getOrCreateGroupState(groupId);
491
+ if (connections.length === 0) {
492
+ // Bootstrap: use sendDeviceMessage to try to find a device for this group
493
+ const response = await this.connectionManager.sendDeviceMessage({
494
+ dataContextId: groupId,
495
+ payload: 0,
496
+ toDeviceId: '',
497
+ });
498
+ if (response?.statusCode === 200) {
499
+ const hops = response.hops;
500
+ const targetDeviceId = hops.pop();
501
+ if (targetDeviceId) {
502
+ await this.connectToDevice(targetDeviceId, groupId);
162
503
  }
163
504
  }
505
+ continue; // Move to next group, we'll connect more on next check
506
+ }
507
+ // Determine how many other users we need to be connected to
508
+ const targetUserCount = this.getTargetUserCount(groupId);
509
+ const connectedOtherUserCount = [...groupState.connectedUserIds]
510
+ .filter(id => id !== userContext.userId).length;
511
+ // If we're not connected to enough other users, try to connect to more
512
+ if (connectedOtherUserCount < targetUserCount) {
513
+ const neededConnections = targetUserCount - connectedOtherUserCount;
514
+ const devicesToTry = this.getDevicesToConnect(groupId, neededConnections);
515
+ for (const deviceId of devicesToTry) {
516
+ await this.connectToDevice(deviceId, groupId);
517
+ await (0, peers_sdk_1.sleep)(100);
518
+ }
164
519
  }
165
520
  }
166
521
  }
@@ -196,6 +551,8 @@ class NetworkManager {
196
551
  });
197
552
  // TODO: take this out once we get cached multiaddrs in libp2p
198
553
  if (supportedProtocolsResponse === connection_manager_1.TTL0) {
554
+ // Device not reachable, mark as failed
555
+ this.updateDeviceStatus(deviceId, 'triedButFailed');
199
556
  return;
200
557
  }
201
558
  let supportedProtocols = [];
@@ -215,10 +572,12 @@ class NetworkManager {
215
572
  if (protocol) {
216
573
  if (!supportedProtocols.includes(protocol)) {
217
574
  console.warn(`[NetworkManager] Device ${deviceId} does not support protocol ${protocol}`);
575
+ this.updateDeviceStatus(deviceId, 'triedButFailed');
218
576
  return;
219
577
  }
220
578
  }
221
579
  this.sortProtocolManagers();
580
+ let anyAttempted = false;
222
581
  for (const protocolManager of this.protocolManagers) {
223
582
  if (supportedProtocols.includes(protocolManager.protocolName)) {
224
583
  if (protocolManager.isConnecting(deviceId)) {
@@ -227,8 +586,10 @@ class NetworkManager {
227
586
  if (this.hasConnectionViaProtocol(existingConnection, protocolManager.protocolName)) {
228
587
  continue;
229
588
  }
589
+ anyAttempted = true;
230
590
  try {
231
591
  await protocolManager.connectToDevice(deviceId, dataContextId);
592
+ // Success! Status will be updated by updateTrackingFromConnection when connection is added
232
593
  return;
233
594
  }
234
595
  catch (error) {
@@ -237,6 +598,10 @@ class NetworkManager {
237
598
  await (0, peers_sdk_1.sleep)(1000);
238
599
  }
239
600
  }
601
+ // All protocols failed
602
+ if (anyAttempted) {
603
+ this.updateDeviceStatus(deviceId, 'triedButFailed');
604
+ }
240
605
  console.warn(`[NetworkManager] Could not establish connection to ${deviceId}`);
241
606
  }
242
607
  isUsingEncryptedProtocol(connection) {
@@ -1 +1 @@
1
- {"version":3,"file":"network-manager.js","sourceRoot":"","sources":["../../src/connection-manager/network-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"network-manager.js","sourceRoot":"","sources":["../../src/connection-manager/network-manager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peers-app/peers-device",
3
- "version": "0.8.7",
3
+ "version": "0.8.8",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": {
@@ -34,11 +34,11 @@
34
34
  "lodash": "^4.17.21"
35
35
  },
36
36
  "peerDependencies": {
37
- "@peers-app/peers-sdk": "^0.8.7"
37
+ "@peers-app/peers-sdk": "^0.8.8"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@electron/rebuild": "^4.0.1",
41
- "@peers-app/peers-sdk": "0.8.7",
41
+ "@peers-app/peers-sdk": "0.8.8",
42
42
  "@types/diff-match-patch": "^1.0.36",
43
43
  "@types/jest": "^30.0.0",
44
44
  "@types/lodash": "^4.17.20",