sinatra_sockets 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/server_skeleton/Gemfile +4 -5
- data/lib/server_skeleton/Gemfile.lock +28 -0
- data/lib/server_skeleton/README.md +19 -8
- data/lib/server_skeleton/lib/routes/ws.rb +46 -0
- data/lib/server_skeleton/server.rb +123 -51
- data/lib/version.rb +1 -1
- metadata +2 -14
- data/lib/server_skeleton/client.rb +0 -33
- data/lib/server_skeleton/deps.js +0 -3
- data/lib/server_skeleton/lib/routes/index.rb +0 -48
- data/lib/server_skeleton/lib/websocket.rb +0 -48
- data/lib/server_skeleton/package.json +0 -17
- data/lib/server_skeleton/public/bundle.js +0 -10383
- data/lib/server_skeleton/views/index.slim +0 -26
- data/lib/server_skeleton/views/partials/url_input.slim +0 -4
- data/lib/server_skeleton/views/partials/videos.slim +0 -2
- data/lib/server_skeleton/views/script/add_video.slim +0 -51
- data/lib/server_skeleton/views/script/url_input.slim +0 -11
- data/lib/server_skeleton/views/script/websocket.slim +0 -13
- data/lib/server_skeleton/views/style/main.slim +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c54288802748884e7b74e50b154fab2d598ea346
|
4
|
+
data.tar.gz: 363af3452bfd9684bd332d6c7988afc2d2b641b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e5d8b07d6fe155af2297117a9e253631919e92b5aee628d90facbbcaa26c384a8b829e9fea94fd898026b62551da157feda59a9835a4685a5d82d7d760015c2
|
7
|
+
data.tar.gz: 6d59490fd5530989a90e0b031a0deb5069d849c09c4eb3ac819257b83378ba78fef91ff8e7efbb394059341375a572b4697a2769ef33f70074b820e6be59964a
|
data/lib/server_skeleton/Gemfile
CHANGED
@@ -6,6 +6,8 @@ GEM
|
|
6
6
|
i18n (~> 0.7)
|
7
7
|
minitest (~> 5.1)
|
8
8
|
tzinfo (~> 1.1)
|
9
|
+
addressable (2.5.0)
|
10
|
+
public_suffix (~> 2.0, >= 2.0.2)
|
9
11
|
awesome_print (1.7.0)
|
10
12
|
byebug (9.0.6)
|
11
13
|
coderay (1.1.1)
|
@@ -17,9 +19,12 @@ GEM
|
|
17
19
|
concurrent-ruby (1.0.4)
|
18
20
|
corefines (1.9.0)
|
19
21
|
daemons (1.2.4)
|
22
|
+
dotenv (2.2.0)
|
20
23
|
engtagger (0.2.1)
|
21
24
|
eventmachine (1.2.2)
|
22
25
|
execjs (2.7.0)
|
26
|
+
faraday (0.11.0)
|
27
|
+
multipart-post (>= 1.2, < 3)
|
23
28
|
faye-websocket (0.10.6)
|
24
29
|
eventmachine (>= 0.12.0)
|
25
30
|
websocket-driver (>= 0.5.1)
|
@@ -43,15 +48,21 @@ GEM
|
|
43
48
|
ruby_dep (~> 1.2)
|
44
49
|
method_source (0.8.2)
|
45
50
|
minitest (5.10.1)
|
51
|
+
multipart-post (2.0.0)
|
52
|
+
octokit (4.6.2)
|
53
|
+
sawyer (~> 0.8.0, >= 0.5.3)
|
46
54
|
odyssey (0.2.0)
|
47
55
|
require_all
|
48
56
|
pry (0.10.4)
|
49
57
|
coderay (~> 1.1.0)
|
50
58
|
method_source (~> 0.8.1)
|
51
59
|
slop (~> 3.4)
|
60
|
+
public_suffix (2.0.5)
|
52
61
|
rack (1.6.5)
|
53
62
|
rack-protection (1.5.3)
|
54
63
|
rack
|
64
|
+
rack-proxy (0.6.0)
|
65
|
+
rack
|
55
66
|
rb-fsevent (0.9.8)
|
56
67
|
rb-inotify (0.9.8)
|
57
68
|
ffi (>= 0.5.0)
|
@@ -60,11 +71,18 @@ GEM
|
|
60
71
|
listen (~> 3.0)
|
61
72
|
ruby_dep (1.5.0)
|
62
73
|
sass (3.4.23)
|
74
|
+
sawyer (0.8.1)
|
75
|
+
addressable (>= 2.3.5, < 2.6)
|
76
|
+
faraday (~> 0.8, < 1.0)
|
63
77
|
sentence_interpreter (0.0.7)
|
64
78
|
sinatra (1.4.8)
|
65
79
|
rack (~> 1.5)
|
66
80
|
rack-protection (~> 1.4)
|
67
81
|
tilt (>= 1.3, < 3)
|
82
|
+
sinatra-cross_origin (0.4.0)
|
83
|
+
sinatra_auth_github (1.2.0)
|
84
|
+
sinatra (~> 1.0)
|
85
|
+
warden-github (~> 1.2.0)
|
68
86
|
slim (3.0.7)
|
69
87
|
temple (~> 0.7.6)
|
70
88
|
tilt (>= 1.3.3, < 2.1)
|
@@ -79,6 +97,12 @@ GEM
|
|
79
97
|
tilt (2.0.6)
|
80
98
|
tzinfo (1.2.2)
|
81
99
|
thread_safe (~> 0.1)
|
100
|
+
warden (1.2.7)
|
101
|
+
rack (>= 1.0)
|
102
|
+
warden-github (1.2.0)
|
103
|
+
activesupport (> 3.0)
|
104
|
+
octokit (> 2.1.0)
|
105
|
+
warden (> 1.0)
|
82
106
|
websocket-driver (0.6.5)
|
83
107
|
websocket-extensions (>= 0.1.0)
|
84
108
|
websocket-extensions (0.1.2)
|
@@ -88,11 +112,15 @@ PLATFORMS
|
|
88
112
|
|
89
113
|
DEPENDENCIES
|
90
114
|
coffee-script
|
115
|
+
dotenv
|
91
116
|
faye-websocket
|
92
117
|
gemmyrb
|
118
|
+
rack-proxy
|
93
119
|
rerun
|
94
120
|
sass
|
95
121
|
sinatra
|
122
|
+
sinatra-cross_origin
|
123
|
+
sinatra_auth_github
|
96
124
|
slim
|
97
125
|
thin
|
98
126
|
|
@@ -1,13 +1,24 @@
|
|
1
|
-
A simple sinatra websocket server with faye/eventmaching
|
2
1
|
|
3
|
-
|
2
|
+
---
|
4
3
|
|
5
|
-
|
4
|
+
This server is adapted from
|
5
|
+
[sinatra_sockets](http://github.com/maxpleaner/sinatra_sockets),
|
6
|
+
another boiler I made.
|
6
7
|
|
7
|
-
|
8
|
-
and raise an issue on [the github page](http://github.com/maxpleaner/sinatra_sockets)
|
9
|
-
if there's any confusion.
|
8
|
+
---
|
10
9
|
|
11
|
-
|
10
|
+
Steps:
|
12
11
|
|
13
|
-
|
12
|
+
1. bundle
|
13
|
+
2. thin start
|
14
|
+
|
15
|
+
---
|
16
|
+
|
17
|
+
This version has a lot of stuff removed since it's serving no front-end.
|
18
|
+
It's just the API for the webpack client
|
19
|
+
|
20
|
+
Important files:
|
21
|
+
- websocket stuff in lib/routes/ws.rb
|
22
|
+
- regular routes in server.rb
|
23
|
+
|
24
|
+
---
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class Routes::Ws
|
2
|
+
|
3
|
+
def self.run(request)
|
4
|
+
return unless Faye::WebSocket.websocket?(request.env)
|
5
|
+
socket = Faye::WebSocket.new(req.env)
|
6
|
+
socket.onopen { onopen(request, socket) }
|
7
|
+
socket.onmessage { |msg| onmessage(request, ws, msg) }
|
8
|
+
socket.onclose { onclose(request, ws) }
|
9
|
+
socket.rack_response
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.onopen(request, ws)
|
13
|
+
token = request.params["token"]
|
14
|
+
unless token
|
15
|
+
ws.send({
|
16
|
+
msg: "no valid token was sent with websocket; invalid"
|
17
|
+
}.to_json)
|
18
|
+
ws.close
|
19
|
+
return
|
20
|
+
end
|
21
|
+
Sockets[token] = ws
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.onmessage(request, ws, msg)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.onclose(request, ws)
|
28
|
+
delete_socket(request, ws)
|
29
|
+
end
|
30
|
+
|
31
|
+
class << self
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def send_json_message(ws, msg)
|
36
|
+
EM.next_tick { ws.send msg.to_json }
|
37
|
+
end
|
38
|
+
|
39
|
+
def delete_socket(request, ws)
|
40
|
+
token = CGI.parse(URI.parse(ws.url).to_s)["token"]
|
41
|
+
Sockets.delete token
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -1,80 +1,152 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# ================================================
|
2
|
+
# Entry to the Sinatra server
|
3
|
+
# ------------------------------------------------
|
4
|
+
# This file should not be run directly
|
5
|
+
# Run it with "thin start"
|
6
|
+
# ================================================
|
3
7
|
|
4
|
-
# The "modular" version of Sinatra (no global monkeypatch).
|
5
8
|
require 'sinatra/base'
|
6
|
-
|
7
|
-
# Eventmachine-based websocket server
|
8
9
|
require 'faye/websocket'
|
9
|
-
|
10
|
-
# My gem of Ruby language utils. This in turn requires activesupport,
|
11
|
-
# colored, awesome_print, etc.
|
12
|
-
# see http://rubygems.org/gems/gemmyrb
|
13
|
-
require 'gemmy'
|
14
|
-
|
15
|
-
# A debugger. Pry has more functionality but has become buggy itself.
|
16
10
|
require 'byebug'
|
17
|
-
|
18
|
-
|
19
|
-
require '
|
20
|
-
|
21
|
-
# better than JS
|
22
|
-
require 'coffee_script'
|
11
|
+
require 'sinatra_auth_github'
|
12
|
+
require('dotenv'); Dotenv.load
|
13
|
+
require 'sinatra/cross_origin'
|
23
14
|
|
24
15
|
# Requires all ruby files in this directory.
|
25
16
|
# Orders them by the count of "/" in their filename.
|
26
17
|
# Therefore, shallower files are loaded first.
|
27
|
-
# The reasoning for this is to
|
18
|
+
# The reasoning for this is to support the common convention of naming
|
28
19
|
# files according to their contained class hierarchies.
|
29
20
|
# i.e. class Foo would be in foo.rb,
|
30
21
|
# class Foo::Bar would be in foo/bar.rb,
|
22
|
+
#
|
23
|
+
# If there is the situation where a class depends on another that is in a
|
24
|
+
# deeper-nested file, there's always the option to pass the dependency at
|
25
|
+
# runtime.
|
26
|
+
|
31
27
|
Dir.glob("./**/*.rb").sort_by { |x| x.count("/") }.each do |path|
|
32
28
|
require path
|
33
29
|
end
|
34
30
|
|
35
|
-
#
|
36
|
-
#
|
37
|
-
|
31
|
+
# The REST routes (listed in this file) cannot store information in the session
|
32
|
+
# since it's on another host.
|
33
|
+
# Rather, they pass back and forth a token identifier
|
34
|
+
#
|
35
|
+
# This is the :token param, and is required on all routes except for
|
36
|
+
# /token
|
37
|
+
#
|
38
|
+
# Here's an outline of the flow:
|
39
|
+
#
|
40
|
+
# 1. Client hits GET /token, gets a new token
|
41
|
+
# 2. Client sends token with websocket connection request at GET /ws
|
42
|
+
# 3. Client hits GET /authenticate and goes through Github oAuth login
|
43
|
+
# 4. Github sends callback to server, which sends the OK to client over websocket
|
44
|
+
|
45
|
+
# In leue of sessions, three global objects are used:
|
46
|
+
# Users: <Hash> with keys: <username> and vals: <Set(token)>
|
47
|
+
# AuthenticatedTokens: <hash> with keys: <token> and vals: <username>
|
48
|
+
# Sockets: <hash> with keys: <token> and vals: <socket>
|
49
|
+
|
50
|
+
Sockets = {}
|
51
|
+
AuthenticatedTokens = {}
|
52
|
+
Users = Hash.new { |hash, key| hash[key] = Set.new }
|
38
53
|
|
39
|
-
# Our server, a Sinatra app
|
40
54
|
class Server < Sinatra::Base
|
41
55
|
|
42
|
-
# Thin works well with Faye and Sinatra
|
43
|
-
# However keep in mind that the server needs to be run with "thin start"
|
44
|
-
# NOT ruby server.rb,
|
45
|
-
# rackup,
|
46
|
-
# rackup -E production
|
47
|
-
# etc.
|
48
|
-
# These will not work.
|
49
56
|
set :server, 'thin'
|
50
57
|
Faye::WebSocket.load_adapter('thin')
|
51
58
|
|
52
|
-
#
|
53
|
-
#
|
54
|
-
|
55
|
-
|
59
|
+
# Allow some routes to be accessed from different origins
|
60
|
+
# This is unnecessary for websocket requests, since browsers don't implement
|
61
|
+
# the same restictions.
|
62
|
+
|
63
|
+
register Sinatra::CrossOrigin
|
64
|
+
|
65
|
+
# Github oAuth setup
|
66
|
+
# session is needed for the Github oAuth gem
|
67
|
+
# but its not used elsewhere
|
68
|
+
|
69
|
+
enable :sessions
|
70
|
+
set :github_options, {
|
71
|
+
scopes: "user",
|
72
|
+
secret: ENV["GITHUB_CLIENT_SECRET"],
|
73
|
+
client_id: ENV["GITHUB_CLIENT_ID"]
|
74
|
+
}
|
75
|
+
register Sinatra::Auth::Github
|
76
|
+
|
77
|
+
# ------------------------------------------------
|
78
|
+
# Standard HTTP routes
|
79
|
+
# (get '/ws' is the entrance to the websocket API)
|
80
|
+
# ------------------------------------------------
|
81
|
+
|
82
|
+
# First clients request a token
|
83
|
+
|
84
|
+
get '/token' do
|
85
|
+
cross_origin allow_origin: "http://localhost:8080"
|
86
|
+
{ token: new_token }.to_json
|
56
87
|
end
|
57
88
|
|
58
|
-
#
|
59
|
-
#
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
89
|
+
# Then they send it in websocket connection request
|
90
|
+
# See server/lib/routes/ws.rb
|
91
|
+
|
92
|
+
get '/ws' do
|
93
|
+
Routes::Ws.run(request)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Then they authenticate with Github
|
97
|
+
# TODO render a proper HTML page after this not just plaintext
|
98
|
+
# saying they can close the window.
|
99
|
+
|
100
|
+
get '/authenticate' do
|
101
|
+
if token = params["token"]
|
102
|
+
if socket = Sockets[token]
|
103
|
+
if !AuthenticatedTokens[token]
|
104
|
+
authenticate!
|
105
|
+
username = get_username
|
106
|
+
Users[username] << (token)
|
107
|
+
AuthenticatedTokens[token] = username
|
108
|
+
end
|
109
|
+
socket.send({
|
110
|
+
action: "logged_in",
|
111
|
+
username: username
|
112
|
+
}.to_json)
|
113
|
+
"authenticated as #{username}. (this window can be closed)"
|
114
|
+
else
|
115
|
+
"error. lost your websocket connection (this window can be closed)"
|
116
|
+
end
|
117
|
+
else
|
118
|
+
"error. That request requires a token (this window can be closed)"
|
64
119
|
end
|
65
|
-
request
|
66
120
|
end
|
67
121
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
122
|
+
get '/logout' do
|
123
|
+
token = params[:token]
|
124
|
+
if token
|
125
|
+
if username = AuthenticatedTokens[token]
|
126
|
+
logout!
|
127
|
+
Sockets[token].send({
|
128
|
+
action: "logged_out"
|
129
|
+
}.to_json)
|
130
|
+
else
|
131
|
+
if ws = Sockets[token]
|
132
|
+
ws.send({msg: "can't find user to log out"}.to_json)
|
133
|
+
else
|
134
|
+
{error: "can't find user to log out"}.to_json
|
135
|
+
end
|
136
|
+
end
|
137
|
+
else
|
138
|
+
{ error: 'cant log out; no token provided' }.to_json
|
139
|
+
end
|
75
140
|
end
|
76
141
|
|
77
|
-
|
142
|
+
private
|
78
143
|
|
79
|
-
|
80
|
-
|
144
|
+
def get_username
|
145
|
+
github_user.login
|
146
|
+
end
|
147
|
+
|
148
|
+
def new_token
|
149
|
+
SecureRandom.urlsafe_base64
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra_sockets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- maxpleaner
|
@@ -36,22 +36,10 @@ files:
|
|
36
36
|
- lib/server_skeleton/Gemfile
|
37
37
|
- lib/server_skeleton/Gemfile.lock
|
38
38
|
- lib/server_skeleton/README.md
|
39
|
-
- lib/server_skeleton/client.rb
|
40
39
|
- lib/server_skeleton/config.ru
|
41
|
-
- lib/server_skeleton/deps.js
|
42
40
|
- lib/server_skeleton/lib/routes.rb
|
43
|
-
- lib/server_skeleton/lib/routes/
|
44
|
-
- lib/server_skeleton/lib/websocket.rb
|
45
|
-
- lib/server_skeleton/package.json
|
46
|
-
- lib/server_skeleton/public/bundle.js
|
41
|
+
- lib/server_skeleton/lib/routes/ws.rb
|
47
42
|
- lib/server_skeleton/server.rb
|
48
|
-
- lib/server_skeleton/views/index.slim
|
49
|
-
- lib/server_skeleton/views/partials/url_input.slim
|
50
|
-
- lib/server_skeleton/views/partials/videos.slim
|
51
|
-
- lib/server_skeleton/views/script/add_video.slim
|
52
|
-
- lib/server_skeleton/views/script/url_input.slim
|
53
|
-
- lib/server_skeleton/views/script/websocket.slim
|
54
|
-
- lib/server_skeleton/views/style/main.slim
|
55
43
|
- lib/sinatra_sockets.rb
|
56
44
|
- lib/version.rb
|
57
45
|
homepage: http://github.com/maxpleaner/sinatra_sockets
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'faye/websocket'
|
2
|
-
require 'eventmachine'
|
3
|
-
require 'byebug'
|
4
|
-
require 'gemmy'
|
5
|
-
|
6
|
-
if $start_client
|
7
|
-
|
8
|
-
Settings = {awaiting_input: false }
|
9
|
-
EM.run do
|
10
|
-
|
11
|
-
EM.tick_loop do
|
12
|
-
if !Settings[:awaiting_input]
|
13
|
-
Thread.new do
|
14
|
-
Settings[:awaiting_input] = true
|
15
|
-
inp = gets.chomp
|
16
|
-
Settings[:awaiting_input] = false
|
17
|
-
Ws.send inp
|
18
|
-
end
|
19
|
-
sleep 0.2
|
20
|
-
end
|
21
|
-
end.on_stop { EM.stop }
|
22
|
-
|
23
|
-
ServerWebsocketUrl = ENV["SERVER_WS_URL"] || 'ws://localhost:3000/'
|
24
|
-
|
25
|
-
Ws = Faye::WebSocket::Client.new ServerWebsocketUrl
|
26
|
-
|
27
|
-
Ws.on :message do |event|
|
28
|
-
puts event.data
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
data/lib/server_skeleton/deps.js
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
class Routes::Index
|
2
|
-
|
3
|
-
Gemmy.patches.each { |patch| using patch }
|
4
|
-
# This method is called from the Sinatra route handler
|
5
|
-
def self.run(request)
|
6
|
-
is_websocket = websocket_request? request
|
7
|
-
m(is_websocket ? :websocket_request : :http_request).call request
|
8
|
-
end
|
9
|
-
|
10
|
-
# Check if the request is of the websocket variety
|
11
|
-
def self.websocket_request?(request)
|
12
|
-
Faye::WebSocket.websocket? request.env
|
13
|
-
end
|
14
|
-
|
15
|
-
# Handle HTTP requests
|
16
|
-
def self.http_request request
|
17
|
-
request.renderers.slim.call :index
|
18
|
-
end
|
19
|
-
|
20
|
-
# Handle websocket requests
|
21
|
-
def self.websocket_request request
|
22
|
-
socket = Websocket.new request
|
23
|
-
socket.onopen &method(:onopen)
|
24
|
-
socket.onmessage &method(:onmessage)
|
25
|
-
socket.onclose &method(:onclose)
|
26
|
-
socket.ready
|
27
|
-
end
|
28
|
-
|
29
|
-
# Handler for newly opened websocket
|
30
|
-
# Pushes the websocket connection object into the global Sockets array
|
31
|
-
def self.onopen(request, ws)
|
32
|
-
Sockets << ws
|
33
|
-
end
|
34
|
-
|
35
|
-
# Handler for received message from websocket
|
36
|
-
# Sends a message to all clients echoing what was received
|
37
|
-
def self.onmessage(request, ws, msg)
|
38
|
-
EM.next_tick { Sockets.each{|s| s.send "got #{msg.data}" } }
|
39
|
-
end
|
40
|
-
|
41
|
-
# Handler for closed websocket event
|
42
|
-
# Deletes the websocket connection object from the global Sockets array
|
43
|
-
def self.onclose(request, ws)
|
44
|
-
warn("websocket closed")
|
45
|
-
Sockets.delete(ws)
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
class Websocket
|
2
|
-
|
3
|
-
# A wrapper over an underlying websocket API
|
4
|
-
# If ever the websocket server dependency would need to change,
|
5
|
-
# this file would be a place to swap out libraries.
|
6
|
-
#
|
7
|
-
# With each handler (open, close, message) is passed the request object
|
8
|
-
# in addition to the websocket connection object and any additional arguments
|
9
|
-
# (such as message)
|
10
|
-
#
|
11
|
-
# If this is being initialized, the request is assumed to be of the
|
12
|
-
# websocket variety.
|
13
|
-
#
|
14
|
-
# Operations in this class are implemented in a stack which needs to be
|
15
|
-
# finalized by #ready.
|
16
|
-
#
|
17
|
-
# for example:
|
18
|
-
# socket = Websocket.new(request)
|
19
|
-
# socket.onopen { |req, socket| }
|
20
|
-
# socket.onclose { |req, socket| }
|
21
|
-
# socket.onmessage { |req, socket, msg| }
|
22
|
-
# socket.ready
|
23
|
-
#
|
24
|
-
def initialize(req)
|
25
|
-
@req = req
|
26
|
-
@socket = Faye::WebSocket.new(req.env)
|
27
|
-
@stack = {}
|
28
|
-
end
|
29
|
-
|
30
|
-
def onopen &blk
|
31
|
-
@stack[:onopen] = blk
|
32
|
-
end
|
33
|
-
|
34
|
-
def onclose &blk
|
35
|
-
@stack[:onclose] = blk
|
36
|
-
end
|
37
|
-
|
38
|
-
def onmessage &blk
|
39
|
-
@stack[:onmessage] = blk
|
40
|
-
end
|
41
|
-
|
42
|
-
def ready
|
43
|
-
@socket.on(:open) { @stack[:onopen].call @req, @socket }
|
44
|
-
@socket.on(:close) { @stack[:onclose].call @req, @socket }
|
45
|
-
@socket.on(:message) { |msg| @stack[:onmessage].call @req, @socket, msg }
|
46
|
-
@socket.rack_response
|
47
|
-
end
|
48
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"name": "mixer",
|
3
|
-
"version": "1.0.0",
|
4
|
-
"description": "A simple sinatra websocket server with faye/eventmaching",
|
5
|
-
"main": "index.js",
|
6
|
-
"scripts": {
|
7
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
8
|
-
},
|
9
|
-
"author": "",
|
10
|
-
"license": "ISC",
|
11
|
-
"dependencies": {
|
12
|
-
"bower": "^1.8.0",
|
13
|
-
"browserify": "^14.1.0",
|
14
|
-
"jquery": "^3.1.1",
|
15
|
-
"valid-url": "^1.0.9"
|
16
|
-
}
|
17
|
-
}
|