@andrey4emk/npm-app-back-b24 3.8.1 → 3.8.2
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 -1
- package/bitrix24/eventB24.ts +18 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -500,7 +500,7 @@ const sent = await fetchWithTimeout("https://api.example.com/send", { method: "P
|
|
|
500
500
|
```
|
|
501
501
|
|
|
502
502
|
- **Особенности:**
|
|
503
|
-
-
|
|
503
|
+
- **Автоматически отбрасывает и очищает события пользователя 138** — владельца OAuth-токенов приложений. Это защита от петли: всё, что приложения сами пишут в B24, приходит событием с `user_id: '138'`, и без фильтра код обрабатывал бы собственные записи повторно. Оборотная сторона: ручные правки под этой же учёткой (администратор портала) тоже не возвращаются. **Для полной выгрузки всех изменений класс не подходит** — там читать `event.offline.get` напрямую.
|
|
504
504
|
- Для коннекторных событий конвертирует файлы в формат с типами `image`, `video`, `document`.
|
|
505
505
|
- Если событий нет, возвращает `data` с пустыми массивами.
|
|
506
506
|
- **Гранулярность очистки — запись очереди, а не сообщение.** Одна запись коннектора (один `MESSAGE_ID`) может нести несколько сообщений, и они приходят отдельными элементами `message` с одинаковым `messageId`. Очистка по этому ключу удаляет запись целиком: если из двух сообщений одной записи ушло одно, `clear()` заберёт и неотправленное. Строить поэлементную очистку с точностью до сообщения на `messageId` нельзя. Для дедупликации отдельных сообщений он не годится по той же причине — у сообщений одной записи он общий, для этого есть `im.id`. Обратная сторона: запись, из которой не разобрано ни одного сообщения, в `data.message` не попадёт вовсе, и очистка по собранным `messageId` её не заберёт. Безопасный режим — `clear(processId)` целиком.
|
package/bitrix24/eventB24.ts
CHANGED
|
@@ -71,7 +71,19 @@ interface OfflineEventsResponse {
|
|
|
71
71
|
|
|
72
72
|
// ==================== Константы ====================
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Пользователь, чьи события класс отбрасывает и сразу очищает из очереди.
|
|
76
|
+
*
|
|
77
|
+
* Это защита от петли, а не случайность: 138 — владелец OAuth-токенов приложений
|
|
78
|
+
* на портале, и всё, что приложения пишут в B24 (обновление сделки, комментарий,
|
|
79
|
+
* задача), приходит офлайн-событием с `user_id: "138"`. Без фильтра правка сделки
|
|
80
|
+
* кодом возвращалась бы событием в тот же код и обрабатывалась бы второй раз.
|
|
81
|
+
*
|
|
82
|
+
* Оборотная сторона: ручные правки под этой же учёткой (это администратор портала)
|
|
83
|
+
* тоже пропадают. Поэтому класс не годится для задач полной выгрузки или витрин,
|
|
84
|
+
* где нужны все изменения без исключения — там читать `event.offline.get` напрямую
|
|
85
|
+
*/
|
|
86
|
+
const SYSTEM_USER_ID = "138";
|
|
75
87
|
|
|
76
88
|
// ==================== Утилиты ====================
|
|
77
89
|
|
|
@@ -173,6 +185,11 @@ export class Event {
|
|
|
173
185
|
* (пустой или битый `MESSAGES`), в `data.message` не попадает вовсе — очистка
|
|
174
186
|
* по собранным `messageId` её не заберёт, и она останется зарезервированной
|
|
175
187
|
* под тем же `process_id`. Безопасный режим — `clear(processId)` целиком.
|
|
188
|
+
*
|
|
189
|
+
* События пользователя `SYSTEM_USER_ID` (138, владелец токенов приложений)
|
|
190
|
+
* отбрасываются и очищаются здесь же — защита от петли «приложение записало →
|
|
191
|
+
* событие → приложение обработало свою же запись». Для полной выгрузки всех
|
|
192
|
+
* изменений класс не подходит, см. комментарий у константы.
|
|
176
193
|
*/
|
|
177
194
|
async get(eventName: string): Promise<StandardResult> {
|
|
178
195
|
try {
|