@webitel/chat-web-sdk 0.0.0
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/README.md +1 -0
- package/dist/index.d.ts +131 -0
- package/dist/index.js +284 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# chat-sdk-web
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import * as _webitel_api_services_gen_models from '@webitel/api-services/gen/models';
|
|
2
|
+
import { WebitelImApiGatewayV1HistoryMessage, WebitelImApiGatewayV1Thread, MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams, WebitelImApiGatewayV1SearchMessageHistoryResponse, ThreadManagementSearchParams, ContactsSearchParams, WebitelImApiGatewayV1Contact } from '@webitel/api-services/gen/models';
|
|
3
|
+
export { WebitelImApiGatewayV1Contact as ContactModel, WebitelImApiGatewayV1HistoryMessage as MessageModel, WebitelImApiGatewayV1Thread as ThreadModel } from '@webitel/api-services/gen/models';
|
|
4
|
+
import { AxiosInstance } from 'axios';
|
|
5
|
+
|
|
6
|
+
type ServiceConfigInputSchema = {
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
accessToken: string | (() => string) | (() => Promise<string>);
|
|
9
|
+
};
|
|
10
|
+
declare class ServiceConfig implements ServiceConfigInputSchema {
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
accessToken: string | (() => string) | (() => Promise<string>);
|
|
13
|
+
axiosInstance: AxiosInstance;
|
|
14
|
+
constructor({ baseUrl, accessToken, }: ServiceConfigInputSchema);
|
|
15
|
+
setupAxiosTokenHandler(): void;
|
|
16
|
+
}
|
|
17
|
+
declare function createServiceConfig(rawServiceConfig: ServiceConfigInputSchema): ServiceConfig;
|
|
18
|
+
|
|
19
|
+
type SocketConfigInputSchema = {
|
|
20
|
+
baseUrl: string;
|
|
21
|
+
accessToken: string | (() => string) | (() => Promise<string>);
|
|
22
|
+
};
|
|
23
|
+
declare class SocketConfig implements SocketConfigInputSchema {
|
|
24
|
+
baseUrl: string;
|
|
25
|
+
accessToken: string | (() => string) | (() => Promise<string>);
|
|
26
|
+
constructor({ baseUrl, accessToken, }: SocketConfigInputSchema);
|
|
27
|
+
}
|
|
28
|
+
declare function createSocketConfig(rawSocketConfig: SocketConfigInputSchema): SocketConfig;
|
|
29
|
+
|
|
30
|
+
interface IMessage extends WebitelImApiGatewayV1HistoryMessage {
|
|
31
|
+
markRead: () => Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* API response with `messages` replaced by instantiated SDK `Message` classes.
|
|
36
|
+
*/
|
|
37
|
+
type ThreadMessageHistoryResult = Omit<WebitelImApiGatewayV1SearchMessageHistoryResponse, 'messages'> & {
|
|
38
|
+
messages: IMessage[];
|
|
39
|
+
};
|
|
40
|
+
interface IThread extends WebitelImApiGatewayV1Thread {
|
|
41
|
+
fetchMessageHistory: (config: ServiceConfig, params?: MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams) => Promise<ThreadMessageHistoryResult>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
declare function useThreadsService(config: ServiceConfig): {
|
|
45
|
+
fetchThreads: (params?: ThreadManagementSearchParams) => Promise<{
|
|
46
|
+
threads: {
|
|
47
|
+
id?: string;
|
|
48
|
+
fetchMessageHistory(config: ServiceConfig, params?: _webitel_api_services_gen_models.MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams): Promise<{
|
|
49
|
+
messages: {
|
|
50
|
+
markRead(): Promise<void>;
|
|
51
|
+
}[];
|
|
52
|
+
from?: _webitel_api_services_gen_models.WebitelImApiGatewayV1MessageParticipant[];
|
|
53
|
+
next?: boolean;
|
|
54
|
+
nextCursor?: _webitel_api_services_gen_models.WebitelImApiGatewayV1HistoryMessageCursor;
|
|
55
|
+
paging?: _webitel_api_services_gen_models.WebitelImApiGatewayV1Paging;
|
|
56
|
+
}>;
|
|
57
|
+
}[];
|
|
58
|
+
next?: boolean;
|
|
59
|
+
}>;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
declare function useContactsService(config: ServiceConfig): {
|
|
63
|
+
fetchContacts: (params?: ContactsSearchParams) => Promise<{
|
|
64
|
+
items: {
|
|
65
|
+
sendMessage(): Promise<void>;
|
|
66
|
+
}[];
|
|
67
|
+
next?: boolean;
|
|
68
|
+
page?: number;
|
|
69
|
+
size?: number;
|
|
70
|
+
}>;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
interface IContact extends WebitelImApiGatewayV1Contact {
|
|
74
|
+
sendMessage: () => {};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
declare function useMessagesService(config: ServiceConfig): {
|
|
78
|
+
fetchMessageHistory: (threadId: string, params?: MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams) => Promise<{
|
|
79
|
+
messages: {
|
|
80
|
+
markRead(): Promise<void>;
|
|
81
|
+
}[];
|
|
82
|
+
from?: _webitel_api_services_gen_models.WebitelImApiGatewayV1MessageParticipant[];
|
|
83
|
+
next?: boolean;
|
|
84
|
+
nextCursor?: _webitel_api_services_gen_models.WebitelImApiGatewayV1HistoryMessageCursor;
|
|
85
|
+
paging?: _webitel_api_services_gen_models.WebitelImApiGatewayV1Paging;
|
|
86
|
+
}>;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* @see https://github.com/webitel/im-delivery-service/blob/main/api/asyncapi/asyncapi.yaml#L56
|
|
91
|
+
*/
|
|
92
|
+
declare const ChatsSocketMessage: {
|
|
93
|
+
readonly Connected: "connected";
|
|
94
|
+
readonly Disconnected: "disconnected";
|
|
95
|
+
readonly Error: "error";
|
|
96
|
+
readonly ThreadMessage: "message";
|
|
97
|
+
readonly ThreadCreated: "thread_created";
|
|
98
|
+
};
|
|
99
|
+
type ChatsSocketMessage = (typeof ChatsSocketMessage)[keyof typeof ChatsSocketMessage];
|
|
100
|
+
|
|
101
|
+
declare const SocketClientConnectionStatus: {
|
|
102
|
+
readonly Idle: "idle";
|
|
103
|
+
readonly Connecting: "connecting";
|
|
104
|
+
readonly Connected: "connected";
|
|
105
|
+
readonly Disconnected: "disconnected";
|
|
106
|
+
readonly Error: "error";
|
|
107
|
+
};
|
|
108
|
+
type SocketClientConnectionStatus = (typeof SocketClientConnectionStatus)[keyof typeof SocketClientConnectionStatus];
|
|
109
|
+
|
|
110
|
+
interface IChatsSocketClient {
|
|
111
|
+
connect: () => Promise<void>;
|
|
112
|
+
disconnect: () => void;
|
|
113
|
+
reconnect: () => Promise<void>;
|
|
114
|
+
on: (event: ChatsSocketMessage, callback: IChatsSocketClientEventSubscriber) => void;
|
|
115
|
+
}
|
|
116
|
+
type IChatsSocketClientEventSubscriber = (data: unknown) => unknown;
|
|
117
|
+
declare class ChatsSocketClient implements IChatsSocketClient {
|
|
118
|
+
private config;
|
|
119
|
+
private emitter;
|
|
120
|
+
private ws;
|
|
121
|
+
private wsConnectionState;
|
|
122
|
+
constructor(config: SocketConfig);
|
|
123
|
+
get connectionState(): SocketClientConnectionStatus;
|
|
124
|
+
connect(): Promise<void>;
|
|
125
|
+
reconnect(): Promise<void>;
|
|
126
|
+
disconnect(): Promise<void>;
|
|
127
|
+
on(event: ChatsSocketMessage, callback: IChatsSocketClientEventSubscriber): void;
|
|
128
|
+
}
|
|
129
|
+
declare function createChatsSocketClient(config: SocketConfig): ChatsSocketClient;
|
|
130
|
+
|
|
131
|
+
export { ChatsSocketMessage, type IContact, type IMessage, type IThread, ServiceConfig, type ServiceConfigInputSchema, SocketConfig, type SocketConfigInputSchema, type ThreadMessageHistoryResult, createChatsSocketClient, createServiceConfig, createSocketConfig, useContactsService, useMessagesService, useThreadsService };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import mitt from 'mitt';
|
|
3
|
+
|
|
4
|
+
// src/modules/threads/api/Threads.api.ts
|
|
5
|
+
var getThreadsService = ({ axiosInstance }) => {
|
|
6
|
+
return {
|
|
7
|
+
getThreadsList: async (params = {}) => {
|
|
8
|
+
const response = await axiosInstance.get("/v1/threads", { params });
|
|
9
|
+
return response.data;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// src/modules/messages/api/Messages.api.ts
|
|
15
|
+
var getMessagesService = ({ axiosInstance }) => {
|
|
16
|
+
return {
|
|
17
|
+
getMessageHistory: async (threadId, params = {}) => {
|
|
18
|
+
const response = await axiosInstance.get(`/v1/${threadId}/messages`, { params });
|
|
19
|
+
return response.data;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// src/modules/messages/classes/Message.class.ts
|
|
25
|
+
var Message = class {
|
|
26
|
+
constructor(rawMessage) {
|
|
27
|
+
Object.assign(this, rawMessage);
|
|
28
|
+
}
|
|
29
|
+
async markRead() {
|
|
30
|
+
throw new Error("Method not implemented.");
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
function createMessage(rawMessage) {
|
|
34
|
+
return new Message(rawMessage);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// src/modules/messages/utils/fetchMessageHistory.ts
|
|
38
|
+
var fetchRawMessageHistory = (config) => async (threadId, params = {}) => {
|
|
39
|
+
const response = await getMessagesService(config).getMessageHistory(threadId, params);
|
|
40
|
+
return response;
|
|
41
|
+
};
|
|
42
|
+
var instantiateMessages = (rawMessages) => {
|
|
43
|
+
return rawMessages.map((rawMessage) => createMessage(rawMessage));
|
|
44
|
+
};
|
|
45
|
+
var fetchMessageHistory = async (config, threadId, params = {}) => {
|
|
46
|
+
const rawResponse = await fetchRawMessageHistory(config)(threadId, params);
|
|
47
|
+
return {
|
|
48
|
+
...rawResponse,
|
|
49
|
+
messages: instantiateMessages(rawResponse.messages ?? [])
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// src/modules/messages/messagesSevice.ts
|
|
54
|
+
function useMessagesService(config) {
|
|
55
|
+
return {
|
|
56
|
+
fetchMessageHistory: (threadId, params) => fetchMessageHistory(config, threadId, params ?? {})
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// src/modules/threads/classes/Thread.class.ts
|
|
61
|
+
var Thread = class {
|
|
62
|
+
id;
|
|
63
|
+
constructor(rawThread) {
|
|
64
|
+
Object.assign(this, rawThread);
|
|
65
|
+
}
|
|
66
|
+
async fetchMessageHistory(config, params) {
|
|
67
|
+
if (!this.id) {
|
|
68
|
+
throw new Error("Thread id is required to fetch message history");
|
|
69
|
+
}
|
|
70
|
+
return fetchMessageHistory(config, this.id, params);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
function createThread(rawThread) {
|
|
74
|
+
return new Thread(rawThread);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// src/modules/threads/utils/fetchThreads.ts
|
|
78
|
+
var fetchRawThreads = (config) => async (params = {}) => {
|
|
79
|
+
const response = await getThreadsService(config).getThreadsList(params);
|
|
80
|
+
return response;
|
|
81
|
+
};
|
|
82
|
+
var instantiateThreads = (rawThreads) => {
|
|
83
|
+
return rawThreads.map((rawThread) => createThread(rawThread));
|
|
84
|
+
};
|
|
85
|
+
var fetchThreads = async (config, params = {}) => {
|
|
86
|
+
const rawThreadsResponse = await fetchRawThreads(config)(params);
|
|
87
|
+
return {
|
|
88
|
+
...rawThreadsResponse,
|
|
89
|
+
threads: instantiateThreads(rawThreadsResponse.threads ?? [])
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// src/modules/threads/threadsSevice.ts
|
|
94
|
+
function useThreadsService(config) {
|
|
95
|
+
return {
|
|
96
|
+
fetchThreads: (params) => fetchThreads(config, params ?? {})
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// src/modules/contacts/api/Contacts.api.ts
|
|
101
|
+
var getContactsService = ({ axiosInstance }) => {
|
|
102
|
+
return {
|
|
103
|
+
getContactsList: async (params = {}) => {
|
|
104
|
+
const response = await axiosInstance.get("/v1/contacts", { params });
|
|
105
|
+
return response.data;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// src/modules/contacts/classes/Contact.class.ts
|
|
111
|
+
var Contact = class {
|
|
112
|
+
constructor(rawContact) {
|
|
113
|
+
Object.assign(this, rawContact);
|
|
114
|
+
}
|
|
115
|
+
async sendMessage() {
|
|
116
|
+
throw new Error("Method not implemented.");
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
function createContact(rawContact) {
|
|
120
|
+
return new Contact(rawContact);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// src/modules/contacts/utils/fetchContacts.ts
|
|
124
|
+
var fetchRawContacts = (config) => async (params = {}) => {
|
|
125
|
+
const response = await getContactsService(config).getContactsList(params);
|
|
126
|
+
return response;
|
|
127
|
+
};
|
|
128
|
+
var instantiateContacts = (rawContacts) => {
|
|
129
|
+
return rawContacts.map((rawContact) => createContact(rawContact));
|
|
130
|
+
};
|
|
131
|
+
var fetchContacts = async (config, params = {}) => {
|
|
132
|
+
const rawResponse = await fetchRawContacts(config)(params);
|
|
133
|
+
return {
|
|
134
|
+
...rawResponse,
|
|
135
|
+
items: instantiateContacts(rawResponse.items ?? [])
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// src/modules/contacts/contactsSevice.ts
|
|
140
|
+
function useContactsService(config) {
|
|
141
|
+
return {
|
|
142
|
+
fetchContacts: (params) => fetchContacts(config, params ?? {})
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
var ServiceConfig = class {
|
|
146
|
+
baseUrl;
|
|
147
|
+
accessToken;
|
|
148
|
+
axiosInstance;
|
|
149
|
+
constructor({
|
|
150
|
+
baseUrl,
|
|
151
|
+
accessToken
|
|
152
|
+
}) {
|
|
153
|
+
this.baseUrl = baseUrl;
|
|
154
|
+
this.accessToken = accessToken;
|
|
155
|
+
this.axiosInstance = axios.create({
|
|
156
|
+
baseURL: this.baseUrl
|
|
157
|
+
});
|
|
158
|
+
this.setupAxiosTokenHandler();
|
|
159
|
+
}
|
|
160
|
+
setupAxiosTokenHandler() {
|
|
161
|
+
if (typeof this.accessToken === "function") {
|
|
162
|
+
this.axiosInstance.interceptors.request.use(async (config) => {
|
|
163
|
+
config.headers["X-Webitel-Access"] = await this.accessToken();
|
|
164
|
+
return config;
|
|
165
|
+
});
|
|
166
|
+
} else {
|
|
167
|
+
this.axiosInstance.defaults.headers.common["X-Webitel-Access"] = this.accessToken;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
function createServiceConfig(rawServiceConfig) {
|
|
172
|
+
return new ServiceConfig(rawServiceConfig);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// src/modules/configs/socketConfig/SocketConfig.class.ts
|
|
176
|
+
var SocketConfig = class {
|
|
177
|
+
baseUrl;
|
|
178
|
+
accessToken;
|
|
179
|
+
constructor({
|
|
180
|
+
baseUrl,
|
|
181
|
+
accessToken
|
|
182
|
+
}) {
|
|
183
|
+
this.baseUrl = baseUrl;
|
|
184
|
+
this.accessToken = accessToken;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
function createSocketConfig(rawSocketConfig) {
|
|
188
|
+
return new SocketConfig(rawSocketConfig);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// src/modules/socket/enums/ChatsSocketMessage.enum.ts
|
|
192
|
+
var ChatsSocketMessage = {
|
|
193
|
+
Connected: "connected",
|
|
194
|
+
Disconnected: "disconnected",
|
|
195
|
+
Error: "error",
|
|
196
|
+
ThreadMessage: "message",
|
|
197
|
+
ThreadCreated: "thread_created"
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
// src/modules/socket/enums/SocketClientConnectionStatus.enum.ts
|
|
201
|
+
var SocketClientConnectionStatus = {
|
|
202
|
+
Idle: "idle",
|
|
203
|
+
Connecting: "connecting",
|
|
204
|
+
Connected: "connected",
|
|
205
|
+
Disconnected: "disconnected",
|
|
206
|
+
Error: "error"
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
// src/modules/socket/utils/getSocketMessageNameFromEvent.ts
|
|
210
|
+
var wireToGetter = {
|
|
211
|
+
[ChatsSocketMessage.Connected]: (e) => e.connected,
|
|
212
|
+
[ChatsSocketMessage.Disconnected]: (e) => e.disconnected,
|
|
213
|
+
[ChatsSocketMessage.Error]: (e) => e.error,
|
|
214
|
+
[ChatsSocketMessage.ThreadMessage]: (e) => e.message,
|
|
215
|
+
[ChatsSocketMessage.ThreadCreated]: (e) => e.threadCreated
|
|
216
|
+
};
|
|
217
|
+
function getSocketMessageNameFromEvent(sourceEvent) {
|
|
218
|
+
for (const value of Object.values(ChatsSocketMessage)) {
|
|
219
|
+
const get = wireToGetter[value];
|
|
220
|
+
if (get?.(sourceEvent)) {
|
|
221
|
+
return value;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
throw new Error(`Unknown event: ${JSON.stringify(sourceEvent)}`);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// src/modules/socket/classes/ChatsSoketClient.ts
|
|
228
|
+
var ChatsSocketClient = class {
|
|
229
|
+
constructor(config) {
|
|
230
|
+
this.config = config;
|
|
231
|
+
}
|
|
232
|
+
emitter = mitt();
|
|
233
|
+
ws = null;
|
|
234
|
+
wsConnectionState = SocketClientConnectionStatus.Idle;
|
|
235
|
+
get connectionState() {
|
|
236
|
+
return this.wsConnectionState;
|
|
237
|
+
}
|
|
238
|
+
async connect() {
|
|
239
|
+
this.wsConnectionState = SocketClientConnectionStatus.Connecting;
|
|
240
|
+
const ws = new WebSocket(new URL(this.config.baseUrl).toString());
|
|
241
|
+
this.ws = ws;
|
|
242
|
+
setTimeout(() => {
|
|
243
|
+
ws.send(
|
|
244
|
+
JSON.stringify({
|
|
245
|
+
"x-webitel-access": this.config.accessToken
|
|
246
|
+
})
|
|
247
|
+
);
|
|
248
|
+
}, 1e3);
|
|
249
|
+
this.ws.onopen = () => {
|
|
250
|
+
this.wsConnectionState = SocketClientConnectionStatus.Connected;
|
|
251
|
+
};
|
|
252
|
+
this.ws.onerror = () => {
|
|
253
|
+
this.wsConnectionState = SocketClientConnectionStatus.Error;
|
|
254
|
+
};
|
|
255
|
+
this.ws.onclose = () => {
|
|
256
|
+
this.wsConnectionState = SocketClientConnectionStatus.Disconnected;
|
|
257
|
+
this.ws = null;
|
|
258
|
+
};
|
|
259
|
+
this.ws.onmessage = (event) => {
|
|
260
|
+
const data = JSON.parse(event.data);
|
|
261
|
+
const eventName = getSocketMessageNameFromEvent(data);
|
|
262
|
+
const processEvent = (event2) => event2;
|
|
263
|
+
this.emitter.emit(eventName, processEvent(data));
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
async reconnect() {
|
|
267
|
+
throw new Error("Not implemented");
|
|
268
|
+
}
|
|
269
|
+
async disconnect() {
|
|
270
|
+
this.ws?.close();
|
|
271
|
+
this.wsConnectionState = SocketClientConnectionStatus.Disconnected;
|
|
272
|
+
this.ws = null;
|
|
273
|
+
}
|
|
274
|
+
on(event, callback) {
|
|
275
|
+
this.emitter.on(event, callback);
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
function createChatsSocketClient(config) {
|
|
279
|
+
return new ChatsSocketClient(config);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export { ChatsSocketMessage, createChatsSocketClient, createServiceConfig, createSocketConfig, useContactsService, useMessagesService, useThreadsService };
|
|
283
|
+
//# sourceMappingURL=index.js.map
|
|
284
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/threads/api/Threads.api.ts","../src/modules/messages/api/Messages.api.ts","../src/modules/messages/classes/Message.class.ts","../src/modules/messages/utils/fetchMessageHistory.ts","../src/modules/messages/messagesSevice.ts","../src/modules/threads/classes/Thread.class.ts","../src/modules/threads/utils/fetchThreads.ts","../src/modules/threads/threadsSevice.ts","../src/modules/contacts/api/Contacts.api.ts","../src/modules/contacts/classes/Contact.class.ts","../src/modules/contacts/utils/fetchContacts.ts","../src/modules/contacts/contactsSevice.ts","../src/modules/configs/serviceConfig/ServiceConfig.class.ts","../src/modules/configs/socketConfig/SocketConfig.class.ts","../src/modules/socket/enums/ChatsSocketMessage.enum.ts","../src/modules/socket/enums/SocketClientConnectionStatus.enum.ts","../src/modules/socket/utils/getSocketMessageNameFromEvent.ts","../src/modules/socket/classes/ChatsSoketClient.ts"],"names":["event"],"mappings":"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","file":"index.js","sourcesContent":["import type { ServiceConfig } from '../../configs';\nimport type {\n ThreadManagementSearchParams,\n WebitelImApiGatewayV1SearchThreadResponse,\n} from '@webitel/api-services/gen/models';\n\nexport const getThreadsService = ({ axiosInstance }: ServiceConfig) => {\n return {\n getThreadsList: async (params: ThreadManagementSearchParams = {}): Promise<WebitelImApiGatewayV1SearchThreadResponse> => {\n const response = await axiosInstance.get('/v1/threads', { params });\n return response.data;\n },\n };\n};\n","import type { ServiceConfig } from '../../configs';\nimport type {\n MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams,\n WebitelImApiGatewayV1SearchMessageHistoryResponse,\n} from '@webitel/api-services/gen/models';\n\n/**\n * Message history for a thread: `GET /v1/{threadId}/messages`\n * @see webitel-im-api-gateway-v1-messagehistory\n */\nexport const getMessagesService = ({ axiosInstance }: ServiceConfig) => {\n return {\n getMessageHistory: async (\n threadId: string,\n params: MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams = {},\n ): Promise<WebitelImApiGatewayV1SearchMessageHistoryResponse> => {\n const response = await axiosInstance.get(`/v1/${threadId}/messages`, { params });\n return response.data;\n },\n };\n};\n","import type { MessageModel, IMessage } from '../types/Message.types';\n\nclass Message implements IMessage {\n constructor(rawMessage: MessageModel) {\n Object.assign(this, rawMessage);\n }\n\n async markRead(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n}\n\nexport function createMessage(rawMessage: MessageModel): Message {\n return new Message(rawMessage);\n}","import type {\n MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams,\n} from '@webitel/api-services/gen/models';\n\nimport type { ServiceConfig } from '../../configs';\nimport { getMessagesService } from '../api/Messages.api';\nimport { createMessage } from '../classes/Message.class';\nimport type { MessageModel } from '../types/Message.types';\n\nconst fetchRawMessageHistory = (config: ServiceConfig) => async (\n threadId: string,\n params: MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams = {},\n) => {\n const response = await getMessagesService(config).getMessageHistory(threadId, params);\n return response;\n};\n\nconst instantiateMessages = (rawMessages: MessageModel[]) => {\n return rawMessages.map((rawMessage) => createMessage(rawMessage));\n};\n\n/**\n * Fetches message history and returns `Message` class instances in `messages`.\n */\nconst fetchMessageHistory = async (\n config: ServiceConfig,\n threadId: string,\n params: MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams = {},\n) => {\n const rawResponse = await fetchRawMessageHistory(config)(threadId, params);\n return {\n ...rawResponse,\n messages: instantiateMessages(rawResponse.messages ?? []),\n };\n};\n\nexport {\n fetchRawMessageHistory,\n fetchMessageHistory,\n};\n","import type {\n MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams,\n} from '@webitel/api-services/gen/models';\n\nimport type { ServiceConfig } from '../configs';\nimport { fetchMessageHistory } from './utils/fetchMessageHistory';\n\nexport function useMessagesService(config: ServiceConfig) {\n return {\n fetchMessageHistory: (\n threadId: string,\n params?: MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams,\n ) => fetchMessageHistory(config, threadId, params ?? {}),\n };\n}\n","import type {\n MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams,\n} from '@webitel/api-services/gen/models';\n\nimport type { ServiceConfig } from '../../configs';\nimport { fetchMessageHistory } from '../../messages';\nimport type { ThreadModel, IThread } from '../types/Thread.types';\n\nclass Thread implements IThread {\n id?: string;\n\n constructor(rawThread: ThreadModel) {\n Object.assign(this, rawThread);\n }\n\n async fetchMessageHistory(\n config: ServiceConfig,\n params?: MessageHistorySearchThreadMessagesHistoryWebitelImApiGatewayV1MessageHistoryParams,\n ) {\n if (!this.id) {\n throw new Error('Thread id is required to fetch message history');\n }\n return fetchMessageHistory(config, this.id, params);\n }\n}\n\nexport function createThread(rawThread: ThreadModel): Thread {\n return new Thread(rawThread);\n}\n","import type { ThreadManagementSearchParams } from '@webitel/api-services/gen/models';\n\nimport type { ServiceConfig } from '../../configs';\nimport { getThreadsService } from '../api/Threads.api';\nimport { createThread } from '../classes/Thread.class';\nimport type { ThreadModel } from '../types/Thread.types';\n\n/**\n * Raw threads from `GET /v1/threads` (`WebitelImApiGatewayV1SearchThreadResponse.threads`).\n */\nconst fetchRawThreads = (config: ServiceConfig) => async (params: ThreadManagementSearchParams = {}) => {\n const response = await getThreadsService(config).getThreadsList(params);\n return response;\n};\n\nconst instantiateThreads = (rawThreads: ThreadModel[]) => {\n return rawThreads.map((rawThread) => createThread(rawThread));\n};\n\n/**\n * Fetches threads and returns `Thread` class instances.\n * Requires `ServiceConfig` (same pattern as `fetchContacts`).\n */\nconst fetchThreads = async (config: ServiceConfig, params: ThreadManagementSearchParams = {}) => {\n const rawThreadsResponse = await fetchRawThreads(config)(params);\n return {\n ...rawThreadsResponse,\n threads: instantiateThreads(rawThreadsResponse.threads ?? []),\n };\n};\n\nexport {\n fetchRawThreads,\n fetchThreads,\n};\n","import type { ThreadManagementSearchParams } from '@webitel/api-services/gen/models';\n\nimport type { ServiceConfig } from '../configs';\nimport { fetchThreads } from './utils/fetchThreads';\n\nexport function useThreadsService(config: ServiceConfig) {\n return {\n fetchThreads: (params?: ThreadManagementSearchParams) => fetchThreads(config, params ?? {}),\n };\n}\n","import type { ServiceConfig } from '../../configs';\nimport type {\n ContactsSearchParams,\n WebitelImApiGatewayV1ContactList,\n} from '@webitel/api-services/gen/models';\n\nexport const getContactsService = ({ axiosInstance }: ServiceConfig) => {\n return {\n getContactsList: async (params: ContactsSearchParams = {}): Promise<WebitelImApiGatewayV1ContactList> => {\n const response = await axiosInstance.get('/v1/contacts', { params });\n return response.data;\n },\n };\n};\n","import type { ContactModel, IContact } from '../types/Contact.types';\n\nclass Contact implements IContact {\n constructor(rawContact: ContactModel) {\n Object.assign(this, rawContact);\n }\n\n async sendMessage() {\n throw new Error('Method not implemented.');\n }\n}\n\nexport function createContact(rawContact: ContactModel): Contact {\n return new Contact(rawContact);\n}","import type { ContactsSearchParams } from '@webitel/api-services/gen/models';\n\nimport type { ServiceConfig } from '../../configs';\nimport { getContactsService } from '../api/Contacts.api';\nimport { createContact } from '../classes/Contact.class';\nimport type { ContactModel } from '../types/Contact.types';\n\nconst fetchRawContacts = (config: ServiceConfig) => async (params: ContactsSearchParams = {}) => {\n const response = await getContactsService(config).getContactsList(params);\n return response;\n};\n\nconst instantiateContacts = (rawContacts: ContactModel[]) => {\n return rawContacts.map((rawContact) => createContact(rawContact));\n};\n\n/**\n * Fetches contacts and returns `Contact` class instances in `items`.\n */\nconst fetchContacts = async (config: ServiceConfig, params: ContactsSearchParams = {}) => {\n const rawResponse = await fetchRawContacts(config)(params);\n return {\n ...rawResponse,\n items: instantiateContacts(rawResponse.items ?? []),\n };\n};\n\nexport {\n fetchRawContacts,\n fetchContacts,\n};\n","import type { ContactsSearchParams } from '@webitel/api-services/gen/models';\n\nimport type { ServiceConfig } from '../configs';\nimport { fetchContacts } from './utils/fetchContacts';\n\nexport function useContactsService(config: ServiceConfig) {\n return {\n fetchContacts: (params?: ContactsSearchParams) => fetchContacts(config, params ?? {}),\n };\n}\n","import axios, { type AxiosInstance } from 'axios';\n\nexport type ServiceConfigInputSchema = {\n baseUrl: string;\n accessToken: string | (() => string) | (() => Promise<string>);\n}\n\nexport class ServiceConfig implements ServiceConfigInputSchema {\n baseUrl: string;\n accessToken: string | (() => string) | (() => Promise<string>);\n\n axiosInstance: AxiosInstance;\n\n constructor({\n baseUrl,\n accessToken,\n }: ServiceConfigInputSchema) {\n this.baseUrl = baseUrl;\n this.accessToken = accessToken;\n\n this.axiosInstance = axios.create({\n baseURL: this.baseUrl,\n });\n\n this.setupAxiosTokenHandler();\n }\n\n setupAxiosTokenHandler() {\n if (typeof this.accessToken === 'function') {\n this.axiosInstance.interceptors.request.use(async (config) => {\n config.headers['X-Webitel-Access'] = await (this.accessToken as () => string)();\n return config;\n });\n } else {\n this.axiosInstance.defaults.headers.common['X-Webitel-Access'] = this.accessToken;\n }\n }\n}\n\nexport function createServiceConfig(rawServiceConfig: ServiceConfigInputSchema): ServiceConfig {\n return new ServiceConfig(rawServiceConfig);\n}","export type SocketConfigInputSchema = {\n baseUrl: string;\n accessToken: string | (() => string) | (() => Promise<string>);\n}\n\nexport class SocketConfig implements SocketConfigInputSchema {\n baseUrl: string;\n accessToken: string | (() => string) | (() => Promise<string>);\n\n constructor({\n baseUrl,\n accessToken,\n }: SocketConfigInputSchema) {\n this.baseUrl = baseUrl;\n this.accessToken = accessToken;\n }\n}\n\nexport function createSocketConfig(rawSocketConfig: SocketConfigInputSchema): SocketConfig {\n return new SocketConfig(rawSocketConfig);\n}","/**\n * @see https://github.com/webitel/im-delivery-service/blob/main/api/asyncapi/asyncapi.yaml#L56\n */\nexport const ChatsSocketMessage = {\n Connected: 'connected',\n Disconnected: 'disconnected',\n Error: 'error',\n ThreadMessage: 'message',\n ThreadCreated: 'thread_created',\n} as const;\n\nexport type ChatsSocketMessage = (typeof ChatsSocketMessage)[keyof typeof ChatsSocketMessage];","export const SocketClientConnectionStatus = {\n Idle: 'idle',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Error: 'error',\n} as const;\n\nexport type SocketClientConnectionStatus = (typeof SocketClientConnectionStatus)[keyof typeof SocketClientConnectionStatus];","import { EventPayload } from '../../../gen/ws/EventPayload';\nimport { ChatsSocketMessage } from '../enums/ChatsSocketMessage.enum';\n\nconst wireToGetter: Record<string, (e: EventPayload) => unknown> = {\n [ChatsSocketMessage.Connected]: (e) => e.connected,\n [ChatsSocketMessage.Disconnected]: (e) => e.disconnected,\n [ChatsSocketMessage.Error]: (e) => e.error,\n [ChatsSocketMessage.ThreadMessage]: (e) => e.message,\n [ChatsSocketMessage.ThreadCreated]: (e) => e.threadCreated,\n};\n\nexport function getSocketMessageNameFromEvent(sourceEvent: EventPayload): ChatsSocketMessage {\n for (const value of Object.values(ChatsSocketMessage)) {\n const get = wireToGetter[value];\n if (get?.(sourceEvent)) {\n return value;\n }\n }\n throw new Error(`Unknown event: ${JSON.stringify(sourceEvent)}`);\n}\n","import mitt from 'mitt';\n\nimport { EventPayload } from '../../../gen/ws/EventPayload';\nimport { ChatsSocketMessage } from '../enums/ChatsSocketMessage.enum';\nimport { SocketClientConnectionStatus } from '../enums/SocketClientConnectionStatus.enum';\nimport { getSocketMessageNameFromEvent } from '../utils/getSocketMessageNameFromEvent';\nimport type { SocketConfig } from '../../configs';\nimport type { ChatsSocketClientEventPayloadMap } from '../types/ChatsSocketClientEventsPayload.types';\n\nexport interface IChatsSocketClient {\n connect: () => Promise<void>;\n disconnect: () => void;\n reconnect: () => Promise<void>; // todo\n on: (event: ChatsSocketMessage, callback: IChatsSocketClientEventSubscriber) => void;\n};\n\nexport type IChatsSocketClientEventSubscriber = (\n data: unknown, // todo\n // rawData: EventPayload, // todo: should i emit raw data too ??\n) => unknown;\n\nclass ChatsSocketClient implements IChatsSocketClient {\n private emitter = mitt<ChatsSocketClientEventPayloadMap>();\n\n private ws: WebSocket | null = null;\n \n private wsConnectionState: SocketClientConnectionStatus = SocketClientConnectionStatus.Idle;\n\n constructor(private config: SocketConfig) {}\n \n get connectionState(): SocketClientConnectionStatus {\n return this.wsConnectionState;\n }\n\n async connect(): Promise<void> {\n this.wsConnectionState = SocketClientConnectionStatus.Connecting;\n const ws = new WebSocket(new URL(this.config.baseUrl).toString());\n this.ws = ws;\n setTimeout(() => {\n ws.send(\n JSON.stringify({\n 'x-webitel-access': this.config.accessToken,\n }),\n );\n }, 1000);\n this.ws.onopen = () => {\n this.wsConnectionState = SocketClientConnectionStatus.Connected;\n };\n this.ws.onerror = () => {\n this.wsConnectionState = SocketClientConnectionStatus.Error;\n };\n this.ws.onclose = () => {\n this.wsConnectionState = SocketClientConnectionStatus.Disconnected;\n this.ws = null;\n };\n this.ws.onmessage = (event) => {\n const data = JSON.parse(event.data) as EventPayload;\n\n const eventName = getSocketMessageNameFromEvent(data);\n const processEvent = (event: unknown) => event; // todo: implement event processing\n \n this.emitter.emit(eventName, processEvent(data));\n };\n }\n\n async reconnect(): Promise<void> {\n throw new Error('Not implemented');\n }\n\n async disconnect(): Promise<void> {\n this.ws?.close();\n this.wsConnectionState = SocketClientConnectionStatus.Disconnected;\n this.ws = null;\n }\n\n on(event: ChatsSocketMessage, callback: IChatsSocketClientEventSubscriber): void {\n this.emitter.on(event, callback);\n }\n}\n\nexport function createChatsSocketClient(config: SocketConfig): ChatsSocketClient {\n return new ChatsSocketClient(config);\n}"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webitel/chat-web-sdk",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"workspaces": [
|
|
6
|
+
"../../webitel-ui-sdk/packages/api-services"
|
|
7
|
+
],
|
|
8
|
+
"scripts": {
|
|
9
|
+
"dev": "vite",
|
|
10
|
+
"build": "tsc --noEmit && tsup",
|
|
11
|
+
"preview": "vite preview",
|
|
12
|
+
"gen:ws": "npx asyncapi generate models typescript https://raw.githubusercontent.com/webitel/im-delivery-service/refs/heads/main/api/asyncapi/asyncapi.yaml -o src/gen/ws --tsIncludeComments --tsExportType named"
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"tsup": "^8.5.1",
|
|
21
|
+
"@webitel/api-services": "^0.1.13",
|
|
22
|
+
"typescript": "~5.9.3",
|
|
23
|
+
"vite": "^8.x"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"axios": "^1.13.x",
|
|
27
|
+
"mitt": "^3.x"
|
|
28
|
+
},
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"import": "./dist/index.js"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|