import {Connection,IConnection} from "./Connection"; import EventPool from "./EventPool"; import EventTarget from "./EventTarget"; import { IPPressure } from "./IPPressure"; import Peer from "./Peer"; import Room, { IRoomOptions } from "./Room"; import WSTSProtocol, { Message } from "./WSTSProtocol"; import WebRTC from "./WebRTC"; //import {Gzip} from "fflate"; export default class MWSE extends EventTarget { public static rtc : WebRTC; public server! : Connection; public WSTSProtocol! : WSTSProtocol; public EventPooling! : EventPool; public rooms : Map = new Map(); public pairs : Map = new Map(); public peers : Map = new Map(); public virtualPressure : IPPressure; public me! : Peer; /*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: IConnection){ super(); this.server = new Connection(options); this.WSTSProtocol = new WSTSProtocol(this); this.EventPooling = new EventPool(this); this.virtualPressure = new IPPressure(this); this.server.connect(); this.me = new Peer(this); this.me.scope(()=>{ this.peers.set('me', this.me); this.peers.set(this.me.socketId as string, this.me); }) this.server.onActive(async ()=>{ this.me.setSocketId('me'); await this.me.metadata(); this.emit('scope'); this.activeScope = true; }); this.packMessagingSystem(); } public async request(peerId: string, pack:Message) { let {pack:answer} = await this.EventPooling.request({ type: 'request/to', to: peerId, pack }); return answer; } public async response(peerId: string, requestId:number, pack:Message) { this.WSTSProtocol.SendOnly({ type: 'response/to', to: peerId, pack, id: requestId }) } private packMessagingSystem() { this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => { let {from,pack} = payload; this.peer(from, true).emit('pack', pack); }) this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => { let {from,pack, id} = payload; let scope = { body: pack, response: (pack: Message) => { 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 : {from:string,pack:any,sender:string}) => { let {from,pack,sender} = payload; this.room(from).emit('message', pack, this.peer(sender)); }) this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => { let {id,roomid} = payload; let room = this.room(roomid); let peer = this.peer(id, true); room.peers.set(peer.socketId as string, peer); room.emit('join', peer); }) this.EventPooling.signal('room/info',(payload : {roomId:string,value:any,name:string}) => { let {roomId,name,value} = payload; this.room(roomId).emit('updateinfo', name,value); }) this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => { let {id,roomid} = payload; let room = this.room(roomid); let peer = this.peer(id); room.peers.delete(peer.socketId as string); room.emit('eject', peer); }) this.EventPooling.signal('room/closed',(payload : {roomid:any}) => { let {roomid} = payload; let room = this.room(roomid); room.peers.clear(); room.emit('close'); this.rooms.delete(roomid); }) this.EventPooling.signal("pair/info", (payload : {from : string,name: string, value: string | number | boolean}) => { let {from, name, value} = payload; let peer = this.peer(from); peer.info.info[name] = value; peer.emit("info", name, value); }) this.EventPooling.signal("request/pair", (payload : {from : string,info: any}) => { let {from, info} = payload; let peer = this.peer(from); peer.info.info = info; peer.emit("request/pair", peer); this.peer('me').emit('request/pair', peer); }) this.EventPooling.signal("accepted/pair", (payload : {from : string,info: any}) => { let {from, info} = payload; let peer = this.peer(from); peer.info.info = info; peer.emit("accepted/pair", peer); this.peer('me').emit('accepted/pairr', peer); }) this.EventPooling.signal("end/pair", (payload : {from : string,info: any}) => { let {from, info} = payload; let peer = this.peer(from); peer.emit("endPair", info); this.peer('me').emit('endPair', from, info); }) } public room(options: IRoomOptions | string) : Room { if(typeof options == "string") { if(this.rooms.has(options)) { return this.rooms.get(options) as Room } } let room = new Room(this); room.setRoomOptions(options); this.emit('room'); return room; } public peer(options: string | IRoomOptions, isActive = false) : Peer { if(typeof options == "string") { if(this.peers.has(options)) { return this.peers.get(options) as Peer } if(this.pairs.has(options)) { return this.pairs.get(options) as Peer } } let peer = new Peer(this); peer.setPeerOptions(options); peer.active = isActive; this.peers.set(peer.socketId as string, peer); this.emit('peer', peer); return peer; } }; declare global { interface Window { MWSE: any; } } window.MWSE = MWSE;