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
@@ -1,6 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- if defined? Haml
4
- # set some options
5
- Haml::Options.defaults[:format] = :html5
6
- end
@@ -1,14 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- if defined? I18n
4
- # set up i18n locales paths
5
- I18n.load_path = Dir[Root.join('locales', '*.{rb,yml}').to_s]
6
-
7
- # This will prevent certain errors from showing up.
8
- I18n.enforce_available_locales = false
9
-
10
- # set default locale, if not english
11
- # I18n.default_locale = :ru
12
-
13
- end
14
-
@@ -1,49 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # this file sets up the basic framework.
4
-
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
-
10
- # make sure all file access and file loading is relative to the application's root folder
11
- Dir.chdir Root.to_s
12
-
13
- # ensure development mode? (comment before production, environment dependent)
14
- ENV['ENV'] ||= ENV["RACK_ENV"] ||= "development"
15
-
16
- # save the process id (pid) to file - notice Heroku doesn't allow to write files.
17
- (IO.write File.expand_path(File.join 'tmp','pid'), Process.pid unless ENV["DYNO"]) rescue true
18
-
19
- # using bundler to load gems (including the plezi gem)
20
- require 'bundler'
21
- Bundler.require(:default, ENV['ENV'].to_s.to_sym)
22
-
23
- # require tilt/sass in a thread safe way (before multi-threading cycle begins)
24
- require 'tilt/sass' if defined?(::Slim) && defined?(::Sass)
25
-
26
- # # set up Plezi's logs to a log file?
27
- # Iodine.logger = Logger.new(File.expand_path(File.join 'logs','server.log')) unless ENV["DYNO"]
28
-
29
- # set the session token name?
30
- Iodine::Http.session_token = 'appname_uui'
31
-
32
- ## Allow forking? ONLY if your code is fully scalable across processes.
33
- # Iodine.processes = 4
34
-
35
- # load all config files
36
- Dir[File.join "{initialize}", "**" , "*.rb"].each {|file| load File.expand_path(file)}
37
-
38
- # load all library files
39
- Dir[File.join "{lib}", "**" , "*.rb"].each {|file| load File.expand_path(file)}
40
-
41
- # load all application files
42
- Dir[File.join "{app}", "**" , "*.rb"].each {|file| load File.expand_path(file)}
43
-
44
- # change some of the default settings here.
45
- host host: :default,
46
- public: Root.join('public').to_s,
47
- assets: Root.join('assets').to_s,
48
- assets_public: '/assets',
49
- templates: Root.join('app','views').to_s
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- # set the working directory
5
- Dir.chdir ::File.expand_path(File.join(__FILE__, ".."))
6
- # load the appname-app
7
- load ::File.expand_path(File.join("..", "appname.rb"), __FILE__)
@@ -1,24 +0,0 @@
1
- ###############
2
- # # OAuth2 Config File
3
- # # ==================
4
- # #
5
- # # Here you can sets the OAuth2 variables and require the OAuth2 Plezi controller.
6
- # # (if the variables aren't set BEFORE the inclution, automatic setup will NOT take place)
7
- # #
8
- # # First set the variables:
9
- # #
10
- # ENV["FB_APP_ID"] ||= "app id"
11
- # ENV["FB_APP_SECRET"] ||= "secret"
12
- # ENV['GOOGLE_APP_ID'] = "app id"
13
- # ENV['GOOGLE_APP_SECRET'] = "secret"
14
- # #
15
- # # Then, require the actual OAuth2 controller class (Plezi::OAuth2Ctrl).
16
- # #
17
- # require 'plezi/oauth'
18
- # #
19
- # # Last, but not least, remember to add the authentication route in the 'routes.rb' (remember path priority placement):
20
- # create_auth_shared_route do |service_name, auth_token, remote_user_id, remote_user_email, remote_response|
21
- # # ...callback for authentication.
22
- # # This callback should return the app user object or false
23
- # # This callback has access to the magic controller methods (request, cookies, etc')
24
- # end
@@ -1,198 +0,0 @@
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 + window.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) {this.autoreconnect = true;}
52
- }
53
- // The Websocket onopen callback
54
- PleziClient.prototype.___on_open = function(e) {
55
- this.owner.connected = true;
56
- if (this.owner.onopen) { this.owner.onopen(e) }
57
- }
58
- // The Websocket onclose callback
59
- PleziClient.prototype.___on_close = function(e) {
60
- this.owner.connected = false;
61
- if (this.owner.onclose) { this.owner.onclose(e) }
62
- if(this.owner.autoreconnect) {
63
- setTimeout( function(obj) {
64
- obj.reconnect();
65
- }, this.owner.reconnect_interval, this.owner);
66
- }
67
- }
68
- // The Websocket onerror callback
69
- PleziClient.prototype.___on_error = function(e) {
70
- if (this.owner.onerror) {this.owner.onerror(e)}
71
- }
72
- // The Websocket onmessage callback
73
- PleziClient.prototype.___on_message = function(e) {
74
- try {
75
- var msg = JSON.parse(e.data);
76
- this.owner.___dispatch(msg);
77
- } catch(err) {
78
- console.error("PleziClient experienced an error parsing the following data (not JSON):",
79
- err, e.data)
80
- }
81
- }
82
- PleziClient.prototype.___dispatch = function(msg) {
83
- try {
84
- if (this.log_events) {console.log(msg)}
85
- if ( msg.event == '_ack_') { clearTimeout(msg._EID_) }
86
- if ( (msg.event) && (this[msg.event])) {
87
- this[msg.event](msg);
88
- } else if ( (msg.event) && (this['on' + msg.event])) {
89
- console.warn('PleziClient: use a callback called "' + msg.event +
90
- '" instead of of "on' + msg.event + '"');
91
- this['on' + msg.event](msg);
92
- } else
93
- {
94
- if (this['unknown'] && (msg.event != '_ack_') ) {this['unknown'](msg)};
95
- }
96
- } catch(err) {
97
- console.error("PleziClient experienced an error while responding to the following onmessage event",
98
- err, e)
99
- }
100
- }
101
-
102
- // Sets a timeout for the websocket message
103
- PleziClient.prototype.___set_failed_timeout = function(event, callback, timeout) {
104
- if(event._EID_) {return event;};
105
- if(!timeout) { timeout = this.emit_timeout; };
106
- if(!callback) { callback = this.___on_timeout; };
107
- if(!timeout) { return event; };
108
- event._EID_ = setTimeout(callback, timeout, event, this);
109
- return event;
110
- }
111
- // Removes the _client_ property from the event and calls
112
- // the ontimeout callback within the correct scope
113
- PleziClient.prototype.___on_timeout = function(event, client) {
114
- if (client.ajaj.auto) {
115
- if (client.log_events) {console.log("falling back on AJAJ for the event:", event)}
116
- client.ajaj.emit(event, client.ontimeout);
117
- } else {
118
- client.ontimeout(event);
119
- }
120
- }
121
- // The timeout callback
122
- PleziClient.prototype.ontimeout = function(event) {
123
- console.warn("Timeout reached - it's assumed the connection was lost " +
124
- "and the following event was ignored by the server:", event);
125
- console.log(this);
126
- }
127
-
128
- PleziClient.prototype.reconnect = function() {
129
- this.connected = NaN;
130
- this.ws = new WebSocket(this.url);
131
- // lets us access the client from the callbacks
132
- this.ws.owner = this
133
- // The Websocket onopen callback
134
- this.ws.onopen = this.___on_open
135
- // The Websocket onclose callback
136
- this.ws.onclose = this.___on_close
137
- // The Websocket onerror callback
138
- this.ws.onerror = this.___on_error
139
- // The Websocket onmessage callback
140
- this.ws.onmessage = this.___on_message
141
- }
142
-
143
- PleziClient.prototype.close = function() {
144
- this.autoreconnect = false;
145
- this.ws.close();
146
- }
147
-
148
- PleziClient.origin = (window.location.protocol.match(/https/) ? 'wws' : 'ws') + '://' + window.location.hostname + (window.location.port == '' ? '' : (':' + window.location.port) );
149
-
150
- PleziClient.prototype.sendraw = function(data) {
151
- if (this.ws.readyState != 1) { return false; }
152
- this.ws.send(data);
153
- if (this.ws.readyState != 1) { return false; }
154
- return true
155
- }
156
-
157
- PleziClient.prototype.emit = function(event, callback, timeout) {
158
- this.___set_failed_timeout(event, callback, timeout)
159
- return this.sendraw( JSON.stringify(event) );
160
- }
161
-
162
- PleziClient.prototype.readyState = function() { return this.ws.readyState; }
163
-
164
- PleziClient.prototype.___ajaj__emit = function(event, callback) {
165
- var combined = {}
166
- for (var k in this.add) {combined[k] = this.add[k];};
167
- for (var k in event) {combined[k] = event[k];};
168
- if(!combined.id) {combined.id = event.event;};
169
- var req = new XMLHttpRequest();
170
- req.client = this.client;
171
- req.json = combined;
172
- req.callback = callback
173
- // if(!req.callback) req.callback = this.failed
174
- req.onreadystatechange = function() {
175
- if (this.readyState != 4) { return }
176
- if (this.status == 200) {
177
- try {
178
- var res = JSON.parse(this.responseText);
179
- this.client.___dispatch(res);
180
- } catch(err) {
181
- console.error("PleziClient experienced an error parsing the following data (not JSON):",
182
- err, this.responseText)
183
- }
184
-
185
- } else {
186
- if(this.callback) {
187
- this.callback(this.json);
188
- }
189
- }
190
- }
191
- req.open("POST", this.url ,true);
192
- req.setRequestHeader("Content-type", "application/json");
193
- try {
194
- req.send(JSON.stringify(combined));
195
- } catch(err) {
196
- callback(event)
197
- }
198
- }
@@ -1,47 +0,0 @@
1
- <!DOCTYPE html>
2
- <head>
3
- <meta charset='UTF-8'>
4
- <style>
5
- html, body {width: 100%; height:100%;}
6
- body {font-size: 1.5em; background-color: #eee;}
7
- p {padding: 0.2em; margin: 0;}
8
- .received { color: #00f;}
9
- .sent { color: #f0f;}
10
- .connection { color: #0f0;}
11
- .error { color: #f00;}
12
- input, #output {font-size: 1em; width: 60%; margin: 0.5em 19%; padding: 0.5em 1%;}
13
- #output {height: 60%; overflow: auto; background-color: #fff;}
14
- </style>
15
- <script>
16
- var websocket = NaN;
17
- function connect() { websocket = new WebSocket( (window.location.protocol.match(/https/) ? 'wws' : 'ws') + '://' + window.location.hostname + (window.location.port == '' ? '' : (':' + window.location.port) ) + "/" ); }
18
- function init()
19
- {
20
- connect()
21
- websocket.onopen = function(evt) { WriteMessage("Connected.", "connection") };
22
- websocket.onclose = function(evt) { WriteMessage("Disconnected.", "connection");connect(); };
23
- websocket.onmessage = function(evt) {
24
- WriteMessage(evt.data);
25
- };
26
- websocket.onerror = function(evt) { WriteMessage(evt.data, 'error'); };
27
- }
28
- function WriteMessage( message, message_type )
29
- {
30
- if (!message_type) message_type = 'received'
31
- var msg = document.createElement("p");
32
- msg.className = message_type;
33
- msg.innerHTML = message;
34
- document.getElementById("output").appendChild(msg);
35
- }
36
- function Send(message)
37
- {
38
- WriteMessage(message, 'sent');
39
- websocket.send(message);
40
- }
41
- window.addEventListener("load", init, false);
42
- </script>
43
- </head>
44
- <body>
45
- <div id='output'>test</div>
46
- <input type='text' placeholder='your message goes here.' value='' />
47
- </body>
@@ -1,42 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- if defined? Redis
4
-
5
- # ## Plezi Redis Automation
6
- # ## ====
7
- # ##
8
- # ## Sets up Plezi to use Radis broadcast.
9
- # ##
10
- # ## If Plezi Redis Automation is enabled:
11
- # ## Plezi creates is own listening thread that listens for messages and broadcasts using Redis.
12
- # ##
13
- # ## Only one thread will be created and initiated during startup (dynamically created controller routes might be ignored).
14
- # ##
15
- # `redis_channel_name` should be set when using the Placebo API.
16
- # (otherwise, it's only optional, as the automatic settings are good enough)
17
- Plezi::Settings.redis_channel_name = 'appsecret'
18
- ENV['PL_REDIS_URL'] ||= ENV['REDIS_URL'] ||
19
- ENV['REDISCLOUD_URL'] ||
20
- ENV['REDISTOGO_URL'] ||
21
- nil # use: "redis://:password@my.host:6389/0"
22
-
23
-
24
- # ## OR, write your own custom Redis implementation here
25
- # ## ====
26
- # ##
27
- # ## create a listening thread - rewrite the following code for your own Redis tailored solution.
28
- # ##
29
- # ## the following is only sample code for you to change:
30
- # RADIS_CHANNEL = 'appsecret'
31
- # RADIS_URI = ENV['REDIS_URL'] || ENV['REDISCLOUD_URL'] || "redis://:password@my.host:6389/0"
32
- # RADIS_CONNECTION = Redis.new(url: RADIS_URI)
33
- # RADIS_THREAD = Thread.new do
34
- # Redis.new(RADIS_URI).subscribe(RADIS_CHANNEL) do |on|
35
- # on.message do |channel, msg|
36
- # msg = JSON.parse(msg)
37
- # # do stuff, i.e.:
38
- # # Plezi.run(msg) { |m| Plezi.info m.to_s }
39
- # end
40
- # end
41
- # end
42
- end
@@ -1,11 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- if defined?(Slim)
4
- require 'rouge/plugins/redcarpet' if defined?(Redcarpet) && defined?(Rouge)
5
- if defined?(Redcarpet::Render::HTML) && defined?(Rouge::Plugins::Redcarpet)
6
- Slim::Embedded.options[:markdown] = {
7
- fenced_code_blocks: true,
8
- renderer: (Class.new(Redcarpet::Render::HTML) {include Rouge::Plugins::Redcarpet} ).new
9
- }
10
- end
11
- end
@@ -1,272 +0,0 @@
1
- <!DOCTYPE html>
2
- <head>
3
- <title>appname - Feed Me!</title>
4
- <meta content="width=device-width, initial-scale=1, maximum-scale=2.0, user-scalable=yes, minimal-ui=yes" name="viewport">
5
- <link href='https://fonts.googleapis.com/css?family=Shadows+Into+Light|Architects+Daughter' rel='stylesheet' type='text/css'>
6
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
7
- <style type="text/css">
8
- /*
9
- med-blue: #44518E
10
- dark-gray: #424A70
11
- blue: #1B2864
12
- light-blue: #818ECE
13
- light-gray: #99A3CE
14
- */
15
- body, html
16
- {
17
- background-color: #99A3CE;
18
- padding: 0; margin: 0;
19
- width: 100%;
20
- font-size: 1em;
21
- }
22
-
23
- h1
24
- {
25
- font-family: 'Shadows Into Light', cursive;
26
- background-color: #1B2864;
27
- color: #99A3CE;
28
- text-align: center;
29
- border-bottom: 4px solid #424A70;
30
- margin: 0 0 1em 0;
31
- padding: 0.4em 0;
32
- width: 100%;
33
- }
34
- h2
35
- {
36
- background-color: #44518E;
37
- color: #C6CCE7;
38
- text-align: left;
39
- margin: 0 0 1em 0;
40
- padding: 0.5em 5%;
41
- border-radius: 20px 20px 0 0;
42
- font-family: 'Architects Daughter', cursive;
43
- border-bottom: 3px solid #424A70;
44
- font-size: 1.2em;
45
- }
46
- h3
47
- {
48
- font-family: 'Architects Daughter', cursive;
49
- background-color: #44518E;
50
- color: #C6CCE7;
51
- text-align: left;
52
- margin: 0 0 1em 0;
53
- padding: 0.5em 5%;
54
- border-radius: 1em 1em 0 0;
55
- border-bottom: 2px solid #424A70;
56
- font-size: 1.1em;
57
- }
58
- h2:before {
59
- content: "|||";
60
- color: #99A3CE;
61
- padding-right: 0.3em;
62
- margin-left: -0.5em;
63
- }
64
- h3:before {
65
- content: "|||||";
66
- color: #99A3CE;
67
- padding-right: 0.3em;
68
- margin-left: -1em;
69
- }
70
- h1 a, h2 a, h3 a
71
- {
72
- color: #EBCD86;
73
- }
74
- h1 a:hover, h2 a:hover, h3 a:hover
75
- {
76
- color: #EBD7A6;
77
- }
78
- p
79
- {
80
- font-size: 1em;
81
- padding: 0 1em;
82
- margin: 0.5em 0;
83
- }
84
- a
85
- {
86
- color: #D0AC54;
87
- text-decoration: none;
88
- }
89
- a:hover
90
- {
91
- color: #927121;
92
- text-decoration: underline;
93
- }
94
- #wrapper
95
- {
96
- background-color: #fff;
97
- margin: 1em 5%;
98
- padding: 0 0 2%;
99
- border-radius: 20px;
100
- min-height: 50%;
101
- color: #007;
102
- }
103
-
104
- #wrapper p{ padding: 0 2%;}
105
- .bold { font-weight: bold; }
106
- #wrapper ol li{ padding: 0 2%;}
107
- pre
108
- {
109
- border-radius: 20px;
110
- padding: 0.5em 0;
111
- background-color: #444;
112
- color: #ddd;
113
- }
114
- input[type=text]
115
- {
116
- width: 60%;
117
- font-size: 1.1em;
118
- display: inline-block;
119
- background-color: #fff;
120
- color: #424A70;
121
- border-radius: 0.5em;
122
- border: 1px solid #424A70;
123
- outline: none;
124
- box-sizing: border-box;
125
- padding: 0 1em;
126
- }
127
- input[type=submit]
128
- {
129
- font-size: 1.1em;
130
- color: #424A70;
131
- border-radius: 0.5em;
132
- box-sizing: border-box;
133
- border: 1px solid #424A70;
134
- background-color: #fff;
135
- padding: 0 0.4em;
136
- }
137
- input[type=submit]:hover
138
- {
139
- background-color: #818ECE; color:#fff;
140
- }
141
- input[type=submit]:active
142
- {
143
- background-color: #1B2864; color:#fff;
144
- }
145
-
146
- #monitor
147
- {
148
- margin: 0 5%; padding: 0.5em 3em;
149
- box-sizing: border-box;
150
- width: 90%;
151
- font-size: 1.1em;
152
- display: inline-block;
153
- background-color: #C6CCE7;
154
- color: #424A70;
155
- border-radius: 0.5em;
156
- border: 1px solid #424A70;
157
- }
158
- #monitor p
159
- {
160
- text-align: center;
161
- }
162
- .system_message { color: #1B2864; font-style: italic;}
163
- @media screen and (max-width: 680px)
164
- {
165
- input[type=submit], input[type=text] {
166
- font-size: 1em;
167
- }
168
- input[type=text] { width: 100%;}
169
- #monitor
170
- {
171
- margin: 0 3%; padding: 0.5em 1em;
172
- }
173
- ul {padding: 0 1em;}
174
- }
175
-
176
- </style>
177
- <script type="text/javascript">
178
- // Your websocket URI should be an absolute path. The following sets the base URI.
179
- // remember to update to the specific controller's path to your websocket URI.
180
- var ws_controller_path = '/' // window.location.pathname; // change to '/controller/path'
181
- var ws_uri = (window.location.protocol.match(/https/) ? 'wss' : 'ws') + '://' + window.document.location.host + ws_controller_path
182
- // websocket variable.
183
- var websocket = NaN
184
- // count failed attempts
185
- var websocket_fail_count = 0
186
-
187
- function init_websocket()
188
- {
189
- if(websocket && websocket.readyState == 1) return true; // console.log('no need to renew socket connection');
190
- websocket = new WebSocket(ws_uri);
191
- websocket.onopen = function(e) {
192
- //restart fail count
193
- websocket_fail = 0
194
- // what do you want to do now?
195
- var msg = document.createElement("li");
196
- msg.className = 'system_message'
197
- msg.innerHTML = "Connected.";
198
- document.getElementById("output").appendChild(msg);
199
- };
200
-
201
- websocket.onclose = function(e) {
202
- // what do you want to do now?
203
- if(websocket_fail == 0) {
204
- var msg = document.createElement("li");
205
- msg.className = 'system_message'
206
- msg.innerHTML = "Disconnected.";
207
- document.getElementById("output").appendChild(msg);
208
- };
209
- // you probably want to reopen the websocket if it closes (unless the issue repeats).
210
- if(websocket_fail <= 5) {
211
- websocket_fail += 1;
212
- setTimeout( init_websocket, 250);
213
- };
214
- };
215
- websocket.onerror = function(e) {
216
- // what do you want to do now?
217
- };
218
- websocket.onmessage = function(e) {
219
- // what do you want to do now?
220
- console.log(e.data);
221
- var msg = document.createElement("li");
222
- msg.innerHTML = e.data;
223
- document.getElementById("output").appendChild(msg);
224
- // to use JSON, use:
225
- // msg = JSON.parse(e.data); // remember to use JSON also in your Plezi controller.
226
- };
227
- }
228
- window.addEventListener("load", init_websocket, false);
229
- function send_text()
230
- {
231
- var msg = document.getElementById("input").value;
232
- document.getElementById("input").value = '';
233
- websocket.send(msg);
234
- return false;
235
- }
236
- </script>
237
- </head>
238
- <body>
239
- <h1>Welcome to <a href="http://www.plezi.io/">Plezi</a></h1>
240
- <div id="wrapper">
241
- <h2>Congratulations, <a href='/'>appname</a> is running - What's next?</h2>
242
- <p><span class="bold">Congratulations</span>, you're now running appname and it has so much potential!</p>
243
- <p>appname started out <a href="http://www.plezi.io/">Plezi</a> and it's your quest to feed it your code and make sure appname grows strong and happy.</p>
244
- <p>You're the master of this quest, and your next steps might include:</p>
245
- <ol><li><p class="bold">Deciding which gems to use:</p>
246
- <ul>
247
- <li>edit Gemfile in the appname folder.</li>
248
- </ul>
249
- </li>
250
- <li>
251
- <p class="bold">Reviewing the sample code and feeding <a href="http://www.plezi.io/">Plezi</a> your code:</p>
252
- <ul>
253
- <li>Review the 'sample_controller.rb' file in the appname/app/controllers folder.</li>
254
- <li>Delete the 'sample_controller.rb' file and this file (appname/assets/welcome.html).</li>
255
- <li>Write your own controller and code.</li>
256
- <li>Edit the 'routes.rb' file to set up your routes.</li>
257
- </ul>
258
- </li>
259
- <li>
260
- <p><span class="bold">Having fun</span> and submitting any issues you discover to the <a href="https://github.com/boazsegev/plezi">Plezi Github Project.</a></p>
261
- </li>
262
- </ol>
263
- <p class="bold">Good Luck!</p>
264
- <h3> Did you try our websocket broadcast? </h3>
265
- <p>Your appname app can send <span class="bold">WebSocket</span> broadcasts (and unicasts). Why not try them out? You can even try them across multiple windows.</p>
266
- <form onsubmit='send_text(); return false;' id='monitor'>
267
- <p><input type='text' id='input' placeholder='Your message' /> <input type='submit' value='Broadcast'/> </p>
268
- <ul id='output'>
269
- </ul>
270
- </form>
271
- </div>
272
- </body>