@koush/ring-client-api
Version:
Unofficial API for Ring doorbells, cameras, security alarm system and smart lighting
97 lines (96 loc) • 4.01 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PeerConnection = void 0;
const werift_1 = require("@koush/werift");
const rxjs_1 = require("rxjs");
const util_1 = require("./util");
const debug = false;
class PeerConnection {
constructor() {
this.onAudioRtp = new rxjs_1.Subject();
this.onAudioRtcp = new rxjs_1.Subject();
this.onVideoRtp = new rxjs_1.Subject();
this.onVideoRtcp = new rxjs_1.Subject();
this.returnAudioTrack = new werift_1.MediaStreamTrack({ kind: 'audio' });
const pc = (this.pc = new werift_1.RTCPeerConnection({
codecs: {
audio: [
new werift_1.RTCRtpCodecParameters({
mimeType: 'audio/opus',
clockRate: 48000,
channels: 2,
}),
],
video: [
new werift_1.RTCRtpCodecParameters({
mimeType: 'video/H264',
clockRate: 90000,
rtcpFeedback: [
{ type: 'transport-cc' },
{ type: 'ccm', parameter: 'fir' },
{ type: 'nack' },
{ type: 'nack', parameter: 'pli' },
{ type: 'goog-remb' },
],
parameters: 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f',
}),
],
},
})), audioTransceiver = pc.addTransceiver('audio', {
direction: 'sendrecv',
}), videoTransceiver = pc.addTransceiver('video', {
direction: 'recvonly',
});
audioTransceiver.onTrack.subscribe((track) => {
track.onReceiveRtp.subscribe((rtp) => {
this.onAudioRtp.next(rtp);
});
track.onReceiveRtcp.subscribe((rtcp) => {
this.onAudioRtcp.next(rtcp);
});
if (debug) {
track.onReceiveRtp.once(() => {
(0, util_1.logInfo)('received first audio packet');
});
}
});
videoTransceiver.onTrack.subscribe((track) => {
track.onReceiveRtp.subscribe((rtp) => {
this.onVideoRtp.next(rtp);
});
track.onReceiveRtcp.subscribe((rtcp) => {
this.onVideoRtcp.next(rtcp);
});
track.onReceiveRtp.once(() => {
if (debug) {
(0, util_1.logInfo)('received first video packet');
}
setInterval(() => videoTransceiver.receiver.sendRtcpPLI(track.ssrc), 2000);
});
});
}
createAnswer(offer) {
return __awaiter(this, void 0, void 0, function* () {
yield this.pc.setRemoteDescription(offer);
const answer = yield this.pc.createAnswer();
yield this.pc.setLocalDescription(answer);
return answer;
});
}
addIceCandidate(candidate) {
return this.pc.addIceCandidate(candidate);
}
close() {
this.pc.close().catch(util_1.logError);
}
}
exports.PeerConnection = PeerConnection;