adding subscribe to event act, todo: passthrough remote
This commit is contained in:
parent
4393a2b226
commit
4f7835ccbe
10 changed files with 230 additions and 34 deletions
|
@ -4,3 +4,4 @@ export * from "./acts/admin.js"
|
||||||
export * from "./acts/rooms.js"
|
export * from "./acts/rooms.js"
|
||||||
export * from "./acts/server.js"
|
export * from "./acts/server.js"
|
||||||
export * from "./acts/roomContent.js"
|
export * from "./acts/roomContent.js"
|
||||||
|
export * from "./acts/subscribe.js"
|
|
@ -6,6 +6,8 @@ import { isCategoryInRoom, isItemInRoom, isProductInRoom, isRoomDataFull } from
|
||||||
import { ROOM_RIGHTS } from "../../server/permissions.js";
|
import { ROOM_RIGHTS } from "../../server/permissions.js";
|
||||||
import { act_error } from "../../server/errors.js";
|
import { act_error } from "../../server/errors.js";
|
||||||
import { uts } from "../../sys/tools.js";
|
import { uts } from "../../sys/tools.js";
|
||||||
|
import { sendRoomListeners } from "../listener.js";
|
||||||
|
import { LISTENER_ACTION, LISTENER_TYPE } from "../../server/listener.js";
|
||||||
|
|
||||||
export const getCategories: Act = {
|
export const getCategories: Act = {
|
||||||
state: STATE.client | STATE.remote,
|
state: STATE.client | STATE.remote,
|
||||||
|
@ -128,10 +130,12 @@ export const addCategory: Act = {
|
||||||
.where(eq(listCategories.roomID, roomID))
|
.where(eq(listCategories.roomID, roomID))
|
||||||
.limit(1)
|
.limit(1)
|
||||||
).query(db);
|
).query(db);
|
||||||
if (req.affectedRows > 0) aws("ok", {
|
if (req.affectedRows > 0) {
|
||||||
catID: Number(req.insertId)
|
aws("ok", {
|
||||||
});
|
catID: Number(req.insertId)
|
||||||
else aws("error", act_error.ADD_CAT);
|
});
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.CATEGORIES, LISTENER_ACTION.ADD, [req.insertId]);
|
||||||
|
} else aws("error", act_error.ADD_CAT);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -165,8 +169,10 @@ export const changeCategory: Act = {
|
||||||
eq(listCategories.listCatID, data.listCatID)
|
eq(listCategories.listCatID, data.listCatID)
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.affectedRows > 0) aws("ok", "");
|
if (req.affectedRows > 0) {
|
||||||
else aws("error", act_error.CAT_NOT_EXISTS);
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.CATEGORIES, LISTENER_ACTION.CHANGE, [data.listCatID]);
|
||||||
|
} else aws("error", act_error.CAT_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -202,8 +208,10 @@ export const changeCategoriesOrder: Act = {
|
||||||
.query(db);
|
.query(db);
|
||||||
affacted += req.affectedRows;
|
affacted += req.affectedRows;
|
||||||
}
|
}
|
||||||
if (affacted > 0) aws("ok", "");
|
if (affacted > 0) {
|
||||||
else aws("error", act_error.CAT_NOT_EXISTS);
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.CATEGORIES, LISTENER_ACTION.CHANGE, data.listCatIDs);
|
||||||
|
} else aws("error", act_error.CAT_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -233,8 +241,10 @@ export const deleteCategory: Act = {
|
||||||
eq(listCategories.listCatID, data.listCatID)
|
eq(listCategories.listCatID, data.listCatID)
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.affectedRows > 0) aws("ok", "");
|
if (req.affectedRows > 0) {
|
||||||
else aws("error", act_error.CAT_NOT_EXISTS);
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.CATEGORIES, LISTENER_ACTION.DELETE, [data.listCatID]);
|
||||||
|
} else aws("error", act_error.CAT_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -383,10 +393,12 @@ export const addProduct: Act = {
|
||||||
data.ean,
|
data.ean,
|
||||||
data.parent != null ? data.parent : null,
|
data.parent != null ? data.parent : null,
|
||||||
).query(db);
|
).query(db);
|
||||||
if (req.affectedRows > 0) aws("ok", {
|
if (req.affectedRows > 0) {
|
||||||
listProdID: Number(req.insertId)
|
aws("ok", {
|
||||||
});
|
listProdID: Number(req.insertId)
|
||||||
else aws("error", act_error.ADD_PROD);
|
});
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.PRODUCTS, LISTENER_ACTION.ADD, [req.insertId]);
|
||||||
|
} else aws("error", act_error.ADD_PROD);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -434,8 +446,10 @@ export const changeProduct: Act = {
|
||||||
eq(listProducts.roomID, roomID),
|
eq(listProducts.roomID, roomID),
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.affectedRows > 0) aws("ok", "");
|
if (req.affectedRows > 0) {
|
||||||
else aws("error", act_error.PROD_NOT_EXISTS);
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.PRODUCTS, LISTENER_ACTION.CHANGE, [data.listProdID]);
|
||||||
|
} else aws("error", act_error.PROD_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -465,8 +479,10 @@ export const deleteProduct: Act = {
|
||||||
eq(listProducts.listProdID, data.listProdID),
|
eq(listProducts.listProdID, data.listProdID),
|
||||||
eq(listProducts.roomID, roomID),
|
eq(listProducts.roomID, roomID),
|
||||||
)).query(db);
|
)).query(db);
|
||||||
if (req.affectedRows > 0) aws("ok", "");
|
if (req.affectedRows > 0) {
|
||||||
else aws("error", act_error.PROD_NOT_EXISTS);
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.PRODUCTS, LISTENER_ACTION.DELETE, [data.listProdID]);
|
||||||
|
} else aws("error", act_error.PROD_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -636,10 +652,12 @@ export const addItem: Act = {
|
||||||
data.value,
|
data.value,
|
||||||
data.listProdID != null ? data.listProdID : null,
|
data.listProdID != null ? data.listProdID : null,
|
||||||
).query(db);
|
).query(db);
|
||||||
if (req.affectedRows > 0) aws("ok", {
|
if (req.affectedRows > 0) {
|
||||||
listItemID: Number(req.insertId)
|
aws("ok", {
|
||||||
});
|
listItemID: Number(req.insertId)
|
||||||
else aws("error", act_error.ADD_ITEM);
|
});
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.ADD, [req.insertId]);
|
||||||
|
} else aws("error", act_error.ADD_ITEM);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -687,8 +705,10 @@ export const changeItem: Act = {
|
||||||
eq(listItems.roomID, roomID)
|
eq(listItems.roomID, roomID)
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.affectedRows > 0) aws("ok", "");
|
if (req.affectedRows > 0) {
|
||||||
else aws("error", act_error.ITEM_NOT_EXISTS);
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.CHANGE, [data.listItemID]);
|
||||||
|
} else aws("error", act_error.ITEM_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -723,8 +743,10 @@ export const changeItemState: Act = {
|
||||||
eq(listItems.roomID, roomID)
|
eq(listItems.roomID, roomID)
|
||||||
))
|
))
|
||||||
.query(db);
|
.query(db);
|
||||||
if (req.affectedRows > 0) aws("ok", "");
|
if (req.affectedRows > 0) {
|
||||||
else aws("error", act_error.ITEM_NOT_EXISTS);
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.CHANGE, [data.listItemID]);
|
||||||
|
} else aws("error", act_error.ITEM_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -753,7 +775,12 @@ export const changeItemStates: Act = {
|
||||||
if (
|
if (
|
||||||
data.listItemIDs.length != data.changedTimes.length
|
data.listItemIDs.length != data.changedTimes.length
|
||||||
|| data.changedTimes.length != data.states.length
|
|| data.changedTimes.length != data.states.length
|
||||||
) return void aws("error", "data");
|
) return void aws("error", act_error.DATA);
|
||||||
|
for (let i = 0; i < data.listItemIDs.length; i++) {
|
||||||
|
let id = data.listItemIDs[i];
|
||||||
|
if (typeof id != "number" || id < 0)
|
||||||
|
return void aws("error", act_error.DATA);
|
||||||
|
}
|
||||||
for (let i = 0; i < data.listItemIDs.length; i++) {
|
for (let i = 0; i < data.listItemIDs.length; i++) {
|
||||||
let id = data.listItemIDs[i];
|
let id = data.listItemIDs[i];
|
||||||
let time = data.changedTimes[i];
|
let time = data.changedTimes[i];
|
||||||
|
@ -769,6 +796,7 @@ export const changeItemStates: Act = {
|
||||||
.query(db);
|
.query(db);
|
||||||
}
|
}
|
||||||
aws("ok", "");
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.CHANGE, data.listItemIDs);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -797,8 +825,10 @@ export const deleteItem: Act = {
|
||||||
eq(listItems.listItemID, data.listItemID),
|
eq(listItems.listItemID, data.listItemID),
|
||||||
eq(listItems.roomID, roomID)
|
eq(listItems.roomID, roomID)
|
||||||
)).query(db);
|
)).query(db);
|
||||||
if (req.affectedRows > 0) aws("ok", "");
|
if (req.affectedRows > 0) {
|
||||||
else aws("error", act_error.ITEM_NOT_EXISTS);
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.DELETE, [data.listItemID]);
|
||||||
|
} else aws("error", act_error.ITEM_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
export const deleteItemByState: Act = {
|
export const deleteItemByState: Act = {
|
||||||
|
@ -827,5 +857,6 @@ export const deleteItemByState: Act = {
|
||||||
eq(listItems.roomID, roomID)
|
eq(listItems.roomID, roomID)
|
||||||
)).query(db);
|
)).query(db);
|
||||||
aws("ok", "");
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.ITEMS, LISTENER_ACTION.DELETE, []);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -8,6 +8,8 @@ import { isRoomFull } from "../helper.js";
|
||||||
import { fetchRemoteAsServer } from "../server.js";
|
import { fetchRemoteAsServer } from "../server.js";
|
||||||
import { Act, Client, STATE } from "../user.js";
|
import { Act, Client, STATE } from "../user.js";
|
||||||
import { act_error } from "../../server/errors.js";
|
import { act_error } from "../../server/errors.js";
|
||||||
|
import { sendRoomListeners } from "../listener.js";
|
||||||
|
import { LISTENER_ACTION, LISTENER_TYPE } from "../../server/listener.js";
|
||||||
|
|
||||||
export const listRooms: Act = {
|
export const listRooms: Act = {
|
||||||
state: STATE.client | STATE.remote,
|
state: STATE.client | STATE.remote,
|
||||||
|
@ -46,7 +48,7 @@ export const listRooms: Act = {
|
||||||
if (name != null && owner != null && rights != null && visibility != null && title != null && description != null && icon != null && confirmed != null) {
|
if (name != null && owner != null && rights != null && visibility != null && title != null && description != null && icon != null && confirmed != null) {
|
||||||
return { name, server, owner, rights, visibility, title, description, icon, debug: global.debug, confirmed };
|
return { name, server, owner, rights, visibility, title, description, icon, debug: global.debug, confirmed };
|
||||||
}
|
}
|
||||||
console.log(name, server, owner, rights, visibility, title, description, icon, global.debug, confirmed)
|
//console.log(name, server, owner, rights, visibility, title, description, icon, global.debug, confirmed)
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
if (client.state == STATE.client) {
|
if (client.state == STATE.client) {
|
||||||
|
@ -608,6 +610,7 @@ export const setAdminStatus: Act = {
|
||||||
} else {
|
} else {
|
||||||
aws("error", act_error.MEMBER_NOT_EXISTS);
|
aws("error", act_error.MEMBER_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.ROOMINFO, LISTENER_ACTION.CHANGE, []);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -617,6 +620,7 @@ export const leaveRoom: Act = {
|
||||||
data: {
|
data: {
|
||||||
room: "string",
|
room: "string",
|
||||||
server: "string",
|
server: "string",
|
||||||
|
// TODO: add force option for remote rooms
|
||||||
},
|
},
|
||||||
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
||||||
if (!checkSelfTag(data.server)) {
|
if (!checkSelfTag(data.server)) {
|
||||||
|
@ -706,6 +710,7 @@ export const setRoomRight: Act = {
|
||||||
.where(eq(rooms.roomID, roomID))
|
.where(eq(rooms.roomID, roomID))
|
||||||
.query(db);
|
.query(db);
|
||||||
aws("ok", "");
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.ROOMINFO, LISTENER_ACTION.CHANGE, []);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -735,5 +740,6 @@ export const changeRoomMeta: Act = {
|
||||||
.where(eq(rooms.roomID, roomID))
|
.where(eq(rooms.roomID, roomID))
|
||||||
.query(db);
|
.query(db);
|
||||||
aws("ok", "");
|
aws("ok", "");
|
||||||
|
sendRoomListeners(roomID, LISTENER_TYPE.ROOMINFO, LISTENER_ACTION.CHANGE, []);
|
||||||
}
|
}
|
||||||
};
|
};
|
68
src/api/acts/subscribe.ts
Normal file
68
src/api/acts/subscribe.ts
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
import { act_error } from "../../server/errors.js";
|
||||||
|
import { checkSelfTag } from "../../server/outbagURL.js";
|
||||||
|
import { Act, Client, STATE } from "../user.js";
|
||||||
|
import { wsClient } from "../ws.js";
|
||||||
|
|
||||||
|
export const subscribeRoom: Act = {
|
||||||
|
state: STATE.client | STATE.remote,
|
||||||
|
right: 0,
|
||||||
|
data: {
|
||||||
|
room: "name",
|
||||||
|
server: "string",
|
||||||
|
},
|
||||||
|
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
||||||
|
if (!(client.connectionClient instanceof wsClient)) {
|
||||||
|
return void aws("error", act_error.CONNECTION);
|
||||||
|
}
|
||||||
|
if (!checkSelfTag(data.server)) {
|
||||||
|
throw new Error("Remote not yet implemented.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const roomID = await client.isInRoom(data.room);
|
||||||
|
if (roomID == -1) {
|
||||||
|
aws("error", act_error.NOT_IN_ROOM);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
client.connectionClient.listenRoom(roomID, data.room, data.server);
|
||||||
|
aws("ok", "");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const unsubscribeRoom: Act = {
|
||||||
|
state: STATE.client | STATE.remote,
|
||||||
|
right: 0,
|
||||||
|
data: {
|
||||||
|
room: "name",
|
||||||
|
server: "string",
|
||||||
|
},
|
||||||
|
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
||||||
|
if (!(client.connectionClient instanceof wsClient)) {
|
||||||
|
return void aws("error", act_error.CONNECTION);
|
||||||
|
}
|
||||||
|
if (!checkSelfTag(data.server)) {
|
||||||
|
throw new Error("Remote not yet implemented.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const roomID = await client.isInRoom(data.room);
|
||||||
|
if (roomID == -1) {
|
||||||
|
aws("error", act_error.NOT_IN_ROOM);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
client.connectionClient.unlistenRoom(roomID);
|
||||||
|
aws("ok", "");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const unsubscribeAllRooms: Act = {
|
||||||
|
state: STATE.client | STATE.remote,
|
||||||
|
right: 0,
|
||||||
|
data: {},
|
||||||
|
func: async (client: Client, data: any, aws: (code: string, data: any) => void) => {
|
||||||
|
if (!(client.connectionClient instanceof wsClient)) {
|
||||||
|
return void aws("error", act_error.CONNECTION);
|
||||||
|
}
|
||||||
|
// TODO: When implemented close remote listeners
|
||||||
|
client.connectionClient.unlistenAllRooms();
|
||||||
|
aws("ok", "");
|
||||||
|
}
|
||||||
|
};
|
38
src/api/listener.ts
Normal file
38
src/api/listener.ts
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
import { wsClient } from "./ws.js"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
interface RoomListener {
|
||||||
|
client: wsClient;
|
||||||
|
room: string;
|
||||||
|
server: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
let roomListeners: { [key: number]: RoomListener[] } = {};
|
||||||
|
|
||||||
|
export const sendRoomListeners = async (roomID: number, type: string | number, action: number, ids: number[]) => {
|
||||||
|
for (const listener of roomListeners[roomID] ?? []) {
|
||||||
|
listener.client.sendFromServer({
|
||||||
|
room: listener.room,
|
||||||
|
server: listener.server,
|
||||||
|
type,
|
||||||
|
action,
|
||||||
|
ids,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const addRoomListener = (client: wsClient, roomID: number, room: string, server: string) => {
|
||||||
|
if (!Array.isArray(roomListeners[roomID])) roomListeners[roomID] = [];
|
||||||
|
const existingListener = roomListeners[roomID].find(listener => listener.client === client);
|
||||||
|
if (!existingListener) roomListeners[roomID].push({ client, room, server });
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
export const removeRoomListener = (client: wsClient, roomID: number | null = null) => {
|
||||||
|
let keys = roomID == null ? Object.keys(roomListeners) as any : [roomID];
|
||||||
|
for (const key of keys) {
|
||||||
|
roomListeners[key] = roomListeners[key].filter(listener => listener.client !== client);
|
||||||
|
if (roomListeners[key].length === 0) delete roomListeners[key];
|
||||||
|
}
|
||||||
|
};
|
|
@ -116,7 +116,8 @@ export const addPostMethods = (server: express.Express) => {
|
||||||
export class postClient {
|
export class postClient {
|
||||||
lastReq = uts();
|
lastReq = uts();
|
||||||
client: Client;
|
client: Client;
|
||||||
constructor(ip: string, client = new Client(ip)) {
|
constructor(ip: string, client: Client | null = null) {
|
||||||
|
if (client === null) client = new Client(ip, this);
|
||||||
this.client = client;
|
this.client = client;
|
||||||
}
|
}
|
||||||
async runAct(act: Act, json: any, aws: (state: string, data: any) => void) {
|
async runAct(act: Act, json: any, aws: (state: string, data: any) => void) {
|
||||||
|
|
|
@ -5,6 +5,8 @@ import { outbagServer, outbagURLfromTag } from "../server/outbagURL.js";
|
||||||
import { fetchRemoteAs } from "./server.js";
|
import { fetchRemoteAs } from "./server.js";
|
||||||
import { debug } from "../sys/log.js";
|
import { debug } from "../sys/log.js";
|
||||||
import { act_error } from "../server/errors.js";
|
import { act_error } from "../server/errors.js";
|
||||||
|
import { wsClient } from "./ws.js";
|
||||||
|
import { postClient } from "./post.js";
|
||||||
|
|
||||||
export const STATE = {
|
export const STATE = {
|
||||||
no: 0b00001,
|
no: 0b00001,
|
||||||
|
@ -40,7 +42,10 @@ export class Client {
|
||||||
challenge: string = "";
|
challenge: string = "";
|
||||||
remoteKey: string = "";
|
remoteKey: string = "";
|
||||||
|
|
||||||
constructor(ip: string) {
|
connectionClient: wsClient | postClient;
|
||||||
|
|
||||||
|
constructor(ip: string, client: wsClient | postClient) {
|
||||||
|
this.connectionClient = client;
|
||||||
this.server = new outbagServer("", "", "", "");
|
this.server = new outbagServer("", "", "", "");
|
||||||
this.ip = ip;
|
this.ip = ip;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { Act, checktype, Client } from "./user.js";
|
||||||
import { debug, error } from "../sys/log.js";
|
import { debug, error } from "../sys/log.js";
|
||||||
import * as importActs from "./acts.js"
|
import * as importActs from "./acts.js"
|
||||||
import { act_error } from "../server/errors.js";
|
import { act_error } from "../server/errors.js";
|
||||||
|
import { addRoomListener, removeRoomListener } from "./listener.js";
|
||||||
|
|
||||||
let acts = importActs as { [key: string]: Act };
|
let acts = importActs as { [key: string]: Act };
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ export class wsClient {
|
||||||
activeRequests = 0;
|
activeRequests = 0;
|
||||||
client: Client;
|
client: Client;
|
||||||
constructor(socket: ws.WebSocket, req: http.IncomingMessage) {
|
constructor(socket: ws.WebSocket, req: http.IncomingMessage) {
|
||||||
this.client = new Client(req.socket.remoteAddress ?? "");
|
this.client = new Client(req.socket.remoteAddress ?? "", this);
|
||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
|
|
||||||
clients.push(this);
|
clients.push(this);
|
||||||
|
@ -143,6 +144,7 @@ export class wsClient {
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('close', () => {
|
socket.on('close', () => {
|
||||||
|
this.unlistenAllRooms();
|
||||||
this.open = false;
|
this.open = false;
|
||||||
var i = clients.indexOf(this);
|
var i = clients.indexOf(this);
|
||||||
delete clients[i];
|
delete clients[i];
|
||||||
|
@ -154,6 +156,7 @@ export class wsClient {
|
||||||
|
|
||||||
close(ms: number) {
|
close(ms: number) {
|
||||||
return new Promise<void>(res => {
|
return new Promise<void>(res => {
|
||||||
|
this.unlistenAllRooms();
|
||||||
if (this.activeRequests == 0) {
|
if (this.activeRequests == 0) {
|
||||||
this.socket.close();
|
this.socket.close();
|
||||||
return void res();
|
return void res();
|
||||||
|
@ -164,6 +167,34 @@ export class wsClient {
|
||||||
}, Math.max(100, ms));
|
}, Math.max(100, ms));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sendFromServer(data: any): Promise<boolean> {
|
||||||
|
if (this.socket.readyState != WebSocket.OPEN) {
|
||||||
|
return Promise.resolve(false);
|
||||||
|
}
|
||||||
|
return new Promise((res, rej) => {
|
||||||
|
this.socket.send(JSON.stringify({
|
||||||
|
id: -1,
|
||||||
|
state: "server",
|
||||||
|
data: data
|
||||||
|
}), (err) => {
|
||||||
|
if(err) return void rej(false);
|
||||||
|
return void res(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
listenRoom(roomID: number, room: string, server: string) {
|
||||||
|
addRoomListener(this, roomID, room, server);
|
||||||
|
}
|
||||||
|
unlistenRoom(roomID: number) {
|
||||||
|
removeRoomListener(this, roomID);
|
||||||
|
}
|
||||||
|
unlistenAllRooms() {
|
||||||
|
removeRoomListener(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const closeWebSocket = async () => {
|
export const closeWebSocket = async () => {
|
||||||
|
|
|
@ -10,6 +10,7 @@ export const act_error = {
|
||||||
SERVER: "server", // uncaught error in server
|
SERVER: "server", // uncaught error in server
|
||||||
RECURSION: "recursion", // not allowed due to suspected remote recursion, will only appear with miss configureation
|
RECURSION: "recursion", // not allowed due to suspected remote recursion, will only appear with miss configureation
|
||||||
REMOTE: "remote", // error while remote request (like could not contact the remote server)
|
REMOTE: "remote", // error while remote request (like could not contact the remote server)
|
||||||
|
CONNECTION: "connection", // the current connection type is not correct
|
||||||
|
|
||||||
CLIENT_NOT_EXISTS: "clientnotexists", // seems like your own account does not exists (client.ts acts)
|
CLIENT_NOT_EXISTS: "clientnotexists", // seems like your own account does not exists (client.ts acts)
|
||||||
ACCOUNT_NOT_EXISTS: "accountnotexists", // referred account does not exists (admin / client trennen? )
|
ACCOUNT_NOT_EXISTS: "accountnotexists", // referred account does not exists (admin / client trennen? )
|
||||||
|
|
14
src/server/listener.ts
Normal file
14
src/server/listener.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
|
||||||
|
|
||||||
|
export const LISTENER_TYPE = {
|
||||||
|
ROOMINFO: 0,
|
||||||
|
ITEMS: 1,
|
||||||
|
CATEGORIES: 2,
|
||||||
|
PRODUCTS: 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
export const LISTENER_ACTION = {
|
||||||
|
ADD: 0,
|
||||||
|
CHANGE: 1,
|
||||||
|
DELETE: 2,
|
||||||
|
}
|
Loading…
Reference in a new issue