@agentunion/fastaun-browser 0.5.9 → 0.5.10

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.
Files changed (50) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/_packed_docs/CHANGELOG.md +32 -0
  3. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +6 -5
  4. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +43 -8
  5. package/_packed_docs/sdk/09-group-rpc-manual.md +18 -3
  6. package/_packed_docs/sdk/09-message-rpc-manual.md +34 -10
  7. package/dist/agent-md.d.ts.map +1 -1
  8. package/dist/agent-md.js +23 -1
  9. package/dist/agent-md.js.map +1 -1
  10. package/dist/auth.d.ts.map +1 -1
  11. package/dist/auth.js +16 -2
  12. package/dist/auth.js.map +1 -1
  13. package/dist/bundle.js +812 -205
  14. package/dist/client/delivery.d.ts +23 -7
  15. package/dist/client/delivery.d.ts.map +1 -1
  16. package/dist/client/delivery.js +221 -80
  17. package/dist/client/delivery.js.map +1 -1
  18. package/dist/client/group-state.js +6 -6
  19. package/dist/client/group-state.js.map +1 -1
  20. package/dist/client/lifecycle.d.ts.map +1 -1
  21. package/dist/client/lifecycle.js +34 -38
  22. package/dist/client/lifecycle.js.map +1 -1
  23. package/dist/client/rpc-pipeline.d.ts +4 -0
  24. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  25. package/dist/client/rpc-pipeline.js +56 -2
  26. package/dist/client/rpc-pipeline.js.map +1 -1
  27. package/dist/client/v2-e2ee.d.ts +1 -1
  28. package/dist/client/v2-e2ee.d.ts.map +1 -1
  29. package/dist/client/v2-e2ee.js +22 -6
  30. package/dist/client/v2-e2ee.js.map +1 -1
  31. package/dist/client.d.ts +0 -1
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +23 -32
  34. package/dist/client.js.map +1 -1
  35. package/dist/events.d.ts +31 -2
  36. package/dist/events.d.ts.map +1 -1
  37. package/dist/events.js +167 -7
  38. package/dist/events.js.map +1 -1
  39. package/dist/register-flow.d.ts.map +1 -1
  40. package/dist/register-flow.js +16 -2
  41. package/dist/register-flow.js.map +1 -1
  42. package/dist/transport.d.ts +10 -1
  43. package/dist/transport.d.ts.map +1 -1
  44. package/dist/transport.js +283 -29
  45. package/dist/transport.js.map +1 -1
  46. package/dist/version.d.ts +1 -1
  47. package/dist/version.d.ts.map +1 -1
  48. package/dist/version.js +1 -1
  49. package/dist/version.js.map +1 -1
  50. package/package.json +1 -1
@@ -1,12 +1,20 @@
1
1
  import type { EventPayload } from '../events.js';
2
2
  import { type JsonObject, type Message, type RpcParams } from '../types.js';
3
3
  import type { ClientRuntime } from './runtime.js';
4
+ export type DeliveryChangeBatch = {
5
+ generation: number;
6
+ trigger: 'push' | 'inline_push';
7
+ changes: Map<string, number>;
8
+ closed: boolean;
9
+ };
4
10
  type GroupEventGapOptions = {
5
11
  afterSeq?: number;
6
12
  singlePage?: boolean;
7
13
  };
