diff --git a/Source/IPC.js b/Source/IPC.js index 1f0aa0f..48a15a6 100644 --- a/Source/IPC.js +++ b/Source/IPC.js @@ -5,7 +5,7 @@ process.on('message',data => { switch(data.type) { case "CLIENT_CREATED":{ - slog("CLIENT_CREATED"); + //slog("CLIENT_CREATED"); let client = new Client(); client.isProxy = true; client.proxyProcess = data.pid; @@ -22,7 +22,7 @@ process.on('message',data => { data.value = transformDeserialization(data.value, data.typing); - slog("CLIENT_UPDATE_PROP"); + //slog("CLIENT_UPDATE_PROP"); let client = Client.clients.get(data.uuid); client[data.name] = data.value; break; @@ -44,7 +44,7 @@ process.on('message',data => { break; } case "CLIENT_DESTROY":{ - slog("CLIENT_DESTROY"); + //slog("CLIENT_DESTROY"); if(Client.clients.has(data.uuid)) { Client.clients.delete(data.uuid); @@ -54,7 +54,7 @@ process.on('message',data => { break; } case "ROOM_CREATED":{ - slog("ROOM_CREATED"); + //slog("ROOM_CREATED"); let room = Room.fromJSON(data.value); Room.rooms.set(room.id, room); break; @@ -64,13 +64,13 @@ process.on('message',data => { data.value = transformDeserialization(data.value, data.typing); - slog("ROOM_UPDATE_PROP"); + //slog("ROOM_UPDATE_PROP"); let room = Room.rooms.get(data.uuid); room[data.name] = data.value; break; } case "ROOM_JOIN_CLIENT":{ - slog("ROOM_JOIN_CLIENT"); + //slog("ROOM_JOIN_CLIENT"); let room = Room.rooms.get(data.uuid); let client = Client.clients.get(data.client); if(room && client) @@ -81,7 +81,7 @@ process.on('message',data => { break; } case "ROOM_EJECT_CLIENT":{ - slog("ROOM_EJECT_CLIENT"); + //slog("ROOM_EJECT_CLIENT"); let room = Room.rooms.get(data.uuid); let client = Client.clients.get(data.client); if(room && client) @@ -92,7 +92,7 @@ process.on('message',data => { break; } case "ROOM_DESTROY":{ - slog("ROOM_DESTROY"); + //slog("ROOM_DESTROY"); Room.rooms.delete(data.value); break; } diff --git a/frontend/P2PFileSender.ts b/frontend/P2PFileSender.ts index 87eeb50..98ec1af 100644 --- a/frontend/P2PFileSender.ts +++ b/frontend/P2PFileSender.ts @@ -1,8 +1,9 @@ import WebRTC from "./WebRTC"; import Peer from "./Peer"; - - +/** + * Deneyseldir kullanılması önerilmez + */ export default class P2PFileSender { public rtc : RTCPeerConnection; diff --git a/frontend/WebRTC.ts b/frontend/WebRTC.ts index dc4469a..e89933a 100644 --- a/frontend/WebRTC.ts +++ b/frontend/WebRTC.ts @@ -31,7 +31,7 @@ export default class WebRTC rtcpMuxPolicy:"require", }; - public isPolite() : boolean + private isPolite() : boolean { let myId = this.peer?.mwse.peer('me').socketId as string; let peerId = this.peer?.socketId as string; diff --git a/public/core.js b/public/core.js new file mode 100644 index 0000000..8f55431 --- /dev/null +++ b/public/core.js @@ -0,0 +1,25 @@ +import "./studio/window.js"; +import { InputDevicesWindow } from "./studio/InputDevices.js"; +import { Rooms } from "./studio/Rooms.js"; + +let mwse = new MWSE({ + endpoint: "ws://localhost:7707" +}); + +mwse.scope(beginEngine); + +async function beginEngine() +{ + let me = await mwse.virtualPressure.allocAPIPAddress(); + $(".network-id").text(me); +} + +window.openInputDevicesWindow = () => { + InputDevicesWindow.toggle(); + InputDevicesWindow.bringToFront(); +}; + +window.openRoomsWindow = () => { + Rooms.toggle(); + Rooms.bringToFront(); +}; \ No newline at end of file diff --git a/public/studio.html b/public/studio.html new file mode 100644 index 0000000..6843e9f --- /dev/null +++ b/public/studio.html @@ -0,0 +1,86 @@ + + + + + + MWSE UI 24.3 Studio + + + + + +
+ +

+ MWSE UI 24.3 +

+ +

+ Ağ Adresiniz + + #.#.#.# + +

+
+ +
+ + + + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/public/studio/InputDevices.js b/public/studio/InputDevices.js new file mode 100644 index 0000000..9534ee4 --- /dev/null +++ b/public/studio/InputDevices.js @@ -0,0 +1,398 @@ +import DWindow from "./window.js"; +import { AddCell, FilterCell, memory, RemoveCell } from "./sdb.js"; + +export const InputDevicesWindow = new class InputDevicesWindow extends DWindow{ + constructor(){ + super(); + this.initContent(); + this.headtext.text("Giriş Aygıtları"); + this.hide(); + this.panel.css("min-width","640px"); + this.panel.css("min-height","250px"); + this.panel.css("width","max-content"); + this.initEvent(); + } + /** + * @type {JQuery} + */ + table = null; + initContent(){ + this.table = $(` + + + + + + + + + + + + + + + + +
Cihaz TürüSağlanan KanallarAkış ID
+ +
+ `); + + this.updateDevices(); + + this.content.append(this.table); + } + initEvent(){ + this.content.find(".newdevice").on('click', this.generateDevice.bind(this)); + this.addEventListener("close",()=>{ + this.hide(); + }) + } + updateDevices(){ + let tbody = this.table.find("tbody"); + tbody.text(''); + for (const cell of FilterCell("rawstream", () => true)) + { + let tr = $(` + + ${cell.source} + ${cell.kind} + ${cell.payload.id} + + + + + + `); + tr.attr("data-declare", cell.payload.id); + cell.addEventListener("stop",() => tr.remove()); + tbody.append(tr); + } + tbody.find(".action-view").on('click', e => this.viewSource($(e.target))); + tbody.find(".action-close").on('click', e => this.closeSource($(e.target))); + } + closeSource(btn){ + let streamid = btn.closest("tr").attr("data-declare"); + for (const brain of FilterCell("rawstream",e => e.payload.id == streamid)) { + brain.stop(); + } + } + viewSource(btn){ + let streamid = btn.closest("tr").attr("data-declare"); + /** + * @type {MediaStream} + */ + let p = null; + for (const rawstream of FilterCell("rawstream",e => e.payload.id == streamid)) { + p = rawstream.payload; + } + + let modal = new ViewSourceDialog(p.getTracks()[0]); + modal.enableDialog(this); + modal.bringToFront(); + } + generateDevice(){ + let modal = new AddDeviceDialog(); + modal.enableDialog(this); + modal.bringToFront(); + modal.addEventListener("stream:added",()=>{ + this.updateDevices(); + }); + } +} + +class StreamRecord extends EventTarget { + lockedby = 0; + stop(){ + this.payload.getTracks().forEach(e => e.stop()); + this.dispatchEvent(new Event("stop")); + } + isLocked(){ + return this.lockedby != 0; + } + lock(){ + this.lockedby++; + } + unlock(){ + this.lockedby--; + } +} + +class AddDeviceDialog extends DWindow { + constructor(){ + super(); + this.initContent(); + this.headtext.text("Aygıt Ekleme Sihirbazı"); + this.addEventListener('close',()=>{ + this.disableDialog(); + this.exit(); + }) + } + initContent(){ + let table = $(` +
+ + + + + + + +
+ `); + + table.find(".action-sdcam").on("click",this.sdcam.bind(this)); + table.find(".action-hdcam").on("click",this.hdcam.bind(this)); + table.find(".action-mic").on("click",this.mic.bind(this)); + table.find(".action-displaycam").on("click",this.displaycam.bind(this)); + this.content.append(table); + } + + async sdcam(){ + let stream = await navigator.mediaDevices.getUserMedia({ + video: { + advanced: [ + { width: { exact: 640 } }, + { width: { exact: 320 } }, + { width: { exact: 240 } } + ], + facingMode: "user" + } + }); + + AddCell("rawstream", new class extends StreamRecord { + source = "Kamera"; + kind = "Görüntü"; + payload = stream; + constructor(){ + super(); + this.onEnded(() => { + this.dispatchEvent(new Event("stop")); + }) + this.addEventListener("stop",() => { + RemoveCell("rawstream",cell => { + return cell.payload.id == stream.id + }) + }) + } + onEnded(event){ + /** @type {MediaStreamTrack} */ + let track; + stream.getVideoTracks().forEach(e => track = e); + if(track) + { + track.addEventListener("ended",event); + } + } + }); + this.dispatchEvent(new Event("stream:added")); + this.disableDialog(); + this.exit(); + } + async hdcam(){ + let stream = await navigator.mediaDevices.getUserMedia({ + video: { + advanced: [ + { width: { exact: 1920 } }, + { width: { exact: 1600 } }, + { width: { exact: 1366 } }, + { width: { exact: 1280 } }, + { width: { exact: 1024 } }, + { width: { exact: 900 } }, + { width: { exact: 800 } }, + { width: { exact: 640 } }, + { width: { exact: 320 } }, + { width: { exact: 240 } } + ], + facingMode: "user" + } + }); + AddCell("rawstream", new class extends StreamRecord { + source = "Kamera"; + kind = "Görüntü"; + payload = stream; + constructor(){ + super(); + this.onEnded(() => { + this.dispatchEvent(new Event("stop")); + }) + this.addEventListener("stop",() => { + RemoveCell("rawstream",cell => { + return cell.payload.id == stream.id + }) + }) + } + onEnded(event){ + /** @type {MediaStreamTrack} */ + let track; + stream.getVideoTracks().forEach(e => track = e); + if(track) + { + track.addEventListener("ended",event); + } + } + }); + this.dispatchEvent(new Event("stream:added")); + this.disableDialog(); + this.exit(); + } + async mic(){ + let stream = await navigator.mediaDevices.getUserMedia({ + audio: true + }); + AddCell("rawstream", new class extends StreamRecord { + source = "Kamera"; + kind = "Ses"; + payload = stream; + constructor(){ + super(); + this.onEnded(() => { + this.dispatchEvent(new Event("stop")); + }) + this.addEventListener("stop",() => { + RemoveCell("rawstream",cell => { + return cell.payload.id == stream.id + }) + }) + } + onEnded(event){ + /** @type {MediaStreamTrack} */ + let track; + stream.getAudioTracks().forEach(e => track = e); + if(track) + { + track.addEventListener("ended",event); + } + } + }); + this.dispatchEvent(new Event("stream:added")); + this.disableDialog(); + this.exit(); + } + async displaycam(){ + let stream = await navigator.mediaDevices.getDisplayMedia({ + video: true + }); + AddCell("rawstream", new class extends StreamRecord{ + source = "Ekran"; + kind = "Görüntü"; + payload = stream; + constructor(){ + super(); + this.onEnded(() => { + this.dispatchEvent(new Event("stop")); + }) + this.addEventListener("stop",() => { + RemoveCell("rawstream",cell => { + return cell.payload.id == stream.id + }) + }) + } + onEnded(event){ + /** @type {MediaStreamTrack} */ + let track; + stream.getTracks().forEach(e => track = e); + if(track) + { + track.addEventListener("ended",event); + } + } + }); + this.dispatchEvent(new Event("stream:added")); + this.disableDialog(); + this.exit(); + } +} +class ViewSourceDialog extends DWindow { + /** + * @type {MediaStreamTrack} + */ + track = null; + extra = {}; + constructor(track){ + super(); + this.headtext.text("Giriş Kaynağı Görüntüleme"); + this.addEventListener('close',()=>{ + this.disableDialog(); + this.exit(); + }) + this.track = track; + this.initContent(); + } + initContent(){ + if(this.track.kind == "video") + { + this.initVideoContent(); + }else{ + this.initAudioContent(); + } + this.table = $(` + + + + + + + + + + + + + + + + + + +
Track ID${this.track.id}
Data Type${this.track.kind}
Status${this.track.enabled ? "Active" : "Passive"}
Track Label${this.track.label}
`); + this.content.append(this.table); + } + initVideoContent(){ + let player = $(`