topsyde-utils 1.0.21 → 1.0.24

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/errors.d.ts CHANGED
@@ -18,20 +18,31 @@ export declare enum HTTP_ERROR_CODE {
18
18
  NOT_FOUND = 404,
19
19
  INTERNAL_SERVER_ERROR = 500
20
20
  }
21
+ /**
22
+ * WebSocket close event codes
23
+ *
24
+ * Standard codes (1000-1999):
25
+ * - 1000-1015: Reserved for the WebSocket protocol
26
+ *
27
+ * Application-specific codes:
28
+ * - 4000-4999: Reserved for application use
29
+ */
21
30
  export declare enum WS_ERROR_CODE {
22
- NORMAL_CLOSURE = 1000,
23
- GOING_AWAY = 1001,
24
- PROTOCOL_ERROR = 1002,
25
- UNSUPPORTED_DATA = 1003,
26
- NO_STATUS_RECEIVED = 1005,
27
- ABNORMAL_CLOSURE = 1006,
28
- INVALID_FRAME_PAYLOAD_DATA = 1007,
29
- POLICY_VIOLATION = 1008,
30
- MESSAGE_TOO_BIG = 1009,
31
- MISSING_EXTENSION = 1010,
32
- INTERNAL_ERROR = 1011,
33
- SERVICE_RESTART = 1012,
34
- TRY_AGAIN_LATER = 1013,
35
- BAD_GATEWAY = 1014,
36
- TLS_HANDSHAKE = 1015
31
+ NORMAL_CLOSURE = 1000,// Normal closure; the connection successfully completed whatever purpose for which it was created
32
+ GOING_AWAY = 1001,// The endpoint is going away (server shutdown or browser navigating away)
33
+ PROTOCOL_ERROR = 1002,// Protocol error
34
+ UNSUPPORTED_DATA = 1003,// Received data of a type it cannot accept (e.g., text-only endpoint received binary data)
35
+ NO_STATUS_RECEIVED = 1005,// No status code was provided even though one was expected
36
+ ABNORMAL_CLOSURE = 1006,// Connection was closed abnormally (e.g., without sending or receiving a Close control frame)
37
+ INVALID_FRAME_PAYLOAD_DATA = 1007,// Received data that was not consistent with the type of the message
38
+ POLICY_VIOLATION = 1008,// Policy violation
39
+ MESSAGE_TOO_BIG = 1009,// Message was too big and was rejected
40
+ MISSING_EXTENSION = 1010,// Client expected the server to negotiate one or more extension, but server didn't
41
+ INTERNAL_ERROR = 1011,// Server encountered an unexpected condition that prevented it from fulfilling the request
42
+ SERVICE_RESTART = 1012,// Server is restarting
43
+ TRY_AGAIN_LATER = 1013,// Server is too busy or the client is rate-limited
44
+ BAD_GATEWAY = 1014,// Gateway or proxy received an invalid response from the upstream server
45
+ TLS_HANDSHAKE = 1015,// TLS handshake failure
46
+ APP_AUTHENTICATION_FAILED = 4000,
47
+ APP_INVALID_MESSAGE_FORMAT = 4001
37
48
  }
package/dist/errors.js CHANGED
@@ -24,9 +24,18 @@ var HTTP_ERROR_CODE;
24
24
  HTTP_ERROR_CODE[HTTP_ERROR_CODE["NOT_FOUND"] = 404] = "NOT_FOUND";
25
25
  HTTP_ERROR_CODE[HTTP_ERROR_CODE["INTERNAL_SERVER_ERROR"] = 500] = "INTERNAL_SERVER_ERROR";
26
26
  })(HTTP_ERROR_CODE || (exports.HTTP_ERROR_CODE = HTTP_ERROR_CODE = {}));
27
+ /**
28
+ * WebSocket close event codes
29
+ *
30
+ * Standard codes (1000-1999):
31
+ * - 1000-1015: Reserved for the WebSocket protocol
32
+ *
33
+ * Application-specific codes:
34
+ * - 4000-4999: Reserved for application use
35
+ */
27
36
  var WS_ERROR_CODE;
