plezi 0.9.2 → 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +44 -31
- data/bin/plezi +3 -3
- data/lib/plezi.rb +21 -43
- data/lib/plezi/common/defer.rb +21 -0
- data/lib/plezi/common/dsl.rb +115 -91
- data/lib/plezi/common/redis.rb +44 -0
- data/lib/plezi/common/settings.rb +58 -0
- data/lib/plezi/handlers/controller_core.rb +132 -0
- data/lib/plezi/handlers/controller_magic.rb +85 -259
- data/lib/plezi/handlers/http_router.rb +139 -60
- data/lib/plezi/handlers/route.rb +9 -178
- data/lib/plezi/handlers/stubs.rb +2 -2
- data/lib/plezi/helpers/http_sender.rb +72 -0
- data/lib/plezi/helpers/magic_helpers.rb +12 -0
- data/lib/plezi/{server → helpers}/mime_types.rb +0 -0
- data/lib/plezi/version.rb +1 -1
- data/plezi.gemspec +3 -11
- data/resources/Gemfile +20 -21
- data/resources/controller.rb +2 -2
- data/resources/oauth_config.rb +1 -1
- data/resources/redis_config.rb +2 -0
- data/test/plezi_tests.rb +39 -46
- metadata +24 -33
- data/lib/plezi/common/logging.rb +0 -60
- data/lib/plezi/eventmachine/connection.rb +0 -190
- data/lib/plezi/eventmachine/em.rb +0 -98
- data/lib/plezi/eventmachine/io.rb +0 -272
- data/lib/plezi/eventmachine/protocol.rb +0 -54
- data/lib/plezi/eventmachine/queue.rb +0 -51
- data/lib/plezi/eventmachine/ssl_connection.rb +0 -144
- data/lib/plezi/eventmachine/timers.rb +0 -117
- data/lib/plezi/eventmachine/workers.rb +0 -33
- data/lib/plezi/handlers/http_echo.rb +0 -27
- data/lib/plezi/handlers/http_host.rb +0 -214
- data/lib/plezi/handlers/magic_helpers.rb +0 -32
- data/lib/plezi/server/http.rb +0 -129
- data/lib/plezi/server/http_protocol.rb +0 -319
- data/lib/plezi/server/http_request.rb +0 -146
- data/lib/plezi/server/http_response.rb +0 -319
- data/lib/plezi/server/websocket.rb +0 -251
- data/lib/plezi/server/websocket_client.rb +0 -178
- data/lib/plezi/server/ws_response.rb +0 -161
@@ -1,69 +1,148 @@
|
|
1
1
|
module Plezi
|
2
|
-
#####
|
3
|
-
# this is a Handler stub class for an HTTP echo server.
|
4
|
-
class HTTPRouter
|
5
|
-
|
6
|
-
# the hosts dictionary router.hosts['www.foo.com'] == HTTPHost
|
7
|
-
attr_reader :hosts
|
8
|
-
# the current active host object
|
9
|
-
attr_reader :active_host
|
10
|
-
|
11
|
-
# initializes an HTTP router (the normal Handler for HTTP requests)
|
12
|
-
#
|
13
|
-
# the router holds the different hosts and sends them messages/requests.
|
14
|
-
def initialize
|
15
|
-
@hosts = {}
|
16
|
-
@active_host = nil
|
17
|
-
end
|
18
2
|
|
19
|
-
|
20
|
-
def add_host host_name, params
|
21
|
-
host_name = (host_name ? host_name.to_s.downcase : :default)
|
22
|
-
@hosts[host_name] ||= HTTPHost.new params
|
23
|
-
add_alias host_name, *params[:alias] if params[:alias]
|
24
|
-
@active_host = @hosts[host_name]
|
25
|
-
end
|
26
|
-
# adds an alias to an existing host name (normally through the :alias parameter in the `add_host` method).
|
27
|
-
def add_alias host_name, *aliases
|
28
|
-
return false unless @hosts[host_name]
|
29
|
-
aliases.each {|a| @hosts[a.to_s.downcase] = @hosts[host_name]}
|
30
|
-
true
|
31
|
-
end
|
3
|
+
module Base
|
32
4
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
@active_host.add_route path, controller, &block
|
37
|
-
end
|
5
|
+
#####
|
6
|
+
# handles the HTTP Routing
|
7
|
+
class HTTPRouter
|
38
8
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
def on_request request
|
47
|
-
request.service.timeout = 300
|
48
|
-
if request[:host_name] && hosts[request[:host_name].to_s.downcase]
|
49
|
-
hosts[request[:host_name].downcase].on_request request
|
50
|
-
elsif hosts[:default]
|
51
|
-
hosts[:default].on_request request
|
52
|
-
else
|
53
|
-
HTTPResponse.new( request, 404, {'content-type' => 'text/plain', 'content-length' => '15'}, ['host not found.']).finish
|
9
|
+
class Host
|
10
|
+
attr_reader :params
|
11
|
+
attr_reader :routes
|
12
|
+
def initialize params
|
13
|
+
@params = params
|
14
|
+
@routes = []
|
15
|
+
end
|
54
16
|
end
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
hosts
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
17
|
+
|
18
|
+
# initializes an HTTP router (the normal Handler for HTTP requests)
|
19
|
+
#
|
20
|
+
# the router holds the different hosts and sends them messages/requests.
|
21
|
+
def initialize
|
22
|
+
@hosts = {}
|
23
|
+
@active_host = nil
|
24
|
+
@sass_cache = Sass::CacheStores::Memory.new if defined?(::Sass)
|
25
|
+
end
|
26
|
+
|
27
|
+
# adds a host to the router (or activates an existing host to add new routes). accepts a host name and any parameters not related to the service (see `Plezi.add_service`)
|
28
|
+
def add_host host_name, params = {}
|
29
|
+
host_name = (host_name ? host_name.to_s.downcase : :default)
|
30
|
+
@active_host = get_host(host_name) || ( @hosts[host_name] = Host.new(params) )
|
31
|
+
add_alias host_name, *params[:alias] if params[:alias]
|
32
|
+
@active_host
|
33
|
+
end
|
34
|
+
# adds an alias to an existing host name (normally through the :alias parameter in the `add_host` method).
|
35
|
+
def add_alias host_name, *aliases
|
36
|
+
host = get_host host_name
|
37
|
+
return false unless host
|
38
|
+
aliases.each {|a| @hosts[a.to_s.downcase] = host}
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
# adds a route to the active host. The active host is the last host referenced by the `add_host`.
|
43
|
+
def add_route path, controller, &block
|
44
|
+
raise 'No Host defined.' unless @active_host
|
45
|
+
@active_host.routes << Route.new(path, controller, &block)
|
46
|
+
end
|
47
|
+
|
48
|
+
# adds a route to all existing hosts.
|
49
|
+
def add_shared_route path, controller, &block
|
50
|
+
raise 'No Host defined.' if @hosts.empty?
|
51
|
+
@hosts.each {|n, h| h.routes << Route.new(path, controller, &block) }
|
52
|
+
end
|
53
|
+
|
54
|
+
# handles requests send by the HTTP Protocol (HTTPRequest objects)
|
55
|
+
def call request, response
|
56
|
+
begin
|
57
|
+
host = get_host(request[:host_name].to_s.downcase) || @hosts[:default]
|
58
|
+
return false unless host
|
59
|
+
request.io[:params] = host.params
|
60
|
+
# render any assets?
|
61
|
+
return true if render_assets request, response, host.params
|
62
|
+
# send static file, if exists and root is set.
|
63
|
+
return true if Base::HTTPSender.send_static_file request, response
|
64
|
+
# return if a route answered the request
|
65
|
+
host.routes.each {|r| a = r.on_request(request, response); return a if a}
|
66
|
+
#return error code or 404 not found
|
67
|
+
Base::HTTPSender.send_by_code request, response, 404
|
68
|
+
rescue => e
|
69
|
+
# return 500 internal server error.
|
70
|
+
GReactor.error e
|
71
|
+
Base::HTTPSender.send_by_code request, response, 500
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
protected
|
76
|
+
|
77
|
+
def get_host host_name
|
78
|
+
@hosts.each {|k, v| return v if k === host_name}
|
79
|
+
nil
|
65
80
|
end
|
81
|
+
|
82
|
+
###############
|
83
|
+
## asset rendering and responses
|
84
|
+
|
85
|
+
# renders assets, if necessary, and places the rendered result in the cache and in the public folder.
|
86
|
+
def render_assets request, response, params
|
87
|
+
# contine only if assets are defined and called for
|
88
|
+
return false unless params[:assets] && request.path.match(/^#{params[:assets_public]}\/.+/)
|
89
|
+
# review callback, if defined
|
90
|
+
return true if params[:assets_callback] && params[:assets_callback].call(request, response)
|
91
|
+
|
92
|
+
# get file requested
|
93
|
+
source_file = File.join(params[:assets], *(request.path.match(/^#{params[:assets_public]}\/(.+)/)[1].split('/')))
|
94
|
+
|
95
|
+
# stop if file name is reserved / has security issues
|
96
|
+
return false if source_file.match(/(scss|sass|coffee|\.\.\/)$/)
|
97
|
+
|
98
|
+
# set where to store the rendered asset
|
99
|
+
target_file = false
|
100
|
+
target_file = File.join( params[:root], params[:assets_public], *request.path.match(/^#{params[:assets_public]}\/(.*)/)[1].split('/') ) if params[:root]
|
101
|
+
|
102
|
+
# send the file if it exists (no render needed)
|
103
|
+
if File.exists?(source_file)
|
104
|
+
data = Plezi.cache_needs_update?(source_file) ? Plezi.save_file(target_file, Plezi.reload_file(source_file), params[:save_assets]) : Plezi.load_file(source_file)
|
105
|
+
return (data ? Base::HTTPSender.send_raw_data(request, response, data, MimeTypeHelper::MIME_DICTIONARY[::File.extname(source_file)]) : false)
|
106
|
+
end
|
107
|
+
|
108
|
+
# render supported assets
|
109
|
+
case source_file
|
110
|
+
when /\.css$/
|
111
|
+
sass = source_file.gsub /css$/, 'sass'
|
112
|
+
sass.gsub! /sass$/, 'scss' unless Plezi.file_exists?(sass)
|
113
|
+
return false unless Plezi.file_exists?(sass)
|
114
|
+
# review mtime and render sass if necessary
|
115
|
+
if defined?(::Sass) && refresh_sass?(sass)
|
116
|
+
eng = Sass::Engine.for_file(sass, cache_store: @sass_cache)
|
117
|
+
Plezi.cache_data sass, eng.dependencies
|
118
|
+
css, map = eng.render_with_sourcemap(params[:assets_public])
|
119
|
+
Plezi.save_file target_file, css, params[:save_assets]
|
120
|
+
Plezi.save_file (target_file + ".map"), map, params[:save_assets]
|
121
|
+
end
|
122
|
+
# try to send the cached css file which started the request.
|
123
|
+
return Base::HTTPSender.send_file request, response, target_file
|
124
|
+
when /\.js$/
|
125
|
+
coffee = source_file.gsub /js$/i, 'coffee'
|
126
|
+
return false unless Plezi.file_exists?(coffee)
|
127
|
+
# review mtime and render coffee if necessary
|
128
|
+
if defined?(::CoffeeScript) && Plezi.cache_needs_update?(coffee)
|
129
|
+
# render coffee to cache
|
130
|
+
Plezi.cache_data coffee, nil
|
131
|
+
Plezi.save_file target_file, CoffeeScript.compile(IO.read coffee), params[:save_assets]
|
132
|
+
end
|
133
|
+
# try to send the cached js file which started the request.
|
134
|
+
return Base::HTTPSender.send_file request, response, target_file
|
135
|
+
end
|
136
|
+
false
|
137
|
+
end
|
138
|
+
def refresh_sass? sass
|
139
|
+
return false unless File.exists?(sass)
|
140
|
+
return true if Plezi.cache_needs_update?(sass)
|
141
|
+
mt = Plezi.file_mtime(sass)
|
142
|
+
Plezi.get_cached(sass).each {|e| return true if File.exists?(e.options[:filename]) && (File.mtime(e.options[:filename]) > mt)} # fn = File.join( e.options[:load_paths][0].root, e.options[:filename])
|
143
|
+
false
|
144
|
+
end
|
145
|
+
|
66
146
|
end
|
67
147
|
end
|
68
|
-
|
69
148
|
end
|
data/lib/plezi/handlers/route.rb
CHANGED
@@ -13,18 +13,16 @@ module Plezi
|
|
13
13
|
attr_reader :params
|
14
14
|
|
15
15
|
# lets the route answer the request. returns false if no response has been sent.
|
16
|
-
def on_request request
|
16
|
+
def on_request request, response
|
17
17
|
fill_parameters = match request.path
|
18
18
|
return false unless fill_parameters
|
19
19
|
old_params = request.params.dup
|
20
|
-
fill_parameters.each {|k,v| HTTP.add_param_to_hash k, v, request.params }
|
20
|
+
fill_parameters.each {|k,v| GRHttp::HTTP.add_param_to_hash k, v, request.params }
|
21
21
|
ret = false
|
22
|
-
response = HTTPResponse.new request
|
23
22
|
if controller
|
24
|
-
ret = controller.new(request, response
|
23
|
+
ret = controller.new(request, response)._route_path_to_methods_and_set_the_response_
|
25
24
|
elsif proc
|
26
25
|
ret = proc.call(request, response)
|
27
|
-
# response << ret if ret.is_a?(String)
|
28
26
|
elsif controller == false
|
29
27
|
request.path = path.match(request.path).to_a.last.to_s
|
30
28
|
return false
|
@@ -33,28 +31,9 @@ module Plezi
|
|
33
31
|
request.params.replace old_params unless fill_parameters.empty?
|
34
32
|
return false
|
35
33
|
end
|
36
|
-
response.try_finish
|
37
34
|
return ret
|
38
35
|
end
|
39
36
|
|
40
|
-
# handles Rack requests (dresses up as Rack).
|
41
|
-
def call request
|
42
|
-
fill_parameters = match request.path_info
|
43
|
-
return false unless fill_parameters
|
44
|
-
fill_parameters.each {|k,v| HTTP.add_param_to_hash k, v, request.params }
|
45
|
-
response = HTTPResponse.new request
|
46
|
-
if controller
|
47
|
-
ret = controller.new(request, response, params)._route_path_to_methods_and_set_the_response_
|
48
|
-
return response if ret
|
49
|
-
elsif proc
|
50
|
-
ret = proc.call(request, response)
|
51
|
-
return response if ret
|
52
|
-
elsif controller == false
|
53
|
-
request.path_info = path.match(request.path_info).to_a.last
|
54
|
-
end
|
55
|
-
return false
|
56
|
-
end
|
57
|
-
|
58
37
|
# the initialize method accepts a Regexp or a String and creates the path object.
|
59
38
|
#
|
60
39
|
# Regexp paths will be left unchanged
|
@@ -122,7 +101,7 @@ module Plezi
|
|
122
101
|
# convert dest.id and dest[:id] to their actual :id value.
|
123
102
|
dest = {id: (dest.id rescue false) || (raise TypeError, "Expecting a Symbol, Hash, String, Numeric or an object that answers to obj[:id] or obj.id") }
|
124
103
|
end
|
125
|
-
dest.default_proc = Plezi::Helpers::HASH_SYM_PROC
|
104
|
+
dest.default_proc = Plezi::Base::Helpers::HASH_SYM_PROC
|
126
105
|
|
127
106
|
url = '/'
|
128
107
|
|
@@ -133,7 +112,7 @@ module Plezi
|
|
133
112
|
param_name = param_name[1].to_sym if param_name
|
134
113
|
|
135
114
|
if param_name && dest[param_name]
|
136
|
-
url << HTTP.encode(dest.delete(param_name).to_s, :url)
|
115
|
+
url << GRHttp::HTTP.encode(dest.delete(param_name).to_s, :url)
|
137
116
|
url << '/'
|
138
117
|
elsif !param_name
|
139
118
|
url << sec
|
@@ -146,7 +125,7 @@ module Plezi
|
|
146
125
|
end
|
147
126
|
unless dest.empty?
|
148
127
|
add = '?'
|
149
|
-
dest.each {|k, v| url << "#{add}#{HTTP.encode(k.to_s, :url)}=#{HTTP.encode(v.to_s, :url)}"; add = '&'}
|
128
|
+
dest.each {|k, v| url << "#{add}#{GRHttp::HTTP.encode(k.to_s, :url)}=#{GRHttp::HTTP.encode(v.to_s, :url)}"; add = '&'}
|
150
129
|
end
|
151
130
|
url
|
152
131
|
|
@@ -250,7 +229,7 @@ module Plezi
|
|
250
229
|
# m = nil
|
251
230
|
# unless @fill_parameters.values.include?("format")
|
252
231
|
# if (m = path.match /([^\.]*)\.([^\.\/]+)$/)
|
253
|
-
# HTTP.add_param_to_hash 'format', m[2], hash
|
232
|
+
# GRHttp::HTTP.add_param_to_hash 'format', m[2], hash
|
254
233
|
# path = m[1]
|
255
234
|
# end
|
256
235
|
# end
|
@@ -277,157 +256,9 @@ module Plezi
|
|
277
256
|
new_class_name = "Plezi__#{controller.name.gsub /[\:\-\#\<\>\{\}\(\)\s]/, '_'}"
|
278
257
|
return Module.const_get new_class_name if Module.const_defined? new_class_name
|
279
258
|
# controller.include Plezi::ControllerMagic
|
280
|
-
controller.instance_exec(container) {|r| include Plezi::ControllerMagic;
|
259
|
+
controller.instance_exec(container) {|r| include Plezi::ControllerMagic; }
|
281
260
|
ret = Class.new(controller) do
|
282
|
-
|
283
|
-
def name
|
284
|
-
new_class_name
|
285
|
-
end
|
286
|
-
|
287
|
-
def initialize request, response, host_params
|
288
|
-
@request, @params, @flash, @host_params = request, request.params, response.flash, host_params
|
289
|
-
@response = response
|
290
|
-
# @response["content-type"] ||= ::Plezi.default_content_type
|
291
|
-
|
292
|
-
@_accepts_broadcast = false
|
293
|
-
|
294
|
-
# create magical cookies
|
295
|
-
@cookies = request.cookies
|
296
|
-
@cookies.set_controller self
|
297
|
-
|
298
|
-
super()
|
299
|
-
end
|
300
|
-
|
301
|
-
# WebSockets.
|
302
|
-
#
|
303
|
-
# this method handles the protocol and handler transition between the HTTP connection
|
304
|
-
# (with a protocol instance of HTTPProtocol and a handler instance of HTTPRouter)
|
305
|
-
# and the WebSockets connection
|
306
|
-
# (with a protocol instance of WSProtocol and an instance of the Controller class set as a handler)
|
307
|
-
def pre_connect
|
308
|
-
# make sure this is a websocket controller
|
309
|
-
return false unless self.class.public_instance_methods.include?(:on_message)
|
310
|
-
# call the controller's original method, if exists, and check connection.
|
311
|
-
return false if (defined?(super) && !super)
|
312
|
-
# finish if the response was sent
|
313
|
-
return true if response.headers_sent?
|
314
|
-
# complete handshake
|
315
|
-
return false unless WSProtocol.new( request.service, request.service.params).http_handshake request, response, self
|
316
|
-
# set up controller as WebSocket handler
|
317
|
-
@response = WSResponse.new request
|
318
|
-
# create the redis connection (in case this in the first instance of this class)
|
319
|
-
self.class.redis_connection
|
320
|
-
# set broadcasts and return true
|
321
|
-
@_accepts_broadcast = true
|
322
|
-
end
|
323
|
-
|
324
|
-
|
325
|
-
# WebSockets.
|
326
|
-
#
|
327
|
-
# stops broadcasts from being called on closed sockets that havn't been collected by the garbage collector.
|
328
|
-
def on_disconnect
|
329
|
-
@_accepts_broadcast = false
|
330
|
-
super if defined? super
|
331
|
-
end
|
332
|
-
|
333
|
-
# Inner Routing
|
334
|
-
#
|
335
|
-
#
|
336
|
-
def _route_path_to_methods_and_set_the_response_
|
337
|
-
#run :before filter
|
338
|
-
return false if self.class.available_routing_methods.include?(:before) && self.before == false
|
339
|
-
#check request is valid and call requested method
|
340
|
-
ret = requested_method
|
341
|
-
return false unless self.class.available_routing_methods.include?(ret)
|
342
|
-
return false unless (ret = self.method(ret).call)
|
343
|
-
#run :after filter
|
344
|
-
return false if self.class.available_routing_methods.include?(:after) && self.after == false
|
345
|
-
# review returned type for adding String to response
|
346
|
-
if ret.is_a?(String)
|
347
|
-
response << ret
|
348
|
-
response['content-length'] = ret.bytesize if response.body.empty? && !response.headers_sent?
|
349
|
-
end
|
350
|
-
return true
|
351
|
-
end
|
352
|
-
# a callback that resets the class router whenever a method (a potential route) is added
|
353
|
-
def self.method_added(id)
|
354
|
-
reset_routing_cache
|
355
|
-
end
|
356
|
-
# a callback that resets the class router whenever a method (a potential route) is removed
|
357
|
-
def self.method_removed(id)
|
358
|
-
reset_routing_cache
|
359
|
-
end
|
360
|
-
# a callback that resets the class router whenever a method (a potential route) is undefined (using #undef_method).
|
361
|
-
def self.method_undefined(id)
|
362
|
-
reset_routing_cache
|
363
|
-
end
|
364
|
-
|
365
|
-
# # lists the available methods that will be exposed to HTTP requests
|
366
|
-
# def self.available_public_methods
|
367
|
-
# # set class global to improve performance while checking for supported methods
|
368
|
-
# @@___available_public_methods___ ||= available_routing_methods - [:before, :after, :save, :show, :update, :delete, :initialize, :on_message, :pre_connect, :on_connect, :on_disconnect]
|
369
|
-
# end
|
370
|
-
|
371
|
-
# # lists the available methods that will be exposed to the HTTP router
|
372
|
-
# def self.available_routing_methods
|
373
|
-
# # set class global to improve performance while checking for supported methods
|
374
|
-
# @@___available_routing_methods___ ||= (((public_instance_methods - Object.public_instance_methods) - Plezi::ControllerMagic::InstanceMethods.instance_methods).delete_if {|m| m.to_s[0] == '_'})
|
375
|
-
# end
|
376
|
-
|
377
|
-
# # resets this controller's router, to allow for dynamic changes
|
378
|
-
# def self.reset_routing_cache
|
379
|
-
# @@___available_routing_methods___ = @@___available_public_methods___ = nil
|
380
|
-
# available_routing_methods
|
381
|
-
# available_public_methods
|
382
|
-
# end
|
383
|
-
|
384
|
-
|
385
|
-
# # reviews the Redis connection, sets it up if it's missing and returns the Redis connection.
|
386
|
-
# #
|
387
|
-
# # todo: review thread status? (incase an exception killed it)
|
388
|
-
# def self.redis_connection
|
389
|
-
# return false unless defined?(Redis) && ENV['PL_REDIS_URL']
|
390
|
-
# return @@redis if defined?(@@redis_sub_thread) && @@redis
|
391
|
-
# @@redis_uri ||= URI.parse(ENV['PL_REDIS_URL'])
|
392
|
-
# @@redis ||= Redis.new(host: @@redis_uri.host, port: @@redis_uri.port, password: @@redis_uri.password)
|
393
|
-
# @@redis_sub_thread = Thread.new do
|
394
|
-
# begin
|
395
|
-
# Redis.new(host: @@redis_uri.host, port: @@redis_uri.port, password: @@redis_uri.password).subscribe(redis_channel_name) do |on|
|
396
|
-
# on.message do |channel, msg|
|
397
|
-
# args = JSON.parse(msg)
|
398
|
-
# params = args.shift
|
399
|
-
# __inner_process_broadcast params['_pl_ignore_object'], params['_pl_method_broadcasted'].to_sym, args
|
400
|
-
# end
|
401
|
-
# end
|
402
|
-
# rescue Exception => e
|
403
|
-
# Plezi.error e
|
404
|
-
# retry
|
405
|
-
# end
|
406
|
-
# end
|
407
|
-
# raise "Redis connction failed for: #{ENV['PL_REDIS_URL']}" unless @@redis
|
408
|
-
# @@redis
|
409
|
-
# end
|
410
|
-
|
411
|
-
# # returns a Redis channel name for this controller.
|
412
|
-
# def self.redis_channel_name
|
413
|
-
# self.name.to_s
|
414
|
-
# end
|
415
|
-
|
416
|
-
# # broadcasts messages (methods) for this process
|
417
|
-
# def self.__inner_process_broadcast ignore, method_name, args, &block
|
418
|
-
# ObjectSpace.each_object(self) { |controller| Plezi.callback controller, method_name, *args, &block if controller.accepts_broadcast? && (!ignore || controller.uuid != ignore) }
|
419
|
-
# end
|
420
|
-
|
421
|
-
# # broadcasts messages (methods) between all processes (using Redis).
|
422
|
-
# def self.__inner_redis_broadcast ignore, method_name, args, &block
|
423
|
-
# return false unless redis_connection
|
424
|
-
# raise "Radis broadcasts cannot accept blocks (no inter-process callbacks of memory sharing)!" if block
|
425
|
-
# # raise "Radis broadcasts accept only one paramater, which is an optional Hash (no inter-process memory sharing)" if args.length > 1 || (args[0] && !args[0].is_a?(Hash))
|
426
|
-
# args.unshift ({_pl_method_broadcasted: method_name, _pl_ignore_object: ignore})
|
427
|
-
# redis_connection.publish(redis_channel_name, args.to_json )
|
428
|
-
# true
|
429
|
-
# end
|
430
|
-
|
261
|
+
include Plezi::Base::ControllerCore
|
431
262
|
end
|
432
263
|
Object.const_set(new_class_name, ret)
|
433
264
|
Module.const_get(new_class_name).reset_routing_cache
|