Skip to content

Commit 9c268b8

Browse files
committed
fix(homebridge): log errors from stream prep
1 parent eb42f08 commit 9c268b8

File tree

1 file changed

+90
-82
lines changed

1 file changed

+90
-82
lines changed

homebridge/camera-source.ts

Lines changed: 90 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -101,94 +101,102 @@ export class CameraSource {
101101
) {
102102
this.logger.info(`Preparing Live Stream for ${this.ringCamera.name}`)
103103

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()
116169
}
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+
},
144183
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
148188
},
149189
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
153194
}
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)
166199
}
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-
})
192200
}
193201

194202
handleStreamRequest(request: any) {

0 commit comments

Comments
 (0)