28
37
  (function (WS_ERROR_CODE) {
29
- // WebSocket close event codes
38
+ // Standard WebSocket close codes (1000-1015)
30
39
  WS_ERROR_CODE[WS_ERROR_CODE["NORMAL_CLOSURE"] = 1000] = "NORMAL_CLOSURE";
31
40
  WS_ERROR_CODE[WS_ERROR_CODE["GOING_AWAY"] = 1001] = "GOING_AWAY";
32
41
  WS_ERROR_CODE[WS_ERROR_CODE["PROTOCOL_ERROR"] = 1002] = "PROTOCOL_ERROR";
@@ -42,5 +51,10 @@ var WS_ERROR_CODE;
42
51
  WS_ERROR_CODE[WS_ERROR_CODE["TRY_AGAIN_LATER"] = 1013] = "TRY_AGAIN_LATER";
43
52
  WS_ERROR_CODE[WS_ERROR_CODE["BAD_GATEWAY"] = 1014] = "BAD_GATEWAY";
44
53
  WS_ERROR_CODE[WS_ERROR_CODE["TLS_HANDSHAKE"] = 1015] = "TLS_HANDSHAKE";
54
+ // Application-specific codes (4000-4999)
55
+ // Add your application-specific codes here as needed
56
+ // Example:
57
+ WS_ERROR_CODE[WS_ERROR_CODE["APP_AUTHENTICATION_FAILED"] = 4000] = "APP_AUTHENTICATION_FAILED";
58
+ WS_ERROR_CODE[WS_ERROR_CODE["APP_INVALID_MESSAGE_FORMAT"] = 4001] = "APP_INVALID_MESSAGE_FORMAT";
45
59
  })(WS_ERROR_CODE || (exports.WS_ERROR_CODE = WS_ERROR_CODE = {}));
46
60
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,IAAY,UAWX;AAXD,WAAY,UAAU;IACrB,wDAAe,CAAA;IACf,6DAAiB,CAAA;IACjB,+DAAkB,CAAA;IAClB,iEAAmB,CAAA;IACnB,uEAAsB,CAAA;IACtB,+DAAkB,CAAA;IAClB,mEAAoB,CAAA;IACpB,qEAAqB,CAAA;IACrB,2EAAwB,CAAA;IACxB,+DAAkB,CAAA;AACnB,CAAC,EAXW,UAAU,0BAAV,UAAU,QAWrB;AAED,IAAY,eAOX;AAPD,WAAY,eAAe;IAC1B,mDAAQ,CAAA;IACR,qEAAiB,CAAA;IACjB,uEAAkB,CAAA;IAClB,iEAAe,CAAA;IACf,iEAAe,CAAA;IACf,yFAA2B,CAAA;AAC5B,CAAC,EAPW,eAAe,+BAAf,eAAe,QAO1B;AAED,IAAY,aAiBX;AAjBD,WAAY,aAAa;IACxB,8BAA8B;IAC9B,wEAAqB,CAAA;IACrB,gEAAiB,CAAA;IACjB,wEAAqB,CAAA;IACrB,4EAAuB,CAAA;IACvB,gFAAyB,CAAA;IACzB,4EAAuB,CAAA;IACvB,gGAAiC,CAAA;IACjC,4EAAuB,CAAA;IACvB,0EAAsB,CAAA;IACtB,8EAAwB,CAAA;IACxB,wEAAqB,CAAA;IACrB,0EAAsB,CAAA;IACtB,0EAAsB,CAAA;IACtB,kEAAkB,CAAA;IAClB,sEAAoB,CAAA;AACrB,CAAC,EAjBW,aAAa,6BAAb,aAAa,QAiBxB"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,IAAY,UAWX;AAXD,WAAY,UAAU;IACrB,wDAAe,CAAA;IACf,6DAAiB,CAAA;IACjB,+DAAkB,CAAA;IAClB,iEAAmB,CAAA;IACnB,uEAAsB,CAAA;IACtB,+DAAkB,CAAA;IAClB,mEAAoB,CAAA;IACpB,qEAAqB,CAAA;IACrB,2EAAwB,CAAA;IACxB,+DAAkB,CAAA;AACnB,CAAC,EAXW,UAAU,0BAAV,UAAU,QAWrB;AAED,IAAY,eAOX;AAPD,WAAY,eAAe;IAC1B,mDAAQ,CAAA;IACR,qEAAiB,CAAA;IACjB,uEAAkB,CAAA;IAClB,iEAAe,CAAA;IACf,iEAAe,CAAA;IACf,yFAA2B,CAAA;AAC5B,CAAC,EAPW,eAAe,+BAAf,eAAe,QAO1B;AAED;;;;;;;;GAQG;AACH,IAAY,aAuBX;AAvBD,WAAY,aAAa;IACxB,6CAA6C;IAC7C,wEAAqB,CAAA;IACrB,gEAAiB,CAAA;IACjB,wEAAqB,CAAA;IACrB,4EAAuB,CAAA;IACvB,gFAAyB,CAAA;IACzB,4EAAuB,CAAA;IACvB,gGAAiC,CAAA;IACjC,4EAAuB,CAAA;IACvB,0EAAsB,CAAA;IACtB,8EAAwB,CAAA;IACxB,wEAAqB,CAAA;IACrB,0EAAsB,CAAA;IACtB,0EAAsB,CAAA;IACtB,kEAAkB,CAAA;IAClB,sEAAoB,CAAA;IAEpB,yCAAyC;IACzC,qDAAqD;IACrD,WAAW;IACX,8FAAgC,CAAA;IAChC,gGAAiC,CAAA;AAClC,CAAC,EAvBW,aAAa,6BAAb,aAAa,QAuBxB"}
package/dist/index.d.ts CHANGED
@@ -4,8 +4,10 @@ export { default as Initializable } from "./initializable";
4
4
  export { default as Lib } from "./lib";
