topsyde-utils 1.0.32 → 1.0.34

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/index.d.ts CHANGED
@@ -10,8 +10,8 @@ export * from "./server/controller";
10
10
  export * from "./server/bun/router/routes";
11
11
  export * from "./server/bun/router/router";
12
12
  export * from "./server/bun/router/router.internal";
13
+ export * from "./server/bun/websocket/Client";
13
14
  export * from "./server/bun/websocket/Websocket";
14
- export * from "./server/bun/websocket/WebsocketClient";
15
15
  export * from "./server/bun/websocket/websocket.types";
16
16
  export * from "./server/bun/websocket/Channel";
17
17
  export * from "./utils/Guards";
@@ -24,8 +24,8 @@ export { default as Throwable } from "./throwable";
24
24
  export { default as Controller } from "./server/controller";
25
25
  export { default as Router } from "./server/bun/router/router";
26
26
  export { default as Router_Internal } from "./server/bun/router/router.internal";
27
+ export { default as Client } from "./server/bun/websocket/Client";
27
28
  export { default as Websocket } from "./server/bun/websocket/Websocket";
28
- export { default as WebsocketClient } from "./server/bun/websocket/WebsocketClient";
29
29
  export { default as Channel } from "./server/bun/websocket/Channel";
30
30
  export { default as Guards } from "./utils/Guards";
31
31
  export { default as Lib } from "./utils/Lib";
@@ -39,4 +39,4 @@ export { ClassConstructor, NonNullableType, ObjectKeys, KVObj, I_ApplicationResp
39
39
  export { E_IS, E_ENVIRONMENTS } from "./enums";
40
40
  export { ControllerResponse, ControllerAction, ControllerMap, ControllerOptions } from "./server/controller";
41
41
  export { Routes } from "./server/bun/router/routes";
42
- export { I_WebsocketClient, WebsocketClientData, WebsocketMessage, WebsocketStructuredMessage, WebsocketChannel } from "./server/bun/websocket/websocket.types";
42
+ export { I_WebsocketEntity, I_WebsocketClient, WebsocketClientData, WebsocketMessage, WebsocketStructuredMessage, WebsocketChannel, } from "./server/bun/websocket/websocket.types";
package/dist/index.js CHANGED
@@ -19,7 +19,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
19
19
  return (mod && mod.__esModule) ? mod : { "default": mod };
20
20
  };
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.E_ENVIRONMENTS = exports.E_IS = exports.LOG_ICONS = exports.LOG_COLORS = exports.DEFAULT_FALSE_RESPONSE = exports.RESPONSE_METHOD_OPTIONS = exports.RESPONSE_INIT = exports.WS_ERROR_CODE = exports.HTTP_ERROR_CODE = exports.ERROR_CODE = exports.Console = exports.Lib = exports.Guards = exports.Channel = exports.WebsocketClient = exports.Websocket = exports.Router_Internal = exports.Router = exports.Controller = exports.Throwable = exports.Application = exports.Initializable = exports.Singleton = void 0;
22
+ exports.E_ENVIRONMENTS = exports.E_IS = exports.LOG_ICONS = exports.LOG_COLORS = exports.DEFAULT_FALSE_RESPONSE = exports.RESPONSE_METHOD_OPTIONS = exports.RESPONSE_INIT = exports.WS_ERROR_CODE = exports.HTTP_ERROR_CODE = exports.ERROR_CODE = exports.Console = exports.Lib = exports.Guards = exports.Channel = exports.Websocket = exports.Client = exports.Router_Internal = exports.Router = exports.Controller = exports.Throwable = exports.Application = exports.Initializable = exports.Singleton = void 0;
23
23
  // Export all modules
24
24
  __exportStar(require("./errors"), exports);
25
25
  __exportStar(require("./singleton"), exports);
@@ -33,8 +33,8 @@ __exportStar(require("./server/controller"), exports);
33
33
  __exportStar(require("./server/bun/router/routes"), exports);
34
34
  __exportStar(require("./server/bun/router/router"), exports);
35
35
  __exportStar(require("./server/bun/router/router.internal"), exports);
