-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpromises-reconn-loop-example.js
107 lines (97 loc) · 3.21 KB
/
promises-reconn-loop-example.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
* Cocker example, mixing #watch and #hunt Promises
*/
var log = console.log
, floor = Math.floor
, random = Math.random
, now = Date.now
, assert = require( 'assert' )
, net = require( 'net' )
, server = net.createServer()
, Cocker = require( '../' )
, trials = 4
, port = 63800
, opt = {
address : {
port : port
}
, reconnection : {
trials : trials
, interval : 200
}
}
, attempts = 0
, ck = Cocker( opt )
, sock = null
// utils
, delay = ( t ) => new Promise ( ( solve ) => setTimeout( solve, t ) )
, destroy = ( socket, min, max ) => {
min = + min || 0;
max = + max || 4000;
let lapse = min + floor( random() * ( max - min + 1 ) )
;
delay( lapse ).then( ( lapse ) => socket.destroy() );
return lapse;
}
// server connection handling
, handle = ( s ) => {
log( '-> server: new connection!' );
s.once( 'close', () => log( '-> server: socket was closed!' ) );
// server goes down after max 5 secs
let d = ( 5 * random() ).toFixed( 2 ) * 1000
;
if ( ! sock )
log( '-> server: will crash in %d secs!', d / 1000 ) &
delay( d ).then( () =>
log( '-> server: destroy!' ) &
sock.destroy() &
server.close()
);
// voluntariy destroy socket in casual time
d = destroy( s, 1000, 3000 );
log( '-> server: socket will be destroyed in %d secs', d / 1000 );
// silly way to hold socket
sock = s;
}
// Promises
, hunting = () => {
log( '\n(hunt pending) %d\n', now() );
return ck.hunt()
.then( ( args ) => {
log( '(hunt resolved) %d\n', now() );
}, ( args ) => {
log( '\n(hunt rejected) %d\n', now() );
} ). catch( ( what ) => {
log( '\n(hunt catched) %d\n', now(), what );
} );
}
, watching = () => {
log( '\n(watch pending) %d\n', now() );
return ck.watch()
.then( ( args ) => {
log( '(watch resolved) %d\n', now() );
}, ( args ) => {
log( '\n(watch rejected) %d\n', now() );
} ).catch( ( what ) => {
log( '\n(watch catched) %d\n', now(), what );
} );
}
;
// log events for client
ck.on( 'online', ( addr ) => log( '-> cocker: online!' ) );
ck.on( 'offline', ( addr, haderr ) => log( '-> cocker: offline!' ) );
ck.on( 'attempt', ( t, addr, lapse ) => log( '-> cocker: (%d) attempt (%ds)', t, lapse / 1000 ) );
ck.on( 'close', ( v ) => log( '- cocker: close!' ) );
ck.on( 'lost', ( addr ) => log( '- cocker: lost!' ) );
// log close event for server
server.on( 'close', () => log( '-> server: close!' ) );
// watch connection
ck.on( 'online', watching );
// start #hunt before the server is listening, or
// simply connect when the server is listening:
// server.on( 'listening', hunt );
hunting();
// handle socket for simulating crashes
server.on( 'connection', handle );
server.listen( port );
log( '-> server: listening on port %d', port );