Module: Hyperloop

Defined in:
lib/hyper-operation/transport/hyperloop.rb,
lib/hyper-operation/api.rb,
lib/hyper-operation/boot.rb,
lib/hyper-operation/engine.rb,
lib/hyper-operation/railway.rb,
lib/hyper-operation/version.rb,
lib/hyper-operation/exception.rb,
lib/hyper-operation/server_op.rb,
lib/hyper-operation/railway/run.rb,
lib/hyper-operation/transport/policy.rb,
lib/hyper-operation/call_by_class_name.rb,
lib/hyper-operation/railway/dispatcher.rb,
lib/hyper-operation/filters/acting_user.rb,
lib/hyper-operation/railway/validations.rb,
lib/hyper-operation/transport/connection.rb,
lib/hyper-operation/railway/params_wrapper.rb,
lib/hyper-operation/transport/action_cable.rb,
lib/hyper-operation/transport/client_drivers.rb,
lib/hyper-operation/transport/hyperloop_controller.rb

Overview

this is going to need some refactoring so that HyperMesh can add its methods in here…

Defined Under Namespace

Modules: AutoConnect, AutoCreate, ClassPolicyMethods, PolicyAutoLoader, PolicyMethods Classes: AccessViolation, ActingUser, ActionCableChannel, Application, ChannelBroadcastRegulation, ClassConnectionRegulation, ClientDrivers, Connection, Engine, IncomingBroadcast, InstanceBroadcastRegulation, InstanceConnectionRegulation, InternalClassPolicy, InternalPolicy, Operation, Regulation, SendSet, ServerOp

Class Method Summary collapse

Class Method Details

.action_cable_consumerObject



31
32
33
# File 'lib/hyper-operation/transport/client_drivers.rb', line 31

def self.action_cable_consumer
  ClientDrivers.opts[:action_cable_consumer]
end

.app_idObject



65
66
67
# File 'lib/hyper-operation/transport/hyperloop.rb', line 65

def self.app_id
  opts[:app_id] || Pusher.app_id if transport == :pusher
end

.authorization(salt, channel, session_id) ⇒ Object



138
139
140
141
142
143
# File 'lib/hyper-operation/transport/hyperloop.rb', line 138

def self.authorization(salt, channel, session_id)
  secret_key = Rails.application.secrets[:secret_key_base]
  Digest::SHA1.hexdigest(
    "salt: #{salt}, channel: #{channel}, session_id: #{session_id}, secret_key: #{secret_key}"
  )
end

.channelObject



134
135
136
# File 'lib/hyper-operation/transport/hyperloop.rb', line 134

def self.channel
  "private-#{channel_prefix}"
end

.connect(*channels) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/hyper-operation/transport/client_drivers.rb', line 17

def self.connect(*channels)
  channels.each do |channel|
    if channel.is_a? Class
      IncomingBroadcast.connect_to(channel.name)
    elsif channel.is_a?(String) || channel.is_a?(Array)
      IncomingBroadcast.connect_to(*channel)
    elsif channel.id
      IncomingBroadcast.connect_to(channel.class.name, channel.id)
    else
      raise "cannot connect to model before it has been saved"
    end
  end
end

.dispatch(data) ⇒ Object



162
163
164
165
166
167
168
# File 'lib/hyper-operation/transport/hyperloop.rb', line 162

def self.dispatch(data)
  if !Hyperloop.on_server? && Connection.root_path
    Hyperloop.send_to_server(data[:channel], [:dispatch, data])
  else
    Connection.send_to_channel(data[:channel], [:dispatch, data])
  end
end

.encryptedObject



77
78
79
# File 'lib/hyper-operation/transport/hyperloop.rb', line 77

def self.encrypted
  opts.key?(:encrypted) ? opts[:encrypted] : true
end

.expire_new_connection_inObject



89
90
91
# File 'lib/hyper-operation/transport/hyperloop.rb', line 89

def self.expire_new_connection_in
  opts[:expire_new_connection_in] || 10.seconds
end

.expire_polled_connection_inObject



81
82
83
# File 'lib/hyper-operation/transport/hyperloop.rb', line 81

def self.expire_polled_connection_in
  opts[:expire_polled_connection_in] || (5 * 60)
end

.initialize_policiesObject



5
6
7
# File 'lib/hyper-operation/transport/hyperloop.rb', line 5

def self.initialize_policies
  reset_operations unless @config_reset_called
end

.keyObject



69
70
71
# File 'lib/hyper-operation/transport/hyperloop.rb', line 69

