-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
64 lines (58 loc) · 1.59 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
var shoe = require('shoe2')
, dataplex = require('dataplex')
, buildReconnect = require('reconnect-core')
var reconnect = buildReconnect(shoe)
module.exports = function(baseURL, access_token) {
var plex = dataplex()
return new Promise(function(resolve, reject) {
var reconnector = reconnect({
maxDelay: 30e3,
type: 'fibonacci',
immediate: false
})
.on('connect', function (stream) {
stream.pipe(plex).pipe(stream)
// Don't pass through the `end`!
var listeners = stream.listeners('end')
stream.removeListener('end', listeners[listeners.length-1])
// clean up on end
stream.on('end', () => {
stream.unpipe()
plex.unpipe(stream)
})
authenticate(er => {
if(er) return reject(er)
resolve(plex)
plex.emit('connect')
})
})
.on('disconnect', function (err) {
plex.emit('disconnect')
})
.on('fail', function() {
console.log('reconnect FAIL')
})
.on('error', function (err) {
plex.emit('disconnect')
reject(err)
setTimeout(() => {throw err}, 0)
})
reconnector.connect(baseURL+'/socket')
})
function authenticate(cb) {
var authStream = plex.open('/authenticate')
authStream.once('data', function(chunk){
try {
var auth = JSON.parse(chunk).authenticated
if(auth) {
cb()
}else {
cb(new Error('Authentication failed'))
}
}catch(e){
cb(new Error('Authentication failed due to a connection problem'))
}
})
authStream.write(access_token)
}
}