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 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