5
5
  export { default as Router_internal } from "./router/router.internal";
6
6
  export { default as Router } from "./router/router";
7
+ export { default as Channel } from "./server/bun/websocket/Channel";
8
+ export { default as Websocket } from "./server/bun/websocket/Websocket";
9
+ export { default as WebsocketClient } from "./server/bun/websocket/WebsocketClient";
7
10
  export { default as Controller } from "./server/controller";
8
- export { default as Websocket } from "./server/websocket";
9
11
  export { default as Singleton } from "./singleton";
10
12
  export { default as Throwable } from "./throwable";
11
13
  export { RESPONSE_INIT, RESPONSE_METHOD_OPTIONS } from "./application";
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  return (mod && mod.__esModule) ? mod : { "default": mod };
6
6
  };
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.WS_ERROR_CODE = exports.HTTP_ERROR_CODE = exports.ERROR_CODE = exports.E_ENVIRONMENTS = exports.E_IS = exports.LOG_COLORS = exports.DEFAULT_FALSE_RESPONSE = exports.RESPONSE_METHOD_OPTIONS = exports.RESPONSE_INIT = exports.Throwable = exports.Singleton = exports.Websocket = exports.Controller = exports.Router = exports.Router_internal = exports.Lib = exports.Initializable = exports.Guards = exports.Application = void 0;
8
+ exports.WS_ERROR_CODE = exports.HTTP_ERROR_CODE = exports.ERROR_CODE = exports.E_ENVIRONMENTS = exports.E_IS = exports.LOG_COLORS = exports.DEFAULT_FALSE_RESPONSE = exports.RESPONSE_METHOD_OPTIONS = exports.RESPONSE_INIT = exports.Throwable = exports.Singleton = exports.Controller = exports.WebsocketClient = exports.Websocket = exports.Channel = exports.Router = exports.Router_internal = exports.Lib = exports.Initializable = exports.Guards = exports.Application = void 0;
9
9
  // Export all modules
10
10
  // Export default classes
11
11
  var application_1 = require("./application");
