Skip to content

Commit 6789339

Browse files
committed
socket layer fixes for multiple tabs with same origin
1 parent c7ae3f5 commit 6789339

File tree

3 files changed

+29
-27
lines changed

3 files changed

+29
-27
lines changed

electron.js

+15-13
Original file line numberDiff line numberDiff line change
@@ -302,16 +302,16 @@ class LowLevelSocketService {
302302
this.ports = {};
303303
}
304304

305-
async getNewKey(origin){
305+
async getNewKey(origin, id){
306306
return new Promise((resolve, reject) => {
307307
this.rekeyPromise = {resolve, reject};
308-
this.emit(origin, 'rekey');
308+
this.emit(origin, id, 'rekey');
309309
return this.rekeyPromise;
310310
})
311311
}
312312

313-
async emit(origin, path, data){
314-
const socket = this.openConnections[origin];
313+
async emit(origin, id, path, data){
314+
const socket = this.openConnections[origin+id];
315315
return this.emitSocket(socket, path, data);
316316
}
317317

@@ -329,12 +329,14 @@ class LowLevelSocketService {
329329
socket.send("40/scatter");
330330
socket.send(`42/scatter,["connected"]`);
331331

332+
const id = Math.round(Math.random() * 999999999).toString();
333+
332334
// Just logging errors for debugging purposes (dev only)
333335
if(isDev) socket.on('error', async request => console.log('error', request));
334336

335337
// Different clients send different message types for disconnect (ws vs socket.io)
336-
socket.on('close', () => delete this.openConnections[origin]);
337-
socket.on('disconnect', () => delete this.openConnections[origin]);
338+
socket.on('close', () => delete this.openConnections[origin+id]);
339+
socket.on('disconnect', () => delete this.openConnections[origin+id]);
338340

339341
socket.on('message', msg => {
340342
if(msg.indexOf('42/scatter') === -1) return false;
@@ -354,12 +356,12 @@ class LowLevelSocketService {
354356

355357
if(!origin) origin = requestOrigin;
356358
else if(origin && requestOrigin !== origin) return this.emitSocket(socket, 'api', {id:request.id, result:null});
357-
if(!this.openConnections.hasOwnProperty(origin)) this.openConnections[origin] = socket;
359+
if(!this.openConnections.hasOwnProperty(origin+id)) this.openConnections[origin+id] = socket;
358360

359361
switch(type){
360-
case 'pair': return mainWindow.webContents.send('pair', request);
362+
case 'pair': return mainWindow.webContents.send('pair', {request, id});
361363
case 'rekeyed': return this.rekeyPromise.resolve(request);
362-
case 'api': return mainWindow.webContents.send('api', request);
364+
case 'api': return mainWindow.webContents.send('api', {request, id});
363365
}
364366

365367
});
@@ -399,13 +401,13 @@ class LowLevelSocketService {
399401
}
400402

401403
sendEvent(event, payload, origin){
402-
return this.emit(origin, 'event', {event, payload});
404+
const sockets = Object.keys(this.openConnections).filter(x => x.indexOf(origin) === 0).map(x => this.openConnections[x]);
405+
sockets.map(x => this.emitSocket(x, 'event', {event, payload}));
406+
return true;
403407
}
404408

405409
broadcastEvent(event, payload){
406-
Object.keys(this.openConnections).map(origin => {
407-
this.sendEvent(event, payload, origin);
408-
});
410+
Object.keys(this.openConnections).map(origin => this.sendEvent(event, payload, origin));
409411
return true;
410412
}
411413

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "scatter",
3-
"version": "11.0.0",
3+
"version": "11.0.1",
44
"private": true,
55
"buttonText": "Scatter Desktop Companion",
66
"author": {

src/services/utility/SocketService.js

+13-13
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ remote.getGlobal('appShared').QuitWatcher = () => {
1818

1919

2020

21-
const emit = (origin, path, data) => LowLevelSocketService.emit(origin, path, data);
22-
const getNewKey = origin => LowLevelSocketService.getNewKey(origin);
21+
const emit = (origin, id, path, data) => LowLevelSocketService.emit(origin, id, path, data);
22+
const getNewKey = (origin, id) => LowLevelSocketService.getNewKey(origin, id);
2323

24-
const handleApiResponse = async request => {
24+
const handleApiResponse = async (request, id) => {
2525

2626
// 2 way authentication
2727
const existingApp = StoreService.get().state.scatter.keychain.findApp(request.data.payload.origin);
@@ -45,11 +45,11 @@ const handleApiResponse = async request => {
4545
else await updateNonce();
4646

4747
ApiService.handler(Object.assign(request.data, {plugin:request.plugin})).then(result => {
48-
emit(existingApp.origin, 'api', result);
48+
emit(existingApp.origin, id, 'api', result);
4949
})
5050
};
5151

52-
const handlePairedResponse = async request => {
52+
const handlePairedResponse = async (request, id) => {
5353
const scatter = StoreService.get().state.scatter;
5454
const existingApp = scatter.keychain.findApp(request.data.origin);
5555
const linkApp = {
@@ -58,27 +58,27 @@ const handlePairedResponse = async request => {
5858
};
5959

6060
if(request.data.passthrough)
61-
return emit(request.data.origin, 'paired', existingApp && existingApp.checkKey(request.data.appkey));
61+
return emit(request.data.origin, id, 'paired', existingApp && existingApp.checkKey(request.data.appkey));
6262

6363
const addAuthorizedApp = async (newKey = null) => {
6464
const authedApp = new AuthorizedApp(request.data.origin, newKey ? newKey : request.data.appkey);
6565
const clone = scatter.clone();
6666
clone.keychain.updateOrPushApp(authedApp);
6767
await StoreService.get().dispatch(Actions.SET_SCATTER, clone);
68-
emit(request.data.origin, 'paired', true);
68+
emit(request.data.origin, id, 'paired', true);
6969
};
7070

7171
const repair = async () => {
72-
const newKey = await getNewKey(request.data.origin);
73-
if(newKey.data.origin !== request.data.origin || newKey.data.appkey.indexOf('appkey:') === -1) return emit(request.data.origin, 'paired', false);
72+
const newKey = await getNewKey(request.data.origin, id);
73+
if(newKey.data.origin !== request.data.origin || newKey.data.appkey.indexOf('appkey:') === -1) return emit(request.data.origin, id, 'paired', false);
7474
return addAuthorizedApp(newKey.data.appkey)
7575
}
7676

7777
if(existingApp){
78-
if(existingApp.checkKey(request.data.appkey)) return emit(request.data.origin, 'paired', true);
78+
if(existingApp.checkKey(request.data.appkey)) return emit(request.data.origin, id, 'paired', true);
7979
else PopupService.push(Popup.popout(linkApp, async ({result}) => {
8080
if(result) return repair();
81-
else emit(request.data.origin, 'paired', false);
81+
else emit(request.data.origin, id, 'paired', false);
8282
}));
8383
}
8484
else return repair();
@@ -111,8 +111,8 @@ export default class SocketService {
111111

112112
static async initialize(){
113113
const certs = await getCerts();
114-
ipcRenderer.on('api', (event, request) => handleApiResponse(request));
115-
ipcRenderer.on('pair', (event, request) => handlePairedResponse(request));
114+
ipcRenderer.on('api', (event, {request, id}) => handleApiResponse(request, id));
115+
ipcRenderer.on('pair', (event, {request, id}) => handlePairedResponse(request, id));
116116
ipcRenderer.on('ports', (event, ports) => StoreService.get().dispatch(Actions.SET_PORTS, ports));
117117
return LowLevelSocketService.initialize(certs);
118118
}

0 commit comments

Comments
 (0)