@commonpub/server 0.5.0 → 0.7.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.
Files changed (43) hide show
  1. package/dist/federation/delivery.d.ts.map +1 -1
  2. package/dist/federation/delivery.js +136 -20
  3. package/dist/federation/delivery.js.map +1 -1
  4. package/dist/federation/federation.d.ts +41 -0
  5. package/dist/federation/federation.d.ts.map +1 -1
  6. package/dist/federation/federation.js +248 -20
  7. package/dist/federation/federation.js.map +1 -1
  8. package/dist/federation/hubFederation.d.ts +38 -0
  9. package/dist/federation/hubFederation.d.ts.map +1 -0
  10. package/dist/federation/hubFederation.js +212 -0
  11. package/dist/federation/hubFederation.js.map +1 -0
  12. package/dist/federation/inboxHandlers.d.ts.map +1 -1
  13. package/dist/federation/inboxHandlers.js +260 -49
  14. package/dist/federation/inboxHandlers.js.map +1 -1
  15. package/dist/federation/index.d.ts +5 -1
  16. package/dist/federation/index.d.ts.map +1 -1
  17. package/dist/federation/index.js +5 -1
  18. package/dist/federation/index.js.map +1 -1
  19. package/dist/federation/mirroring.d.ts +65 -0
  20. package/dist/federation/mirroring.d.ts.map +1 -0
  21. package/dist/federation/mirroring.js +151 -0
  22. package/dist/federation/mirroring.js.map +1 -0
  23. package/dist/federation/oauth.d.ts +115 -0
  24. package/dist/federation/oauth.d.ts.map +1 -0
  25. package/dist/federation/oauth.js +277 -0
  26. package/dist/federation/oauth.js.map +1 -0
  27. package/dist/federation/timeline.d.ts +89 -0
  28. package/dist/federation/timeline.d.ts.map +1 -0
  29. package/dist/federation/timeline.js +344 -0
  30. package/dist/federation/timeline.js.map +1 -0
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/social/index.d.ts +1 -1
  36. package/dist/social/index.d.ts.map +1 -1
  37. package/dist/social/index.js +1 -1
  38. package/dist/social/index.js.map +1 -1
  39. package/dist/social/social.d.ts +1 -0
  40. package/dist/social/social.d.ts.map +1 -1
  41. package/dist/social/social.js +8 -1
  42. package/dist/social/social.js.map +1 -1
  43. package/package.json +6 -6
@@ -1,6 +1,6 @@
1
1
  import { eq, and, desc, sql } from 'drizzle-orm';
2
- import { users, remoteActors, activities, followRelationships, actorKeypairs, contentItems, } from '@commonpub/schema';
3
- import { generateKeypair, exportPublicKeyPem, exportPrivateKeyPem, resolveActor, contentToArticle, buildCreateActivity, buildUpdateActivity, buildDeleteActivity, buildFollowActivity, buildAcceptActivity, buildRejectActivity, buildUndoActivity, buildLikeActivity, } from '@commonpub/protocol';
2
+ import { users, remoteActors, activities, followRelationships, actorKeypairs, contentItems, instanceSettings, } from '@commonpub/schema';
3
+ import { generateKeypair, exportPublicKeyPem, exportPrivateKeyPem, resolveActor, resolveActorViaWebFinger, contentToArticle, buildCreateActivity, buildUpdateActivity, buildDeleteActivity, buildFollowActivity, buildAcceptActivity, buildRejectActivity, buildUndoActivity, buildLikeActivity, } from '@commonpub/protocol';
4
4
  // --- Keypair Management ---
5
5
  export async function getOrCreateActorKeypair(db, userId) {
6
6
  const existing = await db
@@ -24,6 +24,52 @@ export async function getOrCreateActorKeypair(db, userId) {
24
24
  });
25
25
  return { publicKeyPem, privateKeyPem };
26
26
  }
