plezi 0.12.22 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/LICENSE.txt +17 -18
  4. data/README.md +54 -698
  5. data/Rakefile +7 -4
  6. data/bin/config.ru +22 -0
  7. data/{test → bin}/console +4 -6
  8. data/bin/hello_world +52 -0
  9. data/bin/setup +8 -0
  10. data/exe/plezi +145 -0
  11. data/lib/plezi.rb +24 -137
  12. data/lib/plezi/activation.rb +28 -0
  13. data/lib/plezi/api.rb +62 -0
  14. data/lib/plezi/controller/controller.rb +259 -0
  15. data/lib/plezi/controller/controller_class.rb +176 -0
  16. data/lib/plezi/controller/cookies.rb +40 -0
  17. data/lib/plezi/helpers.rb +60 -0
  18. data/lib/plezi/rake.rb +2 -24
  19. data/lib/plezi/render/erb.rb +34 -0
  20. data/lib/plezi/render/has_cache.rb +36 -0
  21. data/lib/plezi/render/markdown.rb +63 -0
  22. data/lib/plezi/render/render.rb +49 -0
  23. data/lib/plezi/render/sass.rb +55 -0
  24. data/lib/plezi/render/slim.rb +33 -0
  25. data/lib/plezi/router/adclient.rb +23 -0
  26. data/lib/plezi/router/assets.rb +67 -0
  27. data/lib/plezi/router/errors.rb +29 -0
  28. data/lib/plezi/router/route.rb +112 -0
  29. data/lib/plezi/router/router.rb +120 -0
  30. data/lib/plezi/version.rb +1 -1
  31. data/lib/plezi/websockets/message_dispatch.rb +91 -0
  32. data/lib/plezi/websockets/redis.rb +55 -0
  33. data/plezi.gemspec +25 -16
  34. data/resources/404.erb +5 -4
  35. data/resources/500.erb +5 -4
  36. data/resources/{500.html → 503.html} +8 -9
  37. data/resources/client.js +253 -0
  38. data/resources/config.ru +5 -36
  39. data/resources/ctrlr.rb +34 -0
  40. data/resources/gemfile +4 -0
  41. data/resources/mini_app.rb +28 -82
  42. data/resources/mini_exec +7 -0
  43. data/resources/mini_welcome_page.html +0 -0
  44. data/resources/procfile +3 -0
  45. data/resources/rakefile +4 -8
  46. data/resources/routes.rb +9 -26
  47. data/resources/{websockets.js → simple-client.js} +3 -3
  48. metadata +60 -85
  49. data/bin/plezi +0 -104
  50. data/docs/async_helpers.md +0 -245
  51. data/docs/controllers.md +0 -27
  52. data/docs/logging.md +0 -49
  53. data/docs/routes.md +0 -209
  54. data/docs/websockets.md +0 -213
  55. data/lib/plezi/builders/ac_model.rb +0 -59
  56. data/lib/plezi/builders/app_builder.rb +0 -137
  57. data/lib/plezi/builders/builder.rb +0 -43
  58. data/lib/plezi/builders/form_builder.rb +0 -27
  59. data/lib/plezi/common/api.rb +0 -92
  60. data/lib/plezi/common/cache.rb +0 -122
  61. data/lib/plezi/common/defer.rb +0 -21
  62. data/lib/plezi/common/dsl.rb +0 -94
  63. data/lib/plezi/common/redis.rb +0 -65
  64. data/lib/plezi/common/renderer.rb +0 -141
  65. data/lib/plezi/common/settings.rb +0 -52
  66. data/lib/plezi/handlers/controller_core.rb +0 -106
  67. data/lib/plezi/handlers/controller_magic.rb +0 -284
  68. data/lib/plezi/handlers/http_router.rb +0 -205
  69. data/lib/plezi/handlers/placebo.rb +0 -112
  70. data/lib/plezi/handlers/route.rb +0 -216
  71. data/lib/plezi/handlers/session.rb +0 -109
  72. data/lib/plezi/handlers/stubs.rb +0 -156
  73. data/lib/plezi/handlers/ws_identity.rb +0 -253
  74. data/lib/plezi/handlers/ws_object.rb +0 -308
  75. data/lib/plezi/helpers/http_sender.rb +0 -84
  76. data/lib/plezi/helpers/magic_helpers.rb +0 -104
  77. data/lib/plezi/helpers/mime_types.rb +0 -1995
  78. data/lib/plezi/oauth.rb +0 -5
  79. data/lib/plezi/oauth/auth_controller.rb +0 -229
  80. data/logo/dark.png +0 -0
  81. data/logo/light.png +0 -0
  82. data/logo/sign.png +0 -0
  83. data/resources/404.haml +0 -121
  84. data/resources/404.html +0 -124
  85. data/resources/404.slim +0 -120
  86. data/resources/500.haml +0 -120
  87. data/resources/500.slim +0 -120
  88. data/resources/Gemfile +0 -86
  89. data/resources/code.rb +0 -8
  90. data/resources/controller.rb +0 -142
  91. data/resources/database.yml +0 -33
  92. data/resources/db_ac_config.rb +0 -59
  93. data/resources/db_dm_config.rb +0 -51
  94. data/resources/db_sequel_config.rb +0 -33
  95. data/resources/en.yml +0 -204
  96. data/resources/haml_config.rb +0 -6
  97. data/resources/i18n_config.rb +0 -14
  98. data/resources/initialize.rb +0 -49
  99. data/resources/mini_exec.rb +0 -7
  100. data/resources/oauth_config.rb +0 -24
  101. data/resources/plezi_client.js +0 -198
  102. data/resources/plezi_websockets.html +0 -47
  103. data/resources/redis_config.rb +0 -42
  104. data/resources/slim_config.rb +0 -11
  105. data/resources/welcome_page.html +0 -272
  106. data/test/dispatch +0 -58
  107. data/test/hello_world +0 -13
  108. data/test/plezi_tests.rb +0 -581
