diff --git a/Source/IPC.js b/Source/IPC.js
index 1f0aa0f..48a15a6 100644
--- a/Source/IPC.js
+++ b/Source/IPC.js
@@ -5,7 +5,7 @@ process.on('message',data => {
switch(data.type)
{
case "CLIENT_CREATED":{
- slog("CLIENT_CREATED");
+ //slog("CLIENT_CREATED");
let client = new Client();
client.isProxy = true;
client.proxyProcess = data.pid;
@@ -22,7 +22,7 @@ process.on('message',data => {
data.value = transformDeserialization(data.value, data.typing);
- slog("CLIENT_UPDATE_PROP");
+ //slog("CLIENT_UPDATE_PROP");
let client = Client.clients.get(data.uuid);
client[data.name] = data.value;
break;
@@ -44,7 +44,7 @@ process.on('message',data => {
break;
}
case "CLIENT_DESTROY":{
- slog("CLIENT_DESTROY");
+ //slog("CLIENT_DESTROY");
if(Client.clients.has(data.uuid))
{
Client.clients.delete(data.uuid);
@@ -54,7 +54,7 @@ process.on('message',data => {
break;
}
case "ROOM_CREATED":{
- slog("ROOM_CREATED");
+ //slog("ROOM_CREATED");
let room = Room.fromJSON(data.value);
Room.rooms.set(room.id, room);
break;
@@ -64,13 +64,13 @@ process.on('message',data => {
data.value = transformDeserialization(data.value, data.typing);
- slog("ROOM_UPDATE_PROP");
+ //slog("ROOM_UPDATE_PROP");
let room = Room.rooms.get(data.uuid);
room[data.name] = data.value;
break;
}
case "ROOM_JOIN_CLIENT":{
- slog("ROOM_JOIN_CLIENT");
+ //slog("ROOM_JOIN_CLIENT");
let room = Room.rooms.get(data.uuid);
let client = Client.clients.get(data.client);
if(room && client)
@@ -81,7 +81,7 @@ process.on('message',data => {
break;
}
case "ROOM_EJECT_CLIENT":{
- slog("ROOM_EJECT_CLIENT");
+ //slog("ROOM_EJECT_CLIENT");
let room = Room.rooms.get(data.uuid);
let client = Client.clients.get(data.client);
if(room && client)
@@ -92,7 +92,7 @@ process.on('message',data => {
break;
}
case "ROOM_DESTROY":{
- slog("ROOM_DESTROY");
+ //slog("ROOM_DESTROY");
Room.rooms.delete(data.value);
break;
}
diff --git a/frontend/P2PFileSender.ts b/frontend/P2PFileSender.ts
index 87eeb50..98ec1af 100644
--- a/frontend/P2PFileSender.ts
+++ b/frontend/P2PFileSender.ts
@@ -1,8 +1,9 @@
import WebRTC from "./WebRTC";
import Peer from "./Peer";
-
-
+/**
+ * Deneyseldir kullanılması önerilmez
+ */
export default class P2PFileSender
{
public rtc : RTCPeerConnection;
diff --git a/frontend/WebRTC.ts b/frontend/WebRTC.ts
index dc4469a..e89933a 100644
--- a/frontend/WebRTC.ts
+++ b/frontend/WebRTC.ts
@@ -31,7 +31,7 @@ export default class WebRTC
rtcpMuxPolicy:"require",
};
- public isPolite() : boolean
+ private isPolite() : boolean
{
let myId = this.peer?.mwse.peer('me').socketId as string;
let peerId = this.peer?.socketId as string;
diff --git a/public/core.js b/public/core.js
new file mode 100644
index 0000000..8f55431
--- /dev/null
+++ b/public/core.js
@@ -0,0 +1,25 @@
+import "./studio/window.js";
+import { InputDevicesWindow } from "./studio/InputDevices.js";
+import { Rooms } from "./studio/Rooms.js";
+
+let mwse = new MWSE({
+ endpoint: "ws://localhost:7707"
+});
+
+mwse.scope(beginEngine);
+
+async function beginEngine()
+{
+ let me = await mwse.virtualPressure.allocAPIPAddress();
+ $(".network-id").text(me);
+}
+
+window.openInputDevicesWindow = () => {
+ InputDevicesWindow.toggle();
+ InputDevicesWindow.bringToFront();
+};
+
+window.openRoomsWindow = () => {
+ Rooms.toggle();
+ Rooms.bringToFront();
+};
\ No newline at end of file
diff --git a/public/studio.html b/public/studio.html
new file mode 100644
index 0000000..6843e9f
--- /dev/null
+++ b/public/studio.html
@@ -0,0 +1,86 @@
+
+
+
+
+
+ MWSE UI 24.3 Studio
+
+
+
+
+
+
+
+
+ MWSE UI 24.3
+
+
+
+ Ağ Adresiniz
+
+ #.#.#.#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/studio/InputDevices.js b/public/studio/InputDevices.js
new file mode 100644
index 0000000..9534ee4
--- /dev/null
+++ b/public/studio/InputDevices.js
@@ -0,0 +1,398 @@
+import DWindow from "./window.js";
+import { AddCell, FilterCell, memory, RemoveCell } from "./sdb.js";
+
+export const InputDevicesWindow = new class InputDevicesWindow extends DWindow{
+ constructor(){
+ super();
+ this.initContent();
+ this.headtext.text("Giriş Aygıtları");
+ this.hide();
+ this.panel.css("min-width","640px");
+ this.panel.css("min-height","250px");
+ this.panel.css("width","max-content");
+ this.initEvent();
+ }
+ /**
+ * @type {JQuery}
+ */
+ table = null;
+ initContent(){
+ this.table = $(`
+
+
+
+ | Cihaz Türü |
+ Sağlanan Kanallar |
+ Akış ID |
+ |
+
+
+
+
+
+
+ |
+
+ |
+
+
+
+ `);
+
+ this.updateDevices();
+
+ this.content.append(this.table);
+ }
+ initEvent(){
+ this.content.find(".newdevice").on('click', this.generateDevice.bind(this));
+ this.addEventListener("close",()=>{
+ this.hide();
+ })
+ }
+ updateDevices(){
+ let tbody = this.table.find("tbody");
+ tbody.text('');
+ for (const cell of FilterCell("rawstream", () => true))
+ {
+ let tr = $(`
+
+ | ${cell.source} |
+ ${cell.kind} |
+ ${cell.payload.id} |
+
+
+
+ |
+
+ `);
+ tr.attr("data-declare", cell.payload.id);
+ cell.addEventListener("stop",() => tr.remove());
+ tbody.append(tr);
+ }
+ tbody.find(".action-view").on('click', e => this.viewSource($(e.target)));
+ tbody.find(".action-close").on('click', e => this.closeSource($(e.target)));
+ }
+ closeSource(btn){
+ let streamid = btn.closest("tr").attr("data-declare");
+ for (const brain of FilterCell("rawstream",e => e.payload.id == streamid)) {
+ brain.stop();
+ }
+ }
+ viewSource(btn){
+ let streamid = btn.closest("tr").attr("data-declare");
+ /**
+ * @type {MediaStream}
+ */
+ let p = null;
+ for (const rawstream of FilterCell("rawstream",e => e.payload.id == streamid)) {
+ p = rawstream.payload;
+ }
+
+ let modal = new ViewSourceDialog(p.getTracks()[0]);
+ modal.enableDialog(this);
+ modal.bringToFront();
+ }
+ generateDevice(){
+ let modal = new AddDeviceDialog();
+ modal.enableDialog(this);
+ modal.bringToFront();
+ modal.addEventListener("stream:added",()=>{
+ this.updateDevices();
+ });
+ }
+}
+
+class StreamRecord extends EventTarget {
+ lockedby = 0;
+ stop(){
+ this.payload.getTracks().forEach(e => e.stop());
+ this.dispatchEvent(new Event("stop"));
+ }
+ isLocked(){
+ return this.lockedby != 0;
+ }
+ lock(){
+ this.lockedby++;
+ }
+ unlock(){
+ this.lockedby--;
+ }
+}
+
+class AddDeviceDialog extends DWindow {
+ constructor(){
+ super();
+ this.initContent();
+ this.headtext.text("Aygıt Ekleme Sihirbazı");
+ this.addEventListener('close',()=>{
+ this.disableDialog();
+ this.exit();
+ })
+ }
+ initContent(){
+ let table = $(`
+
+
+
+
+
+
+
+
+
+ `);
+
+ table.find(".action-sdcam").on("click",this.sdcam.bind(this));
+ table.find(".action-hdcam").on("click",this.hdcam.bind(this));
+ table.find(".action-mic").on("click",this.mic.bind(this));
+ table.find(".action-displaycam").on("click",this.displaycam.bind(this));
+ this.content.append(table);
+ }
+
+ async sdcam(){
+ let stream = await navigator.mediaDevices.getUserMedia({
+ video: {
+ advanced: [
+ { width: { exact: 640 } },
+ { width: { exact: 320 } },
+ { width: { exact: 240 } }
+ ],
+ facingMode: "user"
+ }
+ });
+
+ AddCell("rawstream", new class extends StreamRecord {
+ source = "Kamera";
+ kind = "Görüntü";
+ payload = stream;
+ constructor(){
+ super();
+ this.onEnded(() => {
+ this.dispatchEvent(new Event("stop"));
+ })
+ this.addEventListener("stop",() => {
+ RemoveCell("rawstream",cell => {
+ return cell.payload.id == stream.id
+ })
+ })
+ }
+ onEnded(event){
+ /** @type {MediaStreamTrack} */
+ let track;
+ stream.getVideoTracks().forEach(e => track = e);
+ if(track)
+ {
+ track.addEventListener("ended",event);
+ }
+ }
+ });
+ this.dispatchEvent(new Event("stream:added"));
+ this.disableDialog();
+ this.exit();
+ }
+ async hdcam(){
+ let stream = await navigator.mediaDevices.getUserMedia({
+ video: {
+ advanced: [
+ { width: { exact: 1920 } },
+ { width: { exact: 1600 } },
+ { width: { exact: 1366 } },
+ { width: { exact: 1280 } },
+ { width: { exact: 1024 } },
+ { width: { exact: 900 } },
+ { width: { exact: 800 } },
+ { width: { exact: 640 } },
+ { width: { exact: 320 } },
+ { width: { exact: 240 } }
+ ],
+ facingMode: "user"
+ }
+ });
+ AddCell("rawstream", new class extends StreamRecord {
+ source = "Kamera";
+ kind = "Görüntü";
+ payload = stream;
+ constructor(){
+ super();
+ this.onEnded(() => {
+ this.dispatchEvent(new Event("stop"));
+ })
+ this.addEventListener("stop",() => {
+ RemoveCell("rawstream",cell => {
+ return cell.payload.id == stream.id
+ })
+ })
+ }
+ onEnded(event){
+ /** @type {MediaStreamTrack} */
+ let track;
+ stream.getVideoTracks().forEach(e => track = e);
+ if(track)
+ {
+ track.addEventListener("ended",event);
+ }
+ }
+ });
+ this.dispatchEvent(new Event("stream:added"));
+ this.disableDialog();
+ this.exit();
+ }
+ async mic(){
+ let stream = await navigator.mediaDevices.getUserMedia({
+ audio: true
+ });
+ AddCell("rawstream", new class extends StreamRecord {
+ source = "Kamera";
+ kind = "Ses";
+ payload = stream;
+ constructor(){
+ super();
+ this.onEnded(() => {
+ this.dispatchEvent(new Event("stop"));
+ })
+ this.addEventListener("stop",() => {
+ RemoveCell("rawstream",cell => {
+ return cell.payload.id == stream.id
+ })
+ })
+ }
+ onEnded(event){
+ /** @type {MediaStreamTrack} */
+ let track;
+ stream.getAudioTracks().forEach(e => track = e);
+ if(track)
+ {
+ track.addEventListener("ended",event);
+ }
+ }
+ });
+ this.dispatchEvent(new Event("stream:added"));
+ this.disableDialog();
+ this.exit();
+ }
+ async displaycam(){
+ let stream = await navigator.mediaDevices.getDisplayMedia({
+ video: true
+ });
+ AddCell("rawstream", new class extends StreamRecord{
+ source = "Ekran";
+ kind = "Görüntü";
+ payload = stream;
+ constructor(){
+ super();
+ this.onEnded(() => {
+ this.dispatchEvent(new Event("stop"));
+ })
+ this.addEventListener("stop",() => {
+ RemoveCell("rawstream",cell => {
+ return cell.payload.id == stream.id
+ })
+ })
+ }
+ onEnded(event){
+ /** @type {MediaStreamTrack} */
+ let track;
+ stream.getTracks().forEach(e => track = e);
+ if(track)
+ {
+ track.addEventListener("ended",event);
+ }
+ }
+ });
+ this.dispatchEvent(new Event("stream:added"));
+ this.disableDialog();
+ this.exit();
+ }
+}
+class ViewSourceDialog extends DWindow {
+ /**
+ * @type {MediaStreamTrack}
+ */
+ track = null;
+ extra = {};
+ constructor(track){
+ super();
+ this.headtext.text("Giriş Kaynağı Görüntüleme");
+ this.addEventListener('close',()=>{
+ this.disableDialog();
+ this.exit();
+ })
+ this.track = track;
+ this.initContent();
+ }
+ initContent(){
+ if(this.track.kind == "video")
+ {
+ this.initVideoContent();
+ }else{
+ this.initAudioContent();
+ }
+ this.table = $(`
+
+
+ | Track ID |
+ ${this.track.id} |
+
+
+ | Data Type |
+ ${this.track.kind} |
+
+
+ | Status |
+ ${this.track.enabled ? "Active" : "Passive"} |
+
+
+ | Track Label |
+ ${this.track.label} |
+
+
+
`);
+ this.content.append(this.table);
+ }
+ initVideoContent(){
+ let player = $(``);
+ let stream = new MediaStream();
+ stream.addTrack(this.track);
+ player.on('canplay', e => e.target.play());
+ player.get(0).srcObject = stream;
+ this.content.append(player);
+ player.on('play', e => {
+ this.table.find("tbody").append(`
+
+ | Video Width |
+ ${e.target.videoWidth}px |
+
+ `);
+ this.table.find("tbody").append(`
+
+ | Video Height |
+ ${e.target.videoHeight}px |
+
+ `);
+ });
+ }
+ initAudioContent(){
+ let player = $(``);
+ let stream = new MediaStream();
+ stream.addTrack(this.track);
+ player.get(0).srcObject = stream;
+ player.on('canplay', e => e.target.play());
+ this.content.append(player);
+ }
+}
\ No newline at end of file
diff --git a/public/studio/Rooms.js b/public/studio/Rooms.js
new file mode 100644
index 0000000..d9792ff
--- /dev/null
+++ b/public/studio/Rooms.js
@@ -0,0 +1,65 @@
+import DWindow from "./window.js";
+import { AddCell, FilterCell, memory, RemoveCell } from "./sdb.js";
+
+export const Rooms = new class Rooms extends DWindow{
+ constructor(){
+ super();
+ this.emptyConnect();
+ this.headtext.text("MWSE Ağları");
+ this.hide();
+ this.panel.css("min-width","640px");
+ this.addEventListener("close",()=>{
+ this.hide();
+ })
+ }
+ emptyConnect(){
+ this.content.append($(`
+ MWSE Ağları
+ `),$(`
+ Herhangi bir ağa bağlı değilsiniz
+ `));
+
+
+ this.content.append($(`
+
+ Ağ Oluştur
+
+ `));
+
+ let createinput = $(`
+
+ `);
+
+ let createbutton = $(`
+
+ `);
+
+ this.content.append(createinput,createbutton);
+
+ this.content.append($(`
+
+ Ağa Katıl
+
+ `));
+
+ let joininput = $(`
+
+ `);
+
+
+ let joinbutton = $(`
+
+ `);
+ this.content.append(joininput,joinbutton);
+
+ this.content.append($(`
+
+ Aynı ağdaki kullanıcılar birbirini görecek ve akışlarını paylaşabilecektir.
+ Verilerinizi, bilgilerinizi ve akışlarınızı paylaşmakta tamamen özgürsünüz.
+ Sistem tamamen deneysel teknoloji araştırma ve geliştirme üzerine kuruludur.
+ Sistem kullanılarak yapılan tüm iyi ve kötü amaçlı eylemlerden kullanıcı sorumludur.
+
+ `));
+
+ }
+}
\ No newline at end of file
diff --git a/public/studio/background.jpg b/public/studio/background.jpg
new file mode 100644
index 0000000..71a9b7a
Binary files /dev/null and b/public/studio/background.jpg differ
diff --git a/public/studio/cssom.js b/public/studio/cssom.js
new file mode 100644
index 0000000..68901ba
--- /dev/null
+++ b/public/studio/cssom.js
@@ -0,0 +1,162 @@
+const style = document.createElement("style");
+document.head.appendChild(style);
+
+export default class CSSOM {
+ /** @type {Map} */
+ static rules = new Map();
+ /** @type {Map} */
+ static cRules = new Map();
+ /**
+ * @returns {CSSOM}
+ */
+ static get(name){
+ return CSSOM.rules.get(name);
+ }
+ /** @returns {CSSRule} */
+ static findRule(selector){
+ for (let ruleIndex = 0; ruleIndex < style.sheet.cssRules.length; ruleIndex++)
+ {
+ let rule = style.sheet.cssRules.item(ruleIndex);
+ if(rule.selectorText == selector)
+ {
+ return rule;
+ }
+ }
+ }
+ /** @returns {CSSRule} */
+ static removeRule(selector){
+ for (let ruleIndex = 0; ruleIndex < style.sheet.cssRules.length; ruleIndex++)
+ {
+ let rule = style.sheet.cssRules.item(ruleIndex);
+ if(rule.selectorText == selector)
+ {
+ style.sheet.deleteRule(ruleIndex);
+ }
+ }
+ }
+ static css(selector, values){
+ let rule;
+ if(!(rule = CSSOM.findRule(selector)))
+ {
+ let no = style.sheet.insertRule(`${selector}{}`);
+ rule = style.sheet.cssRules[no];
+ }
+
+ for(let [stylename, stylevalue] of Object.entries(values))
+ {
+ let name = stylename;
+ let value = typeof stylevalue == "string" ? stylevalue.split('!')[0] : stylevalue;
+ let priority = typeof stylevalue == "string" ? (stylevalue.split('!')[1] == "important" ? "important" : void 0) : void 0;
+
+
+ name = name.replace(/([A-Z])/g,(_,$1) => '-' + $1.toLowerCase());
+
+ rule.style.setProperty(name, value, priority);
+ }
+ }
+ static generate(idd = null, css = null){
+ let id = idd || CSSOM.generateCode();
+ let t = new CSSOM(id);
+ CSSOM.rules.set(t.id,t);
+ css && t.css(css);
+ return t;
+ }
+ static generateCode(){
+ let mine;
+ do{
+ mine = Math.random().toString(36).slice(2,6);
+ }while(CSSOM.rules.has(mine));
+ return "i" + mine;
+ }
+
+ id = "";
+ /** @type {{[key:string]: CSSRuleList}} */
+ rule_t = {};
+ constructor(id){
+ this.id = id;
+ }
+ toString(){
+ return this.id;
+ }
+ css(name, value, prefix = 'owner'){
+ let rule;
+ if(!this.rule_t[prefix])
+ {
+ let rulename = `.${this.id}` + (prefix == "owner" ? "" : prefix);
+ let no = style.sheet.insertRule(`${rulename}{}`);
+ this.rule_t[prefix] = style.sheet.cssRules[no];
+ };
+ rule = this.rule_t[prefix];
+ if(value === undefined && typeof name == "string")
+ {
+ return rule.style.getPropertyValue(name);
+ }
+ if(value === null)
+ {
+ rule.style.removeProperty(name, value);
+ }else{
+ if(typeof name == "object")
+ {
+ for(let [stylename, stylevalue] of Object.entries(name))
+ {
+ let name = stylename;
+ let value = typeof stylevalue == "string" ? stylevalue.split('!')[0] : stylevalue;
+ let priority = typeof stylevalue == "string" ? (stylevalue.split('!')[1] == "important" ? "!important" : void 0) : stylevalue;
+ if(name.indexOf('-') == -1)
+ {
+ rule.style[name] = value + (priority || "");
+ }else{
+ rule.style.setProperty(name, value, priority);
+ }
+ }
+ }else{
+ rule.style.setProperty(name, value);
+ }
+ }
+ return this;
+ }
+}
+
+$.fn.cssom = function(obj, prefix){
+ if(prefix === void 0 || (typeof obj == "object" && typeof prefix == "string"))
+ {
+ let cssom;
+ if(this.attr("data-cssom"))
+ {
+ let name = this.attr("data-cssom");
+ cssom = CSSOM.get(name)
+ }else{
+ cssom = CSSOM.generate();
+ this.addClass(cssom.id);
+ this.attr("data-cssom", cssom.id);
+ }
+ cssom.css(obj,void 0,prefix);
+ }else{
+
+ if(obj.indexOf(":") == -1){
+ this.addClass(obj);
+ CSSOM.css("." + obj, prefix);
+ }else{
+
+ let [_class,_psudio] = obj.split(":");
+
+ this.addClass(_class);
+ CSSOM.css("." + _class + ":" + _psudio, prefix);
+ }
+ }
+ return this;
+};
+
+window.debugCssom = function(){
+ for (let ruleIndex = 0; ruleIndex < style.sheet.cssRules.length; ruleIndex++)
+ {
+ let rule = style.sheet.cssRules.item(ruleIndex);
+ console.log(rule.cssText)
+ }
+};
+window.cssom = CSSOM;
+/*
+
+
+
+*/
\ No newline at end of file
diff --git a/public/studio/sdb.js b/public/studio/sdb.js
new file mode 100644
index 0000000..78f1516
--- /dev/null
+++ b/public/studio/sdb.js
@@ -0,0 +1,44 @@
+/**
+ * @ typedef {Object} BirthData
+ * @ property {Date} birthDate
+ */
+/**
+ * @typedef {Object} BrainCell
+ * @property {string} type
+ * @property {Object} data
+ */
+/**
+ * @type {BrainCell[]}
+ */
+export let memory = [];
+
+export function AddCell(name, data)
+{
+ memory.push({
+ type: name,
+ data
+ });
+};
+/**
+ * @param {string} type
+ * @param {(BrainCell) => boolean} filterQuery
+ */
+export function RemoveCell(type, filterQuery)
+{
+ memory = memory.filter(e => !(
+ e.type == type && filterQuery(e.data)
+ ));
+};
+
+/**
+ * @param {string} type
+ * @param {(BrainCell) => boolean} filterQuery
+ */
+export function FilterCell(type, filterQuery)
+{
+ return memory.filter(e =>
+ e.type == type && filterQuery(e.data)
+ ).map(e => e.data);
+};
+
+window.memoryDump = () => memory;
\ No newline at end of file
diff --git a/public/studio/window.js b/public/studio/window.js
new file mode 100644
index 0000000..e7c9316
--- /dev/null
+++ b/public/studio/window.js
@@ -0,0 +1,293 @@
+export default class DWindow extends EventTarget {
+ static allWindows = []; // açık pencereler
+ static zCounter = 1; // global sayaç
+ static normalizeThreshold = 9999; // yeniden sıfırlama eşiği
+ /** @type {JQuery} */ panel = null;
+ /** @type {JQuery} */ title = null;
+ /** @type {JQuery} */ content = null;
+ /** @type {JQuery} */ headtext = null;
+
+ constructor() {
+ super();
+ this.initpanel();
+ this.enableFocus();
+ DWindow.allWindows.push(this);
+ this.bringToFront();
+ requestAnimationFrame(()=>{
+ this.enableDragging();
+ this.enableResize();
+ })
+ }
+ activeDragging = true;
+ activeResizing = true;
+
+ initpanel() {
+ this.panel = $(``).css({
+ width: 450,
+ //height: 500,
+ position: "fixed",
+ left: (Math.random() * 300 | 0) + 100,
+ top: (Math.random() * 100 | 0) + 100,
+ boxShadow: "black 0px 0px 20px -10px",
+ borderRadius: "10px",
+ backgroundColor: "#3333335b",
+ backdropFilter: "blur(3px)",
+ border: "solid 1px #a2a2a2",
+ display: "flex",
+ flexDirection: "column",
+ outlineOffset: "-5px",
+ //overflow: "hidden",
+ userSelect: "none",
+ minWidth: "max-content",
+ minHeight: "max-content"
+ });
+ $("body").append(this.panel);
+
+ this.title = $(``).css({
+ display: "flex",
+ flex: "0 0 auto",
+ flexDirection: "row",
+ lineHeight: "2em",
+ backgroundColor: "#333333",
+ color: "white",
+ paddingLeft: "10px",
+ cursor: "move",
+ borderTopLeftRadius: "10px",
+ borderTopRightRadius: "10px",
+ });
+
+ this.content = $(``).css({
+ flex: "1 1 auto",
+ overflow: "auto",
+ borderBottomRightRadius: "10px",
+ borderBottomLeftRadius: "10px",
+ padding: "20px"
+ });
+
+ this.panel.append(this.title, this.content);
+ this.initTitle();
+ }
+
+ initTitle() {
+ this.headtext = $("Başlıksız pencere
");
+ const divider = $("");
+ this.exitbtn = $("close
");
+ this.exitbtn.on('click',()=>{
+ this.dispatchEvent(new Event("close"));
+ })
+ this.title.append(
+ this.headtext,
+ divider,
+ this.exitbtn
+ );
+ }
+
+ enableDragging() {
+ let isDragging = false;
+ let startX, startY, startLeft, startTop;
+
+ this.title.on("mousedown", (e) => {
+ if(this.activeDragging == false){
+ return;
+ }
+ let isInput = $(e.target).closest("button, input, select, textarea,.btn");
+ if (isInput.length) return;
+ e.preventDefault();
+ isDragging = true;
+ startX = e.pageX;
+ startY = e.pageY;
+ startLeft = parseFloat(this.panel.css("left"));
+ startTop = parseFloat(this.panel.css("top"));
+ $("body").css("user-select", "none");
+ this.dispatchEvent(new Event("dragging"));
+ this.panel.css("box-shadow","black 0px 0px 40px -20px");
+ this.panel.css("backdrop-filter","blur(10px)");
+ });
+
+ $(document).on("mousemove", (e) => {
+ if (!isDragging) return;
+ const dx = e.pageX - startX;
+ const dy = e.pageY - startY;
+
+ this.panel.css({
+ left: startLeft + dx,
+ top: startTop + dy,
+ });
+ });
+
+ $(document).on("mouseup", () => {
+ if (isDragging) {
+ isDragging = false;
+ this.panel.css("box-shadow","black 0px 0px 20px -10px");
+ this.panel.css("backdrop-filter","blur(3px)");
+ $("body").css("user-select", "auto");
+ this.dispatchEvent(new Event("draggingend"));
+ }
+ });
+ }
+ enableResize() {
+ const offset = 5; // panelin dışından 5px alan
+ let resizing = false;
+ let resizeDir = "";
+ let startX, startY, startW, startH, startL, startT;
+ const minW = 200, minH = 150;
+
+ // overlay divleri oluştur
+ const handles = {};
+ const names = ["n","s","e","w","ne","nw","se","sw"];
+ names.forEach(n => {
+ handles[n] = $('').css({
+ position: "absolute",
+ zIndex: 1000,
+ background: "transparent",
+ cursor: n + "-resize",
+ transition: "all 0.5s all",
+ outlineOffset: "3px"
+ }).appendTo(this.panel);
+ });
+
+ // boyut ve pozisyonlarını ayarla
+ const updateHandles = () => {
+ const w = this.panel.outerWidth();
+ const h = this.panel.outerHeight();
+ // kenarlar
+ handles.n.css({ top: -offset, left: 0, width: w, height: offset*2 });
+ handles.s.css({ bottom: -offset, left: 0, width: w, height: offset*2 });
+ handles.w.css({ top: 0, left: -offset, width: offset*2, height: h });
+ handles.e.css({ top: 0, right: -offset, width: offset*2, height: h });
+ // köşeler
+ handles.nw.css({ top: -offset, left: -offset, width: offset*2, height: offset*2 });
+ handles.ne.css({ top: -offset, right: -offset, width: offset*2, height: offset*2 });
+ handles.sw.css({ bottom: -offset, left: -offset, width: offset*2, height: offset*2 });
+ handles.se.css({ bottom: -offset, right: -offset, width: offset*2, height: offset*2 });
+ };
+ updateHandles();
+
+ $(window).on("resize", updateHandles);
+
+ let activeDir = null;
+
+ // resize eventleri
+ names.forEach(dir => {
+ handles[dir].on("mousedown", (e) => {
+ if(this.activeResizing == false){
+ return;
+ }
+ activeDir = e.target;
+ e.preventDefault();
+ e.stopPropagation();
+ resizing = true;
+ resizeDir = dir;
+ startX = e.pageX;
+ startY = e.pageY;
+ startW = this.panel.outerWidth();
+ startH = this.panel.outerHeight();
+ startL = parseFloat(this.panel.css("left"));
+ startT = parseFloat(this.panel.css("top"));
+ this.dispatchEvent(new Event("resizing"));
+ $("body").css("user-select","none");
+ });
+ });
+
+ $(document).on("mousemove", (e) => {
+ if (!resizing) return;
+ const dx = e.pageX - startX;
+ const dy = e.pageY - startY;
+ let newW = startW;
+ let newH = startH;
+ let newL = startL;
+ let newT = startT;
+
+ if (resizeDir.includes("e")) newW = Math.max(minW, startW + dx);
+ if (resizeDir.includes("w")) { newW = Math.max(minW, startW - dx); newL = startL + (startW - newW); }
+ if (resizeDir.includes("s")) newH = Math.max(minH, startH + dy);
+ if (resizeDir.includes("n")) { newH = Math.max(minH, startH - dy); newT = startT + (startH - newH); }
+
+ this.panel.css({ width: newW, height: newH, left: newL, top: newT });
+ updateHandles();
+ $(activeDir).css("outline", "solid 2px #00ff00");
+ });
+
+ $(document).on("mouseup", () => {
+ if (resizing) {
+ resizing = false;
+ $("body").css("user-select","auto");
+ $(activeDir).css("outline", "solid 0px #00ff00");
+ this.dispatchEvent(new Event("resizingend"));
+ }
+ });
+ }
+ enableFocus() {
+ this.panel.on("mousedown", () => {
+ this.bringToFront();
+ });
+ }
+
+ bringToFront() {
+ if (DWindow.zCounter > DWindow.normalizeThreshold) {
+ DWindow.normalizeZ();
+ }
+ DWindow.zCounter++;
+ this.panel.css("z-index", DWindow.zCounter);
+ }
+ showing = true;
+ show(){
+ this.dispatchEvent(new Event("show"));
+ this.panel.show();
+ this.showing = true;
+ }
+ hide(){
+ this.dispatchEvent(new Event("hide"));
+ this.panel.hide();
+ this.showing = false;
+ }
+ toggle(){
+ this.showing ? this.hide() : this.show();
+ }
+ exit(){
+ this.dispatchEvent(new Event("exit"));
+ this.panel.remove();
+ }
+ /** @type {DWindow} */
+ parent = null;
+ /** @param {DWindow} parent */
+ enableDialog(parent){
+ this.parent = parent;
+ this.parent.activeDragging = false;
+ this.parent.activeResizing = false;
+ this.parent.panel.css('pointer-events',"none");
+ this.parent.panel.css('filter',"grayscale(1)");
+
+ let [{
+ left: parentL,
+ top: parentT,
+ width: parentW,
+ height: parentH
+ }] = this.parent.panel[0].getClientRects();
+
+ let [{
+ width: childW,
+ height: childH
+ }] = this.panel[0].getClientRects();
+
+ let newLeft = parentL + (parentW - childW) / 2;
+ let newTop = parentT + (parentH - childH) / 2;
+ debugger;
+ newLeft = Math.max(newLeft, 20);
+ newTop = Math.max(newTop, 20);
+ newLeft = Math.min(newLeft, screen.availWidth - 100);
+ newTop = Math.min(newTop, screen.availHeight - 100);
+
+ Object.assign(this.panel[0].style, {
+ left: `${Math.round(newLeft)}px`,
+ top: `${Math.round(newTop)}px`
+ });
+ }
+ /** @param {DWindow} parent */
+ disableDialog(){
+ this.parent.activeDragging = true;
+ this.parent.activeResizing = true;
+ this.parent.panel.css('pointer-events',"all");
+ this.parent.panel.css('filter',"initial");
+ }
+}
\ No newline at end of file
diff --git a/public/test.js b/public/test.js
index 892c373..cb611c7 100644
--- a/public/test.js
+++ b/public/test.js
@@ -12,9 +12,9 @@ async function beginEngine()
accessType: "private",
description: "Private free joined room",
ifexistsJoin: false,
- notifyActionEjected: true,
+ notifyActionEjected: false,
notifyActionInvite: false,
- notifyActionJoined: true
+ notifyActionJoined: false
});
try{
await room.createRoom();
diff --git a/public/trial.html b/public/trial.html
new file mode 100644
index 0000000..f4af2e1
--- /dev/null
+++ b/public/trial.html
@@ -0,0 +1,166 @@
+
+
+
+
+
+jQuery ile Resizable Kutu
+
+
+
+
+
+
+
+
+
+
diff --git a/script/index.js.map b/script/index.js.map
index e3456fd..95d7805 100644
--- a/script/index.js.map
+++ b/script/index.js.map
@@ -1 +1 @@
-{"mappings":"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","sources":["frontend/index.ts","frontend/Connection.ts","frontend/EventPool.ts","frontend/EventTarget.ts","frontend/IPPressure.ts","frontend/Peer.ts","frontend/PeerInfo.ts","frontend/WebRTC.ts","frontend/P2PFileSender.ts","frontend/Room.ts","frontend/RoomInfo.ts","frontend/WSTSProtocol.ts"],"sourcesContent":["import {Connection,IConnection} from \"./Connection\";\nimport EventPool from \"./EventPool\";\nimport EventTarget from \"./EventTarget\";\nimport { IPPressure } from \"./IPPressure\";\nimport Peer from \"./Peer\";\nimport Room, { IRoomOptions } from \"./Room\";\nimport WSTSProtocol, { Message } from \"./WSTSProtocol\";\nimport WebRTC from \"./WebRTC\";\n//import {Gzip} from \"fflate\";\nexport default class MWSE extends EventTarget {\n public static rtc : WebRTC;\n public server! : Connection;\n public WSTSProtocol! : WSTSProtocol;\n public EventPooling! : EventPool;\n public rooms : Map = new Map();\n public pairs : Map = new Map();\n public peers : Map = new Map();\n public virtualPressure : IPPressure;\n public me! : Peer;\n /*public static compress(message:string, callback:(e:any) => any)\n {\n let u : any= [];\n let C = new Gzip({\n level: 9,\n mem: 12\n },(stream,isLast) => {\n u.push(stream);\n if(isLast)\n {\n callback(u);\n }\n });\n C.push(new TextEncoder().encode(message), true);\n }*/\n constructor(options: IConnection){\n super();\n MWSE.rtc = MWSE as unknown as WebRTC;\n this.server = new Connection(this,options);\n this.WSTSProtocol = new WSTSProtocol(this);\n this.EventPooling = new EventPool(this);\n this.virtualPressure = new IPPressure(this);\n this.server.connect();\n this.me = new Peer(this);\n this.me.scope(()=>{\n this.peers.set('me', this.me);\n this.peers.set(this.me.socketId as string, this.me);\n })\n this.server.onActive(async ()=>{\n this.me.setSocketId('me');\n await this.me.metadata();\n this.emit('scope');\n this.activeScope = true;\n });\n this.server.onPassive(async ()=>{\n this.emit('close');\n });\n this.packMessagingSystem();\n }\n\n public writable = 1;\n public readable = 1;\n\n public destroy()\n {\n this.server.disconnect();\n }\n\n public enableRecaiveData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packrecaive', value: 1 })\n this.readable = 1\n }\n public disableRecaiveData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packrecaive', value: 0 })\n this.readable = 0\n }\n\n public enableSendData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packsending', value: 1 })\n this.writable = 1\n }\n public disableSendData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packsending', value: 0 })\n this.writable = 0\n }\n\n public enableNotifyRoomInfo(){\n this.WSTSProtocol.SendOnly({ type: 'connection/roominfo', value: 1 })\n }\n public disableNotifyRoomInfo(){\n this.WSTSProtocol.SendOnly({ type: 'connection/roominfo', value: 0 })\n }\n\n public async request(peerId: string, pack:Message)\n {\n let {pack:answer} = await this.EventPooling.request({\n type: 'request/to',\n to: peerId,\n pack\n });\n return answer;\n }\n public async response(peerId: string, requestId:number, pack:Message)\n {\n this.WSTSProtocol.SendOnly({\n type: 'response/to',\n to: peerId,\n pack,\n id: requestId\n })\n }\n private packMessagingSystem()\n {\n this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => {\n if(this.readable)\n {\n let {from,pack} = payload;\n this.peer(from, true).emit('pack', pack);\n }\n })\n this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => {\n let {from,pack, id} = payload;\n let scope = {\n body: pack,\n response: (pack: Message) => {\n this.response(from, id, pack);\n },\n peer: this.peer(from, true)\n };\n this.peer(from, true).emit('request', scope);\n this.peer('me').emit('request', scope);\n })\n this.EventPooling.signal('pack/room',(payload : {from:string,pack:any,sender:string}) => {\n if(this.readable)\n {\n let {from,pack,sender} = payload;\n this.room(from).emit('message', pack, this.peer(sender));\n }\n })\n this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.set(peer.socketId as string, peer);\n room.emit('join', peer);\n })\n this.EventPooling.signal('room/info',(payload : {roomId:string,value:any,name:string}) => {\n let {roomId,name,value} = payload;\n this.room(roomId).emit('updateinfo', name,value);\n })\n this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.delete(peer.socketId as string);\n room.emit('eject', peer);\n })\n this.EventPooling.signal('room/closed',(payload : {roomid:any}) => {\n let {roomid} = payload;\n let room = this.room(roomid);\n room.peers.clear();\n room.emit('close');\n this.rooms.delete(roomid);\n })\n this.EventPooling.signal(\"pair/info\", (payload : {from : string,name: string, value: string | number | boolean}) => {\n let {from, name, value} = payload;\n let peer = this.peer(from, true);\n peer.info.info[name] = value;\n peer.emit(\"info\", name, value);\n })\n this.EventPooling.signal(\"request/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.info.info = info;\n peer.emit(\"request/pair\", peer);\n this.peer('me').emit('request/pair', peer);\n })\n this.EventPooling.signal(\"peer/disconnect\", (payload : {id : string}) => {\n let {id} = payload;\n let peer = this.peer(id, true);\n peer.emit(\"disconnect\", peer);\n })\n this.EventPooling.signal(\"accepted/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.info.info = info;\n peer.emit(\"accepted/pair\", peer);\n this.peer('me').emit('accepted/pairr', peer);\n })\n this.EventPooling.signal(\"end/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.emit(\"endPair\", info);\n this.peer('me').emit('endPair', from, info);\n })\n }\n public room(options: IRoomOptions | string) : Room\n {\n if(typeof options == \"string\")\n {\n if(this.rooms.has(options))\n {\n return this.rooms.get(options) as Room\n }\n }\n let room = new Room(this);\n room.setRoomOptions(options);\n this.emit('room');\n return room;\n }\n public peer(options: string | IRoomOptions, isActive = false) : Peer\n {\n if(typeof options == \"string\")\n {\n if(this.peers.has(options))\n {\n return this.peers.get(options) as Peer\n }\n if(this.pairs.has(options))\n {\n return this.pairs.get(options) as Peer\n }\n }\n let peer = new Peer(this);\n peer.setPeerOptions(options);\n peer.active = isActive;\n this.peers.set(peer.socketId as string, peer);\n this.emit('peer', peer);\n return peer;\n }\n};\n\ndeclare global {\n interface Window {\n MWSE: any;\n }\n}\n\nwindow.MWSE = MWSE;","import MWSE from \"frontend\";\n\nexport interface IConnection{\n endpoint: string;\n autoReconnect?: boolean | {\n timeout: number;\n }\n}\nexport class Connection\n{\n public ws! : WebSocket;\n public endpoint : URL;\n public autoPair : boolean = false;\n public connected : boolean = false;\n\n public autoReconnect : boolean = true;\n public autoReconnectTimeout : number = 3000;\n public autoReconnectTimer? : number;\n constructor(mwse:MWSE, options: IConnection){\n\n if(options.endpoint == \"auto\")\n {\n const RootURL : string = ( document.currentScript).src\n let scriptPath = new URL(RootURL);\n let isSecurity = scriptPath.protocol == \"https:\";\n let dumeUrl = scriptPath.pathname.split('/').slice(0,-1).join('/') + '/';\n let wsSocket = new URL(dumeUrl, scriptPath);\n wsSocket.protocol = isSecurity ? 'wss:' : 'ws:';\n this.endpoint = new URL(wsSocket.href);\n }else{\n try{\n // Testing\n this.endpoint = new URL(options.endpoint);\n }catch{\n throw new Error(\"endpoint is required\")\n }\n }\n if(typeof options.autoReconnect == \"boolean\")\n {\n this.autoReconnect = true;\n }else if(options.autoReconnect)\n {\n this.autoReconnect = true;\n this.autoReconnectTimeout = options.autoReconnect.timeout;\n }\n }\n public connect()\n {\n if(this.autoReconnectTimer)\n {\n clearTimeout(this.autoReconnectTimer)\n };\n this.ws = new WebSocket(this.endpoint.href);\n this.addWSEvents();\n }\n public disconnect()\n {\n /**\n * Eğer bilinerek elle kapatıldıysa otomatik tekrar bağlanmasının\n * önüne geçmek için autoReconnect bayrağını her zaman kapalı tutmak gerekir\n */\n this.autoReconnect = false;\n this.ws.close();\n }\n public addWSEvents()\n {\n this.ws.addEventListener(\"open\", () => this.eventOpen());\n this.ws.addEventListener(\"close\", () => this.eventClose());\n this.ws.addEventListener(\"error\", () => this.eventError());\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\n }\n private eventOpen()\n {\n this.connected = true;\n for (const callback of this.activeConnectionEvent) {\n callback(void 0);\n }\n }\n private eventClose()\n {\n for (const callback of this.passiveConnectionEvent) {\n callback(void 0);\n }\n this.connected = false;\n if(this.autoReconnect)\n {\n this.autoReconnectTimer = setTimeout(() => this.connect(), this.autoReconnectTimeout) as unknown as number;\n }\n }\n private eventError()\n {\n this.connected = false;\n }\n private recaivePackEvent : ((data:any) => any)[] = [];\n public onRecaivePack(func:(data:any) => any)\n {\n this.recaivePackEvent.push(func);\n }\n private activeConnectionEvent : Function[] = [];\n public onActive(func:Function)\n {\n if(this.connected)\n {\n func()\n }else{\n this.activeConnectionEvent.push(func);\n }\n }\n private passiveConnectionEvent : Function[] = [];\n public onPassive(func:Function)\n {\n if(!this.connected)\n {\n func()\n }else{\n this.passiveConnectionEvent.push(func);\n }\n }\n private eventMessage(data: string | ArrayBuffer)\n {\n if(typeof data == \"string\")\n {\n let $data = JSON.parse(data);\n for (const callback of this.recaivePackEvent) {\n callback($data);\n }\n }\n }\n public tranferToServer(data:any)\n {\n if(this.connected)\n {\n this.ws.send(JSON.stringify(data));\n }\n }\n}","import MWSE from \"./index\";\nimport { Message } from \"./WSTSProtocol\";\n\nexport default class EventPool\n{\n public wsts : MWSE;\n public events : Map = new Map();\n public signals : Map = new Map();\n\n public requests : Map = new Map();\n\n public count = 0;\n constructor(wsts:MWSE){\n this.wsts = wsts;\n }\n public request(msg: Message) : Promise\n {\n return new Promise((ok,rej) => {\n let id = ++this.count;\n this.events.set(id,[\n (data:any) => {\n ok(data);\n },\n (data:any) => {\n rej(data);\n }\n ]);\n this.wsts.WSTSProtocol.SendRequest(msg, id);\n })\n }\n public stream(msg: Message, callback: Function)\n {\n let id = ++this.count;\n this.wsts.WSTSProtocol.StartStream(msg, id);\n this.events.set(id,[\n (data:any) => {\n callback(data);\n },\n () => { }\n ]);\n }\n public signal(event: string, callback: Function)\n {\n let T = this.signals.get(event);\n if(!T)\n {\n this.signals.set(event, [callback]);\n }else{\n T.push(callback);\n }\n }\n}","export default class EventTarget\n{\n private events : {[key:string]:Function[]} = {};\n public emit(eventName :string, ...args:any[])\n {\n if(this.events[eventName])\n {\n for (const callback of this.events[eventName]) {\n callback(...args);\n }\n }\n }\n public on(eventName :string, callback:Function)\n {\n if(this.events[eventName])\n {\n this.events[eventName].push(callback)\n }else{\n this.events[eventName] = [callback];\n }\n }\n public activeScope : boolean = false;\n scope(f:Function)\n {\n if(this.activeScope)\n {\n f()\n }else{\n this.on('scope', f)\n }\n }\n}","import MWSE from \"frontend\";\n\nexport class IPPressure\n{\n public mwse : MWSE;\n public APNumber? : number;\n public APShortCode? : string;\n public APIPAddress? : string;\n constructor(mwse : MWSE){\n this.mwse = mwse;\n };\n public async allocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'alloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Allocated Access Point IP Address\");\n }\n }\n public async allocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'alloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Allocated Access Point Number\");\n }\n }\n public async allocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'alloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Allocated Access Point Short Code\");\n }\n }\n public async reallocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'realloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Reallocated Access Point IP Address\");\n }\n }\n public async reallocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'realloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Reallocated Access Point Number\");\n }\n }\n public async reallocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'realloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Reallocated Access Point Short Code\");\n }\n }\n public async releaseAPIPAddress()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APIPAddress = undefined;\n }else{\n throw new Error(\"Error release Access Point IP Address\");\n }\n }\n public async releaseAPNumber()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APNumber = undefined;\n }else{\n throw new Error(\"Error release Access Point Number\");\n }\n }\n public async releaseAPShortCode()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APShortCode'\n }) as {\n status:string\n };\n if(status == 'success')\n {\n this.APShortCode = undefined;\n }else{\n throw new Error(\"Error release Access Point Short Code\");\n }\n }\n public async queryAPIPAddress(ip:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APIPAddress',\n whois: ip\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPNumber(number:number)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APNumber',\n whois: number\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPShortCode(code:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APShortCode',\n whois: code\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n}","import EventTarget from \"./EventTarget\";\nimport { PeerInfo } from \"./PeerInfo\";\nimport WebRTC from \"./WebRTC\";\nimport MWSE from \"./index\";\n\ninterface IPeerOptions{\n\n};\n\nenum IMessageSymbase\n{\n PayloadMessagePack = -12873.54,\n PayloadRTCBasePack = -12884.54\n}\n\n\nexport default class Peer extends EventTarget\n{\n public mwse : MWSE;\n public options : IPeerOptions = {};\n public socketId? : string;\n public selfSocket : boolean = false;\n public active : boolean = false;\n public info : PeerInfo;\n public rtc : WebRTC;\n public peerConnection : boolean = false;\n public primaryChannel : \"websocket\" | \"datachannel\" = \"datachannel\";\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n this.rtc = this.createRTC();\n this.info = new PeerInfo(this);\n this.on('pack',(data:{type?:string,action?:IMessageSymbase,payload?:any}) => {\n if(data.type == ':rtcpack:')\n {\n return this.rtc.emit(\"input\", data.payload)\n };\n this.emit(\"message\", data);\n });\n }\n public createRTC(rtcConfig?: RTCConfiguration | undefined, rtcServers?: RTCIceServer[] | undefined) : WebRTC\n {\n this.rtc = new WebRTC(rtcConfig,rtcServers);\n this.rtc.peer = this;\n this.rtc.on(\"connected\", () => {\n this.peerConnection = true;\n });\n this.rtc.on('disconnected', () => {\n this.peerConnection = false;\n })\n this.rtc.on(\"output\",(payload:object) => {\n this.send({\n type: ':rtcpack:',\n payload: payload\n })\n });\n this.rtc.on(\"message\",(payload:object) => {\n this.emit(\"pack\",payload);\n });\n return this.rtc;\n }\n public setPeerOptions(options: string | IPeerOptions){\n if(typeof options == \"string\")\n {\n this.setSocketId(options)\n }else{\n this.options = options;\n }\n }\n public setSocketId(uuid: string){\n this.socketId = uuid;\n }\n async metadata() : Promise\n {\n if(this.socketId == 'me')\n {\n let result = await this.mwse.EventPooling.request({\n type:'my/socketid'\n });\n this.selfSocket = true;\n this.active ||= true;\n this.socketId = result;\n this.emit('scope');\n this.activeScope = true;\n return result;\n }\n };\n \n async request(pack:any){\n if(this.active)\n {\n return await this.mwse.request(this.socketId as string, pack);\n }\n };\n equalTo(peer : Peer | {socketId: string})\n {\n return this.socketId == peer.socketId;\n }\n async isReachable()\n {\n return await this.mwse.EventPooling.request({\n type:'is/reachable',\n to: this.socketId\n });\n }\n async enablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'everybody'\n });\n }\n async disablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'disable'\n });\n }\n async enablePairInfo(){\n await this.mwse.EventPooling.request({\n type: 'connection/pairinfo',\n value: true\n });\n }\n async disablePairInfo(){\n await this.mwse.EventPooling.request({\n type: 'connection/pairinfo',\n value: false\n });\n }\n async requestPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'request/pair',\n to: this.socketId\n });\n if(\n message == \"ALREADY-PAIRED\" ||\n message == \"ALREADY-REQUESTED\"\n )\n {\n console.warn(\"Already paired or pair requested\")\n };\n if(status == \"fail\")\n {\n console.error(\"Request Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async endPair()\n {\n await this.mwse.EventPooling.request({\n type:'end/pair',\n to: this.socketId\n });\n this.forget();\n }\n async acceptPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'accept/pair',\n to: this.socketId\n });\n if(status == \"fail\")\n {\n console.error(\"Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async rejectPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'reject/pair',\n to: this.socketId\n });\n if(status == \"fail\")\n {\n console.error(\"Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async getPairedList() : Promise\n {\n let {value} = await this.mwse.EventPooling.request({\n type:'pair/list',\n to: this.socketId\n });\n return value;\n }\n async send(pack: any){\n let isOpenedP2P = this.peerConnection && this.rtc?.active;\n let isOpenedServer = this.mwse.server.connected;\n let sendChannel : \"websocket\" | \"datachannel\";\n if(isOpenedP2P && isOpenedServer)\n {\n if(this.primaryChannel == \"websocket\")\n {\n sendChannel = \"websocket\"\n }else\n {\n sendChannel = \"datachannel\"\n }\n }else if(isOpenedServer){\n sendChannel = \"websocket\"\n }else{\n sendChannel = \"datachannel\"\n }\n\n if(sendChannel == \"websocket\")\n {\n if(!this.mwse.writable){\n return console.warn(\"Socket is not writable\");\n }\n await this.mwse.EventPooling.request({\n type:'pack/to',\n pack,\n to: this.socketId\n });\n }else{\n this.rtc?.sendMessage(pack)\n }\n }\n async forget(){\n this.mwse.peers.delete(this.socketId as string);\n this.mwse.pairs.delete(this.socketId as string);\n }\n} ","import Peer from \"./Peer\";\n\nexport class PeerInfo\n{\n public peer : Peer;\n public info : {[key:string]: any} = {};\n constructor(mwse : Peer){\n this.peer = mwse;\n };\n public async fetch(name?:string)\n {\n if(name)\n {\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId,\n name\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n }else{\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n };\n return this.info;\n }\n public set(name: string, value: string | number)\n {\n this.info[name] = value;\n this.peer.mwse.WSTSProtocol.SendOnly({\n type: \"auth/info\",\n name,\n value\n });\n }\n public get(name?:string)\n {\n return name ? this.info[name] : this.info;\n }\n}","import P2PFileSender from \"./P2PFileSender\";\nimport Peer from \"./Peer\";\ninterface TransferStreamInfo\n{\n senders : RTCRtpSender[];\n recaivers : RTCRtpReceiver[];\n stream:MediaStream | undefined;\n id:string;\n name:string;\n}\n\nexport default class WebRTC\n{\n public static channels : Map = new Map();\n public static requireGC : boolean = false;\n public id : any;\n public active : boolean = false;\n public connectionStatus : \"closed\" | \"connected\" | \"connecting\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public iceStatus : \"checking\" | \"closed\" | \"completed\" | \"connected\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public gatheringStatus : \"complete\" | \"gathering\" | \"new\" = \"new\";\n public signalingStatus : \"\" | \"closed\" | \"have-local-offer\" | \"have-local-pranswer\" | \"have-remote-offer\" | \"have-remote-pranswer\" | \"stable\" = \"\"\n public rtc! : RTCPeerConnection;\n public recaivingStream : Map = new Map();\n public sendingStream : Map = new Map();\n public events : { [eventname:string]: Function[] } = {};\n public channel : RTCDataChannel | undefined;\n\n public static defaultRTCConfig : RTCConfiguration = {\n iceCandidatePoolSize: 0,\n iceTransportPolicy:\"all\",\n rtcpMuxPolicy:\"require\",\n };\n\n public isPolite() : boolean\n {\n let myId = this.peer?.mwse.peer('me').socketId as string;\n let peerId = this.peer?.socketId as string;\n return myId < peerId;\n }\n\n public static defaultICEServers : RTCIceServer[] = [{\n urls: \"stun:stun.l.google.com:19302\"\n },{\n urls: \"stun:stun1.l.google.com:19302\"\n },{\n urls: \"stun:stun2.l.google.com:19302\"\n },{\n urls: \"stun:stun3.l.google.com:19302\"\n },{\n urls: \"stun:stun4.l.google.com:19302\"\n }];\n\n public peer? : Peer;\n\n public FileTransportChannel? : P2PFileSender;\n\n public makingOffer = false;\n public ignoreOffer = false;\n public isSettingRemoteAnswerPending = false;\n\n candicatePack : RTCIceCandidate[] = [];\n\n\n constructor(\n rtcConfig?: RTCConfiguration,\n rtcServers?: RTCIceServer[]\n )\n {\n let config : any = {};\n\n if(rtcConfig)\n {\n Object.assign(\n config,\n WebRTC.defaultRTCConfig,\n rtcConfig\n )\n }else{\n Object.assign(\n config,\n WebRTC.defaultRTCConfig\n )\n }\n\n config.iceServers = rtcServers || WebRTC.defaultICEServers;\n\n this.rtc = new RTCPeerConnection(config as RTCConfiguration);\n this.rtc.addEventListener(\"connectionstatechange\",()=>{\n this.eventConnectionState();\n })\n this.rtc.addEventListener(\"icecandidate\",(...args)=>{\n this.eventIcecandidate(...args);\n })\n this.rtc.addEventListener(\"iceconnectionstatechange\",()=>{\n this.eventICEConnectionState();\n })\n this.rtc.addEventListener(\"icegatheringstatechange\",()=>{\n this.eventICEGatherinState();\n })\n this.rtc.addEventListener(\"negotiationneeded\",()=>{\n this.eventNogationNeeded();\n })\n this.rtc.addEventListener(\"signalingstatechange\",()=>{\n this.eventSignalingState();\n })\n this.rtc.addEventListener(\"track\",(...args)=>{\n this.eventTrack(...args);\n })\n this.rtc.addEventListener(\"datachannel\",(...args)=>{\n this.eventDatachannel(...args);\n })\n this.on('input',async (data:{[key:string]:any})=>{\n switch(data.type)\n {\n case \"icecandidate\":{\n try{\n if(this.rtc.remoteDescription){\n await this.rtc.addIceCandidate(new RTCIceCandidate(data.value));\n }else{\n this.candicatePack.push(new RTCIceCandidate(data.value))\n }\n }catch(error){\n debugger;\n }finally{\n console.log(\"ICE Canbet\")\n }\n break;\n }\n case \"offer\":{\n let readyForOffer = !this.makingOffer && (this.rtc.signalingState == \"stable\" || this.isSettingRemoteAnswerPending);\n\n const offerCollision = !readyForOffer;\n\n this.ignoreOffer = !this.isPolite() && offerCollision;\n\n if(this.ignoreOffer){\n return;\n }\n\n this.isSettingRemoteAnswerPending = false;\n\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));\n\n this.isSettingRemoteAnswerPending = false;\n\n for (const candidate of this.candicatePack) {\n await this.rtc.addIceCandidate(candidate);\n }\n\n let answer = await this.rtc.createAnswer({\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n })\n await this.rtc.setLocalDescription(answer);\n this.send({\n type: 'answer',\n value: answer\n });\n break;\n }\n case \"answer\":{\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value))\n\n for (const candidate of this.candicatePack) {\n await this.rtc.addIceCandidate(candidate);\n }\n break;\n }\n case \"streamInfo\":{\n let {id,value} = data;\n let streamInfo = this.recaivingStream.get(id);\n if(!streamInfo)\n {\n this.recaivingStream.set(id,value as TransferStreamInfo);\n }else{\n this.recaivingStream.set(id,{\n ...streamInfo,\n ...value\n } as TransferStreamInfo);\n }\n this.send({\n type:'streamAccept',\n id\n })\n break;\n }\n case \"streamRemoved\":{\n let {id} = data;\n this.emit('stream:stopped', this.recaivingStream.get(id));\n this.recaivingStream.delete(id);\n break;\n }\n case \"streamAccept\":{\n let {id} = data;\n let sendingStream = this.sendingStream.get(id) as TransferStreamInfo;\n let senders = [];\n if(sendingStream && sendingStream.stream)\n {\n for (const track of sendingStream.stream.getTracks()) {\n senders.push(this.rtc.addTrack(track, sendingStream.stream));\n };\n sendingStream.senders = senders;\n }\n break;\n }\n case \"message\":{\n this.emit('message', data.payload);\n break;\n }\n }\n })\n }\n public addEventListener(event:string,callback: Function){\n (this.events[event] || (this.events[event]=[])).push(callback);\n };\n public on(event:string,callback: Function){\n this.addEventListener(event, callback)\n };\n public async dispatch(event:string,...args:any[]) : Promise {\n if(this.events[event])\n {\n for (const callback of this.events[event])\n {\n await callback(...args)\n }\n }\n }\n public async emit(event:string,...args:any[]) : Promise {\n await this.dispatch(event, ...args)\n }\n public connect()\n {\n if(!this.channel)\n {\n this.createDefaultDataChannel();\n }\n }\n public sendMessage(data: any)\n {\n this.send({\n type: 'message',\n payload: data\n });\n }\n public createDefaultDataChannel()\n {\n let dt = this.rtc.createDataChannel(':default:',{\n ordered: true\n });\n dt.addEventListener(\"open\",()=>{\n this.channel = dt;\n WebRTC.channels.set(this.id, this);\n this.active = true;\n });\n dt.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n dt.addEventListener(\"close\",()=>{\n this.channel = undefined;\n this.active = false;\n })\n }\n public destroy()\n {\n this.active = false;\n if(this.channel)\n {\n this.channel.close();\n this.channel = undefined;\n }\n if(this.rtc)\n {\n this.rtc.close();\n //this.rtc = undefined;\n };\n this.emit('disconnected');\n WebRTC.channels.delete(this.id);\n }\n public eventDatachannel(event: RTCDataChannelEvent)\n {\n if(event.channel.label == ':default:'){\n WebRTC.channels.set(this.id, this);\n this.channel = event.channel;\n this.active = true;\n event.channel.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n event.channel.addEventListener(\"close\",()=>{\n this.channel = undefined;\n WebRTC.channels.delete(this.id);\n WebRTC.requireGC = true;\n })\n }else{\n this.emit('datachannel', event.channel);\n }\n }\n public send(data:object)\n {\n if(this.channel?.readyState == \"open\")\n {\n this.channel.send(JSON.stringify(data));\n }else{\n this.emit('output', data);\n }\n }\n public eventConnectionState()\n {\n this.connectionStatus = this.rtc.connectionState;\n if(this.connectionStatus == 'connected')\n {\n if(this.active == false)\n {\n this.emit('connected');\n }\n };\n\n if(this.connectionStatus == 'failed')\n {\n this.rtc.restartIce();\n };\n \n if(this.connectionStatus == \"closed\")\n {\n if(this.active)\n {\n this.destroy();\n }\n }\n }\n public eventIcecandidate(event: RTCPeerConnectionIceEvent)\n {\n if(event.candidate)\n {\n this.send({\n type:'icecandidate',\n value: event.candidate\n })\n }\n }\n public eventICEConnectionState()\n {\n this.iceStatus = this.rtc.iceConnectionState;\n }\n public eventICEGatherinState()\n {\n this.gatheringStatus = this.rtc.iceGatheringState;\n }\n public async eventNogationNeeded()\n {\n try{\n this.makingOffer = true;\n let offer = await this.rtc.createOffer({\n iceRestart: true,\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n });\n await this.rtc.setLocalDescription(offer);\n this.send({\n type: 'offer',\n value: offer\n });\n }catch(error){\n console.error(`Nogation Error:`, error)\n }\n finally{\n this.makingOffer = false;\n }\n }\n public eventSignalingState()\n {\n this.signalingStatus = this.rtc.signalingState;\n }\n public eventTrack(event: RTCTrackEvent)\n {\n let rtpRecaiver = event.receiver;\n if(event.streams.length)\n {\n for (const stream of event.streams) {\n let streamInfo = this.recaivingStream.get(stream.id) as TransferStreamInfo;\n (streamInfo.recaivers || (streamInfo.recaivers = [])).push(rtpRecaiver);\n if((this.recaivingStream.get(stream.id) as {stream : MediaStream | undefined}).stream == null)\n {\n streamInfo.stream = stream;\n this.emit('stream:added', this.recaivingStream.get(stream.id));\n }else{\n streamInfo.stream = stream;\n }\n }\n }\n }\n public sendStream(stream:MediaStream,name:string,info:{[key:string]:any}){\n this.send({\n type: 'streamInfo',\n id: stream.id,\n value: {\n ...info,\n name: name\n }\n });\n this.sendingStream.set(stream.id,{\n ...info,\n id:stream.id,\n name: name,\n stream\n } as TransferStreamInfo);\n };\n public stopStream(_stream:MediaStream){\n if(this.connectionStatus != 'connected'){\n return\n }\n if(this.sendingStream.has(_stream.id))\n {\n let {stream} = this.sendingStream.get(_stream.id) as {stream:MediaStream};\n \n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n \n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n this.sendingStream.delete(_stream.id)\n }\n }\n public stopAllStreams()\n {\n if(this.connectionStatus != 'connected'){\n return\n }\n for (const [, {stream}] of this.sendingStream) {\n if(stream == undefined)\n {\n continue;\n }\n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n };\n \n this.sendingStream.clear();\n }\n public async SendFile(file:File, meta: object)\n {\n if(!this.peer)\n {\n throw new Error(\"Peer is not ready\");\n }\n this.FileTransportChannel = new P2PFileSender(this, this.peer);\n\n await this.FileTransportChannel.SendFile(file, meta);\n }\n public async RecaiveFile(\n chnlCount:number,\n filemeta: {\n name: string;\n type: string;\n },\n totalSize: number\n ) : Promise\n {\n if(!this.peer)\n {\n throw new Error(\"Peer is not ready\");\n }\n this.FileTransportChannel = new P2PFileSender(this, this.peer);\n\n return await new Promise(recaivedFile => {\n if(this.FileTransportChannel)\n {\n this.FileTransportChannel.RecaiveFile(\n this.rtc,\n filemeta,\n chnlCount,\n totalSize,\n (file: File) => {\n recaivedFile(file)\n }\n );\n }\n })\n }\n}\n\nWebRTC.requireGC = false;\nsetInterval(()=>{\n if(WebRTC.requireGC == false) return;\n let img = document.createElement(\"img\");\n img.src = window.URL.createObjectURL(new Blob([new ArrayBuffer(5e+7)]));\n img.onerror = function() {\n window.URL.revokeObjectURL(this.src);\n };\n WebRTC.requireGC = false;\n}, 3000);\n\ndeclare global {\n interface MediaStream {\n senders : RTCRtpSender[];\n }\n}","import WebRTC from \"./WebRTC\";\nimport Peer from \"./Peer\";\n\n\n\nexport default class P2PFileSender\n{\n public rtc : RTCPeerConnection;\n public peer : Peer;\n public webrtc : WebRTC;\n\n public totalSize : number = 0;\n public isReady : boolean = false;\n public isStarted : boolean = false;\n public isSending : boolean = false;\n public isRecaiving : boolean = false;\n public processedSize : number = 0;\n public recaivedFile? : File;\n\n public bufferSizePerChannel : number = 10e6;\n public bufferSizePerPack : number = 10e3;\n public safeBufferSizePerPack : number = 10e3 - 1;\n\n public constructor(webrtc : WebRTC, peer : Peer)\n {\n this.webrtc = webrtc;\n this.rtc = webrtc.rtc;\n this.peer = peer;\n }\n public async RecaiveFile(\n _rtc: RTCPeerConnection,\n fileMetadata: {name:string, type:string},\n channelCount: number,\n _totalSize: number,\n onEnded: Function\n )\n {\n //let totals = {};\n // let index = 0;\n /*setChannelStatus(Array.from({length:channelCount}).map((e, index) => {\n return {\n name: `${index+1}. Kanal`,\n current: 0,\n currentTotal: 0,\n total: 0\n }\n }));*/\n let parts : Blob[] = [];\n this.webrtc.on('datachannel',(datachannel:RTCDataChannel) => {\n //let channelIndex = index++;\n let current = 0;\n let totalSize = 0;\n let currentPart = 0;\n let bufferAmount : ArrayBuffer[] = [];\n datachannel.onmessage = function({data}){\n if(totalSize == 0)\n {\n let {\n size,\n part,\n } = JSON.parse(data);\n totalSize = size;\n currentPart = part;\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n total: totalSize,\n current: 0\n }\n });*/\n datachannel.send(\"READY\");\n }else{\n current += data.byteLength;\n bufferAmount.push(data);\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n current: data.byteLength + n.current,\n currentTotal: data.byteLength + n.currentTotal,\n }\n });\n setProcessedSize(n => n + data.byteLength);*/\n if(current == totalSize)\n {\n parts[currentPart] = new Blob(bufferAmount);\n bufferAmount = []; \n //totals[datachannel.label] += totalSize;\n totalSize = 0;\n currentPart = 0;\n current = 0;\n datachannel.send(\"TOTAL_RECAIVED\");\n }\n }\n };\n datachannel.onclose = () => {\n channelCount--;\n if(channelCount == 0)\n {\n let file = new File(parts, fileMetadata.name, {\n type: fileMetadata.type,\n lastModified: +new Date\n });\n onEnded(file);\n }\n };\n })\n }\n public async SendFile(\n file: File,\n metadata: object\n )\n {\n this.isSending = true;\n this.isStarted = true;\n\n\n let buffer = await file.arrayBuffer();\n let partCount = Math.ceil(buffer.byteLength / 10e6);\n let channelCount = Math.min(5, partCount);\n\n if(this.webrtc.iceStatus != \"connected\")\n {\n throw new Error(\"WebRTC is a not ready\")\n }\n\n this.peer.send({\n type: 'file',\n name: file.name,\n size: file.size,\n mimetype: file.type,\n partCount,\n channelCount,\n metadata: metadata\n });\n\n let channels : RTCDataChannel[] = [];\n\n for(let channelIndex = 0; channelIndex < channelCount; channelIndex++)\n {\n let channel = this.rtc.createDataChannel(\"\\\\?\\\\file_\" + channelIndex);\n channel.binaryType = \"arraybuffer\";\n await new Promise(ok => {\n channel.onopen = () => {\n ok(void 0);\n }\n });\n channels.push(channel);\n };\n\n let currentPart = 0;\n let next = () => {\n if(currentPart < partCount)\n {\n let bufferPart = buffer.slice(currentPart * 10e6, currentPart * 10e6 + 10e6)\n currentPart++;\n return [bufferPart, currentPart - 1];\n };\n return [false,0];\n };\n let spyChannelIndex = channels.length;\n await new Promise(ok => {\n for (let channelIndex = 0; channelIndex < channels.length; channelIndex++)\n {\n this.sendPartition(\n channels[channelIndex],\n next,\n channelIndex,\n () => {\n spyChannelIndex--;\n if(spyChannelIndex == 0)\n {\n this.isSending = false;\n this.isStarted = false;\n ok(undefined)\n }\n }\n );\n }\n })\n }\n protected sendPartition(\n channel: RTCDataChannel,\n nextblob10mb: () => (number | ArrayBuffer)[] | (number | boolean)[],\n _channelIndex: number,\n onEnded: Function\n )\n {\n let [currentBuffer,currentPartition] = nextblob10mb();\n let currentPart = 0;\n let next = () => {\n if(!(currentBuffer instanceof ArrayBuffer))\n {\n return;\n }\n let bufferPart = currentBuffer.slice(currentPart * 16e3, currentPart * 16e3 + 16e3)\n currentPart++;\n if(bufferPart.byteLength != 0)\n {\n /*\n updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n current: bufferPart.byteLength + n.current,\n currentTotal: bufferPart.byteLength + n.currentTotal\n }\n });\n setProcessedSize(n => n + bufferPart.byteLength);\n */\n return bufferPart\n }\n };\n channel.addEventListener(\"message\",({data}) => {\n if(data == \"READY\")\n {\n this.sendFileChannel(channel, next)\n }\n if(data == \"TOTAL_RECAIVED\")\n {\n [currentBuffer,currentPartition] = nextblob10mb();\n currentPart = 0;\n if(currentBuffer != false)\n {\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n total: currentBuffer.byteLength,\n current: 0,\n }\n });*/\n channel.send(JSON.stringify({\n size: (currentBuffer as ArrayBuffer).byteLength,\n part: currentPartition\n }))\n }else{\n channel.close();\n onEnded();\n }\n }\n });\n channel.send(JSON.stringify({\n size: (currentBuffer as ArrayBuffer).byteLength,\n part: currentPartition\n }))\n }\n protected sendFileChannel(\n channel: RTCDataChannel,\n getNextBlob: () => ArrayBuffer | undefined\n )\n {\n channel.addEventListener(\"bufferedamountlow\",function(){\n let buffer = getNextBlob();\n if(buffer)\n {\n channel.send(buffer);\n }\n });\n channel.bufferedAmountLowThreshold = 16e3 - 1;\n let c = getNextBlob();\n c && channel.send(c);\n }\n};","import EventTarget from \"./EventTarget\";\nimport MWSE from \"./index\";\nimport Peer from \"./Peer\";\nimport { RoomInfo } from \"./RoomInfo\";\n\nexport interface IRoomOptions\n{\n name: string;\n description?:string;\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\n credential?: string;\n ifexistsJoin?: boolean;\n accessType?: \"public\"|\"private\";\n notifyActionInvite?: boolean;\n notifyActionJoined?: boolean;\n notifyActionEjected?: boolean;\n autoFetchInfo?:boolean\n}\n\n\nexport default class Room extends EventTarget\n{\n public mwse : MWSE;\n public options! : IRoomOptions;\n public config! : IRoomOptions;\n public roomId? : string;\n public accessType? : \"public\"|\"private\";\n public description? : string;\n public joinType? : \"free\"|\"invite\"|\"password\"|\"lock\";\n public name? : string;\n public owner? : string;\n public peers : Map = new Map();\n public info : RoomInfo;\n\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n this.info = new RoomInfo(this);\n }\n public setRoomOptions(options : IRoomOptions | string)\n {\n if(typeof options == \"string\")\n {\n this.roomId = options;\n }else{\n let defaultOptions = {\n joinType: \"free\",\n ifexistsJoin: true,\n accessType: \"private\",\n notifyActionInvite: true,\n notifyActionJoined: true,\n notifyActionEjected: true,\n autoFetchInfo: true\n };\n Object.assign(defaultOptions,options);\n this.config = defaultOptions as IRoomOptions;\n }\n }\n \n setRoomId(uuid: string){\n this.roomId = uuid;\n }\n async createRoom(roomOptions : IRoomOptions){\n let config = this.config || roomOptions;\n let result = await this.mwse.EventPooling.request({\n type:'create-room',\n ...config\n });\n if(result.status == 'fail')\n {\n if(result.message == \"ALREADY-EXISTS\" && this.config.ifexistsJoin)\n {\n return this.join();\n }\n throw new Error(result.message || result.messages);\n }else{\n this.options = {\n ...this.config,\n ...result.room\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async join(){\n let result = await this.mwse.EventPooling.request({\n type:'joinroom',\n name: this.config.name,\n credential: this.config.credential,\n autoFetchInfo: this.config.autoFetchInfo || false\n });\n if(result.status == 'fail')\n {\n throw new Error(result.message);\n }else{\n this.options = {\n ...this.config,\n ...result.room\n };\n if(result.info)\n {\n this.info.info = result.info;\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async eject(){\n let {type} = await this.mwse.EventPooling.request({\n type:'ejectroom',\n roomId: this.roomId\n });\n this.peers.clear();\n if(type == 'success')\n {\n this.mwse.rooms.delete(this.roomId as string);\n }\n }\n async send(pack: any, wom:boolean = false, handshake = false){\n if(!this.mwse.writable){\n return console.warn(\"Socket is not writable\");\n }\n if(handshake)\n {\n let {type} = await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom,\n handshake\n }) as {\n type:\"success\"|\"fail\"\n };\n if(type == \"fail\"){\n throw new Error(\"Cant send message to room\")\n }\n }else{\n await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom,\n handshake\n })\n }\n }\n async fetchPeers(filter?:{[key:string]:any}, onlyNumber:boolean = false) : Promise\n {\n if(onlyNumber)\n {\n let {count} = await this.mwse.EventPooling.request({\n type:'room/peer-count',\n roomId: this.roomId,\n filter: filter || {}\n }) as {count:Number};\n return count;\n }else{\n let {status, peers} = await this.mwse.EventPooling.request({\n type:'room-peers',\n roomId: this.roomId,\n filter: filter || {}\n }) as {status:\"success\"|\"fail\", peers: string[]};\n \n let cup : Peer[] = [];\n \n if(status == 'fail')\n {\n throw new Error(\"Cant using peers on room\")\n }else if(status == 'success'){\n for (const peerid of peers) {\n let peer = this.mwse.peer(peerid,true);\n cup.push(peer);\n this.peers.set(peerid, peer);\n }\n };\n return cup;\n }\n }\n}","import Room from \"./Room\";\n\nexport class RoomInfo\n{\n public room : Room;\n public info : {[key:string]: any} = {};\n constructor(room : Room){\n this.room = room;\n this.room.on('updateinfo',(name:string,value:any) => {\n this.info[name] = value;\n })\n };\n public async fetch(name?:string)\n {\n if(name)\n {\n let rinfo = await this.room.mwse.EventPooling.request(({\n type: \"room/getinfo\",\n roomId: this.room.roomId,\n name\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.value;\n }else console.warn(rinfo.message);\n }else{\n let rinfo = await this.room.mwse.EventPooling.request(({\n type: \"room/info\",\n roomId: this.room.roomId\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.value;\n }else console.warn(rinfo.message);\n };\n return this.info;\n }\n public set(name: string, value: string | number)\n {\n this.info[name] = value;\n this.room.mwse.WSTSProtocol.SendOnly({\n type: \"room/setinfo\",\n roomId: this.room.roomId,\n name,\n value\n });\n }\n public get(name?:string)\n {\n return name ? this.info[name] : this.info;\n }\n}","import MWSE from \"./index\";\n\nexport interface Message {\n [key:string|number]:any;\n}\nexport default class WSTSProtocol\n{\n public mwse : MWSE;\n constructor(wsts:MWSE){\n this.mwse = wsts;\n this.addListener();\n }\n public addListener()\n {\n this.mwse.server?.onRecaivePack((pack)=>{\n this.PackAnalyze(pack)\n })\n }\n public SendRaw(pack: Message)\n {\n this.mwse.server.tranferToServer(pack);\n }\n public SendOnly(pack: Message)\n {\n this.mwse.server.tranferToServer([pack,'R']);\n }\n public SendRequest(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'R']);\n }\n public StartStream(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'S']);\n }\n public PackAnalyze(data:any)\n {\n let [payload, id, action] = data;\n if(typeof id === 'number')\n {\n let callback = this.mwse.EventPooling.events.get(id);\n if(callback)\n {\n callback[0](payload, action);\n switch(action)\n {\n case 'E':{ // [E]ND flag\n this.mwse.EventPooling.events.delete(id);\n break;\n }\n case 'S': // [S]TREAM flag\n default:{\n break;\n }\n }\n }else console.warn(\"Missing event sended from server\");\n }else{\n let signals = this.mwse.EventPooling.signals.get(id);\n if(signals)\n {\n for (const callback of signals) {\n callback(payload);\n }\n }else console.warn(\"Missing event sended from server\");\n }\n }\n}"],"names":[],"version":3,"file":"index.js.map"}
\ No newline at end of file
+{"mappings":"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","sources":["frontend/index.ts","frontend/Connection.ts","frontend/EventPool.ts","frontend/EventTarget.ts","frontend/IPPressure.ts","frontend/Peer.ts","frontend/PeerInfo.ts","frontend/WebRTC.ts","frontend/P2PFileSender.ts","frontend/Room.ts","frontend/RoomInfo.ts","frontend/WSTSProtocol.ts"],"sourcesContent":["import {Connection,IConnection} from \"./Connection\";\nimport EventPool from \"./EventPool\";\nimport EventTarget from \"./EventTarget\";\nimport { IPPressure } from \"./IPPressure\";\nimport Peer from \"./Peer\";\nimport Room, { IRoomOptions } from \"./Room\";\nimport WSTSProtocol, { Message } from \"./WSTSProtocol\";\nimport WebRTC from \"./WebRTC\";\n//import {Gzip} from \"fflate\";\nexport default class MWSE extends EventTarget {\n public static rtc : WebRTC;\n public server! : Connection;\n public WSTSProtocol! : WSTSProtocol;\n public EventPooling! : EventPool;\n public rooms : Map = new Map();\n public pairs : Map = new Map();\n public peers : Map = new Map();\n public virtualPressure : IPPressure;\n public me! : Peer;\n /*public static compress(message:string, callback:(e:any) => any)\n {\n let u : any= [];\n let C = new Gzip({\n level: 9,\n mem: 12\n },(stream,isLast) => {\n u.push(stream);\n if(isLast)\n {\n callback(u);\n }\n });\n C.push(new TextEncoder().encode(message), true);\n }*/\n constructor(options: IConnection){\n super();\n MWSE.rtc = MWSE as unknown as WebRTC;\n this.server = new Connection(this,options);\n this.WSTSProtocol = new WSTSProtocol(this);\n this.EventPooling = new EventPool(this);\n this.virtualPressure = new IPPressure(this);\n this.server.connect();\n this.me = new Peer(this);\n this.me.scope(()=>{\n this.peers.set('me', this.me);\n this.peers.set(this.me.socketId as string, this.me);\n })\n this.server.onActive(async ()=>{\n this.me.setSocketId('me');\n await this.me.metadata();\n this.emit('scope');\n this.activeScope = true;\n });\n this.server.onPassive(async ()=>{\n this.emit('close');\n });\n this.packMessagingSystem();\n }\n\n public writable = 1;\n public readable = 1;\n\n public destroy()\n {\n this.server.disconnect();\n }\n\n public enableRecaiveData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packrecaive', value: 1 })\n this.readable = 1\n }\n public disableRecaiveData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packrecaive', value: 0 })\n this.readable = 0\n }\n\n public enableSendData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packsending', value: 1 })\n this.writable = 1\n }\n public disableSendData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packsending', value: 0 })\n this.writable = 0\n }\n\n public enableNotifyRoomInfo(){\n this.WSTSProtocol.SendOnly({ type: 'connection/roominfo', value: 1 })\n }\n public disableNotifyRoomInfo(){\n this.WSTSProtocol.SendOnly({ type: 'connection/roominfo', value: 0 })\n }\n\n public async request(peerId: string, pack:Message)\n {\n let {pack:answer} = await this.EventPooling.request({\n type: 'request/to',\n to: peerId,\n pack\n });\n return answer;\n }\n public async response(peerId: string, requestId:number, pack:Message)\n {\n this.WSTSProtocol.SendOnly({\n type: 'response/to',\n to: peerId,\n pack,\n id: requestId\n })\n }\n private packMessagingSystem()\n {\n this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => {\n if(this.readable)\n {\n let {from,pack} = payload;\n this.peer(from, true).emit('pack', pack);\n }\n })\n this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => {\n let {from,pack, id} = payload;\n let scope = {\n body: pack,\n response: (pack: Message) => {\n this.response(from, id, pack);\n },\n peer: this.peer(from, true)\n };\n this.peer(from, true).emit('request', scope);\n this.peer('me').emit('request', scope);\n })\n this.EventPooling.signal('pack/room',(payload : {from:string,pack:any,sender:string}) => {\n if(this.readable)\n {\n let {from,pack,sender} = payload;\n this.room(from).emit('message', pack, this.peer(sender));\n }\n })\n this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.set(peer.socketId as string, peer);\n room.emit('join', peer);\n })\n this.EventPooling.signal('room/info',(payload : {roomId:string,value:any,name:string}) => {\n let {roomId,name,value} = payload;\n this.room(roomId).emit('updateinfo', name,value);\n })\n this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.delete(peer.socketId as string);\n room.emit('eject', peer);\n })\n this.EventPooling.signal('room/closed',(payload : {roomid:any}) => {\n let {roomid} = payload;\n let room = this.room(roomid);\n room.peers.clear();\n room.emit('close');\n this.rooms.delete(roomid);\n })\n this.EventPooling.signal(\"pair/info\", (payload : {from : string,name: string, value: string | number | boolean}) => {\n let {from, name, value} = payload;\n let peer = this.peer(from, true);\n peer.info.info[name] = value;\n peer.emit(\"info\", name, value);\n })\n this.EventPooling.signal(\"request/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.info.info = info;\n peer.emit(\"request/pair\", peer);\n this.peer('me').emit('request/pair', peer);\n })\n this.EventPooling.signal(\"peer/disconnect\", (payload : {id : string}) => {\n let {id} = payload;\n let peer = this.peer(id, true);\n peer.emit(\"disconnect\", peer);\n })\n this.EventPooling.signal(\"accepted/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.info.info = info;\n peer.emit(\"accepted/pair\", peer);\n this.peer('me').emit('accepted/pairr', peer);\n })\n this.EventPooling.signal(\"end/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.emit(\"endPair\", info);\n this.peer('me').emit('endPair', from, info);\n })\n }\n public room(options: IRoomOptions | string) : Room\n {\n if(typeof options == \"string\")\n {\n if(this.rooms.has(options))\n {\n return this.rooms.get(options) as Room\n }\n }\n let room = new Room(this);\n room.setRoomOptions(options);\n this.emit('room');\n return room;\n }\n public peer(options: string | IRoomOptions, isActive = false) : Peer\n {\n if(typeof options == \"string\")\n {\n if(this.peers.has(options))\n {\n return this.peers.get(options) as Peer\n }\n if(this.pairs.has(options))\n {\n return this.pairs.get(options) as Peer\n }\n }\n let peer = new Peer(this);\n peer.setPeerOptions(options);\n peer.active = isActive;\n this.peers.set(peer.socketId as string, peer);\n this.emit('peer', peer);\n return peer;\n }\n};\n\ndeclare global {\n interface Window {\n MWSE: any;\n }\n}\n\nwindow.MWSE = MWSE;","import MWSE from \"frontend\";\n\nexport interface IConnection{\n endpoint: string;\n autoReconnect?: boolean | {\n timeout: number;\n }\n}\nexport class Connection\n{\n public ws! : WebSocket;\n public endpoint : URL;\n public autoPair : boolean = false;\n public connected : boolean = false;\n\n public autoReconnect : boolean = true;\n public autoReconnectTimeout : number = 3000;\n public autoReconnectTimer? : number;\n constructor(mwse:MWSE, options: IConnection){\n\n if(options.endpoint == \"auto\")\n {\n const RootURL : string = ( document.currentScript).src\n let scriptPath = new URL(RootURL);\n let isSecurity = scriptPath.protocol == \"https:\";\n let dumeUrl = scriptPath.pathname.split('/').slice(0,-1).join('/') + '/';\n let wsSocket = new URL(dumeUrl, scriptPath);\n wsSocket.protocol = isSecurity ? 'wss:' : 'ws:';\n this.endpoint = new URL(wsSocket.href);\n }else{\n try{\n // Testing\n this.endpoint = new URL(options.endpoint);\n }catch{\n throw new Error(\"endpoint is required\")\n }\n }\n if(typeof options.autoReconnect == \"boolean\")\n {\n this.autoReconnect = true;\n }else if(options.autoReconnect)\n {\n this.autoReconnect = true;\n this.autoReconnectTimeout = options.autoReconnect.timeout;\n }\n }\n public connect()\n {\n if(this.autoReconnectTimer)\n {\n clearTimeout(this.autoReconnectTimer)\n };\n this.ws = new WebSocket(this.endpoint.href);\n this.addWSEvents();\n }\n public disconnect()\n {\n /**\n * Eğer bilinerek elle kapatıldıysa otomatik tekrar bağlanmasının\n * önüne geçmek için autoReconnect bayrağını her zaman kapalı tutmak gerekir\n */\n this.autoReconnect = false;\n this.ws.close();\n }\n public addWSEvents()\n {\n this.ws.addEventListener(\"open\", () => this.eventOpen());\n this.ws.addEventListener(\"close\", () => this.eventClose());\n this.ws.addEventListener(\"error\", () => this.eventError());\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\n }\n private eventOpen()\n {\n this.connected = true;\n for (const callback of this.activeConnectionEvent) {\n callback(void 0);\n }\n }\n private eventClose()\n {\n for (const callback of this.passiveConnectionEvent) {\n callback(void 0);\n }\n this.connected = false;\n if(this.autoReconnect)\n {\n this.autoReconnectTimer = setTimeout(() => this.connect(), this.autoReconnectTimeout) as unknown as number;\n }\n }\n private eventError()\n {\n this.connected = false;\n }\n private recaivePackEvent : ((data:any) => any)[] = [];\n public onRecaivePack(func:(data:any) => any)\n {\n this.recaivePackEvent.push(func);\n }\n private activeConnectionEvent : Function[] = [];\n public onActive(func:Function)\n {\n if(this.connected)\n {\n func()\n }else{\n this.activeConnectionEvent.push(func);\n }\n }\n private passiveConnectionEvent : Function[] = [];\n public onPassive(func:Function)\n {\n if(!this.connected)\n {\n func()\n }else{\n this.passiveConnectionEvent.push(func);\n }\n }\n private eventMessage(data: string | ArrayBuffer)\n {\n if(typeof data == \"string\")\n {\n let $data = JSON.parse(data);\n for (const callback of this.recaivePackEvent) {\n callback($data);\n }\n }\n }\n public tranferToServer(data:any)\n {\n if(this.connected)\n {\n this.ws.send(JSON.stringify(data));\n }\n }\n}","import MWSE from \"./index\";\nimport { Message } from \"./WSTSProtocol\";\n\nexport default class EventPool\n{\n public wsts : MWSE;\n public events : Map = new Map();\n public signals : Map = new Map();\n\n public requests : Map = new Map();\n\n public count = 0;\n constructor(wsts:MWSE){\n this.wsts = wsts;\n }\n public request(msg: Message) : Promise\n {\n return new Promise((ok,rej) => {\n let id = ++this.count;\n this.events.set(id,[\n (data:any) => {\n ok(data);\n },\n (data:any) => {\n rej(data);\n }\n ]);\n this.wsts.WSTSProtocol.SendRequest(msg, id);\n })\n }\n public stream(msg: Message, callback: Function)\n {\n let id = ++this.count;\n this.wsts.WSTSProtocol.StartStream(msg, id);\n this.events.set(id,[\n (data:any) => {\n callback(data);\n },\n () => { }\n ]);\n }\n public signal(event: string, callback: Function)\n {\n let T = this.signals.get(event);\n if(!T)\n {\n this.signals.set(event, [callback]);\n }else{\n T.push(callback);\n }\n }\n}","export default class EventTarget\n{\n private events : {[key:string]:Function[]} = {};\n public emit(eventName :string, ...args:any[])\n {\n if(this.events[eventName])\n {\n for (const callback of this.events[eventName]) {\n callback(...args);\n }\n }\n }\n public on(eventName :string, callback:Function)\n {\n if(this.events[eventName])\n {\n this.events[eventName].push(callback)\n }else{\n this.events[eventName] = [callback];\n }\n }\n public activeScope : boolean = false;\n scope(f:Function)\n {\n if(this.activeScope)\n {\n f()\n }else{\n this.on('scope', f)\n }\n }\n}","import MWSE from \"frontend\";\n\nexport class IPPressure\n{\n public mwse : MWSE;\n public APNumber? : number;\n public APShortCode? : string;\n public APIPAddress? : string;\n constructor(mwse : MWSE){\n this.mwse = mwse;\n };\n public async allocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'alloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Allocated Access Point IP Address\");\n }\n }\n public async allocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'alloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Allocated Access Point Number\");\n }\n }\n public async allocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'alloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Allocated Access Point Short Code\");\n }\n }\n public async reallocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'realloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Reallocated Access Point IP Address\");\n }\n }\n public async reallocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'realloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Reallocated Access Point Number\");\n }\n }\n public async reallocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'realloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Reallocated Access Point Short Code\");\n }\n }\n public async releaseAPIPAddress()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APIPAddress = undefined;\n }else{\n throw new Error(\"Error release Access Point IP Address\");\n }\n }\n public async releaseAPNumber()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APNumber = undefined;\n }else{\n throw new Error(\"Error release Access Point Number\");\n }\n }\n public async releaseAPShortCode()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APShortCode'\n }) as {\n status:string\n };\n if(status == 'success')\n {\n this.APShortCode = undefined;\n }else{\n throw new Error(\"Error release Access Point Short Code\");\n }\n }\n public async queryAPIPAddress(ip:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APIPAddress',\n whois: ip\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPNumber(number:number)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APNumber',\n whois: number\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPShortCode(code:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APShortCode',\n whois: code\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n}","import EventTarget from \"./EventTarget\";\nimport { PeerInfo } from \"./PeerInfo\";\nimport WebRTC from \"./WebRTC\";\nimport MWSE from \"./index\";\n\ninterface IPeerOptions{\n\n};\n\nenum IMessageSymbase\n{\n PayloadMessagePack = -12873.54,\n PayloadRTCBasePack = -12884.54\n}\n\n\nexport default class Peer extends EventTarget\n{\n public mwse : MWSE;\n public options : IPeerOptions = {};\n public socketId? : string;\n public selfSocket : boolean = false;\n public active : boolean = false;\n public info : PeerInfo;\n public rtc : WebRTC;\n public peerConnection : boolean = false;\n public primaryChannel : \"websocket\" | \"datachannel\" = \"datachannel\";\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n this.rtc = this.createRTC();\n this.info = new PeerInfo(this);\n this.on('pack',(data:{type?:string,action?:IMessageSymbase,payload?:any}) => {\n if(data.type == ':rtcpack:')\n {\n return this.rtc.emit(\"input\", data.payload)\n };\n this.emit(\"message\", data);\n });\n }\n public createRTC(rtcConfig?: RTCConfiguration | undefined, rtcServers?: RTCIceServer[] | undefined) : WebRTC\n {\n this.rtc = new WebRTC(rtcConfig,rtcServers);\n this.rtc.peer = this;\n this.rtc.on(\"connected\", () => {\n this.peerConnection = true;\n });\n this.rtc.on('disconnected', () => {\n this.peerConnection = false;\n })\n this.rtc.on(\"output\",(payload:object) => {\n this.send({\n type: ':rtcpack:',\n payload: payload\n })\n });\n this.rtc.on(\"message\",(payload:object) => {\n this.emit(\"pack\",payload);\n });\n return this.rtc;\n }\n public setPeerOptions(options: string | IPeerOptions){\n if(typeof options == \"string\")\n {\n this.setSocketId(options)\n }else{\n this.options = options;\n }\n }\n public setSocketId(uuid: string){\n this.socketId = uuid;\n }\n async metadata() : Promise\n {\n if(this.socketId == 'me')\n {\n let result = await this.mwse.EventPooling.request({\n type:'my/socketid'\n });\n this.selfSocket = true;\n this.active ||= true;\n this.socketId = result;\n this.emit('scope');\n this.activeScope = true;\n return result;\n }\n };\n \n async request(pack:any){\n if(this.active)\n {\n return await this.mwse.request(this.socketId as string, pack);\n }\n };\n equalTo(peer : Peer | {socketId: string})\n {\n return this.socketId == peer.socketId;\n }\n async isReachable()\n {\n return await this.mwse.EventPooling.request({\n type:'is/reachable',\n to: this.socketId\n });\n }\n async enablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'everybody'\n });\n }\n async disablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'disable'\n });\n }\n async enablePairInfo(){\n await this.mwse.EventPooling.request({\n type: 'connection/pairinfo',\n value: true\n });\n }\n async disablePairInfo(){\n await this.mwse.EventPooling.request({\n type: 'connection/pairinfo',\n value: false\n });\n }\n async requestPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'request/pair',\n to: this.socketId\n });\n if(\n message == \"ALREADY-PAIRED\" ||\n message == \"ALREADY-REQUESTED\"\n )\n {\n console.warn(\"Already paired or pair requested\")\n };\n if(status == \"fail\")\n {\n console.error(\"Request Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async endPair()\n {\n await this.mwse.EventPooling.request({\n type:'end/pair',\n to: this.socketId\n });\n this.forget();\n }\n async acceptPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'accept/pair',\n to: this.socketId\n });\n if(status == \"fail\")\n {\n console.error(\"Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async rejectPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'reject/pair',\n to: this.socketId\n });\n if(status == \"fail\")\n {\n console.error(\"Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async getPairedList() : Promise\n {\n let {value} = await this.mwse.EventPooling.request({\n type:'pair/list',\n to: this.socketId\n });\n return value;\n }\n async send(pack: any){\n let isOpenedP2P = this.peerConnection && this.rtc?.active;\n let isOpenedServer = this.mwse.server.connected;\n let sendChannel : \"websocket\" | \"datachannel\";\n if(isOpenedP2P && isOpenedServer)\n {\n if(this.primaryChannel == \"websocket\")\n {\n sendChannel = \"websocket\"\n }else\n {\n sendChannel = \"datachannel\"\n }\n }else if(isOpenedServer){\n sendChannel = \"websocket\"\n }else{\n sendChannel = \"datachannel\"\n }\n\n if(sendChannel == \"websocket\")\n {\n if(!this.mwse.writable){\n return console.warn(\"Socket is not writable\");\n }\n await this.mwse.EventPooling.request({\n type:'pack/to',\n pack,\n to: this.socketId\n });\n }else{\n this.rtc?.sendMessage(pack)\n }\n }\n async forget(){\n this.mwse.peers.delete(this.socketId as string);\n this.mwse.pairs.delete(this.socketId as string);\n }\n} ","import Peer from \"./Peer\";\n\nexport class PeerInfo\n{\n public peer : Peer;\n public info : {[key:string]: any} = {};\n constructor(mwse : Peer){\n this.peer = mwse;\n };\n public async fetch(name?:string)\n {\n if(name)\n {\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId,\n name\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n }else{\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n };\n return this.info;\n }\n public set(name: string, value: string | number)\n {\n this.info[name] = value;\n this.peer.mwse.WSTSProtocol.SendOnly({\n type: \"auth/info\",\n name,\n value\n });\n }\n public get(name?:string)\n {\n return name ? this.info[name] : this.info;\n }\n}","import P2PFileSender from \"./P2PFileSender\";\nimport Peer from \"./Peer\";\ninterface TransferStreamInfo\n{\n senders : RTCRtpSender[];\n recaivers : RTCRtpReceiver[];\n stream:MediaStream | undefined;\n id:string;\n name:string;\n}\n\nexport default class WebRTC\n{\n public static channels : Map = new Map();\n public static requireGC : boolean = false;\n public id : any;\n public active : boolean = false;\n public connectionStatus : \"closed\" | \"connected\" | \"connecting\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public iceStatus : \"checking\" | \"closed\" | \"completed\" | \"connected\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public gatheringStatus : \"complete\" | \"gathering\" | \"new\" = \"new\";\n public signalingStatus : \"\" | \"closed\" | \"have-local-offer\" | \"have-local-pranswer\" | \"have-remote-offer\" | \"have-remote-pranswer\" | \"stable\" = \"\"\n public rtc! : RTCPeerConnection;\n public recaivingStream : Map = new Map();\n public sendingStream : Map = new Map();\n public events : { [eventname:string]: Function[] } = {};\n public channel : RTCDataChannel | undefined;\n\n public static defaultRTCConfig : RTCConfiguration = {\n iceCandidatePoolSize: 0,\n iceTransportPolicy:\"all\",\n rtcpMuxPolicy:\"require\",\n };\n\n private isPolite() : boolean\n {\n let myId = this.peer?.mwse.peer('me').socketId as string;\n let peerId = this.peer?.socketId as string;\n return myId < peerId;\n }\n\n public static defaultICEServers : RTCIceServer[] = [{\n urls: \"stun:stun.l.google.com:19302\"\n },{\n urls: \"stun:stun1.l.google.com:19302\"\n },{\n urls: \"stun:stun2.l.google.com:19302\"\n },{\n urls: \"stun:stun3.l.google.com:19302\"\n },{\n urls: \"stun:stun4.l.google.com:19302\"\n }];\n\n public peer? : Peer;\n\n public FileTransportChannel? : P2PFileSender;\n\n public makingOffer = false;\n public ignoreOffer = false;\n public isSettingRemoteAnswerPending = false;\n\n candicatePack : RTCIceCandidate[] = [];\n\n\n constructor(\n rtcConfig?: RTCConfiguration,\n rtcServers?: RTCIceServer[]\n )\n {\n let config : any = {};\n\n if(rtcConfig)\n {\n Object.assign(\n config,\n WebRTC.defaultRTCConfig,\n rtcConfig\n )\n }else{\n Object.assign(\n config,\n WebRTC.defaultRTCConfig\n )\n }\n\n config.iceServers = rtcServers || WebRTC.defaultICEServers;\n\n this.rtc = new RTCPeerConnection(config as RTCConfiguration);\n this.rtc.addEventListener(\"connectionstatechange\",()=>{\n this.eventConnectionState();\n })\n this.rtc.addEventListener(\"icecandidate\",(...args)=>{\n this.eventIcecandidate(...args);\n })\n this.rtc.addEventListener(\"iceconnectionstatechange\",()=>{\n this.eventICEConnectionState();\n })\n this.rtc.addEventListener(\"icegatheringstatechange\",()=>{\n this.eventICEGatherinState();\n })\n this.rtc.addEventListener(\"negotiationneeded\",()=>{\n this.eventNogationNeeded();\n })\n this.rtc.addEventListener(\"signalingstatechange\",()=>{\n this.eventSignalingState();\n })\n this.rtc.addEventListener(\"track\",(...args)=>{\n this.eventTrack(...args);\n })\n this.rtc.addEventListener(\"datachannel\",(...args)=>{\n this.eventDatachannel(...args);\n })\n this.on('input',async (data:{[key:string]:any})=>{\n switch(data.type)\n {\n case \"icecandidate\":{\n try{\n if(this.rtc.remoteDescription){\n await this.rtc.addIceCandidate(new RTCIceCandidate(data.value));\n }else{\n this.candicatePack.push(new RTCIceCandidate(data.value))\n }\n }catch(error){\n debugger;\n }finally{\n console.log(\"ICE Canbet\")\n }\n break;\n }\n case \"offer\":{\n let readyForOffer = !this.makingOffer && (this.rtc.signalingState == \"stable\" || this.isSettingRemoteAnswerPending);\n\n const offerCollision = !readyForOffer;\n\n this.ignoreOffer = !this.isPolite() && offerCollision;\n\n if(this.ignoreOffer){\n return;\n }\n\n this.isSettingRemoteAnswerPending = false;\n\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));\n\n this.isSettingRemoteAnswerPending = false;\n\n for (const candidate of this.candicatePack) {\n await this.rtc.addIceCandidate(candidate);\n }\n\n let answer = await this.rtc.createAnswer({\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n })\n await this.rtc.setLocalDescription(answer);\n this.send({\n type: 'answer',\n value: answer\n });\n break;\n }\n case \"answer\":{\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value))\n\n for (const candidate of this.candicatePack) {\n await this.rtc.addIceCandidate(candidate);\n }\n break;\n }\n case \"streamInfo\":{\n let {id,value} = data;\n let streamInfo = this.recaivingStream.get(id);\n if(!streamInfo)\n {\n this.recaivingStream.set(id,value as TransferStreamInfo);\n }else{\n this.recaivingStream.set(id,{\n ...streamInfo,\n ...value\n } as TransferStreamInfo);\n }\n this.send({\n type:'streamAccept',\n id\n })\n break;\n }\n case \"streamRemoved\":{\n let {id} = data;\n this.emit('stream:stopped', this.recaivingStream.get(id));\n this.recaivingStream.delete(id);\n break;\n }\n case \"streamAccept\":{\n let {id} = data;\n let sendingStream = this.sendingStream.get(id) as TransferStreamInfo;\n let senders = [];\n if(sendingStream && sendingStream.stream)\n {\n for (const track of sendingStream.stream.getTracks()) {\n senders.push(this.rtc.addTrack(track, sendingStream.stream));\n };\n sendingStream.senders = senders;\n }\n break;\n }\n case \"message\":{\n this.emit('message', data.payload);\n break;\n }\n }\n })\n }\n public addEventListener(event:string,callback: Function){\n (this.events[event] || (this.events[event]=[])).push(callback);\n };\n public on(event:string,callback: Function){\n this.addEventListener(event, callback)\n };\n public async dispatch(event:string,...args:any[]) : Promise {\n if(this.events[event])\n {\n for (const callback of this.events[event])\n {\n await callback(...args)\n }\n }\n }\n public async emit(event:string,...args:any[]) : Promise {\n await this.dispatch(event, ...args)\n }\n public connect()\n {\n if(!this.channel)\n {\n this.createDefaultDataChannel();\n }\n }\n public sendMessage(data: any)\n {\n this.send({\n type: 'message',\n payload: data\n });\n }\n public createDefaultDataChannel()\n {\n let dt = this.rtc.createDataChannel(':default:',{\n ordered: true\n });\n dt.addEventListener(\"open\",()=>{\n this.channel = dt;\n WebRTC.channels.set(this.id, this);\n this.active = true;\n });\n dt.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n dt.addEventListener(\"close\",()=>{\n this.channel = undefined;\n this.active = false;\n })\n }\n public destroy()\n {\n this.active = false;\n if(this.channel)\n {\n this.channel.close();\n this.channel = undefined;\n }\n if(this.rtc)\n {\n this.rtc.close();\n //this.rtc = undefined;\n };\n this.emit('disconnected');\n WebRTC.channels.delete(this.id);\n }\n public eventDatachannel(event: RTCDataChannelEvent)\n {\n if(event.channel.label == ':default:'){\n WebRTC.channels.set(this.id, this);\n this.channel = event.channel;\n this.active = true;\n event.channel.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n event.channel.addEventListener(\"close\",()=>{\n this.channel = undefined;\n WebRTC.channels.delete(this.id);\n WebRTC.requireGC = true;\n })\n }else{\n this.emit('datachannel', event.channel);\n }\n }\n public send(data:object)\n {\n if(this.channel?.readyState == \"open\")\n {\n this.channel.send(JSON.stringify(data));\n }else{\n this.emit('output', data);\n }\n }\n public eventConnectionState()\n {\n this.connectionStatus = this.rtc.connectionState;\n if(this.connectionStatus == 'connected')\n {\n if(this.active == false)\n {\n this.emit('connected');\n }\n };\n\n if(this.connectionStatus == 'failed')\n {\n this.rtc.restartIce();\n };\n \n if(this.connectionStatus == \"closed\")\n {\n if(this.active)\n {\n this.destroy();\n }\n }\n }\n public eventIcecandidate(event: RTCPeerConnectionIceEvent)\n {\n if(event.candidate)\n {\n this.send({\n type:'icecandidate',\n value: event.candidate\n })\n }\n }\n public eventICEConnectionState()\n {\n this.iceStatus = this.rtc.iceConnectionState;\n }\n public eventICEGatherinState()\n {\n this.gatheringStatus = this.rtc.iceGatheringState;\n }\n public async eventNogationNeeded()\n {\n try{\n this.makingOffer = true;\n let offer = await this.rtc.createOffer({\n iceRestart: true,\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n });\n await this.rtc.setLocalDescription(offer);\n this.send({\n type: 'offer',\n value: offer\n });\n }catch(error){\n console.error(`Nogation Error:`, error)\n }\n finally{\n this.makingOffer = false;\n }\n }\n public eventSignalingState()\n {\n this.signalingStatus = this.rtc.signalingState;\n }\n public eventTrack(event: RTCTrackEvent)\n {\n let rtpRecaiver = event.receiver;\n if(event.streams.length)\n {\n for (const stream of event.streams) {\n let streamInfo = this.recaivingStream.get(stream.id) as TransferStreamInfo;\n (streamInfo.recaivers || (streamInfo.recaivers = [])).push(rtpRecaiver);\n if((this.recaivingStream.get(stream.id) as {stream : MediaStream | undefined}).stream == null)\n {\n streamInfo.stream = stream;\n this.emit('stream:added', this.recaivingStream.get(stream.id));\n }else{\n streamInfo.stream = stream;\n }\n }\n }\n }\n public sendStream(stream:MediaStream,name:string,info:{[key:string]:any}){\n this.send({\n type: 'streamInfo',\n id: stream.id,\n value: {\n ...info,\n name: name\n }\n });\n this.sendingStream.set(stream.id,{\n ...info,\n id:stream.id,\n name: name,\n stream\n } as TransferStreamInfo);\n };\n public stopStream(_stream:MediaStream){\n if(this.connectionStatus != 'connected'){\n return\n }\n if(this.sendingStream.has(_stream.id))\n {\n let {stream} = this.sendingStream.get(_stream.id) as {stream:MediaStream};\n \n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n \n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n this.sendingStream.delete(_stream.id)\n }\n }\n public stopAllStreams()\n {\n if(this.connectionStatus != 'connected'){\n return\n }\n for (const [, {stream}] of this.sendingStream) {\n if(stream == undefined)\n {\n continue;\n }\n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n };\n \n this.sendingStream.clear();\n }\n public async SendFile(file:File, meta: object)\n {\n if(!this.peer)\n {\n throw new Error(\"Peer is not ready\");\n }\n this.FileTransportChannel = new P2PFileSender(this, this.peer);\n\n await this.FileTransportChannel.SendFile(file, meta);\n }\n public async RecaiveFile(\n chnlCount:number,\n filemeta: {\n name: string;\n type: string;\n },\n totalSize: number\n ) : Promise\n {\n if(!this.peer)\n {\n throw new Error(\"Peer is not ready\");\n }\n this.FileTransportChannel = new P2PFileSender(this, this.peer);\n\n return await new Promise(recaivedFile => {\n if(this.FileTransportChannel)\n {\n this.FileTransportChannel.RecaiveFile(\n this.rtc,\n filemeta,\n chnlCount,\n totalSize,\n (file: File) => {\n recaivedFile(file)\n }\n );\n }\n })\n }\n}\n\nWebRTC.requireGC = false;\nsetInterval(()=>{\n if(WebRTC.requireGC == false) return;\n let img = document.createElement(\"img\");\n img.src = window.URL.createObjectURL(new Blob([new ArrayBuffer(5e+7)]));\n img.onerror = function() {\n window.URL.revokeObjectURL(this.src);\n };\n WebRTC.requireGC = false;\n}, 3000);\n\ndeclare global {\n interface MediaStream {\n senders : RTCRtpSender[];\n }\n}","import WebRTC from \"./WebRTC\";\nimport Peer from \"./Peer\";\n\n/**\n * Deneyseldir kullanılması önerilmez\n */\nexport default class P2PFileSender\n{\n public rtc : RTCPeerConnection;\n public peer : Peer;\n public webrtc : WebRTC;\n\n public totalSize : number = 0;\n public isReady : boolean = false;\n public isStarted : boolean = false;\n public isSending : boolean = false;\n public isRecaiving : boolean = false;\n public processedSize : number = 0;\n public recaivedFile? : File;\n\n public bufferSizePerChannel : number = 10e6;\n public bufferSizePerPack : number = 10e3;\n public safeBufferSizePerPack : number = 10e3 - 1;\n\n public constructor(webrtc : WebRTC, peer : Peer)\n {\n this.webrtc = webrtc;\n this.rtc = webrtc.rtc;\n this.peer = peer;\n }\n public async RecaiveFile(\n _rtc: RTCPeerConnection,\n fileMetadata: {name:string, type:string},\n channelCount: number,\n _totalSize: number,\n onEnded: Function\n )\n {\n //let totals = {};\n // let index = 0;\n /*setChannelStatus(Array.from({length:channelCount}).map((e, index) => {\n return {\n name: `${index+1}. Kanal`,\n current: 0,\n currentTotal: 0,\n total: 0\n }\n }));*/\n let parts : Blob[] = [];\n this.webrtc.on('datachannel',(datachannel:RTCDataChannel) => {\n //let channelIndex = index++;\n let current = 0;\n let totalSize = 0;\n let currentPart = 0;\n let bufferAmount : ArrayBuffer[] = [];\n datachannel.onmessage = function({data}){\n if(totalSize == 0)\n {\n let {\n size,\n part,\n } = JSON.parse(data);\n totalSize = size;\n currentPart = part;\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n total: totalSize,\n current: 0\n }\n });*/\n datachannel.send(\"READY\");\n }else{\n current += data.byteLength;\n bufferAmount.push(data);\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n current: data.byteLength + n.current,\n currentTotal: data.byteLength + n.currentTotal,\n }\n });\n setProcessedSize(n => n + data.byteLength);*/\n if(current == totalSize)\n {\n parts[currentPart] = new Blob(bufferAmount);\n bufferAmount = []; \n //totals[datachannel.label] += totalSize;\n totalSize = 0;\n currentPart = 0;\n current = 0;\n datachannel.send(\"TOTAL_RECAIVED\");\n }\n }\n };\n datachannel.onclose = () => {\n channelCount--;\n if(channelCount == 0)\n {\n let file = new File(parts, fileMetadata.name, {\n type: fileMetadata.type,\n lastModified: +new Date\n });\n onEnded(file);\n }\n };\n })\n }\n public async SendFile(\n file: File,\n metadata: object\n )\n {\n this.isSending = true;\n this.isStarted = true;\n\n\n let buffer = await file.arrayBuffer();\n let partCount = Math.ceil(buffer.byteLength / 10e6);\n let channelCount = Math.min(5, partCount);\n\n if(this.webrtc.iceStatus != \"connected\")\n {\n throw new Error(\"WebRTC is a not ready\")\n }\n\n this.peer.send({\n type: 'file',\n name: file.name,\n size: file.size,\n mimetype: file.type,\n partCount,\n channelCount,\n metadata: metadata\n });\n\n let channels : RTCDataChannel[] = [];\n\n for(let channelIndex = 0; channelIndex < channelCount; channelIndex++)\n {\n let channel = this.rtc.createDataChannel(\"\\\\?\\\\file_\" + channelIndex);\n channel.binaryType = \"arraybuffer\";\n await new Promise(ok => {\n channel.onopen = () => {\n ok(void 0);\n }\n });\n channels.push(channel);\n };\n\n let currentPart = 0;\n let next = () => {\n if(currentPart < partCount)\n {\n let bufferPart = buffer.slice(currentPart * 10e6, currentPart * 10e6 + 10e6)\n currentPart++;\n return [bufferPart, currentPart - 1];\n };\n return [false,0];\n };\n let spyChannelIndex = channels.length;\n await new Promise(ok => {\n for (let channelIndex = 0; channelIndex < channels.length; channelIndex++)\n {\n this.sendPartition(\n channels[channelIndex],\n next,\n channelIndex,\n () => {\n spyChannelIndex--;\n if(spyChannelIndex == 0)\n {\n this.isSending = false;\n this.isStarted = false;\n ok(undefined)\n }\n }\n );\n }\n })\n }\n protected sendPartition(\n channel: RTCDataChannel,\n nextblob10mb: () => (number | ArrayBuffer)[] | (number | boolean)[],\n _channelIndex: number,\n onEnded: Function\n )\n {\n let [currentBuffer,currentPartition] = nextblob10mb();\n let currentPart = 0;\n let next = () => {\n if(!(currentBuffer instanceof ArrayBuffer))\n {\n return;\n }\n let bufferPart = currentBuffer.slice(currentPart * 16e3, currentPart * 16e3 + 16e3)\n currentPart++;\n if(bufferPart.byteLength != 0)\n {\n /*\n updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n current: bufferPart.byteLength + n.current,\n currentTotal: bufferPart.byteLength + n.currentTotal\n }\n });\n setProcessedSize(n => n + bufferPart.byteLength);\n */\n return bufferPart\n }\n };\n channel.addEventListener(\"message\",({data}) => {\n if(data == \"READY\")\n {\n this.sendFileChannel(channel, next)\n }\n if(data == \"TOTAL_RECAIVED\")\n {\n [currentBuffer,currentPartition] = nextblob10mb();\n currentPart = 0;\n if(currentBuffer != false)\n {\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n total: currentBuffer.byteLength,\n current: 0,\n }\n });*/\n channel.send(JSON.stringify({\n size: (currentBuffer as ArrayBuffer).byteLength,\n part: currentPartition\n }))\n }else{\n channel.close();\n onEnded();\n }\n }\n });\n channel.send(JSON.stringify({\n size: (currentBuffer as ArrayBuffer).byteLength,\n part: currentPartition\n }))\n }\n protected sendFileChannel(\n channel: RTCDataChannel,\n getNextBlob: () => ArrayBuffer | undefined\n )\n {\n channel.addEventListener(\"bufferedamountlow\",function(){\n let buffer = getNextBlob();\n if(buffer)\n {\n channel.send(buffer);\n }\n });\n channel.bufferedAmountLowThreshold = 16e3 - 1;\n let c = getNextBlob();\n c && channel.send(c);\n }\n};","import EventTarget from \"./EventTarget\";\nimport MWSE from \"./index\";\nimport Peer from \"./Peer\";\nimport { RoomInfo } from \"./RoomInfo\";\n\nexport interface IRoomOptions\n{\n name: string;\n description?:string;\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\n credential?: string;\n ifexistsJoin?: boolean;\n accessType?: \"public\"|\"private\";\n notifyActionInvite?: boolean;\n notifyActionJoined?: boolean;\n notifyActionEjected?: boolean;\n autoFetchInfo?:boolean\n}\n\n\nexport default class Room extends EventTarget\n{\n public mwse : MWSE;\n public options! : IRoomOptions;\n public config! : IRoomOptions;\n public roomId? : string;\n public accessType? : \"public\"|\"private\";\n public description? : string;\n public joinType? : \"free\"|\"invite\"|\"password\"|\"lock\";\n public name? : string;\n public owner? : string;\n public peers : Map = new Map();\n public info : RoomInfo;\n\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n this.info = new RoomInfo(this);\n }\n public setRoomOptions(options : IRoomOptions | string)\n {\n if(typeof options == \"string\")\n {\n this.roomId = options;\n }else{\n let defaultOptions = {\n joinType: \"free\",\n ifexistsJoin: true,\n accessType: \"private\",\n notifyActionInvite: true,\n notifyActionJoined: true,\n notifyActionEjected: true,\n autoFetchInfo: true\n };\n Object.assign(defaultOptions,options);\n this.config = defaultOptions as IRoomOptions;\n }\n }\n \n setRoomId(uuid: string){\n this.roomId = uuid;\n }\n async createRoom(roomOptions : IRoomOptions){\n let config = this.config || roomOptions;\n let result = await this.mwse.EventPooling.request({\n type:'create-room',\n ...config\n });\n if(result.status == 'fail')\n {\n if(result.message == \"ALREADY-EXISTS\" && this.config.ifexistsJoin)\n {\n return this.join();\n }\n throw new Error(result.message || result.messages);\n }else{\n this.options = {\n ...this.config,\n ...result.room\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async join(){\n let result = await this.mwse.EventPooling.request({\n type:'joinroom',\n name: this.config.name,\n credential: this.config.credential,\n autoFetchInfo: this.config.autoFetchInfo || false\n });\n if(result.status == 'fail')\n {\n throw new Error(result.message);\n }else{\n this.options = {\n ...this.config,\n ...result.room\n };\n if(result.info)\n {\n this.info.info = result.info;\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async eject(){\n let {type} = await this.mwse.EventPooling.request({\n type:'ejectroom',\n roomId: this.roomId\n });\n this.peers.clear();\n if(type == 'success')\n {\n this.mwse.rooms.delete(this.roomId as string);\n }\n }\n async send(pack: any, wom:boolean = false, handshake = false){\n if(!this.mwse.writable){\n return console.warn(\"Socket is not writable\");\n }\n if(handshake)\n {\n let {type} = await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom,\n handshake\n }) as {\n type:\"success\"|\"fail\"\n };\n if(type == \"fail\"){\n throw new Error(\"Cant send message to room\")\n }\n }else{\n await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom,\n handshake\n })\n }\n }\n async fetchPeers(filter?:{[key:string]:any}, onlyNumber:boolean = false) : Promise\n {\n if(onlyNumber)\n {\n let {count} = await this.mwse.EventPooling.request({\n type:'room/peer-count',\n roomId: this.roomId,\n filter: filter || {}\n }) as {count:Number};\n return count;\n }else{\n let {status, peers} = await this.mwse.EventPooling.request({\n type:'room-peers',\n roomId: this.roomId,\n filter: filter || {}\n }) as {status:\"success\"|\"fail\", peers: string[]};\n \n let cup : Peer[] = [];\n \n if(status == 'fail')\n {\n throw new Error(\"Cant using peers on room\")\n }else if(status == 'success'){\n for (const peerid of peers) {\n let peer = this.mwse.peer(peerid,true);\n cup.push(peer);\n this.peers.set(peerid, peer);\n }\n };\n return cup;\n }\n }\n}","import Room from \"./Room\";\n\nexport class RoomInfo\n{\n public room : Room;\n public info : {[key:string]: any} = {};\n constructor(room : Room){\n this.room = room;\n this.room.on('updateinfo',(name:string,value:any) => {\n this.info[name] = value;\n })\n };\n public async fetch(name?:string)\n {\n if(name)\n {\n let rinfo = await this.room.mwse.EventPooling.request(({\n type: \"room/getinfo\",\n roomId: this.room.roomId,\n name\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.value;\n }else console.warn(rinfo.message);\n }else{\n let rinfo = await this.room.mwse.EventPooling.request(({\n type: \"room/info\",\n roomId: this.room.roomId\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.value;\n }else console.warn(rinfo.message);\n };\n return this.info;\n }\n public set(name: string, value: string | number)\n {\n this.info[name] = value;\n this.room.mwse.WSTSProtocol.SendOnly({\n type: \"room/setinfo\",\n roomId: this.room.roomId,\n name,\n value\n });\n }\n public get(name?:string)\n {\n return name ? this.info[name] : this.info;\n }\n}","import MWSE from \"./index\";\n\nexport interface Message {\n [key:string|number]:any;\n}\nexport default class WSTSProtocol\n{\n public mwse : MWSE;\n constructor(wsts:MWSE){\n this.mwse = wsts;\n this.addListener();\n }\n public addListener()\n {\n this.mwse.server?.onRecaivePack((pack)=>{\n this.PackAnalyze(pack)\n })\n }\n public SendRaw(pack: Message)\n {\n this.mwse.server.tranferToServer(pack);\n }\n public SendOnly(pack: Message)\n {\n this.mwse.server.tranferToServer([pack,'R']);\n }\n public SendRequest(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'R']);\n }\n public StartStream(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'S']);\n }\n public PackAnalyze(data:any)\n {\n let [payload, id, action] = data;\n if(typeof id === 'number')\n {\n let callback = this.mwse.EventPooling.events.get(id);\n if(callback)\n {\n callback[0](payload, action);\n switch(action)\n {\n case 'E':{ // [E]ND flag\n this.mwse.EventPooling.events.delete(id);\n break;\n }\n case 'S': // [S]TREAM flag\n default:{\n break;\n }\n }\n }else console.warn(\"Missing event sended from server\");\n }else{\n let signals = this.mwse.EventPooling.signals.get(id);\n if(signals)\n {\n for (const callback of signals) {\n callback(payload);\n }\n }else console.warn(\"Missing event sended from server\");\n }\n }\n}"],"names":[],"version":3,"file":"index.js.map"}
\ No newline at end of file