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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d7b6982702ac1ff5a8a1febe6aaea3b29113726b
4
- data.tar.gz: 4fda457eecd9ba82e3b4fc299803f91045399cd2
3
+ metadata.gz: 8c0b6f6041f627cd8c936ca0b81af0199dc41c03
4
+ data.tar.gz: 7f794a8d1d5d3ce91b43d6c0fc0b4dc7ba77be0f
5
5
  SHA512:
6
- metadata.gz: 31a1272ad27b944205ee02a68c4539d1e1d85801fdfcdd857070a25bdcaa9cb92748263c21e206bd6128fb5c5a84657f599d5eb73dcc168568344a1fa5648fec
7
- data.tar.gz: 65c89139363d3dbd212100e831685a4a960c7ac0cc610884dadb6ef032746ec969d925c10db48ee8e64f1f30e3ce8f8548618228ce4e3ebaa7ae9721eaeae3c9
6
+ metadata.gz: 2665d656620c6f168325ce82f03dddc2073ff2976ca7d9d959d6f401a758397be83a5ea56b89aa8933ad61ddd15d9348c6828d83f1eef29fbd6d27f0b84f2ab2
7
+ data.tar.gz: d91a50fd716b32a8304895be64f173d80d9cbbc1b7e5e619d57f76c1bb78fa65c6e7ce6a1d6b9ea240720f0abb32c3491efd54ae38e0d17918b7b912d5f3c182
@@ -2,7 +2,7 @@ Description:
2
2
  Explain the generator
3
3
 
4
4
  Example:
5
- rails generate webrtc_rails:update Thing
5
+ rails generate webrtc_rails:injection Thing
6
6
 
7
7
  This will create:
8
8
  what/will/it/create
@@ -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
- 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')
6
+ def add_gems
7
+ gem 'daemons-rails'
8
+ gem 'em-websocket'
21
9
  end
22
10
 
23
- def add_route
24
- route "post '/webrtc', :to => 'webrtc#send_message'"
11
+ def injection
12
+ generate 'webrtc_rails:injection'
25
13
  end
26
14
  end
27
15
  end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ results = []
3
+ Dir[File.dirname(__FILE__) + "/*_ctl"].each {|f| results << `ruby #{f} #{ARGV.first}`}
4
+ results.delete_if { |result| result.nil? || result.empty? }
5
+ puts results.join unless results.empty?
@@ -0,0 +1,6 @@
1
+ dir_mode: script
2
+ dir: ../../log
3
+ multiple: false
4
+ backtrace: true
5
+ monitor: false
6
+ ontop: false
@@ -1,46 +1,26 @@
1
1
  class @WebRTC
2
- onConnected: ->
3
- onHangedUp: ->
4
- onReconnectingStarted: ->
5
-
6
- constructor: (userID, @localOutput, @remoteOutput) ->
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
- @wsRails = new WebSocketRails(location.host + "/websocket?webrtc=true&user_identifier=" + userID)
11
- @wsRails.bind("webrtc"
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: (myUserID, remoteUserID) ->
38
- @remoteUserID = remoteUserID
17
+ connect: (remoteUserID) ->
18
+ @_remoteUserID = remoteUserID
39
19
  if !@_peerStarted && @_localStream
40
- @_sendMessage(JSON.stringify(
20
+ @_sendMessage(
41
21
  type: 'call'
42
- remoteUserID: myUserID
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
- @onHangedUp()
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
- $.ajax(
76
- type: 'POST'
77
- url: '/webrtc'
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
- text = JSON.stringify(sdp)
114
- @_sendMessage(text)
159
+ @_sendMessage(sdp)
115
160
 
116
161
  _sendCandidate: (candidate) ->
117
- text = JSON.stringify(candidate)
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
- @onReconnectingStarted()
191
+ @_reconnectPeer()
192
+ @onWebRTCReconnectingStarted()
148
193
  when 'connected', 'completed'
149
194
  if @_hangedUp
150
- @onConnected()
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 'Create Offer failed'
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
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'daemons/rails/config'
4
+
5
+ config = Daemons::Rails::Config.for_controller(File.expand_path(__FILE__))
6
+ Daemons::Rails.run config[:script], config.to_hash
@@ -1,3 +1,3 @@
1
1
  module WebrtcRails
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
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-rails'
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.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-18 00:00:00.000000000 Z
11
+ date: 2015-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: websocket-rails
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/update/USAGE
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