plezi 0.12.22 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/LICENSE.txt +17 -18
- data/README.md +54 -698
- data/Rakefile +7 -4
- data/bin/config.ru +22 -0
- data/{test → bin}/console +4 -6
- data/bin/hello_world +52 -0
- data/bin/setup +8 -0
- data/exe/plezi +145 -0
- data/lib/plezi.rb +24 -137
- data/lib/plezi/activation.rb +28 -0
- data/lib/plezi/api.rb +62 -0
- data/lib/plezi/controller/controller.rb +259 -0
- data/lib/plezi/controller/controller_class.rb +176 -0
- data/lib/plezi/controller/cookies.rb +40 -0
- data/lib/plezi/helpers.rb +60 -0
- data/lib/plezi/rake.rb +2 -24
- data/lib/plezi/render/erb.rb +34 -0
- data/lib/plezi/render/has_cache.rb +36 -0
- data/lib/plezi/render/markdown.rb +63 -0
- data/lib/plezi/render/render.rb +49 -0
- data/lib/plezi/render/sass.rb +55 -0
- data/lib/plezi/render/slim.rb +33 -0
- data/lib/plezi/router/adclient.rb +23 -0
- data/lib/plezi/router/assets.rb +67 -0
- data/lib/plezi/router/errors.rb +29 -0
- data/lib/plezi/router/route.rb +112 -0
- data/lib/plezi/router/router.rb +120 -0
- data/lib/plezi/version.rb +1 -1
- data/lib/plezi/websockets/message_dispatch.rb +91 -0
- data/lib/plezi/websockets/redis.rb +55 -0
- data/plezi.gemspec +25 -16
- data/resources/404.erb +5 -4
- data/resources/500.erb +5 -4
- data/resources/{500.html → 503.html} +8 -9
- data/resources/client.js +253 -0
- data/resources/config.ru +5 -36
- data/resources/ctrlr.rb +34 -0
- data/resources/gemfile +4 -0
- data/resources/mini_app.rb +28 -82
- data/resources/mini_exec +7 -0
- data/resources/mini_welcome_page.html +0 -0
- data/resources/procfile +3 -0
- data/resources/rakefile +4 -8
- data/resources/routes.rb +9 -26
- data/resources/{websockets.js → simple-client.js} +3 -3
- metadata +60 -85
- data/bin/plezi +0 -104
- data/docs/async_helpers.md +0 -245
- data/docs/controllers.md +0 -27
- data/docs/logging.md +0 -49
- data/docs/routes.md +0 -209
- data/docs/websockets.md +0 -213
- data/lib/plezi/builders/ac_model.rb +0 -59
- data/lib/plezi/builders/app_builder.rb +0 -137
- data/lib/plezi/builders/builder.rb +0 -43
- data/lib/plezi/builders/form_builder.rb +0 -27
- data/lib/plezi/common/api.rb +0 -92
- data/lib/plezi/common/cache.rb +0 -122
- data/lib/plezi/common/defer.rb +0 -21
- data/lib/plezi/common/dsl.rb +0 -94
- data/lib/plezi/common/redis.rb +0 -65
- data/lib/plezi/common/renderer.rb +0 -141
- data/lib/plezi/common/settings.rb +0 -52
- data/lib/plezi/handlers/controller_core.rb +0 -106
- data/lib/plezi/handlers/controller_magic.rb +0 -284
- data/lib/plezi/handlers/http_router.rb +0 -205
- data/lib/plezi/handlers/placebo.rb +0 -112
- data/lib/plezi/handlers/route.rb +0 -216
- data/lib/plezi/handlers/session.rb +0 -109
- data/lib/plezi/handlers/stubs.rb +0 -156
- data/lib/plezi/handlers/ws_identity.rb +0 -253
- data/lib/plezi/handlers/ws_object.rb +0 -308
- data/lib/plezi/helpers/http_sender.rb +0 -84
- data/lib/plezi/helpers/magic_helpers.rb +0 -104
- data/lib/plezi/helpers/mime_types.rb +0 -1995
- data/lib/plezi/oauth.rb +0 -5
- data/lib/plezi/oauth/auth_controller.rb +0 -229
- data/logo/dark.png +0 -0
- data/logo/light.png +0 -0
- data/logo/sign.png +0 -0
- data/resources/404.haml +0 -121
- data/resources/404.html +0 -124
- data/resources/404.slim +0 -120
- data/resources/500.haml +0 -120
- data/resources/500.slim +0 -120
- data/resources/Gemfile +0 -86
- data/resources/code.rb +0 -8
- data/resources/controller.rb +0 -142
- data/resources/database.yml +0 -33
- data/resources/db_ac_config.rb +0 -59
- data/resources/db_dm_config.rb +0 -51
- data/resources/db_sequel_config.rb +0 -33
- data/resources/en.yml +0 -204
- data/resources/haml_config.rb +0 -6
- data/resources/i18n_config.rb +0 -14
- data/resources/initialize.rb +0 -49
- data/resources/mini_exec.rb +0 -7
- data/resources/oauth_config.rb +0 -24
- data/resources/plezi_client.js +0 -198
- data/resources/plezi_websockets.html +0 -47
- data/resources/redis_config.rb +0 -42
- data/resources/slim_config.rb +0 -11
- data/resources/welcome_page.html +0 -272
- data/test/dispatch +0 -58
- data/test/hello_world +0 -13
- data/test/plezi_tests.rb +0 -581
data/lib/plezi/common/defer.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
|
2
|
-
module Plezi
|
3
|
-
|
4
|
-
module_function
|
5
|
-
|
6
|
-
# Defers any missing methods to the Iodine Library.
|
7
|
-
def method_missing name, *args, &block
|
8
|
-
return super unless REACTOR_METHODS.include? name
|
9
|
-
::Iodine.__send__ name, *args, &block
|
10
|
-
end
|
11
|
-
# Defers any missing methods to the Iodine Library.
|
12
|
-
def respond_to_missing?(name, include_private = false)
|
13
|
-
REACTOR_METHODS.include?(name) || super
|
14
|
-
end
|
15
|
-
|
16
|
-
protected
|
17
|
-
|
18
|
-
REACTOR_METHODS = ::Iodine.public_methods(false)
|
19
|
-
|
20
|
-
end
|
21
|
-
|
data/lib/plezi/common/dsl.rb
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
unless defined? PLEZI_NON_DSL
|
2
|
-
|
3
|
-
# shortcut for Plezi.listen. Deprecated.
|
4
|
-
#
|
5
|
-
def listen(params = {})
|
6
|
-
Plezi.listen params
|
7
|
-
end
|
8
|
-
|
9
|
-
# adds a virtul host or switches to an existing host, for routes setup or parameters update.
|
10
|
-
#
|
11
|
-
# accepts:
|
12
|
-
# host_name: a String with the full host name (i.e. "www.google.com" / "mail.google.com")
|
13
|
-
# params:: any of the parameters accepted by the {Plezi.host} command.
|
14
|
-
#
|
15
|
-
# If no host is specified or host name is `false`, the default host would be set as the active host and returned.
|
16
|
-
def host(host_name = false, params = {})
|
17
|
-
Plezi.host host_name, params
|
18
|
-
end
|
19
|
-
|
20
|
-
# adds a route to the last (or default) host
|
21
|
-
#
|
22
|
-
# path:: the path for the route
|
23
|
-
# controller:: The controller class which will accept the route.
|
24
|
-
#
|
25
|
-
# `path` parameters has a few options:
|
26
|
-
#
|
27
|
-
# * `path` can be a Regexp object, forcing the all the logic into controller (typically using the before method).
|
28
|
-
#
|
29
|
-
# * simple String paths are assumed to be basic RESTful paths:
|
30
|
-
#
|
31
|
-
# route "/users", Controller => route "/users/(:id)", Controller
|
32
|
-
#
|
33
|
-
# * routes can define their own parameters, for their own logic:
|
34
|
-
#
|
35
|
-
# route "/path/:required_paramater/:required_paramater{with_format}/(:optional_paramater)/(:optional){with_format}"
|
36
|
-
#
|
37
|
-
# * routes can define optional or required routes with regular expressions in them:
|
38
|
-
#
|
39
|
-
# route "(:locale){en|ru}/path"
|
40
|
-
#
|
41
|
-
# * routes which use the special '/' charecter within a parameter's format, must escape this charecter using the '\' charecter. **Notice the single quotes** in the following example:
|
42
|
-
#
|
43
|
-
# route '(:math){[\d\+\-\*\^\%\.\/]}'
|
44
|
-
#
|
45
|
-
# * or, with double quotes:
|
46
|
-
#
|
47
|
-
# route "(:math){[\\d\\+\\-\\*\\^\\%\\.\\/]}"
|
48
|
-
#
|
49
|
-
# magic routes make for difficult debugging - the smarter the routes, the more difficult the debugging.
|
50
|
-
# use with care and avoid complex routes when possible. RESTful routes are recommended when possible.
|
51
|
-
# JSON serving apps are advised to use required parameters and empty sections indicating missing required parameters (i.e. /path///foo/bar///).
|
52
|
-
#
|
53
|
-
def route(path, controller = nil, &block)
|
54
|
-
Plezi.route(path, controller, &block)
|
55
|
-
end
|
56
|
-
|
57
|
-
# adds a route to the all the existing servers and hosts.
|
58
|
-
#
|
59
|
-
# accepts same options as route.
|
60
|
-
def shared_route(path, controller = nil, &block)
|
61
|
-
Plezi.shared_route(path, controller, &block)
|
62
|
-
end
|
63
|
-
|
64
|
-
# defines a method with a special name, such as "humens.txt".
|
65
|
-
#
|
66
|
-
# this could be used in controller classes, to define special routes which might defy
|
67
|
-
# normal Ruby naming conventions, such as "/welcome-home", "/play!", etc'
|
68
|
-
#
|
69
|
-
# could also be used to define methods with special formatting, such as "humans.txt",
|
70
|
-
# until a more refined way to deal with formatting will be implemented.
|
71
|
-
def def_special_method name, obj=self, &block
|
72
|
-
obj.instance_exec { define_method name.to_s.to_sym, &block }
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
# sets information to be used when restarting
|
77
|
-
$PL_SCRIPT = $0
|
78
|
-
$PL_ARGV = $*.dup
|
79
|
-
|
80
|
-
# restarts the Plezi app with the same arguments as when it was started.
|
81
|
-
#
|
82
|
-
# EXPERIMENTAL
|
83
|
-
def restart_plezi_app
|
84
|
-
exec "/usr/bin/env ruby #{$PL_SCRIPT} #{$PL_ARGV.join ' '}"
|
85
|
-
end
|
86
|
-
|
87
|
-
# sets to start the services once dsl script is finished loading.
|
88
|
-
at_exit do
|
89
|
-
undef listen
|
90
|
-
undef host
|
91
|
-
undef route
|
92
|
-
undef shared_route
|
93
|
-
end
|
94
|
-
end
|
data/lib/plezi/common/redis.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
|
2
|
-
module Plezi
|
3
|
-
|
4
|
-
module Base
|
5
|
-
module AutoRedis
|
6
|
-
@redis_locker ||= Mutex.new
|
7
|
-
@redis = @redis_sub_thread = nil
|
8
|
-
module_function
|
9
|
-
def inner_init_redis
|
10
|
-
return false unless ENV['PL_REDIS_URL'] && defined?(::Redis)
|
11
|
-
@redis_locker.synchronize do
|
12
|
-
return @redis if (@redis_sub_thread && @redis_sub_thread.alive?) && @redis # repeat the test once syncing is done.
|
13
|
-
@redis.quit if @redis
|
14
|
-
@redis = ::Redis.new(url: ENV['PL_REDIS_URL'])
|
15
|
-
raise "Redis connction failed for: #{ENV['PL_REDIS_URL']}" unless @redis
|
16
|
-
@redis_sub_thread = Thread.new do
|
17
|
-
begin
|
18
|
-
::Redis.new(url: ENV['PL_REDIS_URL']).subscribe(Plezi::Settings.redis_channel_name, Plezi::Settings.uuid) do |on|
|
19
|
-
on.message do |channel, msg|
|
20
|
-
::Plezi::Base::WSObject.forward_message ::Plezi::Base::WSObject.translate_message(msg)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
rescue => e
|
24
|
-
Iodine.error e
|
25
|
-
retry
|
26
|
-
end
|
27
|
-
end
|
28
|
-
@redis
|
29
|
-
end
|
30
|
-
end
|
31
|
-
def get_redis
|
32
|
-
return @redis if (@redis_sub_thread && @redis_sub_thread.alive?) && @redis
|
33
|
-
inner_init_redis
|
34
|
-
end
|
35
|
-
def away? server
|
36
|
-
return true unless get_redis
|
37
|
-
@redis.pubsub('CHANNELS', server).empty?
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
module_function
|
43
|
-
|
44
|
-
# Reviews the Redis connection, sets it up if it's missing and returns the Redis connection.
|
45
|
-
#
|
46
|
-
# A Redis connection will be automatically created if the `ENV['PL_REDIS_URL']` is set.
|
47
|
-
# for example:
|
48
|
-
# ENV['PL_REDIS_URL'] = ENV['REDISCLOUD_URL']`
|
49
|
-
# or
|
50
|
-
# ENV['PL_REDIS_URL'] = "redis://:password@my.host:6379/0"
|
51
|
-
#
|
52
|
-
# Accepts an optional block that will receive the Redis connection object. i.e.
|
53
|
-
#
|
54
|
-
# Plezi.redis {|r| r.connected? }
|
55
|
-
#
|
56
|
-
# Returns the Redis object or the block's returned value (if a block is provided).
|
57
|
-
def redis
|
58
|
-
if r = Plezi::Base::AutoRedis.get_redis
|
59
|
-
return (block_given? ? yield(r) : r)
|
60
|
-
end
|
61
|
-
false
|
62
|
-
end
|
63
|
-
alias :redis_connection :redis
|
64
|
-
end
|
65
|
-
|
@@ -1,141 +0,0 @@
|
|
1
|
-
module Plezi
|
2
|
-
module Base
|
3
|
-
|
4
|
-
class ExtentionManager
|
5
|
-
def initialize
|
6
|
-
@render_library = {}
|
7
|
-
@locker = Mutex.new
|
8
|
-
end
|
9
|
-
# Registers a rendering extention.
|
10
|
-
#
|
11
|
-
# Slim, Haml and ERB are registered by default.
|
12
|
-
#
|
13
|
-
# extention:: a Symbol or String representing the extention of the file to be rendered. i.e. 'slim', 'md', 'erb', etc'
|
14
|
-
# handler :: a Proc or other object that answers to call(filename, context, &block) and returnes the rendered string. The block accepted by the handler is for chaining rendered actions (allowing for `yield` within templates) and the context is the object within which the rendering should be performed (if `binding` handling is supported by the engine).
|
15
|
-
#
|
16
|
-
# If a block is passed to the `register_hook` method with no handler defined, it will act as the handler.
|
17
|
-
def register extention, handler = nil, &block
|
18
|
-
handler ||= block
|
19
|
-
raise "Handler or block required." unless handler
|
20
|
-
@locker.synchronize { @render_library[extention.to_s] = handler }
|
21
|
-
handler
|
22
|
-
end
|
23
|
-
def review extention
|
24
|
-
@locker.synchronize { @render_library[extention.to_s] }
|
25
|
-
end
|
26
|
-
# Removes a registered render extention
|
27
|
-
def remove extention
|
28
|
-
@locker.synchronize { @render_library.delete extention.to_s }
|
29
|
-
end
|
30
|
-
def each &block
|
31
|
-
block_given? ? @render_library.each(&block) : @render_library.each
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
def render base_filename, context = ( Object.new.instance_eval { binding } ), &block
|
36
|
-
@render_library.each {|ext, handler| f = "#{base_filename}.#{ext}".freeze ; return handler.call(f, context, &block) if File.exist?(f) }
|
37
|
-
false
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
module SASSExt
|
43
|
-
module_function
|
44
|
-
SASS_OPTIONS = { style: (ENV['SASS_STYLE'] || ((ENV['ENV'] || ENV['RACK_ENV']) == 'production' ? :compressed : :nested )) }
|
45
|
-
|
46
|
-
def call filename, context, &block
|
47
|
-
return false unless defined? ::Sass
|
48
|
-
SASS_OPTIONS[:cache_store] ||= Sass::CacheStores::Memory.new
|
49
|
-
# review mtime and render sass if necessary
|
50
|
-
if refresh_sass?(filename)
|
51
|
-
eng = Sass::Engine.for_file(filename, SASS_OPTIONS)
|
52
|
-
Plezi.cache_data filename, eng.dependencies
|
53
|
-
css, map = eng.render_with_sourcemap("#{File.basename(filename, '.*'.freeze)}.map".freeze)
|
54
|
-
Plezi.cache_data filename.sub(/\.s[ac]ss$/, '.map'.freeze), map.to_json( css_uri: File.basename(filename, '.*'.freeze) )
|
55
|
-
Plezi.cache_data "#{filename}.css", css
|
56
|
-
return css
|
57
|
-
end
|
58
|
-
Plezi.get_cached("#{filename}.css")
|
59
|
-
end
|
60
|
-
|
61
|
-
def refresh_sass? sass
|
62
|
-
return true if Plezi.cache_needs_update?(sass)
|
63
|
-
# return false unless Plezi.allow_cache_update? # no meaningful performance boost.
|
64
|
-
mt = Plezi.file_mtime(sass)
|
65
|
-
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])
|
66
|
-
false
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# asset rendering extentions.
|
72
|
-
module AssetManager
|
73
|
-
@render_library = {}
|
74
|
-
@locker = Mutex.new
|
75
|
-
|
76
|
-
module_function
|
77
|
-
# Registers a rendering extention for a specific asset type (js, css, etc').
|
78
|
-
#
|
79
|
-
# type:: the type of
|
80
|
-
# extention:: a Symbol or String representing the extention of the file to be rendered. i.e. 'scss', 'sass', 'coffee', etc'
|
81
|
-
# handler :: a Proc or other object that answers to call(filename, context, &block) and returnes the rendered string. The block accepted by the handler is for chaining rendered actions (allowing for `yield` within templates) and the context is a Binding object which is offered to the rendering (if `binding` handling is supported by the engine).
|
82
|
-
#
|
83
|
-
# handlers are expected to manage caching for their data. The {Plezi::Cache} module is available for this task,
|
84
|
-
# but it should be noted that Plezi might cache data in that same system and conflicts might occure if the final filename isn't used for the caching (including the handler-type extention, i.e. 'coffee', slim' or 'erb').
|
85
|
-
#
|
86
|
-
# If a block is passed to the `register_hook` method with no handler defined, it will act as the handler.
|
87
|
-
def register type, extention, handler = nil, &block
|
88
|
-
raise "Type required." unless type
|
89
|
-
handler ||= block
|
90
|
-
raise "Handler or block required." unless handler
|
91
|
-
@locker.synchronize { (@render_library[type.to_s] ||= ::Plezi::Base::ExtentionManager.new).register extention, handler }
|
92
|
-
handler
|
93
|
-
end
|
94
|
-
# Removes a registered render extention
|
95
|
-
def remove type, extention
|
96
|
-
@locker.synchronize { (@render_library[type.to_s] ||= ::Plezi::Base::ExtentionManager.new).remove extention.to_s }
|
97
|
-
end
|
98
|
-
# returns an array with all the registered extentions
|
99
|
-
def all_extentions
|
100
|
-
out = []
|
101
|
-
@render_library.each {|t, l| l.each {|e, h| out << e } }
|
102
|
-
out.uniq!
|
103
|
-
out
|
104
|
-
end
|
105
|
-
|
106
|
-
|
107
|
-
def render base_filename, context = ( Object.new.instance_eval { binding } ), &block
|
108
|
-
handlers = @render_library[File.extname(base_filename)[1..-1]]
|
109
|
-
handlers.each {|ext, handler| f = "#{base_filename}.#{ext}".freeze ; return handler.call(f, context, &block) if File.exists?(f) } if handlers
|
110
|
-
false
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
# Render Managment
|
115
|
-
Renderer = ::Plezi::Base::ExtentionManager.new
|
116
|
-
|
117
|
-
Renderer.register :erb do |filename, context, &block|
|
118
|
-
next unless defined? ::ERB
|
119
|
-
( Plezi.cache_needs_update?(filename) ? Plezi.cache_data( filename, ( ERB.new( Plezi::Base::Helpers.try_utf8! IO.binread(filename) ) ) ) : (Plezi.get_cached filename) ).result((context) , &block)
|
120
|
-
end
|
121
|
-
Renderer.register :slim do |filename, context, &block|
|
122
|
-
next unless defined? ::Slim
|
123
|
-
( Plezi.cache_needs_update?(filename) ? Plezi.cache_data( filename, ( Slim::Template.new() { Plezi::Base::Helpers.try_utf8! IO.binread(filename) } ) ) : (Plezi.get_cached filename) ).render(context.receiver, &block)
|
124
|
-
end
|
125
|
-
Renderer.register :haml do |filename, context, &block|
|
126
|
-
next unless defined? ::Haml
|
127
|
-
( Plezi.cache_needs_update?(filename) ? Plezi.cache_data( filename, ( Haml::Engine.new( Plezi::Base::Helpers.try_utf8! IO.binread(filename) ) ) ) : (Plezi.get_cached filename) ).render(context.receiver, &block)
|
128
|
-
end
|
129
|
-
|
130
|
-
# JavaScript asset rendering
|
131
|
-
AssetManager.register :js, :erb, Renderer.review(:erb)
|
132
|
-
AssetManager.register :js, :coffee do |filename, context, &block|
|
133
|
-
next unless defined? ::CoffeeScript
|
134
|
-
( Plezi.cache_needs_update?(filename) ? Plezi.cache_data( filename, CoffeeScript.compile(Plezi::Base::Helpers.try_utf8!(IO.binread(filename))) ) : (Plezi.get_cached filename) )
|
135
|
-
end
|
136
|
-
|
137
|
-
# CSS asset rendering
|
138
|
-
AssetManager.register :css, :erb, Renderer.review(:erb)
|
139
|
-
AssetManager.register :css, :scss, ::Plezi::Base::SASSExt
|
140
|
-
AssetManager.register :css, :sass, ::Plezi::Base::SASSExt
|
141
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
|
2
|
-
module Plezi
|
3
|
-
|
4
|
-
# This module allows you to set some of the Plezi framework's settings.
|
5
|
-
module Settings
|
6
|
-
|
7
|
-
module_function
|
8
|
-
|
9
|
-
# Sets the Redis Channel Name.
|
10
|
-
def redis_channel_name=val
|
11
|
-
return false unless defined? Redis
|
12
|
-
raise "Can't change channel name after Redis subscription had been initiated." if @redis
|
13
|
-
@redis_channel_name = val
|
14
|
-
end
|
15
|
-
# Returns the Redis Channel Name used by this app.
|
16
|
-
# @return [String]
|
17
|
-
def redis_channel_name
|
18
|
-
@redis_channel_name ||= "#{File.basename($0, '.*')}_redis_channel"
|
19
|
-
end
|
20
|
-
|
21
|
-
# Sets the message byte size limit for a Websocket message. Defaults to 0 (no limit)
|
22
|
-
#
|
23
|
-
# Although memory will be allocated for the latest TCP/IP frame,
|
24
|
-
# this allows the websocket to disconnect if the incoming expected message size exceeds the allowed maximum size.
|
25
|
-
#
|
26
|
-
# If the sessage size limit is exceeded, the disconnection will be immidiate as an attack will be assumed. The protocol's normal disconnect sequesnce will be discarded.
|
27
|
-
def ws_message_size_limit=val
|
28
|
-
Iodine::Http::Websockets.message_size_limit = val
|
29
|
-
end
|
30
|
-
# Gets the message byte size limit for a Websocket message. Defaults to 0 (no limit)
|
31
|
-
def ws_message_size_limit
|
32
|
-
Iodine::Http::Websockets.message_size_limit
|
33
|
-
end
|
34
|
-
|
35
|
-
# This Server's UUID, for Redis and unicasting identification.
|
36
|
-
def uuid
|
37
|
-
@uuid ||= SecureRandom.uuid
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
# # # The following was discarded because benchmarks show the difference is negligible
|
42
|
-
# # Get the cache refresh directive for the {#cache_needs_update?} implementation. Defaults to ENV['ENV'] != 'production'
|
43
|
-
# def allow_cache_update?
|
44
|
-
# Plezi.allow_cache_update?
|
45
|
-
# end
|
46
|
-
# # Set the cache refresh directive for the {#cache_needs_update?} implementation. Defaults to ENV['ENV'] != 'production'
|
47
|
-
# def allow_cache_update= val
|
48
|
-
# Plezi.allow_cache_update = val
|
49
|
-
# end
|
50
|
-
# # **Update**: up until now, Plezi would allow refresh any cached assets ot templated when they are edited. This file review is usually a waste of resources after deployment, since the files never get updated in production environments. Plezi now supports a two new settings options: `Plezi.allow_cache_update?` and `Plezi.allow_cache_update=` which will dictate if file review should be performed after caching. The default is now set to AVOID file reviews for production environments (`ENV['ENV'] || ENV['RACK_ENV'] != 'production'`).
|
51
|
-
end
|
52
|
-
end
|
@@ -1,106 +0,0 @@
|
|
1
|
-
module Plezi
|
2
|
-
module Base
|
3
|
-
|
4
|
-
# the methods defined in this module will be injected into the Controller's Core class (inherited from the controller).
|
5
|
-
module ControllerCore
|
6
|
-
# @!parse include Plezi::Base::WSObject
|
7
|
-
# @!parse include InstanceMethods
|
8
|
-
# @!parse extend ClassMethods
|
9
|
-
|
10
|
-
def self.included base
|
11
|
-
base.send :include, Plezi::Base::WSObject
|
12
|
-
base.send :include, InstanceMethods
|
13
|
-
base.extend ClassMethods
|
14
|
-
end
|
15
|
-
|
16
|
-
module InstanceMethods
|
17
|
-
public
|
18
|
-
|
19
|
-
def initialize request, response
|
20
|
-
@request = request
|
21
|
-
@params = request.params
|
22
|
-
@flash = response.flash
|
23
|
-
@host_params = request[:host_settings]
|
24
|
-
@response = response
|
25
|
-
@cookies = request.cookies
|
26
|
-
# # \@response["content-type"] ||= ::Plezi.default_content_type
|
27
|
-
super()
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
# WebSockets.
|
32
|
-
#
|
33
|
-
# this method handles the protocol and handler transition between the HTTP connection
|
34
|
-
# (with a protocol instance of HTTPProtocol and a handler instance of HTTPRouter)
|
35
|
-
# and the WebSockets connection
|
36
|
-
# (with a protocol instance of WSProtocol and an instance of the Controller class set as a handler)
|
37
|
-
def pre_connect
|
38
|
-
# make sure this is a websocket controller
|
39
|
-
return false unless self.class.has_super_method?(:on_message) || self.class.superclass.instance_variable_get(:@auto_dispatch)
|
40
|
-
# call the controller's original method, if exists, and check connection.
|
41
|
-
return false if (defined?(super) && !super)
|
42
|
-
# finish if the response was sent
|
43
|
-
return false if response.headers_sent?
|
44
|
-
# make sure that the session object is available for websocket connections
|
45
|
-
session
|
46
|
-
# make sure that rendering uses JSON for websocket messages (unless already set)
|
47
|
-
params[:format] ||= 'json'
|
48
|
-
# complete handshake
|
49
|
-
return self
|
50
|
-
end
|
51
|
-
|
52
|
-
# Websockets
|
53
|
-
#
|
54
|
-
# this method either forwards the on_message handling to the `on_message` callback, OR
|
55
|
-
# auto-dispatches the messages by translating the JSON into a method call using the `event` keyword.
|
56
|
-
def on_message data
|
57
|
-
unless self.class.superclass.instance_variable_get(:@auto_dispatch)
|
58
|
-
return super if defined? super
|
59
|
-
return false
|
60
|
-
end
|
61
|
-
begin
|
62
|
-
data = JSON.parse data
|
63
|
-
return close unless data.is_a?(Hash)
|
64
|
-
rescue
|
65
|
-
return close
|
66
|
-
end
|
67
|
-
Plezi::Base::Helpers.make_hash_accept_symbols data
|
68
|
-
ret = nil
|
69
|
-
begin
|
70
|
-
if data['_EID_'.freeze]
|
71
|
-
write "{\"event\":\"_ack_\",\"_EID_\":#{data['_EID_'.freeze]}}"
|
72
|
-
end
|
73
|
-
if self.class.has_auto_dispatch_method?(data['event'.freeze] = data['event'.freeze].to_s.to_sym)
|
74
|
-
ret = self.__send__(data['event'.freeze], data)
|
75
|
-
else
|
76
|
-
ret = (self.class.has_super_method?(:unknown) && ( unknown(data) || true)) || (self.class.has_super_method?(:unknown_event) && Iodine.warn('Auto-Dispatch API updated: use `unknown` instead of `unknown_event`') && ( unknown_event(data) || true)) || ({ event: :err, status: 404, result: "not found", request: data }.to_json)
|
77
|
-
end
|
78
|
-
rescue ArgumentError => e
|
79
|
-
Iodine.error "Auto-Dispatch Error for event :#{data['event'.freeze]} - #{e.message}"
|
80
|
-
end
|
81
|
-
ret = ret.to_json if ret.is_a?(Hash)
|
82
|
-
write(ret) if ret.is_a?(String)
|
83
|
-
end
|
84
|
-
|
85
|
-
# Inner Routing
|
86
|
-
def _route_path_to_methods_and_set_the_response_
|
87
|
-
#run :before filter
|
88
|
-
return false if self.class.has_method?(:before) && self.before == false
|
89
|
-
#check request is valid and call requested method
|
90
|
-
ret = requested_method
|
91
|
-
return false unless ret
|
92
|
-
ret = self.__send__(ret)
|
93
|
-
return false unless ret
|
94
|
-
#run :after filter
|
95
|
-
return false if self.class.has_method?(:after) && self.after == false
|
96
|
-
# review returned type for adding String to response
|
97
|
-
return ret
|
98
|
-
end
|
99
|
-
|
100
|
-
end
|
101
|
-
|
102
|
-
module ClassMethods
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|