, , . keypress .
, , , 100 , . , 40 , . , 40 . , .
EventEmitter = require('events').EventEmitter
keypress = require('keypress')
_ = require('underscore')
module.exports = class Keyboard extends EventEmitter
_keyTimes: {}
constructor: ->
keypress(process.stdin)
process.stdin.setRawMode(true)
process.stdin.resume()
@_emitKeyStatus = _.throttle(@_emitKeyStatus, 40, leading: false)
process.stdin.on('keypress', (ch, key) => @_processKey(key))
_emitKeyStatus: ->
currentTime = @_tuple2time(process.hrtime())
millisecond = 1000000
keys = {}
for own keyName, time of @_keyTimes
if currentTime - time < 100 * millisecond
keys[keyName] = true
@emit('keypress', keys)
_tuple2time: (tuple) ->
(tuple[0] * 1e9) + tuple[1]
_processKey: (key) ->
return unless key
return @emit('quit') if key.ctrl and key.name is 'c'
time = @_tuple2time(process.hrtime())
@_keyTimes.shift = time if key.shift
@_keyTimes.ctrl = time if key.ctrl
@_keyTimes.meta = time if key.meta
@_keyTimes[key.name] = time
@_emitKeyStatus()