@@ -101,94 +101,102 @@ export class CameraSource {
101
101
) {
102
102
this . logger . info ( `Preparing Live Stream for ${ this . ringCamera . name } ` )
103
103
104
- const {
105
- sessionID,
106
- targetAddress,
107
- audio : {
108
- port : audioPort ,
109
- srtp_key : audioSrtpKey ,
110
- srtp_salt : audioSrtpSalt
111
- } ,
112
- video : {
113
- port : videoPort ,
114
- srtp_key : videoSrtpKey ,
115
- srtp_salt : videoSrtpSalt
104
+ try {
105
+ const {
106
+ sessionID,
107
+ targetAddress,
108
+ audio : {
109
+ port : audioPort ,
110
+ srtp_key : audioSrtpKey ,
111
+ srtp_salt : audioSrtpSalt
112
+ } ,
113
+ video : {
114
+ port : videoPort ,
115
+ srtp_key : videoSrtpKey ,
116
+ srtp_salt : videoSrtpSalt
117
+ }
118
+ } = request ,
119
+ publicIpPromise = getPublicIp ( ) ,
120
+ [
121
+ localRingAudioPort ,
122
+ localHomeKitAudioPort ,
123
+ localRingVideoPort ,
124
+ localHomeKitVideoPort
125
+ ] = await getOpenPorts (
126
+ 4 ,
127
+ 10000 + Object . keys ( this . sessions ) . length * 20
128
+ ) ,
129
+ onRingRtpOptions = new ReplaySubject < RtpOptions > ( 1 ) ,
130
+ audioProxy = bindProxyPorts (
131
+ localRingAudioPort ,
132
+ localHomeKitAudioPort ,
133
+ audioPort ,
134
+ targetAddress ,
135
+ 'audio' ,
136
+ onRingRtpOptions
137
+ ) ,
138
+ videoProxy = bindProxyPorts (
139
+ localRingVideoPort ,
140
+ localHomeKitVideoPort ,
141
+ videoPort ,
142
+ targetAddress ,
143
+ 'video' ,
144
+ onRingRtpOptions
145
+ ) ,
146
+ sipSession = await this . ringCamera . createSipSession ( {
147
+ address : await publicIpPromise ,
148
+ audio : {
149
+ port : localRingAudioPort ,
150
+ srtpKey : audioSrtpKey ,
151
+ srtpSalt : audioSrtpSalt
152
+ } ,
153
+ video : {
154
+ port : localRingVideoPort ,
155
+ srtpKey : videoSrtpKey ,
156
+ srtpSalt : videoSrtpSalt
157
+ }
158
+ } ) ,
159
+ rtpOptions = await sipSession . getRemoteRtpOptions ( )
160
+
161
+ onRingRtpOptions . next ( rtpOptions )
162
+
163
+ this . sessions [ hap . UUIDGen . unparse ( sessionID ) ] = {
164
+ sipSession,
165
+ stop : ( ) => {
166
+ sipSession . stop ( )
167
+ audioProxy . stop ( )
168
+ videoProxy . stop ( )
116
169
}
117
- } = request ,
118
- publicIpPromise = getPublicIp ( ) ,
119
- [
120
- localRingAudioPort ,
121
- localHomeKitAudioPort ,
122
- localRingVideoPort ,
123
- localHomeKitVideoPort
124
- ] = await getOpenPorts ( 4 , 10000 + Object . keys ( this . sessions ) . length * 20 ) ,
125
- onRingRtpOptions = new ReplaySubject < RtpOptions > ( 1 ) ,
126
- audioProxy = bindProxyPorts (
127
- localRingAudioPort ,
128
- localHomeKitAudioPort ,
129
- audioPort ,
130
- targetAddress ,
131
- 'audio' ,
132
- onRingRtpOptions
133
- ) ,
134
- videoProxy = bindProxyPorts (
135
- localRingVideoPort ,
136
- localHomeKitVideoPort ,
137
- videoPort ,
138
- targetAddress ,
139
- 'video' ,
140
- onRingRtpOptions
141
- ) ,
142
- sipSession = await this . ringCamera . createSipSession ( {
143
- address : await publicIpPromise ,
170
+ }
171
+
172
+ this . logger . info ( `Waiting for stream data from ${ this . ringCamera . name } ` )
173
+ const audioSsrc = await audioProxy . onSsrc . pipe ( take ( 1 ) ) . toPromise ( )
174
+ const videoSsrc = await videoProxy . onSsrc . pipe ( take ( 1 ) ) . toPromise ( )
175
+ this . logger . info ( `Received stream data from ${ this . ringCamera . name } ` )
176
+
177
+ const currentAddress = ip . address ( )
178
+ callback ( {
179
+ address : {
180
+ address : currentAddress ,
181
+ type : ip . isV4Format ( currentAddress ) ? 'v4' : 'v6'
182
+ } ,
144
183
audio : {
145
- port : localRingAudioPort ,
146
- srtpKey : audioSrtpKey ,
147
- srtpSalt : audioSrtpSalt
184
+ port : localHomeKitAudioPort ,
185
+ ssrc : audioSsrc ,
186
+ srtp_key : rtpOptions . audio . srtpKey ,
187
+ srtp_salt : rtpOptions . audio . srtpSalt
148
188
} ,
149
189
video : {
150
- port : localRingVideoPort ,
151
- srtpKey : videoSrtpKey ,
152
- srtpSalt : videoSrtpSalt
190
+ port : localHomeKitVideoPort ,
191
+ ssrc : videoSsrc ,
192
+ srtp_key : rtpOptions . video . srtpKey ,
193
+ srtp_salt : rtpOptions . video . srtpSalt
153
194
}
154
- } ) ,
155
- rtpOptions = await sipSession . getRemoteRtpOptions ( )
156
-
157
- onRingRtpOptions . next ( rtpOptions )
158
-
159
- this . sessions [ hap . UUIDGen . unparse ( sessionID ) ] = {
160
- sipSession,
161
- stop : ( ) => {
162
- sipSession . stop ( )
163
- audioProxy . stop ( )
164
- videoProxy . stop ( )
165
- }
195
+ } )
196
+ } catch ( e ) {
197
+ this . logger . error ( `Failed to prepare stream for ${ this . ringCamera . name } ` )
198
+ this . logger . error ( e )
166
199
}
167
-
168
- this . logger . info ( `Waiting for stream data from ${ this . ringCamera . name } ` )
169
- const audioSsrc = await audioProxy . onSsrc . pipe ( take ( 1 ) ) . toPromise ( )
170
- const videoSsrc = await videoProxy . onSsrc . pipe ( take ( 1 ) ) . toPromise ( )
171
- this . logger . info ( `Received stream data from ${ this . ringCamera . name } ` )
172
-
173
- const currentAddress = ip . address ( )
174
- callback ( {
175
- address : {
176
- address : currentAddress ,
177
- type : ip . isV4Format ( currentAddress ) ? 'v4' : 'v6'
178
- } ,
179
- audio : {
180
- port : localHomeKitAudioPort ,
181
- ssrc : audioSsrc ,
182
- srtp_key : rtpOptions . audio . srtpKey ,
183
- srtp_salt : rtpOptions . audio . srtpSalt
184
- } ,
185
- video : {
186
- port : localHomeKitVideoPort ,
187
- ssrc : videoSsrc ,
188
- srtp_key : rtpOptions . video . srtpKey ,
189
- srtp_salt : rtpOptions . video . srtpSalt
190
- }
191
- } )
192
200
}
193
201
194
202
handleStreamRequest ( request : any ) {
0 commit comments