27
+ const INSTANCE_KEYPAIR_KEY = 'instance_keypair';
28
+ /**
29
+ * Get or create the instance-level keypair (for the Service actor at /actor).
30
+ * Stored in instanceSettings since actorKeypairs requires a userId FK.
31
+ */
32
+ export async function getOrCreateInstanceKeypair(db) {
33
+ const existing = await db
34
+ .select()
35
+ .from(instanceSettings)
36
+ .where(eq(instanceSettings.key, INSTANCE_KEYPAIR_KEY))
37
+ .limit(1);
38
+ if (existing.length > 0) {
39
+ const val = existing[0].value;
40
+ return val;
41
+ }
42
+ const keypair = await generateKeypair();
43
+ const publicKeyPem = await exportPublicKeyPem(keypair);
44
+ const privateKeyPem = await exportPrivateKeyPem(keypair);
45
+ await db.insert(instanceSettings).values({
46
+ key: INSTANCE_KEYPAIR_KEY,
47
+ value: { publicKeyPem, privateKeyPem },
48
+ });
49
+ return { publicKeyPem, privateKeyPem };
50
+ }
51
+ /**
52
+ * Build the instance actor AP object (Service type).
53
+ */
54
+ export function buildInstanceActor(domain, publicKeyPem) {
55
+ const actorUri = `https://${domain}/actor`;
56
+ return {
57
+ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'],
58
+ type: 'Service',
59
+ id: actorUri,
60
+ preferredUsername: domain,
61
+ name: domain,
62
+ inbox: `https://${domain}/inbox`,
63
+ outbox: `${actorUri}/outbox`,
64
+ followers: `${actorUri}/followers`,
65
+ following: `${actorUri}/following`,
66
+ publicKey: {
67
+ id: `${actorUri}#main-key`,
68
+ owner: actorUri,
69
+ publicKeyPem,
70
+ },
71
+ };
72
+ }
27
73
  // --- Actor Resolution ---
28
74
  export async function resolveRemoteActor(db, actorUri) {
29
75
  // Check cache first
@@ -45,9 +91,11 @@ export async function resolveRemoteActor(db, actorUri) {
45
91
  outbox: c.outbox ?? undefined,
46
92
  preferredUsername: c.preferredUsername ?? undefined,
47
93
  name: c.displayName ?? undefined,
94
+ summary: c.summary ?? undefined,
48
95
  publicKey: c.publicKeyPem
49
96
  ? { id: `${c.actorUri}#main-key`, owner: c.actorUri, publicKeyPem: c.publicKeyPem }
50
97
  : undefined,
98
+ endpoints: c.sharedInbox ? { sharedInbox: c.sharedInbox } : undefined,
51
99
  };
52
100
  }
53
101
  }
@@ -58,36 +106,174 @@ export async function resolveRemoteActor(db, actorUri) {
58
106
  // Extract domain
59
107
  const url = new URL(actorUri);
60
108
  const instanceDomain = url.hostname;
61
- // Upsert cache
109
+ // Upsert cache — include all fields the protocol returns
110
+ const actorData = {
111
+ inbox: actor.inbox,
112
+ outbox: actor.outbox,
113
+ sharedInbox: actor.endpoints?.sharedInbox,
114
+ publicKeyPem: actor.publicKey?.publicKeyPem,
115
+ preferredUsername: actor.preferredUsername,
116
+ displayName: actor.name,
117
+ summary: actor.summary,
118
+ avatarUrl: actor.icon?.url,
119
+ lastFetchedAt: new Date(),
120
+ };
62
121
  if (cached.length > 0) {
63
122
  await db
64
123
  .update(remoteActors)
65
- .set({
66
- inbox: actor.inbox,
67
- outbox: actor.outbox,
68
- publicKeyPem: actor.publicKey?.publicKeyPem,
69
- preferredUsername: actor.preferredUsername,
70
- displayName: actor.name,
71
- avatarUrl: actor.icon?.url,
72
- lastFetchedAt: new Date(),
73
- })
124
+ .set(actorData)
74
125
  .where(eq(remoteActors.actorUri, actorUri));
75
126
  }
76
127
  else {
77
128
  await db.insert(remoteActors).values({
78
129
  actorUri,
79
- inbox: actor.inbox,
80
- outbox: actor.outbox,
81
- publicKeyPem: actor.publicKey?.publicKeyPem,
82
- preferredUsername: actor.preferredUsername,
83
- displayName: actor.name,
84
- avatarUrl: actor.icon?.url,
130
+ ...actorData,
85
131
  instanceDomain,
86
- lastFetchedAt: new Date(),
87
132
  });
88
133
  }
89
134
  return actor;
90
135
  }
