rtc.io-server 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,25 +1,18 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addDefaultListeners = exports.Socket = exports.Namespace = exports.Server = void 0;
4
- const socket_io_1 = require("socket.io");
5
- Object.defineProperty(exports, "Socket", { enumerable: true, get: function () { return socket_io_1.Socket; } });
6
- Object.defineProperty(exports, "Namespace", { enumerable: true, get: function () { return socket_io_1.Namespace; } });
7
- const defaulthandlers_1 = require("./lib/defaulthandlers");
8
- Object.defineProperty(exports, "addDefaultListeners", { enumerable: true, get: function () { return defaulthandlers_1.addDefaultListeners; } });
9
- const whip_whep_1 = require("./lib/whip-whep");
10
- class Server extends socket_io_1.Server {
11
- constructor(opts) {
12
- super(opts);
13
- }
14
- listen(port, opts) {
15
- const options = {
16
- rtcHttpServerPort: port || 3000,
17
- socketIoServerOptions: {},
18
- };
19
- const server = (0, whip_whep_1.whipManager)(options);
20
- this.attach(server);
21
- return this;
22
- }
23
- }
24
- exports.Server = Server;
25
- exports.default = Server;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RtcioEvents = exports.addDefaultListeners = exports.Socket = exports.Namespace = exports.Server = void 0;
4
+ const socket_io_1 = require("socket.io");
5
+ Object.defineProperty(exports, "Socket", { enumerable: true, get: function () { return socket_io_1.Socket; } });
6
+ Object.defineProperty(exports, "Namespace", { enumerable: true, get: function () { return socket_io_1.Namespace; } });
7
+ const defaulthandlers_1 = require("./lib/defaulthandlers");
8
+ Object.defineProperty(exports, "addDefaultListeners", { enumerable: true, get: function () { return defaulthandlers_1.addDefaultListeners; } });
9
+ const events_1 = require("./lib/events");
10
+ Object.defineProperty(exports, "RtcioEvents", { enumerable: true, get: function () { return events_1.RtcioEvents; } });
11
+ class Server extends socket_io_1.Server {
12
+ constructor(opts) {
13
+ super(opts);
14
+ super.on("connection", (socket) => (0, defaulthandlers_1.addDefaultListeners)(socket));
15
+ }
16
+ }
17
+ exports.Server = Server;
18
+ exports.default = Server;
@@ -1,22 +1,27 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addDefaultListeners = void 0;
4
- function rtcOfferHandler(socket, data) {
5
- socket.to(data.target).emit("#offer", data);
6
- }
7
- function rtcAnswerHandler(socket, data) {
8
- socket.to(data.target).emit("#answer", data);
9
- }
10
- function rtcCandiateHandler(socket, data) {
11
- socket.to(data.target).emit("#candidate", data);
12
- }
13
- function rtcMessageHandler(socket, data) {
14
- socket.to(data.target).emit("#rtc-message", data);
15
- }
16
- function addDefaultListeners(socket) {
17
- socket.on("#offer", (data) => rtcOfferHandler(socket, data));
18
- socket.on("#answer", (data) => rtcAnswerHandler(socket, data));
19
- socket.on("#candidate", (data) => rtcCandiateHandler(socket, data));
20
- socket.on("#rtc-message", (data) => rtcMessageHandler(socket, data));
21
- }
22
- exports.addDefaultListeners = addDefaultListeners;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addDefaultListeners = void 0;
4
+ const events_1 = require("./events");
5
+ function rtcOfferHandler(socket, data) {
6
+ socket.to(data.target).emit(events_1.RtcioEvents.OFFER, data);
7
+ }
8
+ function rtcAnswerHandler(socket, data) {
9
+ socket.to(data.target).emit(events_1.RtcioEvents.ANSWER, data);
10
+ }
11
+ function rtcCandidateHandler(socket, data) {
12
+ socket.to(data.target).emit(events_1.RtcioEvents.CANDIDATE, data);
13
+ }
14
+ function rtcMessageHandler(socket, data) {
15
+ socket.to(data.target).emit(events_1.RtcioEvents.MESSAGE, data);
16
+ }
17
+ function rtcStreamMetaHandler(socket, data) {
18
+ socket.to(data.target).emit(events_1.RtcioEvents.STREAM_META, data);
19
+ }
20
+ function addDefaultListeners(socket) {
21
+ socket.on(events_1.RtcioEvents.OFFER, (data) => rtcOfferHandler(socket, data));
22
+ socket.on(events_1.RtcioEvents.ANSWER, (data) => rtcAnswerHandler(socket, data));
23
+ socket.on(events_1.RtcioEvents.CANDIDATE, (data) => rtcCandidateHandler(socket, data));
24
+ socket.on(events_1.RtcioEvents.MESSAGE, (data) => rtcMessageHandler(socket, data));
25
+ socket.on(events_1.RtcioEvents.STREAM_META, (data) => rtcStreamMetaHandler(socket, data));
26
+ }
27
+ exports.addDefaultListeners = addDefaultListeners;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RtcioEvents = void 0;
4
+ exports.RtcioEvents = {
5
+ OFFER: "#rtcio:offer",
6
+ ANSWER: "#rtcio:answer",
7
+ CANDIDATE: "#rtcio:candidate",
8
+ MESSAGE: "#rtcio:message",
9
+ STREAM_META: "#rtcio:stream-meta",
10
+ INIT_OFFER: "#rtcio:init-offer",
11
+ };
@@ -1,2 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rtc.io-server",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "A simple rtc.io server implementation",
5
5
  "main": "dist/index.js",
