webrtc-rails 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/webrtc_rails/{update → injection}/USAGE +1 -1
- data/lib/generators/webrtc_rails/injection/injection_generator.rb +39 -0
- data/lib/generators/webrtc_rails/install/install_generator.rb +5 -17
- data/lib/generators/webrtc_rails/templates/daemons +5 -0
- data/lib/generators/webrtc_rails/templates/daemons.yml +6 -0
- data/lib/generators/webrtc_rails/templates/main.js.coffee +105 -51
- data/lib/generators/webrtc_rails/templates/webrtc.rb +50 -0
- data/lib/generators/webrtc_rails/templates/webrtc_ctl +6 -0
- data/lib/webrtc_rails/version.rb +1 -1
- data/webrtc-rails.gemspec +2 -1
- metadata +24 -8
- data/lib/generators/webrtc_rails/update/install_generator.rb +0 -28
- data/lib/generators/webrtc_rails/update/update_generator.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c0b6f6041f627cd8c936ca0b81af0199dc41c03
|
4
|
+
data.tar.gz: 7f794a8d1d5d3ce91b43d6c0fc0b4dc7ba77be0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2665d656620c6f168325ce82f03dddc2073ff2976ca7d9d959d6f401a758397be83a5ea56b89aa8933ad61ddd15d9348c6828d83f1eef29fbd6d27f0b84f2ab2
|
7
|
+
data.tar.gz: d91a50fd716b32a8304895be64f173d80d9cbbc1b7e5e619d57f76c1bb78fa65c6e7ce6a1d6b9ea240720f0abb32c3491efd54ae38e0d17918b7b912d5f3c182
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'rails'
|
2
|
+
|
3
|
+
module WebrtcRails
|
4
|
+
module Generators
|
5
|
+
class InjectionGenerator < Rails::Generators::Base
|
6
|
+
source_root File.expand_path("../../templates", __FILE__)
|
7
|
+
|
8
|
+
def generate_daemon
|
9
|
+
daemons_dir = ::Daemons::Rails.configuration.daemons_directory
|
10
|
+
unless File.exists?(Rails.root.join(daemons_dir, 'daemons'))
|
11
|
+
copy_file "daemons", daemons_dir.join('daemons')
|
12
|
+
chmod daemons_dir.join('daemons'), 0755
|
13
|
+
end
|
14
|
+
|
15
|
+
script_path = daemons_dir.join('webrtc.rb')
|
16
|
+
template 'webrtc.rb', script_path
|
17
|
+
chmod script_path, 0755
|
18
|
+
|
19
|
+
ctl_path = daemons_dir.join('webrtc_ctl')
|
20
|
+
template "webrtc_ctl", ctl_path
|
21
|
+
chmod ctl_path, 0755
|
22
|
+
|
23
|
+
unless File.exists?(Rails.root.join('config', 'daemons.yml'))
|
24
|
+
copy_file 'daemons.yml', 'config/daemons.yml'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_events_initializer_file
|
29
|
+
js_path = File.join('app', 'assets', 'javascripts')
|
30
|
+
template 'main.js.coffee', File.join(js_path, 'webrtc_rails', 'main.js.coffee')
|
31
|
+
append_to_file File.join(js_path, 'application.js') do
|
32
|
+
out = ''
|
33
|
+
out << "\n\n// append by webrtc_rails\n"
|
34
|
+
out << "//= require webrtc_rails/main\n\n"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -3,25 +3,13 @@ require 'rails'
|
|
3
3
|
module WebrtcRails
|
4
4
|
module Generators
|
5
5
|
class InstallGenerator < Rails::Generators::Base
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
js_path = File.join('app', 'assets', 'javascripts')
|
10
|
-
template 'main.js.coffee', File.join(js_path, 'webrtc_rails', 'main.js.coffee')
|
11
|
-
append_to_file File.join(js_path, 'application.js') do
|
12
|
-
out = ''
|
13
|
-
out << "\n\n// append by webrtc_rails\n"
|
14
|
-
out << "//= require webrtc_rails/main\n\n"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def create_webrtc_controller
|
19
|
-
controller_path = File.join('app', 'controllers')
|
20
|
-
template 'webrtc_controller.rb', File.join(controller_path, 'webrtc_controller.rb')
|
6
|
+
def add_gems
|
7
|
+
gem 'daemons-rails'
|
8
|
+
gem 'em-websocket'
|
21
9
|
end
|
22
10
|
|
23
|
-
def
|
24
|
-
|
11
|
+
def injection
|
12
|
+
generate 'webrtc_rails:injection'
|
25
13
|
end
|
26
14
|
end
|
27
15
|
end
|
@@ -1,46 +1,26 @@
|
|
1
1
|
class @WebRTC
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
onWebSocketConnected: ->
|
3
|
+
onWebSocketReconnectingStarted: ->
|
4
|
+
onWebSocketReConnected: ->
|
5
|
+
onWebRTCConnected: ->
|
6
|
+
onWebRTCReconnectingStarted: ->
|
7
|
+
onWebRTCReconnected: ->
|
8
|
+
onWebRTCHangedUp: ->
|
9
|
+
|
10
|
+
constructor: (userToken, @localOutput, @remoteOutput) ->
|
7
11
|
@localOutput = @localOutput[0] || @localOutput
|
8
12
|
@remoteOutput = @remoteOutput[0] || @remoteOutput
|
9
13
|
@_startOutput(@localOutput.tagName.toUpperCase() == 'VIDEO')
|
10
|
-
@
|
11
|
-
@
|
12
|
-
(data) =>
|
13
|
-
event = JSON.parse(data)
|
14
|
-
switch event['type']
|
15
|
-
when 'call'
|
16
|
-
@remoteUserID = event['remoteUserID']
|
17
|
-
when 'hangUp'
|
18
|
-
@onHangedUp()
|
19
|
-
@_hangedUp = true
|
20
|
-
@_sendMessage(JSON.stringify(type: 'hangUpAnswer'))
|
21
|
-
@_stop()
|
22
|
-
when 'hangUpAnswer'
|
23
|
-
@_stop()
|
24
|
-
when 'offer'
|
25
|
-
@_onOffer(event)
|
26
|
-
when 'answer'
|
27
|
-
if @_peerStarted
|
28
|
-
@_onAnswer(event)
|
29
|
-
when 'candidate'
|
30
|
-
if @_peerStarted
|
31
|
-
@_onCandidate(event)
|
32
|
-
when 'user disconnected'
|
33
|
-
if @_peerStarted
|
34
|
-
@_stop()
|
35
|
-
)
|
14
|
+
@_webSocketInitialize(userToken)
|
15
|
+
@_addNetworkEventListener()
|
36
16
|
|
37
|
-
connect: (
|
38
|
-
@
|
17
|
+
connect: (remoteUserID) ->
|
18
|
+
@_remoteUserID = remoteUserID
|
39
19
|
if !@_peerStarted && @_localStream
|
40
|
-
@_sendMessage(
|
20
|
+
@_sendMessage(
|
41
21
|
type: 'call'
|
42
|
-
remoteUserID:
|
43
|
-
)
|
22
|
+
remoteUserID: @_myUserID
|
23
|
+
)
|
44
24
|
@_sendOffer()
|
45
25
|
@_peerStarted = true
|
46
26
|
else
|
@@ -57,8 +37,7 @@ class @WebRTC
|
|
57
37
|
track.enabled = enabled
|
58
38
|
|
59
39
|
hangUp: ->
|
60
|
-
@
|
61
|
-
@_sendMessage(JSON.stringify(type: 'hangUp'))
|
40
|
+
@_sendMessage(type: 'hangUp')
|
62
41
|
@_hangedUp = true
|
63
42
|
|
64
43
|
# private
|
@@ -71,13 +50,80 @@ class @WebRTC
|
|
71
50
|
'OfferToReceiveAudio': true
|
72
51
|
'OfferToReceiveVideo': true
|
73
52
|
|
53
|
+
_webSocketInitialize: (userToken) ->
|
54
|
+
@_webSocket = new WebSocket('ws://' + location.host + '/websocket')
|
55
|
+
@_webSocket.onopen = =>
|
56
|
+
@_startHeartbeat()
|
57
|
+
@_sendValue('setMyToken',
|
58
|
+
token: String(userToken)
|
59
|
+
)
|
60
|
+
if @_webRTCRreconnecting
|
61
|
+
@connect(@_remoteUserID)
|
62
|
+
|
63
|
+
@_webSocket.onclose = (event) =>
|
64
|
+
@onWebSocketReconnectingStarted()
|
65
|
+
@_webSocketInitialize(userToken)
|
66
|
+
|
67
|
+
@_webSocket.onmessage = (data) =>
|
68
|
+
event = JSON.parse(data.data)
|
69
|
+
switch event['type']
|
70
|
+
when 'myUserID'
|
71
|
+
@_myUserID = event['myUserID']
|
72
|
+
if @_webSocketConnected
|
73
|
+
@onWebSocketReConnected()
|
74
|
+
else
|
75
|
+
@onWebSocketConnected()
|
76
|
+
@_webSocketConnected = true
|
77
|
+
when 'call'
|
78
|
+
@_remoteUserID = event['remoteUserID']
|
79
|
+
when 'hangUp'
|
80
|
+
@_hangedUp = true
|
81
|
+
@_sendMessage(type: 'hangUpAnswer')
|
82
|
+
@_stop()
|
83
|
+
when 'hangUpAnswer'
|
84
|
+
@_stop()
|
85
|
+
when 'offer'
|
86
|
+
@_onOffer(event)
|
87
|
+
when 'answer'
|
88
|
+
if @_peerStarted
|
89
|
+
@_onAnswer(event)
|
90
|
+
when 'candidate'
|
91
|
+
if @_peerStarted
|
92
|
+
@_onCandidate(event)
|
93
|
+
|
94
|
+
_addNetworkEventListener: ->
|
95
|
+
window.addEventListener('online', (event) =>
|
96
|
+
@_webSocket.close()
|
97
|
+
)
|
98
|
+
window.addEventListener('online', (event) =>
|
99
|
+
@_webSocket = null
|
100
|
+
@_webSocketInitialize()
|
101
|
+
)
|
102
|
+
|
103
|
+
_startHeartbeat: ->
|
104
|
+
if !@_heartbeating
|
105
|
+
@_heartbeating = true
|
106
|
+
@_heartbeat()
|
107
|
+
|
108
|
+
_heartbeat: ->
|
109
|
+
@_sendValue('heartbeat', null)
|
110
|
+
window.setTimeout(
|
111
|
+
=>
|
112
|
+
@_heartbeat()
|
113
|
+
5000
|
114
|
+
)
|
115
|
+
|
116
|
+
_sendValue: (event, value) ->
|
117
|
+
if @_webSocket.readyState == WebSocket.OPEN
|
118
|
+
@_webSocket.send(JSON.stringify(
|
119
|
+
event: event
|
120
|
+
value: value
|
121
|
+
))
|
122
|
+
|
74
123
|
_sendMessage: (message) ->
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
data:
|
79
|
-
user_id: @remoteUserID
|
80
|
-
message: message
|
124
|
+
@_sendValue('sendMessage',
|
125
|
+
userID: String(@_remoteUserID)
|
126
|
+
message: message
|
81
127
|
)
|
82
128
|
|
83
129
|
_startOutput: (video) ->
|
@@ -110,12 +156,10 @@ class @WebRTC
|
|
110
156
|
@_peerConnection.addIceCandidate(candidate)
|
111
157
|
|
112
158
|
_sendSDP: (sdp) ->
|
113
|
-
|
114
|
-
@_sendMessage(text)
|
159
|
+
@_sendMessage(sdp)
|
115
160
|
|
116
161
|
_sendCandidate: (candidate) ->
|
117
|
-
|
118
|
-
@_sendMessage(text)
|
162
|
+
@_sendMessage(candidate)
|
119
163
|
|
120
164
|
_prepareNewConnection: ->
|
121
165
|
pcConfig = 'iceServers': [ "url": "stun:stun.l.google.com:19302" ]
|
@@ -144,10 +188,13 @@ class @WebRTC
|
|
144
188
|
peer.oniceconnectionstatechange = (event) =>
|
145
189
|
switch peer.iceConnectionState
|
146
190
|
when 'disconnected'
|
147
|
-
@
|
191
|
+
@_reconnectPeer()
|
192
|
+
@onWebRTCReconnectingStarted()
|
148
193
|
when 'connected', 'completed'
|
149
194
|
if @_hangedUp
|
150
|
-
@
|
195
|
+
@onWebRTCConnected()
|
196
|
+
else
|
197
|
+
@onWebRTCReconnected()
|
151
198
|
@_hangedUp = false
|
152
199
|
|
153
200
|
peer.addStream(@_localStream)
|
@@ -155,6 +202,13 @@ class @WebRTC
|
|
155
202
|
peer.addEventListener('removestream', onRemoteStreamRemoved, false)
|
156
203
|
peer
|
157
204
|
|
205
|
+
_reconnectPeer: ->
|
206
|
+
@_stop()
|
207
|
+
if @_webSocket.readyState == WebSocket.OPEN
|
208
|
+
@connect()
|
209
|
+
else
|
210
|
+
@_webRTCRreconnecting = true
|
211
|
+
|
158
212
|
_sendOffer: ->
|
159
213
|
@_peerConnection = @_prepareNewConnection()
|
160
214
|
@_peerConnection.createOffer(
|
@@ -162,7 +216,7 @@ class @WebRTC
|
|
162
216
|
@_peerConnection.setLocalDescription(sessionDescription)
|
163
217
|
@_sendSDP(sessionDescription)
|
164
218
|
->
|
165
|
-
console.log
|
219
|
+
console.log('Create Offer failed')
|
166
220
|
@_mediaConstraints
|
167
221
|
)
|
168
222
|
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
ENV["RAILS_ENV"] ||= "production"
|
4
|
+
|
5
|
+
root = File.expand_path(File.dirname(__FILE__))
|
6
|
+
root = File.dirname(root) until File.exists?(File.join(root, 'config'))
|
7
|
+
Dir.chdir(root)
|
8
|
+
|
9
|
+
require File.join(root, "config", "environment")
|
10
|
+
|
11
|
+
@websockets = {}
|
12
|
+
|
13
|
+
EM.run do
|
14
|
+
EM::WebSocket.run(host: 'localhost', port: 3001) do |websocket|
|
15
|
+
my_user_id = nil
|
16
|
+
|
17
|
+
websocket.onclose do
|
18
|
+
if my_user_id
|
19
|
+
@websockets[my_user_id].delete(websocket)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
websocket.onmessage do |message|
|
24
|
+
data = JSON.parse(message, {symbolize_names: true})
|
25
|
+
case data[:event]
|
26
|
+
when 'setMyToken'
|
27
|
+
token = data[:value][:token]
|
28
|
+
if token.present?
|
29
|
+
my_user_id = User.fetch_by_token(token).id.to_s
|
30
|
+
@websockets[my_user_id] ||= []
|
31
|
+
@websockets[my_user_id].push(websocket)
|
32
|
+
message = {
|
33
|
+
type: 'myUserID',
|
34
|
+
myUserID: my_user_id
|
35
|
+
}
|
36
|
+
websocket.send JSON.generate(message)
|
37
|
+
end
|
38
|
+
when 'sendMessage'
|
39
|
+
user_id = data[:value][:userID]
|
40
|
+
type = data[:value][:message][:type]
|
41
|
+
allow_types = %w/call hangUp hangUpAnswer offer answer candidate/
|
42
|
+
if @websockets[user_id] && type.present? && allow_types.include?(type)
|
43
|
+
for ws in @websockets[user_id]
|
44
|
+
ws.send JSON.generate(data[:value][:message])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/webrtc_rails/version.rb
CHANGED
data/webrtc-rails.gemspec
CHANGED
@@ -18,7 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency 'websocket
|
21
|
+
spec.add_dependency 'em-websocket'
|
22
|
+
spec.add_dependency 'daemons-rails'
|
22
23
|
|
23
24
|
spec.add_development_dependency "bundler", "~> 1.10"
|
24
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
metadata
CHANGED
@@ -1,17 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webrtc-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koji Murata
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: websocket
|
14
|
+
name: em-websocket
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: daemons-rails
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|
@@ -83,13 +97,16 @@ files:
|
|
83
97
|
- Rakefile
|
84
98
|
- bin/console
|
85
99
|
- bin/setup
|
100
|
+
- lib/generators/webrtc_rails/injection/USAGE
|
101
|
+
- lib/generators/webrtc_rails/injection/injection_generator.rb
|
86
102
|
- lib/generators/webrtc_rails/install/USAGE
|
87
103
|
- lib/generators/webrtc_rails/install/install_generator.rb
|
104
|
+
- lib/generators/webrtc_rails/templates/daemons
|
105
|
+
- lib/generators/webrtc_rails/templates/daemons.yml
|
88
106
|
- lib/generators/webrtc_rails/templates/main.js.coffee
|
107
|
+
- lib/generators/webrtc_rails/templates/webrtc.rb
|
89
108
|
- lib/generators/webrtc_rails/templates/webrtc_controller.rb
|
90
|
-
- lib/generators/webrtc_rails/
|
91
|
-
- lib/generators/webrtc_rails/update/install_generator.rb
|
92
|
-
- lib/generators/webrtc_rails/update/update_generator.rb
|
109
|
+
- lib/generators/webrtc_rails/templates/webrtc_ctl
|
93
110
|
- lib/webrtc-rails.rb
|
94
111
|
- lib/webrtc_rails/version.rb
|
95
112
|
- webrtc-rails.gemspec
|
@@ -113,9 +130,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
130
|
version: '0'
|
114
131
|
requirements: []
|
115
132
|
rubyforge_project:
|
116
|
-
rubygems_version: 2.4.5
|
133
|
+
rubygems_version: 2.4.5.1
|
117
134
|
signing_key:
|
118
135
|
specification_version: 4
|
119
136
|
summary: Simple Ruby on Rails WebRTC integration.
|
120
137
|
test_files: []
|
121
|
-
has_rdoc:
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'rails'
|
2
|
-
|
3
|
-
module WebrtcRails
|
4
|
-
module Generators
|
5
|
-
class InstallGenerator < Rails::Generators::Base
|
6
|
-
source_root File.expand_path("../../templates", __FILE__)
|
7
|
-
|
8
|
-
def create_events_initializer_file
|
9
|
-
js_path = File.join('app', 'assets', 'javascripts')
|
10
|
-
template 'main.js.coffee', File.join(js_path, 'webrtc_rails', 'main.js.coffee')
|
11
|
-
append_to_file File.join(js_path, 'application.js') do
|
12
|
-
out = ''
|
13
|
-
out << "\n\n// append by webrtc_rails\n"
|
14
|
-
out << "//= require webrtc_rails/main\n\n"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def create_webrtc_controller
|
19
|
-
controller_path = File.join('app', 'controllers')
|
20
|
-
template 'webrtc_controller.rb', File.join(controller_path, 'webrtc_controller.rb')
|
21
|
-
end
|
22
|
-
|
23
|
-
def add_route
|
24
|
-
route "post '/webrtc', :to => 'webrtc#send_message'"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'rails'
|
2
|
-
|
3
|
-
module WebrtcRails
|
4
|
-
module Generators
|
5
|
-
class UpdateGenerator < Rails::Generators::Base
|
6
|
-
source_root File.expand_path("../../templates", __FILE__)
|
7
|
-
|
8
|
-
def update_all_files
|
9
|
-
js_path = File.join('app', 'assets', 'javascripts')
|
10
|
-
template 'main.js.coffee', File.join(js_path, 'webrtc_rails', 'main.js.coffee')
|
11
|
-
controller_path = File.join('app', 'controllers')
|
12
|
-
template 'webrtc_controller.rb', File.join(controller_path, 'webrtc_controller.rb')
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|