@imessaging/core 0.4.0 → 0.6.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/package.json +1 -1
- package/src/index.ts +17 -1
- package/src/types.ts +110 -0
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
export { MemoryPeerStore } from "./memory-peer-store";
|
|
2
2
|
export { createPeerKey } from "./peer-key";
|
|
3
|
-
export {
|
|
3
|
+
export {
|
|
4
|
+
canEdit,
|
|
5
|
+
canMarkRead,
|
|
6
|
+
canReceive,
|
|
7
|
+
canShowTyping,
|
|
8
|
+
hasCommandMenu,
|
|
9
|
+
isTelegramRecipient,
|
|
10
|
+
} from "./types";
|
|
4
11
|
export type { ButtonPress, ButtonPressTransport } from "./types";
|
|
12
|
+
export type {
|
|
13
|
+
ChannelCommand,
|
|
14
|
+
CommandMenuTransport,
|
|
15
|
+
IncomingAttachment,
|
|
16
|
+
IncomingMessage,
|
|
17
|
+
IncomingMessageTransport,
|
|
18
|
+
ReadReceiptTransport,
|
|
19
|
+
TypingTransport,
|
|
20
|
+
} from "./types";
|
|
5
21
|
export type {
|
|
6
22
|
EditableMessage,
|
|
7
23
|
EditableMessageTransport,
|
package/src/types.ts
CHANGED
|
@@ -152,6 +152,14 @@ export interface TelegramPeerStore {
|
|
|
152
152
|
export type ButtonPress = {
|
|
153
153
|
/** Кто нажал. `null` — отправитель неизвестен каналу. */
|
|
154
154
|
senderId: number | null;
|
|
155
|
+
/**
|
|
156
|
+
* В каком чате нажали. `undefined` — канал чата не назвал.
|
|
157
|
+
*
|
|
158
|
+
* Нужен затем, что нажатие и сообщение одного чата обязаны исполняться по очереди: карточка
|
|
159
|
+
* живёт в чате, и ответ на кнопку, обогнавший идущий ответ агента, приходит человеку раньше того,
|
|
160
|
+
* на что он отвечает. По одному отправителю это не построить — в группе он не равен чату.
|
|
161
|
+
*/
|
|
162
|
+
chatId?: string;
|
|
155
163
|
data: string;
|
|
156
164
|
/**
|
|
157
165
|
* Подтвердить нажатие, показав человеку текст.
|
|
@@ -172,3 +180,105 @@ export interface ButtonPressTransport {
|
|
|
172
180
|
/** Подписаться на нажатия. Возврат — функция отписки. */
|
|
173
181
|
onButtonPress(handler: (press: ButtonPress) => void | Promise<void>): () => void;
|
|
174
182
|
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Вложение входящего сообщения.
|
|
186
|
+
*
|
|
187
|
+
* Только описание: байты достаёт транспорт (`download`), потому что адрес файла у каждого канала
|
|
188
|
+
* свой и живёт он вместе с учёткой, а не с сообщением.
|
|
189
|
+
*/
|
|
190
|
+
export type IncomingAttachment = {
|
|
191
|
+
/** Идентификатор файла В КАНАЛЕ. Смысла вне своего транспорта не имеет. */
|
|
192
|
+
id: string;
|
|
193
|
+
filename: string;
|
|
194
|
+
mimeType?: string;
|
|
195
|
+
sizeBytes?: number;
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Входящее сообщение — общий вид для всех каналов.
|
|
200
|
+
*
|
|
201
|
+
* `transportId` и `accountId` входят В САМО сообщение, а не подставляются потребителем: один
|
|
202
|
+
* продукт слушает несколько учёток сразу, и `chatId` уникален только внутри пары «канал + учётка».
|
|
203
|
+
*/
|
|
204
|
+
export type IncomingMessage = {
|
|
205
|
+
transportId: string;
|
|
206
|
+
accountId: string;
|
|
207
|
+
chatId: string;
|
|
208
|
+
chatType: "user" | "group" | "channel";
|
|
209
|
+
/** Кто написал. `null` — канал отправителя не называет (рассылка, служебное событие). */
|
|
210
|
+
senderId: string | null;
|
|
211
|
+
senderUsername?: string;
|
|
212
|
+
messageId: string;
|
|
213
|
+
text: string;
|
|
214
|
+
attachments: IncomingAttachment[];
|
|
215
|
+
replyToMessageId?: string;
|
|
216
|
+
threadId?: number;
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Канал, умеющий ПРИНИМАТЬ сообщения.
|
|
221
|
+
*
|
|
222
|
+
* Отдельно от `MessageTransport` по той же причине, что и `ButtonPressTransport`: принимать умеет
|
|
223
|
+
* не всякий канал — почте это несвойственно вовсе, — и обещать приём всем транспортам значит
|
|
224
|
+
* заставить половину из них объяснять пустоту.
|
|
225
|
+
*/
|
|
226
|
+
export interface IncomingMessageTransport extends MessageTransport {
|
|
227
|
+
/** Подписаться на входящие. Возврат — функция отписки. */
|
|
228
|
+
onMessage(handler: (message: IncomingMessage) => void | Promise<void>): () => void;
|
|
229
|
+
/** Байты вложения. Отдельным вызовом: скачивать всё подряд дороже, чем разобрать текст. */
|
|
230
|
+
download(attachment: IncomingAttachment): Promise<Uint8Array>;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export function canReceive(transport: MessageTransport): transport is IncomingMessageTransport {
|
|
234
|
+
return typeof (transport as IncomingMessageTransport).onMessage === "function";
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** Пункт меню команд канала: `/menu` и подпись рядом с ним. */
|
|
238
|
+
export type ChannelCommand = {
|
|
239
|
+
/** Без ведущей косой черты. */
|
|
240
|
+
command: string;
|
|
241
|
+
description: string;
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Канал с меню команд.
|
|
246
|
+
*
|
|
247
|
+
* Нужен ровно затем, чтобы продукт не звал Bot API мимо транспорта: меню — свойство канала, а не
|
|
248
|
+
* сообщения, и без него единственным способом убрать постоянную клавиатуру был бы прямой вызов.
|
|
249
|
+
*/
|
|
250
|
+
export interface CommandMenuTransport extends MessageTransport {
|
|
251
|
+
setCommands(commands: ChannelCommand[]): Promise<void>;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export function hasCommandMenu(transport: MessageTransport): transport is CommandMenuTransport {
|
|
255
|
+
return typeof (transport as CommandMenuTransport).setCommands === "function";
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Канал, умеющий показать «печатает…».
|
|
260
|
+
*
|
|
261
|
+
* Не украшение: ход агента занимает секунды, и без признака работы человек пишет второй раз.
|
|
262
|
+
*/
|
|
263
|
+
export interface TypingTransport extends MessageTransport {
|
|
264
|
+
typing(recipient: MessageRecipient): Promise<void>;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export function canShowTyping(transport: MessageTransport): transport is TypingTransport {
|
|
268
|
+
return typeof (transport as TypingTransport).typing === "function";
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Канал, умеющий отметить сообщение прочитанным.
|
|
273
|
+
*
|
|
274
|
+
* Не украшение: пока отметки нет, у собеседника горит непрочитанное, а у бота или учётной записи
|
|
275
|
+
* копится счётчик, по которому потом не отличить обработанное от пропущенного.
|
|
276
|
+
*/
|
|
277
|
+
export interface ReadReceiptTransport extends MessageTransport {
|
|
278
|
+
/** Отметить прочитанным всё до `messageId` включительно. */
|
|
279
|
+
markRead(recipient: MessageRecipient, messageId: string): Promise<void>;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export function canMarkRead(transport: MessageTransport): transport is ReadReceiptTransport {
|
|
283
|
+
return typeof (transport as ReadReceiptTransport).markRead === "function";
|
|
284
|
+
}
|