@ihazz/bitrix24 1.1.9 → 1.1.11

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.
@@ -95,7 +95,8 @@ export class PollingService {
95
95
 
96
96
  /**
97
97
  * Start the blocking polling loop.
98
- * Uses imbot.v2.Event.get which returns { events, lastEventId, hasMore }.
98
+ * Uses imbot.v2.Event.get which returns { events, nextOffset, hasMore }.
99
+ * Older payloads may still include lastEventId, so we tolerate both shapes.
99
100
  */
100
101
  async start(): Promise<void> {
101
102
  this.offset = await this.loadOffset();
@@ -115,7 +116,12 @@ export class PollingService {
115
116
  backoff.reset();
116
117
  this.rateLimitStreak = 0;
117
118
 
118
- const { events, lastEventId, hasMore } = result;
119
+ const {
120
+ events,
121
+ nextOffset: reportedNextOffset,
122
+ lastEventId,
123
+ hasMore,
124
+ } = result;
119
125
  let nextOffset = this.offset;
120
126
 
121
127
  // Process events sequentially
@@ -133,11 +139,15 @@ export class PollingService {
133
139
  }
134
140
  }
135
141
 
142
+ if (typeof reportedNextOffset === 'number' && reportedNextOffset >= 0) {
143
+ nextOffset = Math.max(nextOffset, reportedNextOffset);
144
+ }
145
+
136
146
  // Advance offset only for events that were processed successfully.
137
- if (events.length > 0 && nextOffset > this.offset) {
147
+ if (nextOffset > this.offset) {
138
148
  this.offset = nextOffset;
139
149
  await this.persistOffset(this.offset);
140
- } else if (events.length > 0 && lastEventId < this.offset) {
150
+ } else if (events.length > 0 && typeof lastEventId === 'number' && lastEventId < this.offset) {
141
151
  this.logger.warn('Polling: lastEventId regressed', {
142
152
  lastEventId,
143
153
  currentOffset: this.offset,
@@ -162,6 +172,16 @@ export class PollingService {
162
172
  throw err;
163
173
  }
164
174
 
175
+ if (err.code === 'HTTP_404' && this.offset > 0) {
176
+ this.logger.warn('Polling offset is no longer valid, resetting to 0 after HTTP 404', {
177
+ previousOffset: this.offset,
178
+ });
179
+ this.offset = 0;
180
+ await this.persistOffset(this.offset);
181
+ backoff.reset();
182
+ continue;
183
+ }
184
+
165
185
  // Rate limit — short pause without exponential backoff
166
186
  if (err.code === RATE_LIMIT_CODE) {
167
187
  this.rateLimitStreak++;
@@ -38,7 +38,12 @@ export class SendService {
38
38
  async sendText(
39
39
  ctx: SendContext,
40
40
  text: string,
41
- options?: { keyboard?: B24Keyboard; convertMarkdown?: boolean; forwardMessages?: number[] },
41
+ options?: {
42
+ keyboard?: B24Keyboard;
43
+ convertMarkdown?: boolean;
44
+ forwardMessages?: number[];
45
+ system?: boolean;
46
+ },
42
47
  ): Promise<SendMessageResult> {
43
48
  const convertedText = options?.convertMarkdown !== false
44
49
  ? markdownToBbCode(text)
@@ -54,6 +59,7 @@ export class SendService {
54
59
  const msgOptions: {
55
60
  keyboard?: B24Keyboard;
56
61
  forwardMessages?: number[];
62
+ system?: boolean;
57
63
  } = {};
58
64
 
59
65
  if (isLast && options?.keyboard) {
@@ -62,6 +68,9 @@ export class SendService {
62
68
  if (isFirst && options?.forwardMessages?.length) {
63
69
  msgOptions.forwardMessages = options.forwardMessages;
64
70
  }
71
+ if (options?.system !== undefined) {
72
+ msgOptions.system = options.system;
73
+ }
65
74
 
66
75
  try {
67
76
  lastMessageId = await this.api.sendMessage(
package/src/types.ts CHANGED
@@ -208,7 +208,8 @@ export interface B24V2FetchEventItem {
208
208
  /** Response from imbot.v2.Event.get */
209
209
  export interface B24V2EventGetResult {
210
210
  events: B24V2FetchEventItem[];
211
- lastEventId: number;
211
+ nextOffset?: number;
212
+ lastEventId?: number;
212
213
  hasMore: boolean;
213
214
  }
214
215