4 async = require 'async'
5 af = require './api.coffee'
7 token_file = "#{process.env.HOME}/.af-coffee-token"
9 timeout = (ms, f) -> setTimeout f, ms
11 # a session caches the api access token and prompts for the username and
12 # password if it goes stale. It re-tries API calls that fail due to
13 # invalid/expired token
19 api: (call, args..., callback) ->
31 af[call] @token, args..., callback
33 # eg /app/xxx/stats sometimes returns 404 with wrong auth token
34 if err?.code is 403 or err?.code is 404
36 @api(call, args..., callback)
40 ask = (opts, callback) ->
41 process.stdout.write opts.prompt
42 process.stdin.setEncoding 'utf8'
43 process.stdin.resume()
44 process.stdin.once 'data', (line) ->
46 # send ^[[A^[[2K to move the cursor up one line, then clear that line
47 process.stdout.write new Buffer [27, 91, 65, 27, 91, 50, 75]
48 process.stdout.write opts.prompt + "***\n"
50 callback null, (line.substr 0, line.length - 1)
52 get_token = (callback) ->
53 fs.readFile token_file, 'utf8', (err, token) ->
61 (callback) -> async.series [
62 (callback) -> ask prompt: 'username: ', callback
63 (callback) -> ask prompt: 'password: ', silent: true, callback
65 ([username, password], callback) ->
66 af.login username, password, callback
68 # wait for file write so there's no race condition if get_token gets called soon
69 fs.writeFile token_file, token, (err) ->
71 console.log "Warning: couldn't cache auth token in #{token_file}: ", err
72 # don't pass on error, it's ok if we can't cache it
77 exports.new_session = ->
81 console.log "usage: #{process.argv[0]} #{process.argv[1]} command [args...]"
82 console.log "valid commands are:"
84 console.log "\t#{k}" unless k is 'login'
86 # parse and act on commandline arguments unless we were require()d as a module
87 if require.main is module
88 args = process.argv[2..]
91 else if not af[args[0]]
92 console.log "unknown command \"#{args[0]}\""
95 session = new Session()
96 session.api args[0], args[1..], (err, result) ->
98 console.log "error: ", err
100 console.log "result: ", result