@peers-app/peers-device 0.12.5 → 0.12.6
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/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/websocket-client.d.ts +48 -0
- package/dist/websocket-client.js +304 -0
- package/dist/websocket-client.js.map +1 -0
- package/package.json +5 -4
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -26,4 +26,5 @@ __exportStar(require("./connection-manager/group-invite-messages"), exports);
|
|
|
26
26
|
__exportStar(require("./local.data-source"), exports);
|
|
27
27
|
__exportStar(require("./machine-stats"), exports);
|
|
28
28
|
__exportStar(require("./chunk-download-manager"), exports);
|
|
29
|
+
__exportStar(require("./websocket-client"), exports);
|
|
29
30
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,+CAA6B;AAC7B,wDAAsC;AACtC,8DAA4C;AAC5C,0EAAwD;AACxD,oFAAkE;AAClE,kFAAgE;AAChE,uEAAqD;AACrD,6EAA2D;AAC3D,sDAAoC;AACpC,kDAAgC;AAChC,2DAAyC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,+CAA6B;AAC7B,wDAAsC;AACtC,8DAA4C;AAC5C,0EAAwD;AACxD,oFAAkE;AAClE,kFAAgE;AAChE,uEAAqD;AACrD,6EAA2D;AAC3D,sDAAoC;AACpC,kDAAgC;AAChC,2DAAyC;AACzC,qDAAmC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Connection } from '@peers-app/peers-sdk';
|
|
2
|
+
export type LanIpEntry = {
|
|
3
|
+
ip: string;
|
|
4
|
+
lastSeen: number;
|
|
5
|
+
};
|
|
6
|
+
export interface WebSocketClientPlatformAdapter {
|
|
7
|
+
getLocalIPAddress(): Promise<string | null> | string | null;
|
|
8
|
+
getLocalDeviceServerAddresses(): Promise<string[]>;
|
|
9
|
+
getSecretKey(): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
export interface WebSocketClientConfig {
|
|
12
|
+
cloudServerUrls: string[];
|
|
13
|
+
additionalServerUrls?: string[];
|
|
14
|
+
lanScanSchemes?: [string, string];
|
|
15
|
+
scanIntervalMs?: number;
|
|
16
|
+
lanIpCache?: {
|
|
17
|
+
load(): Promise<void>;
|
|
18
|
+
get(): LanIpEntry[];
|
|
19
|
+
set(entries: LanIpEntry[]): void;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
type IceServersChangedCallback = (iceServers: any[]) => void;
|
|
23
|
+
export declare class WebSocketConnectionClient {
|
|
24
|
+
private adapter;
|
|
25
|
+
private config;
|
|
26
|
+
private serverConnections;
|
|
27
|
+
private serverUrlToDeviceId;
|
|
28
|
+
private closedConnections;
|
|
29
|
+
private cachedIceServers;
|
|
30
|
+
private iceCacheExpiry;
|
|
31
|
+
private iceServersChangedCallbacks;
|
|
32
|
+
private currentLocalIp;
|
|
33
|
+
private scanIntervalHandle;
|
|
34
|
+
private connectionManager;
|
|
35
|
+
constructor(adapter: WebSocketClientPlatformAdapter, config: WebSocketClientConfig);
|
|
36
|
+
setup(): Promise<void>;
|
|
37
|
+
scanForServers(opts?: {
|
|
38
|
+
backgroundMode?: boolean;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
getServerIceServers(): Promise<any[]>;
|
|
41
|
+
onIceServersChanged(cb: IceServersChangedCallback): () => void;
|
|
42
|
+
getActiveConnections(): Map<string, Connection>;
|
|
43
|
+
private addToLanCache;
|
|
44
|
+
private removeFromLanCache;
|
|
45
|
+
private cleanupOldConnections;
|
|
46
|
+
private connectToSocketServer;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSocketConnectionClient = void 0;
|
|
4
|
+
const peers_sdk_1 = require("@peers-app/peers-sdk");
|
|
5
|
+
const lodash_1 = require("lodash");
|
|
6
|
+
const socket_io_client_1 = require("socket.io-client");
|
|
7
|
+
const main_1 = require("./main");
|
|
8
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
9
|
+
const FALLBACK_ICE_SERVERS = [
|
|
10
|
+
{ urls: ['stun:stun.l.google.com:19302', 'stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302', 'stun:stun3.l.google.com:19302', 'stun:stun4.l.google.com:19302'] },
|
|
11
|
+
];
|
|
12
|
+
const ICE_CACHE_TTL_MS = 23 * 60 * 60 * 1000;
|
|
13
|
+
const DEFAULT_SCAN_INTERVAL_MS = 60_000;
|
|
14
|
+
const DEFAULT_LAN_SCHEMES = ['http', 'https'];
|
|
15
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
16
|
+
function isLanUrl(url) {
|
|
17
|
+
const match = url.match(/^(?:https?|wss?):\/\/(\d+\.\d+\.\d+\.\d+):/);
|
|
18
|
+
if (!match)
|
|
19
|
+
return null;
|
|
20
|
+
const ip = match[1];
|
|
21
|
+
if (ip === '127.0.0.1' || ip === '10.0.2.2')
|
|
22
|
+
return null;
|
|
23
|
+
return ip;
|
|
24
|
+
}
|
|
25
|
+
// ─── WebSocketConnectionClient ───────────────────────────────────────────────
|
|
26
|
+
class WebSocketConnectionClient {
|
|
27
|
+
adapter;
|
|
28
|
+
config;
|
|
29
|
+
serverConnections = new Map();
|
|
30
|
+
serverUrlToDeviceId = new Map();
|
|
31
|
+
closedConnections = new Set();
|
|
32
|
+
cachedIceServers = null;
|
|
33
|
+
iceCacheExpiry = 0;
|
|
34
|
+
iceServersChangedCallbacks = [];
|
|
35
|
+
currentLocalIp;
|
|
36
|
+
scanIntervalHandle;
|
|
37
|
+
connectionManager;
|
|
38
|
+
constructor(adapter, config) {
|
|
39
|
+
this.adapter = adapter;
|
|
40
|
+
this.config = {
|
|
41
|
+
...config,
|
|
42
|
+
scanIntervalMs: config.scanIntervalMs ?? DEFAULT_SCAN_INTERVAL_MS,
|
|
43
|
+
lanScanSchemes: config.lanScanSchemes ?? DEFAULT_LAN_SCHEMES,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// ─── Public API ────────────────────────────────────────────────────────────
|
|
47
|
+
async setup() {
|
|
48
|
+
await main_1.peersDeviceInitializedPromise;
|
|
49
|
+
this.connectionManager = await main_1.connectionManagerPromise;
|
|
50
|
+
await this.scanForServers();
|
|
51
|
+
this.scanIntervalHandle = setInterval(async () => {
|
|
52
|
+
await this.scanForServers();
|
|
53
|
+
this.cleanupOldConnections();
|
|
54
|
+
}, this.config.scanIntervalMs);
|
|
55
|
+
}
|
|
56
|
+
async scanForServers(opts) {
|
|
57
|
+
const backgroundMode = opts?.backgroundMode ?? false;
|
|
58
|
+
await peers_sdk_1.trustedServers.loadingPromise;
|
|
59
|
+
const allServerUrls = (0, lodash_1.uniq)([
|
|
60
|
+
...this.config.cloudServerUrls,
|
|
61
|
+
...(this.config.additionalServerUrls ?? []),
|
|
62
|
+
]);
|
|
63
|
+
const serverUrls = allServerUrls.filter(url => !this.serverConnections.has(url));
|
|
64
|
+
const me = await (0, peers_sdk_1.getMe)();
|
|
65
|
+
const connMgr = this.connectionManager ?? await main_1.connectionManagerPromise;
|
|
66
|
+
this.connectionManager = connMgr;
|
|
67
|
+
const deviceId = connMgr.userContext.deviceId();
|
|
68
|
+
if (!deviceId) {
|
|
69
|
+
console.error('[WS] No device ID found, cannot connect to servers');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const secretKey = await this.adapter.getSecretKey();
|
|
73
|
+
if (!secretKey) {
|
|
74
|
+
console.error('[WS] No secret key found, cannot connect to servers');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const thisDevice = new peers_sdk_1.Device(me.userId, deviceId, {
|
|
78
|
+
secretKey,
|
|
79
|
+
publicKey: me.publicKey,
|
|
80
|
+
publicBoxKey: me.publicBoxKey,
|
|
81
|
+
});
|
|
82
|
+
for (const serverUrl of serverUrls) {
|
|
83
|
+
await this.connectToSocketServer(serverUrl, thisDevice, me).catch(err => {
|
|
84
|
+
console.error('[WS] Error connecting to server', serverUrl, err);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const myLocalIp = await this.adapter.getLocalIPAddress();
|
|
88
|
+
if (!myLocalIp) {
|
|
89
|
+
this.currentLocalIp = undefined;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (myLocalIp === this.currentLocalIp && !backgroundMode) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
this.currentLocalIp = myLocalIp;
|
|
96
|
+
const localNetworkPrefix = myLocalIp.split('.').slice(0, 3).join('.');
|
|
97
|
+
const hasActiveLocalConnection = Array.from(this.serverConnections.keys())
|
|
98
|
+
.some(url => url.includes(localNetworkPrefix) && this.serverConnections.get(url)?.socket?.connected);
|
|
99
|
+
if (hasActiveLocalConnection) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (backgroundMode && this.config.lanIpCache) {
|
|
103
|
+
await this.config.lanIpCache.load();
|
|
104
|
+
const cached = this.config.lanIpCache.get();
|
|
105
|
+
console.log(`[WS] Background mode: trying ${cached.length} cached LAN IP(s):`, cached.map(e => e.ip));
|
|
106
|
+
const [scheme] = this.config.lanScanSchemes;
|
|
107
|
+
for (const { ip } of cached) {
|
|
108
|
+
this.connectToSocketServer(`${scheme}://${ip}:3333`, thisDevice, me, 10000).catch(err => {
|
|
109
|
+
console.error('[WS] Error connecting to cached LAN server', ip, err);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else if (!backgroundMode) {
|
|
114
|
+
console.log('[WS] Scanning LAN around', myLocalIp);
|
|
115
|
+
const [scheme, secureScheme] = this.config.lanScanSchemes;
|
|
116
|
+
for (let i = 1; i < 255; i++) {
|
|
117
|
+
const ip = `${localNetworkPrefix}.${i}`;
|
|
118
|
+
if (ip === myLocalIp)
|
|
119
|
+
continue;
|
|
120
|
+
this.connectToSocketServer(`${scheme}://${ip}:3333`, thisDevice, me, 10000).catch(err => {
|
|
121
|
+
console.error('[WS] Error connecting to LAN server', ip, err);
|
|
122
|
+
});
|
|
123
|
+
this.connectToSocketServer(`${secureScheme}://${ip}:3333`, thisDevice, me, 10000).catch(err => {
|
|
124
|
+
console.error('[WS] Error connecting to LAN server', ip, err);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async getServerIceServers() {
|
|
130
|
+
if (this.cachedIceServers && Date.now() < this.iceCacheExpiry) {
|
|
131
|
+
return this.cachedIceServers;
|
|
132
|
+
}
|
|
133
|
+
const verifiedConnection = [...this.serverConnections.values()].find(c => c.verified && c.socket.connected);
|
|
134
|
+
if (!verifiedConnection) {
|
|
135
|
+
console.warn('[WS] No verified server connection — using fallback STUN servers');
|
|
136
|
+
return FALLBACK_ICE_SERVERS;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const iceServers = await verifiedConnection.emit('getIceServers');
|
|
140
|
+
this.cachedIceServers = iceServers;
|
|
141
|
+
this.iceCacheExpiry = Date.now() + ICE_CACHE_TTL_MS;
|
|
142
|
+
console.log('[WS] Fetched ICE servers from server:', iceServers.length, 'entries');
|
|
143
|
+
for (const cb of this.iceServersChangedCallbacks) {
|
|
144
|
+
try {
|
|
145
|
+
cb(iceServers);
|
|
146
|
+
}
|
|
147
|
+
catch (_) { /* ignore */ }
|
|
148
|
+
}
|
|
149
|
+
return iceServers;
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
console.error('[WS] Failed to fetch ICE servers from server, using fallback:', err);
|
|
153
|
+
return FALLBACK_ICE_SERVERS;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
onIceServersChanged(cb) {
|
|
157
|
+
this.iceServersChangedCallbacks.push(cb);
|
|
158
|
+
return () => {
|
|
159
|
+
const idx = this.iceServersChangedCallbacks.indexOf(cb);
|
|
160
|
+
if (idx !== -1)
|
|
161
|
+
this.iceServersChangedCallbacks.splice(idx, 1);
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
getActiveConnections() {
|
|
165
|
+
const active = new Map();
|
|
166
|
+
for (const [url, conn] of this.serverConnections) {
|
|
167
|
+
if (conn.socket.connected) {
|
|
168
|
+
active.set(url, conn);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return active;
|
|
172
|
+
}
|
|
173
|
+
// ─── Private ───────────────────────────────────────────────────────────────
|
|
174
|
+
addToLanCache(ip) {
|
|
175
|
+
if (!this.config.lanIpCache)
|
|
176
|
+
return;
|
|
177
|
+
const current = this.config.lanIpCache.get();
|
|
178
|
+
const without = current.filter(e => e.ip !== ip);
|
|
179
|
+
this.config.lanIpCache.set([...without, { ip, lastSeen: Date.now() }]);
|
|
180
|
+
}
|
|
181
|
+
removeFromLanCache(ip) {
|
|
182
|
+
if (!this.config.lanIpCache)
|
|
183
|
+
return;
|
|
184
|
+
const current = this.config.lanIpCache.get();
|
|
185
|
+
this.config.lanIpCache.set(current.filter(e => e.ip !== ip));
|
|
186
|
+
}
|
|
187
|
+
cleanupOldConnections() {
|
|
188
|
+
for (const [url, conn] of this.serverConnections) {
|
|
189
|
+
if (conn.socket.connected) {
|
|
190
|
+
this.closedConnections.delete(url);
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (this.closedConnections.has(url)) {
|
|
194
|
+
console.log('[WS] Cleaning up old connection', url);
|
|
195
|
+
const socket = conn?.socket;
|
|
196
|
+
if (socket) {
|
|
197
|
+
try {
|
|
198
|
+
socket.removeAllListeners();
|
|
199
|
+
socket.disconnect();
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
console.error('[WS] Error while disconnecting socket', url, err);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
this.serverConnections.delete(url);
|
|
206
|
+
this.closedConnections.delete(url);
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
this.closedConnections.add(url);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async connectToSocketServer(serverUrl, thisDevice, me, timeoutMs) {
|
|
213
|
+
const localDeviceServerAddresses = await this.adapter.getLocalDeviceServerAddresses();
|
|
214
|
+
if (localDeviceServerAddresses.includes(serverUrl)) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const existing = this.serverConnections.get(serverUrl);
|
|
218
|
+
if (existing) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const connMgr = this.connectionManager ?? await main_1.connectionManagerPromise;
|
|
222
|
+
this.connectionManager = connMgr;
|
|
223
|
+
const knownDeviceId = this.serverUrlToDeviceId.get(serverUrl);
|
|
224
|
+
if (knownDeviceId) {
|
|
225
|
+
const existingDeviceConn = connMgr.getDeviceConnection(knownDeviceId);
|
|
226
|
+
if (existingDeviceConn) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const isSecure = serverUrl.startsWith('https://') || serverUrl.startsWith('wss://');
|
|
231
|
+
const socket = (0, socket_io_client_1.io)(serverUrl, {
|
|
232
|
+
secure: isSecure,
|
|
233
|
+
rejectUnauthorized: false,
|
|
234
|
+
transports: ['websocket'],
|
|
235
|
+
});
|
|
236
|
+
const trustLevelFn = (0, peers_sdk_1.getTrustLevelFn)(me, serverUrl);
|
|
237
|
+
const lanIp = isLanUrl(serverUrl);
|
|
238
|
+
if (timeoutMs) {
|
|
239
|
+
setTimeout(() => {
|
|
240
|
+
if (socket.connected)
|
|
241
|
+
return;
|
|
242
|
+
socket.removeAllListeners();
|
|
243
|
+
socket.disconnect();
|
|
244
|
+
this.serverConnections.delete(serverUrl);
|
|
245
|
+
if (lanIp)
|
|
246
|
+
this.removeFromLanCache(lanIp);
|
|
247
|
+
}, timeoutMs);
|
|
248
|
+
}
|
|
249
|
+
let resolveConnectionPromise;
|
|
250
|
+
let rejectConnectionPromise;
|
|
251
|
+
const connectionPromise = new Promise((resolve, reject) => {
|
|
252
|
+
resolveConnectionPromise = resolve;
|
|
253
|
+
rejectConnectionPromise = reject;
|
|
254
|
+
});
|
|
255
|
+
let connection;
|
|
256
|
+
socket.on('connect', async () => {
|
|
257
|
+
try {
|
|
258
|
+
console.log('[WS] Connected to', serverUrl, { socketId: socket.id });
|
|
259
|
+
this.closedConnections.delete(serverUrl);
|
|
260
|
+
const binaryPeer = (0, peers_sdk_1.wrapSocketIOAsBinaryPeer)(socket);
|
|
261
|
+
const socketWrapper = (0, peers_sdk_1.createBinaryPeerSocket)(socket.id, binaryPeer, 'ws');
|
|
262
|
+
connection = new peers_sdk_1.Connection(socketWrapper, thisDevice, undefined, trustLevelFn);
|
|
263
|
+
if (isSecure) {
|
|
264
|
+
connection.secureLocal = true;
|
|
265
|
+
connection.secureRemote = true;
|
|
266
|
+
}
|
|
267
|
+
this.serverConnections.set(serverUrl, connection);
|
|
268
|
+
const response = await connection.doHandshake(serverUrl);
|
|
269
|
+
await connMgr.addConnection(connection);
|
|
270
|
+
this.serverUrlToDeviceId.set(serverUrl, response.deviceId);
|
|
271
|
+
console.log('[WS] Handshake complete', { remoteDeviceId: response.deviceId });
|
|
272
|
+
if (lanIp)
|
|
273
|
+
this.addToLanCache(lanIp);
|
|
274
|
+
resolveConnectionPromise();
|
|
275
|
+
if (this.config.cloudServerUrls.includes(serverUrl)) {
|
|
276
|
+
this.getServerIceServers().catch(err => console.error('[WS] Error fetching ICE servers:', err));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
console.error('[WS] Error during handshake', serverUrl, err);
|
|
281
|
+
socket.removeAllListeners();
|
|
282
|
+
socket.disconnect();
|
|
283
|
+
this.serverConnections.delete(serverUrl);
|
|
284
|
+
this.serverUrlToDeviceId.delete(serverUrl);
|
|
285
|
+
if (lanIp)
|
|
286
|
+
this.removeFromLanCache(lanIp);
|
|
287
|
+
rejectConnectionPromise(err);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
socket.on('disconnect', () => {
|
|
291
|
+
console.log('[WS] Disconnected from', serverUrl);
|
|
292
|
+
this.serverConnections.delete(serverUrl);
|
|
293
|
+
if (connection) {
|
|
294
|
+
connMgr.removeConnection(connection);
|
|
295
|
+
connection.reset();
|
|
296
|
+
}
|
|
297
|
+
this.cachedIceServers = null;
|
|
298
|
+
});
|
|
299
|
+
(0, peers_sdk_1.sleep)((timeoutMs ?? 3000) + 100).then(() => resolveConnectionPromise());
|
|
300
|
+
return connectionPromise;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
exports.WebSocketConnectionClient = WebSocketConnectionClient;
|
|
304
|
+
//# sourceMappingURL=websocket-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-client.js","sourceRoot":"","sources":["../src/websocket-client.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.12.
|
|
3
|
+
"version": "0.12.6",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"repository": {
|
|
@@ -31,14 +31,15 @@
|
|
|
31
31
|
"better-sqlite3-multiple-ciphers": "^12.4.1",
|
|
32
32
|
"diff-match-patch": "^1.0.5",
|
|
33
33
|
"fast-json-patch": "^3.1.1",
|
|
34
|
-
"lodash": "^4.17.21"
|
|
34
|
+
"lodash": "^4.17.21",
|
|
35
|
+
"socket.io-client": "^4.8.0"
|
|
35
36
|
},
|
|
36
37
|
"peerDependencies": {
|
|
37
|
-
"@peers-app/peers-sdk": "^0.12.
|
|
38
|
+
"@peers-app/peers-sdk": "^0.12.6"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
40
41
|
"@electron/rebuild": "^4.0.1",
|
|
41
|
-
"@peers-app/peers-sdk": "0.12.
|
|
42
|
+
"@peers-app/peers-sdk": "0.12.6",
|
|
42
43
|
"@types/diff-match-patch": "^1.0.36",
|
|
43
44
|
"@types/jest": "^30.0.0",
|
|
44
45
|
"@types/lodash": "^4.17.20",
|