36
+ __exportStar(require("./server/bun/websocket/Client"), exports);
36
37
  __exportStar(require("./server/bun/websocket/Websocket"), exports);
37
- __exportStar(require("./server/bun/websocket/WebsocketClient"), exports);
38
38
  __exportStar(require("./server/bun/websocket/websocket.types"), exports);
39
39
  __exportStar(require("./server/bun/websocket/Channel"), exports);
40
40
  __exportStar(require("./utils/Guards"), exports);
@@ -55,10 +55,10 @@ var router_1 = require("./server/bun/router/router");
55
55
  Object.defineProperty(exports, "Router", { enumerable: true, get: function () { return __importDefault(router_1).default; } });
56
56
  var router_internal_1 = require("./server/bun/router/router.internal");
57
57
  Object.defineProperty(exports, "Router_Internal", { enumerable: true, get: function () { return __importDefault(router_internal_1).default; } });
58
+ var Client_1 = require("./server/bun/websocket/Client");
59
+ Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return __importDefault(Client_1).default; } });
58
60
  var Websocket_1 = require("./server/bun/websocket/Websocket");
59
61
  Object.defineProperty(exports, "Websocket", { enumerable: true, get: function () { return __importDefault(Websocket_1).default; } });
60
- var WebsocketClient_1 = require("./server/bun/websocket/WebsocketClient");
61
- Object.defineProperty(exports, "WebsocketClient", { enumerable: true, get: function () { return __importDefault(WebsocketClient_1).default; } });
62
62
  var Channel_1 = require("./server/bun/websocket/Channel");
63
63
  Object.defineProperty(exports, "Channel", { enumerable: true, get: function () { return __importDefault(Channel_1).default; } });
64
64
  var Guards_1 = require("./utils/Guards");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;;;;;;;;;;;;;;;AAEjC,qBAAqB;AACrB,2CAAyB;AACzB,8CAA4B;AAC5B,kDAAgC;AAChC,gDAA8B;AAC9B,2CAAyB;AACzB,0CAAwB;AACxB,8CAA4B;AAC5B,0CAAwB;AACxB,sDAAoC;AACpC,6DAA2C;AAC3C,6DAA2C;AAC3C,sEAAoD;AACpD,mEAAiD;AACjD,yEAAuD;AACvD,yEAAuD;AACvD,iEAA+C;AAC/C,iDAA+B;AAC/B,8CAA4B;AAC5B,kDAAgC;AAEhC,yBAAyB;AACzB,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,iDAA2D;AAAlD,+HAAA,OAAO,OAAiB;AACjC,6CAAuD;AAA9C,2HAAA,OAAO,OAAe;AAC/B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,kDAA4D;AAAnD,yHAAA,OAAO,OAAc;AAC9B,qDAA+D;AAAtD,iHAAA,OAAO,OAAU;AAC1B,uEAAiF;AAAxE,mIAAA,OAAO,OAAmB;AACnC,8DAAwE;AAA/D,uHAAA,OAAO,OAAa;AAC7B,0EAAoF;AAA3E,mIAAA,OAAO,OAAmB;AACnC,0DAAoE;AAA3D,mHAAA,OAAO,OAAW;AAC3B,yCAAmD;AAA1C,iHAAA,OAAO,OAAU;AAC1B,mCAA6C;AAApC,2GAAA,OAAO,OAAO;AACvB,2CAAqD;AAA5C,mHAAA,OAAO,OAAW;AAE3B,sDAAsD;AACtD,mCAAsE;AAA7D,oGAAA,UAAU,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,uGAAA,aAAa,OAAA;AAGnD,6CAAuE;AAA9D,4GAAA,aAAa,OAAA;AAAE,sHAAA,uBAAuB,OAAA;AAC/C,mCAAyE;AAAhE,gHAAA,sBAAsB,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,mGAAA,SAAS,OAAA;AAEtD,iCAA+C;AAAtC,6FAAA,IAAI,OAAA;AAAE,uGAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;;;;;;;;;;;;;;;AAEjC,qBAAqB;AACrB,2CAAyB;AACzB,8CAA4B;AAC5B,kDAAgC;AAChC,gDAA8B;AAC9B,2CAAyB;AACzB,0CAAwB;AACxB,8CAA4B;AAC5B,0CAAwB;AACxB,sDAAoC;AACpC,6DAA2C;AAC3C,6DAA2C;AAC3C,sEAAoD;AACpD,gEAA8C;AAC9C,mEAAiD;AACjD,yEAAuD;AACvD,iEAA+C;AAC/C,iDAA+B;AAC/B,8CAA4B;AAC5B,kDAAgC;AAEhC,yBAAyB;AACzB,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,iDAA2D;AAAlD,+HAAA,OAAO,OAAiB;AACjC,6CAAuD;AAA9C,2HAAA,OAAO,OAAe;AAC/B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,kDAA4D;AAAnD,yHAAA,OAAO,OAAc;AAC9B,qDAA+D;AAAtD,iHAAA,OAAO,OAAU;AAC1B,uEAAiF;AAAxE,mIAAA,OAAO,OAAmB;AACnC,wDAAkE;AAAzD,iHAAA,OAAO,OAAU;AAC1B,8DAAwE;AAA/D,uHAAA,OAAO,OAAa;AAC7B,0DAAoE;AAA3D,mHAAA,OAAO,OAAW;AAC3B,yCAAmD;AAA1C,iHAAA,OAAO,OAAU;AAC1B,mCAA6C;AAApC,2GAAA,OAAO,OAAO;AACvB,2CAAqD;AAA5C,mHAAA,OAAO,OAAW;AAE3B,sDAAsD;AACtD,mCAAsE;AAA7D,oGAAA,UAAU,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,uGAAA,aAAa,OAAA;AAGnD,6CAAuE;AAA9D,4GAAA,aAAa,OAAA;AAAE,sHAAA,uBAAuB,OAAA;AAC/C,mCAAyE;AAAhE,gHAAA,sBAAsB,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,mGAAA,SAAS,OAAA;AAEtD,iCAA+C;AAAtC,6FAAA,IAAI,OAAA;AAAE,uGAAA,cAAc,OAAA"}
