webrtc-rails 0.1.1 → 0.1.2
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/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
|