-
Notifications
You must be signed in to change notification settings - Fork 0
/
play.js
90 lines (76 loc) · 2.23 KB
/
play.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
const WebSocketClient = require('websocket').client
const ArgumentParser = require('argparse').ArgumentParser
const fs = require('fs')
function log(message) {
console.log(`${new Date()} ${message}`)
}
class EventReader {
constructor(file) {
this.buffer = fs.readFileSync(file)
this.offset = 0
}
readNext() {
if (this.offset >= this.buffer.length) {
return [0, undefined]
}
let relativeTimeInMs = this.buffer.readUInt32BE(this.offset + 0)
let messageLengthInBytes = this.buffer.readUInt32BE(this.offset + 4)
let binaryData = this.buffer.slice(this.offset + 8, this.offset + 8 + messageLengthInBytes)
this.offset += 8 + messageLengthInBytes
return [relativeTimeInMs, binaryData]
}
}
class Player {
constructor(ip_address, event_file) {
log(`Connecting to ${args.ip_address}`)
this.client = new WebSocketClient()
this.client.connect(`ws://${ip_address}:8080/`)
log(`Reading file: ${event_file}`)
this.eventReader = new EventReader(event_file)
this.client.on('connectFailed', function(error) {
log('Connect Error: ' + error.toString())
})
this.client.on('connect', (connection) => {
log('WebSocket Client Connected')
connection.on('error', (error) => {
log("Connection Error: " + error.toString())
})
connection.on('close', () => {
log('Connection Closed')
})
this._fireNextEvent(connection)
})
}
_fireNextEvent(connection) {
let [relativeTimeInMs, binaryData] = this.eventReader.readNext()
if (binaryData === undefined) {
log(`End of Messages`)
connection.close()
} else {
setTimeout(() => {
log(`Writing Message (${binaryData.length} bytes.)`)
connection.send(binaryData)
this._fireNextEvent(connection)
}, relativeTimeInMs)
}
}
}
var parser = new ArgumentParser({
version: '1.0.0',
addHelp:true,
description: 'A simple event recorder'
})
parser.addArgument(
[ '-i', '--ip-address' ],
{
help: 'The ip address of the recognizer to record.'
}
)
parser.addArgument(
[ '-e', '--event-file' ],
{
help: 'A file to read event messages from.'
}
)
var args = parser.parseArgs()
player = new Player(args.ip_address, args.event_file)