Skip to content

Commit f687490

Browse files
authored
Merge pull request #14 from GetScatter/ws
Native websocket support
2 parents 11cd216 + 523fe32 commit f687490

File tree

8 files changed

+6611
-12941
lines changed

8 files changed

+6611
-12941
lines changed

dist/scatter.cjs.js

Lines changed: 71 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
44

5-
var io = _interopDefault(require('socket.io-client'));
65
var getRandomValues = _interopDefault(require('get-random-values'));
76
var Eos = _interopDefault(require('eosjs'));
87
require('isomorphic-fetch');
@@ -50,20 +49,17 @@ class StorageService {
5049

5150
const {ecc} = Eos.modules;
5251

53-
const host = 'ws://127.0.0.1:50005/socket.io/?EIO=3&transport=websocket';
52+
const host = '127.0.0.1:50005';
5453

5554
let socket = null;
5655
let connected = false;
5756
let paired = false;
5857

5958
let plugin;
6059
let openRequests = [];
61-
62-
let allowReconnects = true;
6360
let reconnectionTimeout = null;
6461

6562
const reconnectOnAbnormalDisconnection = () => {
66-
if(!allowReconnects) return;
6763

6864
clearTimeout(reconnectionTimeout);
6965
reconnectionTimeout = setTimeout(() => {
@@ -94,11 +90,16 @@ const getOrigin = () => {
9490
let appkey = StorageService.getAppKey();
9591
if(!appkey) appkey = 'appkey:'+random();
9692

93+
const send = (type = null, data = null) => {
94+
if(type === null && data === null) socket.send('40/scatter');
95+
else socket.send('42/scatter,' + JSON.stringify([type, data]));
96+
};
97+
9798
let pairingPromise = null;
9899
const pair = (passthrough = false) => {
99100
return new Promise((resolve, reject) => {
100101
pairingPromise = {resolve, reject};
101-
socket.emit('pair', {data:{ appkey, origin:getOrigin(), passthrough }, plugin});
102+
send('pair', {data:{ appkey, origin:getOrigin(), passthrough }, plugin});
102103
})
103104
};
104105

@@ -124,17 +125,44 @@ class SocketService {
124125
reconnectOnAbnormalDisconnection();
125126
}, this.timeout)),
126127
new Promise((resolve, reject) => {
127-
socket = io.connect(`${host}/scatter`, { secure:true, reconnection: false, rejectUnauthorized : false });
128+
socket = new WebSocket(`ws://${host}/socket.io/?EIO=3&transport=websocket`);
129+
130+
socket.onclose = x => {
131+
resolve(false);
132+
};
128133

129-
socket.on('connected', () => {
134+
socket.onerror = err => {
135+
console.error('err', err);
136+
resolve(false);
137+
};
138+
139+
socket.onopen = x => {
140+
send();
130141
clearTimeout(reconnectionTimeout);
131142
connected = true;
132143
pair(true).then(() => {
144+
console.log('then pair', connected);
133145
resolve(true);
134146
});
135-
});
147+
};
148+
149+
socket.onmessage = msg => {
150+
// Handshaking/Upgrading
151+
if(msg.data.indexOf('42/scatter') === -1) return false;
152+
153+
154+
// Real message
155+
const [type, data] = JSON.parse(msg.data.replace('42/scatter,', ''));
136156

137-
socket.on('paired', result => {
157+
switch(type){
158+
case 'paired': return msg_paired(data);
159+
case 'rekey': return msg_rekey();
160+
case 'api': return msg_api(data);
161+
}
162+
};
163+
164+
const msg_paired = result => {
165+
console.log('paired', result);
138166
paired = result;
139167

140168
if(paired) {
@@ -148,44 +176,46 @@ class SocketService {
148176
}
149177

150178
pairingPromise.resolve(result);
151-
});
179+
};
152180

153-
socket.on('rekey', () => {
181+
const msg_rekey = () => {
154182
appkey = 'appkey:'+random();
155-
socket.emit('rekeyed', {data:{ appkey, origin:getOrigin() }, plugin});
156-
});
157-
158-
socket.on('event', event => {
159-
console.log('event', event);
160-
});
183+
send('rekeyed', {data:{ appkey, origin:getOrigin() }, plugin});
184+
};
161185

162-
socket.on('api', result => {
186+
const msg_api = result => {
163187
const openRequest = openRequests.find(x => x.id === result.id);
164188
if(!openRequest) return;
165189
if(typeof result.result === 'object'
166190
&& result.result !== null
167191
&& result.result.hasOwnProperty('isError')) openRequest.reject(result.result);
168192
else openRequest.resolve(result.result);
169-
});
170-
171-
socket.on('disconnect', () => {
172-
console.log('Disconnected');
173-
connected = false;
174-
socket = null;
175-
176-
// If bad disconnect, retry connection
177-
reconnectOnAbnormalDisconnection();
178-
});
179-
180-
socket.on('connect_error', () => {
181-
allowReconnects = false;
182-
resolve(false);
183-
});
184-
185-
socket.on('rejected', reason => {
186-
console.error('reason', reason);
187-
reject(reason);
188-
});
193+
};
194+
195+
196+
//
197+
// socket.on('event', event => {
198+
// console.log('event', event);
199+
// });
200+
//
201+
// socket.on('disconnect', () => {
202+
// console.log('Disconnected')
203+
// connected = false;
204+
// socket = null;
205+
//
206+
// // If bad disconnect, retry connection
207+
// reconnectOnAbnormalDisconnection();
208+
// });
209+
//
210+
// socket.on('connect_error', () => {
211+
// allowReconnects = false;
212+
// resolve(false);
213+
// });
214+
//
215+
// socket.on('rejected', reason => {
216+
// console.error('reason', reason);
217+
// reject(reason);
218+
// });
189219
})
190220
])
191221
}
@@ -224,7 +254,7 @@ class SocketService {
224254

225255

226256
openRequests.push(Object.assign(request, {resolve, reject}));
227-
socket.emit('api', {data:request, plugin});
257+
send('api', {data:request, plugin});
228258
});
229259
});
230260
}
@@ -305,7 +335,7 @@ class EOS extends Plugin {
305335
if(!network.isValid()) throw Error.noNetwork();
306336
const httpEndpoint = `${network.protocol}://${network.hostport()}`;
307337

308-
const chainId = network.hasOwnProperty('chainId') && network.chainId.length ? network.chainId : options.chainId;
338+
const chainId = network.hasOwnProperty('chainId') && network.chainId.length ? network.chainId : _options.chainId;
309339

310340
// The proxy stands between the eosjs object and scatter.
311341
// This is used to add special functionality like adding `requiredFields` arrays to transactions

dist/scatter.esm.js

Lines changed: 71 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import io from 'socket.io-client';
21
import getRandomValues from 'get-random-values';
32
import Eos from 'eosjs';
43
import 'isomorphic-fetch';
@@ -46,20 +45,17 @@ class StorageService {
4645

4746
const {ecc} = Eos.modules;
4847

49-
const host = 'ws://127.0.0.1:50005/socket.io/?EIO=3&transport=websocket';
48+
const host = '127.0.0.1:50005';
5049

5150
let socket = null;
5251
let connected = false;
5352
let paired = false;
5453

5554
let plugin;
5655
let openRequests = [];
57-
58-
let allowReconnects = true;
5956
let reconnectionTimeout = null;
6057

6158
const reconnectOnAbnormalDisconnection = () => {
62-
if(!allowReconnects) return;
6359

6460
clearTimeout(reconnectionTimeout);
6561
reconnectionTimeout = setTimeout(() => {
@@ -90,11 +86,16 @@ const getOrigin = () => {
9086
let appkey = StorageService.getAppKey();
9187
if(!appkey) appkey = 'appkey:'+random();
9288

89+
const send = (type = null, data = null) => {
90+
if(type === null && data === null) socket.send('40/scatter');
91+
else socket.send('42/scatter,' + JSON.stringify([type, data]));
92+
};
93+
9394
let pairingPromise = null;
9495
const pair = (passthrough = false) => {
9596
return new Promise((resolve, reject) => {
9697
pairingPromise = {resolve, reject};
97-
socket.emit('pair', {data:{ appkey, origin:getOrigin(), passthrough }, plugin});
98+
send('pair', {data:{ appkey, origin:getOrigin(), passthrough }, plugin});
9899
})
99100
};
100101

@@ -120,17 +121,44 @@ class SocketService {
120121
reconnectOnAbnormalDisconnection();
121122
}, this.timeout)),
122123
new Promise((resolve, reject) => {
123-
socket = io.connect(`${host}/scatter`, { secure:true, reconnection: false, rejectUnauthorized : false });
124+
socket = new WebSocket(`ws://${host}/socket.io/?EIO=3&transport=websocket`);
125+
126+
socket.onclose = x => {
127+
resolve(false);
128+
};
124129

125-
socket.on('connected', () => {
130+
socket.onerror = err => {
131+
console.error('err', err);
132+
resolve(false);
133+
};
134+
135+
socket.onopen = x => {
136+
send();
126137
clearTimeout(reconnectionTimeout);
127138
connected = true;
128139
pair(true).then(() => {
140+
console.log('then pair', connected);
129141
resolve(true);
130142
});
131-
});
143+
};
144+
145+
socket.onmessage = msg => {
146+
// Handshaking/Upgrading
147+
if(msg.data.indexOf('42/scatter') === -1) return false;
148+
149+
150+
// Real message
151+
const [type, data] = JSON.parse(msg.data.replace('42/scatter,', ''));
132152

133-
socket.on('paired', result => {
153+
switch(type){
154+
case 'paired': return msg_paired(data);
155+
case 'rekey': return msg_rekey();
156+
case 'api': return msg_api(data);
157+
}
158+
};
159+
160+
const msg_paired = result => {
161+
console.log('paired', result);
134162
paired = result;
135163

136164
if(paired) {
@@ -144,44 +172,46 @@ class SocketService {
144172
}
145173

146174
pairingPromise.resolve(result);
147-
});
175+
};
148176

149-
socket.on('rekey', () => {
177+
const msg_rekey = () => {
150178
appkey = 'appkey:'+random();
151-
socket.emit('rekeyed', {data:{ appkey, origin:getOrigin() }, plugin});
152-
});
153-
154-
socket.on('event', event => {
155-
console.log('event', event);
156-
});
179+
send('rekeyed', {data:{ appkey, origin:getOrigin() }, plugin});
180+
};
157181

158-
socket.on('api', result => {
182+
const msg_api = result => {
159183
const openRequest = openRequests.find(x => x.id === result.id);
160184
if(!openRequest) return;
161185
if(typeof result.result === 'object'
162186
&& result.result !== null
163187
&& result.result.hasOwnProperty('isError')) openRequest.reject(result.result);
164188
else openRequest.resolve(result.result);
165-
});
166-
167-
socket.on('disconnect', () => {
168-
console.log('Disconnected');
169-
connected = false;
170-
socket = null;
171-
172-
// If bad disconnect, retry connection
173-
reconnectOnAbnormalDisconnection();
174-
});
175-
176-
socket.on('connect_error', () => {
177-
allowReconnects = false;
178-
resolve(false);
179-
});
180-
181-
socket.on('rejected', reason => {
182-
console.error('reason', reason);
183-
reject(reason);
184-
});
189+
};
190+
191+
192+
//
193+
// socket.on('event', event => {
194+
// console.log('event', event);
195+
// });
196+
//
197+
// socket.on('disconnect', () => {
198+
// console.log('Disconnected')
199+
// connected = false;
200+
// socket = null;
201+
//
202+
// // If bad disconnect, retry connection
203+
// reconnectOnAbnormalDisconnection();
204+
// });
205+
//
206+
// socket.on('connect_error', () => {
207+
// allowReconnects = false;
208+
// resolve(false);
209+
// });
210+
//
211+
// socket.on('rejected', reason => {
212+
// console.error('reason', reason);
213+
// reject(reason);
214+
// });
185215
})
186216
])
187217
}
@@ -220,7 +250,7 @@ class SocketService {
220250

221251

222252
openRequests.push(Object.assign(request, {resolve, reject}));
223-
socket.emit('api', {data:request, plugin});
253+
send('api', {data:request, plugin});
224254
});
225255
});
226256
}
@@ -301,7 +331,7 @@ class EOS extends Plugin {
301331
if(!network.isValid()) throw Error.noNetwork();
302332
const httpEndpoint = `${network.protocol}://${network.hostport()}`;
303333

304-
const chainId = network.hasOwnProperty('chainId') && network.chainId.length ? network.chainId : options.chainId;
334+
const chainId = network.hasOwnProperty('chainId') && network.chainId.length ? network.chainId : _options.chainId;
305335

306336
// The proxy stands between the eosjs object and scatter.
307337
// This is used to add special functionality like adding `requiredFields` arrays to transactions

0 commit comments

Comments
 (0)