1
1
#!/usr/bin/env node
2
2
3
- const { PerformanceObserver, performance } = require ( 'perf_hooks' )
4
- const WebSocket = require ( 'ws' )
5
- import { randomName } from '../utils'
3
+ import WebSocket from 'ws'
4
+ import { host , port , wsApi , iters } from '../config'
5
+ import PerformanceTimer from '../PerformanceTimer'
6
+ import { Deferred , randomName } from '../utils'
6
7
7
- const host = process . env . HOST || '0.0.0.0'
8
- const port = process . env . PORT || 5000
9
- const server = process . env . SERVER || 'unknown'
10
- const wsApi = `ws://${ host } :${ port } /greeting`
8
+ function createRequester ( ws ) {
9
+ const requester = {
10
+ incoming : null ,
11
+ greeting ( data ) {
12
+ // new incoming message on the way
13
+ const incoming = requester . incoming = new Deferred ( )
14
+ ws . send ( JSON . stringify ( data ) )
15
+ return incoming . promise
16
+ }
17
+ }
11
18
12
- let iters = 10000
19
+ return requester
20
+ }
13
21
14
22
async function runTest ( ) {
15
- console . log ( `ws client <===> ${ server } server on ws://${ host } :${ port } /greeting` )
23
+ console . log ( `ws client connecting to ws://${ host } :${ port } /greeting` )
16
24
25
+ const timer = new PerformanceTimer ( )
26
+ const connect = new Deferred ( )
17
27
const ws = new WebSocket ( wsApi )
18
28
19
- function requestGreeting ( ) {
20
- ws . send ( JSON . stringify ( { name : randomName ( ) } ) )
21
- }
29
+ ws . on ( 'open' , ( ) => connect . resolve ( ) )
30
+ ws . on ( 'error' , err => connect . reject ( err ) )
31
+
32
+ try {
33
+ await connect . promise
22
34
23
- ws . on ( 'open' , ( ) => {
24
35
console . log ( `Running test with ${ iters } iterations...` )
25
36
26
- ws . on ( 'message' , message => {
37
+ const requester = createRequester ( ws )
38
+
39
+ ws . on ( 'message' , message => requester . incoming . resolve ( message ) )
40
+
41
+ let i = iters
42
+ await ( async function asyncLoop ( ) {
43
+ const sendData = { name : randomName ( ) }
44
+ const message = await requester . greeting ( sendData )
27
45
const data = JSON . parse ( message )
28
46
const { greeting } = data
29
-
30
- if ( -- iters > 0 ) {
31
- requestGreeting ( )
32
- } else {
33
- performance . mark ( 'END' )
34
- performance . measure ( 'START to END' , 'START' , 'END' )
35
47
36
- ws . terminate ( )
48
+ if ( -- i === 0 ) {
49
+ console . log ( `Last greeting: ${ greeting } ` )
50
+ return
37
51
}
38
- } )
52
+
53
+ await asyncLoop ( )
54
+ } ) ( )
39
55
40
- performance . mark ( 'START' )
56
+ timer . end ( )
57
+ ws . terminate ( )
41
58
42
- requestGreeting ( )
43
- } )
59
+ } catch ( err ) {
60
+ console . error ( 'Error connecting' )
61
+ }
44
62
}
45
63
46
- const obs = new PerformanceObserver ( items => {
47
- console . log ( 'End test' )
48
- console . log ( `Duration: ${ items . getEntries ( ) [ 0 ] . duration } ` )
49
- performance . clearMarks ( )
50
- } )
51
-
52
- obs . observe ( { entryTypes : [ 'measure' ] } )
53
-
54
64
if ( require . main === module ) {
55
65
runTest ( )
56
66
}
0 commit comments