class Nestene::Actor::Core

Public Class Methods

new(storage) click to toggle source
# File lib/nestene/actor/core.rb, line 10
def initialize(storage)
  subscribe('state_update', :notify_waiters)
  @execution_futures={}
  @storage = storage
end

Public Instance Methods

auton_names() click to toggle source
# File lib/nestene/actor/core.rb, line 16
def auton_names
  @storage.list
end
cancel_delayed_step(auton_id, step_id) click to toggle source
# File lib/nestene/actor/core.rb, line 60
def cancel_delayed_step auton_id, step_id
  Celluloid::Actor["storage:%s" % auton_id].update do |state|
    delayed = state.queue.remove_delayed_method step_id
  end
end
create_auton(type, auton_id=SecureRandom.uuid) click to toggle source
# File lib/nestene/actor/core.rb, line 28
def create_auton type, auton_id=SecureRandom.uuid
  storage = AutonStorage.new(auton_id, @storage)
  Celluloid::Actor["storage:%s" % auton_id] = storage
  storage.create(type)
  auton_id
rescue Exception => e
  abort e
end
get_credentials() click to toggle source
# File lib/nestene/actor/core.rb, line 20
def get_credentials
  @storage.load('__credentials__') || {}
end
get_state(auton_id) click to toggle source
# File lib/nestene/actor/core.rb, line 37
def get_state auton_id
  Celluloid::Actor["storage:%s" % auton_id].get
rescue Exception => e
  abort e
end
notify_waiters(topic, auton_id, state) click to toggle source
# File lib/nestene/actor/core.rb, line 140
def notify_waiters topic, auton_id, state
  if state
    future = @execution_futures.delete(auton_id)
    future.signal(SelfValue.new) if future
  end
end
repeat_step(auton_id, method_uuid) click to toggle source
# File lib/nestene/actor/core.rb, line 81
def repeat_step auton_id, method_uuid
  step_id = SecureRandom.uuid
  Celluloid::Actor["storage:%s" % auton_id].update do |state|

    original_step = state.queue.executed.find{|m| m.uuid == method_uuid}

    method = ScheduledMethod.new
    method.name = original_step.name
    method.parameters = original_step.parameters
    method.uuid = step_id
    state.queue.to_execute.unshift method
    state.queue.failed = false
  end
  step_id
end
resume(auton_id) click to toggle source
# File lib/nestene/actor/core.rb, line 97
def resume auton_id
  Celluloid::Actor["storage:%s" % auton_id].update do |state|
    state.queue.failed = false
  end
end
schedule_delayed_step(auton_id, delay , name, parameters=[]) click to toggle source
# File lib/nestene/actor/core.rb, line 66
def schedule_delayed_step auton_id, delay , name, parameters=[]
  Celluloid::Actor["storage:%s" % auton_id].update do |state|
    delayed = state.queue.add_delayed_method name, parameters, delay
    delayed.uuid
  end
end
schedule_repeating_delayed_step(auton_id, every, delay, name, parameters=[]) click to toggle source
# File lib/nestene/actor/core.rb, line 74
def schedule_repeating_delayed_step auton_id, every, delay, name, parameters=[]
  Celluloid::Actor["storage:%s" % auton_id].update do |state|
    delayed = state.queue.add_delayed_method name, parameters, delay, every
    delayed.uuid
  end
end
schedule_step(auton_id, step_name, parameters=[], callback_auton_id=nil, callback_method=nil) click to toggle source
# File lib/nestene/actor/core.rb, line 43
def schedule_step auton_id, step_name, parameters=[], callback_auton_id=nil, callback_method=nil
  step_id = SecureRandom.uuid
  Celluloid::Actor["storage:%s" % auton_id].update do |state|
    method = ScheduledMethod.new
    method.name = step_name
    method.parameters = parameters
    method.uuid = step_id
    if callback_auton_id && callback_method
      method.callback = Callback.new
      method.callback.name = callback_method
      method.callback.auton_id = callback_auton_id
    end
    state.queue.to_execute << method
  end
  step_id
end
set_credentials(credentials) click to toggle source
# File lib/nestene/actor/core.rb, line 24
def set_credentials credentials
  @storage.store('__credentials__',credentials)
end
wait_for_execution_result(auton_id, method_uuid) click to toggle source
# File lib/nestene/actor/core.rb, line 104
def wait_for_execution_result auton_id, method_uuid

  future = nil

  executed = nil


  exclusive do

    state = Celluloid::Actor["storage:%s" % auton_id].get

    unless @execution_futures.has_key?(auton_id)
      @execution_futures[auton_id] = Celluloid::Future.new
    end

    future = @execution_futures[auton_id]

    executed = state ? state.queue.executed.find{|m| m.uuid == method_uuid} : nil

  end

  until executed

    executed = future.value
    state = Celluloid::Actor["storage:%s" % auton_id].get
    executed = state.queue.executed.find{|m| m.uuid == method_uuid}
  end

  if executed.error
    abort executed.error
  else
    return executed.result
  end

end