topsyde-utils 1.0.61 → 1.0.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/bun/websocket/Channel.d.ts +3 -3
- package/dist/server/bun/websocket/Channel.js +10 -9
- package/dist/server/bun/websocket/Channel.js.map +1 -1
- package/dist/server/bun/websocket/Client.js +2 -2
- package/dist/server/bun/websocket/Client.js.map +1 -1
- package/dist/server/bun/websocket/Websocket.d.ts +6 -4
- package/dist/server/bun/websocket/Websocket.js +23 -12
- package/dist/server/bun/websocket/Websocket.js.map +1 -1
- package/package.json +1 -1
@@ -10,9 +10,9 @@ export default class Channel {
|
|
10
10
|
constructor(id: string, name: string, limit?: number, members?: Map<string, Client>, metadata?: Record<string, string>);
|
11
11
|
addMember(entity: I_WebsocketEntity): void;
|
12
12
|
removeMember(entity: I_WebsocketEntity): void;
|
13
|
-
broadcast(message: WebsocketStructuredMessage, exclude?: string[] |
|
14
|
-
hasMember(client:
|
15
|
-
getMember(client:
|
13
|
+
broadcast(message: WebsocketStructuredMessage, exclude?: string[] | I_WebsocketEntity[]): void;
|
14
|
+
hasMember(client: I_WebsocketEntity | string): boolean;
|
15
|
+
getMember(client: I_WebsocketEntity | string): Client | undefined;
|
16
16
|
getMembers(): I_WebsocketClient[];
|
17
17
|
getMetadata(): Record<string, string>;
|
18
18
|
getCreatedAt(): Date | undefined;
|
@@ -20,13 +20,6 @@ class Channel {
|
|
20
20
|
const client = new Client_1.default(entity.id, entity.ws);
|
21
21
|
this.members.set(client.getId(), client);
|
22
22
|
client.joinChannel(this);
|
23
|
-
this.broadcast({
|
24
|
-
type: "channel.member.added",
|
25
|
-
content: {
|
26
|
-
channelId: this.id,
|
27
|
-
clientId: client.getId(),
|
28
|
-
},
|
29
|
-
});
|
30
23
|
}
|
31
24
|
removeMember(entity) {
|
32
25
|
if (!this.members.has(entity.id))
|
@@ -40,8 +33,16 @@ class Channel {
|
|
40
33
|
broadcast(message, exclude) {
|
41
34
|
Websocket_1.default.Broadcast(this.id, message);
|
42
35
|
}
|
43
|
-
hasMember(client) {
|
44
|
-
|
36
|
+
hasMember(client) {
|
37
|
+
if (typeof client === "string")
|
38
|
+
return this.members.has(client);
|
39
|
+
return this.members.has(client.id);
|
40
|
+
}
|
41
|
+
getMember(client) {
|
42
|
+
if (typeof client === "string")
|
43
|
+
return this.members.get(client);
|
44
|
+
return this.members.get(client.id);
|
45
|
+
}
|
45
46
|
getMembers() {
|
46
47
|
return Array.from(this.members.values());
|
47
48
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Channel.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Channel.ts"],"names":[],"mappings":";;;;;AAAA,4DAAoC;AAEpC,sDAA8B;AAG9B,MAAqB,OAAO;IAQ3B,YAAY,EAAU,EAAE,IAAY,EAAE,KAAc,EAAE,OAA6B,EAAE,QAAiC;QAP5G,cAAS,GAAU,IAAI,IAAI,EAAE,CAAC;QAQvC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,GAAG,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;IAChC,CAAC;
|
1
|
+
{"version":3,"file":"Channel.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Channel.ts"],"names":[],"mappings":";;;;;AAAA,4DAAoC;AAEpC,sDAA8B;AAG9B,MAAqB,OAAO;IAQ3B,YAAY,EAAU,EAAE,IAAY,EAAE,KAAc,EAAE,OAA6B,EAAE,QAAiC;QAP5G,cAAS,GAAU,IAAI,IAAI,EAAE,CAAC;QAQvC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,GAAG,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;IAChC,CAAC;IAGM,SAAS,CAAC,MAAyB;QACzC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAAE,OAAO;QACjC,MAAM,MAAM,GAAG,IAAI,gBAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEM,YAAY,CAAC,MAAyB;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,OAAO;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAEM,SAAS,CAAC,OAAmC,EAAE,OAAwC;QAC7F,mBAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAEM,SAAS,CAAC,MAAkC;QAClD,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAEM,SAAS,CAAC,MAAkC;QAClD,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAEM,UAAU;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEM,WAAW;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEM,YAAY;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAEM,KAAK;QACX,OAAO,IAAI,CAAC,EAAE,CAAC;IAChB,CAAC;IAEM,OAAO;QACb,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAEM,QAAQ;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAEM,OAAO;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC1B,CAAC;IACO,YAAY;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;CACD;AA7ED,0BA6EC"}
|
@@ -9,12 +9,12 @@ class Client {
|
|
9
9
|
joinChannel(channel) {
|
10
10
|
this.channels.set(channel.getId(), channel);
|
11
11
|
this.subscribe(channel.getId());
|
12
|
-
this.send({ type: "channel.
|
12
|
+
this.send({ type: "client.channel.added", content: { channelId: channel.getId() } });
|
13
13
|
}
|
14
14
|
leaveChannel(channel) {
|
15
15
|
this.channels.delete(channel.getId());
|
16
16
|
this.unsubscribe(channel.getId());
|
17
|
-
this.send({ type: "channel.
|
17
|
+
this.send({ type: "client.channel.removed", content: { channelId: channel.getId() } });
|
18
18
|
}
|
19
19
|
getChannels() {
|
20
20
|
return this.channels;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Client.ts"],"names":[],"mappings":";;AAIA,MAAqB,MAAM;IAK1B,YAAY,EAAU,EAAE,EAAwC;QAFtD,aAAQ,GAAqB,IAAI,GAAG,EAAE,CAAC;QAGhD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,CAAC;IAEM,WAAW,CAAC,OAAgB;QAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,
|
1
|
+
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Client.ts"],"names":[],"mappings":";;AAIA,MAAqB,MAAM;IAK1B,YAAY,EAAU,EAAE,EAAwC;QAFtD,aAAQ,GAAqB,IAAI,GAAG,EAAE,CAAC;QAGhD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,CAAC;IAEM,WAAW,CAAC,OAAgB;QAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACtF,CAAC;IAEM,YAAY,CAAC,OAAgB;QACnC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;IAEM,WAAW;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEM,KAAK;QACX,OAAO,IAAI,CAAC,EAAE,CAAC;IAChB,CAAC;IAEM,IAAI,CAAC,OAAmC;QAC9C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACvC,CAAC;IAEM,SAAS,CAAC,OAAe;QAC/B,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAEM,WAAW,CAAC,OAAe;QACjC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;CACD;AAzCD,yBAyCC"}
|
@@ -1,18 +1,20 @@
|
|
1
|
-
import { Server, WebSocketHandler } from "bun";
|
1
|
+
import { Server, ServerWebSocket, WebSocketHandler } from "bun";
|
2
2
|
import Singleton from "../../../singleton";
|
3
|
-
import type { I_WebsocketEntity, I_WebsocketInterface, WebsocketChannel, WebsocketClientData, WebsocketStructuredMessage } from "./websocket.types";
|
3
|
+
import type { I_WebsocketEntity, I_WebsocketInterface, WebsocketChannel, WebsocketClientData, WebsocketMessage, WebsocketStructuredMessage } from "./websocket.types";
|
4
4
|
export default class Websocket extends Singleton {
|
5
|
-
protected
|
5
|
+
protected ws_interface?: I_WebsocketInterface | undefined;
|
6
6
|
protected channels: WebsocketChannel;
|
7
7
|
private _server;
|
8
|
-
protected constructor(
|
8
|
+
protected constructor(ws_interface?: I_WebsocketInterface | undefined);
|
9
9
|
get server(): Server;
|
10
10
|
protected set server(value: Server);
|
11
11
|
set(server: Server): void;
|
12
12
|
setup(): WebSocketHandler<WebsocketClientData>;
|
13
13
|
private clientMessageReceived;
|
14
|
+
private handleHeartbeat;
|
14
15
|
private clientConnected;
|
15
16
|
private clientDisconnected;
|
17
|
+
static Heartbeat(ws: ServerWebSocket<WebsocketClientData>, message: WebsocketMessage): boolean;
|
16
18
|
static Server(): Server;
|
17
19
|
static Broadcast(channel: string, message: WebsocketStructuredMessage): void;
|
18
20
|
static Publish(message: WebsocketStructuredMessage): void;
|
@@ -6,20 +6,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const singleton_1 = __importDefault(require("../../../singleton"));
|
7
7
|
const Console_1 = require("../../../utils/Console");
|
8
8
|
const Channel_1 = __importDefault(require("./Channel"));
|
9
|
+
const utils_1 = require("../../../utils");
|
9
10
|
class Websocket extends singleton_1.default {
|
10
|
-
constructor(
|
11
|
+
constructor(ws_interface) {
|
11
12
|
super();
|
12
|
-
this.
|
13
|
+
this.ws_interface = ws_interface;
|
13
14
|
this.channels = new Map();
|
14
15
|
this.clientMessageReceived = (ws, message) => {
|
15
|
-
|
16
|
+
if (Websocket.Heartbeat(ws, message))
|
17
|
+
return;
|
18
|
+
const setup = this.ws_interface?.setup();
|
19
|
+
if (setup && setup.message)
|
20
|
+
return setup.message(ws, message);
|
21
|
+
ws.send("This is the message from the server: " + message);
|
22
|
+
Websocket.Publish({ type: "client.message.received", content: message });
|
23
|
+
};
|
24
|
+
this.handleHeartbeat = (ws, message) => {
|
16
25
|
if (message === "ping") {
|
17
26
|
const pong = { type: "pong", content: "pong" };
|
18
27
|
ws.send(JSON.stringify(pong));
|
28
|
+
return true;
|
19
29
|
}
|
20
|
-
|
21
|
-
ws.send(message);
|
22
|
-
Websocket.Publish({ type: "client.message.received", content: message });
|
30
|
+
return false;
|
23
31
|
};
|
24
32
|
this.clientConnected = (ws) => {
|
25
33
|
const global = this.channels.get("global");
|
@@ -27,7 +35,7 @@ class Websocket extends singleton_1.default {
|
|
27
35
|
global.addMember({ id: ws.data.id, ws });
|
28
36
|
};
|
29
37
|
this.clientDisconnected = (ws) => {
|
30
|
-
|
38
|
+
utils_1.Lib.Log("WebSocket connection closed");
|
31
39
|
this.channels.forEach((channel) => {
|
32
40
|
channel.removeMember({ id: ws.data.id, ws });
|
33
41
|
});
|
@@ -46,19 +54,22 @@ class Websocket extends singleton_1.default {
|
|
46
54
|
Console_1.Console.success("Websocket server set");
|
47
55
|
}
|
48
56
|
setup() {
|
49
|
-
const setup = this.websocket_interface?.setup();
|
50
57
|
return {
|
51
|
-
open:
|
52
|
-
message:
|
53
|
-
close:
|
58
|
+
open: this.clientConnected,
|
59
|
+
message: this.clientMessageReceived,
|
60
|
+
close: this.clientDisconnected,
|
54
61
|
};
|
55
62
|
}
|
63
|
+
static Heartbeat(ws, message) {
|
64
|
+
const self = this.GetInstance();
|
65
|
+
return self.handleHeartbeat(ws, message);
|
66
|
+
}
|
56
67
|
static Server() {
|
57
68
|
return this.GetInstance().server;
|
58
69
|
}
|
59
70
|
static Broadcast(channel, message) {
|
60
71
|
// Get the server from the singleton instance
|
61
|
-
const ws =
|
72
|
+
const ws = Websocket.GetInstance();
|
62
73
|
if (!ws.server) {
|
63
74
|
throw new Error("Websocket server not set");
|
64
75
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Websocket.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Websocket.ts"],"names":[],"mappings":";;;;;AACA,mEAA2C;AAC3C,oDAAiD;AACjD,wDAAgC;
|
1
|
+
{"version":3,"file":"Websocket.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Websocket.ts"],"names":[],"mappings":"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"}
|