@commonpub/server 2.72.0 → 2.74.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 (53) hide show
  1. package/dist/content/content.d.ts.map +1 -1
  2. package/dist/content/content.js +7 -2
  3. package/dist/content/content.js.map +1 -1
  4. package/dist/contest/contest.d.ts +2 -0
  5. package/dist/contest/contest.d.ts.map +1 -1
  6. package/dist/contest/contest.js +22 -9
  7. package/dist/contest/contest.js.map +1 -1
  8. package/dist/federation/backfill.d.ts +9 -1
  9. package/dist/federation/backfill.d.ts.map +1 -1
  10. package/dist/federation/backfill.js +33 -2
  11. package/dist/federation/backfill.js.map +1 -1
  12. package/dist/federation/delivery.d.ts.map +1 -1
  13. package/dist/federation/delivery.js +3 -2
  14. package/dist/federation/delivery.js.map +1 -1
  15. package/dist/federation/federation.d.ts.map +1 -1
  16. package/dist/federation/federation.js +14 -5
  17. package/dist/federation/federation.js.map +1 -1
  18. package/dist/federation/hubMirroring.d.ts.map +1 -1
  19. package/dist/federation/hubMirroring.js +8 -0
  20. package/dist/federation/hubMirroring.js.map +1 -1
  21. package/dist/federation/inboxHandlers.d.ts.map +1 -1
  22. package/dist/federation/inboxHandlers.js +86 -1
  23. package/dist/federation/inboxHandlers.js.map +1 -1
  24. package/dist/federation/index.d.ts +2 -1
  25. package/dist/federation/index.d.ts.map +1 -1
  26. package/dist/federation/index.js +2 -1
  27. package/dist/federation/index.js.map +1 -1
  28. package/dist/federation/mirroring.d.ts +56 -2
  29. package/dist/federation/mirroring.d.ts.map +1 -1
  30. package/dist/federation/mirroring.js +281 -32
  31. package/dist/federation/mirroring.js.map +1 -1
  32. package/dist/federation/outboxQueries.d.ts +9 -11
  33. package/dist/federation/outboxQueries.d.ts.map +1 -1
  34. package/dist/federation/outboxQueries.js +102 -41
  35. package/dist/federation/outboxQueries.js.map +1 -1
  36. package/dist/federation/registry.d.ts +79 -0
  37. package/dist/federation/registry.d.ts.map +1 -0
  38. package/dist/federation/registry.js +205 -0
  39. package/dist/federation/registry.js.map +1 -0
  40. package/dist/hub/members.d.ts.map +1 -1
  41. package/dist/hub/members.js +11 -7
  42. package/dist/hub/members.js.map +1 -1
  43. package/dist/hub/posts.d.ts.map +1 -1
  44. package/dist/hub/posts.js +3 -1
  45. package/dist/hub/posts.js.map +1 -1
  46. package/dist/index.d.ts +1 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +1 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/social/social.d.ts.map +1 -1
  51. package/dist/social/social.js +9 -0
  52. package/dist/social/social.js.map +1 -1
  53. package/package.json +6 -6
@@ -1,45 +1,121 @@
1
1
  /**
2
2
  * Outbox queries — serve paginated outbound activities for AP actor outboxes.
3
3
  * Used by /actor/outbox (instance) and /users/[username]/outbox (per-user) routes.
4
+ *
5
+ * Content outboxes (instance + per-user) are a PROJECTION over published content
6
+ * (`content_items`), NOT a scan of the `activities` delivery queue. This matters:
7
+ * the queue only ever held activities that were *delivered* to a follower, so anything
8
+ * published before a mirror followed (or whose delivery stalled) was invisible forever —
9
+ * a mirror's backfill saw an almost-empty outbox. Projecting over `content_items` makes
10
+ * the outbox reflect the actor's actual published catalogue, so bounded backfill works.
11
+ *
12
+ * SECURITY: the projection gates `status='published' AND visibility='public'`. The outbox
13
+ * is publicly crawlable, so members-only / private content must never appear here (this
14
+ * also keeps the outbox consistent with what `federateContent` is allowed to deliver).
15
+ * `content_type` is intentionally NOT filtered: every value of `contentTypeEnum`
16
+ * (project/article/blog/explainer) federates; non-federating surfaces (docs, learning,
17
+ * videos, …) are separate tables, not `content_items`.
18
+ *
19
+ * Ordering is `published_at DESC NULLS LAST, id DESC` to reuse `idx_content_items_feed_recency`
20
+ * (migration 0012) and give a stable, newest-first order (so a date-bounded backfill can
21
+ * stop early once it pages past its cutoff).
22
+ *
23
+ * Hub outboxes remain queue-derived (Announce activities) — hub federation is a separate
24
+ * Group-actor path and is out of scope here.
4
25
  */