@@ -20,10 +20,14 @@ var router_internal_1 = require("./router/router.internal");
20
20
  Object.defineProperty(exports, "Router_internal", { enumerable: true, get: function () { return __importDefault(router_internal_1).default; } });
21
21
  var router_1 = require("./router/router");
22
22
  Object.defineProperty(exports, "Router", { enumerable: true, get: function () { return __importDefault(router_1).default; } });
23
+ var Channel_1 = require("./server/bun/websocket/Channel");
24
+ Object.defineProperty(exports, "Channel", { enumerable: true, get: function () { return __importDefault(Channel_1).default; } });
25
+ var Websocket_1 = require("./server/bun/websocket/Websocket");
26
+ Object.defineProperty(exports, "Websocket", { enumerable: true, get: function () { return __importDefault(Websocket_1).default; } });
27
+ var WebsocketClient_1 = require("./server/bun/websocket/WebsocketClient");
28
+ Object.defineProperty(exports, "WebsocketClient", { enumerable: true, get: function () { return __importDefault(WebsocketClient_1).default; } });
23
29
  var controller_1 = require("./server/controller");
24
30
  Object.defineProperty(exports, "Controller", { enumerable: true, get: function () { return __importDefault(controller_1).default; } });
25
- var websocket_1 = require("./server/websocket");
26
- Object.defineProperty(exports, "Websocket", { enumerable: true, get: function () { return __importDefault(websocket_1).default; } });
27
31
  var singleton_1 = require("./singleton");
28
32
  Object.defineProperty(exports, "Singleton", { enumerable: true, get: function () { return __importDefault(singleton_1).default; } });