8
14
  export declare class MessageDeliveryEngine {
9
15
  private readonly runtime;
16
+ private pendingPullDeliveryChanges;
17
+ private deliveryGeneration;
10
18
  private realtimeTailResults;
11
19
  private realtimeSyncing;
12
20
  private pendingP2pPullUpper;
@@ -22,7 +30,7 @@ export declare class MessageDeliveryEngine {
22
30
  private seqTrackerWriteChain;
23
31
  constructor(runtime: ClientRuntime);
24
32
  resetInlineAckState(): void;
25
- private isInlineGenerationCurrent;
33
+ isInlineGenerationCurrent(generation: number): boolean;
26
34
  private isPullOperationCurrent;
27
35
  private ensurePullOperationCurrent;
28
36
  captureInlineGeneration(): number;
@@ -30,6 +38,14 @@ export declare class MessageDeliveryEngine {
30
38
  private endRealtimeSync;
31
39
  hasPendingPull(ns: string): boolean;
32
40
  onPullGateIdle(ns: string): void;
41
+ onPullWorkSettled(): void;
42
+ private deliveryChangeNamespace;
43
+ private isDeliverableMessageBody;
44
+ private recordDeliveryChange;
45
+ private deliveryChangesPayload;
46
+ private createDeliveryChangeBatch;
47
+ private flushRealtimeDeliveryChanges;
48
+ private flushPullDeliveryChanges;
33
49
  private recordPendingPull;
34
50
  private consumePendingPull;
35
51
  private markPendingPullNoProgress;
@@ -70,9 +86,9 @@ export declare class MessageDeliveryEngine {
70
86
  rawCount: number;
71
87
  publishedCount: number;
72
88
  }>;
73
- enqueueOrderedMessage(ns: string, event: string, seq: number, payload: EventPayload): void;
89
+ enqueueOrderedMessage(ns: string, event: string, seq: number, payload: EventPayload, source?: string): void;
74
90
  isGroupEventNamespace(ns: string): boolean;
75
- publishOrderedQueueItem(ns: string, event: string, seq: number, payload: EventPayload, pullResponse?: boolean): Promise<void>;
91
+ publishOrderedQueueItem(ns: string, event: string, seq: number, payload: EventPayload, pullResponse?: boolean, source?: string, batch?: DeliveryChangeBatch): Promise<void>;
76
92
  publishOrderedGroupChanged(payload: EventPayload): Promise<void>;
77
93
  isInstanceScopedMessageEvent(event: string): boolean;
78
94
  attachCurrentInstanceContext(payload: EventPayload): EventPayload;
@@ -98,7 +114,7 @@ export declare class MessageDeliveryEngine {
98
114
  groupRecallDedupKey(groupId: string, payload: JsonObject): string;
99
115
  publishGroupRecallTombstone(groupId: string, seq: unknown, message: EventPayload): Promise<boolean>;
100
116
  onRawGroupMessageRecalled(data: EventPayload): Promise<void>;
101
- publishAppEvent(event: string, payload: EventPayload): Promise<void>;
117
+ publishAppEvent(event: string, payload: EventPayload, source?: string, ns?: string, batch?: DeliveryChangeBatch): Promise<void>;
102
118
  messageTargetsCurrentInstance(message: EventPayload): boolean;
103
119
  private strictTargetString;
104
120
  runPushProcessSerialized(ns: string, operation: () => Promise<void>, inlineGeneration?: number): Promise<void>;
@@ -171,9 +187,9 @@ export declare class MessageDeliveryEngine {
171
187
  persistRepairedSeq(ns: string): void;
172
188
  clampAckSeq(method: string, field: string, ns: string, seq: number): number;
173
189
  clampAckParams(method: string, params: RpcParams): RpcParams;
174
- drainOrderedMessages(ns: string, beforeSeq?: number, pullResponse?: boolean, persist?: boolean): Promise<void>;
175
- publishOrderedMessage(event: string, ns: string, seq: unknown, payload: EventPayload): Promise<boolean>;
176
- publishPulledMessage(event: string, ns: string, seq: unknown, payload: EventPayload, persist?: boolean): Promise<boolean>;
190
+ drainOrderedMessages(ns: string, beforeSeq?: number, pullResponse?: boolean, persist?: boolean, batch?: DeliveryChangeBatch, source?: string): Promise<void>;
191
+ publishOrderedMessage(event: string, ns: string, seq: unknown, payload: EventPayload, source?: string, operationBatch?: DeliveryChangeBatch): Promise<boolean>;
192
+ publishPulledMessage(event: string, ns: string, seq: unknown, payload: EventPayload, persist?: boolean, source?: string, operationBatch?: DeliveryChangeBatch): Promise<boolean>;
177
193
  }
178
194
  export {};
179
195
  //# sourceMappingURL=delivery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/client/delivery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/client/delivery.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { slotIsolationKey } from '../config.js';
2
+ import { normalizeGroupAid } from '../group-id.js';
2
3
  import { ConnectionState, isJsonObject } from '../types.js';
3
4
  import { hasGroupMentionModeField, normalizeGroupMentionMode } from './mention-mode.js';
4
5
  const PUSHED_SEQS_LIMIT = 50_000;
@@ -94,6 +95,8 @@ function p2pAppEventFromPlainPullMessage(message) {
94
95
  }
95
96
  export class MessageDeliveryEngine {
96
97
  runtime;
98
+ pendingPullDeliveryChanges = null;
99
+ deliveryGeneration = 0;
97
100
  realtimeTailResults = null;
98
101
  realtimeSyncing = null;
99
102
  pendingP2pPullUpper = null;
@@ -114,6 +117,8 @@ export class MessageDeliveryEngine {
114
117
  }
115
118
  resetInlineAckState() {
116
119
  this.inlineGeneration += 1;
120
+ this.deliveryGeneration += 1;
121
+ this.pendingPullDeliveryChanges = null;
117
122
  void this.runtime.client._rpcPipeline?.invalidatePulls?.();
118
123
  this.realtimeSyncing = null;
119
124
  this.pendingP2pPullUpper = null;
@@ -167,6 +172,85 @@ export class MessageDeliveryEngine {
167
172
  return;
168
173
  this.schedulePendingPullIfNeeded(ns, 'pull-gate-idle');
169
174
  }
175
+ onPullWorkSettled() {
176
+ const pipeline = this.runtime.client._rpcPipeline;
177
+ if (pipeline?.hasAnyPullActivity?.() === true)
178
+ return;
179
+ void this.flushPullDeliveryChanges();
180
+ }
181
+ deliveryChangeNamespace(event, payload, ns = '') {
182
+ if (event === 'message.received')
183
+ return 'p2p';
184
+ if (event !== 'group.message_created')
185
+ return '';
186
+ if (!isJsonObject(payload))
187
+ return '';
188
+ const aid = String(this.runtime.client._aid ?? '').trim().toLowerCase();
189
+ const dot = aid.indexOf('.');
190
+ const localIssuer = dot > 0 ? aid.slice(dot + 1) : '';
191
+ const fallback = ns.startsWith('group:') ? ns.slice('group:'.length) : '';
192
+ const groupAid = normalizeGroupAid(payload.group_aid ?? payload.group_id ?? fallback, { localIssuer });
193
+ return groupAid.includes('.') ? `group:${groupAid}` : '';
194
+ }
195
+ isDeliverableMessageBody(event, payload) {
196
+ if ((event !== 'message.received' && event !== 'group.message_created') || !isJsonObject(payload))
197
+ return false;
198
+ const messageId = typeof payload.message_id === 'string' && payload.message_id.trim().length > 0;
199
+ const seq = typeof payload.seq === 'number' && Number.isSafeInteger(payload.seq) && payload.seq > 0;
200
+ return messageId || seq;
201
+ }
202
+ recordDeliveryChange(changes, event, payload, ns, generation) {
203
+ if (generation !== this.deliveryGeneration || !this.isDeliverableMessageBody(event, payload))
204
+ return;
205
+ const namespace = this.deliveryChangeNamespace(event, payload, ns);
206
+ if (!namespace)
207
+ return;
208
+ changes.set(namespace, (changes.get(namespace) ?? 0) + 1);
209
+ }
210
+ deliveryChangesPayload(changes) {
211
+ return [...changes.entries()]
212
+ .filter(([, deliveredCount]) => deliveredCount > 0)
213
+ .sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)
214
+ .map(([namespace, deliveredCount]) => ({ namespace, delivered_count: deliveredCount }));
215
+ }
216
+ createDeliveryChangeBatch(trigger) {
217
+ return { generation: this.deliveryGeneration, trigger, changes: new Map(), closed: false };
218
+ }
219
+ async flushRealtimeDeliveryChanges(batch) {
220
+ if (batch.closed)
221
+ return;
222
+ batch.closed = true;
223
+ if (batch.generation !== this.deliveryGeneration)
224
+ return;
225
+ if (this.deliveryChangesPayload(batch.changes).length === 0)
226
+ return;
227
+ const pendingPull = this.pendingPullDeliveryChanges;
228
+ this.pendingPullDeliveryChanges = null;
229
+ if (pendingPull) {
230
+ for (const [namespace, count] of pendingPull) {
231
+ batch.changes.set(namespace, (batch.changes.get(namespace) ?? 0) + count);
232
+ }
233
+ }
234
+ if (batch.generation !== this.deliveryGeneration)
235
+ return;
236
+ const changes = this.deliveryChangesPayload(batch.changes);
237
+ if (changes.length === 0)
238
+ return;
239
+ this.runtime.client._dispatcher.enqueue('delivery.changed', { trigger: batch.trigger, changes });
240
+ }
241
+ async flushPullDeliveryChanges() {
242
+ const generation = this.deliveryGeneration;
243
+ const pending = this.pendingPullDeliveryChanges;
244
+ if (!pending || pending.size === 0 || generation !== this.deliveryGeneration)
245
+ return;
246
+ this.pendingPullDeliveryChanges = null;
247
+ if (generation !== this.deliveryGeneration)
248
+ return;
249
+ const changes = this.deliveryChangesPayload(pending);
250
+ if (changes.length === 0)
251
+ return;
252
+ this.runtime.client._dispatcher.enqueue('delivery.changed', { trigger: 'pull_drained', changes });
253
+ }
170
254
  recordPendingPull(ns, seq) {
171
255
  if (!ns || !Number.isSafeInteger(seq) || seq <= 0)
172
256
  return;
@@ -837,14 +921,14 @@ export class MessageDeliveryEngine {
837
921
  }
838
922
  return { rawCount: messages.length, publishedCount };
839
923
  }
840
- enqueueOrderedMessage(ns, event, seq, payload) {
924
+ enqueueOrderedMessage(ns, event, seq, payload, source = 'push') {
841
925
  const client = this.runtime.client;
842
926
  let queue = client._pendingOrderedMsgs.get(ns);
843
927
  if (!queue) {
844
928
  queue = new Map();
845
929
  client._pendingOrderedMsgs.set(ns, queue);
846
930
  }
847
- queue.set(seq, { event, payload });
931
+ queue.set(seq, { event, payload, source });
848
932
  if (queue.size > PENDING_ORDERED_LIMIT) {
849
933
  const drop = [...queue.keys()].sort((a, b) => a - b).slice(0, queue.size - PENDING_ORDERED_LIMIT);
850
934
  for (const oldSeq of drop)
@@ -854,7 +938,7 @@ export class MessageDeliveryEngine {
854
938
  isGroupEventNamespace(ns) {
855
939
  return ns.startsWith('group_event:');
856
940
  }
857
- async publishOrderedQueueItem(ns, event, seq, payload, pullResponse = false) {
941
+ async publishOrderedQueueItem(ns, event, seq, payload, pullResponse = false, source = 'push', batch) {
858
942
  const client = this.runtime.client;
859
943
  if (event === 'group.changed' && this.isGroupEventNamespace(ns)) {
860
944
  await this.publishOrderedGroupChanged(payload);
@@ -865,10 +949,10 @@ export class MessageDeliveryEngine {
865
949
  return;
866
950
  }
867
951
  if (pullResponse) {
868
- await client._withPullResponseProcessing(ns, () => client._publishAppEvent(event, payload));
952
+ await client._withPullResponseProcessing(ns, () => client._publishAppEvent(event, payload, source, ns, batch));
869
953
  return;
870
954
  }
871
- await client._publishAppEvent(event, payload);
955
+ await client._publishAppEvent(event, payload, source, ns, batch);
872
956
  }
873
957
  async publishOrderedGroupChanged(payload) {
874
958
  const client = this.runtime.client;
@@ -1043,6 +1127,7 @@ export class MessageDeliveryEngine {
1043
1127
  setIfPresent('type', firstValue(body.type, params.type, params.message_type, params.payload_type));
1044
1128
  setIfPresent('kind', firstValue(body.kind, params.kind));
1045
1129
  setIfPresent('version', firstValue(body.version, params.version));
1130
+ setIfPresent('message_id', firstValue(params.message_id, body.message_id, resultObj.message_id));
1046
1131
  setIfPresent('timestamp', firstValue(params.timestamp, resultObj.timestamp, resultObj.created_at, resultObj.t_server, Date.now()));
1047
1132
  envelope.encrypted = Boolean(encrypted);
1048
1133
  const context = this.envelopeMetadata(params.context);
@@ -1385,8 +1470,9 @@ export class MessageDeliveryEngine {
1385
1470
  if (contig !== contigBefore)
1386
1471
  this.persistSeq(ns);
1387
1472
  }
1388
- async publishAppEvent(event, payload) {
1473
+ async publishAppEvent(event, payload, source = '', ns = '', batch) {
1389
1474
  const client = this.runtime.client;
1475
+ const generation = this.deliveryGeneration;
1390
1476
  if ((event === 'message.received' || event === 'group.message_created') && isJsonObject(payload)) {
1391
1477
  client._maybeAppendEchoTraceReceive(payload);
1392
1478
  }
@@ -1406,7 +1492,25 @@ export class MessageDeliveryEngine {
1406
1492
  client._clientLog.debug(`agent_md etag inject skipped: ${String(exc)}`);
1407
1493
  }
1408
1494
  }
1409
- await client._dispatcher.publish(event, this.normalizePublishedMessagePayload(event, payload));
1495
+ client._dispatcher.enqueue(event, this.normalizePublishedMessagePayload(event, payload));
1496
+ if (generation !== this.deliveryGeneration)
1497
+ return;
1498
+ if (source !== 'pull' && source !== 'tail' && source !== 'pending_retry'
1499
+ && source !== 'push' && source !== 'inline_push')
1500
+ return;
1501
+ if (source === 'push' || source === 'inline_push') {
1502
+ const localBatch = batch ?? this.createDeliveryChangeBatch(source);
1503
+ this.recordDeliveryChange(localBatch.changes, event, payload, ns, generation);
1504
+ if (!batch)
1505
+ await this.flushRealtimeDeliveryChanges(localBatch);
1506
+ }
1507
+ else {
1508
+ const changes = this.pendingPullDeliveryChanges ?? new Map();
1509
+ this.pendingPullDeliveryChanges = changes;
1510
+ this.recordDeliveryChange(changes, event, payload, ns, generation);
1511
+ if (client._rpcPipeline?.hasAnyPullActivity?.() !== true)
1512
+ await this.flushPullDeliveryChanges();
1513
+ }
1410
1514
  }
1411
1515
  messageTargetsCurrentInstance(message) {
1412
1516
  if (!isJsonObject(message))
@@ -1562,7 +1666,7 @@ export class MessageDeliveryEngine {
1562
1666
  const client = this.runtime.client;
1563
1667
  try {
1564
1668
  if (!isJsonObject(data)) {
1565
- await client._publishAppEvent('message.received', data);
1669
+ await client._publishAppEvent('message.received', data, 'push');
1566
1670
  return;
1567
1671
  }
1568
1672
  const msg = { ...data };
@@ -1614,7 +1718,7 @@ export class MessageDeliveryEngine {
1614
1718
  await client._publishEncryptedPushMessage('message.received', 'message.undecryptable', '', seq ?? 0, msg, false);
1615
1719
  return;
1616
1720
  }
1617
- await client._publishAppEvent('message.received', msg);
1721
+ await client._publishAppEvent('message.received', msg, 'push');
1618
1722
  }
1619
1723
  }
1620
1724
  catch (exc) {
@@ -1658,7 +1762,7 @@ export class MessageDeliveryEngine {
1658
1762
  const client = this.runtime.client;
1659
1763
  try {
1660
1764
  if (!isJsonObject(data)) {
1661
- await client._publishAppEvent('group.message_created', data);
1765
+ await client._publishAppEvent('group.message_created', data, 'push');
1662
1766
  return;
1663
1767
  }
1664
1768
  const msg = { ...data };
@@ -1737,7 +1841,7 @@ export class MessageDeliveryEngine {
1737
1841
  await client._publishEncryptedPushMessage('group.message_created', 'group.message_undecryptable', '', seq ?? 0, msg, true);
1738
1842
  return;
1739
1843
  }
1740
- await client._publishAppEvent('group.message_created', msg);
1844
+ await client._publishAppEvent('group.message_created', msg, 'push');
1741
1845
  }
1742
1846
  }
1743
1847
  catch (exc) {
@@ -1821,12 +1925,15 @@ export class MessageDeliveryEngine {
1821
1925
  return;
1822
1926
  const delayMs = Math.min(P2P_GAP_FILL_RETRY_BASE_MS * retryAttempt, P2P_GAP_FILL_RETRY_MAX_MS);
1823
1927
  client._gapFillDone.add(retryKey);
1928
+ const releasePullWork = client._rpcPipeline?.reservePullWork?.() ?? (() => { });
1824
1929
  client._clientLog.debug(`P2P message gap-fill retry scheduled: ns=${ns} attempt=${retryAttempt} delay_ms=${delayMs}`);
1825
1930
  globalThis.setTimeout(() => {
1826
1931
  client._gapFillDone.delete(retryKey);
1827
- if (client.state !== ConnectionState.READY || client._closing)
1932
+ if (client.state !== ConnectionState.READY || client._closing) {
1933
+ releasePullWork();
1828
1934
  return;
1829
- client._safeAsync(this.fillP2pGap(retryAttempt));
1935
+ }
1936
+ client._safeAsync(this.fillP2pGap(retryAttempt).finally(releasePullWork));
1830
1937
  }, delayMs);
1831
1938
  }
1832
1939
  async fillP2pGap(retryAttempt = 0) {
@@ -2527,7 +2634,7 @@ export class MessageDeliveryEngine {
2527
2634
  ? tracker.snapshotNamespace(ns)
2528
2635
  : null;
2529
2636
  try {
2530
- const published = await this.publishPulledMessage(event, ns, seq, payload);
2637
+ const published = await this.publishPulledMessage(event, ns, seq, payload, true, 'inline_push');
2531
2638
  if (!this.isInlineGenerationCurrent(generation))
2532
2639
  return false;
2533
2640
  if (!published)
@@ -3107,13 +3214,13 @@ export class MessageDeliveryEngine {
3107
3214
  }
3108
3215
  }
3109
3216
  catch (exc) {
3110
- client._dispatcher.publish('seq_tracker.persist_error', {
3217
+ client._dispatcher.enqueue('seq_tracker.persist_error', {
3111
3218
  phase: 'restore',
3112
3219
  aid,
3113
3220
  device_id: deviceId,
3114
3221
  slot_id: slotId,
3115
3222
  error: String(exc),
3116
- }).catch(() => { });
3223
+ });
3117
3224
  }
3118
3225
  }
3119
3226
  async migrateSeqStateGroupIds(state) {
@@ -3321,13 +3428,13 @@ export class MessageDeliveryEngine {
3321
3428
  catch (exc) {
3322
3429
  const error = formatDeliveryError(exc);
3323
3430
  client._clientLog.warn(`save SeqTracker state failed: ${error}`);
3324
- client._dispatcher.publish('seq_tracker.persist_error', {
3431
+ client._dispatcher.enqueue('seq_tracker.persist_error', {
3325
3432
  phase: 'save',
3326
3433
  aid,
3327
3434
  device_id: deviceId,
3328
3435
  slot_id: slotId,
3329
3436
  error: String(error),
3330
- }).catch(() => { });
3437
+ });
3331
3438
  if (throwOnError)
3332
3439
  throw exc;
3333
3440
  }
@@ -3446,7 +3553,7 @@ export class MessageDeliveryEngine {
3446
3553
  }
3447
3554
  return params;
3448
3555
  }
3449
- async drainOrderedMessages(ns, beforeSeq, pullResponse = false, persist = true) {
3556
+ async drainOrderedMessages(ns, beforeSeq, pullResponse = false, persist = true, batch, source = 'pull') {
3450
3557
  const client = this.runtime.client;
3451
3558
  this.ensurePullOperationCurrent();
3452
3559
  const queue = client._pendingOrderedMsgs.get(ns);
@@ -3457,16 +3564,34 @@ export class MessageDeliveryEngine {
3457
3564
  .filter((seq) => seq <= contig && (beforeSeq === undefined || seq < beforeSeq))
3458
3565
  .sort((a, b) => a - b);
3459
3566
  let delivered = false;
3460
- for (const seq of ready) {
3461
- this.ensurePullOperationCurrent();
3462
- const item = queue.get(seq);
3463
- queue.delete(seq);
3464
- if (!item || client._pushedSeqs.get(ns)?.has(seq))
3465
- continue;
3466
- await this.publishOrderedQueueItem(ns, item.event, seq, item.payload, pullResponse);
3467
- this.ensurePullOperationCurrent();
3468
- this.markPublishedSeq(ns, seq);
3469
- delivered = true;
3567
+ const drainBatches = new Map();
3568
+ try {
3569
+ for (const seq of ready) {
3570
+ this.ensurePullOperationCurrent();
3571
+ const item = queue.get(seq);
3572
+ queue.delete(seq);
3573
+ if (!item || client._pushedSeqs.get(ns)?.has(seq))
3574
+ continue;
3575
+ const itemSource = item.source ?? source;
3576
+ let itemBatch = batch;
3577
+ if ((itemSource === 'push' || itemSource === 'inline_push')
3578
+ && (!batch || batch.trigger !== itemSource)) {
3579
+ itemBatch = drainBatches.get(itemSource);
3580
+ if (!itemBatch) {
3581
+ itemBatch = this.createDeliveryChangeBatch(itemSource);
3582
+ drainBatches.set(itemSource, itemBatch);
3583
+ }
3584
+ }
3585
+ await this.publishOrderedQueueItem(ns, item.event, seq, item.payload, pullResponse, itemSource, itemBatch);
3586
+ this.ensurePullOperationCurrent();
3587
+ this.markPublishedSeq(ns, seq);
3588
+ delivered = true;
3589
+ }
3590
+ }
3591
+ finally {
3592
+ for (const drainBatch of drainBatches.values()) {
3593
+ await this.flushRealtimeDeliveryChanges(drainBatch);
3594
+ }
3470
3595
  }
3471
3596
  if (queue.size === 0) {
3472
3597
  client._pendingOrderedMsgs.delete(ns);
@@ -3476,75 +3601,91 @@ export class MessageDeliveryEngine {
3476
3601
  }
3477
3602
  }
3478
3603
  }
3479
- async publishOrderedMessage(event, ns, seq, payload) {
3604
+ async publishOrderedMessage(event, ns, seq, payload, source = 'push', operationBatch) {
3480
3605
  const client = this.runtime.client;
3481
- const seqNum = Number(seq);
3482
- if (!Number.isFinite(seqNum) || !Number.isInteger(seqNum) || seqNum <= 0) {
3483
- await this.publishOrderedQueueItem(ns, event, seqNum, payload);
3484
- return true;
3485
- }
3486
- if (client._pushedSeqs.get(ns)?.has(seqNum)) {
3606
+ const ownsBatch = !operationBatch && (source === 'push' || source === 'inline_push');
3607
+ const batch = operationBatch ?? (ownsBatch ? this.createDeliveryChangeBatch(source) : undefined);
3608
+ try {
3609
+ const seqNum = Number(seq);
3610
+ if (!Number.isFinite(seqNum) || !Number.isInteger(seqNum) || seqNum <= 0) {
3611
+ await this.publishOrderedQueueItem(ns, event, seqNum, payload, false, source, batch);
3612
+ return true;
3613
+ }
3614
+ if (client._pushedSeqs.get(ns)?.has(seqNum)) {
3615
+ const queue = client._pendingOrderedMsgs.get(ns);
3616
+ queue?.delete(seqNum);
3617
+ if (queue && queue.size === 0)
3618
+ client._pendingOrderedMsgs.delete(ns);
3619
+ return false;
3620
+ }
3621
+ const contig = client._seqTracker.getContiguousSeq(ns);
3622
+ if (seqNum > contig) {
3623
+ this.enqueueOrderedMessage(ns, event, seqNum, payload, source);
3624
+ return false;
3625
+ }
3626
+ await this.drainOrderedMessages(ns, seqNum, true, true, batch, source);
3627
+ if (client._pushedSeqs.get(ns)?.has(seqNum))
3628
+ return false;
3487
3629
  const queue = client._pendingOrderedMsgs.get(ns);
3488
3630
  queue?.delete(seqNum);
3489
3631
  if (queue && queue.size === 0)
3490
3632
  client._pendingOrderedMsgs.delete(ns);
3491
- return false;
3633
+ await this.publishOrderedQueueItem(ns, event, seqNum, payload, false, source, batch);
3634
+ this.markPublishedSeq(ns, seqNum);
3635
+ await this.drainOrderedMessages(ns, undefined, false, true, batch, source);
3636
+ if (!client._pendingOrderedMsgs.get(ns))
3637
+ await this.saveSeqTrackerState();
3638
+ return true;
3492
3639
  }
3493
- const contig = client._seqTracker.getContiguousSeq(ns);
3494
- if (seqNum > contig) {
3495
- this.enqueueOrderedMessage(ns, event, seqNum, payload);
3496
- return false;
3640
+ finally {
3641
+ if (ownsBatch && batch)
3642
+ await this.flushRealtimeDeliveryChanges(batch);
3497
3643
  }
3498
- await this.drainOrderedMessages(ns, seqNum, true);
3499
- if (client._pushedSeqs.get(ns)?.has(seqNum))
3500
- return false;
3501
- const queue = client._pendingOrderedMsgs.get(ns);
3502
- queue?.delete(seqNum);
3503
- if (queue && queue.size === 0)
3504
- client._pendingOrderedMsgs.delete(ns);
3505
- await this.publishOrderedQueueItem(ns, event, seqNum, payload);
3506
- this.markPublishedSeq(ns, seqNum);
3507
- await this.drainOrderedMessages(ns);
3508
- if (!client._pendingOrderedMsgs.get(ns))
3509
- await this.saveSeqTrackerState();
3510
- return true;
3511
3644
  }
3512
- async publishPulledMessage(event, ns, seq, payload, persist = true) {
3645
+ async publishPulledMessage(event, ns, seq, payload, persist = true, source = 'pull', operationBatch) {
3513
3646
  const client = this.runtime.client;
3514
- this.ensurePullOperationCurrent();
3515
- const seqNum = Number(seq);
3516
- if (!Number.isFinite(seqNum) || !Number.isInteger(seqNum) || seqNum <= 0 || !ns) {
3517
- if (event === 'message.recalled') {
3518
- const published = await client._withPullResponseProcessing(ns, () => this.publishMessageRecallTombstone(seq, payload));
3647
+ const ownsBatch = !operationBatch && (source === 'push' || source === 'inline_push');
3648
+ const batch = operationBatch ?? (ownsBatch ? this.createDeliveryChangeBatch(source) : undefined);
3649
+ try {
3650
+ this.ensurePullOperationCurrent();
3651
+ const seqNum = Number(seq);
3652
+ if (!Number.isFinite(seqNum) || !Number.isInteger(seqNum) || seqNum <= 0 || !ns) {
3653
+ if (event === 'message.recalled') {
3654
+ const published = await client._withPullResponseProcessing(ns, () => this.publishMessageRecallTombstone(seq, payload));
3655
+ this.ensurePullOperationCurrent();
3656
+ return published;
3657
+ }
3658
+ await client._withPullResponseProcessing(ns, () => client._publishAppEvent(event, payload, source, ns, batch));
3519
3659
  this.ensurePullOperationCurrent();
3520
- return published;
3660
+ return true;
3661
+ }
3662
+ const queue = client._pendingOrderedMsgs.get(ns);
3663
+ if (client._pushedSeqs.get(ns)?.has(seqNum)) {
3664
+ queue?.delete(seqNum);
3665
+ if (queue && queue.size === 0)
3666
+ client._pendingOrderedMsgs.delete(ns);
3667
+ return false;
3521
3668
  }
3522
- await client._withPullResponseProcessing(ns, () => client._publishAppEvent(event, payload));
3669
+ await this.drainOrderedMessages(ns, seqNum, false, persist, batch, source);
3523
3670
  this.ensurePullOperationCurrent();
3524
- return true;
3525
- }
3526
- const queue = client._pendingOrderedMsgs.get(ns);
3527
- if (client._pushedSeqs.get(ns)?.has(seqNum)) {
3528
3671
  queue?.delete(seqNum);
3529
3672
  if (queue && queue.size === 0)
3530
3673
  client._pendingOrderedMsgs.delete(ns);
3531
- return false;
3532
- }
3533
- await this.drainOrderedMessages(ns, seqNum, false, persist);
3534
- this.ensurePullOperationCurrent();
3535
- queue?.delete(seqNum);
3536
- if (queue && queue.size === 0)
3537
- client._pendingOrderedMsgs.delete(ns);
3538
- if (event === 'message.recalled') {
3539
- const published = await client._withPullResponseProcessing(ns, () => this.publishMessageRecallTombstone(seqNum, payload));
3674
+ if (event === 'message.recalled') {
3675
+ const published = await client._withPullResponseProcessing(ns, () => this.publishMessageRecallTombstone(seqNum, payload));
3676
+ this.ensurePullOperationCurrent();
3677
+ this.markPublishedSeq(ns, seqNum);
3678
+ return published;
3679
+ }
3680
+ await client._withPullResponseProcessing(ns, () => client._publishAppEvent(event, payload, source, ns, batch));
3540
3681
  this.ensurePullOperationCurrent();
3541
3682
  this.markPublishedSeq(ns, seqNum);
3542
- return published;
3683
+ return true;
3684
+ }
3685
+ finally {
3686
+ if (ownsBatch && batch)
3687
+ await this.flushRealtimeDeliveryChanges(batch);
3543
3688
  }
3544
- await client._withPullResponseProcessing(ns, () => client._publishAppEvent(event, payload));
3545
- this.ensurePullOperationCurrent();
3546
- this.markPublishedSeq(ns, seqNum);
3547
- return true;
3548
3689
  }
3549
3690
  }
3550
3691
  //# sourceMappingURL=delivery.js.map