class Volt::Tasks

The tasks class provides an interface to call tasks on the backend server. This class is setup as page.task (as a singleton)

Public Class Methods

new(volt_app) click to toggle source
# File lib/volt/page/tasks.rb, line 7
def initialize(volt_app)
  @volt_app       = volt_app
  @promise_id = 0
  @promises   = {}

  volt_app.channel.on('message') do |*args|
    received_message(*args)
  end
end

Public Instance Methods

call(class_name, method_name, meta_data, *args) click to toggle source
# File lib/volt/page/tasks.rb, line 17
def call(class_name, method_name, meta_data, *args)
  promise_id            = @promise_id
  @promise_id += 1

  # Track the callback
  promise               = Promise.new
  @promises[promise_id] = promise

  # TODO: Timeout on these callbacks
  @volt_app.channel.send_message([promise_id, class_name, method_name, meta_data, *args])

  promise
end
notify_query(method_name, collection, query, *args) click to toggle source

Called when the backend sends a notification to change the results of a query.

# File lib/volt/page/tasks.rb, line 69
def notify_query(method_name, collection, query, *args)
  query_obj = Persistors::ArrayStore.query_pool.lookup(collection, query)
  query_obj.send(method_name, *args)
end
received_message(name, promise_id, *args) click to toggle source
# File lib/volt/page/tasks.rb, line 31
def received_message(name, promise_id, *args)
  case name
    when 'added', 'removed', 'updated', 'changed'
      notify_query(name, *args)
    when 'response'
      response(promise_id, *args)
    when 'reload'
      reload
  end
end
reload() click to toggle source
# File lib/volt/page/tasks.rb, line 74
def reload
  # Stash the current page value
  begin
    value = EJSON.stringify(Volt.current_app.page.to_h)

    # If this browser supports session storage, store the page, so it will
    # be in the same state when we reload.
    `sessionStorage.setItem('___page', value);` if `sessionStorage`
  rescue EJSON::NonEjsonType => e
    # Unable to serailize the page, ignore stashing it
    # clear the ___page stash
    `sessionStorage.removeItem('___page');`
  end

  Volt.current_app.page._reloading = true
  `window.location.reload(false);`
end
response(promise_id, result, error, cookies) click to toggle source

When a request is sent to the backend, it can attach a callback, this is called from the backend to pass to the callback.

# File lib/volt/page/tasks.rb, line 44
def response(promise_id, result, error, cookies)
  # Set the cookies
  if cookies
    cookies.each do |key, value|
      @volt_app.cookies.set(key, value)
    end
  end

  promise = @promises.delete(promise_id)

  if promise
    if error
      # TODO: full error handling
      Volt.logger.error('Task Response:')
      Volt.logger.error(error)

      promise.reject(error)
    else
      promise.resolve(result)
    end
  end
end