Jump To …

amazon.coffee

#

Require Node.js core modules.

sys             = require("sys")
events          = require("events")
#

Require Node EC2 specific modules.

ResponseParser  = require("./response").ResponseParser
invoke          = require("./request").invoke
#

Used whan a callback is not provided.

noop = -> true

class AmazonEC2Client extends events.EventEmitter

  constructor: (@options) ->
    @commands = []
    @parser = new ResponseParser

  call: (name, parameters, callback) ->
    @push false, name, parameters, callback

  poll: (name, parameters, callback) ->
    @push true, name, parameters, callback

  push: (retry, name, parameters, callback) ->
    if typeof parameters == "function"
      callback = parameters
      parameters = {}
    parameters or= {}
    callback or= noop
    @commands.push({ name, parameters, callback, retry })

  execute: () =>
    if (@commands.length == 0)
      @emit("end")
    else
      command = @commands.shift()
      invoke @options.key, @options.secret, command.name, command.parameters,
        (response, body) =>
          statusCode = Math.floor(response.statusCode / 100)
          if command.callback || statusCode != 2
            @parser.read body, (error, struct) =>
              if error
                @emit "error", error, response.statusCode
                return
              if statusCode == 2
                try
                  outcome = command.callback(struct)
                catch _
                  @emit "error",  _, response.statusCode
                  return
                if command.retry and !outcome
                  @commands.unshift command
                  execute = () => @execute()
                  setTimeout execute, 1000
                else
                  @execute()
              else
                @emit "error", struct, response.statusCode
          else
            @execute()

module.exports.createClient = (options) ->
  return new AmazonEC2Client options