def self.key
  opts[:key] || Pusher.key if transport == :pusher
end

.on_server?Boolean

Returns:

  • (Boolean)


117
118
119
# File 'lib/hyper-operation/transport/hyperloop.rb', line 117

def self.on_server?
  Rails.const_defined? 'Server'
end

.pusherObject



121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/hyper-operation/transport/hyperloop.rb', line 121

def self.pusher
  unless @pusher
    unless channel_prefix
      self.transport = nil
      raise '******** NO CHANNEL PREFIX SET ***************'
    end
    @pusher = Pusher::Client.new(
      opts || { app_id: app_id, key: key, secret: secret }
    )
  end
  @pusher
end

.refresh_channelsObject



101
102
103
104
105
# File 'lib/hyper-operation/transport/hyperloop.rb', line 101

def self.refresh_channels
  new_channels = pusher.channels[:channels].collect do |channel, _etc|
    channel.gsub(/^#{Regexp.quote(Hyperloop.channel)}\-/, '').gsub('==', '::')
  end
end

.refresh_channels_everyObject



97
98
99
# File 'lib/hyper-operation/transport/hyperloop.rb', line 97

def self.refresh_channels_every
  opts[:refresh_channels_every] || 2.minutes
end

.refresh_channels_timeoutObject



93
94
95
# File 'lib/hyper-operation/transport/hyperloop.rb', line 93

def self.refresh_channels_timeout
  opts[:refresh_channels_timeout] || 5.seconds
end

.reset_operationsObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/hyper-operation/transport/hyperloop.rb', line 13

def self.reset_operations
  @config_reset_called = true
  Rails.configuration.tap do |config|
    # config.eager_load_paths += %W(#{config.root}/app/hyperloop/models)
    # config.autoload_paths += %W(#{config.root}/app/hyperloop/models)
    # config.assets.paths << ::Rails.root.join('app', 'hyperloop').to_s
    config.after_initialize { Connection.build_tables }
  end
  Object.send(:remove_const, :Application) if @fake_application_defined
  policy = begin
    Object.const_get 'ApplicationPolicy'
  rescue LoadError
  rescue NameError => e
    raise e unless e.message =~ /uninitialized constant ApplicationPolicy/
  end
  application = begin
    Object.const_get('Application')
  rescue LoadError
  rescue NameError => e
    raise e unless e.message =~ /uninitialized constant Application/
  end if policy
  if policy && !application
    Object.const_set 'Application', Class.new
    @fake_application_defined = true
  end
  begin
    Object.const_get 'Hyperloop::ApplicationPolicy'
  rescue LoadError
  rescue NameError => e
    raise e unless e.message =~ /uninitialized constant Hyperloop::ApplicationPolicy/
  end
  @pusher = nil
end

.seconds_between_pollObject



85
86
87
# File 'lib/hyper-operation/transport/hyperloop.rb', line 85

def self.seconds_between_poll
  opts[:seconds_between_poll] || 0.5
end

.secretObject



73
74
75
# File 'lib/hyper-operation/transport/hyperloop.rb', line 73

def self.secret
  opts[:secret] || Pusher.secret if transport == :pusher
end

.send_data(channel, data) ⇒ Object



107
108
109
110
111
112
113
114
115
# File 'lib/hyper-operation/transport/hyperloop.rb', line 107

def self.send_data(channel, data)
  if !on_server?
    send_to_server(channel, data)
  elsif transport == :pusher
    pusher.trigger("#{Hyperloop.channel}-#{data[1][:channel].gsub('::', '==')}", *data)
  elsif transport == :action_cable
    ActionCable.server.broadcast("hyperloop-#{channel}", message: data[0], data: data[1])
  end
end

.send_to_server(channel, data) ⇒ Object

TODO this should work the same/similar to HyperMesh / Models way of sending to console



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/hyper-operation/transport/hyperloop.rb', line 145

def self.send_to_server(channel, data) # TODO this should work the same/similar to HyperMesh / Models way of sending to console
  salt = SecureRandom.hex
  authorization = authorization(salt, channel, data[1][:broadcast_id])
  raise 'no server running' unless Connection.root_path
  uri = URI("#{Connection.root_path}console_update")
  http = Net::HTTP.new(uri.host, uri.port)
  request = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json')
  if uri.scheme == 'https'
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end
  request.body = {
    channel: channel, data: data, salt: salt, authorization: authorization
  }.to_json
  http.request(request)
end