Frontend Core added
This commit is contained in:
parent
0e1bcc0f6c
commit
5f43315ca8
|
@ -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")
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
import WSTS from "./index";
|
||||
import { Message } from "./WSTSProtocol";
|
||||
|
||||
export default class EventPool
|
||||
{
|
||||
public wsts : WSTS;
|
||||
public events : Map<number, [Function,Function]> = new Map();
|
||||
public signals : Map<string, Function[]> = new Map();
|
||||
public count = 0;
|
||||
constructor(wsts:WSTS){
|
||||
this.wsts = wsts;
|
||||
}
|
||||
public request(msg: Message) : Promise<any>
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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<string, Room> = 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;
|
||||
}
|
||||
}
|
12
package.json
12
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": {
|
||||
|
|
167
script/index.js
167
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
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -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. */
|
||||
|
|
Loading…
Reference in New Issue