@commonpub/server 1.1.0 → 2.1.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/dist/admin/admin.d.ts +1 -0
- package/dist/admin/admin.d.ts.map +1 -1
- package/dist/admin/admin.js +21 -1
- package/dist/admin/admin.js.map +1 -1
- package/dist/admin/index.d.ts +1 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/content/content.d.ts +13 -2
- package/dist/content/content.d.ts.map +1 -1
- package/dist/content/content.js +40 -10
- package/dist/content/content.js.map +1 -1
- package/dist/content/index.d.ts +1 -1
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +1 -1
- package/dist/content/index.js.map +1 -1
- package/dist/federation/backfill.d.ts +11 -7
- package/dist/federation/backfill.d.ts.map +1 -1
- package/dist/federation/backfill.js +58 -23
- package/dist/federation/backfill.js.map +1 -1
- package/dist/federation/circuitBreaker.d.ts +30 -0
- package/dist/federation/circuitBreaker.d.ts.map +1 -0
- package/dist/federation/circuitBreaker.js +116 -0
- package/dist/federation/circuitBreaker.js.map +1 -0
- package/dist/federation/delivery.d.ts +12 -6
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +78 -20
- package/dist/federation/delivery.js.map +1 -1
- package/dist/federation/inboxHandlers.d.ts +6 -1
- package/dist/federation/inboxHandlers.d.ts.map +1 -1
- package/dist/federation/inboxHandlers.js +35 -4
- package/dist/federation/inboxHandlers.js.map +1 -1
- package/dist/federation/index.d.ts +4 -2
- package/dist/federation/index.d.ts.map +1 -1
- package/dist/federation/index.js +3 -1
- package/dist/federation/index.js.map +1 -1
- package/dist/federation/mirroring.d.ts +9 -4
- package/dist/federation/mirroring.d.ts.map +1 -1
- package/dist/federation/mirroring.js +31 -8
- package/dist/federation/mirroring.js.map +1 -1
- package/dist/federation/outboxQueries.d.ts +21 -0
- package/dist/federation/outboxQueries.d.ts.map +1 -0
- package/dist/federation/outboxQueries.js +59 -0
- package/dist/federation/outboxQueries.js.map +1 -0
- package/dist/federation/timeline.d.ts.map +1 -1
- package/dist/federation/timeline.js +4 -4
- package/dist/federation/timeline.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +39 -102
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../src/federation/backfill.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../src/federation/backfill.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAiBrC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAM,EACN,cAAsB,EACtB,MAAc,EACd,cAAyC;IAEzC,MAAM,IAAI,GAAG,OAAO,cAAc,KAAK,QAAQ;QAC7C,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE;QAC9B,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAE/B,MAAM,MAAM,GAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAEtF,yDAAyD;IACzD,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;aACtB,MAAM,CAAC,EAAE,cAAc,EAAE,eAAe,CAAC,cAAc,EAAE,CAAC;aAC1D,IAAI,CAAC,eAAe,CAAC;aACrB,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;aACvC,KAAK,CAAC,CAAC,CAAC,CAAC;QACZ,IAAI,MAAM,EAAE,cAAc,EAAE,CAAC;YAC3B,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;QACnC,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,IAAI,QAAQ,GAAkB,QAAQ,CAAC;IAEvC,OAAO,QAAQ,IAAI,MAAM,CAAC,KAAK,GAAG,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;QAC3E,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAEvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBACrC,OAAO,EAAE;oBACP,MAAM,EAAE,gDAAgD;oBACxD,YAAY,EAAE,2BAA2B,MAAM,GAAG;iBACnD;gBACD,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,CAAC;YAEtB,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM;YAExB,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA6B,CAAC;YACpE,MAAM,CAAC,KAAK,EAAE,CAAC;YAEf,gEAAgE;YAChE,IAAI,KAAK,GAAc,EAAE,CAAC;YAC1B,IAAI,IAAI,GAAkB,IAAI,CAAC;YAE/B,IAAI,UAAU,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBAC5C,MAAM,SAAS,GAAG,UAAU,CAAC,KAAqD,CAAC;gBACnF,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAClC,QAAQ,GAAG,SAAS,CAAC;oBACrB,SAAS;gBACX,CAAC;qBAAM,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;oBACtD,KAAK,GAAI,SAAqC,CAAC,YAAyB,IAAI,EAAE,CAAC;oBAC/E,IAAI,GAAI,SAAqC,CAAC,IAAqB,IAAI,IAAI,CAAC;gBAC9E,CAAC;qBAAM,CAAC;oBACN,KAAK,GAAG,UAAU,CAAC,YAAyB,IAAI,EAAE,CAAC;gBACrD,CAAC;YACH,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBACvD,KAAK,GAAG,UAAU,CAAC,YAAyB,IAAI,EAAE,CAAC;gBACnD,IAAI,GAAG,UAAU,CAAC,IAAqB,IAAI,IAAI,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;YAED,uFAAuF;YACvF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,MAAM,CAAC,SAAS,IAAI,QAAQ;oBAAE,MAAM;gBAExC,MAAM,QAAQ,GAAG,IAA+B,CAAC;gBACjD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;oBAAE,SAAS;gBAExD,gEAAgE;gBAChE,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ;oBAAE,SAAS;gBAEvE,IAAI,CAAC;oBACH,MAAM,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBAC/C,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,MAAM,EAAE,CAAC;oBAChB,mDAAmD;gBACrD,CAAC;YACH,CAAC;YAED,4DAA4D;YAC5D,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,EAAE;qBACL,MAAM,CAAC,eAAe,CAAC;qBACvB,GAAG,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;qBACpD,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC7C,CAAC;YAED,QAAQ,GAAG,IAAI,CAAC;YAEhB,6CAA6C;YAC7C,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,oDAAoD;YACpD,iDAAiD;YACjD,MAAM;QACR,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,MAAM,CAAC,QAAQ,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC;IAE5D,uCAAuC;IACvC,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,EAAE;aACL,MAAM,CAAC,eAAe,CAAC;aACvB,GAAG,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;aACpD,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { DB } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Check if the circuit is open for a domain (should skip delivery).
|
|
4
|
+
* Returns true if delivery should be SKIPPED (circuit is open).
|
|
5
|
+
*/
|
|
6
|
+
export declare function isCircuitOpen(db: DB, domain: string): Promise<boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Record a successful delivery to a domain.
|
|
9
|
+
* Resets consecutive failures and closes the circuit.
|
|
10
|
+
*/
|
|
11
|
+
export declare function recordDeliverySuccess(db: DB, domain: string): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Record a delivery failure to a domain.
|
|
14
|
+
* Increments consecutive failures. If threshold exceeded, opens the circuit.
|
|
15
|
+
*/
|
|
16
|
+
export declare function recordDeliveryFailure(db: DB, domain: string, failureThreshold?: number): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Get delivery health stats for all known remote instances.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getDeliveryHealth(db: DB): Promise<Array<{
|
|
21
|
+
domain: string;
|
|
22
|
+
consecutiveFailures: number;
|
|
23
|
+
totalDelivered: number;
|
|
24
|
+
totalFailed: number;
|
|
25
|
+
circuitOpen: boolean;
|
|
26
|
+
circuitOpenUntil: Date | null;
|
|
27
|
+
lastSuccessAt: Date | null;
|
|
28
|
+
lastFailureAt: Date | null;
|
|
29
|
+
}>>;
|
|
30
|
+
//# sourceMappingURL=circuitBreaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuitBreaker.d.ts","sourceRoot":"","sources":["../../src/federation/circuitBreaker.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AActC;;;GAGG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAS5E;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBjF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,EACd,gBAAgB,SAA4B,GAC3C,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;CAC5B,CAAC,CAAC,CAYF"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit breaker for federation delivery.
|
|
3
|
+
* Tracks consecutive failures per remote instance domain.
|
|
4
|
+
* After N consecutive failures, opens the circuit (stops delivery attempts)
|
|
5
|
+
* for an exponentially increasing cooldown period.
|
|
6
|
+
*/
|
|
7
|
+
import { eq, sql } from 'drizzle-orm';
|
|
8
|
+
import { instanceHealth } from '@commonpub/schema';
|
|
9
|
+
/** Default: open circuit after 50 consecutive failures */
|
|
10
|
+
const DEFAULT_FAILURE_THRESHOLD = 50;
|
|
11
|
+
/** Cooldown periods: 5min, 15min, 1h, 6h, 24h */
|
|
12
|
+
const COOLDOWN_MS = [
|
|
13
|
+
5 * 60_000, // 5 minutes
|
|
14
|
+
15 * 60_000, // 15 minutes
|
|
15
|
+
60 * 60_000, // 1 hour
|
|
16
|
+
6 * 60 * 60_000, // 6 hours
|
|
17
|
+
24 * 60 * 60_000, // 24 hours
|
|
18
|
+
];
|
|
19
|
+
/**
|
|
20
|
+
* Check if the circuit is open for a domain (should skip delivery).
|
|
21
|
+
* Returns true if delivery should be SKIPPED (circuit is open).
|
|
22
|
+
*/
|
|
23
|
+
export async function isCircuitOpen(db, domain) {
|
|
24
|
+
const [health] = await db
|
|
25
|
+
.select({ circuitOpenUntil: instanceHealth.circuitOpenUntil })
|
|
26
|
+
.from(instanceHealth)
|
|
27
|
+
.where(eq(instanceHealth.domain, domain))
|
|
28
|
+
.limit(1);
|
|
29
|
+
if (!health?.circuitOpenUntil)
|
|
30
|
+
return false;
|
|
31
|
+
return health.circuitOpenUntil.getTime() > Date.now();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Record a successful delivery to a domain.
|
|
35
|
+
* Resets consecutive failures and closes the circuit.
|
|
36
|
+
*/
|
|
37
|
+
export async function recordDeliverySuccess(db, domain) {
|
|
38
|
+
await db
|
|
39
|
+
.insert(instanceHealth)
|
|
40
|
+
.values({
|
|
41
|
+
domain,
|
|
42
|
+
consecutiveFailures: 0,
|
|
43
|
+
totalDelivered: 1,
|
|
44
|
+
lastSuccessAt: new Date(),
|
|
45
|
+
circuitOpenUntil: null,
|
|
46
|
+
})
|
|
47
|
+
.onConflictDoUpdate({
|
|
48
|
+
target: instanceHealth.domain,
|
|
49
|
+
set: {
|
|
50
|
+
consecutiveFailures: 0,
|
|
51
|
+
totalDelivered: sql `${instanceHealth.totalDelivered} + 1`,
|
|
52
|
+
lastSuccessAt: new Date(),
|
|
53
|
+
circuitOpenUntil: null,
|
|
54
|
+
updatedAt: new Date(),
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Record a delivery failure to a domain.
|
|
60
|
+
* Increments consecutive failures. If threshold exceeded, opens the circuit.
|
|
61
|
+
*/
|
|
62
|
+
export async function recordDeliveryFailure(db, domain, failureThreshold = DEFAULT_FAILURE_THRESHOLD) {
|
|
63
|
+
// Upsert: increment failures, update timestamp
|
|
64
|
+
await db
|
|
65
|
+
.insert(instanceHealth)
|
|
66
|
+
.values({
|
|
67
|
+
domain,
|
|
68
|
+
consecutiveFailures: 1,
|
|
69
|
+
totalFailed: 1,
|
|
70
|
+
lastFailureAt: new Date(),
|
|
71
|
+
})
|
|
72
|
+
.onConflictDoUpdate({
|
|
73
|
+
target: instanceHealth.domain,
|
|
74
|
+
set: {
|
|
75
|
+
consecutiveFailures: sql `${instanceHealth.consecutiveFailures} + 1`,
|
|
76
|
+
totalFailed: sql `${instanceHealth.totalFailed} + 1`,
|
|
77
|
+
lastFailureAt: new Date(),
|
|
78
|
+
updatedAt: new Date(),
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
// Check if we need to open the circuit
|
|
82
|
+
const [health] = await db
|
|
83
|
+
.select({
|
|
84
|
+
consecutiveFailures: instanceHealth.consecutiveFailures,
|
|
85
|
+
})
|
|
86
|
+
.from(instanceHealth)
|
|
87
|
+
.where(eq(instanceHealth.domain, domain))
|
|
88
|
+
.limit(1);
|
|
89
|
+
if (health && health.consecutiveFailures >= failureThreshold) {
|
|
90
|
+
// Calculate cooldown: escalating based on how many times we've opened
|
|
91
|
+
const openCount = Math.floor(health.consecutiveFailures / failureThreshold) - 1;
|
|
92
|
+
const cooldownMs = COOLDOWN_MS[Math.min(openCount, COOLDOWN_MS.length - 1)];
|
|
93
|
+
const openUntil = new Date(Date.now() + cooldownMs);
|
|
94
|
+
await db
|
|
95
|
+
.update(instanceHealth)
|
|
96
|
+
.set({ circuitOpenUntil: openUntil, updatedAt: new Date() })
|
|
97
|
+
.where(eq(instanceHealth.domain, domain));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get delivery health stats for all known remote instances.
|
|
102
|
+
*/
|
|
103
|
+
export async function getDeliveryHealth(db) {
|
|
104
|
+
const rows = await db.select().from(instanceHealth).orderBy(instanceHealth.domain);
|
|
105
|
+
return rows.map((r) => ({
|
|
106
|
+
domain: r.domain,
|
|
107
|
+
consecutiveFailures: r.consecutiveFailures,
|
|
108
|
+
totalDelivered: r.totalDelivered,
|
|
109
|
+
totalFailed: r.totalFailed,
|
|
110
|
+
circuitOpen: r.circuitOpenUntil ? r.circuitOpenUntil.getTime() > Date.now() : false,
|
|
111
|
+
circuitOpenUntil: r.circuitOpenUntil,
|
|
112
|
+
lastSuccessAt: r.lastSuccessAt,
|
|
113
|
+
lastFailureAt: r.lastFailureAt,
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=circuitBreaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuitBreaker.js","sourceRoot":"","sources":["../../src/federation/circuitBreaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,19 @@ export interface DeliveryResult {
|
|
|
4
4
|
failed: number;
|
|
5
5
|
errors: string[];
|
|
6
6
|
}
|
|
7
|
+
export interface DeliveryOptions {
|
|
8
|
+
batchSize?: number;
|
|
9
|
+
maxRetries?: number;
|
|
10
|
+
}
|
|
7
11
|
/**
|
|
8
12
|
* Process and deliver pending outbound activities.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
* Uses claim-based locking for multi-worker safety:
|
|
14
|
+
* each worker claims activities by setting lockedAt, preventing duplicates.
|
|
15
|
+
*/
|
|
16
|
+
export declare function deliverPendingActivities(db: DB, domain: string, batchSizeOrOpts?: number | DeliveryOptions): Promise<DeliveryResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Delete delivered activities older than the specified retention period.
|
|
19
|
+
* Call from a scheduled job (e.g., daily via the delivery worker plugin).
|
|
14
20
|
*/
|
|
15
|
-
export declare function
|
|
21
|
+
export declare function cleanupDeliveredActivities(db: DB, retentionDays: number): Promise<number>;
|
|
16
22
|
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/federation/delivery.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/federation/delivery.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAwBtC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,EACd,eAAe,CAAC,EAAE,MAAM,GAAG,eAAe,GACzC,OAAO,CAAC,cAAc,CAAC,CA6DzB;AAmXD;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,EAAE,EACN,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAYjB"}
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
* Activity delivery — sends pending outbound AP activities to remote inboxes.
|
|
3
3
|
* Signs requests with HTTP Signatures and updates delivery status.
|
|
4
4
|
*/
|
|
5
|
-
import { eq, and, sql, lte } from 'drizzle-orm';
|
|
5
|
+
import { eq, and, sql, lte, isNull, or } from 'drizzle-orm';
|
|
6
6
|
import { activities, remoteActors, followRelationships, users, hubs, hubFollowers } from '@commonpub/schema';
|
|
7
7
|
import { signRequest } from '@commonpub/protocol';
|
|
8
|
-
const
|
|
8
|
+
const DEFAULT_MAX_ATTEMPTS = 6;
|
|
9
|
+
/** Lock expiry: if a worker crashes, its locks expire after 5 minutes */
|
|
10
|
+
const LOCK_EXPIRY_MS = 5 * 60 * 1000;
|
|
9
11
|
const CONTENT_TYPE_AP = 'application/activity+json';
|
|
10
12
|
/** Exponential backoff delays in milliseconds: 1m, 5m, 30m, 2h, 12h, 48h */
|
|
11
13
|
const BACKOFF_DELAYS_MS = [
|
|
@@ -25,24 +27,40 @@ function isReadyForRetry(attempts, updatedAt) {
|
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
29
|
* Process and deliver pending outbound activities.
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* @param db - Database connection
|
|
31
|
-
* @param domain - The local instance domain
|
|
32
|
-
* @param batchSize - Max activities to process per run (default 20)
|
|
30
|
+
* Uses claim-based locking for multi-worker safety:
|
|
31
|
+
* each worker claims activities by setting lockedAt, preventing duplicates.
|
|
33
32
|
*/
|
|
34
|
-
export async function deliverPendingActivities(db, domain,
|
|
33
|
+
export async function deliverPendingActivities(db, domain, batchSizeOrOpts) {
|
|
34
|
+
const opts = typeof batchSizeOrOpts === 'number'
|
|
35
|
+
? { batchSize: batchSizeOrOpts }
|
|
36
|
+
: batchSizeOrOpts ?? {};
|
|
37
|
+
const batchSize = opts.batchSize ?? 20;
|
|
38
|
+
const maxRetries = opts.maxRetries ?? DEFAULT_MAX_ATTEMPTS;
|
|
35
39
|
const result = { delivered: 0, failed: 0, errors: [] };
|
|
36
|
-
|
|
40
|
+
const now = new Date();
|
|
41
|
+
const lockExpiry = new Date(now.getTime() - LOCK_EXPIRY_MS);
|
|
42
|
+
// Fetch pending outbound activities — only unlocked (lockedAt IS NULL or lock expired)
|
|
37
43
|
const candidates = await db
|
|
38
44
|
.select()
|
|
39
45
|
.from(activities)
|
|
40
|
-
.where(and(eq(activities.direction, 'outbound'), eq(activities.status, 'pending'), lte(activities.attempts,
|
|
46
|
+
.where(and(eq(activities.direction, 'outbound'), eq(activities.status, 'pending'), lte(activities.attempts, maxRetries), isNull(activities.deadLetteredAt), or(isNull(activities.lockedAt), lte(activities.lockedAt, lockExpiry))))
|
|
41
47
|
.orderBy(activities.createdAt)
|
|
42
|
-
.limit(batchSize * 2);
|
|
48
|
+
.limit(batchSize * 2);
|
|
43
49
|
// Apply exponential backoff filter in-memory
|
|
44
50
|
const pending = candidates.filter((a) => isReadyForRetry(a.attempts, a.updatedAt)).slice(0, batchSize);
|
|
51
|
+
// Claim activities by setting lockedAt (prevents other workers from picking them up)
|
|
52
|
+
const claimedIds = [];
|
|
45
53
|
for (const activity of pending) {
|
|
54
|
+
const claimed = await db.update(activities)
|
|
55
|
+
.set({ lockedAt: now })
|
|
56
|
+
.where(and(eq(activities.id, activity.id), or(isNull(activities.lockedAt), lte(activities.lockedAt, lockExpiry))))
|
|
57
|
+
.returning({ id: activities.id });
|
|
58
|
+
if (claimed.length > 0)
|
|
59
|
+
claimedIds.push(activity.id);
|
|
60
|
+
}
|
|
61
|
+
// Only process activities we successfully claimed
|
|
62
|
+
const toClaim = pending.filter((a) => claimedIds.includes(a.id));
|
|
63
|
+
for (const activity of toClaim) {
|
|
46
64
|
try {
|
|
47
65
|
await deliverActivity(db, activity, domain);
|
|
48
66
|
result.delivered++;
|
|
@@ -53,10 +71,6 @@ export async function deliverPendingActivities(db, domain, batchSize = 20) {
|
|
|
53
71
|
result.failed++;
|
|
54
72
|
}
|
|
55
73
|
}
|
|
56
|
-
// NOTE: For production with multiple delivery workers, add SELECT ... FOR UPDATE SKIP LOCKED
|
|
57
|
-
// to the pending activities query to prevent duplicate processing. PGlite (test DB) doesn't
|
|
58
|
-
// support this, so it's omitted from the query builder. The Nitro plugin should ensure
|
|
59
|
-
// only one worker runs at a time via setInterval (not parallel invocations).
|
|
60
74
|
return result;
|
|
61
75
|
}
|
|
62
76
|
async function deliverActivity(db, activity, domain) {
|
|
@@ -79,9 +93,26 @@ async function deliverActivity(db, activity, domain) {
|
|
|
79
93
|
}
|
|
80
94
|
const keyId = `${activity.actorUri}#main-key`;
|
|
81
95
|
const body = JSON.stringify(payload);
|
|
82
|
-
// Deliver to each inbox
|
|
96
|
+
// Deliver to each inbox (with circuit breaker checks)
|
|
97
|
+
const { isCircuitOpen, recordDeliverySuccess, recordDeliveryFailure } = await import('./circuitBreaker.js');
|
|
83
98
|
const errors = [];
|
|
99
|
+
let skippedCircuitOpen = 0;
|
|
84
100
|
for (const inbox of targetInboxes) {
|
|
101
|
+
// Extract domain from inbox URL for circuit breaker
|
|
102
|
+
let inboxDomain;
|
|
103
|
+
try {
|
|
104
|
+
inboxDomain = new URL(inbox).hostname;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
inboxDomain = inbox;
|
|
108
|
+
}
|
|
109
|
+
// Check circuit breaker — skip if circuit is open for this domain
|
|
110
|
+
const circuitOpen = await isCircuitOpen(db, inboxDomain);
|
|
111
|
+
if (circuitOpen) {
|
|
112
|
+
skippedCircuitOpen++;
|
|
113
|
+
errors.push(`${inbox}: circuit open (skipped)`);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
85
116
|
try {
|
|
86
117
|
const request = new Request(inbox, {
|
|
87
118
|
method: 'POST',
|
|
@@ -99,6 +130,10 @@ async function deliverActivity(db, activity, domain) {
|
|
|
99
130
|
const response = await fetch(signed, { signal: controller.signal });
|
|
100
131
|
if (!response.ok && response.status !== 202) {
|
|
101
132
|
errors.push(`${inbox}: ${response.status} ${response.statusText}`);
|
|
133
|
+
await recordDeliveryFailure(db, inboxDomain).catch(() => { });
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
await recordDeliverySuccess(db, inboxDomain).catch(() => { });
|
|
102
137
|
}
|
|
103
138
|
}
|
|
104
139
|
finally {
|
|
@@ -107,14 +142,18 @@ async function deliverActivity(db, activity, domain) {
|
|
|
107
142
|
}
|
|
108
143
|
catch (err) {
|
|
109
144
|
errors.push(`${inbox}: ${err instanceof Error ? err.message : String(err)}`);
|
|
145
|
+
await recordDeliveryFailure(db, inboxDomain).catch(() => { });
|
|
110
146
|
}
|
|
111
147
|
}
|
|
148
|
+
// If all inboxes were skipped due to circuit breaker, don't count as attempt
|
|
149
|
+
if (skippedCircuitOpen === targetInboxes.length) {
|
|
150
|
+
// All skipped — leave as pending, don't increment attempts
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
112
153
|
if (errors.length === 0) {
|
|
113
154
|
await markDelivered(db, activity.id);
|
|
114
155
|
}
|
|
115
156
|
else {
|
|
116
|
-
// Any failures (partial or total) → retry the whole activity.
|
|
117
|
-
// AP servers handle duplicate deliveries idempotently (objectUri is unique).
|
|
118
157
|
await incrementAttempts(db, activity.id, errors.join('; '));
|
|
119
158
|
}
|
|
120
159
|
}
|
|
@@ -325,6 +364,7 @@ async function markDelivered(db, activityId, error) {
|
|
|
325
364
|
status: 'delivered',
|
|
326
365
|
error: error ?? null,
|
|
327
366
|
attempts: sql `${activities.attempts} + 1`,
|
|
367
|
+
lockedAt: null, // Release lock
|
|
328
368
|
})
|
|
329
369
|
.where(eq(activities.id, activityId));
|
|
330
370
|
}
|
|
@@ -335,17 +375,20 @@ async function markFailed(db, activityId, error) {
|
|
|
335
375
|
status: 'failed',
|
|
336
376
|
error,
|
|
337
377
|
attempts: sql `${activities.attempts} + 1`,
|
|
378
|
+
lockedAt: null,
|
|
379
|
+
deadLetteredAt: new Date(), // Mark as dead-lettered
|
|
338
380
|
})
|
|
339
381
|
.where(eq(activities.id, activityId));
|
|
340
382
|
}
|
|
341
|
-
async function incrementAttempts(db, activityId, error) {
|
|
383
|
+
async function incrementAttempts(db, activityId, error, maxRetries = DEFAULT_MAX_ATTEMPTS) {
|
|
342
384
|
const [row] = await db
|
|
343
385
|
.select({ attempts: activities.attempts })
|
|
344
386
|
.from(activities)
|
|
345
387
|
.where(eq(activities.id, activityId))
|
|
346
388
|
.limit(1);
|
|
347
389
|
const newAttempts = (row?.attempts ?? 0) + 1;
|
|
348
|
-
const
|
|
390
|
+
const isDead = newAttempts >= maxRetries;
|
|
391
|
+
const newStatus = isDead ? 'failed' : 'pending';
|
|
349
392
|
await db
|
|
350
393
|
.update(activities)
|
|
351
394
|
.set({
|
|
@@ -353,7 +396,22 @@ async function incrementAttempts(db, activityId, error) {
|
|
|
353
396
|
error,
|
|
354
397
|
attempts: newAttempts,
|
|
355
398
|
updatedAt: new Date(),
|
|
399
|
+
lockedAt: null, // Release lock
|
|
400
|
+
...(isDead ? { deadLetteredAt: new Date() } : {}),
|
|
356
401
|
})
|
|
357
402
|
.where(eq(activities.id, activityId));
|
|
358
403
|
}
|
|
404
|
+
// --- Activity Cleanup ---
|
|
405
|
+
/**
|
|
406
|
+
* Delete delivered activities older than the specified retention period.
|
|
407
|
+
* Call from a scheduled job (e.g., daily via the delivery worker plugin).
|
|
408
|
+
*/
|
|
409
|
+
export async function cleanupDeliveredActivities(db, retentionDays) {
|
|
410
|
+
const cutoff = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1000);
|
|
411
|
+
const deleted = await db
|
|
412
|
+
.delete(activities)
|
|
413
|
+
.where(and(eq(activities.status, 'delivered'), lte(activities.createdAt, cutoff)))
|
|
414
|
+
.returning({ id: activities.id });
|
|
415
|
+
return deleted.length;
|
|
416
|
+
}
|
|
359
417
|
//# sourceMappingURL=delivery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/federation/delivery.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/federation/delivery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,mBAAmB,EAAiB,KAAK,EAAE,IAAI,EAAoB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9I,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,yEAAyE;AACzE,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAEpD,4EAA4E;AAC5E,MAAM,iBAAiB,GAAG;IACxB,MAAM,EAAU,WAAW;IAC3B,OAAO,EAAS,YAAY;IAC5B,SAAS,EAAO,aAAa;IAC7B,SAAS,EAAO,UAAU;IAC1B,UAAU,EAAM,WAAW;IAC3B,WAAW,EAAK,WAAW;CAC5B,CAAC;AAEF,oFAAoF;AACpF,SAAS,eAAe,CAAC,QAAgB,EAAE,SAAe;IACxD,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,kBAAkB;IACnD,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAE,CAAC;IACvF,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC;AACnD,CAAC;AAaD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,EAAM,EACN,MAAc,EACd,eAA0C;IAE1C,MAAM,IAAI,GAAG,OAAO,eAAe,KAAK,QAAQ;QAC9C,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE;QAChC,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,oBAAoB,CAAC;IAE3D,MAAM,MAAM,GAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACvE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,CAAC;IAE5D,uFAAuF;IACvF,MAAM,UAAU,GAAG,MAAM,EAAE;SACxB,MAAM,EAAE;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,EACpC,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,EAChC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,EACpC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,EACjC,EAAE,CACA,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAC3B,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CACrC,CACF,CACF;SACA,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;SAC7B,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAExB,6CAA6C;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAEvG,qFAAqF;IACrF,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;aACxC,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;aACtB,KAAK,CAAC,GAAG,CACR,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,EAC9B,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CACtE,CAAC;aACD,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,kDAAkD;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjE,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,EAAM,EACN,QAAwC,EACxC,MAAc;IAEd,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAkC,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,iCAAiC;IACjC,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,wCAAwC;IACxC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,QAAQ,CAAC,QAAQ,WAAW,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAErC,sDAAsD;IACtD,MAAM,EAAE,aAAa,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC5G,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,oDAAoD;QACpD,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YAAC,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,WAAW,GAAG,KAAK,CAAC;QAAC,CAAC;QAE7E,kEAAkE;QAClE,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE,CAAC;YAChB,kBAAkB,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,0BAA0B,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,eAAe;oBAC/B,QAAQ,EAAE,eAAe;oBACzB,YAAY,EAAE,2BAA2B,MAAM,GAAG;iBACnD;gBACD,IAAI;aACL,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACxE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBACpE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;oBACnE,MAAM,qBAAqB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;qBAAM,CAAC;oBACN,MAAM,qBAAqB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7E,MAAM,qBAAqB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,IAAI,kBAAkB,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QAChD,2DAA2D;QAC3D,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,MAAM,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,EAAM,EACN,QAAwC,EACxC,MAAc;IAEd,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAE3B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3C,iDAAiD;QACjD,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC1C,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,EAAE;iBACnB,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;iBACrC,IAAI,CAAC,YAAY,CAAC;iBAClB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;iBAChD,KAAK,CAAC,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,mCAAmC;QACnC,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC1C,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,EAAE;iBACnB,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;iBACrC,IAAI,CAAC,YAAY,CAAC;iBAClB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;iBAChD,KAAK,CAAC,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,uFAAuF;QACvF,6FAA6F;QAC7F,wFAAwF;QACxF,0EAA0E;QAC1E,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QACrC,IAAI,SAAS,EAAE,CAAC;YACd,2FAA2F;YAC3F,MAAM,SAAS,GAAG,MAAM,EAAE;iBACvB,MAAM,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,EAAE,EAAE,CAAC;iBACtC,IAAI,CAAC,mBAAmB,CAAC;iBACzB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC3D,EAAE,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,SAAS,CAAC,CACrD,CACF;iBACA,KAAK,CAAC,CAAC,CAAC,CAAC;YAEZ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,yDAAyD;gBACzD,MAAM,KAAK,GAAG,MAAM,EAAE;qBACnB,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;qBACrC,IAAI,CAAC,YAAY,CAAC;qBAClB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;qBAC3C,KAAK,CAAC,CAAC,CAAC,CAAC;gBACZ,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,iEAAiE;gBACjE,MAAM,SAAS,GAAG,MAAM,EAAE;qBACvB,MAAM,CAAC,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,gBAAgB,EAAE,CAAC;qBAClE,IAAI,CAAC,mBAAmB,CAAC;qBACzB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5D,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAC3C,CACF,CAAC;gBACJ,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,MAAM,aAAa,GAAG,MAAM,EAAE;yBAC3B,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE,CAAC;yBAC5E,IAAI,CAAC,YAAY,CAAC;yBAClB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;yBACpD,KAAK,CAAC,CAAC,CAAC,CAAC;oBACZ,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;oBAC7E,IAAI,WAAW;wBAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACjH,yEAAyE;QACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAyC,CAAC;QACnE,MAAM,OAAO,GAAG,OAAO,EAAE,EAA0B,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,EAAE,EAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,8CAA8C,CAAC;QACjE,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;QAE7E,IAAI,IAAI,EAAE,CAAC;YACT,8DAA8D;YAC9D,KAAK,MAAM,YAAY,IAAI,OAAQ,EAAE,CAAC;gBACpC,IAAI,YAAY,KAAK,QAAQ,CAAC,QAAQ;oBAAE,SAAS,CAAC,qBAAqB;gBACvE,MAAM,KAAK,GAAG,MAAM,EAAE;qBACnB,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;qBACrC,IAAI,CAAC,YAAY,CAAC;qBAClB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;qBAC9C,KAAK,CAAC,CAAC,CAAC,CAAC;gBACZ,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,oEAAoE;QACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAElD,IAAI,UAAU,EAAE,CAAC;YACf,oDAAoD;YACpD,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACjE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjG,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,OAAO,GAAG,MAAM,EAAE;yBACrB,MAAM,CAAC,EAAE,gBAAgB,EAAE,YAAY,CAAC,gBAAgB,EAAE,CAAC;yBAC3D,IAAI,CAAC,YAAY,CAAC;yBAClB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;oBACnF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,MAAM,KAAK,GAAG,MAAM,EAAE;6BACnB,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE,CAAC;6BAC5E,IAAI,CAAC,YAAY,CAAC;6BAClB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;6BACpD,KAAK,CAAC,CAAC,CAAC,CAAC;wBACZ,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;wBAC7D,IAAI,WAAW;4BAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,sDAAsD;YACtD,MAAM,SAAS,GAAG,MAAM,EAAE;iBACvB,MAAM,CAAC,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,gBAAgB,EAAE,CAAC;iBAClE,IAAI,CAAC,mBAAmB,CAAC;iBACzB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5D,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAC3C,CACF,CAAC;YAEJ,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,MAAM,EAAE;qBACnB,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE,CAAC;qBAC5E,IAAI,CAAC,YAAY,CAAC;qBAClB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;qBACpD,KAAK,CAAC,CAAC,CAAC,CAAC;gBACZ,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;gBAC7D,IAAI,WAAW;oBAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7C,CAAC;YAED,2DAA2D;YAC3D,6CAA6C;YAC7C,MAAM,gBAAgB,GAAG,WAAW,MAAM,QAAQ,CAAC;YACnD,IAAI,QAAQ,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;gBAC3C,MAAM,iBAAiB,GAAG,MAAM,EAAE;qBAC/B,MAAM,CAAC,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,gBAAgB,EAAE,CAAC;qBAClE,IAAI,CAAC,mBAAmB,CAAC;qBACzB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,EAC3D,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAC3C,CACF,CAAC;gBAEJ,KAAK,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC;oBAClC,MAAM,KAAK,GAAG,MAAM,EAAE;yBACnB,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE,CAAC;yBAC5E,IAAI,CAAC,YAAY,CAAC;yBAClB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;yBACpD,KAAK,CAAC,CAAC,CAAC,CAAC;oBACZ,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;oBAC7D,IAAI,WAAW;wBAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc;AAC9C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,EAAM,EACN,QAAgB,EAChB,MAAc;IAEd,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,wDAAwD;IACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACrD,MAAM,EAAE,0BAA0B,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACvE,OAAO,0BAA0B,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,2DAA2D;IAC3D,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;iBACnB,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;iBACvB,IAAI,CAAC,IAAI,CAAC;iBACV,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;iBAC7B,KAAK,CAAC,CAAC,CAAC,CAAC;YACZ,IAAI,GAAG,EAAE,CAAC;gBACR,yDAAyD;gBACzD,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACrE,OAAO,qBAAqB,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wDAAwD;IACxD,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;SACxB,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SACnC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1B,0DAA0D;IAC1D,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACpE,OAAO,uBAAuB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,EAAM,EAAE,UAAkB,EAAE,KAAc;IACrE,MAAM,EAAE;SACL,MAAM,CAAC,UAAU,CAAC;SAClB,GAAG,CAAC;QACH,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,KAAK,IAAI,IAAI;QACpB,QAAQ,EAAE,GAAG,CAAA,GAAG,UAAU,CAAC,QAAQ,MAAM;QACzC,QAAQ,EAAE,IAAI,EAAE,eAAe;KAChC,CAAC;SACD,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,EAAM,EAAE,UAAkB,EAAE,KAAa;IACjE,MAAM,EAAE;SACL,MAAM,CAAC,UAAU,CAAC;SAClB,GAAG,CAAC;QACH,MAAM,EAAE,QAAQ;QAChB,KAAK;QACL,QAAQ,EAAE,GAAG,CAAA,GAAG,UAAU,CAAC,QAAQ,MAAM;QACzC,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,IAAI,IAAI,EAAE,EAAE,wBAAwB;KACrD,CAAC;SACD,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,EAAM,EAAE,UAAkB,EAAE,KAAa,EAAE,UAAU,GAAG,oBAAoB;IAC3G,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;SACnB,MAAM,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;SACzC,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;SACpC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,WAAW,IAAI,UAAU,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhD,MAAM,EAAE;SACL,MAAM,CAAC,UAAU,CAAC;SAClB,GAAG,CAAC;QACH,MAAM,EAAE,SAAS;QACjB,KAAK;QACL,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,QAAQ,EAAE,IAAI,EAAE,eAAe;QAC/B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC;SACD,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,2BAA2B;AAE3B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,EAAM,EACN,aAAqB;IAErB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,MAAM,EAAE;SACrB,MAAM,CAAC,UAAU,CAAC;SAClB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,EAClC,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAClC,CACF;SACA,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC"}
|
|
@@ -3,8 +3,13 @@ import type { DB } from '../types.js';
|
|
|
3
3
|
export interface InboxHandlerOptions {
|
|
4
4
|
db: DB;
|
|
5
5
|
domain: string;
|
|
6
|
-
/** Auto-accept follow requests (default: true) */
|
|
6
|
+
/** Auto-accept follow requests (default: true). Set to false for 'manual' policy. */
|
|
7
7
|
autoAcceptFollows?: boolean;
|
|
8
|
+
/** Config for federation behavior */
|
|
9
|
+
federationConfig?: {
|
|
10
|
+
backfillOnMirrorAccept?: boolean;
|
|
11
|
+
mirrorMaxItems?: number;
|
|
12
|
+
};
|
|
8
13
|
}
|
|
9
14
|
/**
|
|
10
15
|
* Create inbox callbacks wired to database operations.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inboxHandlers.d.ts","sourceRoot":"","sources":["../../src/federation/inboxHandlers.ts"],"names":[],"mappings":"AAaA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAoBtC,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,EAAE,CAAC;IACP,MAAM,EAAE,MAAM,CAAC;IACf,
|
|
1
|
+
{"version":3,"file":"inboxHandlers.d.ts","sourceRoot":"","sources":["../../src/federation/inboxHandlers.ts"],"names":[],"mappings":"AAaA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAoBtC,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,EAAE,CAAC;IACP,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,qCAAqC;IACrC,gBAAgB,CAAC,EAAE;QACjB,sBAAsB,CAAC,EAAE,OAAO,CAAC;QACjC,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,cAAc,CAkoB7E"}
|
|
@@ -20,7 +20,7 @@ async function notifyRemoteInteraction(db, localUserId, type, actorUri, title, m
|
|
|
20
20
|
*/
|
|
21
21
|
export function createInboxHandlers(opts) {
|
|
22
22
|
const { db, domain, autoAcceptFollows = true } = opts;
|
|
23
|
-
|
|
23
|
+
const handlers = {
|
|
24
24
|
/**
|
|
25
25
|
* Remote user wants to follow a local user.
|
|
26
26
|
* Creates a follow relationship and optionally auto-accepts.
|
|
@@ -96,6 +96,20 @@ export function createInboxHandlers(opts) {
|
|
|
96
96
|
.update(followRelationships)
|
|
97
97
|
.set({ status: 'accepted', updatedAt: new Date() })
|
|
98
98
|
.where(eq(followRelationships.id, pending[0].id));
|
|
99
|
+
// Auto-backfill: if this Accept is for an instance mirror and config says to backfill
|
|
100
|
+
if (opts.federationConfig?.backfillOnMirrorAccept) {
|
|
101
|
+
try {
|
|
102
|
+
const { getMirror, listMirrors } = await import('./mirroring.js');
|
|
103
|
+
const mirrors = await listMirrors(db);
|
|
104
|
+
const mirror = mirrors.find((m) => m.remoteActorUri === actorUri && m.direction === 'pull');
|
|
105
|
+
if (mirror) {
|
|
106
|
+
const { backfillFromOutbox } = await import('./backfill.js');
|
|
107
|
+
// Fire and forget — don't block the Accept processing
|
|
108
|
+
backfillFromOutbox(db, actorUri, domain, opts.federationConfig?.mirrorMaxItems).catch((err) => console.error('[federation] auto-backfill failed:', err instanceof Error ? err.message : err));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch { /* non-critical */ }
|
|
112
|
+
}
|
|
99
113
|
}
|
|
100
114
|
await db.insert(activities).values({
|
|
101
115
|
type: 'Accept',
|
|
@@ -322,7 +336,13 @@ export function createInboxHandlers(opts) {
|
|
|
322
336
|
const cpubType = typeof object['cpub:type'] === 'string' ? object['cpub:type'] : null;
|
|
323
337
|
const cpubMetadata = object['cpub:metadata'] ?? null;
|
|
324
338
|
// Check if this content matches an active mirror config
|
|
325
|
-
|
|
339
|
+
// Extract sender domain from actorUri for re-broadcast matching
|
|
340
|
+
let senderDomain;
|
|
341
|
+
try {
|
|
342
|
+
senderDomain = new URL(actorUri).hostname;
|
|
343
|
+
}
|
|
344
|
+
catch { /* ignore */ }
|
|
345
|
+
const mirrorId = await matchMirrorForContent(db, originDomain, objectType, cpubType, tags, senderDomain);
|
|
326
346
|
// Upsert federated content (objectUri is unique — prevents duplicates)
|
|
327
347
|
if (objectUri) {
|
|
328
348
|
await db
|
|
@@ -352,6 +372,8 @@ export function createInboxHandlers(opts) {
|
|
|
352
372
|
content: sanitizedContent || null,
|
|
353
373
|
title: typeof object.name === 'string' ? object.name : null,
|
|
354
374
|
summary: typeof object.summary === 'string' ? sanitizeHtml(object.summary) : null,
|
|
375
|
+
// Preserve cpubType: use new value if present, otherwise keep existing
|
|
376
|
+
cpubType: cpubType ?? sql `${federatedContent.cpubType}`,
|
|
355
377
|
updatedAt: new Date(),
|
|
356
378
|
},
|
|
357
379
|
});
|
|
@@ -420,10 +442,18 @@ export function createInboxHandlers(opts) {
|
|
|
420
442
|
updates.summary = sanitizeHtml(object.summary);
|
|
421
443
|
if (typeof object.url === 'string')
|
|
422
444
|
updates.url = object.url;
|
|
423
|
-
await db
|
|
445
|
+
const updateResult = await db
|
|
424
446
|
.update(federatedContent)
|
|
425
447
|
.set(updates)
|
|
426
|
-
.where(and(eq(federatedContent.objectUri, objectUri), eq(federatedContent.actorUri, actorUri)))
|
|
448
|
+
.where(and(eq(federatedContent.objectUri, objectUri), eq(federatedContent.actorUri, actorUri)))
|
|
449
|
+
.returning({ id: federatedContent.id });
|
|
450
|
+
// If no rows updated, content doesn't exist locally — treat as new content
|
|
451
|
+
// This handles the case where an Update arrives before a Create (e.g., missed during backfill)
|
|
452
|
+
if (updateResult.length === 0) {
|
|
453
|
+
// Delegate to onCreate to store the content
|
|
454
|
+
await handlers.onCreate(actorUri, object);
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
427
457
|
}
|
|
428
458
|
await db.insert(activities).values({
|
|
429
459
|
type: 'Update',
|
|
@@ -550,5 +580,6 @@ export function createInboxHandlers(opts) {
|
|
|
550
580
|
});
|
|
551
581
|
},
|
|
552
582
|
};
|
|
583
|
+
return handlers;
|
|
553
584
|
}
|
|
554
585
|
//# sourceMappingURL=inboxHandlers.js.map
|