@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.
- package/CHANGELOG.md +32 -0
- package/_packed_docs/CHANGELOG.md +32 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +6 -5
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +43 -8
- package/_packed_docs/sdk/09-group-rpc-manual.md +18 -3
- package/_packed_docs/sdk/09-message-rpc-manual.md +34 -10
- package/dist/agent-md.d.ts.map +1 -1
- package/dist/agent-md.js +23 -1
- package/dist/agent-md.js.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +16 -2
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +812 -205
- package/dist/client/delivery.d.ts +23 -7
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +221 -80
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.js +6 -6
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/lifecycle.d.ts.map +1 -1
- package/dist/client/lifecycle.js +34 -38
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +4 -0
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +56 -2
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +1 -1
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +22 -6
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +0 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +23 -32
- package/dist/client.js.map +1 -1
- package/dist/events.d.ts +31 -2
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +167 -7
- package/dist/events.js.map +1 -1
- package/dist/register-flow.d.ts.map +1 -1
- package/dist/register-flow.js +16 -2
- package/dist/register-flow.js.map +1 -1
- package/dist/transport.d.ts +10 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +283 -29
- package/dist/transport.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- 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
|
-
|
|
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":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/client/delivery.ts"],"names":[],"mappings":"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"}
|
package/dist/client/delivery.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
})
|
|
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.
|
|
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
|
-
})
|
|
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
|
-
|
|
3461
|
-
|
|
3462
|
-
const
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
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
|
|
3482
|
-
|
|
3483
|
-
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
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
|
-
|
|
3515
|
-
const
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
3534
|
-
|
|
3535
|
-
|
|
3536
|
-
|
|
3537
|
-
client.
|
|
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
|
|
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
|