diff --git a/frontend/Peer.ts b/frontend/Peer.ts index 9715234..87367bd 100644 --- a/frontend/Peer.ts +++ b/frontend/Peer.ts @@ -219,7 +219,12 @@ export default class Peer extends EventTarget to: this.socketId }); }else{ - this.rtc?.sendMessage(pack) + if(pack.type != ':rtcpack:') + { + this.rtc?.sendMessage(pack) + }else{ + return console.warn("Socket is not writable"); + } } } async forget(){ diff --git a/frontend/WebRTC.ts b/frontend/WebRTC.ts index df099b7..1c90ba5 100644 --- a/frontend/WebRTC.ts +++ b/frontend/WebRTC.ts @@ -201,6 +201,7 @@ export default class WebRTC }; sendingStream.senders = senders; } + this.emit('stream:accepted', sendingStream); break; } case "message":{ diff --git a/frontend/index.ts b/frontend/index.ts index 0fc737a..241550f 100644 --- a/frontend/index.ts +++ b/frontend/index.ts @@ -184,13 +184,13 @@ export default class MWSE extends EventTarget { let peer = this.peer(from, true); peer.info.info = info; peer.emit("accepted/pair", peer); - this.peer('me').emit('accepted/pairr', peer); + this.peer('me').emit('accepted/pair', peer); }) this.EventPooling.signal("end/pair", (payload : {from : string,info: any}) => { let {from, info} = payload; let peer = this.peer(from, true); - peer.emit("endPair", info); - this.peer('me').emit('endPair', from, info); + peer.emit("end/pair", info); + this.peer('me').emit('end/pair', from, info); }) } public room(options: IRoomOptions | string) : Room diff --git a/public/index.css b/public/index.css index 2017087..649b408 100644 --- a/public/index.css +++ b/public/index.css @@ -16,7 +16,7 @@ body{ height: 100%; display: flex; flex-wrap: nowrap; - flex-direction: row; + flex-direction: column; box-sizing: border-box; overflow: hidden; } @@ -139,4 +139,41 @@ video{ background-color: red; transition: width 0.05s linear; } +} +.controllist{ + display: flex; + flex-direction: row; + flex-wrap: nowrap; + gap: 12px; + flex: 1 1 auto; +} + +.ctrl-btn { + width: 48px; + height: 48px; + border: 1px solid #ccc; + border-radius: 8px; + background: #fff; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: background 0.2s, border-color 0.2s; +} + +.ctrl-btn:hover { + background: #f0f0f0; + border-color: #999; +} + +.ctrl-btn .material-icons { + font-size: 26px; +} + +.logo{ + object-fit: contain; + max-height: 50px; + width: 100%; + background-color: white; + border-radius: 10px; } \ No newline at end of file diff --git a/public/index.html b/public/index.html index e8e02c3..fb76c63 100644 --- a/public/index.html +++ b/public/index.html @@ -13,6 +13,34 @@
+
+
+
+ +
+
+ + + + + + +
+
+
+
diff --git a/public/index.js b/public/index.js index d571d6b..002241a 100644 --- a/public/index.js +++ b/public/index.js @@ -31,7 +31,9 @@ let outgoingStream; * @type {HTMLDivElement} */ let videoContainer = document.querySelector(".videolist"); -let maxbitrate; +let amaxb; +let vmaxb; +let rate; let resulation; let activePeers = {} @@ -60,6 +62,7 @@ document.addEventListener("click",()=>{ }) + /** * @type {HTMLVideoElement} */ @@ -135,33 +138,25 @@ async function beginEngine() myIPAddress = await mwse.virtualPressure.allocAPIPAddress(); myNumber = await mwse.virtualPressure.allocAPNumber(); roomid = url.searchParams.get("room"); + user = url.searchParams.get("user") ?? "User"; + vmaxb = url.searchParams.get("vmaxb") ?? 32_0000 + amaxb = url.searchParams.get("amaxb") ?? 2500000 + resulation = url.searchParams.get("resulation") ?? 1 + rate = url.searchParams.get("rate") ?? 10 if(!!roomid == 0) { let hash = window.crypto.randomUUID(); url.searchParams.set("room", hash); + url.searchParams.set("vmaxb", vmaxb); + url.searchParams.set("amaxb", amaxb); + url.searchParams.set("resulation", resulation); + url.searchParams.set("rate", rate); + url.searchParams.set("user", user); window.location = url.href; }; connectRoom(roomid); - - if(url.searchParams.get("maxbitrate")) - { - let n = Number(url.searchParams.get("maxbitrate")); - if(Number.isFinite(n) && !Number.isNaN(n)) - { - maxbitrate = n; - }else maxbitrate = 2500_000; - }else maxbitrate = 2500_000; - - if(url.searchParams.get("resulation")) - { - let n = Number(url.searchParams.get("resulation")); - if(Number.isFinite(n) && !Number.isNaN(n)) - { - resulation = n; - }else resulation = 1.2; - }else resulation = 1.2; }; window.addEventListener("load", () => { @@ -241,15 +236,16 @@ async function IncomingPeer(peer,activeConnect) urls: "stun:stun.l.google.com:19302" }]); - if(activeConnect) + if(peer.rtc.isPolite()) { peer.rtc.connect(); } peer.rtc.rtc.turboBitrate = 0; peer.rtc.on('connected',() => { - if(!activeConnect) + if(peer.rtc.isPolite()) { peer.rtc.sendStream(outgoingStream, "Webcam", {}); + activePeers[peer.socketId] = peer; } }); peer.rtc.on('disconnected',() => { @@ -264,9 +260,10 @@ async function IncomingPeer(peer,activeConnect) void 0, peer.info.get("name") ); - if(activeConnect) + if(peer.rtc.isPolite() == false) { peer.rtc.sendStream(outgoingStream, "Webcam", {}); + activePeers[peer.socketId] = peer; } }) } @@ -282,18 +279,32 @@ function OutgoingPeer(peer) let relative; setInterval(() => { - for(const [,peerRtc] of Object.entries(activePeers)) + for(const [,peer] of Object.entries(activePeers)) { - if(peerRtc?.turboBitrate !== 1) + let peerRtc = peer.rtc.rtc; + const senders = peerRtc.getSenders(); + if(peerRtc.vturboBitrate !== 1) { - const senders = peerRtc.getSenders(); const videoSender = senders.find(sender => sender.track?.kind === 'video'); if(videoSender){ const parameters = videoSender.getParameters(); - parameters.encodings[0].maxBitrate = maxbitrate; + parameters.encodings[0].maxBitrate = vmaxb; parameters.encodings[0].scaleResolutionDownBy = resulation; + parameters.encodings[0].maxFramerate = rate; videoSender.setParameters(parameters).then(() => { - peerRtc.turboBitrate = 1; + peerRtc.vturboBitrate = 1; + }); + } + } + + if(peerRtc.aturboBitrate !== 1) + { + const audioSender = senders.find(sender => sender.track?.kind === 'audio'); + if(audioSender){ + const parameters = audioSender.getParameters(); + parameters.encodings[0].maxBitrate = amaxb; + audioSender.setParameters(parameters).then(() => { + peerRtc.aturboBitrate = 1; }); } } @@ -301,13 +312,6 @@ setInterval(() => { },1000); function bindAudioLevel(stream, element, options = {}) { - const { - minPercent = 5, - maxPercent = 100, - decayRate = 0.97, // 0.9–0.99 arasında önerilir - volumeScale = 2.0 // gelen rms değerini büyütmek için (normalize daha geniş aralık) - } = options; - const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); const source = audioCtx.createMediaStreamSource(stream); const analyser = audioCtx.createAnalyser(); diff --git a/public/m.h.2.8.8.js b/public/m.h.2.8.8.js index 70ff182..7b999df 100644 --- a/public/m.h.2.8.8.js +++ b/public/m.h.2.8.8.js @@ -1,208 +1,175 @@ -function HostListItem() -{ - let item = $(` - - - - - - - - - - DCIM_AMG_25TEM2025.png -
- - (Sizin cihazda) - - - -
-
-
- - - `); - return { - download: item.find(".action-download"), - hide: item.find(".action-hide"), - remove: item.find(".action-remove"), - sha1: item.find(".action-sha1"), - filename: item.find(".action-filename"), - progress: item.find(".progress"), - container: item - } -} +/** + * ================================================================= + * LİSANS BİLDİRİMİ -LGPL - LGPL-AU-EK + * ================================================================= + * * Yazar (Original Author): Abdussamed ulutaş + * * İzinler (Permissions): + * --------------------- + * Bu kod, ticari veya kişisel amaçlarla serbestçe OKUNABILIR, + * KOPYALANABILIR, ÇOĞALTILABILIR, DEĞIŞTIRILEBILIR ve KULLANILABILIR. + * * * Koşul (Zorunlu Atıf Şartı - Attribution Requirement): + * --------------------------------------------------- + * Bu yazılımın temelindeki ANA ALGORITMA tamamen ve özgün bir şekilde değiştirilmediği sürece, + * "author by Abdussamed ulutaş" ifadesi kodun içerisinde MUTLAKA KORUNMALIDIR. + * * NOT: Algoritmanın temel mantığı korunarak yapılan küçük değişiklikler, + * optimizasyonlar veya arayüz entegrasyonları, bu atıf ifadesinin kaldırılması için yeterli sayılmaz. + * * * Sorumluluk Reddi (Disclaimer): + * ---------------------------- + * Bu yazılım "olduğu gibi" (as-is) sağlanmıştır. Yazar, yazılımın kullanımından + * kaynaklanacak hiçbir zarardan sorumlu değildir. + * * ================================================================= + */ -function RemoteListItem() -{ - let item = $(` - - - - - - - - - - DCIM.mp4 -
- - (Karşı cihazda) - - - -
-
-
- - - `); - return { - download: item.find(".action-download"), - hide: item.find(".action-hide"), - remove: item.find(".action-remove"), - sha1: item.find(".action-sha1"), - filename: item.find(".action-filename"), - progress: item.find(".progress"), - container: item - } -} - -function EmptyListItem() -{ - return $(` - - - Gönderilecek veya alınacak dosya bulunmuyor - - - `) -} - -function formatBytes(a,b=2){if(!+a)return"0 Bytes";const c=0>b?0:b,d=Math.floor(Math.log(a)/Math.log(1024));return`${parseFloat((a/Math.pow(1024,d)).toFixed(c))} ${["Bytes","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"][d]}`} +// Aşağıdaki satır, atıf şartını yerine getiren zorunlu ifadedir ve kodun içinde kalmalıdır: +// +// author by Abdussamed ulutaş +// +// ================================================================= -const endpoint = `wss://ws.saqut.com/socket/webserver/${("000000"+(Math.random() * 512 | 0)).slice(-6)}.sock`; - -let mwse = new MWSE({ - endpoint, - autoReconnect: true, - autoReconnectTimeout: 60_000 -}); - -mwse.scope(Connect); - -let room; -let ip; - -async function Connect() -{ - await genRoom(); - $(".network-id").text(ip); -} - -async function genRoom() -{ - do{ - let vip = ip = [ - (Math.random() * 16 | 0) + 10, - (Math.random() * 8 | 0), - (Math.random() * 4 | 0), - (Math.random() * 254 | 0) + 1 - ].join('.'); - room = mwse.room({ - name: `WEB3-Smash [${vip}] RO CONNECT:2`, - description: "Web3 Smash saQut Server Application", - joinType: "free", - notifyActionJoined: true, - notifyActionEjected: true, - ifexistsJoin: false - }); - try{ - await room.createRoom(); - break; - }catch{ - continue; - } - }while(1); -} - -class FileDescriptor { - static hostfiles = new Map(); - static remotefiles = new Map(); - static hostindex = 0; - static remoteindex = 0; - - file = null; - listItem = null; - - constructor(isHost, item,file){ - this.file = file; - this.listItem = item; - $("#thelist").append(item.container); - if(isHost) - { - FileDescriptor.hostfiles.set( - ++FileDescriptor.hostindex, - this - ); - }else{ - FileDescriptor.remotefiles.set( - ++FileDescriptor.remoteindex, - this - ); - } - this.init(); - } - init(){ - this.listItem.filename.html( - this.file.name + " " + formatBytes(this.file.size) + "" - ); - } -}; - -$("#files").on('change',function(){ - for (const file of this.files) { - $("#thelist .empty").remove(); - new FileDescriptor( - true, - HostListItem(), - file - ) - }; - $("#files").val(''); -}); - -$(".joinroom").on("chnage",function(){ - - let ip = $("#remoteadress").val(); - - if(!/^\d+\.\d+\.\d+$/.test(ip)){ - return alert(" ") - } - - $("#thelist .empty").remove(); +/* + - Tüm dizinler herkese görünecek + - Dizinler ve dosyalar arayüzden tekrarlanamayacak + - Dosya ve klasör isimler aynı isimde olabilir + - Kimse bir başkasının dosyasını ve klasörünü silemez - room = mwse.room({ - name: `WEB3-Smash [${vip}] RO CONNECT:2`, - description: "Web3 Smash saQut Server Application", - joinType: "free", - notifyActionJoined: true, - notifyActionEjected: true, - ifexistsJoin: false - }); -}) \ No newline at end of file + - Yeni bir kişi bağlandığında dizin listesi eşitleniyor olacak + - Bağlanılan kişi ayrıldığında ona ait olan tüm dosya/dizin sistemi silinecek +*/ + +function é(rule) +{ + if(é.element == null) + { + /** @type {HTMLStyleElement} */ + é.element = document.createElement("style"); + document.head.appendChild(é.element); + /** @type {CSSStyleSheet} */ + é.sheet = é.element.sheet; + } + é.sheet.insertRule(rule); +} + +é`html,body{ + background-color: black; + height: 100%; + font-size: 14px; + > * { + box-sizing:border-box; + } +}`; +é`body{ + display: flex; + flex-direction: row; + flex-wrap: nowrap; + padding: 20px; + overflow: hidden; +}`; + +é`@keyframes color-transition { + 0% { + color: #c8c8c8; + } + 50% { + color: #757575; + } + 100% { + color: #c8c8c8; + } +}`; + +/// UI + +// + +const UIM = new class UI { + constructor(){ + this.setup(); + } + setup(){ + this.setupOutContainer(); + this.setupDirentContainer(); + } + /** @type {JQuery} */ + container = null; + setupOutContainer(){ + this.container = $("
"); + this.container.addClass("dip-fev"); + é`.dip-fev{ + width: 100%; + height: 100%; + background-color: rgba(255,255,255,0.2); + position: relative; + border-radius: 5px; + border: solid 1px rgba(255,255,255,0.1); + display: flex; + overflow: auto; + flex-direction: column; + flex-wrap: nowrap; + }`; + document.body.append(this.container.get(0)); + } + /** @type {JQuery} */ + direntbezier = null; + setupDirentContainer(){ + this.direntbezier = $("
"); + this.direntbezier.addClass("dip-bezier"); + é`.dip-bezier{ + flex: 0 0 auto; + background-color: rgba(255,255,255,0.2); + display: flex; + flex-direction: row; + flex-wrap: nowrap; + padding: 5px; + & > .dip-bezier-icon{ + padding: 3px; + animation: color-transition 1s ease-in-out infinite; + } + & > .dip-bezier-disk{ + color: white; + padding: 3px; + } + & > .dip-bezier-object{ + color: white; + padding: 3px 2px; + cursor: pointer; + border-radius: 3px; + &:hover{ + background-color: rgba(255,255,255,0.05); + } + } + & > .dip-bezier-splitter{ + margin: 5px 2px; + width: 1px; + background-color: rgba(0,0,0,0.1); + } + }`; + this.container.append(this.direntbezier); + + this.setupBezier("Diskim",["Resimler","Yakalamalar","Benim yakalamalarım"]); + } + setupBezier(disk, folders){ + let icon = $(""); + icon.addClass("dip-bezier-icon material-symbols-outlined"); + icon.text("bigtop_updates"); + this.direntbezier.append(icon); + + let section = $("
"); + section.addClass("dip-bezier-disk"); + section.html(disk + " ://"); + this.direntbezier.append(section); + + folders.map((element, index, array) => { + let section = $("
"); + section.addClass("dip-bezier-object"); + section.text(element); + this.direntbezier.append(section); + if(index < array.length - 1) + { + let sectionPadding = $("
"); + sectionPadding.addClass("dip-bezier-splitter"); + this.direntbezier.append(sectionPadding); + } + }); + } +} \ No newline at end of file diff --git a/public/m.h.2.8.9.js b/public/m.h.2.8.9.js new file mode 100644 index 0000000..f1b7ae0 --- /dev/null +++ b/public/m.h.2.8.9.js @@ -0,0 +1,27 @@ +/** + * ================================================================= + * LİSANS BİLDİRİMİ - LGPL - LGPL-AU-EK + * ================================================================= + * * Yazar (Original Author): Abdussamed ulutaş + * * İzinler (Permissions): + * --------------------- + * Bu kod, ticari veya kişisel amaçlarla serbestçe OKUNABILIR, + * KOPYALANABILIR, ÇOĞALTILABILIR, DEĞIŞTIRILEBILIR ve KULLANILABILIR. + * * * Koşul (Zorunlu Atıf Şartı - Attribution Requirement): + * --------------------------------------------------- + * Bu yazılımın temelindeki ANA ALGORITMA tamamen ve özgün bir şekilde değiştirilmediği sürece, + * "author by Abdussamed ulutaş" ifadesi kodun içerisinde MUTLAKA KORUNMALIDIR. + * * NOT: Algoritmanın temel mantığı korunarak yapılan küçük değişiklikler, + * optimizasyonlar veya arayüz entegrasyonları, bu atıf ifadesinin kaldırılması için yeterli sayılmaz. + * * * Sorumluluk Reddi (Disclaimer): + * ---------------------------- + * Bu yazılım "olduğu gibi" (as-is) sağlanmıştır. Yazar, yazılımın kullanımından + * kaynaklanacak hiçbir zarardan sorumlu değildir. + * * ================================================================= + */ + +// Aşağıdaki satır, atıf şartını yerine getiren zorunlu ifadedir ve kodun içinde kalmalıdır: +// +// author by Abdussamed ulutaş +// +// ================================================================= diff --git a/public/transfer.html b/public/transfer.html index 2941199..b70b97f 100644 --- a/public/transfer.html +++ b/public/transfer.html @@ -6,58 +6,10 @@ Dosya Transfer Sistem + + -
- -

Dosya Transfer Sistemi

-

- Ağ Adresiniz - - #.#.#.# - -

- -
-
- -
-
- - -
-
- - - - - - - - - - - - - - - -
İşlemSHA-1Dosya İsmiİşlem
- Gönderilecek veya alınacak dosya bulunmuyor -
-
diff --git a/script/index.js b/script/index.js index fd59a0b..e135477 100644 --- a/script/index.js +++ b/script/index.js @@ -1,5 +1,390 @@ -(() => { -class $d59cdc9b12df098b$export$98b66c25bb38499d { +// modules are defined as an array +// [ module function, map of requires ] +// +// map of requires is short require name -> numeric require +// +// anything defined in a previous bundle is accessed via the +// orig method which is the require for previous bundles + +(function ( + modules, + entry, + mainEntry, + parcelRequireName, + externals, + distDir, + publicUrl, + devServer +) { + /* eslint-disable no-undef */ + var globalObject = + typeof globalThis !== 'undefined' + ? globalThis + : typeof self !== 'undefined' + ? self + : typeof window !== 'undefined' + ? window + : typeof global !== 'undefined' + ? global + : {}; + /* eslint-enable no-undef */ + + // Save the require from previous bundle to this closure if any + var previousRequire = + typeof globalObject[parcelRequireName] === 'function' && + globalObject[parcelRequireName]; + + var importMap = previousRequire.i || {}; + var cache = previousRequire.cache || {}; + // Do not use `require` to prevent Webpack from trying to bundle this call + var nodeRequire = + typeof module !== 'undefined' && + typeof module.require === 'function' && + module.require.bind(module); + + function newRequire(name, jumped) { + if (!cache[name]) { + if (!modules[name]) { + if (externals[name]) { + return externals[name]; + } + // if we cannot find the module within our internal map or + // cache jump to the current global require ie. the last bundle + // that was added to the page. + var currentRequire = + typeof globalObject[parcelRequireName] === 'function' && + globalObject[parcelRequireName]; + if (!jumped && currentRequire) { + return currentRequire(name, true); + } + + // If there are other bundles on this page the require from the + // previous one is saved to 'previousRequire'. Repeat this as + // many times as there are bundles until the module is found or + // we exhaust the require chain. + if (previousRequire) { + return previousRequire(name, true); + } + + // Try the node require function if it exists. + if (nodeRequire && typeof name === 'string') { + return nodeRequire(name); + } + + var err = new Error("Cannot find module '" + name + "'"); + err.code = 'MODULE_NOT_FOUND'; + throw err; + } + + localRequire.resolve = resolve; + localRequire.cache = {}; + + var module = (cache[name] = new newRequire.Module(name)); + + modules[name][0].call( + module.exports, + localRequire, + module, + module.exports, + globalObject + ); + } + + return cache[name].exports; + + function localRequire(x) { + var res = localRequire.resolve(x); + return res === false ? {} : newRequire(res); + } + + function resolve(x) { + var id = modules[name][1][x]; + return id != null ? id : x; + } + } + + function Module(moduleName) { + this.id = moduleName; + this.bundle = newRequire; + this.require = nodeRequire; + this.exports = {}; + } + + newRequire.isParcelRequire = true; + newRequire.Module = Module; + newRequire.modules = modules; + newRequire.cache = cache; + newRequire.parent = previousRequire; + newRequire.distDir = distDir; + newRequire.publicUrl = publicUrl; + newRequire.devServer = devServer; + newRequire.i = importMap; + newRequire.register = function (id, exports) { + modules[id] = [ + function (require, module) { + module.exports = exports; + }, + {}, + ]; + }; + + // Only insert newRequire.load when it is actually used. + // The code in this file is linted against ES5, so dynamic import is not allowed. + // INSERT_LOAD_HERE + + Object.defineProperty(newRequire, 'root', { + get: function () { + return globalObject[parcelRequireName]; + }, + }); + + globalObject[parcelRequireName] = newRequire; + + for (var i = 0; i < entry.length; i++) { + newRequire(entry[i]); + } + + if (mainEntry) { + // Expose entry point to Node, AMD or browser globals + // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js + var mainExports = newRequire(mainEntry); + + // CommonJS + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = mainExports; + + // RequireJS + } else if (typeof define === 'function' && define.amd) { + define(function () { + return mainExports; + }); + } + } +})({"3FuxY":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +var _connection = require("./Connection"); +var _eventPool = require("./EventPool"); +var _eventPoolDefault = parcelHelpers.interopDefault(_eventPool); +var _eventTarget = require("./EventTarget"); +var _eventTargetDefault = parcelHelpers.interopDefault(_eventTarget); +var _ippressure = require("./IPPressure"); +var _peer = require("./Peer"); +var _peerDefault = parcelHelpers.interopDefault(_peer); +var _room = require("./Room"); +var _roomDefault = parcelHelpers.interopDefault(_room); +var _wstsprotocol = require("./WSTSProtocol"); +var _wstsprotocolDefault = parcelHelpers.interopDefault(_wstsprotocol); +class MWSE extends (0, _eventTargetDefault.default) { + /*public static compress(message:string, callback:(e:any) => any) + { + let u : any= []; + let C = new Gzip({ + level: 9, + mem: 12 + },(stream,isLast) => { + u.push(stream); + if(isLast) + { + callback(u); + } + }); + C.push(new TextEncoder().encode(message), true); + }*/ constructor(options){ + super(), this.rooms = new Map(), this.pairs = new Map(), this.peers = new Map(), this.writable = 1, this.readable = 1; + MWSE.rtc = MWSE; + this.server = new (0, _connection.Connection)(this, options); + this.WSTSProtocol = new (0, _wstsprotocolDefault.default)(this); + this.EventPooling = new (0, _eventPoolDefault.default)(this); + this.virtualPressure = new (0, _ippressure.IPPressure)(this); + this.server.connect(); + this.me = new (0, _peerDefault.default)(this); + this.me.scope(()=>{ + this.peers.set('me', this.me); + this.peers.set(this.me.socketId, this.me); + }); + this.server.onActive(async ()=>{ + this.me.setSocketId('me'); + await this.me.metadata(); + this.emit('scope'); + this.activeScope = true; + }); + this.server.onPassive(async ()=>{ + this.emit('close'); + }); + this.packMessagingSystem(); + } + destroy() { + this.server.disconnect(); + } + enableRecaiveData() { + this.WSTSProtocol.SendOnly({ + type: 'connection/packrecaive', + value: 1 + }); + this.readable = 1; + } + disableRecaiveData() { + this.WSTSProtocol.SendOnly({ + type: 'connection/packrecaive', + value: 0 + }); + this.readable = 0; + } + enableSendData() { + this.WSTSProtocol.SendOnly({ + type: 'connection/packsending', + value: 1 + }); + this.writable = 1; + } + disableSendData() { + this.WSTSProtocol.SendOnly({ + type: 'connection/packsending', + value: 0 + }); + this.writable = 0; + } + enableNotifyRoomInfo() { + this.WSTSProtocol.SendOnly({ + type: 'connection/roominfo', + value: 1 + }); + } + disableNotifyRoomInfo() { + this.WSTSProtocol.SendOnly({ + type: 'connection/roominfo', + value: 0 + }); + } + async request(peerId, pack) { + let { pack: answer } = await this.EventPooling.request({ + type: 'request/to', + to: peerId, + pack + }); + return answer; + } + async response(peerId, requestId, pack) { + this.WSTSProtocol.SendOnly({ + type: 'response/to', + to: peerId, + pack, + id: requestId + }); + } + packMessagingSystem() { + this.EventPooling.signal('pack', (payload)=>{ + if (this.readable) { + let { from, pack } = payload; + this.peer(from, true).emit('pack', pack); + } + }); + this.EventPooling.signal('request', (payload)=>{ + let { from, pack, id } = payload; + let scope = { + body: pack, + response: (pack)=>{ + this.response(from, id, pack); + }, + peer: this.peer(from, true) + }; + this.peer(from, true).emit('request', scope); + this.peer('me').emit('request', scope); + }); + this.EventPooling.signal('pack/room', (payload)=>{ + if (this.readable) { + let { from, pack, sender } = payload; + this.room(from).emit('message', pack, this.peer(sender)); + } + }); + this.EventPooling.signal('room/joined', (payload)=>{ + let { id, roomid } = payload; + let room = this.room(roomid); + let peer = this.peer(id, true); + room.peers.set(peer.socketId, peer); + room.emit('join', peer); + }); + this.EventPooling.signal('room/info', (payload)=>{ + let { roomId, name, value } = payload; + this.room(roomId).emit('updateinfo', name, value); + }); + this.EventPooling.signal('room/ejected', (payload)=>{ + let { id, roomid } = payload; + let room = this.room(roomid); + let peer = this.peer(id, true); + room.peers.delete(peer.socketId); + room.emit('eject', peer); + }); + this.EventPooling.signal('room/closed', (payload)=>{ + let { roomid } = payload; + let room = this.room(roomid); + room.peers.clear(); + room.emit('close'); + this.rooms.delete(roomid); + }); + this.EventPooling.signal("pair/info", (payload)=>{ + let { from, name, value } = payload; + let peer = this.peer(from, true); + peer.info.info[name] = value; + peer.emit("info", name, value); + }); + this.EventPooling.signal("request/pair", (payload)=>{ + let { from, info } = payload; + let peer = this.peer(from, true); + peer.info.info = info; + peer.emit("request/pair", peer); + this.peer('me').emit('request/pair', peer); + }); + this.EventPooling.signal("peer/disconnect", (payload)=>{ + let { id } = payload; + let peer = this.peer(id, true); + peer.emit("disconnect", peer); + }); + this.EventPooling.signal("accepted/pair", (payload)=>{ + let { from, info } = payload; + let peer = this.peer(from, true); + peer.info.info = info; + peer.emit("accepted/pair", peer); + this.peer('me').emit('accepted/pairr', peer); + }); + this.EventPooling.signal("end/pair", (payload)=>{ + let { from, info } = payload; + let peer = this.peer(from, true); + peer.emit("endPair", info); + this.peer('me').emit('endPair', from, info); + }); + } + room(options) { + if (typeof options == "string") { + if (this.rooms.has(options)) return this.rooms.get(options); + } + let room = new (0, _roomDefault.default)(this); + room.setRoomOptions(options); + this.emit('room'); + return room; + } + peer(options, isActive = false) { + if (typeof options == "string") { + if (this.peers.has(options)) return this.peers.get(options); + if (this.pairs.has(options)) return this.pairs.get(options); + } + let peer = new (0, _peerDefault.default)(this); + peer.setPeerOptions(options); + peer.active = isActive; + this.peers.set(peer.socketId, peer); + this.emit('peer', peer); + return peer; + } +} +exports.default = MWSE; +window.MWSE = MWSE; + +},{"./Connection":"1vUh4","./EventPool":"602qx","./EventTarget":"faGYI","./IPPressure":"l0Hru","./Peer":"imPsO","./Room":"7JoU4","./WSTSProtocol":"i9gBw","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"1vUh4":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "Connection", ()=>Connection); +class Connection { constructor(mwse, options){ this.autoPair = false; this.connected = false; @@ -44,7 +429,7 @@ class $d59cdc9b12df098b$export$98b66c25bb38499d { this.ws.addEventListener("open", ()=>this.eventOpen()); this.ws.addEventListener("close", ()=>this.eventClose()); this.ws.addEventListener("error", ()=>this.eventError()); - this.ws.addEventListener("message", ({ data: data })=>this.eventMessage(data)); + this.ws.addEventListener("message", ({ data })=>this.eventMessage(data)); } eventOpen() { this.connected = true; @@ -80,8 +465,40 @@ class $d59cdc9b12df098b$export$98b66c25bb38499d { } } +},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"4KC4J":[function(require,module,exports,__globalThis) { +exports.interopDefault = function(a) { + return a && a.__esModule ? a : { + default: a + }; +}; +exports.defineInteropFlag = function(a) { + Object.defineProperty(a, '__esModule', { + value: true + }); +}; +exports.exportAll = function(source, dest) { + Object.keys(source).forEach(function(key) { + if (key === 'default' || key === '__esModule' || Object.prototype.hasOwnProperty.call(dest, key)) return; + Object.defineProperty(dest, key, { + enumerable: true, + get: function() { + return source[key]; + } + }); + }); + return dest; +}; +exports.export = function(dest, destName, get) { + Object.defineProperty(dest, destName, { + enumerable: true, + get: get + }); +}; -class $8792581153d3df4a$export$2e2bcd8739ae039 { +},{}],"602qx":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +class EventPool { constructor(wsts){ this.events = new Map(); this.signals = new Map(); @@ -121,9 +538,12 @@ class $8792581153d3df4a$export$2e2bcd8739ae039 { else T.push(callback); } } +exports.default = EventPool; - -class $90404382037abbde$export$2e2bcd8739ae039 { +},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"faGYI":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +class EventTarget { emit(eventName, ...args) { if (this.events[eventName]) for (const callback of this.events[eventName])callback(...args); } @@ -142,14 +562,18 @@ class $90404382037abbde$export$2e2bcd8739ae039 { this.activeScope = false; } } +exports.default = EventTarget; - -class $bce1fa8513c32a76$export$cd59d3e68ede65a1 { +},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"l0Hru":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "IPPressure", ()=>IPPressure); +class IPPressure { constructor(mwse){ this.mwse = mwse; } async allocAPIPAddress() { - let { status: status, ip: ip } = await this.mwse.EventPooling.request({ + let { status, ip } = await this.mwse.EventPooling.request({ type: 'alloc/APIPAddress' }); if (status == 'success') { @@ -158,7 +582,7 @@ class $bce1fa8513c32a76$export$cd59d3e68ede65a1 { } else throw new Error("Error Allocated Access Point IP Address"); } async allocAPNumber() { - let { status: status, number: number } = await this.mwse.EventPooling.request({ + let { status, number } = await this.mwse.EventPooling.request({ type: 'alloc/APNumber' }); if (status == 'success') { @@ -167,7 +591,7 @@ class $bce1fa8513c32a76$export$cd59d3e68ede65a1 { } else throw new Error("Error Allocated Access Point Number"); } async allocAPShortCode() { - let { status: status, code: code } = await this.mwse.EventPooling.request({ + let { status, code } = await this.mwse.EventPooling.request({ type: 'alloc/APShortCode' }); if (status == 'success') { @@ -176,7 +600,7 @@ class $bce1fa8513c32a76$export$cd59d3e68ede65a1 { } else throw new Error("Error Allocated Access Point Short Code"); } async reallocAPIPAddress() { - let { status: status, ip: ip } = await this.mwse.EventPooling.request({ + let { status, ip } = await this.mwse.EventPooling.request({ type: 'realloc/APIPAddress' }); if (status == 'success') { @@ -185,7 +609,7 @@ class $bce1fa8513c32a76$export$cd59d3e68ede65a1 { } else throw new Error("Error Reallocated Access Point IP Address"); } async reallocAPNumber() { - let { status: status, number: number } = await this.mwse.EventPooling.request({ + let { status, number } = await this.mwse.EventPooling.request({ type: 'realloc/APNumber' }); if (status == 'success') { @@ -194,7 +618,7 @@ class $bce1fa8513c32a76$export$cd59d3e68ede65a1 { } else throw new Error("Error Reallocated Access Point Number"); } async reallocAPShortCode() { - let { status: status, code: code } = await this.mwse.EventPooling.request({ + let { status, code } = await this.mwse.EventPooling.request({ type: 'realloc/APShortCode' }); if (status == 'success') { @@ -203,28 +627,28 @@ class $bce1fa8513c32a76$export$cd59d3e68ede65a1 { } else throw new Error("Error Reallocated Access Point Short Code"); } async releaseAPIPAddress() { - let { status: status } = await this.mwse.EventPooling.request({ + let { status } = await this.mwse.EventPooling.request({ type: 'release/APIPAddress' }); if (status == 'success') this.APIPAddress = undefined; else throw new Error("Error release Access Point IP Address"); } async releaseAPNumber() { - let { status: status } = await this.mwse.EventPooling.request({ + let { status } = await this.mwse.EventPooling.request({ type: 'release/APNumber' }); if (status == 'success') this.APNumber = undefined; else throw new Error("Error release Access Point Number"); } async releaseAPShortCode() { - let { status: status } = await this.mwse.EventPooling.request({ + let { status } = await this.mwse.EventPooling.request({ type: 'release/APShortCode' }); if (status == 'success') this.APShortCode = undefined; else throw new Error("Error release Access Point Short Code"); } async queryAPIPAddress(ip) { - let { status: status, socket: socket } = await this.mwse.EventPooling.request({ + let { status, socket } = await this.mwse.EventPooling.request({ type: 'whois/APIPAddress', whois: ip }); @@ -232,7 +656,7 @@ class $bce1fa8513c32a76$export$cd59d3e68ede65a1 { else return null; } async queryAPNumber(number) { - let { status: status, socket: socket } = await this.mwse.EventPooling.request({ + let { status, socket } = await this.mwse.EventPooling.request({ type: 'whois/APNumber', whois: number }); @@ -240,7 +664,7 @@ class $bce1fa8513c32a76$export$cd59d3e68ede65a1 { else return null; } async queryAPShortCode(code) { - let { status: status, socket: socket } = await this.mwse.EventPooling.request({ + let { status, socket } = await this.mwse.EventPooling.request({ type: 'whois/APShortCode', whois: code }); @@ -249,9 +673,187 @@ class $bce1fa8513c32a76$export$cd59d3e68ede65a1 { } } +},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"imPsO":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +var _eventTarget = require("./EventTarget"); +var _eventTargetDefault = parcelHelpers.interopDefault(_eventTarget); +var _peerInfo = require("./PeerInfo"); +var _webRTC = require("./WebRTC"); +var _webRTCDefault = parcelHelpers.interopDefault(_webRTC); +var IMessageSymbase = /*#__PURE__*/ function(IMessageSymbase) { + IMessageSymbase[IMessageSymbase["PayloadMessagePack"] = -12873.54] = "PayloadMessagePack"; + IMessageSymbase[IMessageSymbase["PayloadRTCBasePack"] = -12884.54] = "PayloadRTCBasePack"; + return IMessageSymbase; +}(IMessageSymbase || {}); +class Peer extends (0, _eventTargetDefault.default) { + constructor(wsts){ + super(), this.options = {}, this.selfSocket = false, this.active = false, this.peerConnection = false, this.primaryChannel = "datachannel"; + this.mwse = wsts; + this.rtc = this.createRTC(); + this.info = new (0, _peerInfo.PeerInfo)(this); + this.on('pack', (data)=>{ + if (data.type == ':rtcpack:') return this.rtc.emit("input", data.payload); + this.emit("message", data); + }); + } + createRTC(rtcConfig, rtcServers) { + this.rtc = new (0, _webRTCDefault.default)(rtcConfig, rtcServers); + this.rtc.peer = this; + this.rtc.on("connected", ()=>{ + this.peerConnection = true; + }); + this.rtc.on('disconnected', ()=>{ + this.peerConnection = false; + }); + this.rtc.on("output", (payload)=>{ + this.send({ + type: ':rtcpack:', + payload: payload + }); + }); + this.rtc.on("message", (payload)=>{ + this.emit("pack", payload); + }); + return this.rtc; + } + setPeerOptions(options) { + if (typeof options == "string") this.setSocketId(options); + else this.options = options; + } + setSocketId(uuid) { + this.socketId = uuid; + } + async metadata() { + if (this.socketId == 'me') { + let result = await this.mwse.EventPooling.request({ + type: 'my/socketid' + }); + this.selfSocket = true; + this.active ||= true; + this.socketId = result; + this.emit('scope'); + this.activeScope = true; + return result; + } + } + async request(pack) { + if (this.active) return await this.mwse.request(this.socketId, pack); + } + equalTo(peer) { + return this.socketId == peer.socketId; + } + async isReachable() { + return await this.mwse.EventPooling.request({ + type: 'is/reachable', + to: this.socketId + }); + } + async enablePairAuth() { + await this.mwse.EventPooling.request({ + type: 'auth/pair-system', + value: 'everybody' + }); + } + async disablePairAuth() { + await this.mwse.EventPooling.request({ + type: 'auth/pair-system', + value: 'disable' + }); + } + async enablePairInfo() { + await this.mwse.EventPooling.request({ + type: 'connection/pairinfo', + value: true + }); + } + async disablePairInfo() { + await this.mwse.EventPooling.request({ + type: 'connection/pairinfo', + value: false + }); + } + async requestPair() { + let { message, status } = await this.mwse.EventPooling.request({ + type: 'request/pair', + to: this.socketId + }); + if (message == "ALREADY-PAIRED" || message == "ALREADY-REQUESTED") console.warn("Already paired or pair requested"); + if (status == "fail") { + console.error("Request Pair Error", status, message); + return false; + } + return true; + } + async endPair() { + await this.mwse.EventPooling.request({ + type: 'end/pair', + to: this.socketId + }); + this.forget(); + } + async acceptPair() { + let { message, status } = await this.mwse.EventPooling.request({ + type: 'accept/pair', + to: this.socketId + }); + if (status == "fail") { + console.error("Pair Error", status, message); + return false; + } + return true; + } + async rejectPair() { + let { message, status } = await this.mwse.EventPooling.request({ + type: 'reject/pair', + to: this.socketId + }); + if (status == "fail") { + console.error("Pair Error", status, message); + return false; + } + return true; + } + async getPairedList() { + let { value } = await this.mwse.EventPooling.request({ + type: 'pair/list', + to: this.socketId + }); + return value; + } + async send(pack) { + let isOpenedP2P = this.peerConnection && this.rtc?.active; + let isOpenedServer = this.mwse.server.connected; + let sendChannel; + if (isOpenedP2P && isOpenedServer) { + if (this.primaryChannel == "websocket") sendChannel = "websocket"; + else sendChannel = "datachannel"; + } else if (isOpenedServer) sendChannel = "websocket"; + else sendChannel = "datachannel"; + if (sendChannel == "websocket") { + if (!this.mwse.writable) return console.warn("Socket is not writable"); + await this.mwse.EventPooling.request({ + type: 'pack/to', + pack, + to: this.socketId + }); + } else { + if (pack.type != ':rtcpack:') this.rtc?.sendMessage(pack); + else return console.warn("Socket is not writable"); + } + } + async forget() { + this.mwse.peers.delete(this.socketId); + this.mwse.pairs.delete(this.socketId); + } +} +exports.default = Peer; - -class $008a5dfecd0a1d37$export$f3bd5f68ae16de { +},{"./EventTarget":"faGYI","./PeerInfo":"4gWZ7","./WebRTC":"buLge","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"4gWZ7":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "PeerInfo", ()=>PeerInfo); +class PeerInfo { constructor(mwse){ this.info = {}; this.peer = mwse; @@ -261,7 +863,7 @@ class $008a5dfecd0a1d37$export$f3bd5f68ae16de { let rinfo = await this.peer.mwse.EventPooling.request({ type: "peer/info", peer: this.peer.socketId, - name: name + name }); if (rinfo.status == "success") this.info = rinfo.info; else console.warn(rinfo.message); @@ -279,8 +881,8 @@ class $008a5dfecd0a1d37$export$f3bd5f68ae16de { this.info[name] = value; this.peer.mwse.WSTSProtocol.SendOnly({ type: "auth/info", - name: name, - value: value + name, + value }); } get(name) { @@ -288,195 +890,12 @@ class $008a5dfecd0a1d37$export$f3bd5f68ae16de { } } - -class $e751e9f3ea17ef94$export$2e2bcd8739ae039 { - constructor(webrtc, peer){ - this.totalSize = 0; - this.isReady = false; - this.isStarted = false; - this.isSending = false; - this.isRecaiving = false; - this.processedSize = 0; - this.bufferSizePerChannel = 10e6; - this.bufferSizePerPack = 10e3; - this.safeBufferSizePerPack = 9999; - this.webrtc = webrtc; - this.rtc = webrtc.rtc; - this.peer = peer; - } - async RecaiveFile(_rtc, fileMetadata, channelCount, _totalSize, onEnded) { - //let totals = {}; - // let index = 0; - /*setChannelStatus(Array.from({length:channelCount}).map((e, index) => { - return { - name: `${index+1}. Kanal`, - current: 0, - currentTotal: 0, - total: 0 - } - }));*/ let parts = []; - this.webrtc.on('datachannel', (datachannel)=>{ - //let channelIndex = index++; - let current = 0; - let totalSize = 0; - let currentPart = 0; - let bufferAmount = []; - datachannel.onmessage = function({ data: data }) { - if (totalSize == 0) { - let { size: size, part: part } = JSON.parse(data); - totalSize = size; - currentPart = part; - /*updateChannelStatus(channelIndex, n => { - return { - ...n, - total: totalSize, - current: 0 - } - });*/ datachannel.send("READY"); - } else { - current += data.byteLength; - bufferAmount.push(data); - /*updateChannelStatus(channelIndex, n => { - return { - ...n, - current: data.byteLength + n.current, - currentTotal: data.byteLength + n.currentTotal, - } - }); - setProcessedSize(n => n + data.byteLength);*/ if (current == totalSize) { - parts[currentPart] = new Blob(bufferAmount); - bufferAmount = []; - //totals[datachannel.label] += totalSize; - totalSize = 0; - currentPart = 0; - current = 0; - datachannel.send("TOTAL_RECAIVED"); - } - } - }; - datachannel.onclose = ()=>{ - channelCount--; - if (channelCount == 0) { - let file = new File(parts, fileMetadata.name, { - type: fileMetadata.type, - lastModified: +new Date - }); - onEnded(file); - } - }; - }); - } - async SendFile(file, metadata) { - this.isSending = true; - this.isStarted = true; - let buffer = await file.arrayBuffer(); - let partCount = Math.ceil(buffer.byteLength / 10e6); - let channelCount = Math.min(5, partCount); - if (this.webrtc.iceStatus != "connected") throw new Error("WebRTC is a not ready"); - this.peer.send({ - type: 'file', - name: file.name, - size: file.size, - mimetype: file.type, - partCount: partCount, - channelCount: channelCount, - metadata: metadata - }); - let channels = []; - for(let channelIndex = 0; channelIndex < channelCount; channelIndex++){ - let channel = this.rtc.createDataChannel("\\?\\file_" + channelIndex); - channel.binaryType = "arraybuffer"; - await new Promise((ok)=>{ - channel.onopen = ()=>{ - ok(void 0); - }; - }); - channels.push(channel); - } - let currentPart = 0; - let next = ()=>{ - if (currentPart < partCount) { - let bufferPart = buffer.slice(currentPart * 10e6, currentPart * 10e6 + 10e6); - currentPart++; - return [ - bufferPart, - currentPart - 1 - ]; - } - return [ - false, - 0 - ]; - }; - let spyChannelIndex = channels.length; - await new Promise((ok)=>{ - for(let channelIndex = 0; channelIndex < channels.length; channelIndex++)this.sendPartition(channels[channelIndex], next, channelIndex, ()=>{ - spyChannelIndex--; - if (spyChannelIndex == 0) { - this.isSending = false; - this.isStarted = false; - ok(undefined); - } - }); - }); - } - sendPartition(channel, nextblob10mb, _channelIndex, onEnded) { - let [currentBuffer, currentPartition] = nextblob10mb(); - let currentPart = 0; - let next = ()=>{ - if (!(currentBuffer instanceof ArrayBuffer)) return; - let bufferPart = currentBuffer.slice(currentPart * 16e3, currentPart * 16e3 + 16e3); - currentPart++; - if (bufferPart.byteLength != 0) /* - updateChannelStatus(channelIndex, n => { - return { - ...n, - current: bufferPart.byteLength + n.current, - currentTotal: bufferPart.byteLength + n.currentTotal - } - }); - setProcessedSize(n => n + bufferPart.byteLength); - */ return bufferPart; - }; - channel.addEventListener("message", ({ data: data })=>{ - if (data == "READY") this.sendFileChannel(channel, next); - if (data == "TOTAL_RECAIVED") { - [currentBuffer, currentPartition] = nextblob10mb(); - currentPart = 0; - if (currentBuffer != false) /*updateChannelStatus(channelIndex, n => { - return { - ...n, - total: currentBuffer.byteLength, - current: 0, - } - });*/ channel.send(JSON.stringify({ - size: currentBuffer.byteLength, - part: currentPartition - })); - else { - channel.close(); - onEnded(); - } - } - }); - channel.send(JSON.stringify({ - size: currentBuffer.byteLength, - part: currentPartition - })); - } - sendFileChannel(channel, getNextBlob) { - channel.addEventListener("bufferedamountlow", function() { - let buffer = getNextBlob(); - if (buffer) channel.send(buffer); - }); - channel.bufferedAmountLowThreshold = 15999; - let c = getNextBlob(); - c && channel.send(c); - } -} - - -class $b8ba020b52f6b742$export$2e2bcd8739ae039 { +},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"buLge":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +var _p2PfileSender = require("./P2PFileSender"); +var _p2PfileSenderDefault = parcelHelpers.interopDefault(_p2PfileSender); +class WebRTC { static{ this.channels = new Map(); } @@ -528,9 +947,9 @@ class $b8ba020b52f6b742$export$2e2bcd8739ae039 { this.isSettingRemoteAnswerPending = false; this.candicatePack = []; let config = {}; - if (rtcConfig) Object.assign(config, $b8ba020b52f6b742$export$2e2bcd8739ae039.defaultRTCConfig, rtcConfig); - else Object.assign(config, $b8ba020b52f6b742$export$2e2bcd8739ae039.defaultRTCConfig); - config.iceServers = rtcServers || $b8ba020b52f6b742$export$2e2bcd8739ae039.defaultICEServers; + if (rtcConfig) Object.assign(config, WebRTC.defaultRTCConfig, rtcConfig); + else Object.assign(config, WebRTC.defaultRTCConfig); + config.iceServers = rtcServers || WebRTC.defaultICEServers; this.rtc = new RTCPeerConnection(config); this.rtc.addEventListener("connectionstatechange", ()=>{ this.eventConnectionState(); @@ -595,7 +1014,7 @@ class $b8ba020b52f6b742$export$2e2bcd8739ae039 { break; case "streamInfo": { - let { id: id, value: value } = data; + let { id, value } = data; let streamInfo = this.recaivingStream.get(id); if (!streamInfo) this.recaivingStream.set(id, value); else this.recaivingStream.set(id, { @@ -604,26 +1023,27 @@ class $b8ba020b52f6b742$export$2e2bcd8739ae039 { }); this.send({ type: 'streamAccept', - id: id + id }); break; } case "streamRemoved": { - let { id: id } = data; + let { id } = data; this.emit('stream:stopped', this.recaivingStream.get(id)); this.recaivingStream.delete(id); break; } case "streamAccept": { - let { id: id } = data; + let { id } = data; let sendingStream = this.sendingStream.get(id); let senders = []; if (sendingStream && sendingStream.stream) { for (const track of sendingStream.stream.getTracks())senders.push(this.rtc.addTrack(track, sendingStream.stream)); sendingStream.senders = senders; } + this.emit('stream:accepted', sendingStream); break; } case "message": @@ -660,10 +1080,10 @@ class $b8ba020b52f6b742$export$2e2bcd8739ae039 { }); dt.addEventListener("open", ()=>{ this.channel = dt; - $b8ba020b52f6b742$export$2e2bcd8739ae039.channels.set(this.id, this); + WebRTC.channels.set(this.id, this); this.active = true; }); - dt.addEventListener("message", ({ data: data })=>{ + dt.addEventListener("message", ({ data })=>{ let pack = JSON.parse(data); this.emit('input', pack); }); @@ -680,21 +1100,21 @@ class $b8ba020b52f6b742$export$2e2bcd8739ae039 { } if (this.rtc) this.rtc.close(); this.emit('disconnected'); - $b8ba020b52f6b742$export$2e2bcd8739ae039.channels.delete(this.id); + WebRTC.channels.delete(this.id); } eventDatachannel(event) { if (event.channel.label == ':default:') { - $b8ba020b52f6b742$export$2e2bcd8739ae039.channels.set(this.id, this); + WebRTC.channels.set(this.id, this); this.channel = event.channel; this.active = true; - event.channel.addEventListener("message", ({ data: data })=>{ + event.channel.addEventListener("message", ({ data })=>{ let pack = JSON.parse(data); this.emit('input', pack); }); event.channel.addEventListener("close", ()=>{ this.channel = undefined; - $b8ba020b52f6b742$export$2e2bcd8739ae039.channels.delete(this.id); - $b8ba020b52f6b742$export$2e2bcd8739ae039.requireGC = true; + WebRTC.channels.delete(this.id); + WebRTC.requireGC = true; this.active = false; }); } else this.emit('datachannel', event.channel); @@ -771,13 +1191,13 @@ class $b8ba020b52f6b742$export$2e2bcd8739ae039 { ...info, id: stream.id, name: name, - stream: stream + stream }); } stopStream(_stream) { if (this.connectionStatus != 'connected') return; if (this.sendingStream.has(_stream.id)) { - let { stream: stream } = this.sendingStream.get(_stream.id); + let { stream } = this.sendingStream.get(_stream.id); for (const track of stream.getTracks()){ for (const RTCPSender of this.rtc.getSenders())if (RTCPSender.track?.id == track.id) this.rtc.removeTrack(RTCPSender); } @@ -790,7 +1210,7 @@ class $b8ba020b52f6b742$export$2e2bcd8739ae039 { } stopAllStreams() { if (this.connectionStatus != 'connected') return; - for (const [, { stream: stream }] of this.sendingStream){ + for (const [, { stream }] of this.sendingStream){ if (stream == undefined) continue; for (const track of stream.getTracks()){ for (const RTCPSender of this.rtc.getSenders())if (RTCPSender.track?.id == track.id) this.rtc.removeTrack(RTCPSender); @@ -804,12 +1224,12 @@ class $b8ba020b52f6b742$export$2e2bcd8739ae039 { } async SendFile(file, meta) { if (!this.peer) throw new Error("Peer is not ready"); - this.FileTransportChannel = new (0, $e751e9f3ea17ef94$export$2e2bcd8739ae039)(this, this.peer); + this.FileTransportChannel = new (0, _p2PfileSenderDefault.default)(this, this.peer); await this.FileTransportChannel.SendFile(file, meta); } async RecaiveFile(chnlCount, filemeta, totalSize) { if (!this.peer) throw new Error("Peer is not ready"); - this.FileTransportChannel = new (0, $e751e9f3ea17ef94$export$2e2bcd8739ae039)(this, this.peer); + this.FileTransportChannel = new (0, _p2PfileSenderDefault.default)(this, this.peer); return await new Promise((recaivedFile)=>{ if (this.FileTransportChannel) this.FileTransportChannel.RecaiveFile(this.rtc, filemeta, chnlCount, totalSize, (file)=>{ recaivedFile(file); @@ -817,9 +1237,10 @@ class $b8ba020b52f6b742$export$2e2bcd8739ae039 { }); } } -$b8ba020b52f6b742$export$2e2bcd8739ae039.requireGC = false; +exports.default = WebRTC; +WebRTC.requireGC = false; setInterval(()=>{ - if ($b8ba020b52f6b742$export$2e2bcd8739ae039.requireGC == false) return; + if (WebRTC.requireGC == false) return; let img = document.createElement("img"); img.src = window.URL.createObjectURL(new Blob([ new ArrayBuffer(5e+7) @@ -827,223 +1248,210 @@ setInterval(()=>{ img.onerror = function() { window.URL.revokeObjectURL(this.src); }; - $b8ba020b52f6b742$export$2e2bcd8739ae039.requireGC = false; + WebRTC.requireGC = false; }, 3000); - -var $869de8be2afc3a3b$var$IMessageSymbase = /*#__PURE__*/ function(IMessageSymbase) { - IMessageSymbase[IMessageSymbase["PayloadMessagePack"] = -12873.54] = "PayloadMessagePack"; - IMessageSymbase[IMessageSymbase["PayloadRTCBasePack"] = -12884.54] = "PayloadRTCBasePack"; - return IMessageSymbase; -}($869de8be2afc3a3b$var$IMessageSymbase || {}); -class $869de8be2afc3a3b$export$2e2bcd8739ae039 extends (0, $90404382037abbde$export$2e2bcd8739ae039) { - constructor(wsts){ - super(), this.options = {}, this.selfSocket = false, this.active = false, this.peerConnection = false, this.primaryChannel = "datachannel"; - this.mwse = wsts; - this.rtc = this.createRTC(); - this.info = new (0, $008a5dfecd0a1d37$export$f3bd5f68ae16de)(this); - this.on('pack', (data)=>{ - if (data.type == ':rtcpack:') return this.rtc.emit("input", data.payload); - this.emit("message", data); +},{"./P2PFileSender":"ga16E","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"ga16E":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +class P2PFileSender { + constructor(webrtc, peer){ + this.totalSize = 0; + this.isReady = false; + this.isStarted = false; + this.isSending = false; + this.isRecaiving = false; + this.processedSize = 0; + this.bufferSizePerChannel = 10e6; + this.bufferSizePerPack = 10e3; + this.safeBufferSizePerPack = 9999; + this.webrtc = webrtc; + this.rtc = webrtc.rtc; + this.peer = peer; + } + async RecaiveFile(_rtc, fileMetadata, channelCount, _totalSize, onEnded) { + //let totals = {}; + // let index = 0; + /*setChannelStatus(Array.from({length:channelCount}).map((e, index) => { + return { + name: `${index+1}. Kanal`, + current: 0, + currentTotal: 0, + total: 0 + } + }));*/ let parts = []; + this.webrtc.on('datachannel', (datachannel)=>{ + //let channelIndex = index++; + let current = 0; + let totalSize = 0; + let currentPart = 0; + let bufferAmount = []; + datachannel.onmessage = function({ data }) { + if (totalSize == 0) { + let { size, part } = JSON.parse(data); + totalSize = size; + currentPart = part; + /*updateChannelStatus(channelIndex, n => { + return { + ...n, + total: totalSize, + current: 0 + } + });*/ datachannel.send("READY"); + } else { + current += data.byteLength; + bufferAmount.push(data); + /*updateChannelStatus(channelIndex, n => { + return { + ...n, + current: data.byteLength + n.current, + currentTotal: data.byteLength + n.currentTotal, + } + }); + setProcessedSize(n => n + data.byteLength);*/ if (current == totalSize) { + parts[currentPart] = new Blob(bufferAmount); + bufferAmount = []; + //totals[datachannel.label] += totalSize; + totalSize = 0; + currentPart = 0; + current = 0; + datachannel.send("TOTAL_RECAIVED"); + } + } + }; + datachannel.onclose = ()=>{ + channelCount--; + if (channelCount == 0) { + let file = new File(parts, fileMetadata.name, { + type: fileMetadata.type, + lastModified: +new Date + }); + onEnded(file); + } + }; }); } - createRTC(rtcConfig, rtcServers) { - this.rtc = new (0, $b8ba020b52f6b742$export$2e2bcd8739ae039)(rtcConfig, rtcServers); - this.rtc.peer = this; - this.rtc.on("connected", ()=>{ - this.peerConnection = true; + async SendFile(file, metadata) { + this.isSending = true; + this.isStarted = true; + let buffer = await file.arrayBuffer(); + let partCount = Math.ceil(buffer.byteLength / 10e6); + let channelCount = Math.min(5, partCount); + if (this.webrtc.iceStatus != "connected") throw new Error("WebRTC is a not ready"); + this.peer.send({ + type: 'file', + name: file.name, + size: file.size, + mimetype: file.type, + partCount, + channelCount, + metadata: metadata }); - this.rtc.on('disconnected', ()=>{ - this.peerConnection = false; - }); - this.rtc.on("output", (payload)=>{ - this.send({ - type: ':rtcpack:', - payload: payload + let channels = []; + for(let channelIndex = 0; channelIndex < channelCount; channelIndex++){ + let channel = this.rtc.createDataChannel("\\?\\file_" + channelIndex); + channel.binaryType = "arraybuffer"; + await new Promise((ok)=>{ + channel.onopen = ()=>{ + ok(void 0); + }; + }); + channels.push(channel); + } + let currentPart = 0; + let next = ()=>{ + if (currentPart < partCount) { + let bufferPart = buffer.slice(currentPart * 10e6, currentPart * 10e6 + 10e6); + currentPart++; + return [ + bufferPart, + currentPart - 1 + ]; + } + return [ + false, + 0 + ]; + }; + let spyChannelIndex = channels.length; + await new Promise((ok)=>{ + for(let channelIndex = 0; channelIndex < channels.length; channelIndex++)this.sendPartition(channels[channelIndex], next, channelIndex, ()=>{ + spyChannelIndex--; + if (spyChannelIndex == 0) { + this.isSending = false; + this.isStarted = false; + ok(undefined); + } }); }); - this.rtc.on("message", (payload)=>{ - this.emit("pack", payload); + } + sendPartition(channel, nextblob10mb, _channelIndex, onEnded) { + let [currentBuffer, currentPartition] = nextblob10mb(); + let currentPart = 0; + let next = ()=>{ + if (!(currentBuffer instanceof ArrayBuffer)) return; + let bufferPart = currentBuffer.slice(currentPart * 16e3, currentPart * 16e3 + 16e3); + currentPart++; + if (bufferPart.byteLength != 0) /* + updateChannelStatus(channelIndex, n => { + return { + ...n, + current: bufferPart.byteLength + n.current, + currentTotal: bufferPart.byteLength + n.currentTotal + } + }); + setProcessedSize(n => n + bufferPart.byteLength); + */ return bufferPart; + }; + channel.addEventListener("message", ({ data })=>{ + if (data == "READY") this.sendFileChannel(channel, next); + if (data == "TOTAL_RECAIVED") { + [currentBuffer, currentPartition] = nextblob10mb(); + currentPart = 0; + if (currentBuffer != false) /*updateChannelStatus(channelIndex, n => { + return { + ...n, + total: currentBuffer.byteLength, + current: 0, + } + });*/ channel.send(JSON.stringify({ + size: currentBuffer.byteLength, + part: currentPartition + })); + else { + channel.close(); + onEnded(); + } + } }); - return this.rtc; + channel.send(JSON.stringify({ + size: currentBuffer.byteLength, + part: currentPartition + })); } - setPeerOptions(options) { - if (typeof options == "string") this.setSocketId(options); - else this.options = options; - } - setSocketId(uuid) { - this.socketId = uuid; - } - async metadata() { - if (this.socketId == 'me') { - let result = await this.mwse.EventPooling.request({ - type: 'my/socketid' - }); - this.selfSocket = true; - this.active ||= true; - this.socketId = result; - this.emit('scope'); - this.activeScope = true; - return result; - } - } - async request(pack) { - if (this.active) return await this.mwse.request(this.socketId, pack); - } - equalTo(peer) { - return this.socketId == peer.socketId; - } - async isReachable() { - return await this.mwse.EventPooling.request({ - type: 'is/reachable', - to: this.socketId + sendFileChannel(channel, getNextBlob) { + channel.addEventListener("bufferedamountlow", function() { + let buffer = getNextBlob(); + if (buffer) channel.send(buffer); }); - } - async enablePairAuth() { - await this.mwse.EventPooling.request({ - type: 'auth/pair-system', - value: 'everybody' - }); - } - async disablePairAuth() { - await this.mwse.EventPooling.request({ - type: 'auth/pair-system', - value: 'disable' - }); - } - async enablePairInfo() { - await this.mwse.EventPooling.request({ - type: 'connection/pairinfo', - value: true - }); - } - async disablePairInfo() { - await this.mwse.EventPooling.request({ - type: 'connection/pairinfo', - value: false - }); - } - async requestPair() { - let { message: message, status: status } = await this.mwse.EventPooling.request({ - type: 'request/pair', - to: this.socketId - }); - if (message == "ALREADY-PAIRED" || message == "ALREADY-REQUESTED") console.warn("Already paired or pair requested"); - if (status == "fail") { - console.error("Request Pair Error", status, message); - return false; - } - return true; - } - async endPair() { - await this.mwse.EventPooling.request({ - type: 'end/pair', - to: this.socketId - }); - this.forget(); - } - async acceptPair() { - let { message: message, status: status } = await this.mwse.EventPooling.request({ - type: 'accept/pair', - to: this.socketId - }); - if (status == "fail") { - console.error("Pair Error", status, message); - return false; - } - return true; - } - async rejectPair() { - let { message: message, status: status } = await this.mwse.EventPooling.request({ - type: 'reject/pair', - to: this.socketId - }); - if (status == "fail") { - console.error("Pair Error", status, message); - return false; - } - return true; - } - async getPairedList() { - let { value: value } = await this.mwse.EventPooling.request({ - type: 'pair/list', - to: this.socketId - }); - return value; - } - async send(pack) { - let isOpenedP2P = this.peerConnection && this.rtc?.active; - let isOpenedServer = this.mwse.server.connected; - let sendChannel; - if (isOpenedP2P && isOpenedServer) { - if (this.primaryChannel == "websocket") sendChannel = "websocket"; - else sendChannel = "datachannel"; - } else if (isOpenedServer) sendChannel = "websocket"; - else sendChannel = "datachannel"; - if (sendChannel == "websocket") { - if (!this.mwse.writable) return console.warn("Socket is not writable"); - await this.mwse.EventPooling.request({ - type: 'pack/to', - pack: pack, - to: this.socketId - }); - } else this.rtc?.sendMessage(pack); - } - async forget() { - this.mwse.peers.delete(this.socketId); - this.mwse.pairs.delete(this.socketId); + channel.bufferedAmountLowThreshold = 15999; + let c = getNextBlob(); + c && channel.send(c); } } +exports.default = P2PFileSender; - - -class $de3b1e8f1edf2641$export$f106f681f3286480 { - constructor(room){ - this.info = {}; - this.room = room; - this.room.on('updateinfo', (name, value)=>{ - this.info[name] = value; - }); - } - async fetch(name) { - if (name) { - let rinfo = await this.room.mwse.EventPooling.request({ - type: "room/getinfo", - roomId: this.room.roomId, - name: name - }); - if (rinfo.status == "success") this.info = rinfo.value; - else console.warn(rinfo.message); - } else { - let rinfo = await this.room.mwse.EventPooling.request({ - type: "room/info", - roomId: this.room.roomId - }); - if (rinfo.status == "success") this.info = rinfo.value; - else console.warn(rinfo.message); - } - return this.info; - } - set(name, value) { - this.info[name] = value; - this.room.mwse.WSTSProtocol.SendOnly({ - type: "room/setinfo", - roomId: this.room.roomId, - name: name, - value: value - }); - } - get(name) { - return name ? this.info[name] : this.info; - } -} - - -class $50cc11879cbf9e58$export$2e2bcd8739ae039 extends (0, $90404382037abbde$export$2e2bcd8739ae039) { +},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"7JoU4":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +var _eventTarget = require("./EventTarget"); +var _eventTargetDefault = parcelHelpers.interopDefault(_eventTarget); +var _roomInfo = require("./RoomInfo"); +class Room extends (0, _eventTargetDefault.default) { constructor(wsts){ super(), this.peers = new Map(); this.mwse = wsts; - this.info = new (0, $de3b1e8f1edf2641$export$f106f681f3286480)(this); + this.info = new (0, _roomInfo.RoomInfo)(this); } setRoomOptions(options) { if (typeof options == "string") this.roomId = options; @@ -1101,7 +1509,7 @@ class $50cc11879cbf9e58$export$2e2bcd8739ae039 extends (0, $90404382037abbde$exp } } async eject() { - let { type: type } = await this.mwse.EventPooling.request({ + let { type } = await this.mwse.EventPooling.request({ type: 'ejectroom', roomId: this.roomId }); @@ -1111,32 +1519,32 @@ class $50cc11879cbf9e58$export$2e2bcd8739ae039 extends (0, $90404382037abbde$exp async send(pack, wom = false, handshake = false) { if (!this.mwse.writable) return console.warn("Socket is not writable"); if (handshake) { - let { type: type } = await this.mwse.EventPooling.request({ + let { type } = await this.mwse.EventPooling.request({ type: 'pack/room', - pack: pack, + pack, to: this.roomId, - wom: wom, - handshake: handshake + wom, + handshake }); if (type == "fail") throw new Error("Cant send message to room"); } else await this.mwse.EventPooling.request({ type: 'pack/room', - pack: pack, + pack, to: this.roomId, - wom: wom, - handshake: handshake + wom, + handshake }); } async fetchPeers(filter, onlyNumber = false) { if (onlyNumber) { - let { count: count } = await this.mwse.EventPooling.request({ + let { count } = await this.mwse.EventPooling.request({ type: 'room/peer-count', roomId: this.roomId, filter: filter || {} }); return count; } else { - let { status: status, peers: peers } = await this.mwse.EventPooling.request({ + let { status, peers } = await this.mwse.EventPooling.request({ type: 'room-peers', roomId: this.roomId, filter: filter || {} @@ -1152,9 +1560,57 @@ class $50cc11879cbf9e58$export$2e2bcd8739ae039 extends (0, $90404382037abbde$exp } } } +exports.default = Room; +},{"./EventTarget":"faGYI","./RoomInfo":"5x1BB","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"5x1BB":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +parcelHelpers.export(exports, "RoomInfo", ()=>RoomInfo); +class RoomInfo { + constructor(room){ + this.info = {}; + this.room = room; + this.room.on('updateinfo', (name, value)=>{ + this.info[name] = value; + }); + } + async fetch(name) { + if (name) { + let rinfo = await this.room.mwse.EventPooling.request({ + type: "room/getinfo", + roomId: this.room.roomId, + name + }); + if (rinfo.status == "success") this.info = rinfo.value; + else console.warn(rinfo.message); + } else { + let rinfo = await this.room.mwse.EventPooling.request({ + type: "room/info", + roomId: this.room.roomId + }); + if (rinfo.status == "success") this.info = rinfo.value; + else console.warn(rinfo.message); + } + return this.info; + } + set(name, value) { + this.info[name] = value; + this.room.mwse.WSTSProtocol.SendOnly({ + type: "room/setinfo", + roomId: this.room.roomId, + name, + value + }); + } + get(name) { + return name ? this.info[name] : this.info; + } +} -class $ce70fc8599fd5132$export$2e2bcd8739ae039 { +},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"i9gBw":[function(require,module,exports,__globalThis) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +class WSTSProtocol { constructor(wsts){ this.mwse = wsts; this.addListener(); @@ -1209,211 +1665,8 @@ class $ce70fc8599fd5132$export$2e2bcd8739ae039 { } } } +exports.default = WSTSProtocol; +},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}]},["3FuxY"], "3FuxY", "parcelRequiref9d4", {}) -class $965027aeec3df663$export$2e2bcd8739ae039 extends (0, $90404382037abbde$export$2e2bcd8739ae039) { - /*public static compress(message:string, callback:(e:any) => any) - { - let u : any= []; - let C = new Gzip({ - level: 9, - mem: 12 - },(stream,isLast) => { - u.push(stream); - if(isLast) - { - callback(u); - } - }); - C.push(new TextEncoder().encode(message), true); - }*/ constructor(options){ - super(), this.rooms = new Map(), this.pairs = new Map(), this.peers = new Map(), this.writable = 1, this.readable = 1; - $965027aeec3df663$export$2e2bcd8739ae039.rtc = $965027aeec3df663$export$2e2bcd8739ae039; - this.server = new (0, $d59cdc9b12df098b$export$98b66c25bb38499d)(this, options); - this.WSTSProtocol = new (0, $ce70fc8599fd5132$export$2e2bcd8739ae039)(this); - this.EventPooling = new (0, $8792581153d3df4a$export$2e2bcd8739ae039)(this); - this.virtualPressure = new (0, $bce1fa8513c32a76$export$cd59d3e68ede65a1)(this); - this.server.connect(); - this.me = new (0, $869de8be2afc3a3b$export$2e2bcd8739ae039)(this); - this.me.scope(()=>{ - this.peers.set('me', this.me); - this.peers.set(this.me.socketId, this.me); - }); - this.server.onActive(async ()=>{ - this.me.setSocketId('me'); - await this.me.metadata(); - this.emit('scope'); - this.activeScope = true; - }); - this.server.onPassive(async ()=>{ - this.emit('close'); - }); - this.packMessagingSystem(); - } - destroy() { - this.server.disconnect(); - } - enableRecaiveData() { - this.WSTSProtocol.SendOnly({ - type: 'connection/packrecaive', - value: 1 - }); - this.readable = 1; - } - disableRecaiveData() { - this.WSTSProtocol.SendOnly({ - type: 'connection/packrecaive', - value: 0 - }); - this.readable = 0; - } - enableSendData() { - this.WSTSProtocol.SendOnly({ - type: 'connection/packsending', - value: 1 - }); - this.writable = 1; - } - disableSendData() { - this.WSTSProtocol.SendOnly({ - type: 'connection/packsending', - value: 0 - }); - this.writable = 0; - } - enableNotifyRoomInfo() { - this.WSTSProtocol.SendOnly({ - type: 'connection/roominfo', - value: 1 - }); - } - disableNotifyRoomInfo() { - this.WSTSProtocol.SendOnly({ - type: 'connection/roominfo', - value: 0 - }); - } - async request(peerId, pack) { - let { pack: answer } = await this.EventPooling.request({ - type: 'request/to', - to: peerId, - pack: pack - }); - return answer; - } - async response(peerId, requestId, pack) { - this.WSTSProtocol.SendOnly({ - type: 'response/to', - to: peerId, - pack: pack, - id: requestId - }); - } - packMessagingSystem() { - this.EventPooling.signal('pack', (payload)=>{ - if (this.readable) { - let { from: from, pack: pack } = payload; - this.peer(from, true).emit('pack', pack); - } - }); - this.EventPooling.signal('request', (payload)=>{ - let { from: from, pack: pack, id: id } = payload; - let scope = { - body: pack, - response: (pack)=>{ - this.response(from, id, pack); - }, - peer: this.peer(from, true) - }; - this.peer(from, true).emit('request', scope); - this.peer('me').emit('request', scope); - }); - this.EventPooling.signal('pack/room', (payload)=>{ - if (this.readable) { - let { from: from, pack: pack, sender: sender } = payload; - this.room(from).emit('message', pack, this.peer(sender)); - } - }); - this.EventPooling.signal('room/joined', (payload)=>{ - let { id: id, roomid: roomid } = payload; - let room = this.room(roomid); - let peer = this.peer(id, true); - room.peers.set(peer.socketId, peer); - room.emit('join', peer); - }); - this.EventPooling.signal('room/info', (payload)=>{ - let { roomId: roomId, name: name, value: value } = payload; - this.room(roomId).emit('updateinfo', name, value); - }); - this.EventPooling.signal('room/ejected', (payload)=>{ - let { id: id, roomid: roomid } = payload; - let room = this.room(roomid); - let peer = this.peer(id, true); - room.peers.delete(peer.socketId); - room.emit('eject', peer); - }); - this.EventPooling.signal('room/closed', (payload)=>{ - let { roomid: roomid } = payload; - let room = this.room(roomid); - room.peers.clear(); - room.emit('close'); - this.rooms.delete(roomid); - }); - this.EventPooling.signal("pair/info", (payload)=>{ - let { from: from, name: name, value: value } = payload; - let peer = this.peer(from, true); - peer.info.info[name] = value; - peer.emit("info", name, value); - }); - this.EventPooling.signal("request/pair", (payload)=>{ - let { from: from, info: info } = payload; - let peer = this.peer(from, true); - peer.info.info = info; - peer.emit("request/pair", peer); - this.peer('me').emit('request/pair', peer); - }); - this.EventPooling.signal("peer/disconnect", (payload)=>{ - let { id: id } = payload; - let peer = this.peer(id, true); - peer.emit("disconnect", peer); - }); - this.EventPooling.signal("accepted/pair", (payload)=>{ - let { from: from, info: info } = payload; - let peer = this.peer(from, true); - peer.info.info = info; - peer.emit("accepted/pair", peer); - this.peer('me').emit('accepted/pairr', peer); - }); - this.EventPooling.signal("end/pair", (payload)=>{ - let { from: from, info: info } = payload; - let peer = this.peer(from, true); - peer.emit("endPair", info); - this.peer('me').emit('endPair', from, info); - }); - } - room(options) { - if (typeof options == "string") { - if (this.rooms.has(options)) return this.rooms.get(options); - } - let room = new (0, $50cc11879cbf9e58$export$2e2bcd8739ae039)(this); - room.setRoomOptions(options); - this.emit('room'); - return room; - } - peer(options, isActive = false) { - if (typeof options == "string") { - if (this.peers.has(options)) return this.peers.get(options); - if (this.pairs.has(options)) return this.pairs.get(options); - } - let peer = new (0, $869de8be2afc3a3b$export$2e2bcd8739ae039)(this); - peer.setPeerOptions(options); - peer.active = isActive; - this.peers.set(peer.socketId, peer); - this.emit('peer', peer); - return peer; - } -} -window.MWSE = $965027aeec3df663$export$2e2bcd8739ae039; - -})(); //# sourceMappingURL=index.js.map diff --git a/script/index.js.map b/script/index.js.map index b58f872..b42e80d 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 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 if(data.type == ':rtcpack:')\n {\n throw \"WebRTC Kanalında Sızma\";\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 this.active = false;\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 +{"mappings":"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","sources":["frontend/index.ts","frontend/Connection.ts","../../../../../usr/lib/node_modules/parcel/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","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}","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\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 if(pack.type != ':rtcpack:')\n {\n this.rtc?.sendMessage(pack)\n }else{\n return console.warn(\"Socket is not writable\");\n }\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 this.emit('stream:accepted', sendingStream);\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 if(data.type == ':rtcpack:')\n {\n throw \"WebRTC Kanalında Sızma\";\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 this.active = false;\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","sourceRoot":"../"} \ No newline at end of file