@atproto/bsky 0.0.280 → 0.0.282
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -0
- package/dist/api/app/bsky/bookmark/getBookmarks.js +1 -1
- package/dist/api/app/bsky/bookmark/getBookmarks.js.map +1 -1
- package/dist/api/app/bsky/contact/getMatches.js +1 -1
- package/dist/api/app/bsky/contact/getMatches.js.map +1 -1
- package/dist/api/app/bsky/feed/getQuotes.js +1 -0
- package/dist/api/app/bsky/feed/getQuotes.js.map +1 -1
- package/dist/api/app/bsky/graph/getBlocks.js +1 -1
- package/dist/api/app/bsky/graph/getBlocks.js.map +1 -1
- package/dist/api/app/bsky/graph/getFollowers.js +1 -1
- package/dist/api/app/bsky/graph/getFollowers.js.map +1 -1
- package/dist/api/app/bsky/graph/getFollows.js +1 -1
- package/dist/api/app/bsky/graph/getFollows.js.map +1 -1
- package/dist/api/app/bsky/graph/getKnownFollowers.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getKnownFollowers.js +12 -7
- package/dist/api/app/bsky/graph/getKnownFollowers.js.map +1 -1
- package/dist/api/app/bsky/graph/getList.js +1 -1
- package/dist/api/app/bsky/graph/getList.js.map +1 -1
- package/dist/api/app/bsky/graph/getListBlocks.js +1 -1
- package/dist/api/app/bsky/graph/getListBlocks.js.map +1 -1
- package/dist/api/app/bsky/graph/getListMutes.js +1 -1
- package/dist/api/app/bsky/graph/getListMutes.js.map +1 -1
- package/dist/api/app/bsky/graph/getMutes.js +1 -1
- package/dist/api/app/bsky/graph/getMutes.js.map +1 -1
- package/dist/api/app/bsky/graph/getStarterPacksWithMembership.js +1 -1
- package/dist/api/app/bsky/graph/getStarterPacksWithMembership.js.map +1 -1
- package/dist/api/app/bsky/notification/getPreferences.d.ts +1 -1
- package/dist/api/app/bsky/notification/getPreferences.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/getPreferences.js +2 -18
- package/dist/api/app/bsky/notification/getPreferences.js.map +1 -1
- package/dist/api/app/bsky/notification/listActivitySubscriptions.js +1 -1
- package/dist/api/app/bsky/notification/listActivitySubscriptions.js.map +1 -1
- package/dist/api/app/bsky/notification/listNotifications.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/listNotifications.js +3 -18
- package/dist/api/app/bsky/notification/listNotifications.js.map +1 -1
- package/dist/api/app/bsky/notification/putPreferences.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/putPreferences.js +14 -2
- package/dist/api/app/bsky/notification/putPreferences.js.map +1 -1
- package/dist/api/app/bsky/notification/putPreferencesV2.d.ts +1 -1
- package/dist/api/app/bsky/notification/putPreferencesV2.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/putPreferencesV2.js +3 -15
- package/dist/api/app/bsky/notification/putPreferencesV2.js.map +1 -1
- package/dist/api/app/bsky/notification/util.d.ts +5 -0
- package/dist/api/app/bsky/notification/util.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/util.js +39 -0
- package/dist/api/app/bsky/notification/util.js.map +1 -1
- package/dist/api/util.js +2 -2
- package/dist/api/util.js.map +1 -1
- package/dist/data-plane/server/bsync-subscription.d.ts +0 -3
- package/dist/data-plane/server/bsync-subscription.d.ts.map +1 -1
- package/dist/data-plane/server/bsync-subscription.js +1 -27
- package/dist/data-plane/server/bsync-subscription.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20260918T214110000Z-remove-priority-notifs.d.ts +4 -0
- package/dist/data-plane/server/db/migrations/20260918T214110000Z-remove-priority-notifs.d.ts.map +1 -0
- package/dist/data-plane/server/db/migrations/20260918T214110000Z-remove-priority-notifs.js +13 -0
- package/dist/data-plane/server/db/migrations/20260918T214110000Z-remove-priority-notifs.js.map +1 -0
- package/dist/data-plane/server/db/migrations/index.d.ts +1 -0
- package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/index.js +1 -0
- package/dist/data-plane/server/db/migrations/index.js.map +1 -1
- package/dist/data-plane/server/db/tables/actor-state.d.ts +0 -1
- package/dist/data-plane/server/db/tables/actor-state.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/actor-state.js.map +1 -1
- package/dist/data-plane/server/routes/follows.d.ts.map +1 -1
- package/dist/data-plane/server/routes/follows.js +57 -22
- package/dist/data-plane/server/routes/follows.js.map +1 -1
- package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
- package/dist/data-plane/server/routes/notifs.js +2 -12
- package/dist/data-plane/server/routes/notifs.js.map +1 -1
- package/dist/data-plane/server/routes/profile.js +0 -3
- package/dist/data-plane/server/routes/profile.js.map +1 -1
- package/dist/hydration/actor.d.ts +0 -1
- package/dist/hydration/actor.d.ts.map +1 -1
- package/dist/hydration/actor.js +8 -10
- package/dist/hydration/actor.js.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.js +10 -0
- package/dist/lexicons/app/bsky/authFullApp.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/feed/defs.defs.d.ts +8 -0
- package/dist/lexicons/app/bsky/feed/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/defs.defs.js +2 -0
- package/dist/lexicons/app/bsky/feed/defs.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.d.ts +6 -0
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.js +2 -0
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.d.ts +3 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.d.ts +65 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.js +49 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.js +6 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.d.ts +2 -0
- package/dist/lexicons/tools/ozone/inbox/defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.d.ts +89 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.js +73 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.js +5 -0
- package/dist/lexicons/tools/ozone/inbox/defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox.d.ts +3 -0
- package/dist/lexicons/tools/ozone/inbox.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox.js +6 -0
- package/dist/lexicons/tools/ozone/inbox.js.map +1 -0
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.d.ts +2 -0
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.js +2 -0
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/queue/defs.defs.d.ts +4 -0
- package/dist/lexicons/tools/ozone/queue/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/queue/defs.defs.js +2 -0
- package/dist/lexicons/tools/ozone/queue/defs.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.d.ts +3 -1
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.js +3 -0
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/report/defs.defs.d.ts +89 -9
- package/dist/lexicons/tools/ozone/report/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/report/defs.defs.js +20 -0
- package/dist/lexicons/tools/ozone/report/defs.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.d.ts +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.js +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.d.ts +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.js +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone.d.ts +1 -0
- package/dist/lexicons/tools/ozone.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone.js +1 -0
- package/dist/lexicons/tools/ozone.js.map +1 -1
- package/dist/proto/bsky_connect.d.ts +10 -1
- package/dist/proto/bsky_connect.d.ts.map +1 -1
- package/dist/proto/bsky_connect.js +10 -1
- package/dist/proto/bsky_connect.js.map +1 -1
- package/dist/proto/bsky_pb.d.ts +83 -12
- package/dist/proto/bsky_pb.d.ts.map +1 -1
- package/dist/proto/bsky_pb.js +130 -15
- package/dist/proto/bsky_pb.js.map +1 -1
- package/dist/proto/bsync_connect.d.ts +1 -10
- package/dist/proto/bsync_connect.d.ts.map +1 -1
- package/dist/proto/bsync_connect.js +1 -10
- package/dist/proto/bsync_connect.js.map +1 -1
- package/dist/proto/bsync_pb.d.ts +0 -38
- package/dist/proto/bsync_pb.d.ts.map +1 -1
- package/dist/proto/bsync_pb.js +0 -57
- package/dist/proto/bsync_pb.js.map +1 -1
- package/dist/views/types.d.ts +1 -4
- package/dist/views/types.d.ts.map +1 -1
- package/dist/views/types.js.map +1 -1
- package/package.json +15 -16
package/dist/api/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/api/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAErE,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAA;AAC5C,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAA;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAA;AAOlD,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,IAA4B,EACJ,EAAE;IAC1B,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,wBAAwB,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxE,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;IAC1C,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAe,EAAE,EAAE;IAClD,8EAA8E;IAC9E,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,MAAM,8BAA8B,GAAG,EAAE,CAAA;AAOzC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAG3B,IAMD,EAAmC,EAAE;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,8BAA8B,CAAA;IACtE,0EAA0E;IAC1E,iEAAiE;IACjE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAA2B,CAAA;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAChC,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/api/util.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingHttpHeaders } from 'node:http'\nimport type { ServerConfig } from '../config.js'\nimport { type ParsedLabelers, formatLabelerHeader } from '../util.js'\n\nexport const BSKY_USER_AGENT = 'BskyAppView'\nexport const ATPROTO_CONTENT_LABELERS = 'Atproto-Content-Labelers'\nexport const ATPROTO_REPO_REV = 'Atproto-Repo-Rev'\n\ntype ResHeaderOpts = {\n labelers: ParsedLabelers\n repoRev: string | null\n}\n\nexport const resHeaders = (\n opts: Partial<ResHeaderOpts>,\n): Record<string, string> => {\n const headers = {}\n if (opts.labelers) {\n headers[ATPROTO_CONTENT_LABELERS] = formatLabelerHeader(opts.labelers)\n }\n if (opts.repoRev) {\n headers[ATPROTO_REPO_REV] = opts.repoRev\n }\n return headers\n}\n\nexport const clearlyBadCursor = (cursor?: string) => {\n // hallmark of v1 cursor, highly unlikely in v2 cursors based on time or rkeys\n return !!cursor?.includes('::')\n}\n\nconst DEFAULT_FILL_PAGE_MAX_REQUESTS = 10\n\ntype PageFetch<R extends { cursor?: string }> = (params: {\n cursor?: string\n limit: number\n}) => Promise<R>\n\nexport const fillPage = async <\n F extends PageFetch<{ cursor?: string }>,\n T,\n>(opts: {\n cursor?: string\n limit: number\n maxRequests?: number\n fetch: F\n items: (result: Awaited<ReturnType<F>>) => T[]\n}): Promise<Awaited<ReturnType<F>>> => {\n const maxRequests = opts.maxRequests ?? DEFAULT_FILL_PAGE_MAX_REQUESTS\n // Refilling is only worth its cost while the page is mostly empty: a page\n // that already holds half of what was asked for is served as is.\n const enoughItems = Math.ceil(opts.limit / 2)\n const result = (await opts.fetch({\n cursor: opts.cursor,\n limit: opts.limit,\n })) as Awaited<ReturnType<F>>\n const items = opts.items(result)\n let cursor = result.cursor || undefined\n for (\n let requests = 1;\n requests < maxRequests && cursor && items.length < enoughItems;\n requests++\n ) {\n const previousCursor = cursor\n const page = (await opts.fetch({\n cursor,\n limit: opts.limit - items.length,\n })) as Awaited<ReturnType<F>>\n items.push(...opts.items(page))\n cursor = page.cursor || undefined\n if (cursor === previousCursor) {\n cursor = undefined\n break\n }\n if (!cursor) break\n }\n return { ...result, cursor } as Awaited<ReturnType<F>>\n}\n\n// @TEMPORARY backdoor to force search v2 via a request header, gated by the\n// BSKY_SEARCH_V2_OVERRIDE_HEADER env var. Remove once search v2 is fully rolled out.\nconst SEARCH_V2_OVERRIDE_HEADER = 'x-bsky-search-v2-override'\n\nexport const resolveSearchV2Override = (\n req: { headers: IncomingHttpHeaders },\n cfg: ServerConfig,\n): boolean => {\n const expected = cfg.searchV2OverrideHeader\n if (!expected) return false\n const value = req.headers[SEARCH_V2_OVERRIDE_HEADER]\n const header = Array.isArray(value) ? value.join(',') : value\n return header === expected\n}\n"]}
|
|
@@ -3,7 +3,6 @@ import type { Database } from './db/index.js';
|
|
|
3
3
|
export type BsyncCursors = {
|
|
4
4
|
op?: string;
|
|
5
5
|
mute?: string;
|
|
6
|
-
notif?: string;
|
|
7
6
|
};
|
|
8
7
|
export declare class BsyncSubscription {
|
|
9
8
|
opts: {
|
|
@@ -39,8 +38,6 @@ export declare class BsyncSubscription {
|
|
|
39
38
|
private runScanner;
|
|
40
39
|
private scanMuteOperations;
|
|
41
40
|
private processMuteOperations;
|
|
42
|
-
private scanNotifOperations;
|
|
43
|
-
private processNotifOperations;
|
|
44
41
|
private scanOperations;
|
|
45
42
|
private processOperations;
|
|
46
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bsync-subscription.d.ts","sourceRoot":"","sources":["../../../src/data-plane/server/bsync-subscription.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"bsync-subscription.d.ts","sourceRoot":"","sources":["../../../src/data-plane/server/bsync-subscription.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAUnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAG7C,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,qBAAa,iBAAiB;IAQT,IAAI,EAAE;QAAE,EAAE,EAAE,QAAQ,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE;IAP/D,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,EAAE,CAAU;IAEpB,OAAO,CAAC,OAAO,CAAmB;IAElC,YAAmB,IAAI,EAAE;QAAE,EAAE,EAAE,QAAQ,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,EAY9D;IAED,IAAI,OAAO,YAEV;IAED,KAAK,SAKJ;IAED;;;;;OAKG;IACG,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,SAAO,iBAWrD;IAED,OAAO,CAAC,UAAU;IAOZ,OAAO,kBAOZ;IAED;;;;OAIG;IACH,OAAO,CAAC,aAAa;YAmBP,UAAU;IAuBxB,OAAO,CAAC,kBAAkB;YAcZ,qBAAqB;IAgFnC,OAAO,CAAC,cAAc;YAWR,iBAAiB;CAmChC"}
|
|
@@ -32,7 +32,6 @@ export class BsyncSubscription {
|
|
|
32
32
|
return;
|
|
33
33
|
this.ac = new AbortController();
|
|
34
34
|
this.scanMuteOperations();
|
|
35
|
-
this.scanNotifOperations();
|
|
36
35
|
this.scanOperations();
|
|
37
36
|
}
|
|
38
37
|
/**
|
|
@@ -54,8 +53,7 @@ export class BsyncSubscription {
|
|
|
54
53
|
}
|
|
55
54
|
isCaughtUp(targets) {
|
|
56
55
|
return (gteCursor(this.cursors.op, targets.op) &&
|
|
57
|
-
gteCursor(this.cursors.mute, targets.mute)
|
|
58
|
-
gteCursor(this.cursors.notif, targets.notif));
|
|
56
|
+
gteCursor(this.cursors.mute, targets.mute));
|
|
59
57
|
}
|
|
60
58
|
async destroy() {
|
|
61
59
|
// Aborting cancels any in-flight long-poll scan immediately, so we don't
|
|
@@ -188,30 +186,6 @@ export class BsyncSubscription {
|
|
|
188
186
|
}
|
|
189
187
|
}
|
|
190
188
|
}
|
|
191
|
-
scanNotifOperations() {
|
|
192
|
-
this.startScanning(async (cursor, signal) => {
|
|
193
|
-
const res = await this.bsyncClient.scanNotifOperations({ cursor }, { signal });
|
|
194
|
-
await this.processNotifOperations(res.operations);
|
|
195
|
-
this.cursors.notif = res.cursor;
|
|
196
|
-
return res.cursor;
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
async processNotifOperations(operations) {
|
|
200
|
-
for (const op of operations) {
|
|
201
|
-
const { actorDid, priority } = op;
|
|
202
|
-
if (priority !== undefined) {
|
|
203
|
-
await this.db.db
|
|
204
|
-
.insertInto('actor_state')
|
|
205
|
-
.values({
|
|
206
|
-
did: actorDid,
|
|
207
|
-
priorityNotifs: priority,
|
|
208
|
-
lastSeenNotifs: new Date().toISOString(),
|
|
209
|
-
})
|
|
210
|
-
.onConflict((oc) => oc.column('did').doUpdateSet({ priorityNotifs: priority }))
|
|
211
|
-
.execute();
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
189
|
scanOperations() {
|
|
216
190
|
this.startScanning(async (cursor, signal) => {
|
|
217
191
|
const res = await this.bsyncClient.scanOperations({ cursor }, { signal });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bsync-subscription.js","sourceRoot":"","sources":["../../../src/data-plane/server/bsync-subscription.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { lexParse } from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport {\n type BsyncClient,\n authWithApiKey,\n createBsyncClient,\n} from '../../bsync.js'\nimport type { ServerConfig } from '../../config.js'\nimport { app } from '../../lexicons/index.js'\nimport { subLogger as log } from '../../logger.js'\nimport {\n Method,\n type MuteOperation,\n MuteOperation_Type,\n type NotifOperation,\n type Operation,\n} from '../../proto/bsync_pb.js'\nimport { Namespaces } from '../../stash.js'\nimport type { Database } from './db/index.js'\nimport { countAll, excluded } from './db/util.js'\n\nexport type BsyncCursors = {\n op?: string\n mute?: string\n notif?: string\n}\n\nexport class BsyncSubscription {\n private ac: AbortController | undefined\n private pendingScans = new Set<Promise<void>>()\n private bsyncClient: BsyncClient\n private db: Database\n // Latest cursor processed for each stream, used to wait until caught up.\n private cursors: BsyncCursors = {}\n\n constructor(public opts: { db: Database; config: ServerConfig }) {\n const { config, db } = opts\n\n this.db = db\n this.bsyncClient = createBsyncClient({\n baseUrl: config.bsyncUrl,\n httpVersion: config.bsyncHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.bsyncIgnoreBadTls },\n interceptors: config.bsyncApiKey\n ? [authWithApiKey(config.bsyncApiKey)]\n : [],\n })\n }\n\n get running() {\n return !!this.ac\n }\n\n start() {\n if (this.ac) return\n this.ac = new AbortController()\n this.scanMuteOperations()\n this.scanNotifOperations()\n this.scanOperations()\n }\n\n /**\n * Waits until the subscription has processed every operation that existed in\n * bsync at the time `targets` was read (one cursor per stream). Returns as\n * soon as the cursors catch up - it does not wait for the bsync long-poll\n * timeout. Intended for tests/dev.\n */\n async processAll(targets: BsyncCursors, timeout = 5000) {\n if (!this.ac) return\n const start = Date.now()\n while (!this.isCaughtUp(targets)) {\n if (Date.now() - start > timeout) {\n throw new Error(\n `bsync subscription was not caught up within ${timeout}ms`,\n )\n }\n await wait(5)\n }\n }\n\n private isCaughtUp(targets: BsyncCursors) {\n return (\n gteCursor(this.cursors.op, targets.op) &&\n gteCursor(this.cursors.mute, targets.mute) &&\n gteCursor(this.cursors.notif, targets.notif)\n )\n }\n\n async destroy() {\n // Aborting cancels any in-flight long-poll scan immediately, so we don't\n // have to wait for the bsync long-poll timeout to elapse.\n this.ac?.abort()\n this.ac = undefined\n // Wait for the ongoing scans to unwind cleanly.\n await Promise.all(this.pendingScans)\n }\n\n /**\n * starts a scanner in the background, killing it when this instance is\n * destroyed, and storing its promise in `this.pendingScans` to allow\n * awaiting.\n */\n private startScanning(\n scanner: (\n cursor: undefined | string,\n signal: AbortSignal,\n ) => Promise<string | undefined>,\n ) {\n if (!this.ac) return\n const signal = this.ac.signal\n\n const scanPromise = this.runScanner(scanner, signal)\n\n this.pendingScans.add(scanPromise)\n void scanPromise\n .catch(() => {})\n .finally(() => {\n this.pendingScans.delete(scanPromise)\n })\n }\n\n private async runScanner(\n scanner: (\n cursor: undefined | string,\n signal: AbortSignal,\n ) => Promise<string | undefined>,\n signal: AbortSignal,\n ) {\n let cursor: undefined | string\n\n while (!signal.aborted) {\n try {\n cursor = await scanner(cursor, signal)\n } catch (err) {\n if (signal.aborted) break\n\n log.error({ err }, 'error in bsync scan')\n\n // retry in a bit, but bail out early if we're shutting down\n await wait(100, signal)\n }\n }\n }\n\n private scanMuteOperations() {\n this.startScanning(async (cursor, signal) => {\n const res = await this.bsyncClient.scanMuteOperations(\n { cursor },\n { signal },\n )\n\n await this.processMuteOperations(res.operations)\n this.cursors.mute = res.cursor\n\n return res.cursor\n })\n }\n\n private async processMuteOperations(operations: MuteOperation[]) {\n for (const op of operations) {\n const { type, actorDid, subject, onlyReposts, onlyQuoteposts } = op\n if (type === MuteOperation_Type.ADD) {\n if (subject.startsWith('did:')) {\n await this.db.db\n .insertInto('mute')\n .values({\n mutedByDid: actorDid,\n subjectDid: subject,\n createdAt: new Date().toISOString(),\n onlyReposts,\n onlyQuoteposts,\n })\n .onConflict((oc) =>\n oc\n .columns(['mutedByDid', 'subjectDid'])\n .doUpdateSet({ onlyReposts, onlyQuoteposts }),\n )\n .execute()\n } else {\n const uri = new AtUri(subject)\n if (uri.collection === app.bsky.graph.list.$type) {\n await this.db.db\n .insertInto('list_mute')\n .values({\n mutedByDid: actorDid,\n listUri: subject,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n } else {\n await this.db.db\n .insertInto('thread_mute')\n .values({\n mutedByDid: actorDid,\n rootUri: subject,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n }\n } else if (type === MuteOperation_Type.REMOVE) {\n if (subject.startsWith('did:')) {\n await this.db.db\n .deleteFrom('mute')\n .where('mutedByDid', '=', actorDid)\n .where('subjectDid', '=', subject)\n .execute()\n } else {\n const uri = new AtUri(subject)\n if (uri.collection === app.bsky.graph.list.$type) {\n await this.db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .where('listUri', '=', subject)\n .execute()\n } else {\n await this.db.db\n .deleteFrom('thread_mute')\n .where('mutedByDid', '=', actorDid)\n .where('rootUri', '=', subject)\n .execute()\n }\n }\n } else if (type === MuteOperation_Type.CLEAR) {\n await this.db.db\n .deleteFrom('mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n await this.db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n }\n }\n }\n\n private scanNotifOperations() {\n this.startScanning(async (cursor, signal) => {\n const res = await this.bsyncClient.scanNotifOperations(\n { cursor },\n { signal },\n )\n\n await this.processNotifOperations(res.operations)\n this.cursors.notif = res.cursor\n\n return res.cursor\n })\n }\n\n private async processNotifOperations(operations: NotifOperation[]) {\n for (const op of operations) {\n const { actorDid, priority } = op\n if (priority !== undefined) {\n await this.db.db\n .insertInto('actor_state')\n .values({\n did: actorDid,\n priorityNotifs: priority,\n lastSeenNotifs: new Date().toISOString(),\n })\n .onConflict((oc) =>\n oc.column('did').doUpdateSet({ priorityNotifs: priority }),\n )\n .execute()\n }\n }\n }\n\n private scanOperations() {\n this.startScanning(async (cursor, signal) => {\n const res = await this.bsyncClient.scanOperations({ cursor }, { signal })\n\n await this.processOperations(res.operations)\n this.cursors.op = res.cursor\n\n return res.cursor\n })\n }\n\n private async processOperations(operations: Operation[]) {\n for (const op of operations) {\n const { namespace } = op\n\n const now = new Date().toISOString()\n\n // Index all items into private_data.\n await handleGenericOperation(this.db, op, now)\n\n // Maintain bespoke indexes for certain namespaces. A failure here must\n // not stall the stream, so log and move on (matching bsync behavior).\n try {\n if (\n namespace ===\n Namespaces.AppBskyNotificationDefsSubjectActivitySubscription.$type\n ) {\n await handleSubjectActivitySubscriptionOperation(this.db, op, now)\n } else if (\n namespace === Namespaces.AppBskyUnspeccedDefsAgeAssuranceEvent.$type\n ) {\n await handleAgeAssuranceEventOperation(this.db, op, now)\n } else if (\n namespace === Namespaces.AppBskyAgeassuranceDefsEvent.$type\n ) {\n await handleAgeAssuranceV2EventOperation(this.db, op, now)\n } else if (namespace === Namespaces.AppBskyBookmarkDefsBookmark.$type) {\n await handleBookmarkOperation(this.db, op, now)\n } else if (namespace === Namespaces.AppBskyDraftDefsDraftWithId.$type) {\n await handleDraftOperation(this.db, op, now)\n }\n } catch (err) {\n log.warn({ err, namespace }, 'bsync put operation indexing failed')\n }\n }\n }\n}\n\ntype HandleOperation = (\n db: Database,\n op: Operation,\n now: string,\n) => Promise<void>\n\n// upsert into or remove from private_data\nconst handleGenericOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n now: string,\n) => {\n const { actorDid, namespace, key, method, payload } = op\n if (method === Method.CREATE || method === Method.UPDATE) {\n await db.db\n .insertInto('private_data')\n .values({\n actorDid,\n namespace,\n key,\n payload: Buffer.from(payload).toString('utf8'),\n indexedAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.columns(['actorDid', 'namespace', 'key']).doUpdateSet({\n payload: excluded(db.db, 'payload'),\n updatedAt: excluded(db.db, 'updatedAt'),\n }),\n )\n .execute()\n } else if (method === Method.DELETE) {\n await db.db\n .deleteFrom('private_data')\n .where('actorDid', '=', actorDid)\n .where('namespace', '=', namespace)\n .where('key', '=', key)\n .execute()\n } else {\n assert.fail(`unexpected method ${method}`)\n }\n}\n\nconst handleSubjectActivitySubscriptionOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n now: string,\n) => {\n const { actorDid, key, method, payload } = op\n\n if (method === Method.DELETE) {\n await db.db\n .deleteFrom('activity_subscription')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n return\n }\n\n const parsed =\n lexParse<app.bsky.notification.defs.SubjectActivitySubscription>(\n Buffer.from(payload).toString('utf8'),\n )\n const {\n subject,\n activitySubscription: { post, reply },\n } = parsed\n\n if (method === Method.CREATE) {\n await db.db\n .insertInto('activity_subscription')\n .values({\n creator: actorDid,\n subjectDid: subject,\n key,\n indexedAt: now,\n post,\n reply,\n })\n .execute()\n return\n }\n\n await db.db\n .updateTable('activity_subscription')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .set({\n indexedAt: now,\n post,\n reply,\n })\n .execute()\n}\n\nconst handleAgeAssuranceEventOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n) => {\n const { actorDid, method, payload } = op\n if (method !== Method.CREATE) return\n\n const parsed = lexParse<app.bsky.unspecced.defs.AgeAssuranceEvent>(\n Buffer.from(payload).toString('utf8'),\n )\n const { status, createdAt } = parsed\n\n const update = {\n ageAssuranceStatus: status,\n ageAssuranceLastInitiatedAt: status === 'pending' ? createdAt : undefined,\n }\n\n await db.db\n .updateTable('actor')\n .set(update)\n .where('did', '=', actorDid)\n .execute()\n}\n\nconst handleAgeAssuranceV2EventOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n) => {\n const { actorDid, method, payload } = op\n if (method !== Method.CREATE) return\n\n const parsed = lexParse<app.bsky.ageassurance.defs.Event>(\n Buffer.from(payload).toString('utf8'),\n )\n const { status, createdAt, access, countryCode, regionCode } = parsed\n\n const update = {\n ageAssuranceStatus: status,\n ageAssuranceLastInitiatedAt: status === 'pending' ? createdAt : undefined,\n ageAssuranceAccess: access,\n ageAssuranceCountryCode: countryCode,\n ageAssuranceRegionCode: regionCode,\n }\n\n await db.db\n .updateTable('actor')\n .set(update)\n .where('did', '=', actorDid)\n .execute()\n}\n\nconst handleBookmarkOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n now: string,\n) => {\n const { actorDid, key, method, payload } = op\n\n const updateAgg = (uri: string, dbTxn: Database) => {\n return dbTxn.db\n .insertInto('post_agg')\n .values({\n uri,\n bookmarkCount: dbTxn.db\n .selectFrom('bookmark')\n .where('bookmark.subjectUri', '=', uri)\n .select(countAll.as('count')),\n })\n .onConflict((oc) =>\n oc\n .column('uri')\n .doUpdateSet({ bookmarkCount: excluded(dbTxn.db, 'bookmarkCount') }),\n )\n .execute()\n }\n\n if (method === Method.CREATE) {\n const parsed = lexParse<app.bsky.bookmark.defs.Bookmark>(\n Buffer.from(payload).toString('utf8'),\n )\n const {\n subject: { uri, cid },\n } = parsed\n\n await db.transaction(async (dbTxn) => {\n await dbTxn.db\n .insertInto('bookmark')\n .values({\n creator: actorDid,\n key,\n indexedAt: now,\n subjectUri: uri,\n subjectCid: cid,\n })\n .execute()\n\n await updateAgg(uri, dbTxn)\n })\n }\n\n if (method === Method.DELETE) {\n await db.transaction(async (dbTxn) => {\n const bookmark = await dbTxn.db\n .selectFrom('bookmark')\n .selectAll()\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .executeTakeFirst()\n\n if (bookmark) {\n await dbTxn.db\n .deleteFrom('bookmark')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n\n await updateAgg(bookmark.subjectUri, dbTxn)\n }\n })\n }\n}\n\nconst handleDraftOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n now: string,\n) => {\n const { actorDid, key, method, payload } = op\n\n if (method === Method.CREATE) {\n const payloadString = Buffer.from(payload).toString('utf8')\n\n await db.db\n .insertInto('draft')\n .values({\n creator: actorDid,\n key,\n createdAt: now,\n updatedAt: now,\n payload: payloadString,\n })\n .execute()\n }\n\n if (method === Method.UPDATE) {\n const payloadString = Buffer.from(payload).toString('utf8')\n\n await db.db\n .updateTable('draft')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .set({\n updatedAt: now,\n payload: payloadString,\n })\n .execute()\n }\n\n if (method === Method.DELETE) {\n await db.db\n .deleteFrom('draft')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n }\n}\n\n// compares numeric (bigint) cursor ids; an undefined target is always satisfied\nconst gteCursor = (current: string | undefined, target: string | undefined) => {\n if (!target) return true\n return BigInt(current || '0') >= BigInt(target)\n}\n\n// resolves after `ms`, or early if `signal` aborts\nconst wait = (ms: number, signal?: AbortSignal) =>\n new Promise<void>((resolve) => {\n if (signal?.aborted) return resolve()\n const done = () => {\n clearTimeout(timer)\n signal?.removeEventListener('abort', done)\n resolve()\n }\n const timer = setTimeout(done, ms)\n signal?.addEventListener('abort', done, { once: true })\n })\n"]}
|
|
1
|
+
{"version":3,"file":"bsync-subscription.js","sourceRoot":"","sources":["../../../src/data-plane/server/bsync-subscription.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { lexParse } from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport {\n type BsyncClient,\n authWithApiKey,\n createBsyncClient,\n} from '../../bsync.js'\nimport type { ServerConfig } from '../../config.js'\nimport { app } from '../../lexicons/index.js'\nimport { subLogger as log } from '../../logger.js'\nimport {\n Method,\n type MuteOperation,\n MuteOperation_Type,\n type Operation,\n} from '../../proto/bsync_pb.js'\nimport { Namespaces } from '../../stash.js'\nimport type { Database } from './db/index.js'\nimport { countAll, excluded } from './db/util.js'\n\nexport type BsyncCursors = {\n op?: string\n mute?: string\n}\n\nexport class BsyncSubscription {\n private ac: AbortController | undefined\n private pendingScans = new Set<Promise<void>>()\n private bsyncClient: BsyncClient\n private db: Database\n // Latest cursor processed for each stream, used to wait until caught up.\n private cursors: BsyncCursors = {}\n\n constructor(public opts: { db: Database; config: ServerConfig }) {\n const { config, db } = opts\n\n this.db = db\n this.bsyncClient = createBsyncClient({\n baseUrl: config.bsyncUrl,\n httpVersion: config.bsyncHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.bsyncIgnoreBadTls },\n interceptors: config.bsyncApiKey\n ? [authWithApiKey(config.bsyncApiKey)]\n : [],\n })\n }\n\n get running() {\n return !!this.ac\n }\n\n start() {\n if (this.ac) return\n this.ac = new AbortController()\n this.scanMuteOperations()\n this.scanOperations()\n }\n\n /**\n * Waits until the subscription has processed every operation that existed in\n * bsync at the time `targets` was read (one cursor per stream). Returns as\n * soon as the cursors catch up - it does not wait for the bsync long-poll\n * timeout. Intended for tests/dev.\n */\n async processAll(targets: BsyncCursors, timeout = 5000) {\n if (!this.ac) return\n const start = Date.now()\n while (!this.isCaughtUp(targets)) {\n if (Date.now() - start > timeout) {\n throw new Error(\n `bsync subscription was not caught up within ${timeout}ms`,\n )\n }\n await wait(5)\n }\n }\n\n private isCaughtUp(targets: BsyncCursors) {\n return (\n gteCursor(this.cursors.op, targets.op) &&\n gteCursor(this.cursors.mute, targets.mute)\n )\n }\n\n async destroy() {\n // Aborting cancels any in-flight long-poll scan immediately, so we don't\n // have to wait for the bsync long-poll timeout to elapse.\n this.ac?.abort()\n this.ac = undefined\n // Wait for the ongoing scans to unwind cleanly.\n await Promise.all(this.pendingScans)\n }\n\n /**\n * starts a scanner in the background, killing it when this instance is\n * destroyed, and storing its promise in `this.pendingScans` to allow\n * awaiting.\n */\n private startScanning(\n scanner: (\n cursor: undefined | string,\n signal: AbortSignal,\n ) => Promise<string | undefined>,\n ) {\n if (!this.ac) return\n const signal = this.ac.signal\n\n const scanPromise = this.runScanner(scanner, signal)\n\n this.pendingScans.add(scanPromise)\n void scanPromise\n .catch(() => {})\n .finally(() => {\n this.pendingScans.delete(scanPromise)\n })\n }\n\n private async runScanner(\n scanner: (\n cursor: undefined | string,\n signal: AbortSignal,\n ) => Promise<string | undefined>,\n signal: AbortSignal,\n ) {\n let cursor: undefined | string\n\n while (!signal.aborted) {\n try {\n cursor = await scanner(cursor, signal)\n } catch (err) {\n if (signal.aborted) break\n\n log.error({ err }, 'error in bsync scan')\n\n // retry in a bit, but bail out early if we're shutting down\n await wait(100, signal)\n }\n }\n }\n\n private scanMuteOperations() {\n this.startScanning(async (cursor, signal) => {\n const res = await this.bsyncClient.scanMuteOperations(\n { cursor },\n { signal },\n )\n\n await this.processMuteOperations(res.operations)\n this.cursors.mute = res.cursor\n\n return res.cursor\n })\n }\n\n private async processMuteOperations(operations: MuteOperation[]) {\n for (const op of operations) {\n const { type, actorDid, subject, onlyReposts, onlyQuoteposts } = op\n if (type === MuteOperation_Type.ADD) {\n if (subject.startsWith('did:')) {\n await this.db.db\n .insertInto('mute')\n .values({\n mutedByDid: actorDid,\n subjectDid: subject,\n createdAt: new Date().toISOString(),\n onlyReposts,\n onlyQuoteposts,\n })\n .onConflict((oc) =>\n oc\n .columns(['mutedByDid', 'subjectDid'])\n .doUpdateSet({ onlyReposts, onlyQuoteposts }),\n )\n .execute()\n } else {\n const uri = new AtUri(subject)\n if (uri.collection === app.bsky.graph.list.$type) {\n await this.db.db\n .insertInto('list_mute')\n .values({\n mutedByDid: actorDid,\n listUri: subject,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n } else {\n await this.db.db\n .insertInto('thread_mute')\n .values({\n mutedByDid: actorDid,\n rootUri: subject,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n }\n } else if (type === MuteOperation_Type.REMOVE) {\n if (subject.startsWith('did:')) {\n await this.db.db\n .deleteFrom('mute')\n .where('mutedByDid', '=', actorDid)\n .where('subjectDid', '=', subject)\n .execute()\n } else {\n const uri = new AtUri(subject)\n if (uri.collection === app.bsky.graph.list.$type) {\n await this.db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .where('listUri', '=', subject)\n .execute()\n } else {\n await this.db.db\n .deleteFrom('thread_mute')\n .where('mutedByDid', '=', actorDid)\n .where('rootUri', '=', subject)\n .execute()\n }\n }\n } else if (type === MuteOperation_Type.CLEAR) {\n await this.db.db\n .deleteFrom('mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n await this.db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n }\n }\n }\n\n private scanOperations() {\n this.startScanning(async (cursor, signal) => {\n const res = await this.bsyncClient.scanOperations({ cursor }, { signal })\n\n await this.processOperations(res.operations)\n this.cursors.op = res.cursor\n\n return res.cursor\n })\n }\n\n private async processOperations(operations: Operation[]) {\n for (const op of operations) {\n const { namespace } = op\n\n const now = new Date().toISOString()\n\n // Index all items into private_data.\n await handleGenericOperation(this.db, op, now)\n\n // Maintain bespoke indexes for certain namespaces. A failure here must\n // not stall the stream, so log and move on (matching bsync behavior).\n try {\n if (\n namespace ===\n Namespaces.AppBskyNotificationDefsSubjectActivitySubscription.$type\n ) {\n await handleSubjectActivitySubscriptionOperation(this.db, op, now)\n } else if (\n namespace === Namespaces.AppBskyUnspeccedDefsAgeAssuranceEvent.$type\n ) {\n await handleAgeAssuranceEventOperation(this.db, op, now)\n } else if (\n namespace === Namespaces.AppBskyAgeassuranceDefsEvent.$type\n ) {\n await handleAgeAssuranceV2EventOperation(this.db, op, now)\n } else if (namespace === Namespaces.AppBskyBookmarkDefsBookmark.$type) {\n await handleBookmarkOperation(this.db, op, now)\n } else if (namespace === Namespaces.AppBskyDraftDefsDraftWithId.$type) {\n await handleDraftOperation(this.db, op, now)\n }\n } catch (err) {\n log.warn({ err, namespace }, 'bsync put operation indexing failed')\n }\n }\n }\n}\n\ntype HandleOperation = (\n db: Database,\n op: Operation,\n now: string,\n) => Promise<void>\n\n// upsert into or remove from private_data\nconst handleGenericOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n now: string,\n) => {\n const { actorDid, namespace, key, method, payload } = op\n if (method === Method.CREATE || method === Method.UPDATE) {\n await db.db\n .insertInto('private_data')\n .values({\n actorDid,\n namespace,\n key,\n payload: Buffer.from(payload).toString('utf8'),\n indexedAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.columns(['actorDid', 'namespace', 'key']).doUpdateSet({\n payload: excluded(db.db, 'payload'),\n updatedAt: excluded(db.db, 'updatedAt'),\n }),\n )\n .execute()\n } else if (method === Method.DELETE) {\n await db.db\n .deleteFrom('private_data')\n .where('actorDid', '=', actorDid)\n .where('namespace', '=', namespace)\n .where('key', '=', key)\n .execute()\n } else {\n assert.fail(`unexpected method ${method}`)\n }\n}\n\nconst handleSubjectActivitySubscriptionOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n now: string,\n) => {\n const { actorDid, key, method, payload } = op\n\n if (method === Method.DELETE) {\n await db.db\n .deleteFrom('activity_subscription')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n return\n }\n\n const parsed =\n lexParse<app.bsky.notification.defs.SubjectActivitySubscription>(\n Buffer.from(payload).toString('utf8'),\n )\n const {\n subject,\n activitySubscription: { post, reply },\n } = parsed\n\n if (method === Method.CREATE) {\n await db.db\n .insertInto('activity_subscription')\n .values({\n creator: actorDid,\n subjectDid: subject,\n key,\n indexedAt: now,\n post,\n reply,\n })\n .execute()\n return\n }\n\n await db.db\n .updateTable('activity_subscription')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .set({\n indexedAt: now,\n post,\n reply,\n })\n .execute()\n}\n\nconst handleAgeAssuranceEventOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n) => {\n const { actorDid, method, payload } = op\n if (method !== Method.CREATE) return\n\n const parsed = lexParse<app.bsky.unspecced.defs.AgeAssuranceEvent>(\n Buffer.from(payload).toString('utf8'),\n )\n const { status, createdAt } = parsed\n\n const update = {\n ageAssuranceStatus: status,\n ageAssuranceLastInitiatedAt: status === 'pending' ? createdAt : undefined,\n }\n\n await db.db\n .updateTable('actor')\n .set(update)\n .where('did', '=', actorDid)\n .execute()\n}\n\nconst handleAgeAssuranceV2EventOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n) => {\n const { actorDid, method, payload } = op\n if (method !== Method.CREATE) return\n\n const parsed = lexParse<app.bsky.ageassurance.defs.Event>(\n Buffer.from(payload).toString('utf8'),\n )\n const { status, createdAt, access, countryCode, regionCode } = parsed\n\n const update = {\n ageAssuranceStatus: status,\n ageAssuranceLastInitiatedAt: status === 'pending' ? createdAt : undefined,\n ageAssuranceAccess: access,\n ageAssuranceCountryCode: countryCode,\n ageAssuranceRegionCode: regionCode,\n }\n\n await db.db\n .updateTable('actor')\n .set(update)\n .where('did', '=', actorDid)\n .execute()\n}\n\nconst handleBookmarkOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n now: string,\n) => {\n const { actorDid, key, method, payload } = op\n\n const updateAgg = (uri: string, dbTxn: Database) => {\n return dbTxn.db\n .insertInto('post_agg')\n .values({\n uri,\n bookmarkCount: dbTxn.db\n .selectFrom('bookmark')\n .where('bookmark.subjectUri', '=', uri)\n .select(countAll.as('count')),\n })\n .onConflict((oc) =>\n oc\n .column('uri')\n .doUpdateSet({ bookmarkCount: excluded(dbTxn.db, 'bookmarkCount') }),\n )\n .execute()\n }\n\n if (method === Method.CREATE) {\n const parsed = lexParse<app.bsky.bookmark.defs.Bookmark>(\n Buffer.from(payload).toString('utf8'),\n )\n const {\n subject: { uri, cid },\n } = parsed\n\n await db.transaction(async (dbTxn) => {\n await dbTxn.db\n .insertInto('bookmark')\n .values({\n creator: actorDid,\n key,\n indexedAt: now,\n subjectUri: uri,\n subjectCid: cid,\n })\n .execute()\n\n await updateAgg(uri, dbTxn)\n })\n }\n\n if (method === Method.DELETE) {\n await db.transaction(async (dbTxn) => {\n const bookmark = await dbTxn.db\n .selectFrom('bookmark')\n .selectAll()\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .executeTakeFirst()\n\n if (bookmark) {\n await dbTxn.db\n .deleteFrom('bookmark')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n\n await updateAgg(bookmark.subjectUri, dbTxn)\n }\n })\n }\n}\n\nconst handleDraftOperation: HandleOperation = async (\n db: Database,\n op: Operation,\n now: string,\n) => {\n const { actorDid, key, method, payload } = op\n\n if (method === Method.CREATE) {\n const payloadString = Buffer.from(payload).toString('utf8')\n\n await db.db\n .insertInto('draft')\n .values({\n creator: actorDid,\n key,\n createdAt: now,\n updatedAt: now,\n payload: payloadString,\n })\n .execute()\n }\n\n if (method === Method.UPDATE) {\n const payloadString = Buffer.from(payload).toString('utf8')\n\n await db.db\n .updateTable('draft')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .set({\n updatedAt: now,\n payload: payloadString,\n })\n .execute()\n }\n\n if (method === Method.DELETE) {\n await db.db\n .deleteFrom('draft')\n .where('creator', '=', actorDid)\n .where('key', '=', key)\n .execute()\n }\n}\n\n// compares numeric (bigint) cursor ids; an undefined target is always satisfied\nconst gteCursor = (current: string | undefined, target: string | undefined) => {\n if (!target) return true\n return BigInt(current || '0') >= BigInt(target)\n}\n\n// resolves after `ms`, or early if `signal` aborts\nconst wait = (ms: number, signal?: AbortSignal) =>\n new Promise<void>((resolve) => {\n if (signal?.aborted) return resolve()\n const done = () => {\n clearTimeout(timer)\n signal?.removeEventListener('abort', done)\n resolve()\n }\n const timer = setTimeout(done, ms)\n signal?.addEventListener('abort', done, { once: true })\n })\n"]}
|
package/dist/data-plane/server/db/migrations/20260918T214110000Z-remove-priority-notifs.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260918T214110000Z-remove-priority-notifs.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/20260918T214110000Z-remove-priority-notifs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3D;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export async function up(db) {
|
|
2
|
+
await db.schema
|
|
3
|
+
.alterTable('actor_state')
|
|
4
|
+
.dropColumn('priorityNotifs')
|
|
5
|
+
.execute();
|
|
6
|
+
}
|
|
7
|
+
export async function down(db) {
|
|
8
|
+
await db.schema
|
|
9
|
+
.alterTable('actor_state')
|
|
10
|
+
.addColumn('priorityNotifs', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
11
|
+
.execute();
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=20260918T214110000Z-remove-priority-notifs.js.map
|
package/dist/data-plane/server/db/migrations/20260918T214110000Z-remove-priority-notifs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260918T214110000Z-remove-priority-notifs.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/20260918T214110000Z-remove-priority-notifs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,EAAmB;IAC1C,MAAM,EAAE,CAAC,MAAM;SACZ,UAAU,CAAC,aAAa,CAAC;SACzB,UAAU,CAAC,gBAAgB,CAAC;SAC5B,OAAO,EAAE,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,EAAmB;IAC5C,MAAM,EAAE,CAAC,MAAM;SACZ,UAAU,CAAC,aAAa,CAAC;SACzB,SAAS,CAAC,gBAAgB,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAC9C,GAAG,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAC/B;SACA,OAAO,EAAE,CAAA;AACd,CAAC","sourcesContent":["import type { Kysely } from 'kysely'\n\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await db.schema\n .alterTable('actor_state')\n .dropColumn('priorityNotifs')\n .execute()\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await db.schema\n .alterTable('actor_state')\n .addColumn('priorityNotifs', 'boolean', (col) =>\n col.notNull().defaultTo(false),\n )\n .execute()\n}\n"]}
|
|
@@ -59,4 +59,5 @@ export * as _20260729T223157563Z from './20260729T223157563Z-add-op-thread-reply
|
|
|
59
59
|
export * as _20260819T170000000Z from './20260819T170000000Z-add-like-subject-sort-index.js';
|
|
60
60
|
export * as _20260827T200000000Z from './20260827T200000000Z-reference-list-opt-outs.js';
|
|
61
61
|
export * as _20260904T130000000Z from './20260904T130000000Z-remove-last-seen-priority-notifs.js';
|
|
62
|
+
export * as _20260918T214110000Z from './20260918T214110000Z-remove-priority-notifs.js';
|
|
62
63
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,4 +62,5 @@ export * as _20260729T223157563Z from './20260729T223157563Z-add-op-thread-reply
|
|
|
62
62
|
export * as _20260819T170000000Z from './20260819T170000000Z-add-like-subject-sort-index.js';
|
|
63
63
|
export * as _20260827T200000000Z from './20260827T200000000Z-reference-list-opt-outs.js';
|
|
64
64
|
export * as _20260904T130000000Z from './20260904T130000000Z-remove-last-seen-priority-notifs.js';
|
|
65
|
+
export * as _20260918T214110000Z from './20260918T214110000Z-remove-priority-notifs.js';
|
|
65
66
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/index.ts"],"names":[],"mappings":"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","sourcesContent":["// NOTE this file can be edited by hand, but it is also appended to by the migration:create command.\n// It's important that every migration is exported from here with the proper name. We'd simplify\n// this with kysely's FileMigrationProvider, but it doesn't play nicely with the build process.\n\nexport * as _20230309T045948368Z from './20230309T045948368Z-init.js'\nexport * as _20230408T152211201Z from './20230408T152211201Z-notification-init.js'\nexport * as _20230417T210628672Z from './20230417T210628672Z-moderation-init.js'\nexport * as _20230420T211446071Z from './20230420T211446071Z-did-cache.js'\nexport * as _20230427T194702079Z from './20230427T194702079Z-notif-record-index.js'\nexport * as _20230605T144730094Z from './20230605T144730094Z-post-profile-aggs.js'\nexport * as _20230607T211442112Z from './20230607T211442112Z-feed-generator-init.js'\nexport * as _20230608T155101190Z from './20230608T155101190Z-algo-whats-hot-view.js'\nexport * as _20230608T201813132Z from './20230608T201813132Z-mute-lists.js'\nexport * as _20230608T205147239Z from './20230608T205147239Z-mutes.js'\nexport * as _20230609T153623961Z from './20230609T153623961Z-blocks.js'\nexport * as _20230609T232122649Z from './20230609T232122649Z-actor-deletion-indexes.js'\nexport * as _20230610T203555962Z from './20230610T203555962Z-suggested-follows.js'\nexport * as _20230611T215300060Z from './20230611T215300060Z-actor-state.js'\nexport * as _20230620T161134972Z from './20230620T161134972Z-post-langs.js'\nexport * as _20230627T212437895Z from './20230627T212437895Z-optional-handle.js'\nexport * as _20230629T220835893Z from './20230629T220835893Z-remove-post-hierarchy.js'\nexport * as _20230703T045536691Z from './20230703T045536691Z-feed-and-label-indices.js'\nexport * as _20230720T164800037Z from './20230720T164800037Z-posts-cursor-idx.js'\nexport * as _20230807T035309811Z from './20230807T035309811Z-feed-item-delete-invite-for-user-idx.js'\nexport * as _20230808T172902639Z from './20230808T172902639Z-repo-rev.js'\nexport * as _20230810T203349843Z from './20230810T203349843Z-action-duration.js'\nexport * as _20230817T195936007Z from './20230817T195936007Z-native-notifications.js'\nexport * as _20230830T205507322Z from './20230830T205507322Z-suggested-feeds.js'\nexport * as _20230904T211011773Z from './20230904T211011773Z-block-lists.js'\nexport * as _20230906T222220386Z from './20230906T222220386Z-thread-gating.js'\nexport * as _20230920T213858047Z from './20230920T213858047Z-add-tags-to-post.js'\nexport * as _20230929T192920807Z from './20230929T192920807Z-record-cursor-indexes.js'\nexport * as _20231003T202833377Z from './20231003T202833377Z-create-moderation-subject-status.js'\nexport * as _20231220T225126090Z from './20231220T225126090Z-blob-takedowns.js'\nexport * as _20240124T023719200Z from './20240124T023719200Z-tagged-suggestions.js'\nexport * as _20240226T225725627Z from './20240226T225725627Z-labelers.js'\nexport * as _20240530T170337073Z from './20240530T170337073Z-account-deactivation.js'\nexport * as _20240606T171229898Z from './20240606T171229898Z-thread-mutes.js'\nexport * as _20240606T222548219Z from './20240606T222548219Z-starter-packs.js'\nexport * as _20240719T203853939Z from './20240719T203853939Z-priority-notifs.js'\nexport * as _20240723T220700077Z from './20240723T220700077Z-quotes-post-aggs.js'\nexport * as _20240723T220703655Z from './20240723T220703655Z-quotes.js'\nexport * as _20240801T193939827Z from './20240801T193939827Z-post-gate.js'\nexport * as _20240808T224251220Z from './20240808T224251220Z-post-gate-flags.js'\nexport * as _20240829T211238293Z from './20240829T211238293Z-simplify-actor-sync.js'\nexport * as _20240831T134810923Z from './20240831T134810923Z-pinned-posts.js'\nexport * as _20241114T153108102Z from './20241114T153108102Z-add-starter-packs-name.js'\nexport * as _20250116T222618297Z from './20250116T222618297Z-post-embed-video.js'\nexport * as _20250207T174822012Z from './20250207T174822012Z-add-label-exp.js'\nexport * as _20250404T163421487Z from './20250404T163421487Z-verifications.js'\nexport * as _20250526T023712742Z from './20250526T023712742Z-like-repost-via.js'\nexport * as _20250528T221913281Z from './20250528T221913281Z-add-record-tags.js'\nexport * as _20250602T190357447Z from './20250602T190357447Z-add-private-data.js'\nexport * as _20250611T140649895Z from './20250611T140649895Z-add-activity-subscription.js'\nexport * as _20250627T025331240Z from './20250627T025331240Z-add-actor-age-assurance-columns.js'\nexport * as _20250812T183735692Z from './20250812T183735692Z-add-bookmarks.js'\nexport * as _20250813T174955711Z from './20250813T174955711Z-add-post-agg-bookmarks.js'\nexport * as _20251120T004738098Z from './20251120T004738098Z-update-actor-age-assurance-v2.js'\nexport * as _20260112T133951271Z from './20260112T133951271Z-add-drafts.js'\nexport * as _20260604T224952774Z from './20260604T224952774Z-post-embed-gallery-image.js'\nexport * as _20260618T200000000Z from './20260618T200000000Z-add-mute-scope.js'\nexport * as _20260729T223157563Z from './20260729T223157563Z-add-op-thread-reply.js'\nexport * as _20260819T170000000Z from './20260819T170000000Z-add-like-subject-sort-index.js'\nexport * as _20260827T200000000Z from './20260827T200000000Z-reference-list-opt-outs.js'\nexport * as _20260904T130000000Z from './20260904T130000000Z-remove-last-seen-priority-notifs.js'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/migrations/index.ts"],"names":[],"mappings":"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","sourcesContent":["// NOTE this file can be edited by hand, but it is also appended to by the migration:create command.\n// It's important that every migration is exported from here with the proper name. We'd simplify\n// this with kysely's FileMigrationProvider, but it doesn't play nicely with the build process.\n\nexport * as _20230309T045948368Z from './20230309T045948368Z-init.js'\nexport * as _20230408T152211201Z from './20230408T152211201Z-notification-init.js'\nexport * as _20230417T210628672Z from './20230417T210628672Z-moderation-init.js'\nexport * as _20230420T211446071Z from './20230420T211446071Z-did-cache.js'\nexport * as _20230427T194702079Z from './20230427T194702079Z-notif-record-index.js'\nexport * as _20230605T144730094Z from './20230605T144730094Z-post-profile-aggs.js'\nexport * as _20230607T211442112Z from './20230607T211442112Z-feed-generator-init.js'\nexport * as _20230608T155101190Z from './20230608T155101190Z-algo-whats-hot-view.js'\nexport * as _20230608T201813132Z from './20230608T201813132Z-mute-lists.js'\nexport * as _20230608T205147239Z from './20230608T205147239Z-mutes.js'\nexport * as _20230609T153623961Z from './20230609T153623961Z-blocks.js'\nexport * as _20230609T232122649Z from './20230609T232122649Z-actor-deletion-indexes.js'\nexport * as _20230610T203555962Z from './20230610T203555962Z-suggested-follows.js'\nexport * as _20230611T215300060Z from './20230611T215300060Z-actor-state.js'\nexport * as _20230620T161134972Z from './20230620T161134972Z-post-langs.js'\nexport * as _20230627T212437895Z from './20230627T212437895Z-optional-handle.js'\nexport * as _20230629T220835893Z from './20230629T220835893Z-remove-post-hierarchy.js'\nexport * as _20230703T045536691Z from './20230703T045536691Z-feed-and-label-indices.js'\nexport * as _20230720T164800037Z from './20230720T164800037Z-posts-cursor-idx.js'\nexport * as _20230807T035309811Z from './20230807T035309811Z-feed-item-delete-invite-for-user-idx.js'\nexport * as _20230808T172902639Z from './20230808T172902639Z-repo-rev.js'\nexport * as _20230810T203349843Z from './20230810T203349843Z-action-duration.js'\nexport * as _20230817T195936007Z from './20230817T195936007Z-native-notifications.js'\nexport * as _20230830T205507322Z from './20230830T205507322Z-suggested-feeds.js'\nexport * as _20230904T211011773Z from './20230904T211011773Z-block-lists.js'\nexport * as _20230906T222220386Z from './20230906T222220386Z-thread-gating.js'\nexport * as _20230920T213858047Z from './20230920T213858047Z-add-tags-to-post.js'\nexport * as _20230929T192920807Z from './20230929T192920807Z-record-cursor-indexes.js'\nexport * as _20231003T202833377Z from './20231003T202833377Z-create-moderation-subject-status.js'\nexport * as _20231220T225126090Z from './20231220T225126090Z-blob-takedowns.js'\nexport * as _20240124T023719200Z from './20240124T023719200Z-tagged-suggestions.js'\nexport * as _20240226T225725627Z from './20240226T225725627Z-labelers.js'\nexport * as _20240530T170337073Z from './20240530T170337073Z-account-deactivation.js'\nexport * as _20240606T171229898Z from './20240606T171229898Z-thread-mutes.js'\nexport * as _20240606T222548219Z from './20240606T222548219Z-starter-packs.js'\nexport * as _20240719T203853939Z from './20240719T203853939Z-priority-notifs.js'\nexport * as _20240723T220700077Z from './20240723T220700077Z-quotes-post-aggs.js'\nexport * as _20240723T220703655Z from './20240723T220703655Z-quotes.js'\nexport * as _20240801T193939827Z from './20240801T193939827Z-post-gate.js'\nexport * as _20240808T224251220Z from './20240808T224251220Z-post-gate-flags.js'\nexport * as _20240829T211238293Z from './20240829T211238293Z-simplify-actor-sync.js'\nexport * as _20240831T134810923Z from './20240831T134810923Z-pinned-posts.js'\nexport * as _20241114T153108102Z from './20241114T153108102Z-add-starter-packs-name.js'\nexport * as _20250116T222618297Z from './20250116T222618297Z-post-embed-video.js'\nexport * as _20250207T174822012Z from './20250207T174822012Z-add-label-exp.js'\nexport * as _20250404T163421487Z from './20250404T163421487Z-verifications.js'\nexport * as _20250526T023712742Z from './20250526T023712742Z-like-repost-via.js'\nexport * as _20250528T221913281Z from './20250528T221913281Z-add-record-tags.js'\nexport * as _20250602T190357447Z from './20250602T190357447Z-add-private-data.js'\nexport * as _20250611T140649895Z from './20250611T140649895Z-add-activity-subscription.js'\nexport * as _20250627T025331240Z from './20250627T025331240Z-add-actor-age-assurance-columns.js'\nexport * as _20250812T183735692Z from './20250812T183735692Z-add-bookmarks.js'\nexport * as _20250813T174955711Z from './20250813T174955711Z-add-post-agg-bookmarks.js'\nexport * as _20251120T004738098Z from './20251120T004738098Z-update-actor-age-assurance-v2.js'\nexport * as _20260112T133951271Z from './20260112T133951271Z-add-drafts.js'\nexport * as _20260604T224952774Z from './20260604T224952774Z-post-embed-gallery-image.js'\nexport * as _20260618T200000000Z from './20260618T200000000Z-add-mute-scope.js'\nexport * as _20260729T223157563Z from './20260729T223157563Z-add-op-thread-reply.js'\nexport * as _20260819T170000000Z from './20260819T170000000Z-add-like-subject-sort-index.js'\nexport * as _20260827T200000000Z from './20260827T200000000Z-reference-list-opt-outs.js'\nexport * as _20260904T130000000Z from './20260904T130000000Z-remove-last-seen-priority-notifs.js'\nexport * as _20260918T214110000Z from './20260918T214110000Z-remove-priority-notifs.js'\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actor-state.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/tables/actor-state.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"actor-state.d.ts","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/tables/actor-state.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,eAAO,MAAM,SAAS,gBAAgB,CAAA;AAEtC,MAAM,MAAM,SAAS,GAAG;IAAE,CAAC,SAAS,CAAC,EAAE,UAAU,CAAA;CAAE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actor-state.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/tables/actor-state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"actor-state.js","sourceRoot":"","sources":["../../../../../src/data-plane/server/db/tables/actor-state.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAA","sourcesContent":["export interface ActorState {\n did: string\n lastSeenNotifs: string\n}\n\nexport const tableName = 'actor_state'\n\nexport type PartialDB = { [tableName]: ActorState }\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follows.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/follows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"follows.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/follows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAK7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAI9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { keyBy } from '@atproto/common';
|
|
2
|
-
import { FollowsFollowing } from '../../../proto/bsky_pb.js';
|
|
2
|
+
import { FollowsFollowing, SampledFollowsFollowing, } from '../../../proto/bsky_pb.js';
|
|
3
3
|
import { TimeCidKeyset, paginate } from '../db/pagination.js';
|
|
4
|
+
import { countAll } from '../db/util.js';
|
|
4
5
|
export default (db) => ({
|
|
5
6
|
async getActorFollowsActors(req) {
|
|
6
7
|
const { actorDid, targetDids } = req;
|
|
@@ -93,29 +94,63 @@ export default (db) => ({
|
|
|
93
94
|
* If Alice (the viewer) looks at Dan's profile (the subject), she should see that Bob follows Dan
|
|
94
95
|
*/
|
|
95
96
|
async getFollowsFollowing(req) {
|
|
96
|
-
const { actorDid: viewerDid, targetDids: subjectDids } = req;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
* 3. Find the intersection
|
|
101
|
-
*/
|
|
102
|
-
const results = [];
|
|
103
|
-
for (const subjectDid of subjectDids) {
|
|
104
|
-
const followsReq = db.db
|
|
105
|
-
.selectFrom('follow')
|
|
106
|
-
.where('follow.creator', '=', viewerDid)
|
|
107
|
-
.where('follow.subjectDid', 'in', db.db
|
|
108
|
-
.selectFrom('follow')
|
|
109
|
-
.where('follow.subjectDid', '=', subjectDid)
|
|
110
|
-
.select(['creator']))
|
|
111
|
-
.select(['subjectDid']);
|
|
112
|
-
const rows = await followsReq.execute();
|
|
113
|
-
results.push(new FollowsFollowing({
|
|
97
|
+
const { actorDid: viewerDid, targetDids: subjectDids, limit, cursor } = req;
|
|
98
|
+
const results = await Promise.all(subjectDids.map(async (subjectDid) => {
|
|
99
|
+
const { dids, cursor: nextCursor } = await getKnownFollowers(db, viewerDid, subjectDid, limit, cursor);
|
|
100
|
+
return new FollowsFollowing({
|
|
114
101
|
targetDid: subjectDid,
|
|
115
|
-
dids
|
|
116
|
-
|
|
117
|
-
|
|
102
|
+
dids,
|
|
103
|
+
cursor: nextCursor,
|
|
104
|
+
});
|
|
105
|
+
}));
|
|
106
|
+
return { results };
|
|
107
|
+
},
|
|
108
|
+
async sampleFollowsFollowing(req) {
|
|
109
|
+
const { actorDid: viewerDid, targetDids: subjectDids, limit } = req;
|
|
110
|
+
const results = await Promise.all(subjectDids.map(async (subjectDid) => {
|
|
111
|
+
const { dids, total } = await getKnownFollowers(db, viewerDid, subjectDid, limit);
|
|
112
|
+
return new SampledFollowsFollowing({
|
|
113
|
+
targetDid: subjectDid,
|
|
114
|
+
dids,
|
|
115
|
+
totalKnown: total,
|
|
116
|
+
});
|
|
117
|
+
}));
|
|
118
118
|
return { results };
|
|
119
119
|
},
|
|
120
120
|
});
|
|
121
|
+
const getKnownFollowers = async (db, viewerDid, subjectDid, limit, cursor) => {
|
|
122
|
+
const followsReq = db.db
|
|
123
|
+
.selectFrom('follow')
|
|
124
|
+
.where('follow.creator', '=', viewerDid)
|
|
125
|
+
.where('follow.subjectDid', 'in', db.db
|
|
126
|
+
.selectFrom('follow')
|
|
127
|
+
.where('follow.subjectDid', '=', subjectDid)
|
|
128
|
+
.select(['creator']))
|
|
129
|
+
.select(['subjectDid', 'sortAt', 'cid']);
|
|
130
|
+
const totalReq = followsReq
|
|
131
|
+
.clearSelect()
|
|
132
|
+
.select(countAll.as('count'))
|
|
133
|
+
.executeTakeFirst();
|
|
134
|
+
let pageReq = followsReq;
|
|
135
|
+
let pageLimit;
|
|
136
|
+
if (limit && limit > 0) {
|
|
137
|
+
pageLimit = limit;
|
|
138
|
+
const { ref } = db.db.dynamic;
|
|
139
|
+
const keyset = new TimeCidKeyset(ref('follow.sortAt'), ref('follow.cid'));
|
|
140
|
+
pageReq = paginate(pageReq, {
|
|
141
|
+
limit,
|
|
142
|
+
cursor,
|
|
143
|
+
keyset,
|
|
144
|
+
tryIndex: true,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const [rows, totalRow] = await Promise.all([pageReq.execute(), totalReq]);
|
|
148
|
+
const keyset = new TimeCidKeyset(db.db.dynamic.ref('follow.sortAt'), db.db.dynamic.ref('follow.cid'));
|
|
149
|
+
const page = pageLimit === undefined ? { items: rows } : keyset.page(rows, pageLimit);
|
|
150
|
+
return {
|
|
151
|
+
dids: page.items.map((row) => row.subjectDid),
|
|
152
|
+
total: totalRow?.count ?? 0,
|
|
153
|
+
cursor: page.cursor,
|
|
154
|
+
};
|
|
155
|
+
};
|
|
121
156
|
//# sourceMappingURL=follows.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follows.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/follows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAE5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE7D,eAAe,CAAC,EAAY,EAAwC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,qBAAqB,CAAC,GAAG;QAC7B,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,GAAG,CAAA;QACpC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;QACrB,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,EAAE;aACpB,UAAU,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,gBAAgB,EAAE,GAAG,EAAE,QAAQ,CAAC;aACtC,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,UAAU,CAAC;aAC5C,SAAS,EAAE;aACX,OAAO,EAAE,CAAA;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;QAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;QACnE,OAAO;YACL,IAAI;SACL,CAAA;IACH,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,GAAG;QACpB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;QACvC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAC7B,IAAI,YAAY,GAAG,EAAE,CAAC,EAAE;aACrB,UAAU,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,mBAAmB,EAAE,GAAG,EAAE,QAAQ,CAAC;aACzC,SAAS,CAAC,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,CAAC;aAC9D,SAAS,CAAC,SAAS,CAAC;aACpB,MAAM,CAAC;YACN,mBAAmB;YACnB,mBAAmB;YACnB,8BAA8B;YAC9B,iCAAiC;YACjC,yBAAyB;SAC1B,CAAC,CAAA;QAEJ,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAA;QACzE,YAAY,GAAG,QAAQ,CAAC,YAAY,EAAE;YACpC,KAAK;YACL,MAAM;YACN,MAAM;YACN,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAA;QAC7D,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChC,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,QAAQ,EAAE,CAAC,CAAC,UAAU;gBACtB,UAAU,EAAE,CAAC,CAAC,UAAU;aACzB,CAAC,CAAC;YACH,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAA;IACH,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,GAAG;QAClB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;QACvC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAE7B,IAAI,UAAU,GAAG,EAAE,CAAC,EAAE;aACnB,UAAU,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,gBAAgB,EAAE,GAAG,EAAE,QAAQ,CAAC;aACtC,SAAS,CAAC,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,CAAC;aACjE,SAAS,CAAC,SAAS,CAAC;aACpB,MAAM,CAAC;YACN,mBAAmB;YACnB,mBAAmB;YACnB,8BAA8B;YAC9B,iCAAiC;YACjC,yBAAyB;SAC1B,CAAC,CAAA;QAEJ,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAA;QACzE,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE;YAChC,KAAK;YACL,MAAM;YACN,MAAM;YACN,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAA;QAE3D,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,QAAQ,EAAE,CAAC,CAAC,UAAU;gBACtB,UAAU,EAAE,CAAC,CAAC,UAAU;aACzB,CAAC,CAAC;YACH,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAA;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,mBAAmB,CAAC,GAAG;QAC3B,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,GAAG,CAAA;QAE5D;;;;WAIG;QAEH,MAAM,OAAO,GAAuB,EAAE,CAAA;QAEtC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE;iBACrB,UAAU,CAAC,QAAQ,CAAC;iBACpB,KAAK,CAAC,gBAAgB,EAAE,GAAG,EAAE,SAAS,CAAC;iBACvC,KAAK,CACJ,mBAAmB,EACnB,IAAI,EACJ,EAAE,CAAC,EAAE;iBACF,UAAU,CAAC,QAAQ,CAAC;iBACpB,KAAK,CAAC,mBAAmB,EAAE,GAAG,EAAE,UAAU,CAAC;iBAC3C,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CACvB;iBACA,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;YACzB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,CAAA;YACvC,OAAO,CAAC,IAAI,CACV,IAAI,gBAAgB,CAAC;gBACnB,SAAS,EAAE,UAAU;gBACrB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;aACpC,CAAC,CACH,CAAA;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAA;IACpB,CAAC;CACF,CAAC,CAAA","sourcesContent":["import type { ServiceImpl } from '@connectrpc/connect'\nimport { keyBy } from '@atproto/common'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport { FollowsFollowing } from '../../../proto/bsky_pb.js'\nimport type { Database } from '../db/index.js'\nimport { TimeCidKeyset, paginate } from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorFollowsActors(req) {\n const { actorDid, targetDids } = req\n if (targetDids.length < 1) {\n return { uris: [] }\n }\n const res = await db.db\n .selectFrom('follow')\n .where('follow.creator', '=', actorDid)\n .where('follow.subjectDid', 'in', targetDids)\n .selectAll()\n .execute()\n const bySubject = keyBy(res, 'subjectDid')\n const uris = targetDids.map((did) => bySubject.get(did)?.uri ?? '')\n return {\n uris,\n }\n },\n async getFollowers(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n let followersReq = db.db\n .selectFrom('follow')\n .where('follow.subjectDid', '=', actorDid)\n .innerJoin('actor as creator', 'creator.did', 'follow.creator')\n .selectAll('creator')\n .select([\n 'follow.uri as uri',\n 'follow.cid as cid',\n 'follow.creator as creatorDid',\n 'follow.subjectDid as subjectDid',\n 'follow.sortAt as sortAt',\n ])\n\n const keyset = new TimeCidKeyset(ref('follow.sortAt'), ref('follow.cid'))\n followersReq = paginate(followersReq, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n\n const page = keyset.page(await followersReq.execute(), limit)\n return {\n followers: page.items.map((f) => ({\n uri: f.uri,\n actorDid: f.creatorDid,\n subjectDid: f.subjectDid,\n })),\n cursor: page.cursor,\n }\n },\n async getFollows(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n\n let followsReq = db.db\n .selectFrom('follow')\n .where('follow.creator', '=', actorDid)\n .innerJoin('actor as subject', 'subject.did', 'follow.subjectDid')\n .selectAll('subject')\n .select([\n 'follow.uri as uri',\n 'follow.cid as cid',\n 'follow.creator as creatorDid',\n 'follow.subjectDid as subjectDid',\n 'follow.sortAt as sortAt',\n ])\n\n const keyset = new TimeCidKeyset(ref('follow.sortAt'), ref('follow.cid'))\n followsReq = paginate(followsReq, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n\n const page = keyset.page(await followsReq.execute(), limit)\n\n return {\n follows: page.items.map((f) => ({\n uri: f.uri,\n actorDid: f.creatorDid,\n subjectDid: f.subjectDid,\n })),\n cursor: page.cursor,\n }\n },\n\n /**\n * Return known followers of a given actor.\n *\n * Example:\n * - Alice follows Bob\n * - Bob follows Dan\n *\n * If Alice (the viewer) looks at Dan's profile (the subject), she should see that Bob follows Dan\n */\n async getFollowsFollowing(req) {\n const { actorDid: viewerDid, targetDids: subjectDids } = req\n\n /*\n * 1. Get all the people the Alice is following\n * 2. Get all the people the Dan is followed by\n * 3. Find the intersection\n */\n\n const results: FollowsFollowing[] = []\n\n for (const subjectDid of subjectDids) {\n const followsReq = db.db\n .selectFrom('follow')\n .where('follow.creator', '=', viewerDid)\n .where(\n 'follow.subjectDid',\n 'in',\n db.db\n .selectFrom('follow')\n .where('follow.subjectDid', '=', subjectDid)\n .select(['creator']),\n )\n .select(['subjectDid'])\n const rows = await followsReq.execute()\n results.push(\n new FollowsFollowing({\n targetDid: subjectDid,\n dids: rows.map((r) => r.subjectDid),\n }),\n )\n }\n\n return { results }\n },\n})\n"]}
|
|
1
|
+
{"version":3,"file":"follows.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/follows.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServiceImpl } from '@connectrpc/connect'\nimport { keyBy } from '@atproto/common'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport {\n FollowsFollowing,\n SampledFollowsFollowing,\n} from '../../../proto/bsky_pb.js'\nimport type { Database } from '../db/index.js'\nimport { TimeCidKeyset, paginate } from '../db/pagination.js'\nimport { countAll } from '../db/util.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorFollowsActors(req) {\n const { actorDid, targetDids } = req\n if (targetDids.length < 1) {\n return { uris: [] }\n }\n const res = await db.db\n .selectFrom('follow')\n .where('follow.creator', '=', actorDid)\n .where('follow.subjectDid', 'in', targetDids)\n .selectAll()\n .execute()\n const bySubject = keyBy(res, 'subjectDid')\n const uris = targetDids.map((did) => bySubject.get(did)?.uri ?? '')\n return {\n uris,\n }\n },\n async getFollowers(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n let followersReq = db.db\n .selectFrom('follow')\n .where('follow.subjectDid', '=', actorDid)\n .innerJoin('actor as creator', 'creator.did', 'follow.creator')\n .selectAll('creator')\n .select([\n 'follow.uri as uri',\n 'follow.cid as cid',\n 'follow.creator as creatorDid',\n 'follow.subjectDid as subjectDid',\n 'follow.sortAt as sortAt',\n ])\n\n const keyset = new TimeCidKeyset(ref('follow.sortAt'), ref('follow.cid'))\n followersReq = paginate(followersReq, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n\n const page = keyset.page(await followersReq.execute(), limit)\n return {\n followers: page.items.map((f) => ({\n uri: f.uri,\n actorDid: f.creatorDid,\n subjectDid: f.subjectDid,\n })),\n cursor: page.cursor,\n }\n },\n async getFollows(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n\n let followsReq = db.db\n .selectFrom('follow')\n .where('follow.creator', '=', actorDid)\n .innerJoin('actor as subject', 'subject.did', 'follow.subjectDid')\n .selectAll('subject')\n .select([\n 'follow.uri as uri',\n 'follow.cid as cid',\n 'follow.creator as creatorDid',\n 'follow.subjectDid as subjectDid',\n 'follow.sortAt as sortAt',\n ])\n\n const keyset = new TimeCidKeyset(ref('follow.sortAt'), ref('follow.cid'))\n followsReq = paginate(followsReq, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n\n const page = keyset.page(await followsReq.execute(), limit)\n\n return {\n follows: page.items.map((f) => ({\n uri: f.uri,\n actorDid: f.creatorDid,\n subjectDid: f.subjectDid,\n })),\n cursor: page.cursor,\n }\n },\n\n /**\n * Return known followers of a given actor.\n *\n * Example:\n * - Alice follows Bob\n * - Bob follows Dan\n *\n * If Alice (the viewer) looks at Dan's profile (the subject), she should see that Bob follows Dan\n */\n async getFollowsFollowing(req) {\n const { actorDid: viewerDid, targetDids: subjectDids, limit, cursor } = req\n const results = await Promise.all(\n subjectDids.map(async (subjectDid) => {\n const { dids, cursor: nextCursor } = await getKnownFollowers(\n db,\n viewerDid,\n subjectDid,\n limit,\n cursor,\n )\n return new FollowsFollowing({\n targetDid: subjectDid,\n dids,\n cursor: nextCursor,\n })\n }),\n )\n return { results }\n },\n async sampleFollowsFollowing(req) {\n const { actorDid: viewerDid, targetDids: subjectDids, limit } = req\n const results = await Promise.all(\n subjectDids.map(async (subjectDid) => {\n const { dids, total } = await getKnownFollowers(\n db,\n viewerDid,\n subjectDid,\n limit,\n )\n return new SampledFollowsFollowing({\n targetDid: subjectDid,\n dids,\n totalKnown: total,\n })\n }),\n )\n return { results }\n },\n})\n\nconst getKnownFollowers = async (\n db: Database,\n viewerDid: string,\n subjectDid: string,\n limit?: number,\n cursor?: string,\n) => {\n const followsReq = db.db\n .selectFrom('follow')\n .where('follow.creator', '=', viewerDid)\n .where(\n 'follow.subjectDid',\n 'in',\n db.db\n .selectFrom('follow')\n .where('follow.subjectDid', '=', subjectDid)\n .select(['creator']),\n )\n .select(['subjectDid', 'sortAt', 'cid'])\n\n const totalReq = followsReq\n .clearSelect()\n .select(countAll.as('count'))\n .executeTakeFirst()\n let pageReq = followsReq\n let pageLimit: number | undefined\n if (limit && limit > 0) {\n pageLimit = limit\n const { ref } = db.db.dynamic\n const keyset = new TimeCidKeyset(ref('follow.sortAt'), ref('follow.cid'))\n pageReq = paginate(pageReq, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n }\n\n const [rows, totalRow] = await Promise.all([pageReq.execute(), totalReq])\n const keyset = new TimeCidKeyset<{ sortAt: string; cid: string }>(\n db.db.dynamic.ref('follow.sortAt'),\n db.db.dynamic.ref('follow.cid'),\n )\n const page =\n pageLimit === undefined ? { items: rows } : keyset.page(rows, pageLimit)\n return {\n dids: page.items.map((row) => row.subjectDid),\n total: totalRow?.count ?? 0,\n cursor: page.cursor,\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifs.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/notifs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAItD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,EAIL,uBAAuB,EACxB,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAI9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"notifs.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/notifs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAItD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,EAIL,uBAAuB,EACxB,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAI9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC;AAgJnE,eAAO,MAAM,oCAAoC,MAC5C,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,QACnC,MAAM,KACX,uBAoCF,CAAA"}
|
|
@@ -8,14 +8,8 @@ import { IsoSortAtKey } from '../db/pagination.js';
|
|
|
8
8
|
import { countAll, notSoftDeletedClause } from '../db/util.js';
|
|
9
9
|
export default (db) => ({
|
|
10
10
|
async getNotifications(req) {
|
|
11
|
-
const { actorDid, limit, cursor
|
|
11
|
+
const { actorDid, limit, cursor } = req;
|
|
12
12
|
const { ref } = db.db.dynamic;
|
|
13
|
-
const priorityFollowQb = db.db
|
|
14
|
-
.selectFrom('follow')
|
|
15
|
-
.select(sql `${true}`.as('val'))
|
|
16
|
-
.where('creator', '=', actorDid)
|
|
17
|
-
.whereRef('subjectDid', '=', ref('notif.author'))
|
|
18
|
-
.limit(1);
|
|
19
13
|
let builder = db.db
|
|
20
14
|
.selectFrom('notification as notif')
|
|
21
15
|
.where('notif.did', '=', actorDid)
|
|
@@ -26,7 +20,6 @@ export default (db) => ({
|
|
|
26
20
|
.selectAll()
|
|
27
21
|
.whereRef('subject.uri', '=', ref('notif.reasonSubject'))),
|
|
28
22
|
]))
|
|
29
|
-
.$if(priority, (qb) => qb.where(({ exists }) => exists(priorityFollowQb)))
|
|
30
23
|
.select([
|
|
31
24
|
'notif.author as authorDid',
|
|
32
25
|
'notif.recordUri as uri',
|
|
@@ -34,8 +27,7 @@ export default (db) => ({
|
|
|
34
27
|
'notif.reason as reason',
|
|
35
28
|
'notif.reasonSubject as reasonSubject',
|
|
36
29
|
'notif.sortAt as sortAt',
|
|
37
|
-
])
|
|
38
|
-
.select(priorityFollowQb.as('priority'));
|
|
30
|
+
]);
|
|
39
31
|
const key = new IsoSortAtKey(ref('notif.sortAt'));
|
|
40
32
|
builder = key.paginate(builder, {
|
|
41
33
|
cursor,
|
|
@@ -48,7 +40,6 @@ export default (db) => ({
|
|
|
48
40
|
reason: notif.reason,
|
|
49
41
|
reasonSubject: notif.reasonSubject ?? undefined,
|
|
50
42
|
timestamp: Timestamp.fromDate(new Date(notif.sortAt)),
|
|
51
|
-
priority: notif.priority ?? false,
|
|
52
43
|
}));
|
|
53
44
|
return {
|
|
54
45
|
notifications,
|
|
@@ -106,7 +97,6 @@ export default (db) => ({
|
|
|
106
97
|
.values({
|
|
107
98
|
did: actorDid,
|
|
108
99
|
lastSeenNotifs: timestampIso,
|
|
109
|
-
priorityNotifs: false,
|
|
110
100
|
})
|
|
111
101
|
.onConflict((oc) => oc.column('did').doUpdateSet({
|
|
112
102
|
lastSeenNotifs: sql `greatest(${ref('actor_state.lastSeenNotifs')}, ${timestampIso})`,
|