UNPKG

2.8 kBtext/coffeescriptView Raw
1shims = require './shims'
2
3EventEmitter = require 'emitter'
4
5class 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
131module.exports = Call
\No newline at end of file