136
+ /**
137
+ * Search for a remote actor by handle (`@user@domain` or `user@domain`).
138
+ * Does WebFinger discovery, caches the result, and returns a profile.
139
+ */
140
+ export async function searchRemoteActor(db, query, localDomain, localUserId) {
141
+ // Parse @user@domain or user@domain
142
+ const cleaned = query.replace(/^@/, '');
143
+ const atIndex = cleaned.indexOf('@');
144
+ if (atIndex === -1)
145
+ return null;
146
+ const username = cleaned.slice(0, atIndex);
147
+ const domain = cleaned.slice(atIndex + 1);
148
+ if (!username || !domain)
149
+ return null;
150
+ // Don't look up local users via federation
151
+ if (domain === localDomain)
152
+ return null;
153
+ // WebFinger resolution — returns null on any network/DNS/parse error
154
+ let actor;
155
+ try {
156
+ actor = await resolveActorViaWebFinger(username, domain, fetch);
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ if (!actor)
162
+ return null;
163
+ // Cache the resolved actor
164
+ const instanceDomain = domain;
165
+ const existing = await db
166
+ .select()
167
+ .from(remoteActors)
168
+ .where(eq(remoteActors.actorUri, actor.id))
169
+ .limit(1);
170
+ const actorData = {
171
+ inbox: actor.inbox,
172
+ outbox: actor.outbox,
173
+ sharedInbox: actor.endpoints?.sharedInbox,
174
+ publicKeyPem: actor.publicKey?.publicKeyPem,
175
+ preferredUsername: actor.preferredUsername,
176
+ displayName: actor.name,
177
+ summary: actor.summary,
178
+ avatarUrl: actor.icon?.url,
179
+ lastFetchedAt: new Date(),
180
+ };
181
+ if (existing.length > 0) {
182
+ await db
183
+ .update(remoteActors)
184
+ .set(actorData)
185
+ .where(eq(remoteActors.actorUri, actor.id));
186
+ }
187
+ else {
188
+ await db.insert(remoteActors).values({
189
+ actorUri: actor.id,
190
+ ...actorData,
191
+ instanceDomain,
192
+ });
193
+ }
194
+ // Re-read to get the canonical DB row with correct null types
195
+ const [dbRow] = await db
196
+ .select()
197
+ .from(remoteActors)
198
+ .where(eq(remoteActors.actorUri, actor.id))
199
+ .limit(1);
200
+ if (!dbRow)
201
+ return null;
202
+ // Check follow status if local user is specified
203
+ let isFollowing = false;
204
+ let isFollowPending = false;
205
+ if (localUserId) {
206
+ const localUser = await db.select().from(users).where(eq(users.id, localUserId)).limit(1);
207
+ if (localUser[0]) {
208
+ const localActorUri = `https://${localDomain}/users/${localUser[0].username}`;
209
+ const followRel = await db
210
+ .select()
211
+ .from(followRelationships)
212
+ .where(and(eq(followRelationships.followerActorUri, localActorUri), eq(followRelationships.followingActorUri, actor.id)))
213
+ .limit(1);
214
+ if (followRel.length > 0) {
215
+ isFollowing = followRel[0].status === 'accepted';
216
+ isFollowPending = followRel[0].status === 'pending';
217
+ }
218
+ }
219
+ }
220
+ return {
221
+ actorUri: actor.id,
222
+ inbox: actor.inbox,
223
+ preferredUsername: dbRow.preferredUsername,
224
+ displayName: dbRow.displayName,
225
+ summary: dbRow.summary,
226
+ avatarUrl: dbRow.avatarUrl,
227
+ bannerUrl: dbRow.bannerUrl,
228
+ instanceDomain,
229
+ followerCount: dbRow.followerCount,
230
+ followingCount: dbRow.followingCount,
231
+ isFollowing,
232
+ isFollowPending,
233
+ };
234
+ }
235
+ /** Get a cached remote actor profile from the database */
236
+ export async function getRemoteActorProfile(db, actorUri, localDomain, localUserId) {
237
+ const rows = await db
238
+ .select()
239
+ .from(remoteActors)
240
+ .where(eq(remoteActors.actorUri, actorUri))
241
+ .limit(1);
242
+ if (rows.length === 0)
243
+ return null;
244
+ const r = rows[0];
245
+ let isFollowing = false;
246
+ let isFollowPending = false;
247
+ if (localUserId && localDomain) {
248
+ const localUser = await db.select().from(users).where(eq(users.id, localUserId)).limit(1);
249
+ if (localUser[0]) {
250
+ const localActorUri = `https://${localDomain}/users/${localUser[0].username}`;
251
+ const followRel = await db
252
+ .select()
253
+ .from(followRelationships)
254
+ .where(and(eq(followRelationships.followerActorUri, localActorUri), eq(followRelationships.followingActorUri, actorUri)))
255
+ .limit(1);
256
+ if (followRel.length > 0) {
257
+ isFollowing = followRel[0].status === 'accepted';
258
+ isFollowPending = followRel[0].status === 'pending';
259
+ }
260
+ }
261
+ }
262
+ return {
263
+ actorUri: r.actorUri,
264
+ inbox: r.inbox,
265
+ preferredUsername: r.preferredUsername,
266
+ displayName: r.displayName,
267
+ summary: r.summary,
268
+ avatarUrl: r.avatarUrl,
269
+ bannerUrl: r.bannerUrl,
270
+ instanceDomain: r.instanceDomain,
271
+ followerCount: r.followerCount,
272
+ followingCount: r.followingCount,
273
+ isFollowing,
274
+ isFollowPending,
275
+ };
276
+ }
91
277
  // --- Follow Management ---
92
278
  export async function sendFollow(db, localUserId, remoteActorUri, domain) {
93
279
  const user = await db.select().from(users).where(eq(users.id, localUserId)).limit(1);
@@ -188,6 +374,9 @@ export async function federateContent(db, contentId, domain) {
188
374
  .limit(1);
189
375
  if (!rows[0])
190
376
  return;
377
+ // Only federate published content — guard against callers passing draft/archived content
378
+ if (rows[0].content.status !== 'published')
379
+ return;
191
380
  const { content, author } = rows[0];
192
381
  const actorUri = `https://${domain}/users/${author.username}`;
193
382
  const article = contentToArticle(content, author, domain);
@@ -213,6 +402,9 @@ export async function federateUpdate(db, contentId, domain) {
213
402
  .limit(1);
214
403
  if (!rows[0])
215
404
  return;
405
+ // Only federate published content — drafts and archived content should not be sent
406
+ if (rows[0].content.status !== 'published')
407
+ return;
216
408
  const { content, author } = rows[0];
217
409
  const actorUri = `https://${domain}/users/${author.username}`;
218
410
  const article = contentToArticle(content, author, domain);
@@ -227,8 +419,16 @@ export async function federateUpdate(db, contentId, domain) {
227
419
  });
228
420
  }
229
421
  export async function federateDelete(db, contentId, domain, authorUsername) {
422
+ // Look up slug to construct the canonical URI matching the original Create activity
423
+ const rows = await db
424
+ .select({ slug: contentItems.slug })
425
+ .from(contentItems)
426
+ .where(eq(contentItems.id, contentId))
427
+ .limit(1);
428
+ const slug = rows[0]?.slug;
230
429
  const actorUri = `https://${domain}/users/${authorUsername}`;
231
- const objectUri = `https://${domain}/content/${contentId}`;
430
+ // Use slug-based URI (matches contentToArticle output); fall back to UUID if content already purged
431
+ const objectUri = `https://${domain}/content/${slug ?? contentId}`;
232
432
  const activity = buildDeleteActivity(domain, actorUri, objectUri, 'Article');
233
433
  await db.insert(activities).values({
234
434
  type: 'Delete',
@@ -254,6 +454,34 @@ export async function federateLike(db, userId, contentUri, domain) {
254
454
  status: 'pending',
255
455
  });
256
456
  }
457
+ export async function federateUnlike(db, userId, contentUri, domain) {
458
+ const user = await db.select().from(users).where(eq(users.id, userId)).limit(1);
459
+ if (!user[0])
460
+ return;
461
+ const actorUri = `https://${domain}/users/${user[0].username}`;
462
+ const activity = buildUndoActivity(domain, actorUri, contentUri);
463
+ await db.insert(activities).values({
464
+ type: 'Undo',
465
+ actorUri,
466
+ objectUri: contentUri,
467
+ payload: activity,
468
+ direction: 'outbound',
469
+ status: 'pending',
470
+ });
471
+ }
472
+ /** Build a content URI from a slug and domain (matches contentToArticle output) */
473
+ export function buildContentUri(domain, slug) {
474
+ return `https://${domain}/content/${slug}`;
475
+ }
476
+ /** Look up content slug by ID for federation URI construction */
477
+ export async function getContentSlugById(db, contentId) {
478
+ const rows = await db
479
+ .select({ slug: contentItems.slug })
480
+ .from(contentItems)
481
+ .where(eq(contentItems.id, contentId))
482
+ .limit(1);
483
+ return rows[0]?.slug ?? null;
484
+ }
257
485
  // --- Queries ---
258
486
  export async function getFollowers(db, actorUri) {
259
487
  return db
@@ -1 +1 @@
1
- {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/federation/federation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/federation/federation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type APGroup } from '@commonpub/protocol';
2
+ import type { DB } from '../types.js';
3
+ export declare function getHubActorUri(domain: string, slug: string): string;
4
+ /**
5
+ * Get or create a keypair for a hub's Group actor.
6
+ */
7
+ export declare function getOrCreateHubKeypair(db: DB, hubId: string): Promise<{
8
+ publicKeyPem: string;
9
+ privateKeyPem: string;
10
+ }>;
11
+ /**
12
+ * Build the AP Group actor object for a hub.
13
+ */
14
+ export declare function buildHubGroupActor(db: DB, hubSlug: string, domain: string): Promise<APGroup | null>;
15
+ /**
16
+ * Accept a remote follow on a hub. Called from inbox handler when Follow targets a hub actor.
17
+ */
18
+ export declare function handleHubFollow(db: DB, hubSlug: string, followerActorUri: string, activityId: string, domain: string): Promise<void>;
19
+ /**
20
+ * Handle Undo(Follow) for a hub.
21
+ */
22
+ export declare function handleHubUnfollow(db: DB, hubSlug: string, followerActorUri: string, activityUri?: string): Promise<void>;
23
+ /**
24
+ * Get accepted followers for a hub.
25
+ */
26
+ export declare function getHubFederatedFollowers(db: DB, hubId: string): Promise<Array<{
27
+ followerActorUri: string;
28
+ }>>;
29
+ /**
30
+ * Federate a hub post as an Announce from the Group actor.
31
+ * Called when content is posted or shared to a hub.
32
+ */
33
+ export declare function federateHubPost(db: DB, postId: string, hubId: string, domain: string): Promise<void>;
34
+ /**
35
+ * Federate a content share to a hub as an Announce.
36
+ */
37
+ export declare function federateHubShare(db: DB, contentObjectUri: string, hubId: string, domain: string): Promise<void>;
38
+ //# sourceMappingURL=hubFederation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubFederation.d.ts","sourceRoot":"","sources":["../../src/federation/hubFederation.ts"],"names":[],"mappings":"AAeA,OAAO,EAQL,KAAK,OAAO,EACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAItC,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB1D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CA+BzB;AAID;;GAEG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAgDf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,EACxB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,KAAK,CAAC;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAU9C;AAID;;;GAGG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Hub (Group) federation — FEP-1b12 compliant hub federation.
3
+ * Hubs become Group actors that can be followed by remote users.
4
+ * Hub content is federated as Announce activities from the Group actor.
5
+ */
6
+ import { eq, and } from 'drizzle-orm';
7
+ import { hubs, hubActorKeypairs, hubFollowers, hubPosts, users, activities, } from '@commonpub/schema';
8
+ import { generateKeypair, exportPublicKeyPem, exportPrivateKeyPem, buildAnnounceActivity, buildAcceptActivity, contentToNote, AP_CONTEXT, } from '@commonpub/protocol';
9
+ // --- Hub Actor Management ---
10
+ export function getHubActorUri(domain, slug) {
11
+ return `https://${domain}/hubs/${slug}`;
12
+ }
13
+ /**
14
+ * Get or create a keypair for a hub's Group actor.
15
+ */
16
+ export async function getOrCreateHubKeypair(db, hubId) {
17
+ const existing = await db
18
+ .select()
19
+ .from(hubActorKeypairs)
20
+ .where(eq(hubActorKeypairs.hubId, hubId))
21
+ .limit(1);
22
+ if (existing.length > 0) {
23
+ return {
24
+ publicKeyPem: existing[0].publicKeyPem,
25
+ privateKeyPem: existing[0].privateKeyPem,
26
+ };
27
+ }
28
+ const keypair = await generateKeypair();
29
+ const publicKeyPem = await exportPublicKeyPem(keypair);
30
+ const privateKeyPem = await exportPrivateKeyPem(keypair);
31
+ await db.insert(hubActorKeypairs).values({
32
+ hubId,
33
+ publicKeyPem,
34
+ privateKeyPem,
35
+ });
36
+ return { publicKeyPem, privateKeyPem };
37
+ }
38
+ /**
39
+ * Build the AP Group actor object for a hub.
40
+ */
41
+ export async function buildHubGroupActor(db, hubSlug, domain) {
42
+ const [hub] = await db
43
+ .select()
44
+ .from(hubs)
45
+ .where(eq(hubs.slug, hubSlug))
46
+ .limit(1);
47
+ if (!hub)
48
+ return null;
49
+ const keypair = await getOrCreateHubKeypair(db, hub.id);
50
+ const actorUri = getHubActorUri(domain, hub.slug);
51
+ return {
52
+ '@context': [AP_CONTEXT, 'https://w3id.org/security/v1'],
53
+ type: 'Group',
54
+ id: actorUri,
55
+ preferredUsername: hub.slug,
56
+ name: hub.name,
57
+ summary: hub.description ?? undefined,
58
+ inbox: `${actorUri}/inbox`,
59
+ outbox: `${actorUri}/outbox`,
60
+ followers: `${actorUri}/followers`,
61
+ url: `https://${domain}/hubs/${hub.slug}`,
62
+ icon: hub.iconUrl ? { type: 'Image', url: hub.iconUrl } : undefined,
63
+ image: hub.bannerUrl ? { type: 'Image', url: hub.bannerUrl } : undefined,
64
+ publicKey: {
65
+ id: `${actorUri}#main-key`,
66
+ owner: actorUri,
67
+ publicKeyPem: keypair.publicKeyPem,
68
+ },
69
+ };
70
+ }
71
+ // --- Hub Follow Management ---
72
+ /**
73
+ * Accept a remote follow on a hub. Called from inbox handler when Follow targets a hub actor.
74
+ */
75
+ export async function handleHubFollow(db, hubSlug, followerActorUri, activityId, domain) {
76
+ const [hub] = await db
77
+ .select()
78
+ .from(hubs)
79
+ .where(eq(hubs.slug, hubSlug))
80
+ .limit(1);
81
+ if (!hub)
82
+ return;
83
+ // Upsert hub follower
84
+ const existing = await db
85
+ .select()
86
+ .from(hubFollowers)
87
+ .where(and(eq(hubFollowers.hubId, hub.id), eq(hubFollowers.followerActorUri, followerActorUri)))
88
+ .limit(1);
89
+ if (existing.length > 0) {
90
+ await db
91
+ .update(hubFollowers)
92
+ .set({ status: 'accepted', activityUri: activityId, updatedAt: new Date() })
93
+ .where(eq(hubFollowers.id, existing[0].id));
94
+ }
95
+ else {
96
+ await db.insert(hubFollowers).values({
97
+ hubId: hub.id,
98
+ followerActorUri,
99
+ activityUri: activityId,
100
+ status: hub.privacy === 'public' && hub.joinPolicy === 'open' ? 'accepted' : 'pending',
101
+ });
102
+ }
103
+ // Auto-accept for public open hubs
104
+ if (hub.privacy === 'public' && hub.joinPolicy === 'open') {
105
+ const hubActorUri = getHubActorUri(domain, hub.slug);
106
+ const acceptActivity = buildAcceptActivity(domain, hubActorUri, activityId);
107
+ await db.insert(activities).values({
108
+ type: 'Accept',
109
+ actorUri: hubActorUri,
110
+ objectUri: followerActorUri,
111
+ payload: acceptActivity,
112
+ direction: 'outbound',
113
+ status: 'pending',
114
+ });
115
+ }
116
+ }
117
+ /**
118
+ * Handle Undo(Follow) for a hub.
119
+ */
120
+ export async function handleHubUnfollow(db, hubSlug, followerActorUri, activityUri) {
121
+ const [hub] = await db
122
+ .select()
123
+ .from(hubs)
124
+ .where(eq(hubs.slug, hubSlug))
125
+ .limit(1);
126
+ if (!hub)
127
+ return;
128
+ // Try exact match on activityUri first
129
+ if (activityUri) {
130
+ const byActivity = await db
131
+ .select({ id: hubFollowers.id })
132
+ .from(hubFollowers)
133
+ .where(and(eq(hubFollowers.hubId, hub.id), eq(hubFollowers.followerActorUri, followerActorUri), eq(hubFollowers.activityUri, activityUri)))
134
+ .limit(1);
135
+ if (byActivity.length > 0) {
136
+ await db.delete(hubFollowers).where(eq(hubFollowers.id, byActivity[0].id));
137
+ return;
138
+ }
139
+ }
140
+ // Fallback: delete the follow for this actor in this hub
141
+ await db.delete(hubFollowers).where(and(eq(hubFollowers.hubId, hub.id), eq(hubFollowers.followerActorUri, followerActorUri)));
142
+ }
143
+ /**
144
+ * Get accepted followers for a hub.
145
+ */
146
+ export async function getHubFederatedFollowers(db, hubId) {
147
+ return db
148
+ .select({ followerActorUri: hubFollowers.followerActorUri })
149
+ .from(hubFollowers)
150
+ .where(and(eq(hubFollowers.hubId, hubId), eq(hubFollowers.status, 'accepted')));
151
+ }
152
+ // --- Hub Content Federation ---
153
+ /**
154
+ * Federate a hub post as an Announce from the Group actor.
155
+ * Called when content is posted or shared to a hub.
156
+ */
157
+ export async function federateHubPost(db, postId, hubId, domain) {
158
+ const [hub] = await db.select().from(hubs).where(eq(hubs.id, hubId)).limit(1);
159
+ if (!hub)
160
+ return;
161
+ const [post] = await db
162
+ .select({
163
+ post: hubPosts,
164
+ author: { username: users.username, displayName: users.displayName },
165
+ })
166
+ .from(hubPosts)
167
+ .innerJoin(users, eq(hubPosts.authorId, users.id))
168
+ .where(eq(hubPosts.id, postId))
169
+ .limit(1);
170
+ if (!post)
171
+ return;
172
+ const hubActorUri = getHubActorUri(domain, hub.slug);
173
+ const followersUri = `${hubActorUri}/followers`;
174
+ // Build the post as a Note attributed to the author
175
+ const note = contentToNote({
176
+ id: post.post.id,
177
+ content: post.post.content,
178
+ targetId: hubActorUri,
179
+ targetType: 'hub',
180
+ createdAt: post.post.createdAt,
181
+ }, { username: post.author.username, displayName: post.author.displayName }, domain);
182
+ // The hub Group actor Announces the Note
183
+ const announce = buildAnnounceActivity(domain, hubActorUri, note.id, followersUri);
184
+ await db.insert(activities).values({
185
+ type: 'Announce',
186
+ actorUri: hubActorUri,
187
+ objectUri: note.id,
188
+ payload: announce,
189
+ direction: 'outbound',
190
+ status: 'pending',
191
+ });
192
+ }
193
+ /**
194
+ * Federate a content share to a hub as an Announce.
195
+ */
196
+ export async function federateHubShare(db, contentObjectUri, hubId, domain) {
197
+ const [hub] = await db.select().from(hubs).where(eq(hubs.id, hubId)).limit(1);
198
+ if (!hub)
199
+ return;
200
+ const hubActorUri = getHubActorUri(domain, hub.slug);
201
+ const followersUri = `${hubActorUri}/followers`;
202
+ const announce = buildAnnounceActivity(domain, hubActorUri, contentObjectUri, followersUri);
203
+ await db.insert(activities).values({
204
+ type: 'Announce',
205
+ actorUri: hubActorUri,
206
+ objectUri: contentObjectUri,
207
+ payload: announce,
208
+ direction: 'outbound',
209
+ status: 'pending',
210
+ });
211
+ }
212
+ //# sourceMappingURL=hubFederation.js.map