fixed initial timeout on connect rejection.
add in new option conPacket for pushing a packet to any connecting consumer from a socket/servertls
parent
01c4756e26
commit
6a8c2b1fca
|
@ -2,3 +2,7 @@ tests/
|
||||||
test/
|
test/
|
||||||
*.test.js
|
*.test.js
|
||||||
testing/
|
testing/
|
||||||
|
examples/
|
||||||
|
yarn.lock
|
||||||
|
travis.yml
|
||||||
|
.eslintrc.js
|
||||||
|
|
|
@ -7,8 +7,17 @@ const client= new Consumer({path:true, name:'example-consumer'})
|
||||||
|
|
||||||
// This is your client handler object waiting on a message to do something
|
// This is your client handler object waiting on a message to do something
|
||||||
const process = async function (packet) {
|
const process = async function (packet) {
|
||||||
|
// return new Promise((resolve) => {
|
||||||
|
// console.log('====== packet pushed from server ======')
|
||||||
|
// console.dir(packet)
|
||||||
|
// // setTimeout(resolve('done'),100)
|
||||||
|
// resolve('done')
|
||||||
|
// })
|
||||||
console.log('====== packet pushed from server ======')
|
console.log('====== packet pushed from server ======')
|
||||||
console.dir(packet)
|
console.dir(packet)
|
||||||
|
// setTimeout(resolve('done'),100)
|
||||||
|
return Promise.resolve('done')
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
client.registerPacketProcessor(process)
|
client.registerPacketProcessor(process)
|
||||||
|
@ -16,7 +25,7 @@ client.registerPacketProcessor(process)
|
||||||
;
|
;
|
||||||
(async () => {
|
(async () => {
|
||||||
|
|
||||||
client.connect()
|
console.log(await client.connect())
|
||||||
|
|
||||||
|
|
||||||
})().catch(err => {
|
})().catch(err => {
|
||||||
|
|
|
@ -30,9 +30,12 @@ import { Socket } from '../src'
|
||||||
}
|
}
|
||||||
|
|
||||||
// let test = new Test()
|
// let test = new Test()
|
||||||
let test = new Test({path:true})
|
let test = new Test({path:true, conPacket:{onconnect:'this is a packet sent to consumer as soon as it connects'}})
|
||||||
await test.create()
|
await test.create()
|
||||||
setInterval( () => { test.push({name:'pushed', status:'some pushed data'}) },10000)
|
let count = 0
|
||||||
|
setInterval( () => {
|
||||||
|
count++
|
||||||
|
test.push({name:'pushed', count:count, status:'some pushed data'}) },10000)
|
||||||
|
|
||||||
})().catch(err => {
|
})().catch(err => {
|
||||||
console.error('FATAL: UNABLE TO START SYSTEM!\n',err)
|
console.error('FATAL: UNABLE TO START SYSTEM!\n',err)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@uci/socket",
|
"name": "@uci/socket",
|
||||||
"version": "0.1.6",
|
"version": "0.1.9",
|
||||||
"description": "JSON packet intra(named)/inter(TCP) host communication over socket",
|
"description": "JSON packet intra(named)/inter(TCP) host communication over socket",
|
||||||
"main": "src",
|
"main": "src",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
|
@ -28,8 +28,8 @@ export default class Consumer extends Socket {
|
||||||
this.opts=opts
|
this.opts=opts
|
||||||
this.keepAlive = 'keepAlive' in opts ? opts.keepAlive : true
|
this.keepAlive = 'keepAlive' in opts ? opts.keepAlive : true
|
||||||
this._ready = false
|
this._ready = false
|
||||||
this.timeout = opts.timeout || 500
|
this.timeout = opts.timeout || 30
|
||||||
this.wait = opts.wait || 5
|
this.wait = opts.wait || 1
|
||||||
this.stream = new JsonStream()
|
this.stream = new JsonStream()
|
||||||
// bind to class for other class functions
|
// bind to class for other class functions
|
||||||
this.connect = this.connect.bind(this)
|
this.connect = this.connect.bind(this)
|
||||||
|
@ -47,10 +47,13 @@ export default class Consumer extends Socket {
|
||||||
super.connect(this.opts)
|
super.connect(this.opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let reconnect = {}
|
||||||
const timeout = setTimeout(() =>{
|
const timeout = setTimeout(() =>{
|
||||||
reject({opts:this.opts},`unable to connect in ${this.timeout*10}ms`)
|
clearTimeout(reconnect)
|
||||||
|
log.fatal({opts:this.opts},`unable to connect in ${this.timeout}s`)
|
||||||
|
reject({opts:this.opts},`unable to connect to socket server in ${this.timeout}secs`)
|
||||||
}
|
}
|
||||||
,this.timeout*10)
|
,this.timeout*1000)
|
||||||
|
|
||||||
this.once('connect', async () => {
|
this.once('connect', async () => {
|
||||||
clearTimeout(timeout)
|
clearTimeout(timeout)
|
||||||
|
@ -71,7 +74,8 @@ export default class Consumer extends Socket {
|
||||||
return resolve('ready')
|
return resolve('ready')
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout( () =>{ connect() },this.wait*100)
|
reconnect = setTimeout( () =>{ connect()
|
||||||
|
},this.wait*1000 )
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -105,14 +109,12 @@ export default class Consumer extends Socket {
|
||||||
}
|
}
|
||||||
let [err, res] = await btc(this.stream.serialize)(packet)
|
let [err, res] = await btc(this.stream.serialize)(packet)
|
||||||
if (err) resolve({error:'unable to serialize packet for sending', packet:packet})
|
if (err) resolve({error:'unable to serialize packet for sending', packet:packet})
|
||||||
log.info(await this.__write(res))
|
await this.__write(res)
|
||||||
// console.log('listerner set', packet._header.id, packet._header.sender.instanceID)
|
|
||||||
this.once(packet._header.id,async function(reply){
|
this.once(packet._header.id,async function(reply){
|
||||||
// console.log('reply emitted',reply)
|
|
||||||
let res = await this._packetProcess(reply)
|
let res = await this._packetProcess(reply)
|
||||||
if (!res) { // if process was not promise returning like just logged to console
|
if (!res) { // if process was not promise returning like just logged to console
|
||||||
res = reply
|
res = reply
|
||||||
log.warn('consumer function was not promise returning further processing may be out of sequence')
|
// log.warn('consumer function was not promise returning further processing may be out of sequence')
|
||||||
}
|
}
|
||||||
resolve(res)
|
resolve(res)
|
||||||
}) //end listener
|
}) //end listener
|
||||||
|
@ -131,7 +133,7 @@ export default class Consumer extends Socket {
|
||||||
async __write(packet) {
|
async __write(packet) {
|
||||||
// timeout already set if sockect can't be drained in 10 secs
|
// timeout already set if sockect can't be drained in 10 secs
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
const cb = () => resolve('=====>packet written to consumer side socket stream ')
|
const cb = () => resolve('packet written to consumer side socket stream ')
|
||||||
if (!super.write(packet)) {
|
if (!super.write(packet)) {
|
||||||
this.once('drain',cb )
|
this.once('drain',cb )
|
||||||
} else {
|
} else {
|
||||||
|
@ -150,7 +152,7 @@ export default class Consumer extends Socket {
|
||||||
// TODO do some extra security here?
|
// TODO do some extra security here?
|
||||||
let res = await this._packetProcess(packet)
|
let res = await this._packetProcess(packet)
|
||||||
if (!res) { // if process was not promise returning like just logged to console
|
if (!res) { // if process was not promise returning like just logged to console
|
||||||
log.warn('consumer function was not promise returning')
|
// log.warn('consumer function was not promise returning')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
// listen on socket stream
|
// listen on socket stream
|
||||||
|
|
|
@ -97,6 +97,11 @@ export default class Socket extends Server {
|
||||||
// TODO add 'close' listener to socket to remove from this.clients
|
// TODO add 'close' listener to socket to remove from this.clients
|
||||||
log.info('new consumer connecting')
|
log.info('new consumer connecting')
|
||||||
log.info(await send(await stream.serialize({'_handshake':true})))
|
log.info(await send(await stream.serialize({'_handshake':true})))
|
||||||
|
if (this.opts.conPacket) {
|
||||||
|
this.opts.conPacket._header = { id:'pushed'}
|
||||||
|
log.info({conPacket:this.opts.conPacket},'pushing a preset command to just connected consumer')
|
||||||
|
send(await stream.serialize(this.opts.conPacket)) // send a packet command on to consumer on connection
|
||||||
|
}
|
||||||
socket.on('data', stream.onData)
|
socket.on('data', stream.onData)
|
||||||
// TODO need to start error listener for stream so errors can be processed
|
// TODO need to start error listener for stream so errors can be processed
|
||||||
stream.on('message', messageProcess.bind(this,socket))
|
stream.on('message', messageProcess.bind(this,socket))
|
||||||
|
|
Loading…
Reference in New Issue