From 5f43315ca8ea049b88577d5b4aeada7baa07c88f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Sun, 27 Nov 2022 23:32:28 +0300 Subject: [PATCH] Frontend Core added --- frontend/Connection.ts | 20 ++++- frontend/EventPool.ts | 49 ++++++++++++ frontend/Room.ts | 47 +++++++++++ frontend/WSTSProtocol.ts | 66 ++++++++++++++++ frontend/index.ts | 26 ++++-- package.json | 12 ++- script/index.js | 167 ++++++++++++++++++++++++++++++++++++--- script/index.js.map | 2 +- tsconfig.json | 4 +- 9 files changed, 370 insertions(+), 23 deletions(-) create mode 100644 frontend/EventPool.ts create mode 100644 frontend/Room.ts create mode 100644 frontend/WSTSProtocol.ts diff --git a/frontend/Connection.ts b/frontend/Connection.ts index 4f7aace..cd327c2 100644 --- a/frontend/Connection.ts +++ b/frontend/Connection.ts @@ -1,4 +1,4 @@ -interface IConnection{ +export interface IConnection{ endpoint: string; autoPair?: boolean; } @@ -11,13 +11,16 @@ export class Connection constructor(options: IConnection){ this.endpoint = new URL(options.endpoint); this.autoPair = options.autoPair || false; - this.connect(); } public connect() { this.ws = new WebSocket(this.endpoint.href); this.addWSEvents(); } + public disconnect() + { + this.ws.close(); + } public addWSEvents() { this.ws.addEventListener("open", () => this.eventOpen()); @@ -28,6 +31,9 @@ export class Connection private eventOpen() { this.connected = true; + for (const callback of this.activeConnectionEvent) { + callback(void 0); + } } private eventClose() { @@ -42,6 +48,16 @@ export class Connection { this.recaivePackEvent.push(func); } + private activeConnectionEvent : Function[] = []; + public onActive(func:Function) + { + if(this.connected) + { + func() + }else{ + this.activeConnectionEvent.push(func); + } + } private eventMessage(data: string | ArrayBuffer) { if(typeof data == "string") diff --git a/frontend/EventPool.ts b/frontend/EventPool.ts new file mode 100644 index 0000000..623bb43 --- /dev/null +++ b/frontend/EventPool.ts @@ -0,0 +1,49 @@ +import WSTS from "./index"; +import { Message } from "./WSTSProtocol"; + +export default class EventPool +{ + public wsts : WSTS; + public events : Map = new Map(); + public signals : Map = new Map(); + public count = 0; + constructor(wsts:WSTS){ + this.wsts = wsts; + } + public request(msg: Message) : Promise + { + return new Promise((ok,rej) => { + let id = ++this.count; + this.wsts.WSTSProtocol.SendRequest(msg, id); + this.events.set(id,[ + (data:any) => { + ok(data); + }, + (data:any) => { + rej(data); + } + ]); + }) + } + public stream(msg: Message, callback: Function) + { + let id = ++this.count; + this.wsts.WSTSProtocol.StartStream(msg, id); + this.events.set(id,[ + (data:any) => { + callback(data); + }, + () => { } + ]); + } + public signal(event: string, callback: Function) + { + let T = this.signals.get(event); + if(!T) + { + this.signals.set(event, [callback]); + }else{ + T.push(callback); + } + } +} \ No newline at end of file diff --git a/frontend/Room.ts b/frontend/Room.ts new file mode 100644 index 0000000..c1a5db9 --- /dev/null +++ b/frontend/Room.ts @@ -0,0 +1,47 @@ +import WSTS from "./index"; + +export interface IRoomOptions +{ + name: string; + description?:string; + joinType: "free"|"invite"|"password"|"lock"; + credential?: string; + ifexistsJoin?: boolean; + accessType?: "public"|"private"; + notifyActionInvite?: boolean; + notifyActionJoined?: boolean; + notifyActionEjected?: boolean; +} + + +export default class Room +{ + public wsts : WSTS; + public options! : IRoomOptions; + public events : {[key:string]:Function[]} = {}; + constructor(wsts:WSTS){ + this.wsts = wsts; + } + public setRoomOptions(options : IRoomOptions) + { + this.options = options; + } + private emit(eventName :string, ...args:any[]) + { + if(this.events[eventName]) + { + for (const callback of this.events[eventName]) { + callback(...args); + } + } + } + public on(eventName :string, callback:Function) + { + if(this.events[eventName]) + { + this.events[eventName].push(callback) + }else{ + this.events[eventName] = [callback]; + } + } +} \ No newline at end of file diff --git a/frontend/WSTSProtocol.ts b/frontend/WSTSProtocol.ts new file mode 100644 index 0000000..41bb14f --- /dev/null +++ b/frontend/WSTSProtocol.ts @@ -0,0 +1,66 @@ +import WSTS from "./index"; + +export interface Message { + [key:string|number]:any; +} +export default class WSTSProtocol +{ + public wsts : WSTS; + constructor(wsts:WSTS){ + this.wsts = wsts; + this.addListener(); + } + public addListener() + { + this.wsts.server?.onRecaivePack((pack)=>{ + this.PackAnalyze(pack) + }) + } + public SendRaw(pack: Message) + { + this.wsts.server.tranferToServer(pack); + } + public SendOnly(pack: Message) + { + this.wsts.server.tranferToServer([pack,'R']); + } + public SendRequest(pack: Message, id: number) + { + this.wsts.server.tranferToServer([pack, id, 'R']); + } + public StartStream(pack: Message, id: number) + { + this.wsts.server.tranferToServer([pack, id, 'S']); + } + public PackAnalyze(data:any) + { + let [payload, id, action] = JSON.parse(data); + if(typeof id === 'number') + { + let callback = this.wsts.EventPooling.events.get(id); + if(callback) + { + callback[0](payload, action); + switch(action) + { + case 'E':{ // [E]ND flag + this.wsts.EventPooling.events.delete(id); + break; + } + case 'S': // [S]TREAM flag + default:{ + break; + } + } + }else console.warn("Missing event sended from server"); + }else{ + let signals = this.wsts.EventPooling.signals.get(id); + if(signals) + { + for (const callback of signals) { + callback(payload); + } + }else console.warn("Missing event sended from server"); + } + } +} \ No newline at end of file diff --git a/frontend/index.ts b/frontend/index.ts index 32e2ff4..2b63639 100644 --- a/frontend/index.ts +++ b/frontend/index.ts @@ -1,10 +1,22 @@ -import {Connection} from "./Connection"; +import {Connection,IConnection} from "./Connection"; +import EventPool from "./EventPool"; +import Room, { IRoomOptions } from "./Room"; +import WSTSProtocol from "./WSTSProtocol"; export default class WSTS { - public connection? : Connection; - public a = 25; - constructor(){ - this.connection = new Connection({ - endpoint: "25" - }); + public server! : Connection; + public WSTSProtocol! : WSTSProtocol; + public EventPooling! : EventPool; + public rooms : Map = new Map(); + constructor(options: IConnection){ + this.server = new Connection(options); + this.server.connect(); + this.WSTSProtocol = new WSTSProtocol(this); + this.EventPooling = new EventPool(this); + } + public room(options: IRoomOptions) + { + let room = new Room(this); + room.setRoomOptions(options); + return room; } } \ No newline at end of file diff --git a/package.json b/package.json index e1e0dd5..870014e 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,17 @@ "publicUrl": "./", "sourceMap": true, "outputFormat": "global", - "optimize": true + "optimize": true, + "context": "browser", + "engines": { + "chrome": "65", + "android": "4.4.3", + "edge": "16", + "firefox": "59", + "ie": "10", + "ios": "10", + "safari": "10" + } } }, "repository": { diff --git a/script/index.js b/script/index.js index 24d5efa..12388b1 100644 --- a/script/index.js +++ b/script/index.js @@ -142,21 +142,33 @@ this[globalName] = mainExports; } } -})({"jQXDy":[function(require,module,exports) { +})({"6snCa":[function(require,module,exports) { 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 _room = require("./Room"); +var _roomDefault = parcelHelpers.interopDefault(_room); +var _wstsprotocol = require("./WSTSProtocol"); +var _wstsprotocolDefault = parcelHelpers.interopDefault(_wstsprotocol); class WSTS { - a = 25; - constructor(){ - this.connection = new (0, _connection.Connection)({ - endpoint: "25" - }); + rooms = new Map(); + constructor(options){ + this.server = new (0, _connection.Connection)(options); + this.server.connect(); + this.WSTSProtocol = new (0, _wstsprotocolDefault.default)(this); + this.EventPooling = new (0, _eventPoolDefault.default)(this); + } + room(options) { + let room = new (0, _roomDefault.default)(this); + room.setRoomOptions(options); + return room; } } exports.default = WSTS; -},{"./Connection":"aAICD","@parcel/transformer-js/src/esmodule-helpers.js":"e7rGL"}],"aAICD":[function(require,module,exports) { +},{"./Connection":"dzYK1","@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE","./WSTSProtocol":"3kvWC","./EventPool":"37Faq","./Room":"7qlv2"}],"dzYK1":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); parcelHelpers.export(exports, "Connection", ()=>Connection); @@ -166,12 +178,14 @@ class Connection { constructor(options){ this.endpoint = new URL(options.endpoint); this.autoPair = options.autoPair || false; - this.connect(); } connect() { this.ws = new WebSocket(this.endpoint.href); this.addWSEvents(); } + disconnect() { + this.ws.close(); + } addWSEvents() { this.ws.addEventListener("open", ()=>this.eventOpen()); this.ws.addEventListener("close", ()=>this.eventClose()); @@ -180,6 +194,7 @@ class Connection { } eventOpen() { this.connected = true; + for (const callback of this.activeConnectionEvent)callback(void 0); } eventClose() { this.connected = false; @@ -191,6 +206,11 @@ class Connection { onRecaivePack(func) { this.recaivePackEvent.push(func); } + activeConnectionEvent = []; + onActive(func) { + if (this.connected) func(); + else this.activeConnectionEvent.push(func); + } eventMessage(data) { if (typeof data == "string") for (const callback of this.recaivePackEvent)callback(JSON.parse(data)); } @@ -199,7 +219,7 @@ class Connection { } } -},{"@parcel/transformer-js/src/esmodule-helpers.js":"e7rGL"}],"e7rGL":[function(require,module,exports) { +},{"@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE"}],"i1YYE":[function(require,module,exports) { exports.interopDefault = function(a) { return a && a.__esModule ? a : { default: a @@ -229,6 +249,133 @@ exports.export = function(dest, destName, get) { }); }; -},{}]},["jQXDy"], "jQXDy", "parcelRequiref9d4") +},{}],"3kvWC":[function(require,module,exports) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +class WSTSProtocol { + constructor(wsts){ + this.wsts = wsts; + this.addListener(); + } + addListener() { + this.wsts.server?.onRecaivePack((pack)=>{ + this.PackAnalyze(pack); + }); + } + SendRaw(pack) { + this.wsts.server.tranferToServer(pack); + } + SendOnly(pack) { + this.wsts.server.tranferToServer([ + pack, + "R" + ]); + } + SendRequest(pack, id) { + this.wsts.server.tranferToServer([ + pack, + id, + "R" + ]); + } + StartStream(pack, id) { + this.wsts.server.tranferToServer([ + pack, + id, + "S" + ]); + } + PackAnalyze(data) { + let [payload, id, action] = JSON.parse(data); + if (typeof id === "number") { + let callback = this.wsts.EventPooling.events.get(id); + if (callback) { + callback[0](payload, action); + switch(action){ + case "E": + this.wsts.EventPooling.events.delete(id); + break; + case "S": + default: + break; + } + } else console.warn("Missing event sended from server"); + } else { + let signals = this.wsts.EventPooling.signals.get(id); + if (signals) for (const callback1 of signals)callback1(payload); + else console.warn("Missing event sended from server"); + } + } +} +exports.default = WSTSProtocol; + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE"}],"37Faq":[function(require,module,exports) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +class EventPool { + events = new Map(); + signals = new Map(); + count = 0; + constructor(wsts){ + this.wsts = wsts; + } + request(msg) { + return new Promise((ok, rej)=>{ + let id = ++this.count; + this.wsts.WSTSProtocol.SendRequest(msg, id); + this.events.set(id, [ + (data)=>{ + ok(data); + }, + (data)=>{ + rej(data); + } + ]); + }); + } + stream(msg, callback) { + let id = ++this.count; + this.wsts.WSTSProtocol.StartStream(msg, id); + this.events.set(id, [ + (data)=>{ + callback(data); + }, + ()=>{} + ]); + } + signal(event, callback) { + let T = this.signals.get(event); + if (!T) this.signals.set(event, [ + callback + ]); + else T.push(callback); + } +} +exports.default = EventPool; + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE"}],"7qlv2":[function(require,module,exports) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +class Room { + events = {}; + constructor(wsts){ + this.wsts = wsts; + } + setRoomOptions(options) { + this.options = options; + } + emit(eventName, ...args) { + if (this.events[eventName]) for (const callback of this.events[eventName])callback(...args); + } + on(eventName, callback) { + if (this.events[eventName]) this.events[eventName].push(callback); + else this.events[eventName] = [ + callback + ]; + } +} +exports.default = Room; + +},{"@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE"}]},["6snCa"], "6snCa", "parcelRequiref9d4") //# sourceMappingURL=index.js.map diff --git a/script/index.js.map b/script/index.js.map index de25058..6dcc1e1 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","../../../AppData/Roaming/npm/node_modules/parcel/node_modules/@parcel/transformer-js/src/esmodule-helpers.js"],"sourcesContent":["import {Connection} from \"./Connection\";\r\nexport default class WSTS {\r\n public connection? : Connection;\r\n public a = 25;\r\n constructor(){\r\n this.connection = new Connection({\r\n endpoint: \"25\"\r\n });\r\n }\r\n}","interface IConnection{\r\n endpoint: string;\r\n autoPair?: boolean;\r\n}\r\nexport class Connection\r\n{\r\n public ws! : WebSocket;\r\n public endpoint : URL;\r\n public autoPair : boolean = false;\r\n public connected : boolean = false;\r\n constructor(options: IConnection){\r\n this.endpoint = new URL(options.endpoint);\r\n this.autoPair = options.autoPair || false;\r\n this.connect();\r\n }\r\n public connect()\r\n {\r\n this.ws = new WebSocket(this.endpoint.href);\r\n this.addWSEvents();\r\n }\r\n public addWSEvents()\r\n {\r\n this.ws.addEventListener(\"open\", () => this.eventOpen());\r\n this.ws.addEventListener(\"close\", () => this.eventClose());\r\n this.ws.addEventListener(\"error\", () => this.eventError());\r\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\r\n }\r\n private eventOpen()\r\n {\r\n this.connected = true;\r\n }\r\n private eventClose()\r\n {\r\n this.connected = false;\r\n }\r\n private eventError()\r\n {\r\n this.connected = false;\r\n }\r\n private recaivePackEvent : ((data:any) => any)[] = [];\r\n public onRecaivePack(func:(data:any) => any)\r\n {\r\n this.recaivePackEvent.push(func);\r\n }\r\n private eventMessage(data: string | ArrayBuffer)\r\n {\r\n if(typeof data == \"string\")\r\n {\r\n for (const callback of this.recaivePackEvent) {\r\n callback(JSON.parse(data));\r\n }\r\n }\r\n }\r\n public tranferToServer(data:any)\r\n {\r\n if(this.connected)\r\n {\r\n this.ws.send(JSON.stringify(data));\r\n }\r\n }\r\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 (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {\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"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"} \ No newline at end of file +{"mappings":"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","sources":["frontend/index.ts","frontend/Connection.ts","../../../AppData/Roaming/npm/node_modules/parcel/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","frontend/WSTSProtocol.ts","frontend/EventPool.ts","frontend/Room.ts"],"sourcesContent":["import {Connection,IConnection} from \"./Connection\";\r\nimport EventPool from \"./EventPool\";\r\nimport Room, { IRoomOptions } from \"./Room\";\r\nimport WSTSProtocol from \"./WSTSProtocol\";\r\nexport default class WSTS {\r\n public server! : Connection;\r\n public WSTSProtocol! : WSTSProtocol;\r\n public EventPooling! : EventPool;\r\n public rooms : Map = new Map();\r\n constructor(options: IConnection){\r\n this.server = new Connection(options);\r\n this.server.connect();\r\n this.WSTSProtocol = new WSTSProtocol(this);\r\n this.EventPooling = new EventPool(this);\r\n }\r\n public room(options: IRoomOptions)\r\n {\r\n let room = new Room(this);\r\n room.setRoomOptions(options);\r\n return room;\r\n }\r\n}","export interface IConnection{\r\n endpoint: string;\r\n autoPair?: boolean;\r\n}\r\nexport class Connection\r\n{\r\n public ws! : WebSocket;\r\n public endpoint : URL;\r\n public autoPair : boolean = false;\r\n public connected : boolean = false;\r\n constructor(options: IConnection){\r\n this.endpoint = new URL(options.endpoint);\r\n this.autoPair = options.autoPair || false;\r\n }\r\n public connect()\r\n {\r\n this.ws = new WebSocket(this.endpoint.href);\r\n this.addWSEvents();\r\n }\r\n public disconnect()\r\n {\r\n this.ws.close();\r\n }\r\n public addWSEvents()\r\n {\r\n this.ws.addEventListener(\"open\", () => this.eventOpen());\r\n this.ws.addEventListener(\"close\", () => this.eventClose());\r\n this.ws.addEventListener(\"error\", () => this.eventError());\r\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\r\n }\r\n private eventOpen()\r\n {\r\n this.connected = true;\r\n for (const callback of this.activeConnectionEvent) {\r\n callback(void 0);\r\n }\r\n }\r\n private eventClose()\r\n {\r\n this.connected = false;\r\n }\r\n private eventError()\r\n {\r\n this.connected = false;\r\n }\r\n private recaivePackEvent : ((data:any) => any)[] = [];\r\n public onRecaivePack(func:(data:any) => any)\r\n {\r\n this.recaivePackEvent.push(func);\r\n }\r\n private activeConnectionEvent : Function[] = [];\r\n public onActive(func:Function)\r\n {\r\n if(this.connected)\r\n {\r\n func()\r\n }else{\r\n this.activeConnectionEvent.push(func);\r\n }\r\n }\r\n private eventMessage(data: string | ArrayBuffer)\r\n {\r\n if(typeof data == \"string\")\r\n {\r\n for (const callback of this.recaivePackEvent) {\r\n callback(JSON.parse(data));\r\n }\r\n }\r\n }\r\n public tranferToServer(data:any)\r\n {\r\n if(this.connected)\r\n {\r\n this.ws.send(JSON.stringify(data));\r\n }\r\n }\r\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 (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {\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 WSTS from \"./index\";\r\n\r\nexport interface Message {\r\n [key:string|number]:any;\r\n}\r\nexport default class WSTSProtocol\r\n{\r\n public wsts : WSTS;\r\n constructor(wsts:WSTS){\r\n this.wsts = wsts;\r\n this.addListener();\r\n }\r\n public addListener()\r\n {\r\n this.wsts.server?.onRecaivePack((pack)=>{\r\n this.PackAnalyze(pack)\r\n })\r\n }\r\n public SendRaw(pack: Message)\r\n {\r\n this.wsts.server.tranferToServer(pack);\r\n }\r\n public SendOnly(pack: Message)\r\n {\r\n this.wsts.server.tranferToServer([pack,'R']);\r\n }\r\n public SendRequest(pack: Message, id: number)\r\n {\r\n this.wsts.server.tranferToServer([pack, id, 'R']);\r\n }\r\n public StartStream(pack: Message, id: number)\r\n {\r\n this.wsts.server.tranferToServer([pack, id, 'S']);\r\n }\r\n public PackAnalyze(data:any)\r\n {\r\n let [payload, id, action] = JSON.parse(data);\r\n if(typeof id === 'number')\r\n {\r\n let callback = this.wsts.EventPooling.events.get(id);\r\n if(callback)\r\n {\r\n callback[0](payload, action);\r\n switch(action)\r\n {\r\n case 'E':{ // [E]ND flag\r\n this.wsts.EventPooling.events.delete(id);\r\n break;\r\n }\r\n case 'S': // [S]TREAM flag\r\n default:{\r\n break;\r\n }\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }else{\r\n let signals = this.wsts.EventPooling.signals.get(id);\r\n if(signals)\r\n {\r\n for (const callback of signals) {\r\n callback(payload);\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }\r\n }\r\n}","import WSTS from \"./index\";\r\nimport { Message } from \"./WSTSProtocol\";\r\n\r\nexport default class EventPool\r\n{\r\n public wsts : WSTS;\r\n public events : Map = new Map();\r\n public signals : Map = new Map();\r\n public count = 0;\r\n constructor(wsts:WSTS){\r\n this.wsts = wsts;\r\n }\r\n public request(msg: Message) : Promise\r\n {\r\n return new Promise((ok,rej) => {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.SendRequest(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n ok(data);\r\n },\r\n (data:any) => {\r\n rej(data);\r\n }\r\n ]);\r\n })\r\n }\r\n public stream(msg: Message, callback: Function)\r\n {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.StartStream(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n callback(data);\r\n },\r\n () => { }\r\n ]);\r\n }\r\n public signal(event: string, callback: Function)\r\n {\r\n let T = this.signals.get(event);\r\n if(!T)\r\n {\r\n this.signals.set(event, [callback]);\r\n }else{\r\n T.push(callback);\r\n }\r\n }\r\n}","import WSTS from \"./index\";\r\n\r\nexport interface IRoomOptions\r\n{\r\n name: string;\r\n description?:string;\r\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\r\n credential?: string;\r\n ifexistsJoin?: boolean;\r\n accessType?: \"public\"|\"private\";\r\n notifyActionInvite?: boolean;\r\n notifyActionJoined?: boolean;\r\n notifyActionEjected?: boolean;\r\n}\r\n\r\n\r\nexport default class Room\r\n{\r\n public wsts : WSTS;\r\n public options! : IRoomOptions;\r\n public events : {[key:string]:Function[]} = {};\r\n constructor(wsts:WSTS){\r\n this.wsts = wsts;\r\n }\r\n public setRoomOptions(options : IRoomOptions)\r\n {\r\n this.options = options;\r\n }\r\n private emit(eventName :string, ...args:any[])\r\n {\r\n if(this.events[eventName])\r\n {\r\n for (const callback of this.events[eventName]) {\r\n callback(...args);\r\n }\r\n }\r\n }\r\n public on(eventName :string, callback:Function)\r\n {\r\n if(this.events[eventName])\r\n {\r\n this.events[eventName].push(callback)\r\n }else{\r\n this.events[eventName] = [callback];\r\n }\r\n }\r\n}"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index e48bdfb..1ba353a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,8 +15,8 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "ES3", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - "lib": ["DOM","ES2015","ES2015.Promise"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "target": "ES6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": ["DOM","ES6","ES2015.Promise"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */