topsyde-utils 1.0.87 → 1.0.88
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
@@ -42,4 +42,4 @@ export { ControllerResponse, ControllerAction, ControllerMap, ControllerOptions
|
|
42
42
|
export { Routes } from "./server/bun/router/routes";
|
43
43
|
export { I_WebsocketConstructor } from "./server/bun/websocket/Websocket";
|
44
44
|
export { E_WebsocketMessageType } from "./server/bun/websocket/websocket.enums";
|
45
|
-
export { WebsocketMessage, WebsocketChannel, WebsocketStructuredMessage, WebsocketEntityData, I_WebsocketEntity, I_WebsocketClient, I_WebsocketChannelEntity, I_WebsocketChannel, I_WebsocketInterface, } from "./server/bun/websocket/websocket.types";
|
45
|
+
export { WebsocketMessage, WebsocketChannel, WebsocketStructuredMessage, WebsocketEntityData, I_WebsocketEntity, I_WebsocketClient, I_WebsocketChannelEntity, BroadcastOptions, I_WebsocketChannel, I_WebsocketInterface, } from "./server/bun/websocket/websocket.types";
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import Websocket from "./Websocket";
|
2
|
-
import type { I_WebsocketChannel, I_WebsocketClient, I_WebsocketEntity, WebsocketChannel, WebsocketStructuredMessage } from "./websocket.types";
|
2
|
+
import type { BroadcastOptions, I_WebsocketChannel, I_WebsocketClient, I_WebsocketEntity, WebsocketChannel, WebsocketStructuredMessage } from "./websocket.types";
|
3
3
|
export default class Channel<T extends Websocket = Websocket> implements I_WebsocketChannel<T> {
|
4
4
|
createdAt: Date;
|
5
5
|
id: string;
|
@@ -8,8 +8,10 @@ export default class Channel<T extends Websocket = Websocket> implements I_Webso
|
|
8
8
|
members: Map<string, I_WebsocketClient>;
|
9
9
|
metadata: Record<string, string>;
|
10
10
|
ws: T;
|
11
|
+
private messageTemplate;
|
11
12
|
constructor(id: string, name: string, ws: T, limit?: number, members?: Map<string, I_WebsocketClient>, metadata?: Record<string, string>);
|
12
|
-
broadcast
|
13
|
+
broadcast(message: WebsocketStructuredMessage, options?: BroadcastOptions): void;
|
14
|
+
private getFilteredMetadata;
|
13
15
|
hasMember(client: I_WebsocketEntity | string): boolean;
|
14
16
|
addMember(client: I_WebsocketClient): false | I_WebsocketClient;
|
15
17
|
removeMember(entity: I_WebsocketEntity): false | I_WebsocketClient;
|
@@ -10,9 +10,90 @@ class Channel {
|
|
10
10
|
this.members = members ?? new Map();
|
11
11
|
this.metadata = metadata ?? {};
|
12
12
|
this.ws = ws;
|
13
|
+
// Initialize message template
|
14
|
+
this.messageTemplate = {
|
15
|
+
type: '',
|
16
|
+
content: {},
|
17
|
+
channel: this.id,
|
18
|
+
timestamp: ''
|
19
|
+
};
|
13
20
|
}
|
14
|
-
broadcast(message,
|
15
|
-
|
21
|
+
broadcast(message, options) {
|
22
|
+
// Clone the template (faster than creating new objects)
|
23
|
+
const output = Object.assign({}, this.messageTemplate);
|
24
|
+
// Set the dynamic properties in a single pass
|
25
|
+
output.type = message.type;
|
26
|
+
output.channel = this.id;
|
27
|
+
// Process message content based on type
|
28
|
+
if (typeof message.content === "string") {
|
29
|
+
output.content = { message: message.content };
|
30
|
+
}
|
31
|
+
else if (typeof message.content === "object" && message.content !== null) {
|
32
|
+
output.content = { ...message.content };
|
33
|
+
}
|
34
|
+
else {
|
35
|
+
output.content = {};
|
36
|
+
}
|
37
|
+
// Process options in a single pass if provided
|
38
|
+
if (options) {
|
39
|
+
// Add data if provided
|
40
|
+
if (options.data !== undefined) {
|
41
|
+
if (typeof options.data === "object" && options.data !== null && !Array.isArray(options.data)) {
|
42
|
+
// Merge object data with content
|
43
|
+
Object.assign(output.content, options.data);
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
// Set as data property for other types
|
47
|
+
output.content.data = options.data;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
// Add client information if provided
|
51
|
+
if (options.client) {
|
52
|
+
output.content.client = options.client;
|
53
|
+
}
|
54
|
+
// Include channel metadata if requested
|
55
|
+
if (options.includeMetadata) {
|
56
|
+
output.metadata = options.includeMetadata === true ?
|
57
|
+
this.getMetadata() :
|
58
|
+
this.getFilteredMetadata(options.includeMetadata);
|
59
|
+
}
|
60
|
+
// Add timestamp if requested (default: true)
|
61
|
+
if (options.includeTimestamp !== false) {
|
62
|
+
output.timestamp = new Date().toISOString();
|
63
|
+
}
|
64
|
+
else {
|
65
|
+
// Remove timestamp if explicitly disabled
|
66
|
+
delete output.timestamp;
|
67
|
+
}
|
68
|
+
// Add any custom fields to the root of the message
|
69
|
+
if (options.customFields) {
|
70
|
+
Object.assign(output, options.customFields);
|
71
|
+
}
|
72
|
+
// Apply custom transformation if provided
|
73
|
+
if (options.transform) {
|
74
|
+
const transformed = options.transform(output);
|
75
|
+
// Publish the transformed output
|
76
|
+
this.ws.server.publish(this.id, JSON.stringify(transformed));
|
77
|
+
return;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
else {
|
81
|
+
// Default timestamp behavior when no options provided
|
82
|
+
output.timestamp = new Date().toISOString();
|
83
|
+
}
|
84
|
+
// Publish to the channel
|
85
|
+
this.ws.server.publish(this.id, JSON.stringify(output));
|
86
|
+
}
|
87
|
+
// Helper method for filtered metadata
|
88
|
+
getFilteredMetadata(keys) {
|
89
|
+
const metadata = this.getMetadata();
|
90
|
+
const filtered = {};
|
91
|
+
for (const key of keys) {
|
92
|
+
if (metadata[key] !== undefined) {
|
93
|
+
filtered[key] = metadata[key];
|
94
|
+
}
|
95
|
+
}
|
96
|
+
return filtered;
|
16
97
|
}
|
17
98
|
hasMember(client) {
|
18
99
|
if (typeof client === "string")
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Channel.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Channel.ts"],"names":[],"mappings":";;AAAA,0CAAqC;
|
1
|
+
{"version":3,"file":"Channel.js","sourceRoot":"","sources":["../../../../src/server/bun/websocket/Channel.ts"],"names":[],"mappings":"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"}
|
@@ -32,12 +32,23 @@ export interface I_WebsocketClient extends I_WebsocketEntity {
|
|
32
32
|
export interface I_WebsocketChannelEntity<T extends Websocket = Websocket> extends WebsocketEntityData {
|
33
33
|
ws: T;
|
34
34
|
}
|
35
|
+
export type BroadcastOptions = {
|
36
|
+
data?: any;
|
37
|
+
client?: Partial<WebsocketEntityData> & {
|
38
|
+
[key: string]: any;
|
39
|
+
};
|
40
|
+
includeMetadata?: boolean | string[];
|
41
|
+
excludeClients?: string[];
|
42
|
+
includeTimestamp?: boolean;
|
43
|
+
customFields?: Record<string, any>;
|
44
|
+
transform?: (message: any) => any;
|
45
|
+
};
|
35
46
|
export interface I_WebsocketChannel<T extends Websocket = Websocket> extends I_WebsocketChannelEntity<T> {
|
36
47
|
limit: number;
|
37
48
|
members: Map<string, I_WebsocketClient>;
|
38
49
|
metadata: Record<string, string>;
|
39
50
|
createdAt: Date;
|
40
|
-
broadcast
|
51
|
+
broadcast(message: WebsocketStructuredMessage, options?: BroadcastOptions): void;
|
41
52
|
hasMember(client: I_WebsocketEntity | string): boolean;
|
42
53
|
addMember(entity: I_WebsocketClient): I_WebsocketClient | false;
|
43
54
|
removeMember(entity: I_WebsocketEntity): I_WebsocketClient | false;
|