1 | shims = require './shims'
|
2 |
|
3 | EventEmitter = require 'emitter'
|
4 |
|
5 | class Call extends EventEmitter
|
6 | constructor: (@parent, @user, @isCaller) ->
|
7 | @startTime = new Date
|
8 | @socket = @parent.ssocket
|
9 |
|
10 | @pc = @createConnection()
|
11 | if @isCaller
|
12 | @socket.write
|
13 | type: "offer"
|
14 | to: @user
|
15 | @emit "calling"
|
16 |
|
17 | @parent.on "answer.#{@user}", (accepted) =>
|
18 | return @emit "rejected" unless accepted
|
19 | @emit "answered"
|
20 | @initSDP()
|
21 |
|
22 | @parent.on "candidate.#{@user}", (candidate) =>
|
23 | @pc.addIceCandidate new shims.IceCandidate candidate
|
24 |
|
25 | @parent.on "sdp.#{@user}", (desc) =>
|
26 | desc.sdp = shims.processSDPIn desc.sdp
|
27 | err = (e) -> throw e
|
28 | succ = =>
|
29 | @initSDP() unless @isCaller
|
30 | @emit "sdp"
|
31 | @pc.setRemoteDescription new shims.SessionDescription(desc), succ, err
|
32 |
|
33 | @parent.on "hangup.#{@user}", =>
|
34 | @emit "hangup"
|
35 |
|
36 | @parent.on "chat.#{@user}", (msg) =>
|
37 | @emit "chat", msg
|
38 |
|
39 | createConnection: ->
|
40 | pc = new shims.PeerConnection shims.PeerConnConfig, shims.constraints
|
41 | pc.onconnecting = =>
|
42 | @emit 'connecting'
|
43 | return
|
44 | pc.onopen = =>
|
45 | @emit 'connected'
|
46 | return
|
47 | pc.onicecandidate = (evt) =>
|
48 | if evt.candidate
|
49 | @socket.write
|
50 | type: "candidate"
|
51 | to: @user
|
52 | args:
|
53 | candidate: evt.candidate
|
54 | return
|
55 |
|
56 | pc.onaddstream = (evt) =>
|
57 | @remoteStream = evt.stream
|
58 | @_ready = true
|
59 | @emit "ready", @remoteStream
|
60 | return
|
61 | pc.onremovestream = (evt) =>
|
62 | console.log "removestream", evt
|
63 | return
|
64 |
|
65 | return pc
|
66 |
|
67 | addStream: (s) ->
|
68 | @pc.addStream s
|
69 | return @
|
70 |
|
71 | ready: (fn) ->
|
72 | if @_ready
|
73 | fn @remoteStream
|
74 | else
|
75 | @once 'ready', fn
|
76 | return @
|
77 |
|
78 | duration: ->
|
79 | s = @endTime.getTime() if @endTime?
|
80 | s ?= Date.now()
|
81 | e = @startTime.getTime()
|
82 | return (s-e)/1000
|
83 |
|
84 | chat: (msg) ->
|
85 | @parent.chat @user, msg
|
86 | return @
|
87 |
|
88 | answer: ->
|
89 | @startTime = new Date
|
90 | @socket.write
|
91 | type: "answer"
|
92 | to: @user
|
93 | args:
|
94 | accepted: true
|
95 | return @
|
96 |
|
97 | decline: ->
|
98 | @socket.write
|
99 | type: "answer"
|
100 | to: @user
|
101 | args:
|
102 | accepted: false
|
103 | return @
|
104 |
|
105 | end: ->
|
106 | @endTime = new Date
|
107 | try
|
108 | @pc.close()
|
109 | @socket.write
|
110 | type: "hangup"
|
111 | to: @user
|
112 | @emit "hangup"
|
113 | return @
|
114 |
|
115 | initSDP: ->
|
116 | done = (desc) =>
|
117 | desc.sdp = shims.processSDPOut desc.sdp
|
118 | @pc.setLocalDescription desc
|
119 | @socket.write
|
120 | type: "sdp"
|
121 | to: @user
|
122 | args: desc
|
123 |
|
124 | err = (e) -> throw e
|
125 |
|
126 | return @pc.createOffer done, err, shims.constraints if @isCaller
|
127 | return @pc.createAnswer done, err, shims.constraints if @pc.remoteDescription
|
128 | @once "sdp", =>
|
129 | @pc.createAnswer done, err
|
130 |
|
131 | module.exports = Call |
\ | No newline at end of file |