hermes-chat-react 0.1.0 → 0.1.1
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/chunk-OMLFDWYU.js +234 -0
- package/dist/chunk-OMLFDWYU.js.map +1 -0
- package/dist/index.cjs +241 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +47 -18
- package/dist/index.d.ts +47 -18
- package/dist/index.js +6 -1
- package/dist/react.cjs +232 -0
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +3 -191
- package/dist/react.d.ts +3 -191
- package/dist/react.js +4 -1
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-D42PTTYC.js +0 -1
- package/dist/chunk-D42PTTYC.js.map +0 -1
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
// src/core/HermesClient.ts
|
|
2
|
+
import { io } from "socket.io-client";
|
|
3
|
+
|
|
4
|
+
// src/core/EventEmitter.ts
|
|
5
|
+
var EventEmitter = class {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.listeners = {};
|
|
8
|
+
}
|
|
9
|
+
on(event, callback) {
|
|
10
|
+
if (!this.listeners[event]) {
|
|
11
|
+
this.listeners[event] = [];
|
|
12
|
+
}
|
|
13
|
+
this.listeners[event].push(callback);
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
off(event, callback) {
|
|
17
|
+
if (!this.listeners[event]) return;
|
|
18
|
+
this.listeners[event] = this.listeners[event].filter((cb) => cb !== callback);
|
|
19
|
+
}
|
|
20
|
+
once(event, callback) {
|
|
21
|
+
const wrapper = ((...args) => {
|
|
22
|
+
callback(...args);
|
|
23
|
+
this.off(event, wrapper);
|
|
24
|
+
});
|
|
25
|
+
return this.on(event, wrapper);
|
|
26
|
+
}
|
|
27
|
+
emit(event, ...args) {
|
|
28
|
+
if (!this.listeners[event]) return this;
|
|
29
|
+
this.listeners[event].forEach(
|
|
30
|
+
(cb) => cb(...args)
|
|
31
|
+
);
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
removeAllListeners(event) {
|
|
35
|
+
if (event) {
|
|
36
|
+
delete this.listeners[event];
|
|
37
|
+
} else {
|
|
38
|
+
this.listeners = {};
|
|
39
|
+
}
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
listenerCount(event) {
|
|
43
|
+
return this.listeners[event]?.length ?? 0;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// src/core/HermesClient.ts
|
|
48
|
+
var HermesClient = class extends EventEmitter {
|
|
49
|
+
constructor(config) {
|
|
50
|
+
super();
|
|
51
|
+
this.socket = null;
|
|
52
|
+
this.token = null;
|
|
53
|
+
this.user = null;
|
|
54
|
+
this.status = "idle";
|
|
55
|
+
this.config = config;
|
|
56
|
+
if ("token" in config && typeof config.token === "string") {
|
|
57
|
+
this.token = config.token;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async connect() {
|
|
61
|
+
this.status = "connecting";
|
|
62
|
+
try {
|
|
63
|
+
if (this.token) {
|
|
64
|
+
await this._connectSocket();
|
|
65
|
+
return this.user;
|
|
66
|
+
}
|
|
67
|
+
if (!("apiKey" in this.config)) {
|
|
68
|
+
throw new Error("Either token or (apiKey + secret + userId) must be provided");
|
|
69
|
+
}
|
|
70
|
+
const cfg = this.config;
|
|
71
|
+
const res = await fetch(`${cfg.endpoint}/hermes/connect`, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: { "Content-Type": "application/json" },
|
|
74
|
+
body: JSON.stringify({
|
|
75
|
+
apiKey: cfg.apiKey,
|
|
76
|
+
secret: cfg.secret,
|
|
77
|
+
userId: cfg.userId,
|
|
78
|
+
displayName: cfg.displayName ?? cfg.userId,
|
|
79
|
+
avatar: cfg.avatar,
|
|
80
|
+
email: cfg.email
|
|
81
|
+
})
|
|
82
|
+
});
|
|
83
|
+
const data = await res.json();
|
|
84
|
+
if (!data.success) throw new Error(data.message || "Auth failed");
|
|
85
|
+
this.token = data.token;
|
|
86
|
+
this.user = {
|
|
87
|
+
userId: data.user.hermesUserId,
|
|
88
|
+
displayName: data.user.displayName,
|
|
89
|
+
avatar: data.user.avatar,
|
|
90
|
+
email: data.user.email
|
|
91
|
+
};
|
|
92
|
+
await this._connectSocket();
|
|
93
|
+
return this.user;
|
|
94
|
+
} catch (err) {
|
|
95
|
+
this.status = "error";
|
|
96
|
+
this.emit("error", err);
|
|
97
|
+
throw err;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async _connectSocket() {
|
|
101
|
+
this.socket = io(`${this.config.endpoint}/hermes`, {
|
|
102
|
+
auth: { token: this.token },
|
|
103
|
+
transports: ["websocket"],
|
|
104
|
+
reconnection: true,
|
|
105
|
+
reconnectionAttempts: 5,
|
|
106
|
+
reconnectionDelay: 1e3
|
|
107
|
+
});
|
|
108
|
+
this._wireSocketEvents();
|
|
109
|
+
await new Promise((resolve, reject) => {
|
|
110
|
+
this.socket.once("connect", resolve);
|
|
111
|
+
this.socket.once("connect_error", (err) => reject(err));
|
|
112
|
+
});
|
|
113
|
+
this.status = "connected";
|
|
114
|
+
this.emit("connected");
|
|
115
|
+
}
|
|
116
|
+
disconnect() {
|
|
117
|
+
this.socket?.disconnect();
|
|
118
|
+
this.socket = null;
|
|
119
|
+
this.token = null;
|
|
120
|
+
this.status = "disconnected";
|
|
121
|
+
this.emit("disconnected", "manual");
|
|
122
|
+
}
|
|
123
|
+
_wireSocketEvents() {
|
|
124
|
+
const s = this.socket;
|
|
125
|
+
s.on("disconnect", (reason) => {
|
|
126
|
+
this.status = "disconnected";
|
|
127
|
+
this.emit("disconnected", reason);
|
|
128
|
+
});
|
|
129
|
+
s.on("connect_error", (err) => {
|
|
130
|
+
this.status = "error";
|
|
131
|
+
this.emit("error", err);
|
|
132
|
+
});
|
|
133
|
+
s.on("message:receive", (msg) => this.emit("message:receive", msg));
|
|
134
|
+
s.on("message:deleted", (data) => this.emit("message:deleted", data));
|
|
135
|
+
s.on("message:edited", (msg) => this.emit("message:edited", msg));
|
|
136
|
+
s.on("room:created", (room) => this.emit("room:created", room));
|
|
137
|
+
s.on("room:deleted", (data) => this.emit("room:deleted", data));
|
|
138
|
+
s.on("room:member:joined", (data) => this.emit("room:member:joined", data));
|
|
139
|
+
s.on("room:member:left", (data) => this.emit("room:member:left", data));
|
|
140
|
+
s.on("user:online", (event) => this.emit("user:online", event));
|
|
141
|
+
s.on("user:offline", (event) => this.emit("user:offline", event));
|
|
142
|
+
s.on("typing:started", (event) => this.emit("typing:started", event));
|
|
143
|
+
s.on("typing:stopped", (event) => this.emit("typing:stopped", event));
|
|
144
|
+
s.on("receipt:updated", (event) => this.emit("receipt:updated", event));
|
|
145
|
+
s.on("reaction:updated", (event) => this.emit("reaction:updated", event));
|
|
146
|
+
}
|
|
147
|
+
_emit(event, data) {
|
|
148
|
+
return new Promise((resolve, reject) => {
|
|
149
|
+
if (!this.socket?.connected) return reject(new Error("Not connected to Hermes engine"));
|
|
150
|
+
const timer = setTimeout(() => reject(new Error(`Timed out waiting for "${event}"`)), 5e3);
|
|
151
|
+
const callback = (response) => {
|
|
152
|
+
clearTimeout(timer);
|
|
153
|
+
if (response?.success === false) reject(new Error(response.error || "Unknown error"));
|
|
154
|
+
else resolve(response);
|
|
155
|
+
};
|
|
156
|
+
if (data && Object.keys(data).length > 0) this.socket.emit(event, data, callback);
|
|
157
|
+
else this.socket.emit(event, callback);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
async sendMessage(input) {
|
|
161
|
+
const res = await this._emit("message:send", input);
|
|
162
|
+
return res.message;
|
|
163
|
+
}
|
|
164
|
+
async getHistory(roomId, before, limit) {
|
|
165
|
+
return this._emit("message:history", { roomId, before, limit });
|
|
166
|
+
}
|
|
167
|
+
async deleteMessage(messageId, roomId) {
|
|
168
|
+
await this._emit("message:delete", { messageId, roomId });
|
|
169
|
+
}
|
|
170
|
+
async editMessage(messageId, roomId, text) {
|
|
171
|
+
const res = await this._emit("message:edit", { messageId, roomId, text });
|
|
172
|
+
return res.message;
|
|
173
|
+
}
|
|
174
|
+
async createDirectRoom(input) {
|
|
175
|
+
const res = await this._emit("room:create:direct", { targetHermesUserId: input.targetUserId });
|
|
176
|
+
return res.room;
|
|
177
|
+
}
|
|
178
|
+
async createGroupRoom(input) {
|
|
179
|
+
const res = await this._emit("room:create:group", input);
|
|
180
|
+
return res.room;
|
|
181
|
+
}
|
|
182
|
+
async deleteRoom(roomId) {
|
|
183
|
+
await this._emit("room:delete", { roomId });
|
|
184
|
+
}
|
|
185
|
+
async getRooms() {
|
|
186
|
+
const res = await this._emit("room:list");
|
|
187
|
+
return res.rooms;
|
|
188
|
+
}
|
|
189
|
+
async addMember(roomId, newMemberId) {
|
|
190
|
+
await this._emit("room:member:add", { roomId, newMemberId });
|
|
191
|
+
}
|
|
192
|
+
async removeMember(roomId, targetId) {
|
|
193
|
+
await this._emit("room:member:remove", { roomId, targetId });
|
|
194
|
+
}
|
|
195
|
+
pingPresence(roomId) {
|
|
196
|
+
this.socket?.emit("presence:ping", { roomId });
|
|
197
|
+
}
|
|
198
|
+
startTyping(roomId) {
|
|
199
|
+
this.socket?.emit("typing:start", { roomId });
|
|
200
|
+
}
|
|
201
|
+
stopTyping(roomId) {
|
|
202
|
+
this.socket?.emit("typing:stop", { roomId });
|
|
203
|
+
}
|
|
204
|
+
async markSeen(roomId, lastMessageId) {
|
|
205
|
+
await this._emit("receipt:seen", { roomId, lastMessageId });
|
|
206
|
+
}
|
|
207
|
+
async addReaction(messageId, roomId, emoji) {
|
|
208
|
+
await this._emit("reaction:add", { messageId, roomId, emoji });
|
|
209
|
+
}
|
|
210
|
+
async uploadFile(file) {
|
|
211
|
+
if (!this.token) throw new Error("Not connected");
|
|
212
|
+
const formData = new FormData();
|
|
213
|
+
formData.append("file", file);
|
|
214
|
+
const res = await fetch(`${this.config.endpoint}/hermes/upload`, {
|
|
215
|
+
method: "POST",
|
|
216
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
217
|
+
body: formData
|
|
218
|
+
});
|
|
219
|
+
const data = await res.json();
|
|
220
|
+
if (!data.success) throw new Error(data.error || "Upload failed");
|
|
221
|
+
return data;
|
|
222
|
+
}
|
|
223
|
+
get isConnected() {
|
|
224
|
+
return this.status === "connected" && !!this.socket?.connected;
|
|
225
|
+
}
|
|
226
|
+
get currentUser() {
|
|
227
|
+
return this.user;
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
export {
|
|
232
|
+
HermesClient
|
|
233
|
+
};
|
|
234
|
+
//# sourceMappingURL=chunk-OMLFDWYU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/HermesClient.ts","../src/core/EventEmitter.ts"],"sourcesContent":["import { io, Socket } from \"socket.io-client\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport type {\n HermesConfig,\n HermesUser,\n ConnectionStatus,\n Message,\n Room,\n SendMessageInput,\n MessageHistoryResult,\n CreateDirectRoomInput,\n CreateGroupRoomInput,\n UploadResult,\n} from \"../types/index\";\n\n// Manual interface — avoids Extract<> returning never on discriminated union\ninterface ApiKeyConfig {\n endpoint: string;\n apiKey: string;\n secret: string;\n userId: string;\n displayName: string;\n avatar?: string;\n email?: string;\n}\n\nexport class HermesClient extends EventEmitter {\n private config: HermesConfig;\n private socket: Socket | null = null;\n private token: string | null = null;\n\n public user: HermesUser | null = null;\n public status: ConnectionStatus = \"idle\";\n\n constructor(config: HermesConfig) {\n super();\n this.config = config;\n if (\"token\" in config && typeof config.token === \"string\") {\n this.token = config.token;\n }\n }\n\n async connect(): Promise<HermesUser> {\n this.status = \"connecting\";\n try {\n if (this.token) {\n await this._connectSocket();\n return this.user!;\n }\n if (!(\"apiKey\" in this.config)) {\n throw new Error(\"Either token or (apiKey + secret + userId) must be provided\");\n }\n const cfg = this.config as unknown as ApiKeyConfig;\n const res = await fetch(`${cfg.endpoint}/hermes/connect`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n apiKey: cfg.apiKey,\n secret: cfg.secret,\n userId: cfg.userId,\n displayName: cfg.displayName ?? cfg.userId,\n avatar: cfg.avatar,\n email: cfg.email,\n }),\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.message || \"Auth failed\");\n this.token = data.token;\n this.user = {\n userId: data.user.hermesUserId,\n displayName: data.user.displayName,\n avatar: data.user.avatar,\n email: data.user.email,\n };\n await this._connectSocket();\n return this.user!;\n } catch (err) {\n this.status = \"error\";\n this.emit(\"error\", err as Error);\n throw err;\n }\n }\n\n private async _connectSocket(): Promise<void> {\n this.socket = io(`${this.config.endpoint}/hermes`, {\n auth: { token: this.token },\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n });\n this._wireSocketEvents();\n await new Promise<void>((resolve, reject) => {\n this.socket!.once(\"connect\", resolve);\n this.socket!.once(\"connect_error\", (err) => reject(err));\n });\n this.status = \"connected\";\n this.emit(\"connected\");\n }\n\n disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n this.token = null;\n this.status = \"disconnected\";\n this.emit(\"disconnected\", \"manual\");\n }\n\n private _wireSocketEvents(): void {\n const s = this.socket!;\n s.on(\"disconnect\", (reason) => { this.status = \"disconnected\"; this.emit(\"disconnected\", reason); });\n s.on(\"connect_error\", (err) => { this.status = \"error\"; this.emit(\"error\", err); });\n s.on(\"message:receive\", (msg: Message) => this.emit(\"message:receive\", msg));\n s.on(\"message:deleted\", (data) => this.emit(\"message:deleted\", data));\n s.on(\"message:edited\", (msg: Message) => this.emit(\"message:edited\", msg));\n s.on(\"room:created\", (room: Room) => this.emit(\"room:created\", room));\n s.on(\"room:deleted\", (data) => this.emit(\"room:deleted\", data));\n s.on(\"room:member:joined\", (data) => this.emit(\"room:member:joined\", data));\n s.on(\"room:member:left\", (data) => this.emit(\"room:member:left\", data));\n s.on(\"user:online\", (event) => this.emit(\"user:online\", event));\n s.on(\"user:offline\", (event) => this.emit(\"user:offline\", event));\n s.on(\"typing:started\", (event) => this.emit(\"typing:started\", event));\n s.on(\"typing:stopped\", (event) => this.emit(\"typing:stopped\", event));\n s.on(\"receipt:updated\", (event) => this.emit(\"receipt:updated\", event));\n s.on(\"reaction:updated\", (event) => this.emit(\"reaction:updated\", event));\n }\n\n _emit<T = any>(event: string, data?: any): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.socket?.connected) return reject(new Error(\"Not connected to Hermes engine\"));\n const timer = setTimeout(() => reject(new Error(`Timed out waiting for \"${event}\"`)), 5000);\n const callback = (response: any) => {\n clearTimeout(timer);\n if (response?.success === false) reject(new Error(response.error || \"Unknown error\"));\n else resolve(response);\n };\n if (data && Object.keys(data).length > 0) this.socket!.emit(event, data, callback);\n else this.socket!.emit(event, callback);\n });\n }\n\n async sendMessage(input: SendMessageInput): Promise<Message> {\n const res = await this._emit<{ message: Message }>(\"message:send\", input);\n return res.message;\n }\n async getHistory(roomId: string, before?: string, limit?: number): Promise<MessageHistoryResult> {\n return this._emit(\"message:history\", { roomId, before, limit });\n }\n async deleteMessage(messageId: string, roomId: string): Promise<void> {\n await this._emit(\"message:delete\", { messageId, roomId });\n }\n async editMessage(messageId: string, roomId: string, text: string): Promise<Message> {\n const res = await this._emit<{ message: Message }>(\"message:edit\", { messageId, roomId, text });\n return res.message;\n }\n async createDirectRoom(input: CreateDirectRoomInput): Promise<Room> {\n const res = await this._emit<{ room: Room }>(\"room:create:direct\", { targetHermesUserId: input.targetUserId });\n return res.room;\n }\n async createGroupRoom(input: CreateGroupRoomInput): Promise<Room> {\n const res = await this._emit<{ room: Room }>(\"room:create:group\", input);\n return res.room;\n }\n async deleteRoom(roomId: string): Promise<void> { await this._emit(\"room:delete\", { roomId }); }\n async getRooms(): Promise<Room[]> {\n const res = await this._emit<{ rooms: Room[] }>(\"room:list\");\n return res.rooms;\n }\n async addMember(roomId: string, newMemberId: string): Promise<void> { await this._emit(\"room:member:add\", { roomId, newMemberId }); }\n async removeMember(roomId: string, targetId: string): Promise<void> { await this._emit(\"room:member:remove\", { roomId, targetId }); }\n pingPresence(roomId: string): void { this.socket?.emit(\"presence:ping\", { roomId }); }\n startTyping(roomId: string): void { this.socket?.emit(\"typing:start\", { roomId }); }\n stopTyping(roomId: string): void { this.socket?.emit(\"typing:stop\", { roomId }); }\n async markSeen(roomId: string, lastMessageId: string): Promise<void> { await this._emit(\"receipt:seen\", { roomId, lastMessageId }); }\n async addReaction(messageId: string, roomId: string, emoji: string): Promise<void> { await this._emit(\"reaction:add\", { messageId, roomId, emoji }); }\n async uploadFile(file: File): Promise<UploadResult> {\n if (!this.token) throw new Error(\"Not connected\");\n const formData = new FormData();\n formData.append(\"file\", file);\n const res = await fetch(`${this.config.endpoint}/hermes/upload`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${this.token}` },\n body: formData,\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.error || \"Upload failed\");\n return data as UploadResult;\n }\n get isConnected(): boolean { return this.status === \"connected\" && !!this.socket?.connected; }\n get currentUser(): HermesUser | null { return this.user; }\n}\n","import type { HermesEvents } from \"../types/index\";\n\ntype EventKey = keyof HermesEvents;\ntype EventCallback<K extends EventKey> = HermesEvents[K];\ntype ListenerMap = { [K in EventKey]?: EventCallback<K>[] };\n\nexport class EventEmitter {\n private listeners: ListenerMap = {};\n\n on<K extends EventKey>(event: K, callback: EventCallback<K>): this {\n if (!this.listeners[event]) {\n this.listeners[event] = [];\n }\n (this.listeners[event] as EventCallback<K>[]).push(callback);\n return this;\n }\n\n off<K extends EventKey>(event: K, callback: EventCallback<K>): void {\n if (!this.listeners[event]) return;\n this.listeners[event] = (\n this.listeners[event] as EventCallback<K>[]\n ).filter((cb) => cb !== callback) as any;\n }\n\n once<K extends EventKey>(event: K, callback: EventCallback<K>): this {\n const wrapper = ((...args: any[]) => {\n (callback as any)(...args);\n this.off(event, wrapper as any);\n }) as EventCallback<K>;\n return this.on(event, wrapper);\n }\n\n emit<K extends EventKey>(\n event: K,\n ...args: Parameters<EventCallback<K>>\n ): this {\n if (!this.listeners[event]) return this;\n (this.listeners[event] as EventCallback<K>[]).forEach((cb) =>\n (cb as any)(...args),\n );\n return this;\n }\n\n removeAllListeners<K extends EventKey>(event?: K): this {\n if (event) {\n delete this.listeners[event];\n } else {\n this.listeners = {};\n }\n return this;\n }\n\n listenerCount<K extends EventKey>(event: K): number {\n return this.listeners[event]?.length ?? 0;\n }\n}\n"],"mappings":";AAAA,SAAS,UAAkB;;;ACMpB,IAAM,eAAN,MAAmB;AAAA,EAAnB;AACL,SAAQ,YAAyB,CAAC;AAAA;AAAA,EAElC,GAAuB,OAAU,UAAkC;AACjE,QAAI,CAAC,KAAK,UAAU,KAAK,GAAG;AAC1B,WAAK,UAAU,KAAK,IAAI,CAAC;AAAA,IAC3B;AACA,IAAC,KAAK,UAAU,KAAK,EAAyB,KAAK,QAAQ;AAC3D,WAAO;AAAA,EACT;AAAA,EAEA,IAAwB,OAAU,UAAkC;AAClE,QAAI,CAAC,KAAK,UAAU,KAAK,EAAG;AAC5B,SAAK,UAAU,KAAK,IAClB,KAAK,UAAU,KAAK,EACpB,OAAO,CAAC,OAAO,OAAO,QAAQ;AAAA,EAClC;AAAA,EAEA,KAAyB,OAAU,UAAkC;AACnE,UAAM,WAAW,IAAI,SAAgB;AACnC,MAAC,SAAiB,GAAG,IAAI;AACzB,WAAK,IAAI,OAAO,OAAc;AAAA,IAChC;AACA,WAAO,KAAK,GAAG,OAAO,OAAO;AAAA,EAC/B;AAAA,EAEA,KACE,UACG,MACG;AACN,QAAI,CAAC,KAAK,UAAU,KAAK,EAAG,QAAO;AACnC,IAAC,KAAK,UAAU,KAAK,EAAyB;AAAA,MAAQ,CAAC,OACpD,GAAW,GAAG,IAAI;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,mBAAuC,OAAiB;AACtD,QAAI,OAAO;AACT,aAAO,KAAK,UAAU,KAAK;AAAA,IAC7B,OAAO;AACL,WAAK,YAAY,CAAC;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAkC,OAAkB;AAClD,WAAO,KAAK,UAAU,KAAK,GAAG,UAAU;AAAA,EAC1C;AACF;;;AD7BO,IAAM,eAAN,cAA2B,aAAa;AAAA,EAQ7C,YAAY,QAAsB;AAChC,UAAM;AAPR,SAAQ,SAAwB;AAChC,SAAQ,QAAuB;AAE/B,SAAO,OAA0B;AACjC,SAAO,SAA2B;AAIhC,SAAK,SAAS;AACd,QAAI,WAAW,UAAU,OAAO,OAAO,UAAU,UAAU;AACzD,WAAK,QAAQ,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,UAA+B;AACnC,SAAK,SAAS;AACd,QAAI;AACF,UAAI,KAAK,OAAO;AACd,cAAM,KAAK,eAAe;AAC1B,eAAO,KAAK;AAAA,MACd;AACA,UAAI,EAAE,YAAY,KAAK,SAAS;AAC9B,cAAM,IAAI,MAAM,6DAA6D;AAAA,MAC/E;AACA,YAAM,MAAM,KAAK;AACjB,YAAM,MAAM,MAAM,MAAM,GAAG,IAAI,QAAQ,mBAAmB;AAAA,QACxD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU;AAAA,UACnB,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,UACZ,aAAa,IAAI,eAAe,IAAI;AAAA,UACpC,QAAQ,IAAI;AAAA,UACZ,OAAO,IAAI;AAAA,QACb,CAAC;AAAA,MACH,CAAC;AACD,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,KAAK,WAAW,aAAa;AAChE,WAAK,QAAQ,KAAK;AAClB,WAAK,OAAO;AAAA,QACV,QAAQ,KAAK,KAAK;AAAA,QAClB,aAAa,KAAK,KAAK;AAAA,QACvB,QAAQ,KAAK,KAAK;AAAA,QAClB,OAAO,KAAK,KAAK;AAAA,MACnB;AACA,YAAM,KAAK,eAAe;AAC1B,aAAO,KAAK;AAAA,IACd,SAAS,KAAK;AACZ,WAAK,SAAS;AACd,WAAK,KAAK,SAAS,GAAY;AAC/B,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,iBAAgC;AAC5C,SAAK,SAAS,GAAG,GAAG,KAAK,OAAO,QAAQ,WAAW;AAAA,MACjD,MAAM,EAAE,OAAO,KAAK,MAAM;AAAA,MAC1B,YAAY,CAAC,WAAW;AAAA,MACxB,cAAc;AAAA,MACd,sBAAsB;AAAA,MACtB,mBAAmB;AAAA,IACrB,CAAC;AACD,SAAK,kBAAkB;AACvB,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,WAAK,OAAQ,KAAK,WAAW,OAAO;AACpC,WAAK,OAAQ,KAAK,iBAAiB,CAAC,QAAQ,OAAO,GAAG,CAAC;AAAA,IACzD,CAAC;AACD,SAAK,SAAS;AACd,SAAK,KAAK,WAAW;AAAA,EACvB;AAAA,EAEA,aAAmB;AACjB,SAAK,QAAQ,WAAW;AACxB,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,KAAK,gBAAgB,QAAQ;AAAA,EACpC;AAAA,EAEQ,oBAA0B;AAChC,UAAM,IAAI,KAAK;AACf,MAAE,GAAG,cAAc,CAAC,WAAW;AAAE,WAAK,SAAS;AAAgB,WAAK,KAAK,gBAAgB,MAAM;AAAA,IAAG,CAAC;AACnG,MAAE,GAAG,iBAAiB,CAAC,QAAQ;AAAE,WAAK,SAAS;AAAS,WAAK,KAAK,SAAS,GAAG;AAAA,IAAG,CAAC;AAClF,MAAE,GAAG,mBAAmB,CAAC,QAAiB,KAAK,KAAK,mBAAmB,GAAG,CAAC;AAC3E,MAAE,GAAG,mBAAmB,CAAC,SAAS,KAAK,KAAK,mBAAmB,IAAI,CAAC;AACpE,MAAE,GAAG,kBAAkB,CAAC,QAAiB,KAAK,KAAK,kBAAkB,GAAG,CAAC;AACzE,MAAE,GAAG,gBAAgB,CAAC,SAAe,KAAK,KAAK,gBAAgB,IAAI,CAAC;AACpE,MAAE,GAAG,gBAAgB,CAAC,SAAS,KAAK,KAAK,gBAAgB,IAAI,CAAC;AAC9D,MAAE,GAAG,sBAAsB,CAAC,SAAS,KAAK,KAAK,sBAAsB,IAAI,CAAC;AAC1E,MAAE,GAAG,oBAAoB,CAAC,SAAS,KAAK,KAAK,oBAAoB,IAAI,CAAC;AACtE,MAAE,GAAG,eAAe,CAAC,UAAU,KAAK,KAAK,eAAe,KAAK,CAAC;AAC9D,MAAE,GAAG,gBAAgB,CAAC,UAAU,KAAK,KAAK,gBAAgB,KAAK,CAAC;AAChE,MAAE,GAAG,kBAAkB,CAAC,UAAU,KAAK,KAAK,kBAAkB,KAAK,CAAC;AACpE,MAAE,GAAG,kBAAkB,CAAC,UAAU,KAAK,KAAK,kBAAkB,KAAK,CAAC;AACpE,MAAE,GAAG,mBAAmB,CAAC,UAAU,KAAK,KAAK,mBAAmB,KAAK,CAAC;AACtE,MAAE,GAAG,oBAAoB,CAAC,UAAU,KAAK,KAAK,oBAAoB,KAAK,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAe,OAAe,MAAwB;AACpD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI,CAAC,KAAK,QAAQ,UAAW,QAAO,OAAO,IAAI,MAAM,gCAAgC,CAAC;AACtF,YAAM,QAAQ,WAAW,MAAM,OAAO,IAAI,MAAM,0BAA0B,KAAK,GAAG,CAAC,GAAG,GAAI;AAC1F,YAAM,WAAW,CAAC,aAAkB;AAClC,qBAAa,KAAK;AAClB,YAAI,UAAU,YAAY,MAAO,QAAO,IAAI,MAAM,SAAS,SAAS,eAAe,CAAC;AAAA,YAC/E,SAAQ,QAAQ;AAAA,MACvB;AACA,UAAI,QAAQ,OAAO,KAAK,IAAI,EAAE,SAAS,EAAG,MAAK,OAAQ,KAAK,OAAO,MAAM,QAAQ;AAAA,UAC5E,MAAK,OAAQ,KAAK,OAAO,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,OAA2C;AAC3D,UAAM,MAAM,MAAM,KAAK,MAA4B,gBAAgB,KAAK;AACxE,WAAO,IAAI;AAAA,EACb;AAAA,EACA,MAAM,WAAW,QAAgB,QAAiB,OAA+C;AAC/F,WAAO,KAAK,MAAM,mBAAmB,EAAE,QAAQ,QAAQ,MAAM,CAAC;AAAA,EAChE;AAAA,EACA,MAAM,cAAc,WAAmB,QAA+B;AACpE,UAAM,KAAK,MAAM,kBAAkB,EAAE,WAAW,OAAO,CAAC;AAAA,EAC1D;AAAA,EACA,MAAM,YAAY,WAAmB,QAAgB,MAAgC;AACnF,UAAM,MAAM,MAAM,KAAK,MAA4B,gBAAgB,EAAE,WAAW,QAAQ,KAAK,CAAC;AAC9F,WAAO,IAAI;AAAA,EACb;AAAA,EACA,MAAM,iBAAiB,OAA6C;AAClE,UAAM,MAAM,MAAM,KAAK,MAAsB,sBAAsB,EAAE,oBAAoB,MAAM,aAAa,CAAC;AAC7G,WAAO,IAAI;AAAA,EACb;AAAA,EACA,MAAM,gBAAgB,OAA4C;AAChE,UAAM,MAAM,MAAM,KAAK,MAAsB,qBAAqB,KAAK;AACvE,WAAO,IAAI;AAAA,EACb;AAAA,EACA,MAAM,WAAW,QAA+B;AAAE,UAAM,KAAK,MAAM,eAAe,EAAE,OAAO,CAAC;AAAA,EAAG;AAAA,EAC/F,MAAM,WAA4B;AAChC,UAAM,MAAM,MAAM,KAAK,MAAyB,WAAW;AAC3D,WAAO,IAAI;AAAA,EACb;AAAA,EACA,MAAM,UAAU,QAAgB,aAAoC;AAAE,UAAM,KAAK,MAAM,mBAAmB,EAAE,QAAQ,YAAY,CAAC;AAAA,EAAG;AAAA,EACpI,MAAM,aAAa,QAAgB,UAAiC;AAAE,UAAM,KAAK,MAAM,sBAAsB,EAAE,QAAQ,SAAS,CAAC;AAAA,EAAG;AAAA,EACpI,aAAa,QAAsB;AAAE,SAAK,QAAQ,KAAK,iBAAiB,EAAE,OAAO,CAAC;AAAA,EAAG;AAAA,EACrF,YAAY,QAAsB;AAAE,SAAK,QAAQ,KAAK,gBAAgB,EAAE,OAAO,CAAC;AAAA,EAAG;AAAA,EACnF,WAAW,QAAsB;AAAE,SAAK,QAAQ,KAAK,eAAe,EAAE,OAAO,CAAC;AAAA,EAAG;AAAA,EACjF,MAAM,SAAS,QAAgB,eAAsC;AAAE,UAAM,KAAK,MAAM,gBAAgB,EAAE,QAAQ,cAAc,CAAC;AAAA,EAAG;AAAA,EACpI,MAAM,YAAY,WAAmB,QAAgB,OAA8B;AAAE,UAAM,KAAK,MAAM,gBAAgB,EAAE,WAAW,QAAQ,MAAM,CAAC;AAAA,EAAG;AAAA,EACrJ,MAAM,WAAW,MAAmC;AAClD,QAAI,CAAC,KAAK,MAAO,OAAM,IAAI,MAAM,eAAe;AAChD,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS,OAAO,QAAQ,IAAI;AAC5B,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,QAAQ,kBAAkB;AAAA,MAC/D,QAAQ;AAAA,MACR,SAAS,EAAE,eAAe,UAAU,KAAK,KAAK,GAAG;AAAA,MACjD,MAAM;AAAA,IACR,CAAC;AACD,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,KAAK,SAAS,eAAe;AAChE,WAAO;AAAA,EACT;AAAA,EACA,IAAI,cAAuB;AAAE,WAAO,KAAK,WAAW,eAAe,CAAC,CAAC,KAAK,QAAQ;AAAA,EAAW;AAAA,EAC7F,IAAI,cAAiC;AAAE,WAAO,KAAK;AAAA,EAAM;AAC3D;","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -3,6 +3,10 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
6
10
|
var __copyProps = (to, from, except, desc) => {
|
|
7
11
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
12
|
for (let key of __getOwnPropNames(from))
|
|
@@ -15,5 +19,242 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
15
19
|
|
|
16
20
|
// src/index.ts
|
|
17
21
|
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
HermesClient: () => HermesClient
|
|
24
|
+
});
|
|
18
25
|
module.exports = __toCommonJS(src_exports);
|
|
26
|
+
|
|
27
|
+
// src/core/HermesClient.ts
|
|
28
|
+
var import_socket = require("socket.io-client");
|
|
29
|
+
|
|
30
|
+
// src/core/EventEmitter.ts
|
|
31
|
+
var EventEmitter = class {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.listeners = {};
|
|
34
|
+
}
|
|
35
|
+
on(event, callback) {
|
|
36
|
+
if (!this.listeners[event]) {
|
|
37
|
+
this.listeners[event] = [];
|
|
38
|
+
}
|
|
39
|
+
this.listeners[event].push(callback);
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
off(event, callback) {
|
|
43
|
+
if (!this.listeners[event]) return;
|
|
44
|
+
this.listeners[event] = this.listeners[event].filter((cb) => cb !== callback);
|
|
45
|
+
}
|
|
46
|
+
once(event, callback) {
|
|
47
|
+
const wrapper = ((...args) => {
|
|
48
|
+
callback(...args);
|
|
49
|
+
this.off(event, wrapper);
|
|
50
|
+
});
|
|
51
|
+
return this.on(event, wrapper);
|
|
52
|
+
}
|
|
53
|
+
emit(event, ...args) {
|
|
54
|
+
if (!this.listeners[event]) return this;
|
|
55
|
+
this.listeners[event].forEach(
|
|
56
|
+
(cb) => cb(...args)
|
|
57
|
+
);
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
removeAllListeners(event) {
|
|
61
|
+
if (event) {
|
|
62
|
+
delete this.listeners[event];
|
|
63
|
+
} else {
|
|
64
|
+
this.listeners = {};
|
|
65
|
+
}
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
listenerCount(event) {
|
|
69
|
+
return this.listeners[event]?.length ?? 0;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// src/core/HermesClient.ts
|
|
74
|
+
var HermesClient = class extends EventEmitter {
|
|
75
|
+
constructor(config) {
|
|
76
|
+
super();
|
|
77
|
+
this.socket = null;
|
|
78
|
+
this.token = null;
|
|
79
|
+
this.user = null;
|
|
80
|
+
this.status = "idle";
|
|
81
|
+
this.config = config;
|
|
82
|
+
if ("token" in config && typeof config.token === "string") {
|
|
83
|
+
this.token = config.token;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async connect() {
|
|
87
|
+
this.status = "connecting";
|
|
88
|
+
try {
|
|
89
|
+
if (this.token) {
|
|
90
|
+
await this._connectSocket();
|
|
91
|
+
return this.user;
|
|
92
|
+
}
|
|
93
|
+
if (!("apiKey" in this.config)) {
|
|
94
|
+
throw new Error("Either token or (apiKey + secret + userId) must be provided");
|
|
95
|
+
}
|
|
96
|
+
const cfg = this.config;
|
|
97
|
+
const res = await fetch(`${cfg.endpoint}/hermes/connect`, {
|
|
98
|
+
method: "POST",
|
|
99
|
+
headers: { "Content-Type": "application/json" },
|
|
100
|
+
body: JSON.stringify({
|
|
101
|
+
apiKey: cfg.apiKey,
|
|
102
|
+
secret: cfg.secret,
|
|
103
|
+
userId: cfg.userId,
|
|
104
|
+
displayName: cfg.displayName ?? cfg.userId,
|
|
105
|
+
avatar: cfg.avatar,
|
|
106
|
+
email: cfg.email
|
|
107
|
+
})
|
|
108
|
+
});
|
|
109
|
+
const data = await res.json();
|
|
110
|
+
if (!data.success) throw new Error(data.message || "Auth failed");
|
|
111
|
+
this.token = data.token;
|
|
112
|
+
this.user = {
|
|
113
|
+
userId: data.user.hermesUserId,
|
|
114
|
+
displayName: data.user.displayName,
|
|
115
|
+
avatar: data.user.avatar,
|
|
116
|
+
email: data.user.email
|
|
117
|
+
};
|
|
118
|
+
await this._connectSocket();
|
|
119
|
+
return this.user;
|
|
120
|
+
} catch (err) {
|
|
121
|
+
this.status = "error";
|
|
122
|
+
this.emit("error", err);
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async _connectSocket() {
|
|
127
|
+
this.socket = (0, import_socket.io)(`${this.config.endpoint}/hermes`, {
|
|
128
|
+
auth: { token: this.token },
|
|
129
|
+
transports: ["websocket"],
|
|
130
|
+
reconnection: true,
|
|
131
|
+
reconnectionAttempts: 5,
|
|
132
|
+
reconnectionDelay: 1e3
|
|
133
|
+
});
|
|
134
|
+
this._wireSocketEvents();
|
|
135
|
+
await new Promise((resolve, reject) => {
|
|
136
|
+
this.socket.once("connect", resolve);
|
|
137
|
+
this.socket.once("connect_error", (err) => reject(err));
|
|
138
|
+
});
|
|
139
|
+
this.status = "connected";
|
|
140
|
+
this.emit("connected");
|
|
141
|
+
}
|
|
142
|
+
disconnect() {
|
|
143
|
+
this.socket?.disconnect();
|
|
144
|
+
this.socket = null;
|
|
145
|
+
this.token = null;
|
|
146
|
+
this.status = "disconnected";
|
|
147
|
+
this.emit("disconnected", "manual");
|
|
148
|
+
}
|
|
149
|
+
_wireSocketEvents() {
|
|
150
|
+
const s = this.socket;
|
|
151
|
+
s.on("disconnect", (reason) => {
|
|
152
|
+
this.status = "disconnected";
|
|
153
|
+
this.emit("disconnected", reason);
|
|
154
|
+
});
|
|
155
|
+
s.on("connect_error", (err) => {
|
|
156
|
+
this.status = "error";
|
|
157
|
+
this.emit("error", err);
|
|
158
|
+
});
|
|
159
|
+
s.on("message:receive", (msg) => this.emit("message:receive", msg));
|
|
160
|
+
s.on("message:deleted", (data) => this.emit("message:deleted", data));
|
|
161
|
+
s.on("message:edited", (msg) => this.emit("message:edited", msg));
|
|
162
|
+
s.on("room:created", (room) => this.emit("room:created", room));
|
|
163
|
+
s.on("room:deleted", (data) => this.emit("room:deleted", data));
|
|
164
|
+
s.on("room:member:joined", (data) => this.emit("room:member:joined", data));
|
|
165
|
+
s.on("room:member:left", (data) => this.emit("room:member:left", data));
|
|
166
|
+
s.on("user:online", (event) => this.emit("user:online", event));
|
|
167
|
+
s.on("user:offline", (event) => this.emit("user:offline", event));
|
|
168
|
+
s.on("typing:started", (event) => this.emit("typing:started", event));
|
|
169
|
+
s.on("typing:stopped", (event) => this.emit("typing:stopped", event));
|
|
170
|
+
s.on("receipt:updated", (event) => this.emit("receipt:updated", event));
|
|
171
|
+
s.on("reaction:updated", (event) => this.emit("reaction:updated", event));
|
|
172
|
+
}
|
|
173
|
+
_emit(event, data) {
|
|
174
|
+
return new Promise((resolve, reject) => {
|
|
175
|
+
if (!this.socket?.connected) return reject(new Error("Not connected to Hermes engine"));
|
|
176
|
+
const timer = setTimeout(() => reject(new Error(`Timed out waiting for "${event}"`)), 5e3);
|
|
177
|
+
const callback = (response) => {
|
|
178
|
+
clearTimeout(timer);
|
|
179
|
+
if (response?.success === false) reject(new Error(response.error || "Unknown error"));
|
|
180
|
+
else resolve(response);
|
|
181
|
+
};
|
|
182
|
+
if (data && Object.keys(data).length > 0) this.socket.emit(event, data, callback);
|
|
183
|
+
else this.socket.emit(event, callback);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async sendMessage(input) {
|
|
187
|
+
const res = await this._emit("message:send", input);
|
|
188
|
+
return res.message;
|
|
189
|
+
}
|
|
190
|
+
async getHistory(roomId, before, limit) {
|
|
191
|
+
return this._emit("message:history", { roomId, before, limit });
|
|
192
|
+
}
|
|
193
|
+
async deleteMessage(messageId, roomId) {
|
|
194
|
+
await this._emit("message:delete", { messageId, roomId });
|
|
195
|
+
}
|
|
196
|
+
async editMessage(messageId, roomId, text) {
|
|
197
|
+
const res = await this._emit("message:edit", { messageId, roomId, text });
|
|
198
|
+
return res.message;
|
|
199
|
+
}
|
|
200
|
+
async createDirectRoom(input) {
|
|
201
|
+
const res = await this._emit("room:create:direct", { targetHermesUserId: input.targetUserId });
|
|
202
|
+
return res.room;
|
|
203
|
+
}
|
|
204
|
+
async createGroupRoom(input) {
|
|
205
|
+
const res = await this._emit("room:create:group", input);
|
|
206
|
+
return res.room;
|
|
207
|
+
}
|
|
208
|
+
async deleteRoom(roomId) {
|
|
209
|
+
await this._emit("room:delete", { roomId });
|
|
210
|
+
}
|
|
211
|
+
async getRooms() {
|
|
212
|
+
const res = await this._emit("room:list");
|
|
213
|
+
return res.rooms;
|
|
214
|
+
}
|
|
215
|
+
async addMember(roomId, newMemberId) {
|
|
216
|
+
await this._emit("room:member:add", { roomId, newMemberId });
|
|
217
|
+
}
|
|
218
|
+
async removeMember(roomId, targetId) {
|
|
219
|
+
await this._emit("room:member:remove", { roomId, targetId });
|
|
220
|
+
}
|
|
221
|
+
pingPresence(roomId) {
|
|
222
|
+
this.socket?.emit("presence:ping", { roomId });
|
|
223
|
+
}
|
|
224
|
+
startTyping(roomId) {
|
|
225
|
+
this.socket?.emit("typing:start", { roomId });
|
|
226
|
+
}
|
|
227
|
+
stopTyping(roomId) {
|
|
228
|
+
this.socket?.emit("typing:stop", { roomId });
|
|
229
|
+
}
|
|
230
|
+
async markSeen(roomId, lastMessageId) {
|
|
231
|
+
await this._emit("receipt:seen", { roomId, lastMessageId });
|
|
232
|
+
}
|
|
233
|
+
async addReaction(messageId, roomId, emoji) {
|
|
234
|
+
await this._emit("reaction:add", { messageId, roomId, emoji });
|
|
235
|
+
}
|
|
236
|
+
async uploadFile(file) {
|
|
237
|
+
if (!this.token) throw new Error("Not connected");
|
|
238
|
+
const formData = new FormData();
|
|
239
|
+
formData.append("file", file);
|
|
240
|
+
const res = await fetch(`${this.config.endpoint}/hermes/upload`, {
|
|
241
|
+
method: "POST",
|
|
242
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
243
|
+
body: formData
|
|
244
|
+
});
|
|
245
|
+
const data = await res.json();
|
|
246
|
+
if (!data.success) throw new Error(data.error || "Upload failed");
|
|
247
|
+
return data;
|
|
248
|
+
}
|
|
249
|
+
get isConnected() {
|
|
250
|
+
return this.status === "connected" && !!this.socket?.connected;
|
|
251
|
+
}
|
|
252
|
+
get currentUser() {
|
|
253
|
+
return this.user;
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
257
|
+
0 && (module.exports = {
|
|
258
|
+
HermesClient
|
|
259
|
+
});
|
|
19
260
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["\n\nexport type HermesConfig =\n | {\n endpoint: string;\n token: string; \n apiKey?: never;\n secret?: never;\n userId?: never;\n displayName?: never;\n avatar?: never;\n email?: never;\n }\n | {\n endpoint: string;\n token?: never;\n apiKey: string; \n secret: string; \n userId: string; \n displayName: string; \n avatar?: string;\n email?: string;\n };\n\nexport interface HermesUser {\n userId: string; \n displayName: string;\n avatar?: string;\n email?: string;\n}\n\nexport interface ConnectResponse {\n success: boolean;\n token: string;\n user: HermesUser;\n}\n\nexport type RoomType = \"direct\" | \"group\";\n\nexport interface Room {\n _id: string;\n name?: string;\n type: RoomType;\n projectId: string;\n createdBy: string;\n members: string[];\n admins: string[];\n avatar?: string;\n description?: string;\n lastMessage?: Message;\n lastActivity: string;\n unreadCount: number;\n isMuted: boolean;\n isPinned: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateDirectRoomInput {\n targetUserId: string; \n}\n\nexport interface CreateGroupRoomInput {\n name: string;\n memberIds: string[]; \n description?: string;\n avatar?: string;\n}\n\nexport type MessageType =\n | \"text\"\n | \"link\"\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"document\";\nexport type DeliveryStatus = \"sent\" | \"delivered\" | \"seen\";\n\nexport interface Reaction {\n emoji: string;\n users: string[];\n}\n\nexport interface Message {\n _id: string;\n roomId: string;\n senderId: string;\n type: MessageType;\n text?: string;\n url?: string;\n fileName?: string;\n fileSize?: number;\n mimeType?: string;\n thumbnail?: string;\n replyTo?: string;\n reactions: Reaction[];\n deliveryStatus: DeliveryStatus;\n seenBy: string[];\n isDeleted: boolean;\n deletedAt?: string;\n editedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SendMessageInput {\n roomId: string;\n type: MessageType;\n text?: string;\n url?: string;\n fileName?: string;\n fileSize?: number;\n mimeType?: string;\n thumbnail?: string;\n replyTo?: string;\n}\n\nexport interface MessageHistoryResult {\n messages: Message[];\n hasMore: boolean;\n}\n\nexport interface PresenceEvent {\n userId: string;\n displayName: string;\n roomId?: string;\n}\n\nexport interface LastSeenEvent {\n userId: string;\n displayName?: string;\n lastSeen: string;\n}\n\nexport interface TypingEvent {\n userId: string;\n displayName: string;\n roomId: string;\n}\n\nexport interface ReceiptEvent {\n roomId: string;\n userId: string;\n lastMessageId: string;\n seenAt: string;\n}\n\nexport interface ReactionEvent {\n messageId: string;\n roomId: string;\n reactions: Reaction[];\n}\n\nexport interface UploadResult {\n type: MessageType;\n url: string;\n thumbnail?: string;\n fileName: string;\n fileSize: number;\n mimeType: string;\n}\n\nexport interface HermesEvents {\n connected: () => void;\n disconnected: (reason: string) => void;\n error: (error: Error) => void;\n \"message:receive\": (message: Message) => void;\n \"message:deleted\": (data: { messageId: string; roomId: string }) => void;\n \"message:edited\": (message: Message) => void;\n \"room:created\": (room: Room) => void;\n \"room:deleted\": (data: { roomId: string }) => void;\n \"room:member:joined\": (data: { roomId: string; userId: string }) => void;\n \"room:member:left\": (data: { roomId: string; userId: string }) => void;\n \"user:online\": (event: PresenceEvent) => void;\n \"user:offline\": (event: LastSeenEvent) => void;\n \"typing:started\": (event: TypingEvent) => void;\n \"typing:stopped\": (event: TypingEvent) => void;\n \"receipt:updated\": (event: ReceiptEvent) => void;\n \"reaction:updated\": (event: ReactionEvent) => void;\n}\n\nexport type ConnectionStatus =\n | \"idle\"\n | \"connecting\"\n | \"connected\"\n | \"disconnected\"\n | \"error\";\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/HermesClient.ts","../src/core/EventEmitter.ts"],"sourcesContent":["export { HermesClient } from './core/HermesClient';\nexport * from './types/index';\n","import { io, Socket } from \"socket.io-client\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport type {\n HermesConfig,\n HermesUser,\n ConnectionStatus,\n Message,\n Room,\n SendMessageInput,\n MessageHistoryResult,\n CreateDirectRoomInput,\n CreateGroupRoomInput,\n UploadResult,\n} from \"../types/index\";\n\n// Manual interface — avoids Extract<> returning never on discriminated union\ninterface ApiKeyConfig {\n endpoint: string;\n apiKey: string;\n secret: string;\n userId: string;\n displayName: string;\n avatar?: string;\n email?: string;\n}\n\nexport class HermesClient extends EventEmitter {\n private config: HermesConfig;\n private socket: Socket | null = null;\n private token: string | null = null;\n\n public user: HermesUser | null = null;\n public status: ConnectionStatus = \"idle\";\n\n constructor(config: HermesConfig) {\n super();\n this.config = config;\n if (\"token\" in config && typeof config.token === \"string\") {\n this.token = config.token;\n }\n }\n\n async connect(): Promise<HermesUser> {\n this.status = \"connecting\";\n try {\n if (this.token) {\n await this._connectSocket();\n return this.user!;\n }\n if (!(\"apiKey\" in this.config)) {\n throw new Error(\"Either token or (apiKey + secret + userId) must be provided\");\n }\n const cfg = this.config as unknown as ApiKeyConfig;\n const res = await fetch(`${cfg.endpoint}/hermes/connect`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n apiKey: cfg.apiKey,\n secret: cfg.secret,\n userId: cfg.userId,\n displayName: cfg.displayName ?? cfg.userId,\n avatar: cfg.avatar,\n email: cfg.email,\n }),\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.message || \"Auth failed\");\n this.token = data.token;\n this.user = {\n userId: data.user.hermesUserId,\n displayName: data.user.displayName,\n avatar: data.user.avatar,\n email: data.user.email,\n };\n await this._connectSocket();\n return this.user!;\n } catch (err) {\n this.status = \"error\";\n this.emit(\"error\", err as Error);\n throw err;\n }\n }\n\n private async _connectSocket(): Promise<void> {\n this.socket = io(`${this.config.endpoint}/hermes`, {\n auth: { token: this.token },\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n });\n this._wireSocketEvents();\n await new Promise<void>((resolve, reject) => {\n this.socket!.once(\"connect\", resolve);\n this.socket!.once(\"connect_error\", (err) => reject(err));\n });\n this.status = \"connected\";\n this.emit(\"connected\");\n }\n\n disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n this.token = null;\n this.status = \"disconnected\";\n this.emit(\"disconnected\", \"manual\");\n }\n\n private _wireSocketEvents(): void {\n const s = this.socket!;\n s.on(\"disconnect\", (reason) => { this.status = \"disconnected\"; this.emit(\"disconnected\", reason); });\n s.on(\"connect_error\", (err) => { this.status = \"error\"; this.emit(\"error\", err); });\n s.on(\"message:receive\", (msg: Message) => this.emit(\"message:receive\", msg));\n s.on(\"message:deleted\", (data) => this.emit(\"message:deleted\", data));\n s.on(\"message:edited\", (msg: Message) => this.emit(\"message:edited\", msg));\n s.on(\"room:created\", (room: Room) => this.emit(\"room:created\", room));\n s.on(\"room:deleted\", (data) => this.emit(\"room:deleted\", data));\n s.on(\"room:member:joined\", (data) => this.emit(\"room:member:joined\", data));\n s.on(\"room:member:left\", (data) => this.emit(\"room:member:left\", data));\n s.on(\"user:online\", (event) => this.emit(\"user:online\", event));\n s.on(\"user:offline\", (event) => this.emit(\"user:offline\", event));\n s.on(\"typing:started\", (event) => this.emit(\"typing:started\", event));\n s.on(\"typing:stopped\", (event) => this.emit(\"typing:stopped\", event));\n s.on(\"receipt:updated\", (event) => this.emit(\"receipt:updated\", event));\n s.on(\"reaction:updated\", (event) => this.emit(\"reaction:updated\", event));\n }\n\n _emit<T = any>(event: string, data?: any): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.socket?.connected) return reject(new Error(\"Not connected to Hermes engine\"));\n const timer = setTimeout(() => reject(new Error(`Timed out waiting for \"${event}\"`)), 5000);\n const callback = (response: any) => {\n clearTimeout(timer);\n if (response?.success === false) reject(new Error(response.error || \"Unknown error\"));\n else resolve(response);\n };\n if (data && Object.keys(data).length > 0) this.socket!.emit(event, data, callback);\n else this.socket!.emit(event, callback);\n });\n }\n\n async sendMessage(input: SendMessageInput): Promise<Message> {\n const res = await this._emit<{ message: Message }>(\"message:send\", input);\n return res.message;\n }\n async getHistory(roomId: string, before?: string, limit?: number): Promise<MessageHistoryResult> {\n return this._emit(\"message:history\", { roomId, before, limit });\n }\n async deleteMessage(messageId: string, roomId: string): Promise<void> {\n await this._emit(\"message:delete\", { messageId, roomId });\n }\n async editMessage(messageId: string, roomId: string, text: string): Promise<Message> {\n const res = await this._emit<{ message: Message }>(\"message:edit\", { messageId, roomId, text });\n return res.message;\n }\n async createDirectRoom(input: CreateDirectRoomInput): Promise<Room> {\n const res = await this._emit<{ room: Room }>(\"room:create:direct\", { targetHermesUserId: input.targetUserId });\n return res.room;\n }\n async createGroupRoom(input: CreateGroupRoomInput): Promise<Room> {\n const res = await this._emit<{ room: Room }>(\"room:create:group\", input);\n return res.room;\n }\n async deleteRoom(roomId: string): Promise<void> { await this._emit(\"room:delete\", { roomId }); }\n async getRooms(): Promise<Room[]> {\n const res = await this._emit<{ rooms: Room[] }>(\"room:list\");\n return res.rooms;\n }\n async addMember(roomId: string, newMemberId: string): Promise<void> { await this._emit(\"room:member:add\", { roomId, newMemberId }); }\n async removeMember(roomId: string, targetId: string): Promise<void> { await this._emit(\"room:member:remove\", { roomId, targetId }); }\n pingPresence(roomId: string): void { this.socket?.emit(\"presence:ping\", { roomId }); }\n startTyping(roomId: string): void { this.socket?.emit(\"typing:start\", { roomId }); }\n stopTyping(roomId: string): void { this.socket?.emit(\"typing:stop\", { roomId }); }\n async markSeen(roomId: string, lastMessageId: string): Promise<void> { await this._emit(\"receipt:seen\", { roomId, lastMessageId }); }\n async addReaction(messageId: string, roomId: string, emoji: string): Promise<void> { await this._emit(\"reaction:add\", { messageId, roomId, emoji }); }\n async uploadFile(file: File): Promise<UploadResult> {\n if (!this.token) throw new Error(\"Not connected\");\n const formData = new FormData();\n formData.append(\"file\", file);\n const res = await fetch(`${this.config.endpoint}/hermes/upload`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${this.token}` },\n body: formData,\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.error || \"Upload failed\");\n return data as UploadResult;\n }\n get isConnected(): boolean { return this.status === \"connected\" && !!this.socket?.connected; }\n get currentUser(): HermesUser | null { return this.user; }\n}\n","import type { HermesEvents } from \"../types/index\";\n\ntype EventKey = keyof HermesEvents;\ntype EventCallback<K extends EventKey> = HermesEvents[K];\ntype ListenerMap = { [K in EventKey]?: EventCallback<K>[] };\n\nexport class EventEmitter {\n private listeners: ListenerMap = {};\n\n on<K extends EventKey>(event: K, callback: EventCallback<K>): this {\n if (!this.listeners[event]) {\n this.listeners[event] = [];\n }\n (this.listeners[event] as EventCallback<K>[]).push(callback);\n return this;\n }\n\n off<K extends EventKey>(event: K, callback: EventCallback<K>): void {\n if (!this.listeners[event]) return;\n this.listeners[event] = (\n this.listeners[event] as EventCallback<K>[]\n ).filter((cb) => cb !== callback) as any;\n }\n\n once<K extends EventKey>(event: K, callback: EventCallback<K>): this {\n const wrapper = ((...args: any[]) => {\n (callback as any)(...args);\n this.off(event, wrapper as any);\n }) as EventCallback<K>;\n return this.on(event, wrapper);\n }\n\n emit<K extends EventKey>(\n event: K,\n ...args: Parameters<EventCallback<K>>\n ): this {\n if (!this.listeners[event]) return this;\n (this.listeners[event] as EventCallback<K>[]).forEach((cb) =>\n (cb as any)(...args),\n );\n return this;\n }\n\n removeAllListeners<K extends EventKey>(event?: K): this {\n if (event) {\n delete this.listeners[event];\n } else {\n this.listeners = {};\n }\n return this;\n }\n\n listenerCount<K extends EventKey>(event: K): number {\n return this.listeners[event]?.length ?? 0;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,22 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
interface HermesConfig {
|
|
2
2
|
endpoint: string;
|
|
3
|
-
token: string;
|
|
4
|
-
apiKey?: never;
|
|
5
|
-
secret?: never;
|
|
6
|
-
userId?: never;
|
|
7
|
-
displayName?: never;
|
|
8
|
-
avatar?: never;
|
|
9
|
-
email?: never;
|
|
10
|
-
} | {
|
|
11
|
-
endpoint: string;
|
|
12
|
-
token?: never;
|
|
13
3
|
apiKey: string;
|
|
14
4
|
secret: string;
|
|
15
5
|
userId: string;
|
|
16
|
-
|
|
17
|
-
avatar?: string;
|
|
18
|
-
email?: string;
|
|
19
|
-
};
|
|
6
|
+
}
|
|
20
7
|
interface HermesUser {
|
|
21
8
|
userId: string;
|
|
22
9
|
displayName: string;
|
|
@@ -33,7 +20,6 @@ interface Room {
|
|
|
33
20
|
_id: string;
|
|
34
21
|
name?: string;
|
|
35
22
|
type: RoomType;
|
|
36
|
-
projectId: string;
|
|
37
23
|
createdBy: string;
|
|
38
24
|
members: string[];
|
|
39
25
|
admins: string[];
|
|
@@ -105,7 +91,6 @@ interface PresenceEvent {
|
|
|
105
91
|
}
|
|
106
92
|
interface LastSeenEvent {
|
|
107
93
|
userId: string;
|
|
108
|
-
displayName?: string;
|
|
109
94
|
lastSeen: string;
|
|
110
95
|
}
|
|
111
96
|
interface TypingEvent {
|
|
@@ -163,4 +148,48 @@ interface HermesEvents {
|
|
|
163
148
|
}
|
|
164
149
|
type ConnectionStatus = "idle" | "connecting" | "connected" | "disconnected" | "error";
|
|
165
150
|
|
|
166
|
-
|
|
151
|
+
type EventKey = keyof HermesEvents;
|
|
152
|
+
type EventCallback<K extends EventKey> = HermesEvents[K];
|
|
153
|
+
declare class EventEmitter {
|
|
154
|
+
private listeners;
|
|
155
|
+
on<K extends EventKey>(event: K, callback: EventCallback<K>): this;
|
|
156
|
+
off<K extends EventKey>(event: K, callback: EventCallback<K>): void;
|
|
157
|
+
once<K extends EventKey>(event: K, callback: EventCallback<K>): this;
|
|
158
|
+
emit<K extends EventKey>(event: K, ...args: Parameters<EventCallback<K>>): this;
|
|
159
|
+
removeAllListeners<K extends EventKey>(event?: K): this;
|
|
160
|
+
listenerCount<K extends EventKey>(event: K): number;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
declare class HermesClient extends EventEmitter {
|
|
164
|
+
private config;
|
|
165
|
+
private socket;
|
|
166
|
+
private token;
|
|
167
|
+
user: HermesUser | null;
|
|
168
|
+
status: ConnectionStatus;
|
|
169
|
+
constructor(config: HermesConfig);
|
|
170
|
+
connect(): Promise<HermesUser>;
|
|
171
|
+
private _connectSocket;
|
|
172
|
+
disconnect(): void;
|
|
173
|
+
private _wireSocketEvents;
|
|
174
|
+
_emit<T = any>(event: string, data?: any): Promise<T>;
|
|
175
|
+
sendMessage(input: SendMessageInput): Promise<Message>;
|
|
176
|
+
getHistory(roomId: string, before?: string, limit?: number): Promise<MessageHistoryResult>;
|
|
177
|
+
deleteMessage(messageId: string, roomId: string): Promise<void>;
|
|
178
|
+
editMessage(messageId: string, roomId: string, text: string): Promise<Message>;
|
|
179
|
+
createDirectRoom(input: CreateDirectRoomInput): Promise<Room>;
|
|
180
|
+
createGroupRoom(input: CreateGroupRoomInput): Promise<Room>;
|
|
181
|
+
deleteRoom(roomId: string): Promise<void>;
|
|
182
|
+
getRooms(): Promise<Room[]>;
|
|
183
|
+
addMember(roomId: string, newMemberId: string): Promise<void>;
|
|
184
|
+
removeMember(roomId: string, targetId: string): Promise<void>;
|
|
185
|
+
pingPresence(roomId: string): void;
|
|
186
|
+
startTyping(roomId: string): void;
|
|
187
|
+
stopTyping(roomId: string): void;
|
|
188
|
+
markSeen(roomId: string, lastMessageId: string): Promise<void>;
|
|
189
|
+
addReaction(messageId: string, roomId: string, emoji: string): Promise<void>;
|
|
190
|
+
uploadFile(file: File): Promise<UploadResult>;
|
|
191
|
+
get isConnected(): boolean;
|
|
192
|
+
get currentUser(): HermesUser | null;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export { type ConnectResponse, type ConnectionStatus, type CreateDirectRoomInput, type CreateGroupRoomInput, type DeliveryStatus, HermesClient, type HermesConfig, type HermesEvents, type HermesUser, type LastSeenEvent, type Message, type MessageHistoryResult, type MessageType, type PresenceEvent, type Reaction, type ReactionEvent, type ReceiptEvent, type Room, type RoomType, type SendMessageInput, type TypingEvent, type UploadResult };
|