6
6
  "directories": {
@@ -1,186 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.whipManager = void 0;
16
- const express_1 = __importDefault(require("express"));
17
- const http_1 = require("http");
18
- const body_parser_1 = __importDefault(require("body-parser"));
19
- const url = require("url");
20
- const cors = require("cors");
21
- const { RTCPeerConnection, RTCRtpCodecParameters, MediaStream } = require("werift");
22
- const app = (0, express_1.default)();
23
- app.use(body_parser_1.default.raw({ type: "application/sdp" }));
24
- const peerConnections = new Map();
25
- const tracks = [];
26
- const rooms = new Map();
27
- function whipManager(options = {}) {
28
- const { rtcHttpServerPort, socketIoServerOptions = {} } = options;
29
- app.use(cors());
30
- app.get("/", (req, res) => {
31
- res.status(405).end();
32
- });
33
- app.post("/:id?", (req, res) => __awaiter(this, void 0, void 0, function* () {
34
- var _a;
35
- const id = req.params.id || "";
36
- const body = req.body;
37
- const authorizationHeader = req.headers["authorization"];
38
- const servers = {
39
- iceServers: [
40
- {
41
- urls: ["stun:stun1.l.google.com:19302", "stun:stun2.l.google.com:19302"],
42
- },
43
- ],
44
- };
45
- const peerConnection = new RTCPeerConnection({
46
- codecs: {
47
- audio: [
48
- new RTCRtpCodecParameters({
49
- mimeType: "audio/opus",
50
- clockRate: 160,
51
- channels: 2,
52
- }),
53
- ],
54
- video: [
55
- new RTCRtpCodecParameters({
56
- mimeType: "video/H264",
57
- clockRate: 90000,
58
- channels: 2,
59
- rtcpFeedback: [{ type: "nack" }, { type: "nack", parameter: "pli" }, { type: "goog-remb" }],
60
- }),
61
- ],
62
- },
63
- }, servers);
64
- peerConnection.oniceconnectionstatechange = () => {
65
- console.log(`Connection state has changed: ${peerConnection.iceConnectionState}`);
66
- };
67
- if (id !== "") {
68
- //console.log("in first if")
69
- // console.log(id)
70
- if (!rooms.has(id))
71
- rooms.set(id, []);
72
- for (const track of rooms.get(id)) {
73
- // console.log("id is not null")
74
- // console.log(track.kind)
75
- peerConnection.addTransceiver(track, { direction: "sendonly" });
76
- }
77
- }
78
- else {
79
- if (!authorizationHeader) {
80
- return res.status(401).json({ error: "Authorization header missing" });
81
- }
82
- const streamRoom = ((_a = req.headers["authorization"]) === null || _a === void 0 ? void 0 : _a.split("Bearer ")[1]) || "";
83
- peerConnection.ontrack = (event) => {
84
- const track = event.track;
85
- console.log("TRACK GELDİ");
86
- //console.log("id in ontrack")
87
- //console.log(streamRoom)
88
- if (!rooms.has(streamRoom))
89
- rooms.set(streamRoom, [track]);
90
- else
91
- rooms.get(streamRoom).push(track);
92
- // console.log("check track streamID")
93
- const trackIndex = rooms.get(streamRoom).indexOf(track);
94
- track.onended = () => {
95
- console.log("TRACK ON ENDDD");
96
- rooms.get(streamRoom).splice(trackIndex, 1);
97
- };
98
- const stream = new MediaStream();
99
- stream.addTrack(track);
100
- };
101
- }
102
- const gatherComplete = new Promise((resolve) => {
103
- peerConnection.onicegatheringstatechange = (event) => {
104
- if (event.target.iceGatheringState === "complete") {
105
- resolve();
106
- }
107
- };
108
- });
109
- if (body.length > 0) {
110
- //console.log(body);
111
- const offer = { type: "offer", sdp: body.toString() };
112
- yield peerConnection.setRemoteDescription(offer);
113
- const answer = yield peerConnection.createAnswer();
114
- yield peerConnection.setLocalDescription(answer);
115
- }
116
- else {
117
- const offer = yield peerConnection.createOffer();
118
- yield peerConnection.setLocalDescription(offer);
119
- }
120
- const pcid = generateUUID();
121
- res.setHeader("Content-Type", "application/sdp");
122
- peerConnections.set(pcid, peerConnection);
123
- if (id !== "")
124
- res.status(201)
125
- .set("Content-Type", "application/sdp")
126
- .set("Access-Control-Allow-Origin", "*")
127
- .set("Access-Control-Allow-Headers", "*")
128
- .set("Location", `http://${req.headers.host}/${pcid}`)
129
- .json({ answer: peerConnection.localDescription.sdp, location: `http://${req.headers.host}/${pcid}` });
130
- else {
131
- res.status(201)
132
- .set("Content-Type", "application/sdp")
133
- .set("Access-Control-Allow-Origin", "*")
134
- .set("Access-Control-Allow-Headers", "*")
135
- .set("Location", `http://${req.headers.host}/${pcid}`)
136
- .end(peerConnection.localDescription.sdp);
137
- }
138
- //console.log("END OF REQUEST")
139
- }));
140
- app.patch("/:id", (req, res) => {
141
- if (req.get("Content-Type") !== "application/sdp") {
142
- res.status(400).end();
143
- return;
144
- }
145
- const id = req.params.id;
146
- const peerConnection = peerConnections.get(id);
147
- //console.log("patch geldi")
148
- if (!peerConnection) {
149
- // console.log("hata aldım pc yok")
150
- res.status(400).end();
151
- return;
152
- }
153
- const body = [];
154
- req.on("data", (chunk) => {
155
- body.push(chunk);
156
- }).on("end", () => __awaiter(this, void 0, void 0, function* () {
157
- const answer = { type: "answer", sdp: Buffer.concat(body).toString() };
158
- yield peerConnection.setRemoteDescription(answer);
159
- res.end();
160
- }));
161
- });
162
- app.delete("/:id", (req, res) => {
163
- const id = req.params.id;
164
- const peerConnection = peerConnections.get(id);
165
- if (!peerConnection) {
166
- res.status(404).end();
167
- return;
168
- }
169
- peerConnection.close();
170
- peerConnections.delete(id);
171
- res.end();
172
- });
173
- const server = (0, http_1.createServer)(app);
174
- server.listen(rtcHttpServerPort, () => {
175
- console.log(`RTC HTTP server listening on port ${rtcHttpServerPort}`);
176
- });
177
- return server;
178
- }
179
- exports.whipManager = whipManager;
180
- // Helper function to generate UUID
181
- function generateUUID() {
182
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
183
- const r = (Math.random() * 16) | 0, v = c === "x" ? r : (r & 0x3) | 0x8;
184
- return v.toString(16);
185
- });
186
- }