UNPKG

@bengreenier/krtp

Version:

Node implementation of rdp protocol. RFC 3550

97 lines (96 loc) 3.99 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); /* * +=============================================== * | Author: Parham Alvani (parham.alvani@gmail.com) * | Modified by: Ben Greenier (ben@bengreenier.com) * | * | Creation Date: 01-06-2017 * | * | File Name: session.ts * +=============================================== */ const crypto_1 = require("crypto"); const events_1 = require("events"); const Packet_1 = require("./Packet"); const Control_1 = require("./Control"); /** * RTP session: An association among a set of participants * communicating with RTP. */ class Session extends events_1.EventEmitter { /** * Creates a RTP session * @param port - RTP port * @param packetType - RTP packet type: This field identifies the format of the RTP * payload and determines its interpretation by the application. */ constructor(port, socketFactory, packetType = 95) { super(); this.port = port; this.packetType = packetType; this.timestamp = (Date.now() / 1000) | 0; this._sequenceNumber = crypto_1.randomBytes(2).readUInt16BE(0); this.ssrc = crypto_1.randomBytes(4).readUInt32BE(0); this._packetCount = 0; this._octetCount = 0; this.socket = socketFactory.createSocket(); this.socket.on("message", (msg, rinfo) => { this.emit("message", Packet_1.Packet.deserialize(msg), rinfo); }); this.socket.bind(this.port); this.controlSocket = socketFactory.createSocket(); this.controlSocket.bind(this.port + 1); } get sequenceNumber() { return this._sequenceNumber; } get packetCount() { return this._packetCount; } get octetCount() { return this._octetCount; } sendSR(address = "127.0.0.1", timestamp = ((Date.now() / 1000) | 0) - this.timestamp) { return __awaiter(this, void 0, void 0, function* () { const packet = new Control_1.ControlSR(this._packetCount, this._octetCount, this.ssrc, timestamp); return new Promise((resolve, reject) => { this.controlSocket.send(packet.serialize(), this.port + 1, address, err => { if (err) { return reject(err); } return resolve(); }); }); }); } send(payload, address = "127.0.0.1", timestamp = ((Date.now() / 1000) | 0) - this.timestamp) { return __awaiter(this, void 0, void 0, function* () { const packet = new Packet_1.Packet(payload, this._sequenceNumber, this.ssrc, timestamp, this.packetType); this._sequenceNumber = (this._sequenceNumber + 1) % (1 << 16); this._packetCount += 1; this._octetCount += payload.length; return new Promise((resolve, reject) => { this.socket.send(packet.serialize(), this.port, address, err => { if (err) { return reject(err); } return resolve(); }); }); }); } close() { this.socket.close(); this.controlSocket.close(); } } exports.Session = Session;