5
- import { eq, and, sql, desc } from 'drizzle-orm';
6
- import { activities } from '@commonpub/schema';
26
+ import { eq, and, sql, desc, inArray, isNull } from 'drizzle-orm';
27
+ import { activities, contentItems, contentTags, tags, users } from '@commonpub/schema';
28
+ import { contentToCreateActivity } from '@commonpub/protocol';
7
29
  const DEFAULT_PAGE_SIZE = 20;
8
- /**
9
- * Count total outbox items for an actor.
10
- * Only counts delivered outbound Create/Update/Delete activities.
11
- */
12
- export async function countOutboxItems(db, actorUri) {
13
- const [result] = await db
14
- .select({ count: sql `count(*)::int` })
15
- .from(activities)
16
- .where(and(eq(activities.actorUri, actorUri), eq(activities.direction, 'outbound'), eq(activities.status, 'delivered'), sql `${activities.type} IN ('Create', 'Update', 'Delete')`));
17
- return result?.count ?? 0;
30
+ /** Extract the local username from a user actor URI (`https://domain/users/alice` → `alice`). */
31
+ function usernameFromActorUri(actorUri) {
32
+ const m = /\/users\/([^/]+)\/?$/.exec(actorUri);
33
+ return m?.[1] ?? null;
18
34
  }
19
- /**
20
- * Count total outbox items for the instance actor (all users' delivered Create activities).
21
- */
22
- export async function countInstanceOutboxItems(db, domain) {
35
+ /** Count published+public, non-deleted content rows matching an optional author filter. */
36
+ async function countContentOutbox(db, authorId) {
37
+ const where = and(eq(contentItems.status, 'published'), eq(contentItems.visibility, 'public'), isNull(contentItems.deletedAt), ...(authorId ? [eq(contentItems.authorId, authorId)] : []));
23
38
  const [result] = await db
24
39
  .select({ count: sql `count(*)::int` })
25
- .from(activities)
26
- .where(and(eq(activities.direction, 'outbound'), eq(activities.status, 'delivered'), eq(activities.type, 'Create'), sql `${activities.actorUri} LIKE ${'https://' + domain + '/users/%'}`));
40
+ .from(contentItems)
41
+ .where(where);
27
42
  return result?.count ?? 0;
28
43
  }
29
44
  /**
30
- * Get a page of outbox activities for a specific actor.
31
- * Returns the full activity payload (AP JSON-LD) for each item.
45
+ * Page of Create activities projected from published+public content.
46
+ * `authorId` undefined instance outbox (all authors); set that user's outbox.
32
47
  */
33
- export async function getOutboxPage(db, actorUri, page, pageSize = DEFAULT_PAGE_SIZE) {
48
+ async function getContentOutboxPage(db, domain, page, pageSize, authorId) {
34
49
  const offset = (page - 1) * pageSize;
50
+ const where = and(eq(contentItems.status, 'published'), eq(contentItems.visibility, 'public'), isNull(contentItems.deletedAt), ...(authorId ? [eq(contentItems.authorId, authorId)] : []));
35
51
  const rows = await db
36
- .select({ payload: activities.payload })
37
- .from(activities)
38
- .where(and(eq(activities.actorUri, actorUri), eq(activities.direction, 'outbound'), eq(activities.status, 'delivered'), sql `${activities.type} IN ('Create', 'Update', 'Delete')`))
39
- .orderBy(desc(activities.createdAt))
52
+ .select({
53
+ content: contentItems,
54
+ author: { username: users.username, displayName: users.displayName },
55
+ })
56
+ .from(contentItems)
57
+ .innerJoin(users, eq(contentItems.authorId, users.id))
58
+ .where(where)
59
+ .orderBy(sql `${contentItems.publishedAt} desc nulls last`, desc(contentItems.id))
40
60
  .limit(pageSize)
41
61
  .offset(offset);
42
- return rows.map((r) => r.payload);
62
+ if (rows.length === 0)
63
+ return [];
64
+ // Batch-fetch tags for this page (avoid N+1).
65
+ const contentIds = rows.map((r) => r.content.id);
66
+ const tagRows = await db
67
+ .select({ contentId: contentTags.contentId, name: tags.name })
68
+ .from(contentTags)
69
+ .innerJoin(tags, eq(contentTags.tagId, tags.id))
70
+ .where(inArray(contentTags.contentId, contentIds));
71
+ const tagsByContent = new Map();
72
+ for (const tr of tagRows) {
73
+ const arr = tagsByContent.get(tr.contentId) ?? [];
74
+ arr.push(tr.name);
75
+ tagsByContent.set(tr.contentId, arr);
76
+ }
77
+ return rows.map((r) => {
78
+ const input = { ...r.content, tags: tagsByContent.get(r.content.id) ?? [] };
79
+ return contentToCreateActivity(input, r.author, domain);
80
+ });
81
+ }
82
+ /**
83
+ * Count outbox items for a specific user actor (published+public content by that author).
84
+ */
85
+ export async function countOutboxItems(db, actorUri) {
86
+ const username = usernameFromActorUri(actorUri);
87
+ if (!username)
88
+ return 0;
89
+ const [u] = await db.select({ id: users.id }).from(users).where(eq(users.username, username)).limit(1);
90
+ if (!u)
91
+ return 0;
92
+ return countContentOutbox(db, u.id);
93
+ }
94
+ /**
95
+ * Count outbox items for the instance actor (all users' published+public content).
96
+ */
97
+ export async function countInstanceOutboxItems(db, _domain) {
98
+ return countContentOutbox(db);
99
+ }
100
+ /**
101
+ * Page of a specific user actor's outbox (projected from their published+public content).
102
+ */
103
+ export async function getOutboxPage(db, actorUri, page, pageSize = DEFAULT_PAGE_SIZE) {
104
+ const username = usernameFromActorUri(actorUri);
105
+ if (!username)
106
+ return [];
107
+ const [u] = await db.select({ id: users.id }).from(users).where(eq(users.username, username)).limit(1);
108
+ if (!u)
109
+ return [];
110
+ const domain = new URL(actorUri).hostname;
111
+ return getContentOutboxPage(db, domain, page, pageSize, u.id);
112
+ }
113
+ /**
114
+ * Page of the instance actor's outbox (all users' published+public content as Create activities).
115
+ * This is what mirror backfill crawls.
116
+ */
117
+ export async function getInstanceOutboxPage(db, domain, page, pageSize = DEFAULT_PAGE_SIZE) {
118
+ return getContentOutboxPage(db, domain, page, pageSize);
43
119
  }
44
120
  /**
45
121
  * Count total outbox items for a hub Group actor.
@@ -67,19 +143,4 @@ export async function getHubOutboxPage(db, hubActorUri, page, pageSize = DEFAULT
67
143
  .offset(offset);
68
144
  return rows.map((r) => r.payload);
69
145
  }
70
- /**
71
- * Get a page of instance-level outbox activities (all users' Create activities).
72
- * Used by the instance actor outbox for backfill.
73
- */
74
- export async function getInstanceOutboxPage(db, domain, page, pageSize = DEFAULT_PAGE_SIZE) {
75
- const offset = (page - 1) * pageSize;
76
- const rows = await db
77
- .select({ payload: activities.payload })
78
- .from(activities)
79
- .where(and(eq(activities.direction, 'outbound'), eq(activities.status, 'delivered'), eq(activities.type, 'Create'), sql `${activities.actorUri} LIKE ${'https://' + domain + '/users/%'}`))
80
- .orderBy(desc(activities.createdAt))
81
- .limit(pageSize)
82
- .offset(offset);
83
- return rows.map((r) => r.payload);
84
- }
85
146
  //# sourceMappingURL=outboxQueries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"outboxQueries.js","sourceRoot":"","sources":["../../src/federation/outboxQueries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outboxQueries.js","sourceRoot":"","sources":["../../src/federation/outboxQueries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { DB } from '../types.js';
2
+ export interface RegistryInstanceView {
3
+ id: string;
4
+ domain: string;
5
+ actorUri: string;
6
+ name: string | null;
7
+ description: string | null;
8
+ userCount: number;
9
+ activeMonthCount: number;
10
+ localPostCount: number;
11
+ features: Record<string, boolean> | null;
12
+ softwareName: string | null;
13
+ softwareVersion: string | null;
14
+ status: string;
15
+ lastPingAt: string | null;
16
+ /** Derived: pinged within ONLINE_WINDOW_MS */
17
+ online: boolean;
18
+ createdAt: string;
19
+ }
20
+ /** Stats pulled from a remote instance's public NodeInfo 2.1 document. */
21
+ export interface PulledNodeInfo {
22
+ name: string | null;
23
+ description: string | null;
24
+ userCount: number;
25
+ activeMonthCount: number;
26
+ localPostCount: number;
27
+ features: Record<string, boolean> | null;
28
+ softwareName: string | null;
29
+ softwareVersion: string | null;
30
+ }
31
+ /** A function that fetches a URL and returns its body text (SSRF-guarded `safeFetch` by default). */
32
+ export type RegistryFetcher = (url: string) => Promise<{
33
+ html: string;
34
+ }>;
35
+ /**
36
+ * Pull a remote instance's public NodeInfo 2.1 document for authoritative stats.
37
+ * SSRF-guarded (via `safeFetch`); the 2.1 link must be same-host as the domain (no cross-host
38
+ * redirection of our fetch). Returns null on any failure (treated as "stats unavailable").
39
+ */
40
+ export declare function fetchInstanceNodeInfo(domain: string, fetcher?: RegistryFetcher): Promise<PulledNodeInfo | null>;
41
+ /**
42
+ * Record a verified registry ping. The caller has already verified the HTTP signature, so `domain`
43
+ * (derived from the verified actor) is trusted. A `blocked` instance is a no-op. Otherwise we pull
44
+ * NodeInfo for fresh stats and upsert — preserving an admin-set `hidden` status (only a new row
45
+ * starts `active`).
46
+ */
47
+ export declare function recordRegistryPing(db: DB, domain: string, actorUri: string, opts?: {
48
+ fetchNodeInfo?: (domain: string) => Promise<PulledNodeInfo | null>;
49
+ }): Promise<'recorded' | 'blocked'>;
50
+ export interface ListRegistryOptions {
51
+ search?: string;
52
+ limit: number;
53
+ offset: number;
54
+ /** Admin path: include hidden/blocked rows. Public path: active only. */
55
+ includeNonActive?: boolean;
56
+ }
57
+ /** List directory entries. Public callers get `active` only; admin gets all + status. */
58
+ export declare function listRegistryInstances(db: DB, opts: ListRegistryOptions): Promise<{
59
+ instances: RegistryInstanceView[];
60
+ total: number;
61
+ }>;
62
+ /** Get a single directory entry by id. */
63
+ export declare function getRegistryInstance(db: DB, id: string): Promise<RegistryInstanceView | null>;
64
+ /** Admin: set an instance's directory status (active | hidden | blocked). */
65
+ export declare function setRegistryInstanceStatus(db: DB, id: string, status: 'active' | 'hidden' | 'blocked'): Promise<RegistryInstanceView | null>;
66
+ /**
67
+ * Client side: send a signed heartbeat to a registry. Identity is proven by the HTTP signature
68
+ * (instance actor keyId); the registry derives our domain from it and pulls our public NodeInfo.
69
+ */
70
+ export declare function sendRegistryPing(db: DB, registryUrl: string, localDomain: string,
71
+ /** Injectable signed-sender (defaults to the SSRF-safe `safeFetchSigned`) — overridden in tests. */
72
+ send?: (req: Request) => Promise<{
73
+ ok: boolean;
74
+ status: number;
75
+ }>): Promise<{
76
+ ok: boolean;
77
+ status: number;
78
+ }>;
79
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/federation/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Instance registry / directory (Phase 4).
3
+ *
4
+ * When `features.actAsRegistry` is on, other CommonPub instances send a signed heartbeat to
5
+ * `POST /api/registry/ping`. We verify the signature (proving domain ownership), then PULL the
6
+ * pinger's public NodeInfo for authoritative, un-spoofable stats and upsert a `registry_instances`
7
+ * row. Admin controls visibility via `status` (active | hidden | blocked).
8
+ *
9
+ * Client side: when `features.announceToRegistry` is on, `sendRegistryPing` periodically posts a
10
+ * signed heartbeat to the configured `federation.registryUrl`.
11
+ */
12
+ import { eq, ne, and, or, ilike, desc, asc, sql } from 'drizzle-orm';
13
+ import { registryInstances } from '@commonpub/schema';
14
+ import { safeFetch, signRequest, safeFetchSigned } from '@commonpub/protocol';
15
+ /** Window after the last heartbeat within which an instance is considered "online". */
16
+ const ONLINE_WINDOW_MS = 48 * 60 * 60 * 1000;
17
+ const defaultFetcher = (url) => safeFetch(url, { timeoutMs: 10_000 });
18
+ /**
19
+ * Pull a remote instance's public NodeInfo 2.1 document for authoritative stats.
20
+ * SSRF-guarded (via `safeFetch`); the 2.1 link must be same-host as the domain (no cross-host
21
+ * redirection of our fetch). Returns null on any failure (treated as "stats unavailable").
22
+ */
23
+ export async function fetchInstanceNodeInfo(domain, fetcher = defaultFetcher) {
24
+ try {
25
+ const wk = await fetcher(`https://${domain}/.well-known/nodeinfo`);
26
+ const wkDoc = JSON.parse(wk.html);
27
+ const link = wkDoc.links?.find((l) => l.rel?.includes('nodeinfo') && l.href);
28
+ if (!link?.href)
29
+ return null;
30
+ // The href is remote-controlled — only follow an https link on the SAME host as the pinger.
31
+ let hrefHost;
32
+ try {
33
+ const u = new URL(link.href);
34
+ if (u.protocol !== 'https:')
35
+ return null;
36
+ hrefHost = u.hostname;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ if (hrefHost !== domain)
42
+ return null;
43
+ const doc = await fetcher(link.href);
44
+ const ni = JSON.parse(doc.html);
45
+ return {
46
+ name: ni.metadata?.nodeName ?? null,
47
+ description: ni.metadata?.nodeDescription ?? null,
48
+ userCount: ni.usage?.users?.total ?? 0,
49
+ activeMonthCount: ni.usage?.users?.activeMonth ?? 0,
50
+ localPostCount: ni.usage?.localPosts ?? 0,
51
+ features: ni.metadata?.features ?? null,
52
+ softwareName: ni.software?.name ?? null,
53
+ softwareVersion: ni.software?.version ?? null,
54
+ };
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Record a verified registry ping. The caller has already verified the HTTP signature, so `domain`
62
+ * (derived from the verified actor) is trusted. A `blocked` instance is a no-op. Otherwise we pull
63
+ * NodeInfo for fresh stats and upsert — preserving an admin-set `hidden` status (only a new row
64
+ * starts `active`).
65
+ */
66
+ export async function recordRegistryPing(db, domain, actorUri, opts) {
67
+ const [existing] = await db
68
+ .select({ status: registryInstances.status })
69
+ .from(registryInstances)
70
+ .where(eq(registryInstances.domain, domain))
71
+ .limit(1);
72
+ if (existing?.status === 'blocked')
73
+ return 'blocked';
74
+ const pull = opts?.fetchNodeInfo ?? ((d) => fetchInstanceNodeInfo(d));
75
+ const ni = await pull(domain);
76
+ const now = new Date();
77
+ await db
78
+ .insert(registryInstances)
79
+ .values({
80
+ domain,
81
+ actorUri,
82
+ name: ni?.name ?? null,
83
+ description: ni?.description ?? null,
84
+ userCount: ni?.userCount ?? 0,
85
+ activeMonthCount: ni?.activeMonthCount ?? 0,
86
+ localPostCount: ni?.localPostCount ?? 0,
87
+ features: ni?.features ?? null,
88
+ softwareName: ni?.softwareName ?? null,
89
+ softwareVersion: ni?.softwareVersion ?? null,
90
+ status: 'active',
91
+ lastPingAt: now,
92
+ })
93
+ .onConflictDoUpdate({
94
+ target: registryInstances.domain,
95
+ // Guard against a select-then-upsert race: if an admin blocked the row after our initial
96
+ // check, this conflict-update is skipped (no stat refresh / lastPingAt bump for a blocked row).
97
+ setWhere: ne(registryInstances.status, 'blocked'),
98
+ set: {
99
+ actorUri,
100
+ lastPingAt: now,
101
+ updatedAt: now,
102
+ // Refresh stats only when we actually pulled NodeInfo (don't zero them on a transient failure).
103
+ ...(ni
104
+ ? {
105
+ name: ni.name,
106
+ description: ni.description,
107
+ userCount: ni.userCount,
108
+ activeMonthCount: ni.activeMonthCount,
109
+ localPostCount: ni.localPostCount,
110
+ features: ni.features,
111
+ softwareName: ni.softwareName,
112
+ softwareVersion: ni.softwareVersion,
113
+ }
114
+ : {}),
115
+ // NOTE: status is intentionally NOT set here — preserve an admin's `hidden` choice.
116
+ },
117
+ });
118
+ return 'recorded';
119
+ }
120
+ /** List directory entries. Public callers get `active` only; admin gets all + status. */
121
+ export async function listRegistryInstances(db, opts) {
122
+ const conds = [];
123
+ if (!opts.includeNonActive)
124
+ conds.push(eq(registryInstances.status, 'active'));
125
+ if (opts.search) {
126
+ const q = `%${opts.search.replace(/[%_]/g, '\\$&')}%`;
127
+ conds.push(or(ilike(registryInstances.domain, q), ilike(registryInstances.name, q)));
128
+ }
129
+ const where = conds.length ? and(...conds) : undefined;
130
+ const rows = await db
131
+ .select()
132
+ .from(registryInstances)
133
+ .where(where)
134
+ // Newest heartbeat first; `domain` (unique) is the stable tiebreaker so pages don't overlap.
135
+ .orderBy(desc(registryInstances.lastPingAt), asc(registryInstances.domain))
136
+ .limit(opts.limit)
137
+ .offset(opts.offset);
138
+ const [countRow] = await db
139
+ .select({ count: sql `count(*)::int` })
140
+ .from(registryInstances)
141
+ .where(where);
142
+ return { instances: rows.map(rowToView), total: countRow?.count ?? 0 };
143
+ }
144
+ /** Get a single directory entry by id. */
145
+ export async function getRegistryInstance(db, id) {
146
+ const [row] = await db.select().from(registryInstances).where(eq(registryInstances.id, id)).limit(1);
147
+ return row ? rowToView(row) : null;
148
+ }
149
+ /** Admin: set an instance's directory status (active | hidden | blocked). */
150
+ export async function setRegistryInstanceStatus(db, id, status) {
151
+ const [row] = await db
152
+ .update(registryInstances)
153
+ .set({ status, updatedAt: new Date() })
154
+ .where(eq(registryInstances.id, id))
155
+ .returning();
156
+ return row ? rowToView(row) : null;
157
+ }
158
+ /**
159
+ * Client side: send a signed heartbeat to a registry. Identity is proven by the HTTP signature
160
+ * (instance actor keyId); the registry derives our domain from it and pulls our public NodeInfo.
161
+ */
162
+ export async function sendRegistryPing(db, registryUrl, localDomain,
163
+ /** Injectable signed-sender (defaults to the SSRF-safe `safeFetchSigned`) — overridden in tests. */
164
+ send = (req) => safeFetchSigned(req, { timeoutMs: 15_000 })) {
165
+ const { getOrCreateInstanceKeypair } = await import('./federation.js');
166
+ const keypair = await getOrCreateInstanceKeypair(db);
167
+ const localActorUri = `https://${localDomain}/actor`;
168
+ const keyId = `${localActorUri}#main-key`;
169
+ const url = `${registryUrl.replace(/\/+$/, '')}/api/registry/ping`;
170
+ // Non-empty body so the request carries a digest the registry can verify (it ignores the
171
+ // body's contents — domain + stats come from the signature + a NodeInfo pull).
172
+ const body = JSON.stringify({ actor: localActorUri });
173
+ const request = new Request(url, {
174
+ method: 'POST',
175
+ headers: {
176
+ 'Content-Type': 'application/json',
177
+ 'User-Agent': `CommonPub/1.0 (+https://${localDomain})`,
178
+ },
179
+ body,
180
+ });
181
+ const signed = await signRequest(request, keypair.privateKeyPem, keyId);
182
+ const res = await send(signed);
183
+ return { ok: res.ok, status: res.status };
184
+ }
185
+ function rowToView(row) {
186
+ const lastPing = row.lastPingAt ? row.lastPingAt.getTime() : null;
187
+ return {
188
+ id: row.id,
189
+ domain: row.domain,
190
+ actorUri: row.actorUri,
191
+ name: row.name,
192
+ description: row.description,
193
+ userCount: row.userCount,
194
+ activeMonthCount: row.activeMonthCount,
195
+ localPostCount: row.localPostCount,
196
+ features: row.features,
197
+ softwareName: row.softwareName,
198
+ softwareVersion: row.softwareVersion,
199
+ status: row.status,
200
+ lastPingAt: row.lastPingAt?.toISOString() ?? null,
201
+ online: lastPing != null && Date.now() - lastPing < ONLINE_WINDOW_MS,
202
+ createdAt: row.createdAt.toISOString(),
203
+ };
204
+ }
205
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/federation/registry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../src/hub/members.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,EAAE,EACF,aAAa,EACb,OAAO,EACR,MAAM,aAAa,CAAC;AAQrB,wBAAsB,OAAO,CAC3B,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiF9C;AAED,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B5C;AAED,wBAAsB,SAAS,CAC7B,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAqB/B;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,OAAO,CAAC;IAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BpD;AAED,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,IAAI,CAAC;CAChB;AAED,6EAA6E;AAC7E,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,EAAE,CAAC,CAuB5B;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0D/C;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyD9C"}
1
+ {"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../src/hub/members.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,EAAE,EACF,aAAa,EACb,OAAO,EACR,MAAM,aAAa,CAAC;AAQrB,wBAAsB,OAAO,CAC3B,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiF9C;AAED,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+B5C;AAED,wBAAsB,SAAS,CAC7B,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAqB/B;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,OAAO,CAAC;IAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BpD;AAED,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,IAAI,CAAC;CAChB;AAED,6EAA6E;AAC7E,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,EAAE,CAAC,CAuB5B;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0D/C;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyD9C"}
@@ -88,13 +88,17 @@ export async function leaveHub(db, userId, hubId) {
88
88
  if (member[0].role === 'owner') {
89
89
  return { left: false, error: 'Owner cannot leave the hub' };
90
90
  }
91
- await db
92
- .delete(hubMembers)
93
- .where(and(eq(hubMembers.hubId, hubId), eq(hubMembers.userId, userId)));
94
- await db
95
- .update(hubs)
96
- .set({ memberCount: sql `GREATEST(${hubs.memberCount} - 1, 0)` })
97
- .where(eq(hubs.id, hubId));
91
+ // Atomic: drop the membership row and decrement the denormalized counter together,
92
+ // so a failure between the two can't leave memberCount overcounting (mirrors joinHub).
93
+ await db.transaction(async (tx) => {
94
+ await tx
95
+ .delete(hubMembers)
96
+ .where(and(eq(hubMembers.hubId, hubId), eq(hubMembers.userId, userId)));
97
+ await tx
98
+ .update(hubs)
99
+ .set({ memberCount: sql `GREATEST(${hubs.memberCount} - 1, 0)` })
100
+ .where(eq(hubs.id, hubId));
101
+ });
98
102
  await emitHook('hub:member:left', { db, hubId, userId });
99
103
  return { left: true };
100
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/hub/members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACL,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,KAAK,GACN,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,qBAAqB;AAErB,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,EAAM,EACN,MAAc,EACd,KAAa,EACb,WAAoB;IAEpB,YAAY;IACZ,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9C,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;IAClE,CAAC;IAED,oBAAoB;IACpB,MAAM,MAAM,GAAG,MAAM,EAAE;SACpB,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;SACvC,IAAI,CAAC,IAAI,CAAC;SACV,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;SACzB,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IACnD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC;IAErC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC3D,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;QACrE,CAAC;QACD,iDAAiD;QACjD,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,MAAM,EAAE;aACtB,MAAM,CAAC,UAAU,CAAC;aAClB,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;aACzC,mBAAmB,EAAE;aACrB,SAAS,EAAE,CAAC;QAEf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzC,CAAC;QAED,MAAM,EAAE;aACL,MAAM,CAAC,IAAI,CAAC;aACZ,GAAG,CAAC,EAAE,WAAW,EAAE,GAAG,CAAA,GAAG,IAAI,CAAC,WAAW,MAAM,EAAE,CAAC;aAClD,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAE7B,iDAAiD;QACjD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClH,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/I,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;aAC3E,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,CAAA,GAAG,UAAU,CAAC,IAAI,wBAAwB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAEpG,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,IAAI,KAAK,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,EAAE;SACxF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC5B,kBAAkB,CAAC,EAAE,EAAE;oBACrB,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK;oBACjC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,SAAS,WAAW,GAAG,EAAE,IAAI,IAAI,UAAU,EAAE;oBAC9E,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM;iBACrE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,QAAQ,CAAC,mBAAmB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,EAAM,EACN,MAAc,EACd,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,EAAE;SACpB,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;SACjC,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SACtE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;IAC9D,CAAC;IAED,MAAM,EAAE;SACL,MAAM,CAAC,UAAU,CAAC;SAClB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAE1E,MAAM,EAAE;SACL,MAAM,CAAC,IAAI,CAAC;SACZ,GAAG,CAAC,EAAE,WAAW,EAAE,GAAG,CAAA,YAAY,IAAI,CAAC,WAAW,UAAU,EAAE,CAAC;SAC/D,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAE7B,MAAM,QAAQ,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAM,EACN,KAAa,EACb,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC;QACN,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,eAAe;KACtB,CAAC;SACD,IAAI,CAAC,UAAU,CAAC;SAChB,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;SACjD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SACtE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;IACrB,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK;QACvB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;QACzB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;QACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ;QAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAM,EACN,KAAa,EACb,OAA4C,EAAE;IAE9C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE1C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtC,EAAE;aACC,MAAM,CAAC;YACN,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,eAAe;SACtB,CAAC;aACD,IAAI,CAAC,UAAU,CAAC;aAChB,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;aACjD,KAAK,CAAC,KAAK,CAAC;aACZ,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAClC,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC;KACjC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK;QACvB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;QACzB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;QACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ;QAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAWD,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAM,EACN,KAAa;IAEb,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC;QACN,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;QAC/C,iBAAiB,EAAE,YAAY,CAAC,iBAAiB;QACjD,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,cAAc,EAAE,YAAY,CAAC,cAAc;QAC3C,QAAQ,EAAE,YAAY,CAAC,SAAS;KACjC,CAAC;SACD,IAAI,CAAC,YAAY,CAAC;SAClB,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;SAChF,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;SAC9E,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IAEzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;QACpC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;QACtC,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,SAAS;QAC7C,QAAQ,EAAE,CAAC,CAAC,QAAQ;KACrB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAM,EACN,OAAe,EACf,KAAa,EACb,YAAoB,EACpB,OAAgB;IAEhB,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpD,EAAE;aACC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;aACjC,IAAI,CAAC,UAAU,CAAC;aAChB,KAAK,CACJ,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CACjE;aACA,KAAK,CAAC,CAAC,CAAC;QACX,EAAE;aACC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;aACjC,IAAI,CAAC,UAAU,CAAC;aAChB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAC3B,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CACpC,CACF;aACA,KAAK,CAAC,CAAC,CAAC;KACZ,CAAC,CAAC;IAEH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;IACrF,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC9D,CAAC;IAED,MAAM,EAAE;SACL,MAAM,CAAC,UAAU,CAAC;SAClB,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SACtB,KAAK,CACJ,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CACtE,CAAC;IAEJ,sCAAsC;IACtC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClH,MAAM,kBAAkB,CAAC,EAAE,EAAE;YAC3B,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK;YACjC,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,gBAAgB,GAAG,EAAE,IAAI,IAAI,OAAO,mBAAmB,OAAO,EAAE;YACzE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO;SAC9D,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAE9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAM,EACN,OAAe,EACf,KAAa,EACb,YAAoB;IAEpB,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpD,EAAE;aACC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;aACjC,IAAI,CAAC,UAAU,CAAC;aAChB,KAAK,CACJ,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CACjE;aACA,KAAK,CAAC,CAAC,CAAC;QACX,EAAE;aACC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;aACjC,IAAI,CAAC,UAAU,CAAC;aAChB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAC3B,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CACpC,CACF;aACA,KAAK,CAAC,CAAC,CAAC;KACZ,CAAC,CAAC;IAEH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,EAAE;SACL,MAAM,CAAC,UAAU,CAAC;SAClB,KAAK,CACJ,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CACtE,CAAC;IAEJ,MAAM,EAAE;SACL,MAAM,CAAC,IAAI,CAAC;SACZ,GAAG,CAAC,EAAE,WAAW,EAAE,GAAG,CAAA,YAAY,IAAI,CAAC,WAAW,UAAU,EAAE,CAAC;SAC/D,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAE7B,oCAAoC;IACpC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClH,MAAM,kBAAkB,CAAC,EAAE,EAAE;YAC3B,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK;YACjC,KAAK,EAAE,kBAAkB;YACzB,OAAO,EAAE,yBAAyB,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE;YACxD,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO;SAC9D,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAE9B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/hub/members.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../src/hub/posts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../src/hub/posts.ts"],"names":[],"mappings":"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"}