@@ -1,5 +1,5 @@
1
- import type { WebsocketStructuredMessage, I_WebsocketClient } from "./websocket.types";
2
- import WebsocketClient from "./WebsocketClient";
1
+ import type { WebsocketStructuredMessage, I_WebsocketClient, I_WebsocketEntity } from "./websocket.types";
2
+ import Client from "./Client";
3
3
  export default class Channel {
4
4
  private createdAt?;
5
5
  private id;
@@ -7,13 +7,13 @@ export default class Channel {
7
7
  private limit;
8
8
  private members;
9
9
  private metadata;
10
- constructor(id: string, name: string, limit?: number, members?: Map<string, WebsocketClient>, metadata?: Record<string, string>);
11
- addMember(client: WebsocketClient): void;
12
- removeMember(client: WebsocketClient): void;
10
+ constructor(id: string, name: string, limit?: number, members?: Map<string, Client>, metadata?: Record<string, string>);
11
+ addMember(entity: I_WebsocketEntity): void;
12
+ removeMember(entity: I_WebsocketEntity): void;
13
13
  broadcast(message: WebsocketStructuredMessage, exclude?: string[] | I_WebsocketClient[]): void;
14
14
  hasMember(client: I_WebsocketClient | string): void;
15
15
  getMember(client: I_WebsocketClient | string): void;
16
- getMembers(): WebsocketClient[];
16
+ getMembers(): I_WebsocketClient[];
17
17
  getMetadata(): Record<string, string>;
18
18
  getCreatedAt(): Date | undefined;
19
19
  getId(): string;
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const Websocket_1 = __importDefault(require("./Websocket"));
7
+ const Client_1 = __importDefault(require("./Client"));
7
8
  class Channel {
8
9
  constructor(id, name, limit, members, metadata) {
9
10
  this.createdAt = new Date();
@@ -13,25 +14,31 @@ class Channel {
13
14
  this.members = members ?? new Map();
14
15
  this.metadata = metadata ?? {};
15
16
  }
16
- addMember(client) {
17
- if (this.canAddMember()) {
18
- this.members.set(client.getId(), client);
19
- client.joinChannel(this);
20
- }
17
+ addMember(entity) {
18
+ if (!this.canAddMember())
19
+ return;
20
+ const client = new Client_1.default(entity.id, entity.ws);
21
+ this.members.set(client.getId(), client);
22
+ client.joinChannel(this);
21
23
  this.broadcast({
22
24
  type: "channel.member.added",
23
- data: {
25
+ content: {
24
26
  channelId: this.id,
25
27
  clientId: client.getId(),
26
28
  },
27
29
  });
28
30
  }
29
- removeMember(client) {
30
- this.members.delete(client.getId());
31
+ removeMember(entity) {
32
+ if (!this.members.has(entity.id))
33
+ return;
34
+ const client = this.members.get(entity.id);
35
+ if (!client)
36
+ return;
31
37
  client.leaveChannel(this);
38
+ this.members.delete(entity.id);
32
39
  }
33
40
  broadcast(message, exclude) {
34
- Websocket_1.default.Server().publish(this.id, JSON.stringify(message));
41
+ Websocket_1.default.Broadcast(this.id, message);
35
42
  }
36
43
  hasMember(client) { }
37
44
  getMember(client) { }
@@ -1 +1 @@
1
- {"version":3,"file":"Channel.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Channel.ts"],"names":[],"mappings":";;;;;AAAA,4DAAoC;AAIpC,MAAqB,OAAO;IAQ3B,YAAY,EAAU,EAAE,IAAY,EAAE,KAAc,EAAE,OAAsC,EAAE,QAAiC;QAPvH,cAAS,GAAU,IAAI,IAAI,EAAE,CAAC;QAQrC,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;IAEM,SAAS,CAAC,MAAuB;QACvC,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,SAAS,CAAC;YACd,IAAI,EAAE,sBAAsB;YAC5B,IAAI,EAAE;gBACL,SAAS,EAAE,IAAI,CAAC,EAAE;gBAClB,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE;aACxB;SACD,CAAC,CAAC;IACJ,CAAC;IAEM,YAAY,CAAC,MAAuB;QAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAEM,SAAS,CAAC,OAAmC,EAAE,OAAwC;QAC7F,mBAAS,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEM,SAAS,CAAC,MAAkC,IAAG,CAAC;IAChD,SAAS,CAAC,MAAkC,IAAG,CAAC;IAChD,UAAU;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IACM,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;AAxED,0BAwEC"}
1
+ {"version":3,"file":"Channel.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Channel.ts"],"names":[],"mappings":";;;;;AAAA,4DAAoC;AAEpC,sDAA8B;AAE9B,MAAqB,OAAO;IAQ3B,YAAY,EAAU,EAAE,IAAY,EAAE,KAAc,EAAE,OAA6B,EAAE,QAAiC;QAP9G,cAAS,GAAU,IAAI,IAAI,EAAE,CAAC;QAQrC,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;IAEM,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;QAEzB,IAAI,CAAC,SAAS,CAAC;YACd,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE;gBACR,SAAS,EAAE,IAAI,CAAC,EAAE;gBAClB,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE;aACxB;SACD,CAAC,CAAC;IACJ,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,IAAG,CAAC;IAEhD,SAAS,CAAC,MAAkC,IAAG,CAAC;IAEhD,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;AA9ED,0BA8EC"}
@@ -1,7 +1,7 @@
1
1
  import { ServerWebSocket } from "bun";
2
2
  import Channel from "./Channel";
3
- import type { I_WebsocketClient, WebsocketClientData, WebsocketChannel } from "./websocket.types";
4
- export default class WebsocketClient implements I_WebsocketClient {
3
+ import type { I_WebsocketClient, WebsocketClientData, WebsocketChannel, WebsocketStructuredMessage } from "./websocket.types";
4
+ export default class Client implements I_WebsocketClient {
5
5
  id: string;
6
6
  ws: ServerWebSocket<WebsocketClientData>;
7
7
  private channels;
@@ -10,4 +10,7 @@ export default class WebsocketClient implements I_WebsocketClient {
10
10
  leaveChannel(channel: Channel): void;
11
11
  getChannels(): WebsocketChannel;
12
12
  getId(): string;
13
+ send(message: WebsocketStructuredMessage): void;
14
+ subscribe(channel: string): void;
15
+ unsubscribe(channel: string): void;
13
16
  }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class Client {
4
+ constructor(id, ws) {
5
+ this.channels = new Map();
6
+ this.id = id;
7
+ this.ws = ws;
8
+ }
9
+ joinChannel(channel) {
10
+ this.channels.set(channel.getId(), channel);
11
+ this.subscribe(channel.getId());
12
+ this.send({ type: "channel.join", content: { channelId: channel.getId() } });
13
+ }
14
+ leaveChannel(channel) {
15
+ this.channels.delete(channel.getId());
16
+ this.unsubscribe(channel.getId());
17
+ this.send({ type: "channel.leave", content: { channelId: channel.getId() } });
18
+ }
19
+ getChannels() {
20
+ return this.channels;
21
+ }
22
+ getId() {
23
+ return this.id;
24
+ }
25
+ send(message) {
26
+ this.ws.send(JSON.stringify(message));
27
+ }
28
+ subscribe(channel) {
29
+ this.ws.subscribe(channel);
30
+ }
31
+ unsubscribe(channel) {
32
+ this.ws.unsubscribe(channel);
33
+ }
34
+ }
35
+ exports.default = Client;
36
+ //# sourceMappingURL=Client.js.map
@@ -0,0 +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;QAFxD,aAAQ,GAAqB,IAAI,GAAG,EAAE,CAAC;QAG9C,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,cAAc,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9E,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,eAAe,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/E,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,14 +1,18 @@
1
1
  import { Server, WebSocketHandler } from "bun";
2
2
  import Singleton from "../../../singleton";
3
- import type { WebsocketClientData } from "./websocket.types";
3
+ import type { I_WebsocketEntity, WebsocketClientData, WebsocketStructuredMessage } from "./websocket.types";
4
4
  export default class Websocket extends Singleton {
5
5
  private channels;
6
6
  private server;
7
7
  private constructor();
8
8
  set(server: Server): void;
9
9
  static Server(): Server;
10
+ static Broadcast(channel: string, message: WebsocketStructuredMessage): void;
11
+ static Publish(message: WebsocketStructuredMessage): void;
12
+ static Join(channel: string, entity: I_WebsocketEntity): void;
13
+ static Leave(channel: string, entity: I_WebsocketEntity): void;
10
14
  setup(): WebSocketHandler<WebsocketClientData>;
11
- private messageReceived;
15
+ private clientMessageReceived;
12
16
  private clientConnected;
13
17
  private clientDisconnected;
14
18
  }
@@ -8,43 +8,65 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
8
8
  return (mod && mod.__esModule) ? mod : { "default": mod };
9
9
  };
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
- const Channel_1 = __importDefault(require("./Channel"));
12
- const WebsocketClient_1 = __importDefault(require("./WebsocketClient"));
13
11
  const singleton_1 = __importDefault(require("../../../singleton"));
12
+ const Console_1 = require("../../../utils/Console");
13
+ const Channel_1 = __importDefault(require("./Channel"));
14
14
  class Websocket extends singleton_1.default {
15
15
  constructor() {
16
16
  super();
17
17
  this.channels = new Map();
18
- this.messageReceived = (ws, message) => {
18
+ this.clientMessageReceived = (ws, message) => {
19
19
  console.log("Received message:", message);
20
- if (message === "ping")
21
- ws.send("pong");
20
+ if (message === "ping") {
21
+ const pong = { type: "pong", content: "pong" };
22
+ ws.send(JSON.stringify(pong));
23
+ }
22
24
  else
23
25
  ws.send(message);
26
+ Websocket.Publish({ type: "client.message.received", content: message });
24
27
  };
25
28
  this.clientConnected = (ws) => {
26
- console.log("WebSocket connection opened");
27
29
  const global = this.channels.get("global");
28
- const client = new WebsocketClient_1.default(ws.data.id, ws);
29
30
  if (global)
30
- global.addMember(client);
31
+ global.addMember({ id: ws.data.id, ws });
31
32
  };
32
33
  this.clientDisconnected = (ws) => {
33
34
  console.log("WebSocket connection closed");
35
+ this.channels.forEach((channel) => {
36
+ channel.removeMember({ id: ws.data.id, ws });
37
+ });
34
38
  };
35
39
  const global = new Channel_1.default("global", "Global Channel", 1000);
36
40
  this.channels.set("global", global);
37
41
  }
38
42
  set(server) {
39
43
  this.server = server;
44
+ Console_1.Console.success("Websocket server set");
40
45
  }
41
46
  static Server() {
42
47
  return Websocket.GetInstance().server;
43
48
  }
49
+ static Broadcast(channel, message) {
50
+ this.Server().publish(channel, JSON.stringify(message));
51
+ }
52
+ static Publish(message) {
53
+ const ws = Websocket.GetInstance();
54
+ ws.channels.forEach((channel) => {
55
+ channel.broadcast(message);
56
+ });
57
+ }
58
+ static Join(channel, entity) {
59
+ const ws = Websocket.GetInstance();
60
+ ws.channels.get(channel)?.addMember(entity);
61
+ }
62
+ static Leave(channel, entity) {
63
+ const ws = Websocket.GetInstance();
64
+ ws.channels.get(channel)?.removeMember(entity);
65
+ }
44
66
  setup() {
45
67
  return {
46
- message: this.messageReceived,
47
68
  open: this.clientConnected,
69
+ message: this.clientMessageReceived,
48
70
  close: this.clientDisconnected,
49
71
  };
50
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Websocket.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Websocket.ts"],"names":[],"mappings":";AAAA;;;;0FAI0F;;;;;AAG1F,wDAAgC;AAChC,wEAAgD;AAChD,mEAA2C;AAI3C,MAAqB,SAAU,SAAQ,mBAAS;IAG/C;QACC,KAAK,EAAE,CAAC;QAHD,aAAQ,GAAqB,IAAI,GAAG,EAAE,CAAC;QAwBvC,oBAAe,GAAG,CAAC,EAAwC,EAAE,OAAyB,EAAE,EAAE;YACjG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YAC1C,IAAI,OAAO,KAAK,MAAM;gBAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;gBACnC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC,CAAC;QAEM,oBAAe,GAAG,CAAC,EAAwC,EAAE,EAAE;YACtE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,yBAAe,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,MAAM;gBAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC;QAEM,uBAAkB,GAAG,CAAC,EAAwC,EAAE,EAAE;YACzE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC5C,CAAC,CAAC;QAnCD,MAAM,MAAM,GAAG,IAAI,iBAAO,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAEM,GAAG,CAAC,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAEM,MAAM,CAAC,MAAM;QACnB,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;IACvC,CAAC;IAEM,KAAK;QACX,OAAO;YACN,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,IAAI,EAAE,IAAI,CAAC,eAAe;YAC1B,KAAK,EAAE,IAAI,CAAC,kBAAkB;SAC9B,CAAC;IACH,CAAC;CAkBD;AAzCD,4BAyCC"}
1
+ {"version":3,"file":"Websocket.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Websocket.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
+ export * from './Client';
1
2
  export * from './Websocket';
2
- export * from './WebsocketClient';
3
3
  export * from './websocket.types';
4
4
  export * from './Channel';
5
+ export { default as Client } from './Client';
5
6
  export { default as Websocket } from './Websocket';
6
- export { default as WebsocketClient } from './WebsocketClient';
7
7
  export { default as Channel } from './Channel';
@@ -19,15 +19,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
19
19
  return (mod && mod.__esModule) ? mod : { "default": mod };
20
20
  };
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.Channel = exports.WebsocketClient = exports.Websocket = void 0;
22
+ exports.Channel = exports.Websocket = exports.Client = void 0;
23
+ __exportStar(require("./Client"), exports);
23
24
  __exportStar(require("./Websocket"), exports);
24
- __exportStar(require("./WebsocketClient"), exports);
25
25
  __exportStar(require("./websocket.types"), exports);
26
26
  __exportStar(require("./Channel"), exports);
27
+ var Client_1 = require("./Client");
28
+ Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return __importDefault(Client_1).default; } });
27
29
  var Websocket_1 = require("./Websocket");
28
30
  Object.defineProperty(exports, "Websocket", { enumerable: true, get: function () { return __importDefault(Websocket_1).default; } });
29
- var WebsocketClient_1 = require("./WebsocketClient");
30
- Object.defineProperty(exports, "WebsocketClient", { enumerable: true, get: function () { return __importDefault(WebsocketClient_1).default; } });
31
31
  var Channel_1 = require("./Channel");
32
32
  Object.defineProperty(exports, "Channel", { enumerable: true, get: function () { return __importDefault(Channel_1).default; } });
33
33
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;;;;;;;;;;;;;;;AAEjC,8CAA4B;AAC5B,oDAAkC;AAClC,oDAAkC;AAClC,4CAA0B;AAC1B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,qDAA+D;AAAtD,mIAAA,OAAO,OAAmB;AACnC,qCAA+C;AAAtC,mHAAA,OAAO,OAAW"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;;;;;;;;;;;;;;;AAEjC,2CAAyB;AACzB,8CAA4B;AAC5B,oDAAkC;AAClC,4CAA0B;AAC1B,mCAA6C;AAApC,iHAAA,OAAO,OAAU;AAC1B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,qCAA+C;AAAtC,mHAAA,OAAO,OAAW"}
@@ -1,15 +1,22 @@
1
1
  import { ServerWebSocket } from "bun";
2
2
  import Channel from "./Channel";
3
- export interface I_WebsocketClient {
3
+ export interface I_WebsocketEntity {
4
4
  ws: ServerWebSocket<WebsocketClientData>;
5
5
  id: string;
6
6
  }
7
+ export interface I_WebsocketClient extends I_WebsocketEntity {
8
+ send(message: WebsocketStructuredMessage): void;
9
+ subscribe(channel: string): void;
10
+ unsubscribe(channel: string): void;
11
+ }
7
12
  export type WebsocketClientData = {
8
13
  id: string;
9
14
  };
10
15
  export type WebsocketMessage = string | Buffer<ArrayBufferLike>;
11
16
  export type WebsocketStructuredMessage = {
12
17
  type: string;
13
- data: any;
18
+ content: any;
19
+ channel?: string;
20
+ metadata?: Record<string, string>;
14
21
  };
15
22
  export type WebsocketChannel<T extends Channel = Channel> = Map<string, T>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "topsyde-utils",
3
- "version": "1.0.32",
3
+ "version": "1.0.34",
4
4
  "description": "A bundle of TypeScript utility classes and functions",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- class WebsocketClient {
4
- constructor(id, ws) {
5
- this.channels = new Map();
6
- this.id = id;
7
- this.ws = ws;
8
- }
9
- joinChannel(channel) {
10
- this.channels.set(channel.getId(), channel);
11
- this.ws.subscribe(channel.getId());
12
- }
13
- leaveChannel(channel) {
14
- this.channels.delete(channel.getId());
15
- this.ws.unsubscribe(channel.getId());
16
- }
17
- getChannels() {
18
- return this.channels;
19
- }
20
- getId() {
21
- return this.id;
22
- }
23
- }
24
- exports.default = WebsocketClient;
25
- //# sourceMappingURL=WebsocketClient.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WebsocketClient.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/WebsocketClient.ts"],"names":[],"mappings":";;AAIA,MAAqB,eAAe;IAKnC,YAAY,EAAU,EAAE,EAAwC;QAFxD,aAAQ,GAAqB,IAAI,GAAG,EAAE,CAAC;QAG9C,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,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACpC,CAAC;IAEM,YAAY,CAAC,OAAgB;QACnC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACtC,CAAC;IAEM,WAAW;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEM,KAAK;QACX,OAAO,IAAI,CAAC,EAAE,CAAC;IAChB,CAAC;CACD;AA3BD,kCA2BC"}