data/resources/404.erb CHANGED
@@ -1,8 +1,9 @@
1
1
  <%
2
2
  # # consider replacing the Html with the following Ruby code:
3
- # response.redirect_to "/", notice: "Sory, we couldn't find #{request.original_path}", status: 404
3
+ # cookies[:notice] = "Sorry, we couldn't find #{request.original_path} - error code 404"
4
+ # response.redirect_to "/"
4
5
  # # OR
5
- # render :template, layout: :layout
6
+ # render("layout") { render("template") }
6
7
  %><!DOCTYPE html>
7
8
  <head>
8
9
  <style>
@@ -46,7 +47,7 @@
46
47
  }
47
48
  h3
48
49
  {
49
- font-family: 'Architects Daughter', cursive;
50
+ font-family: 'Architects Daughter', cursive;
50
51
  background-color: #44518E;
51
52
  color: #C6CCE7;
52
53
  text-align: left;
@@ -80,7 +81,7 @@
80
81
  {
81
82
  font-size: 1em;
82
83
  padding: 0 1em;
83
- margin: 0.5em 0;
84
+ margin: 0.5em 0;
84
85
  }
85
86
  a
86
87
  {
data/resources/500.erb CHANGED
@@ -1,8 +1,9 @@
1
1
  <%
2
2
  # # consider replacing the Html with the following Ruby code:
3
- # response.redirect_to "/", notice: "Internal error for #{request.original_path}", status: 500
3
+ # cookies[:notice] = "Internal error for #{request.original_path} - error code 500"
4
+ # response.redirect_to "/"
4
5
  # # OR
5
- # render :template, layout: :layout
6
+ # render("layout") { render("template") }
6
7
  %><!DOCTYPE html>
7
8
  <head>
8
9
  <style>
@@ -46,7 +47,7 @@
46
47
  }
47
48
  h3
48
49
  {
49
- font-family: 'Architects Daughter', cursive;
50
+ font-family: 'Architects Daughter', cursive;
50
51
  background-color: #44518E;
51
52
  color: #C6CCE7;
52
53
  text-align: left;
@@ -80,7 +81,7 @@
80
81
  {
81
82
  font-size: 1em;
82
83
  padding: 0 1em;
83
- margin: 0.5em 0;
84
+ margin: 0.5em 0;
84
85
  }
85
86
  a
86
87
  {
@@ -1,7 +1,6 @@
1
1
  <!DOCTYPE html>
2
2
  <head>
3
3
  <style>
4
- body, html
5
4
  /*
6
5
  med-blue: #44518E
7
6
  dark-gray: #424A70
@@ -42,7 +41,7 @@
42
41
  }
43
42
  h3
44
43
  {
45
- font-family: 'Architects Daughter', cursive;
44
+ font-family: 'Architects Daughter', cursive;
46
45
  background-color: #44518E;
47
46
  color: #C6CCE7;
48
47
  text-align: left;
@@ -76,7 +75,7 @@
76
75
  {
77
76
  font-size: 1em;
78
77
  padding: 0 1em;
79
- margin: 0.5em 0;
78
+ margin: 0.5em 0;
80
79
  }
81
80
  a
82
81
  {
@@ -114,12 +113,12 @@
114
113
  </style>
115
114
  </head>
116
115
  <body>
117
- <h1>Plezi 500 error code (broken?!)...</h1>
116
+ <h1>Our servers are busy, working at full capacity...</h1>
118
117
  <div id='wrapper'>
119
- <h2 id='missing'>
120
- something went wrong with your request...
121
- </h2>
122
- <p>Sorry, something went wrong trying to process your request...</p>
123
- <p>.... Please try again soon and if this issue persists, please let us know.</p>
118
+ <h2 id='missing'>
119
+ Please try again in a few minutes.
120
+ </h2>
121
+ <p>It seems our servers are all quite busy. This unexpected high load will probably be over soon...</p>
122
+ <p>... Please try again in a few minutes. If this issue persists, please let us know.</p>
124
123
  </div>
125
124
  </body>
@@ -0,0 +1,253 @@
1
+ // This is a commonly used structure for WebSocket messanging.
2
+ // The documentation is available on the www.plezi.io website:
3
+ // http://www.plezi.io/docs/websockets#websocket-json-auto-dispatch
4
+ //
5
+ // Basics:
6
+ // To open a websocket connection to the current location:
7
+ //
8
+ // var client = new PleziClient()
9
+ //
10
+ // To open a connection to a different path for the original server (SSL will be preserved when in use), use:
11
+ //
12
+ // var client = new PleziClient(PleziClient.origin + "/path")
13
+ //
14
+ // To automatically renew the connection when disconnections are reported by the browser, use:
15
+ //
16
+ // client.autoreconnect = true
17
+ // client.reconnect_interval = 250 // sets how long to wait before reconnection attempts. default is 250 ms.
18
+ //
19
+ // To set up event handling, directly set an `<event name>` callback. i.e., for an event called `chat`:
20
+ //
21
+ // client.chat = function(event) { "..." }
22
+ //
23
+ // To sent / emit event in JSON format, use the `emit` method:
24
+ //
25
+ // client.emit({event: "chat", data: "the message"})
26
+ //
27
+ function PleziClient(url, autoreconnect) {
28
+ // Set URL
29
+ if (url) {
30
+ this.url = url;
31
+ } else {
32
+ this.url = PleziClient.origin + self.location.pathname;
33
+ }
34
+ // Connect Websocket
35
+ this.reconnect();
36
+ // Setup AJAJ
37
+ this.ajaj = {};
38
+ this.ajaj.client = this;
39
+ this.ajaj.url = this.url.replace(/^ws:\/\//i, "http://").replace(/^wss:\/\//i, "https://");
40
+ this.ajaj.add = {};
41
+ this.ajaj.emit = this.___ajaj__emit;
42
+ this.ajaj.auto = false;
43
+ // auto-reconnection
44
+ this.autoreconnect = false;
45
+ this.reconnect_interval = 200;
46
+ // dump data to console?
47
+ this.log_events = false;
48
+ // the timeout for a message ack receipt
49
+ this.emit_timeout = false;
50
+ // Set the autoreconnect property
51
+ if (autoreconnect) {
52
+ this.autoreconnect = true;
53
+ }
54
+ }
55
+ // The Websocket onopen callback
56
+ PleziClient.prototype.___on_open = function(e) {
57
+ this.owner.connected = true;
58
+ if (this.owner.onopen) {
59
+ this.owner.onopen(e);
60
+ }
61
+ }
62
+ // The Websocket onclose callback
63
+ PleziClient.prototype.___on_close = function(e) {
64
+ this.owner.connected = false;
65
+ if (this.owner.onclose) {
66
+ this.owner.onclose(e);
67
+ }
68
+ if (this.owner.autoreconnect) {
69
+ setTimeout(function(obj) {
70
+ obj.reconnect();
71
+ }, this.owner.reconnect_interval, this.owner);
72
+ }
73
+ }
74
+ // The Websocket onerror callback
75
+ PleziClient.prototype.___on_error = function(e) {
76
+ if (this.owner.onerror) {
77
+ this.owner.onerror(e);
78
+ }
79
+ }
80
+ // The Websocket onmessage callback
81
+ PleziClient.prototype.___on_message = function(e) {
82
+ try {
83
+ var msg = JSON.parse(e.data);
84
+ this.owner.___dispatch(msg);
85
+ } catch (err) {
86
+ console.error("PleziClient experienced an error parsing the following data (not JSON):",
87
+ err, e);
88
+ }
89
+ }
90
+ PleziClient.prototype.___dispatch = function(msg) {
91
+ try {
92
+ if (this.log_events) {
93
+ console.log(msg);
94
+ }
95
+ if (msg.event == '_ack_') {
96
+ clearTimeout(msg._EID_);
97
+ if (this[msg._EID_] && this[msg._EID_].callback) {
98
+ this[msg._EID_].callback(this[msg._EID_].event, this);
99
+ }
100
+ delete this[msg._EID_];
101
+ }
102
+ if ((msg.event) && (this[msg.event])) {
103
+ this[msg.event](msg);
104
+ } else if ((msg.event) && (this['on' + msg.event])) {
105
+ console.warn('PleziClient: use a callback called "' + msg.event +
106
+ '" instead of of "on' + msg.event + '"');
107
+ this['on' + msg.event](msg);
108
+ } else {
109
+ if (this['unknown'] && (msg.event != '_ack_')) {
110
+ this['unknown'](msg);
111
+ };
112
+ }
113
+ } catch (err) {
114
+ console.error("PleziClient experienced an error while responding to the following onmessage event",
115
+ err, msg);
116
+ }
117
+ }
118
+
119
+ // Clears meta timeout data
120
+ PleziClient.prototype.___perform_timeout_callback = function(event, pl_client, callback) {
121
+ delete pl_client[event._EID_];
122
+ callback(event, pl_client);
123
+ }
124
+
125
+ // Sets a timeout for the websocket message
126
+ PleziClient.prototype.___set_failed_timeout = function(event, callback, timeout) {
127
+ if (event._EID_) {
128
+ return event;
129
+ };
130
+ if (!timeout) {
131
+ timeout = this.emit_timeout;
132
+ };
133
+ if (!callback) {
134
+ callback = this.___on_timeout;
135
+ };
136
+ if (!timeout) {
137
+ return event;
138
+ };
139
+ event._EID_ = setTimeout(this.___perform_timeout_callback, timeout, event, this, callback);
140
+ return event;
141
+ }
142
+ // Removes the _client_ property from the event and calls
143
+ // the ontimeout callback within the correct scope
144
+ PleziClient.prototype.___on_timeout = function(event, client) {
145
+ if (client.ajaj.auto) {
146
+ if (client.log_events) {
147
+ console.log("falling back on AJAJ for the event:", event);
148
+ }
149
+ client.ajaj.emit(event, client.ontimeout);
150
+ } else {
151
+ client.ontimeout(event);
152
+ }
153
+ }
154
+ // The timeout callback
155
+ PleziClient.prototype.ontimeout = function(event) {
156
+ console.warn("Timeout reached - it's assumed the connection was lost " +
157
+ "and the following event was ignored by the server:", event);
158
+ console.log(this);
159
+ }
160
+
161
+ PleziClient.prototype.reconnect = function() {
162
+ this.connected = NaN;
163
+ this.ws = new WebSocket(this.url);
164
+ // lets us access the client from the callbacks
165
+ this.ws.owner = this;
166
+ // The Websocket onopen callback
167
+ this.ws.onopen = this.___on_open;
168
+ // The Websocket onclose callback
169
+ this.ws.onclose = this.___on_close;
170
+ // The Websocket onerror callback
171
+ this.ws.onerror = this.___on_error;
172
+ // The Websocket onmessage callback
173
+ this.ws.onmessage = this.___on_message;
174
+ }
175
+
176
+ PleziClient.prototype.close = function() {
177
+ this.autoreconnect = false;
178
+ this.ws.close();
179
+ }
180
+
181
+ PleziClient.origin = (self.location.protocol.match(/https/) ? 'wws' : 'ws') + '://' + self.location.hostname + (self.location.port == '' ? '' : (':' + self.location.port));
182
+
183
+ PleziClient.prototype.sendraw = function(data) {
184
+ if (this.ws.readyState != 1) {
185
+ return false;
186
+ }
187
+ this.ws.send(data);
188
+ if (this.ws.readyState != 1) {
189
+ return false;
190
+ }
191
+ return true;
192
+ }
193
+
194
+ PleziClient.prototype.emit = function(event, callback, timeout_callback, timeout) {
195
+ if (!timeout && callback && !this.emit_timeout)
196
+ timeout = 10;
197
+ this.___set_failed_timeout(event, timeout_callback, timeout)
198
+ if (callback) {
199
+ this[event._EID_] = {
200
+ callback: callback,
201
+ event: event
202
+ };
203
+ }
204
+ return this.sendraw(JSON.stringify(event));
205
+ }
206
+
207
+ PleziClient.prototype.readyState = function() {
208
+ return this.ws.readyState;
209
+ }
210
+
211
+ PleziClient.prototype.___ajaj__emit = function(event, callback) {
212
+ var combined = {}
213
+ for (var k in this.add) {
214
+ combined[k] = this.add[k];
215
+ };
216
+ for (var k in event) {
217
+ combined[k] = event[k];
218
+ };
219
+ if (!combined.id) {
220
+ combined.id = event.event;
221
+ };
222
+ var req = new XMLHttpRequest();
223
+ req.client = this.client;
224
+ req.json = combined;
225
+ req.callback = callback;
226
+ // if(!req.callback) req.callback = this.failed
227
+ req.onreadystatechange = function() {
228
+ if (this.readyState != 4) {
229
+ return;
230
+ }
231
+ if (this.status == 200) {
232
+ try {
233
+ var res = JSON.parse(this.responseText);
234
+ this.client.___dispatch(res);
235
+ } catch (err) {
236
+ console.error("PleziClient experienced an error parsing the following data (not JSON):",
237
+ err, this.responseText);
238
+ }
239
+
240
+ } else {
241
+ if (this.callback) {
242
+ this.callback(this.json);
243
+ }
244
+ }
245
+ }
246
+ req.open("POST", this.url, true);
247
+ req.setRequestHeader("Content-type", "application/json");
248
+ try {
249
+ req.send(JSON.stringify(combined));
250
+ } catch (err) {
251
+ callback(event);
252
+ }
253
+ }
data/resources/config.ru CHANGED
@@ -1,39 +1,8 @@
1
- ########################
2
- # RackServer rack interface
3
- #
4
- # using Rack with Plezi poses some limitations...:
5
- #
6
- # 1. there is NO WebSockets support for Rack apps.
7
- #
8
- # 2. this might break any streaming / asynchronous methods calls, such as Iodine's Http streaming.
9
- #
10
- # 3. Plezi parameters and file uploads are different then Rack - HTML Form code might be incompatible!
11
- # This MIGHT BREAKE YOUR CODE! (changing this requires Plezi to re-parse the HTML, and costs in performance).
12
- #
13
- # also, all Plezi server specific configuration will be ignored.
14
- #
15
- # on the other hand, there is an upside:
16
- #
17
- # 1. you can choose a well tested server written in C that might (or might not) bring a performance boost.
18
- #
19
- # 2. you have better control over Middleware then you could have with Plezi.
20
- # ("wait", you might say, "there is no Middleware in Plezi!"... "Ahhh", I will answer, "so much to discover...")
21
- #
22
- #
23
- ##############
24
- #
25
- # For now, Rack mode is NOT supported unless using the Iodine Http server,
26
- # even than you're 404 not found pages will break unless using a catch-all route.
1
+ # Default Rack interface
27
2
 
28
- # load all framework and gems
29
- load ::File.expand_path(File.join("..", "environment.rb"), __FILE__)
3
+ # load the application
4
+ load ::File.expand_path(File.join('..', 'appname.rb'), __FILE__)
30
5
 
31
- # set up the routes
32
- load ::File.expand_path(File.join("..", "routes.rb"), __FILE__)
6
+ Iodine::Rack.public ||= './public'
33
7
 
34
- # start the plezi EM, to make sure that the plezi async code doesn't break.
35
- if Rack::Handler.default == Iodine::Http::Rack
36
- run(Proc.new { [404, {}, ["not found"]] })
37
- else
38
- raise "Unsupported Server - Plezi only runs using Iodine."
39
- end
8
+ run Plezi.app
@@ -0,0 +1,34 @@
1
+ # Replace this sample with real code.
2
+ class RootController
3
+ # HTTP
4
+ def index
5
+ # any String returned will be appended to the response. We return a String.
6
+ render 'welcome'
7
+ end
8
+
9
+ # Websockets
10
+ def on_message(data)
11
+ data = ERB::Util.html_escape data
12
+ print data
13
+ broadcast :print, data
14
+ end
15
+
16
+ def on_open
17
+ print 'Welcome to appname!'
18
+ @handle = params['id'.freeze] || 'Somebody'
19
+ broadcast :print, "#{ERB::Util.html_escape @handle} joind us :-)"
20
+ end
21
+
22
+ def on_close
23
+ broadcast :print, "#{@handle} left us :-("
24
+ end
25
+
26
+ protected
27
+
28
+ # write is inherites when a Websocket connection is opened.
29
+ #
30
+ # Inherited functions aren't exposed (for our security), so we need to wrap it.
31
+ def print(data)
32
+ write data
33
+ end
34
+ end
data/resources/gemfile ADDED
@@ -0,0 +1,4 @@
1
+
2
+ ## Redis servers are used to allow websocket scaling.
3
+ ## Plezi can be configured to automatically use Redis for easy scaling.
4
+ # gem 'redis'
@@ -1,87 +1,33 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  ## Set environment, working directory, load gems and create logs
4
- ENV['ENV'] ||= ENV['RACK_ENV'] # production ENV will render SASS as compressed.
5
- ## Using pathname extentions for setting public folder
6
- require 'pathname'
7
- ## Set up root object, it might be used by the environment and\or the plezi extension gems.
8
- Root ||= Pathname.new(File.dirname(__FILE__)).expand_path
9
- ## If this app is independant, use bundler to load gems (including the plezi gem).
10
- ## otherwise, use the original app's Gemfile and Plezi will automatically switch to Rack mode.
11
- require 'bundler'
12
- Bundler.require(:default, ENV['ENV'].to_s.to_sym)
13
-
14
- # # Optional code auto-loading and logging:
15
-
16
- # # Load code from a subfolder called 'app'?
17
- # Dir[File.join "{app}", "**" , "*.rb"].each {|file| load File.expand_path(file)}
18
-
19
- ## Log to a file?
20
- # Iodine.logger = Logger.new Root.join('server.log').to_s
4
+ ENV['ENV'] ||= ENV['RACK_ENV'] # production ENV will render SASS as compressed.
5
+ ## Using pathname extentions for setting public folder
6
+ require 'pathname'
7
+ ## Set up root object, it might be used by the environment and\or the plezi extension gems.
8
+ Root ||= Pathname.new(File.dirname(__FILE__)).expand_path
9
+ ## If this app is independant, use bundler to load gems (including the plezi gem).
10
+ ## otherwise, use the original app's Gemfile and Plezi will automatically switch to Rack mode.
11
+ require 'bundler'
12
+ Bundler.require(:default, ENV['ENV'].to_s.to_sym)
13
+
14
+ # Load all the code from a subfolder called 'app'
15
+ Dir[File.join '{app}', '**', '*.rb'].each { |file| load File.expand_path(file) }
16
+
17
+ ## Logging
18
+ Iodine::Rack.log = 1 if Iodine::Rack.log.nil?
21
19
 
22
20
  # # Optional Scaling (across processes or machines):
23
- ENV['PL_REDIS_URL'] ||= ENV['REDIS_URL'] ||
24
- ENV['REDISCLOUD_URL'] ||
25
- ENV['REDISTOGO_URL'] ||
26
- nil # "redis://:password@my.host:6389/0"
27
- # # redis channel name should be changed is using Placebo API
28
- # Plezi::Settings.redis_channel_name = 'appsecret'
29
-
30
- # # uncomment to set up forking for 3 more processes (total of 4).
31
- # Iodine.processes = 4
32
-
33
-
34
- # The basic appname controller, to get you started
35
- class MyController
36
- # HTTP
37
- def index
38
- # return response << "Hello World!" # for a hello world app
39
- render :welcome
40
- end
41
- # Websockets
42
- def on_message data
43
- data = ERB::Util.html_escape data
44
- print data
45
- broadcast :print, data
46
- end
47
- def on_open
48
- print 'Welcome!'
49
- @handle = params[:id] || 'Somebody'
50
- broadcast :print, "#{@handle} joind us :-)"
51
- end
52
- def on_close
53
- broadcast :print, "#{@handle} left us :-("
54
- end
55
-
56
- protected
57
-
58
- def print data
59
- response << data
60
- end
61
- end
62
-
63
-
64
- # change some of the default settings here.
65
- host templates: Root.join('templates').to_s,
66
- # public: Root.join('public').to_s,
67
- assets: Root.join('assets').to_s
68
-
69
- # # I18n re-write, i.e.: `/en/home` will be rewriten as `/home`, while setting params[:locale] to "en"
70
- # route "/:locale{#{I18n.available_locales.join "|"}}/*" , false if defined? I18n
71
-
72
- # # Response format re-write, i.e.: `/xml/home` will use .xml templates automatically
73
- # # with :locale a request might look like `/en/json/...`
74
- # route "/:format{html|json|xml}/*" , false
75
-
76
- # # OAuth2 - Facebook / Google authentication
77
- # ENV["FB_APP_ID"] ||= "app id"; ENV["FB_APP_SECRET"] ||= "secret"; ENV['GOOGLE_APP_ID'] = "app id"; ENV['GOOGLE_APP_SECRET'] = "secret"
78
- # require 'plezi/oauth' # do this AFTER setting ENV variables.
79
- # create_auth_shared_route do |service_name, auth_token, remote_user_id, remote_user_email, remote_response|
80
- # # ...callback for authentication.
81
- # # This callback should return the app user object or false
82
- # # This callback has access to the controller's methods (request, cookies, response, etc')
83
- # end
84
-
85
- # Add your routes and controllers by order of priority.
86
- route '/(:id)', MyController
87
-
21
+ ENV['PL_REDIS_URL'] ||= ENV['REDIS_URL'] ||
22
+ ENV['REDISCLOUD_URL'] ||
23
+ ENV['REDISTOGO_URL'] ||
24
+ nil # "redis://:password@my.host:6389/0"
25
+ # # redis channel name should be changed IF using the same Plezi code within
26
+ # # more then one application (i.e., using both Rails and Plezi together).
27
+ # Plezi.app_name = 'appsecret'
28
+
29
+ # Map the views folder to the template root (for the {#render} function).
30
+ Plezi.templates = Root.join('views').to_s
31
+
32
+ # load routes.
33
+ load Root.join('routes.rb').to_s