");
+ 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
-
- #.#.#.#
-
-
-
-
-
-
-
-
- | İşlem |
- SHA-1 |
- Dosya İ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