29
33
  var throwable_1 = require("./throwable");
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;AAErB,yBAAyB;AACzB,6CAAuD;AAA9C,2HAAA,OAAO,OAAe;AAC/B,mCAA6C;AAApC,iHAAA,OAAO,OAAU;AAC1B,iDAA2D;AAAlD,+HAAA,OAAO,OAAiB;AACjC,6BAAuC;AAA9B,2GAAA,OAAO,OAAO;AACvB,4DAAsE;AAA7D,mIAAA,OAAO,OAAmB;AACnC,0CAAoD;AAA3C,iHAAA,OAAO,OAAU;AAC1B,kDAA4D;AAAnD,yHAAA,OAAO,OAAc;AAC9B,gDAA0D;AAAjD,uHAAA,OAAO,OAAa;AAC7B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAE7B,sDAAsD;AACtD,6CAAuE;AAA9D,4GAAA,aAAa,OAAA;AAAE,sHAAA,uBAAuB,OAAA;AAC/C,mCAA8D;AAArD,gHAAA,sBAAsB,OAAA;AAAE,oGAAA,UAAU,OAAA;AAC3C,iCAA+C;AAAtC,6FAAA,IAAI,OAAA;AAAE,uGAAA,cAAc,OAAA;AAC7B,mCAAsE;AAA7D,oGAAA,UAAU,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,uGAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;AAEjC,qBAAqB;AAErB,yBAAyB;AACzB,6CAAuD;AAA9C,2HAAA,OAAO,OAAe;AAC/B,mCAA6C;AAApC,iHAAA,OAAO,OAAU;AAC1B,iDAA2D;AAAlD,+HAAA,OAAO,OAAiB;AACjC,6BAAuC;AAA9B,2GAAA,OAAO,OAAO;AACvB,4DAAsE;AAA7D,mIAAA,OAAO,OAAmB;AACnC,0CAAoD;AAA3C,iHAAA,OAAO,OAAU;AAC1B,0DAAoE;AAA3D,mHAAA,OAAO,OAAW;AAC3B,8DAAwE;AAA/D,uHAAA,OAAO,OAAa;AAC7B,0EAAoF;AAA3E,mIAAA,OAAO,OAAmB;AACnC,kDAA4D;AAAnD,yHAAA,OAAO,OAAc;AAC9B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAE7B,sDAAsD;AACtD,6CAAuE;AAA9D,4GAAA,aAAa,OAAA;AAAE,sHAAA,uBAAuB,OAAA;AAC/C,mCAA8D;AAArD,gHAAA,sBAAsB,OAAA;AAAE,oGAAA,UAAU,OAAA;AAC3C,iCAA+C;AAAtC,6FAAA,IAAI,OAAA;AAAE,uGAAA,cAAc,OAAA;AAC7B,mCAAsE;AAA7D,oGAAA,UAAU,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,uGAAA,aAAa,OAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './websocket/Websocket';
2
+ export { default as Websocket } from './websocket/Websocket';
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ // This file is auto-generated by scripts/generate-indexes.sh
3
+ // Do not edit this file directly
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
17
+ };
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.Websocket = void 0;
23
+ __exportStar(require("./websocket/Websocket"), exports);
24
+ var Websocket_1 = require("./websocket/Websocket");
25
+ Object.defineProperty(exports, "Websocket", { enumerable: true, get: function () { return __importDefault(Websocket_1).default; } });
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/bun/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;;;;;;;;;;;;;;;AAEjC,wDAAsC;AACtC,mDAA6D;AAApD,uHAAA,OAAO,OAAa"}
@@ -0,0 +1,24 @@
1
+ import type { WebsocketStructuredMessage, I_WebsocketClient } from "./websocket.types";
2
+ import WebsocketClient from "./WebsocketClient";
3
+ export default class Channel {
4
+ private createdAt?;
5
+ private id;
6
+ private name;
7
+ private limit;
8
+ private members;
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;
13
+ broadcast(message: WebsocketStructuredMessage, exclude?: string[] | I_WebsocketClient[]): void;
14
+ hasMember(client: I_WebsocketClient | string): void;
15
+ getMember(client: I_WebsocketClient | string): void;
16
+ getMembers(): WebsocketClient[];
17
+ getMetadata(): Record<string, string>;
18
+ getCreatedAt(): Date | undefined;
19
+ getId(): string;
20
+ getName(): string;
21
+ getLimit(): number;
22
+ getSize(): number;
23
+ private canAddMember;
24
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Websocket_1 = __importDefault(require("./Websocket"));
7
+ class Channel {
8
+ constructor(id, name, limit, members, metadata) {
9
+ this.createdAt = new Date();
10
+ this.id = id;
11
+ this.name = name;
12
+ this.limit = limit ?? 5;
13
+ this.members = members ?? new Map();
14
+ this.metadata = metadata ?? {};
15
+ }
16
+ addMember(client) {
17
+ if (this.canAddMember()) {
18
+ this.members.set(client.getId(), client);
19
+ client.joinChannel(this);
20
+ }
21
+ this.broadcast({
22
+ type: "channel.member.added",
23
+ data: {
24
+ channelId: this.id,
25
+ clientId: client.getId(),
26
+ },
27
+ });
28
+ }
29
+ removeMember(client) {
30
+ this.members.delete(client.getId());
31
+ client.leaveChannel(this);
32
+ }
33
+ broadcast(message, exclude) {
34
+ Websocket_1.default.Server().publish(this.id, JSON.stringify(message));
35
+ }
36
+ hasMember(client) { }
37
+ getMember(client) { }
38
+ getMembers() {
39
+ return Array.from(this.members.values());
40
+ }
41
+ getMetadata() {
42
+ return this.metadata;
43
+ }
44
+ getCreatedAt() {
45
+ return this.createdAt;
46
+ }
47
+ getId() {
48
+ return this.id;
49
+ }
50
+ getName() {
51
+ return this.name;
52
+ }
53
+ getLimit() {
54
+ return this.limit;
55
+ }
56
+ getSize() {
57
+ return this.members.size;
58
+ }
59
+ canAddMember() {
60
+ const size = this.getSize();
61
+ return size < this.limit;
62
+ }
63
+ }
64
+ exports.default = Channel;
65
+ //# sourceMappingURL=Channel.js.map
@@ -0,0 +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"}
@@ -0,0 +1,14 @@
1
+ import { Server, WebSocketHandler } from "bun";
2
+ import Singleton from "../../../singleton";
3
+ import type { WebsocketClientData } from "./websocket.types";
4
+ export default class Websocket extends Singleton {
5
+ private channels;
6
+ private server;
7
+ private constructor();
8
+ set(server: Server): void;
9
+ static Server(): Server;
10
+ setup(): WebSocketHandler<WebsocketClientData>;
11
+ private messageReceived;
12
+ private clientConnected;
13
+ private clientDisconnected;
14
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /* Hey, we're working on a game, today we're going to implement the first few steps
3
+
4
+ we will start with a websocket implementation - an abstraction of bun's websocket functioanlity, here are the docs@https://bun.sh/docs/api/websockets
5
+
6
+ lets start simple, I want an abstraction interface for the handlers, suggest a strategy */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const Channel_1 = __importDefault(require("./Channel"));
12
+ const WebsocketClient_1 = __importDefault(require("./WebsocketClient"));
13
+ const singleton_1 = __importDefault(require("../../../singleton"));
14
+ class Websocket extends singleton_1.default {
15
+ constructor() {
16
+ super();
17
+ this.channels = new Map();
18
+ this.messageReceived = (ws, message) => {
19
+ console.log("Received message:", message);
20
+ if (message === "ping")
21
+ ws.send("pong");
22
+ else
23
+ ws.send(message);
24
+ };
25
+ this.clientConnected = (ws) => {
26
+ console.log("WebSocket connection opened");
27
+ const global = this.channels.get("global");
28
+ const client = new WebsocketClient_1.default(ws.data.id, ws);
29
+ if (global)
30
+ global.addMember(client);
31
+ };
32
+ this.clientDisconnected = (ws) => {
33
+ console.log("WebSocket connection closed");
34
+ };
35
+ const global = new Channel_1.default("global", "Global Channel", 1000);
36
+ this.channels.set("global", global);
37
+ }
38
+ set(server) {
39
+ this.server = server;
40
+ }
41
+ static Server() {
42
+ return Websocket.GetInstance().server;
43
+ }
44
+ setup() {
45
+ return {
46
+ message: this.messageReceived,
47
+ open: this.clientConnected,
48
+ close: this.clientDisconnected,
49
+ };
50
+ }
51
+ }
52
+ exports.default = Websocket;
53
+ //# sourceMappingURL=Websocket.js.map
@@ -0,0 +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"}
@@ -0,0 +1,13 @@
1
+ import { ServerWebSocket } from "bun";
2
+ import Channel from "./Channel";
3
+ import type { I_WebsocketClient, WebsocketClientData, WebsocketChannel } from "./websocket.types";
4
+ export default class WebsocketClient implements I_WebsocketClient {
5
+ id: string;
6
+ ws: ServerWebSocket<WebsocketClientData>;
7
+ private channels;
8
+ constructor(id: string, ws: ServerWebSocket<WebsocketClientData>);
9
+ joinChannel(channel: Channel): void;
10
+ leaveChannel(channel: Channel): void;
11
+ getChannels(): WebsocketChannel;
12
+ getId(): string;
13
+ }
@@ -0,0 +1,25 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,7 @@
1
+ export * from './Websocket';
2
+ export { default as Websocket } from './Websocket';
3
+ export * from './WebsocketClient';
4
+ export { default as WebsocketClient } from './WebsocketClient';
5
+ export * from './websocket.types';
6
+ export * from './Channel';
7
+ export { default as Channel } from './Channel';
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ // This file is auto-generated by scripts/generate-indexes.sh
3
+ // Do not edit this file directly
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
17
+ };
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.Channel = exports.WebsocketClient = exports.Websocket = void 0;
23
+ __exportStar(require("./Websocket"), exports);
24
+ var Websocket_1 = require("./Websocket");
25
+ Object.defineProperty(exports, "Websocket", { enumerable: true, get: function () { return __importDefault(Websocket_1).default; } });
26
+ __exportStar(require("./WebsocketClient"), exports);
27
+ var WebsocketClient_1 = require("./WebsocketClient");
28
+ Object.defineProperty(exports, "WebsocketClient", { enumerable: true, get: function () { return __importDefault(WebsocketClient_1).default; } });
29
+ __exportStar(require("./websocket.types"), exports);
30
+ __exportStar(require("./Channel"), exports);
31
+ var Channel_1 = require("./Channel");
32
+ Object.defineProperty(exports, "Channel", { enumerable: true, get: function () { return __importDefault(Channel_1).default; } });
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;;;;;;;;;;;;;;;AAEjC,8CAA4B;AAC5B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,oDAAkC;AAClC,qDAA+D;AAAtD,mIAAA,OAAO,OAAmB;AACnC,oDAAkC;AAClC,4CAA0B;AAC1B,qCAA+C;AAAtC,mHAAA,OAAO,OAAW"}
@@ -0,0 +1,15 @@
1
+ import { ServerWebSocket } from "bun";
2
+ import Channel from "./Channel";
3
+ export interface I_WebsocketClient {
4
+ ws: ServerWebSocket<WebsocketClientData>;
5
+ id: string;
6
+ }
7
+ export type WebsocketClientData = {
8
+ id: string;
9
+ };
10
+ export type WebsocketMessage = string | Buffer<ArrayBufferLike>;
11
+ export type WebsocketStructuredMessage = {
12
+ type: string;
13
+ data: any;
14
+ };
15
+ export type WebsocketChannel<T extends Channel = Channel> = Map<string, T>;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=websocket.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.types.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/websocket.types.ts"],"names":[],"mappings":""}
@@ -1,4 +1,2 @@
1
- export * from './websocket';
2
- export { default as Websocket } from './websocket';
3
1
  export * from './controller';
4
2
  export { default as Controller } from './controller';
@@ -19,10 +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.Controller = exports.Websocket = void 0;
23
- __exportStar(require("./websocket"), exports);
24
- var websocket_1 = require("./websocket");
25
- Object.defineProperty(exports, "Websocket", { enumerable: true, get: function () { return __importDefault(websocket_1).default; } });
22
+ exports.Controller = void 0;
26
23
  __exportStar(require("./controller"), exports);
27
24
  var controller_1 = require("./controller");
28
25
  Object.defineProperty(exports, "Controller", { enumerable: true, get: function () { return __importDefault(controller_1).default; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;;;;;;;;;;;;;;;AAEjC,8CAA4B;AAC5B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,+CAA6B;AAC7B,2CAAqD;AAA5C,yHAAA,OAAO,OAAc"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;;;;;;;;;;;;;;;AAEjC,+CAA6B;AAC7B,2CAAqD;AAA5C,yHAAA,OAAO,OAAc"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "topsyde-utils",
3
- "version": "1.0.21",
3
+ "version": "1.0.24",
4
4
  "description": "A bundle of TypeScript utility classes and functions",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -20,6 +20,10 @@
20
20
  "./server": {
21
21
  "types": "./dist/server/index.d.ts",
22
22
  "default": "./dist/server/index.js"
23
+ },
24
+ "./server/bun/websocket": {
25
+ "types": "./dist/server/bun/websocket/index.d.ts",
26
+ "default": "./dist/server/bun/websocket/index.js"
23
27
  }
24
28
  },
25
29
  "typesVersions": {
@@ -29,6 +33,9 @@
29
33
  ],
30
34
  "server": [
31
35
  "./dist/server/index.d.ts"
36
+ ],
37
+ "server/bun/websocket": [
38
+ "./dist/server/bun/websocket/index.d.ts"
32
39
  ]
33
40
  }
34
41
  },
@@ -1,2 +0,0 @@
1
- export default class Websocket {
2
- }
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- class Websocket {
4
- }
5
- exports.default = Websocket;
6
- //# sourceMappingURL=websocket.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/server/websocket.ts"],"names":[],"mappings":";;AAAA,MAAqB,SAAS;CAAG;AAAjC,4BAAiC"}