@atproto/bsky 0.0.273 → 0.0.275
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 +39 -0
- package/dist/api/app/bsky/actor/getSuggestions.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/getSuggestions.js +7 -2
- package/dist/api/app/bsky/actor/getSuggestions.js.map +1 -1
- package/dist/api/app/bsky/actor/searchActors.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/searchActors.js +13 -6
- package/dist/api/app/bsky/actor/searchActors.js.map +1 -1
- package/dist/api/app/bsky/bookmark/getBookmarks.d.ts.map +1 -1
- package/dist/api/app/bsky/bookmark/getBookmarks.js +7 -2
- package/dist/api/app/bsky/bookmark/getBookmarks.js.map +1 -1
- package/dist/api/app/bsky/contact/getMatches.d.ts.map +1 -1
- package/dist/api/app/bsky/contact/getMatches.js +8 -2
- package/dist/api/app/bsky/contact/getMatches.js.map +1 -1
- package/dist/api/app/bsky/feed/getActorFeeds.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getActorFeeds.js +7 -2
- package/dist/api/app/bsky/feed/getActorFeeds.js.map +1 -1
- package/dist/api/app/bsky/feed/getActorLikes.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getActorLikes.js +7 -2
- package/dist/api/app/bsky/feed/getActorLikes.js.map +1 -1
- package/dist/api/app/bsky/feed/getAuthorFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getAuthorFeed.js +7 -2
- package/dist/api/app/bsky/feed/getAuthorFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getFeed.d.ts +13 -0
- package/dist/api/app/bsky/feed/getFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getFeed.js +41 -8
- package/dist/api/app/bsky/feed/getFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getLikes.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getLikes.js +7 -2
- package/dist/api/app/bsky/feed/getLikes.js.map +1 -1
- package/dist/api/app/bsky/feed/getListFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getListFeed.js +7 -2
- package/dist/api/app/bsky/feed/getListFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getQuotes.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getQuotes.js +7 -2
- package/dist/api/app/bsky/feed/getQuotes.js.map +1 -1
- package/dist/api/app/bsky/feed/getRepostedBy.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getRepostedBy.js +7 -2
- package/dist/api/app/bsky/feed/getRepostedBy.js.map +1 -1
- package/dist/api/app/bsky/feed/getSuggestedFeeds.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getSuggestedFeeds.js +20 -13
- package/dist/api/app/bsky/feed/getSuggestedFeeds.js.map +1 -1
- package/dist/api/app/bsky/feed/getTimeline.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getTimeline.js +7 -2
- package/dist/api/app/bsky/feed/getTimeline.js.map +1 -1
- package/dist/api/app/bsky/feed/searchPosts.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/searchPosts.js +14 -7
- package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
- package/dist/api/app/bsky/feed/searchPostsV2.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/searchPostsV2.js +17 -9
- package/dist/api/app/bsky/feed/searchPostsV2.js.map +1 -1
- package/dist/api/app/bsky/graph/getActorStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getActorStarterPacks.js +7 -2
- package/dist/api/app/bsky/graph/getActorStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/graph/getBlocks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getBlocks.js +7 -2
- package/dist/api/app/bsky/graph/getBlocks.js.map +1 -1
- package/dist/api/app/bsky/graph/getFollowers.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getFollowers.js +10 -18
- package/dist/api/app/bsky/graph/getFollowers.js.map +1 -1
- package/dist/api/app/bsky/graph/getFollows.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getFollows.js +7 -2
- package/dist/api/app/bsky/graph/getFollows.js.map +1 -1
- package/dist/api/app/bsky/graph/getList.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getList.js +7 -2
- package/dist/api/app/bsky/graph/getList.js.map +1 -1
- package/dist/api/app/bsky/graph/getListBlocks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getListBlocks.js +7 -2
- package/dist/api/app/bsky/graph/getListBlocks.js.map +1 -1
- package/dist/api/app/bsky/graph/getListMutes.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getListMutes.js +7 -2
- package/dist/api/app/bsky/graph/getListMutes.js.map +1 -1
- package/dist/api/app/bsky/graph/getLists.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getLists.js +9 -4
- package/dist/api/app/bsky/graph/getLists.js.map +1 -1
- package/dist/api/app/bsky/graph/getListsWithMembership.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getListsWithMembership.js +9 -4
- package/dist/api/app/bsky/graph/getListsWithMembership.js.map +1 -1
- package/dist/api/app/bsky/graph/getMutes.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getMutes.js +22 -30
- package/dist/api/app/bsky/graph/getMutes.js.map +1 -1
- package/dist/api/app/bsky/graph/getStarterPacksWithMembership.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getStarterPacksWithMembership.js +7 -2
- package/dist/api/app/bsky/graph/getStarterPacksWithMembership.js.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacks.js +13 -6
- package/dist/api/app/bsky/graph/searchStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacksV2.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacksV2.js +7 -2
- package/dist/api/app/bsky/graph/searchStarterPacksV2.js.map +1 -1
- package/dist/api/app/bsky/notification/listActivitySubscriptions.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/listActivitySubscriptions.js +7 -2
- 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 +17 -35
- package/dist/api/app/bsky/notification/listNotifications.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.js +49 -43
- package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.js +3 -14
- package/dist/api/app/bsky/unspecced/getTrendingTopics.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.js +3 -14
- package/dist/api/app/bsky/unspecced/getTrends.js.map +1 -1
- package/dist/api/util.d.ts +15 -0
- package/dist/api/util.d.ts.map +1 -1
- package/dist/api/util.js +26 -0
- package/dist/api/util.js.map +1 -1
- package/dist/auth-verifier.d.ts.map +1 -1
- package/dist/auth-verifier.js +16 -9
- package/dist/auth-verifier.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -1
- package/dist/data-plane/server/db/pagination.d.ts +8 -0
- package/dist/data-plane/server/db/pagination.d.ts.map +1 -1
- package/dist/data-plane/server/db/pagination.js +20 -2
- package/dist/data-plane/server/db/pagination.js.map +1 -1
- package/dist/data-plane/server/op-thread.d.ts +7 -0
- package/dist/data-plane/server/op-thread.d.ts.map +1 -0
- package/dist/data-plane/server/op-thread.js +71 -0
- package/dist/data-plane/server/op-thread.js.map +1 -0
- package/dist/data-plane/server/routes/activity-subscription.js +3 -3
- package/dist/data-plane/server/routes/activity-subscription.js.map +1 -1
- package/dist/data-plane/server/routes/blocks.js +6 -6
- package/dist/data-plane/server/routes/blocks.js.map +1 -1
- package/dist/data-plane/server/routes/bookmarks.js +3 -3
- package/dist/data-plane/server/routes/bookmarks.js.map +1 -1
- package/dist/data-plane/server/routes/drafts.js +3 -3
- package/dist/data-plane/server/routes/drafts.js.map +1 -1
- package/dist/data-plane/server/routes/feed-gens.js +14 -12
- package/dist/data-plane/server/routes/feed-gens.js.map +1 -1
- package/dist/data-plane/server/routes/feeds.d.ts.map +1 -1
- package/dist/data-plane/server/routes/feeds.js +36 -15
- package/dist/data-plane/server/routes/feeds.js.map +1 -1
- package/dist/data-plane/server/routes/follows.js +6 -6
- package/dist/data-plane/server/routes/follows.js.map +1 -1
- package/dist/data-plane/server/routes/likes.js +6 -6
- package/dist/data-plane/server/routes/likes.js.map +1 -1
- package/dist/data-plane/server/routes/lists.js +6 -6
- package/dist/data-plane/server/routes/lists.js.map +1 -1
- package/dist/data-plane/server/routes/mutes.js +7 -7
- package/dist/data-plane/server/routes/mutes.js.map +1 -1
- package/dist/data-plane/server/routes/notifs.js +3 -3
- package/dist/data-plane/server/routes/notifs.js.map +1 -1
- package/dist/data-plane/server/routes/quotes.js +3 -3
- package/dist/data-plane/server/routes/quotes.js.map +1 -1
- package/dist/data-plane/server/routes/records.d.ts +3 -1
- package/dist/data-plane/server/routes/records.d.ts.map +1 -1
- package/dist/data-plane/server/routes/records.js +41 -4
- package/dist/data-plane/server/routes/records.js.map +1 -1
- package/dist/data-plane/server/routes/reposts.js +6 -6
- package/dist/data-plane/server/routes/reposts.js.map +1 -1
- package/dist/data-plane/server/routes/search.js +9 -9
- package/dist/data-plane/server/routes/search.js.map +1 -1
- package/dist/data-plane/server/routes/starter-packs.js +3 -3
- package/dist/data-plane/server/routes/starter-packs.js.map +1 -1
- package/dist/data-plane/server/routes/threads.d.ts.map +1 -1
- package/dist/data-plane/server/routes/threads.js +3 -74
- package/dist/data-plane/server/routes/threads.js.map +1 -1
- package/dist/feature-gates/gates.d.ts +2 -1
- package/dist/feature-gates/gates.d.ts.map +1 -1
- package/dist/feature-gates/gates.js +2 -1
- package/dist/feature-gates/gates.js.map +1 -1
- package/dist/hydration/feed.d.ts +3 -0
- package/dist/hydration/feed.d.ts.map +1 -1
- package/dist/hydration/feed.js +12 -0
- package/dist/hydration/feed.js.map +1 -1
- package/dist/hydration/hydrator.d.ts.map +1 -1
- package/dist/hydration/hydrator.js +4 -2
- package/dist/hydration/hydrator.js.map +1 -1
- package/dist/image/server.d.ts +1 -1
- package/dist/image/server.d.ts.map +1 -1
- package/dist/image/server.js +40 -22
- package/dist/image/server.js.map +1 -1
- package/dist/lexicons/app/bsky/actor/contentVisibilityDeclaration.d.ts +3 -0
- package/dist/lexicons/app/bsky/actor/contentVisibilityDeclaration.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/actor/contentVisibilityDeclaration.defs.d.ts +66 -0
- package/dist/lexicons/app/bsky/actor/contentVisibilityDeclaration.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/actor/contentVisibilityDeclaration.defs.js +26 -0
- package/dist/lexicons/app/bsky/actor/contentVisibilityDeclaration.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/actor/contentVisibilityDeclaration.js +6 -0
- package/dist/lexicons/app/bsky/actor/contentVisibilityDeclaration.js.map +1 -0
- package/dist/lexicons/app/bsky/actor.d.ts +1 -0
- package/dist/lexicons/app/bsky/actor.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor.js +1 -0
- package/dist/lexicons/app/bsky/actor.js.map +1 -1
- package/dist/lexicons/app/bsky/authCreatePosts.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/authCreatePosts.defs.js +5 -0
- package/dist/lexicons/app/bsky/authCreatePosts.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.js +5 -0
- package/dist/lexicons/app/bsky/authFullApp.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/embed/video.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/embed/video.defs.js +2 -4
- package/dist/lexicons/app/bsky/embed/video.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/video/abortUpload.d.ts +3 -0
- package/dist/lexicons/app/bsky/video/abortUpload.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/video/abortUpload.defs.d.ts +53 -0
- package/dist/lexicons/app/bsky/video/abortUpload.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/video/abortUpload.defs.js +26 -0
- package/dist/lexicons/app/bsky/video/abortUpload.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/video/abortUpload.js +6 -0
- package/dist/lexicons/app/bsky/video/abortUpload.js.map +1 -0
- package/dist/lexicons/app/bsky/video/defs.defs.d.ts +1 -1
- package/dist/lexicons/app/bsky/video/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/video/defs.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/video/finishUpload.d.ts +3 -0
- package/dist/lexicons/app/bsky/video/finishUpload.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/video/finishUpload.defs.d.ts +42 -0
- package/dist/lexicons/app/bsky/video/finishUpload.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/video/finishUpload.defs.js +30 -0
- package/dist/lexicons/app/bsky/video/finishUpload.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/video/finishUpload.js +6 -0
- package/dist/lexicons/app/bsky/video/finishUpload.js.map +1 -0
- package/dist/lexicons/app/bsky/video/getUploadStatus.d.ts +3 -0
- package/dist/lexicons/app/bsky/video/getUploadStatus.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/video/getUploadStatus.defs.d.ts +73 -0
- package/dist/lexicons/app/bsky/video/getUploadStatus.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/video/getUploadStatus.defs.js +30 -0
- package/dist/lexicons/app/bsky/video/getUploadStatus.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/video/getUploadStatus.js +6 -0
- package/dist/lexicons/app/bsky/video/getUploadStatus.js.map +1 -0
- package/dist/lexicons/app/bsky/video/startUpload.d.ts +3 -0
- package/dist/lexicons/app/bsky/video/startUpload.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/video/startUpload.defs.d.ts +63 -0
- package/dist/lexicons/app/bsky/video/startUpload.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/video/startUpload.defs.js +36 -0
- package/dist/lexicons/app/bsky/video/startUpload.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/video/startUpload.js +6 -0
- package/dist/lexicons/app/bsky/video/startUpload.js.map +1 -0
- package/dist/lexicons/app/bsky/video/uploadPart.d.ts +3 -0
- package/dist/lexicons/app/bsky/video/uploadPart.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/video/uploadPart.defs.d.ts +37 -0
- package/dist/lexicons/app/bsky/video/uploadPart.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/video/uploadPart.defs.js +31 -0
- package/dist/lexicons/app/bsky/video/uploadPart.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/video/uploadPart.js +6 -0
- package/dist/lexicons/app/bsky/video/uploadPart.js.map +1 -0
- package/dist/lexicons/app/bsky/video.d.ts +5 -0
- package/dist/lexicons/app/bsky/video.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/video.js +5 -0
- package/dist/lexicons/app/bsky/video.js.map +1 -1
- package/dist/proto/bsky_pb.d.ts +39 -0
- package/dist/proto/bsky_pb.d.ts.map +1 -1
- package/dist/proto/bsky_pb.js +55 -0
- package/dist/proto/bsky_pb.js.map +1 -1
- package/dist/views/index.d.ts.map +1 -1
- package/dist/views/index.js +2 -0
- package/dist/views/index.js.map +1 -1
- package/dist/views/types.d.ts +4 -1
- package/dist/views/types.d.ts.map +1 -1
- package/dist/views/types.js.map +1 -1
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bookmarks.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/bookmarks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,OAAO,EAEL,sCAAsC,GACvC,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,eAAe,CAAC,EAAY,EAAwC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,iBAAiB,CAAC,GAAG;QACzB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAA;QACvC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAE7B,IAAI,OAAO,GAAG,EAAE,CAAC,EAAE;aAChB,UAAU,CAAC,UAAU,CAAC;aACtB,KAAK,CAAC,kBAAkB,EAAE,GAAG,EAAE,QAAQ,CAAC;aACxC,SAAS,EAAE,CAAA;QAEd,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAA;QAChD,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE;YAC9B,MAAM;YACN,KAAK;SACN,CAAC,CAAA;QAEF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"bookmarks.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/bookmarks.ts"],"names":[],"mappings":"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","sourcesContent":["import { type PlainMessage, Timestamp } from '@bufbuild/protobuf'\nimport type { ServiceImpl } from '@connectrpc/connect'\nimport { keyBy } from '@atproto/common'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport {\n type Bookmark,\n GetBookmarksByActorAndSubjectsResponse,\n} from '../../../proto/bsky_pb.js'\nimport { Namespaces } from '../../../stash.js'\nimport type { Database } from '../db/index.js'\nimport { StashKeyKey } from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorBookmarks(req) {\n const { actorDid, cursor, limit } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('bookmark')\n .where('bookmark.creator', '=', actorDid)\n .selectAll()\n\n const key = new StashKeyKey(ref('bookmark.key'))\n builder = key.paginate(builder, {\n cursor,\n limit,\n })\n\n const page = key.page(await builder.execute(), limit)\n return {\n bookmarks: page.items.map((b) => ({\n key: b.key,\n subject: b.subjectUri,\n })),\n cursor: page.cursor,\n }\n },\n\n async getBookmarksByActorAndSubjects(req) {\n const { actorDid, uris } = req\n\n if (uris.length === 0) {\n return new GetBookmarksByActorAndSubjectsResponse({\n bookmarks: [],\n })\n }\n\n const res = await db.db\n .selectFrom('bookmark')\n .where('bookmark.creator', '=', actorDid)\n .where('bookmark.subjectUri', 'in', uris)\n .selectAll()\n .execute()\n\n const byUri = keyBy(res, 'subjectUri')\n const bookmarks = uris.map((did): PlainMessage<Bookmark> => {\n const bookmark = byUri.get(did)\n if (!bookmark) {\n return {\n ref: undefined,\n subjectUri: '',\n subjectCid: '',\n indexedAt: undefined,\n }\n }\n\n return {\n ref: {\n actorDid,\n namespace: Namespaces.AppBskyBookmarkDefsBookmark.$type,\n key: bookmark.key,\n },\n subjectUri: bookmark.subjectUri,\n subjectCid: bookmark.subjectCid,\n indexedAt: Timestamp.fromDate(new Date(bookmark.indexedAt)),\n }\n })\n\n return {\n bookmarks,\n }\n },\n})\n"]}
|
|
@@ -13,15 +13,15 @@ export default (db) => ({
|
|
|
13
13
|
cursor,
|
|
14
14
|
limit,
|
|
15
15
|
});
|
|
16
|
-
const
|
|
16
|
+
const page = key.page(await builder.execute(), limit);
|
|
17
17
|
return {
|
|
18
|
-
drafts:
|
|
18
|
+
drafts: page.items.map((d) => ({
|
|
19
19
|
key: d.key,
|
|
20
20
|
payload: Buffer.from(d.payload),
|
|
21
21
|
createdAt: Timestamp.fromDate(new Date(d.createdAt)),
|
|
22
22
|
updatedAt: Timestamp.fromDate(new Date(d.updatedAt)),
|
|
23
23
|
})),
|
|
24
|
-
cursor:
|
|
24
|
+
cursor: page.cursor,
|
|
25
25
|
};
|
|
26
26
|
},
|
|
27
27
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/drafts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAKjE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,eAAe,CAAC,EAAY,EAAwC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,cAAc,CAAC,GAAG;QACtB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAA;QACvC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAE7B,IAAI,OAAO,GAAG,EAAE,CAAC,EAAE;aAChB,UAAU,CAAC,OAAO,CAAC;aACnB,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,QAAQ,CAAC;aACrC,SAAS,EAAE,CAAA;QAEd,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAA;QACvD,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE;YAC9B,MAAM;YACN,KAAK;SACN,CAAC,CAAA;QAEF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/drafts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAKjE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,eAAe,CAAC,EAAY,EAAwC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,cAAc,CAAC,GAAG;QACtB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAA;QACvC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAE7B,IAAI,OAAO,GAAG,EAAE,CAAC,EAAE;aAChB,UAAU,CAAC,OAAO,CAAC;aACnB,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,QAAQ,CAAC;aACrC,SAAS,EAAE,CAAA;QAEd,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAA;QACvD,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE;YAC9B,MAAM;YACN,KAAK;SACN,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAA;QACrD,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAA2B,EAAE,CAAC,CAAC;gBACtD,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC/B,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACpD,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aACrD,CAAC,CAAC;YACH,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAA;IACH,CAAC;CACF,CAAC,CAAA","sourcesContent":["import { type PlainMessage, Timestamp } from '@bufbuild/protobuf'\nimport type { ServiceImpl } from '@connectrpc/connect'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport type { DraftInfo } from '../../../proto/bsky_pb.js'\nimport type { Database } from '../db/index.js'\nimport { IsoUpdatedAtKey } from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorDrafts(req) {\n const { actorDid, cursor, limit } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('draft')\n .where('draft.creator', '=', actorDid)\n .selectAll()\n\n const key = new IsoUpdatedAtKey(ref('draft.updatedAt'))\n builder = key.paginate(builder, {\n cursor,\n limit,\n })\n\n const page = key.page(await builder.execute(), limit)\n return {\n drafts: page.items.map((d): PlainMessage<DraftInfo> => ({\n key: d.key,\n payload: Buffer.from(d.payload),\n createdAt: Timestamp.fromDate(new Date(d.createdAt)),\n updatedAt: Timestamp.fromDate(new Date(d.updatedAt)),\n })),\n cursor: page.cursor,\n }\n },\n})\n"]}
|
|
@@ -13,10 +13,10 @@ export default (db) => ({
|
|
|
13
13
|
cursor,
|
|
14
14
|
keyset,
|
|
15
15
|
});
|
|
16
|
-
const
|
|
16
|
+
const page = keyset.page(await builder.execute(), limit);
|
|
17
17
|
return {
|
|
18
|
-
uris:
|
|
19
|
-
cursor:
|
|
18
|
+
uris: page.items.map((f) => f.uri),
|
|
19
|
+
cursor: page.cursor,
|
|
20
20
|
};
|
|
21
21
|
},
|
|
22
22
|
async getSuggestedFeeds(req) {
|
|
@@ -24,19 +24,21 @@ export default (db) => ({
|
|
|
24
24
|
.selectFrom('suggested_feed')
|
|
25
25
|
.orderBy('suggested_feed.order', 'asc')
|
|
26
26
|
.$if(!!req.cursor, (q) => q.where('order', '>', parseInt(req.cursor, 10)))
|
|
27
|
-
.limit(req.limit || 50)
|
|
27
|
+
.limit((req.limit || 50) + 1)
|
|
28
28
|
.selectAll()
|
|
29
29
|
.execute();
|
|
30
|
+
const limit = req.limit || 50;
|
|
31
|
+
const items = feeds.slice(0, limit);
|
|
30
32
|
return {
|
|
31
|
-
uris:
|
|
32
|
-
cursor: feeds.at(-1)?.order.toString(),
|
|
33
|
+
uris: items.map((f) => f.uri),
|
|
34
|
+
cursor: feeds.length > limit ? items.at(-1)?.order.toString() : undefined,
|
|
33
35
|
};
|
|
34
36
|
},
|
|
35
37
|
async searchFeedGenerators(req) {
|
|
36
38
|
return searchFeedGeneratorsImpl(db, req.query, req.limit);
|
|
37
39
|
},
|
|
38
40
|
async searchFeedGeneratorsV2(req) {
|
|
39
|
-
const { uris, cursor } = await searchFeedGeneratorsImpl(db, req.params?.query ?? '', req.params?.limit ?? 25);
|
|
41
|
+
const { uris, cursor } = await searchFeedGeneratorsImpl(db, req.params?.query ?? '', req.params?.limit ?? 25, req.params?.cursor);
|
|
40
42
|
return {
|
|
41
43
|
feedGenerators: uris.map((uri) => ({ uri, score: 0 })),
|
|
42
44
|
pageInfo: { cursor: cursor ?? '', hitsTotal: 0n },
|
|
@@ -46,7 +48,7 @@ export default (db) => ({
|
|
|
46
48
|
throw new Error('unimplemented');
|
|
47
49
|
},
|
|
48
50
|
});
|
|
49
|
-
const searchFeedGeneratorsImpl = async (db, query, limit) => {
|
|
51
|
+
const searchFeedGeneratorsImpl = async (db, query, limit, cursor) => {
|
|
50
52
|
const { ref } = db.db.dynamic;
|
|
51
53
|
const trimmed = query.trim();
|
|
52
54
|
let builder = db.db
|
|
@@ -54,11 +56,11 @@ const searchFeedGeneratorsImpl = async (db, query, limit) => {
|
|
|
54
56
|
.$if(!!trimmed, (q) => q.where('displayName', 'ilike', `%${trimmed}%`))
|
|
55
57
|
.selectAll();
|
|
56
58
|
const keyset = new TimeCidKeyset(ref('feed_generator.createdAt'), ref('feed_generator.cid'));
|
|
57
|
-
builder = paginate(builder, { limit, keyset });
|
|
58
|
-
const
|
|
59
|
+
builder = paginate(builder, { limit, cursor, keyset });
|
|
60
|
+
const page = keyset.page(await builder.execute(), limit);
|
|
59
61
|
return {
|
|
60
|
-
uris:
|
|
61
|
-
cursor:
|
|
62
|
+
uris: page.items.map((f) => f.uri),
|
|
63
|
+
cursor: page.cursor,
|
|
62
64
|
};
|
|
63
65
|
};
|
|
64
66
|
//# sourceMappingURL=feed-gens.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feed-gens.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/feed-gens.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE7D,eAAe,CAAC,EAAY,EAAwC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,aAAa,CAAC,GAAG;QACrB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;QAEvC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAC7B,IAAI,OAAO,GAAG,EAAE,CAAC,EAAE;aAChB,UAAU,CAAC,gBAAgB,CAAC;aAC5B,SAAS,EAAE;aACX,KAAK,CAAC,wBAAwB,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;QAEjD,MAAM,MAAM,GAAG,IAAI,aAAa,CAC9B,GAAG,CAAC,0BAA0B,CAAC,EAC/B,GAAG,CAAC,oBAAoB,CAAC,CAC1B,CAAA;QACD,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE;YAC1B,KAAK;YACL,MAAM;YACN,MAAM;SACP,CAAC,CAAA;QACF,MAAM,
|
|
1
|
+
{"version":3,"file":"feed-gens.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/feed-gens.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServiceImpl } from '@connectrpc/connect'\nimport type { Service } from '../../../proto/bsky_connect.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 getActorFeeds(req) {\n const { actorDid, limit, cursor } = req\n\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('feed_generator')\n .selectAll()\n .where('feed_generator.creator', '=', actorDid)\n\n const keyset = new TimeCidKeyset(\n ref('feed_generator.createdAt'),\n ref('feed_generator.cid'),\n )\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n const page = keyset.page(await builder.execute(), limit)\n\n return {\n uris: page.items.map((f) => f.uri),\n cursor: page.cursor,\n }\n },\n\n async getSuggestedFeeds(req) {\n const feeds = await db.db\n .selectFrom('suggested_feed')\n .orderBy('suggested_feed.order', 'asc')\n .$if(!!req.cursor, (q) => q.where('order', '>', parseInt(req.cursor, 10)))\n .limit((req.limit || 50) + 1)\n .selectAll()\n .execute()\n const limit = req.limit || 50\n const items = feeds.slice(0, limit)\n return {\n uris: items.map((f) => f.uri),\n cursor: feeds.length > limit ? items.at(-1)?.order.toString() : undefined,\n }\n },\n\n async searchFeedGenerators(req) {\n return searchFeedGeneratorsImpl(db, req.query, req.limit)\n },\n\n async searchFeedGeneratorsV2(req) {\n const { uris, cursor } = await searchFeedGeneratorsImpl(\n db,\n req.params?.query ?? '',\n req.params?.limit ?? 25,\n req.params?.cursor,\n )\n return {\n feedGenerators: uris.map((uri) => ({ uri, score: 0 })),\n pageInfo: { cursor: cursor ?? '', hitsTotal: 0n },\n }\n },\n\n async getFeedGeneratorStatus() {\n throw new Error('unimplemented')\n },\n})\n\nconst searchFeedGeneratorsImpl = async (\n db: Database,\n query: string,\n limit: number,\n cursor?: string,\n) => {\n const { ref } = db.db.dynamic\n const trimmed = query.trim()\n let builder = db.db\n .selectFrom('feed_generator')\n .$if(!!trimmed, (q) => q.where('displayName', 'ilike', `%${trimmed}%`))\n .selectAll()\n const keyset = new TimeCidKeyset(\n ref('feed_generator.createdAt'),\n ref('feed_generator.cid'),\n )\n builder = paginate(builder, { limit, cursor, keyset })\n const page = keyset.page(await builder.execute(), limit)\n return {\n uris: page.items.map((f) => f.uri),\n cursor: page.cursor,\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feeds.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/feeds.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feeds.d.ts","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/feeds.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;;0BAG9B,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
1
2
|
import { FeedType } from '../../../proto/bsky_pb.js';
|
|
2
3
|
import { TimeCidKeyset, paginate } from '../db/pagination.js';
|
|
3
4
|
export default (db) => ({
|
|
@@ -52,10 +53,10 @@ export default (db) => ({
|
|
|
52
53
|
cursor,
|
|
53
54
|
keyset,
|
|
54
55
|
});
|
|
55
|
-
const
|
|
56
|
+
const page = keyset.page(await builder.execute(), limit);
|
|
56
57
|
return {
|
|
57
|
-
items:
|
|
58
|
-
cursor:
|
|
58
|
+
items: page.items.map(feedItemFromRow),
|
|
59
|
+
cursor: page.cursor,
|
|
59
60
|
};
|
|
60
61
|
},
|
|
61
62
|
async getTimeline(req) {
|
|
@@ -78,7 +79,7 @@ export default (db) => ({
|
|
|
78
79
|
.where('feed_item.originatorDid', '=', actorDid)
|
|
79
80
|
.selectAll('feed_item');
|
|
80
81
|
selfQb = paginate(selfQb, {
|
|
81
|
-
limit
|
|
82
|
+
limit,
|
|
82
83
|
cursor,
|
|
83
84
|
keyset,
|
|
84
85
|
tryIndex: true,
|
|
@@ -87,19 +88,39 @@ export default (db) => ({
|
|
|
87
88
|
followQb.execute(),
|
|
88
89
|
selfQb.execute(),
|
|
89
90
|
]);
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
// Use own posts to fill space left by followed-account posts. When followed-account
|
|
92
|
+
// posts already fill the page, still allow up to 10 own posts into the merged results.
|
|
93
|
+
const selfLimit = Math.max(
|
|
94
|
+
// Allow up to 10 own posts even when followed-account posts can fill the page.
|
|
95
|
+
Math.min(limit, 10),
|
|
96
|
+
// Allow enough own posts to fill the slots not occupied by followed-account posts.
|
|
97
|
+
limit - Math.min(followRes.length, limit));
|
|
98
|
+
// The extra own post proves that another page exists, but is not part of this page.
|
|
99
|
+
const selfHasMore = selfRes.length > selfLimit;
|
|
100
|
+
const selfItems = selfRes.slice(0, selfLimit);
|
|
101
|
+
const feedItems = [...followRes, ...selfItems].sort((a, b) => {
|
|
92
102
|
if (a.sortAt > b.sortAt)
|
|
93
103
|
return -1;
|
|
94
104
|
if (a.sortAt < b.sortAt)
|
|
95
105
|
return 1;
|
|
96
106
|
return a.cid > b.cid ? -1 : 1;
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
items:
|
|
101
|
-
|
|
102
|
-
|
|
107
|
+
});
|
|
108
|
+
const page = keyset.page(feedItems, limit);
|
|
109
|
+
if (page.items.length === 0) {
|
|
110
|
+
return { items: [], cursor: undefined };
|
|
111
|
+
}
|
|
112
|
+
const items = page.items.map(feedItemFromRow);
|
|
113
|
+
// The combined results exceeded the requested limit.
|
|
114
|
+
if (page.cursor) {
|
|
115
|
+
return { items, cursor: page.cursor };
|
|
116
|
+
}
|
|
117
|
+
// Own posts exceeded their separate cap, but the combined results did not exceed the requested limit.
|
|
118
|
+
if (selfHasMore) {
|
|
119
|
+
const lastItem = page.items.at(-1);
|
|
120
|
+
assert(lastItem);
|
|
121
|
+
return { items, cursor: keyset.packFromResult(lastItem) };
|
|
122
|
+
}
|
|
123
|
+
return { items, cursor: undefined };
|
|
103
124
|
},
|
|
104
125
|
async getListFeed(req) {
|
|
105
126
|
const { listUri, cursor, limit } = req;
|
|
@@ -116,10 +137,10 @@ export default (db) => ({
|
|
|
116
137
|
keyset,
|
|
117
138
|
tryIndex: true,
|
|
118
139
|
});
|
|
119
|
-
const
|
|
140
|
+
const page = keyset.page(await builder.execute(), limit);
|
|
120
141
|
return {
|
|
121
|
-
items:
|
|
122
|
-
cursor:
|
|
142
|
+
items: page.items.map((item) => ({ uri: item.uri, cid: item.cid })),
|
|
143
|
+
cursor: page.cursor,
|
|
123
144
|
};
|
|
124
145
|
},
|
|
125
146
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feeds.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/feeds.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServiceImpl } from '@connectrpc/connect'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport { FeedType } 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 getAuthorFeed(req) {\n const { actorDid, limit, cursor, feedType } = req\n const { ref } = db.db.dynamic\n\n // defaults to posts, reposts, and replies\n let builder = db.db\n .selectFrom('feed_item')\n .innerJoin('post', 'post.uri', 'feed_item.postUri')\n .selectAll('feed_item')\n .where('originatorDid', '=', actorDid)\n\n if (feedType === FeedType.POSTS_WITH_MEDIA) {\n builder = builder\n // only your own posts\n .where('type', '=', 'post')\n // only posts with media\n .where((eb) =>\n eb.or([\n eb.exists(\n eb\n .selectFrom('post_embed_image')\n .select('post_embed_image.postUri')\n .whereRef('post_embed_image.postUri', '=', 'feed_item.postUri'),\n ),\n eb.exists(\n eb\n .selectFrom('post_embed_gallery_image')\n .select('post_embed_gallery_image.postUri')\n .whereRef(\n 'post_embed_gallery_image.postUri',\n '=',\n 'feed_item.postUri',\n ),\n ),\n ]),\n )\n } else if (feedType === FeedType.POSTS_WITH_VIDEO) {\n builder = builder\n // only your own posts\n .where('type', '=', 'post')\n // only posts with video\n .where(({ eb, exists }) =>\n exists(\n eb\n .selectFrom('post_embed_video')\n .select('post_embed_video.postUri')\n .whereRef('post_embed_video.postUri', '=', 'feed_item.postUri'),\n ),\n )\n } else if (feedType === FeedType.POSTS_NO_REPLIES) {\n builder = builder.where((eb) =>\n eb.or([eb('post.replyParent', 'is', null), eb('type', '=', 'repost')]),\n )\n } else if (feedType === FeedType.POSTS_AND_AUTHOR_THREADS) {\n builder = builder.where((eb) =>\n eb.or([\n eb('type', '=', 'repost'),\n eb('post.replyParent', 'is', null),\n eb('post.replyRoot', 'like', `at://${actorDid}/%`),\n ]),\n )\n }\n\n const keyset = new TimeCidKeyset(\n ref('feed_item.sortAt'),\n ref('feed_item.cid'),\n )\n\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n\n const feedItems = await builder.execute()\n\n return {\n items: feedItems.map(feedItemFromRow),\n cursor: keyset.packFromResult(feedItems),\n }\n },\n\n async getTimeline(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n\n const keyset = new TimeCidKeyset(\n ref('feed_item.sortAt'),\n ref('feed_item.cid'),\n )\n\n let followQb = db.db\n .selectFrom('feed_item')\n .innerJoin('follow', 'follow.subjectDid', 'feed_item.originatorDid')\n .where('follow.creator', '=', actorDid)\n .selectAll('feed_item')\n\n followQb = paginate(followQb, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n\n let selfQb = db.db\n .selectFrom('feed_item')\n .where('feed_item.originatorDid', '=', actorDid)\n .selectAll('feed_item')\n\n selfQb = paginate(selfQb, {\n limit: Math.min(limit, 10),\n cursor,\n keyset,\n tryIndex: true,\n })\n\n const [followRes, selfRes] = await Promise.all([\n followQb.execute(),\n selfQb.execute(),\n ])\n\n const feedItems = [...followRes, ...selfRes]\n .sort((a, b) => {\n if (a.sortAt > b.sortAt) return -1\n if (a.sortAt < b.sortAt) return 1\n return a.cid > b.cid ? -1 : 1\n })\n .slice(0, limit)\n\n return {\n items: feedItems.map(feedItemFromRow),\n cursor: keyset.packFromResult(feedItems),\n }\n },\n\n async getListFeed(req) {\n const { listUri, cursor, limit } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('post')\n .selectAll('post')\n .innerJoin('list_item', 'list_item.subjectDid', 'post.creator')\n .where('list_item.listUri', '=', listUri)\n\n const keyset = new TimeCidKeyset(ref('post.sortAt'), ref('post.cid'))\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n const feedItems = await builder.execute()\n\n return {\n items: feedItems.map((item) => ({ uri: item.uri, cid: item.cid })),\n cursor: keyset.packFromResult(feedItems),\n }\n },\n})\n\n// @NOTE does not support additional fields in the protos specific to author feeds\n// and timelines. at the time of writing, hydration/view implementations do not rely on them.\nconst feedItemFromRow = (row: { postUri: string; uri: string }) => {\n return {\n uri: row.postUri,\n repost: row.uri === row.postUri ? undefined : row.uri,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"feeds.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/feeds.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport type { ServiceImpl } from '@connectrpc/connect'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport { FeedType } 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 getAuthorFeed(req) {\n const { actorDid, limit, cursor, feedType } = req\n const { ref } = db.db.dynamic\n\n // defaults to posts, reposts, and replies\n let builder = db.db\n .selectFrom('feed_item')\n .innerJoin('post', 'post.uri', 'feed_item.postUri')\n .selectAll('feed_item')\n .where('originatorDid', '=', actorDid)\n\n if (feedType === FeedType.POSTS_WITH_MEDIA) {\n builder = builder\n // only your own posts\n .where('type', '=', 'post')\n // only posts with media\n .where((eb) =>\n eb.or([\n eb.exists(\n eb\n .selectFrom('post_embed_image')\n .select('post_embed_image.postUri')\n .whereRef('post_embed_image.postUri', '=', 'feed_item.postUri'),\n ),\n eb.exists(\n eb\n .selectFrom('post_embed_gallery_image')\n .select('post_embed_gallery_image.postUri')\n .whereRef(\n 'post_embed_gallery_image.postUri',\n '=',\n 'feed_item.postUri',\n ),\n ),\n ]),\n )\n } else if (feedType === FeedType.POSTS_WITH_VIDEO) {\n builder = builder\n // only your own posts\n .where('type', '=', 'post')\n // only posts with video\n .where(({ eb, exists }) =>\n exists(\n eb\n .selectFrom('post_embed_video')\n .select('post_embed_video.postUri')\n .whereRef('post_embed_video.postUri', '=', 'feed_item.postUri'),\n ),\n )\n } else if (feedType === FeedType.POSTS_NO_REPLIES) {\n builder = builder.where((eb) =>\n eb.or([eb('post.replyParent', 'is', null), eb('type', '=', 'repost')]),\n )\n } else if (feedType === FeedType.POSTS_AND_AUTHOR_THREADS) {\n builder = builder.where((eb) =>\n eb.or([\n eb('type', '=', 'repost'),\n eb('post.replyParent', 'is', null),\n eb('post.replyRoot', 'like', `at://${actorDid}/%`),\n ]),\n )\n }\n\n const keyset = new TimeCidKeyset(\n ref('feed_item.sortAt'),\n ref('feed_item.cid'),\n )\n\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n\n const page = keyset.page(await builder.execute(), limit)\n\n return {\n items: page.items.map(feedItemFromRow),\n cursor: page.cursor,\n }\n },\n\n async getTimeline(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n\n const keyset = new TimeCidKeyset(\n ref('feed_item.sortAt'),\n ref('feed_item.cid'),\n )\n\n let followQb = db.db\n .selectFrom('feed_item')\n .innerJoin('follow', 'follow.subjectDid', 'feed_item.originatorDid')\n .where('follow.creator', '=', actorDid)\n .selectAll('feed_item')\n\n followQb = paginate(followQb, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n\n let selfQb = db.db\n .selectFrom('feed_item')\n .where('feed_item.originatorDid', '=', actorDid)\n .selectAll('feed_item')\n\n selfQb = paginate(selfQb, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n\n const [followRes, selfRes] = await Promise.all([\n followQb.execute(),\n selfQb.execute(),\n ])\n\n // Use own posts to fill space left by followed-account posts. When followed-account\n // posts already fill the page, still allow up to 10 own posts into the merged results.\n const selfLimit = Math.max(\n // Allow up to 10 own posts even when followed-account posts can fill the page.\n Math.min(limit, 10),\n // Allow enough own posts to fill the slots not occupied by followed-account posts.\n limit - Math.min(followRes.length, limit),\n )\n\n // The extra own post proves that another page exists, but is not part of this page.\n const selfHasMore = selfRes.length > selfLimit\n\n const selfItems = selfRes.slice(0, selfLimit)\n const feedItems = [...followRes, ...selfItems].sort((a, b) => {\n if (a.sortAt > b.sortAt) return -1\n if (a.sortAt < b.sortAt) return 1\n return a.cid > b.cid ? -1 : 1\n })\n\n const page = keyset.page(feedItems, limit)\n if (page.items.length === 0) {\n return { items: [], cursor: undefined }\n }\n const items = page.items.map(feedItemFromRow)\n\n // The combined results exceeded the requested limit.\n if (page.cursor) {\n return { items, cursor: page.cursor }\n }\n\n // Own posts exceeded their separate cap, but the combined results did not exceed the requested limit.\n if (selfHasMore) {\n const lastItem = page.items.at(-1)\n assert(lastItem)\n return { items, cursor: keyset.packFromResult(lastItem) }\n }\n\n return { items, cursor: undefined }\n },\n\n async getListFeed(req) {\n const { listUri, cursor, limit } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('post')\n .selectAll('post')\n .innerJoin('list_item', 'list_item.subjectDid', 'post.creator')\n .where('list_item.listUri', '=', listUri)\n\n const keyset = new TimeCidKeyset(ref('post.sortAt'), ref('post.cid'))\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n const page = keyset.page(await builder.execute(), limit)\n\n return {\n items: page.items.map((item) => ({ uri: item.uri, cid: item.cid })),\n cursor: page.cursor,\n }\n },\n})\n\n// @NOTE does not support additional fields in the protos specific to author feeds\n// and timelines. at the time of writing, hydration/view implementations do not rely on them.\nconst feedItemFromRow = (row: { postUri: string; uri: string }) => {\n return {\n uri: row.postUri,\n repost: row.uri === row.postUri ? undefined : row.uri,\n }\n}\n"]}
|
|
@@ -41,14 +41,14 @@ export default (db) => ({
|
|
|
41
41
|
keyset,
|
|
42
42
|
tryIndex: true,
|
|
43
43
|
});
|
|
44
|
-
const
|
|
44
|
+
const page = keyset.page(await followersReq.execute(), limit);
|
|
45
45
|
return {
|
|
46
|
-
followers:
|
|
46
|
+
followers: page.items.map((f) => ({
|
|
47
47
|
uri: f.uri,
|
|
48
48
|
actorDid: f.creatorDid,
|
|
49
49
|
subjectDid: f.subjectDid,
|
|
50
50
|
})),
|
|
51
|
-
cursor:
|
|
51
|
+
cursor: page.cursor,
|
|
52
52
|
};
|
|
53
53
|
},
|
|
54
54
|
async getFollows(req) {
|
|
@@ -73,14 +73,14 @@ export default (db) => ({
|
|
|
73
73
|
keyset,
|
|
74
74
|
tryIndex: true,
|
|
75
75
|
});
|
|
76
|
-
const
|
|
76
|
+
const page = keyset.page(await followsReq.execute(), limit);
|
|
77
77
|
return {
|
|
78
|
-
follows:
|
|
78
|
+
follows: page.items.map((f) => ({
|
|
79
79
|
uri: f.uri,
|
|
80
80
|
actorDid: f.creatorDid,
|
|
81
81
|
subjectDid: f.subjectDid,
|
|
82
82
|
})),
|
|
83
|
-
cursor:
|
|
83
|
+
cursor: page.cursor,
|
|
84
84
|
};
|
|
85
85
|
},
|
|
86
86
|
/**
|
|
@@ -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,
|
|
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 { 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"]}
|
|
@@ -19,10 +19,10 @@ export default (db) => ({
|
|
|
19
19
|
cursor,
|
|
20
20
|
keyset,
|
|
21
21
|
});
|
|
22
|
-
const
|
|
22
|
+
const page = keyset.page(await builder.execute(), limit);
|
|
23
23
|
return {
|
|
24
|
-
uris:
|
|
25
|
-
cursor:
|
|
24
|
+
uris: page.items.map((l) => l.uri),
|
|
25
|
+
cursor: page.cursor,
|
|
26
26
|
};
|
|
27
27
|
},
|
|
28
28
|
// @NOTE deprecated in favor of getLikesBySubjectSorted
|
|
@@ -59,13 +59,13 @@ export default (db) => ({
|
|
|
59
59
|
cursor,
|
|
60
60
|
keyset,
|
|
61
61
|
});
|
|
62
|
-
const
|
|
62
|
+
const page = keyset.page(await builder.execute(), limit);
|
|
63
63
|
return {
|
|
64
|
-
likes:
|
|
64
|
+
likes: page.items.map((l) => ({
|
|
65
65
|
uri: l.uri,
|
|
66
66
|
subject: l.subject,
|
|
67
67
|
})),
|
|
68
|
-
cursor:
|
|
68
|
+
cursor: page.cursor,
|
|
69
69
|
};
|
|
70
70
|
},
|
|
71
71
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"likes.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/likes.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAGvC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE7D,eAAe,CAAC,EAAY,EAAwC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,uBAAuB,CAAC,GAAG;QAC/B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAA;QACtC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAE7B,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;YAClB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;QACrB,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,GAAG,EAAE,CAAC,EAAE;aAChB,UAAU,CAAC,MAAM,CAAC;aAClB,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC;aACxC,SAAS,CAAC,MAAM,CAAC,CAAA;QAEpB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;QACrE,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE;YAC1B,KAAK;YACL,MAAM;YACN,MAAM;SACP,CAAC,CAAA;QAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"likes.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/likes.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport type { ServiceImpl } from '@connectrpc/connect'\nimport { keyBy } from '@atproto/common'\nimport type { Service } from '../../../proto/bsky_connect.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 getLikesBySubjectSorted(req) {\n const { subject, cursor, limit } = req\n const { ref } = db.db.dynamic\n\n if (!subject?.uri) {\n return { uris: [] }\n }\n\n // @NOTE ignoring subject.cid\n let builder = db.db\n .selectFrom('like')\n .where('like.subject', '=', subject?.uri)\n .selectAll('like')\n\n const keyset = new TimeCidKeyset(ref('like.sortAt'), ref('like.cid'))\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n\n const page = keyset.page(await builder.execute(), limit)\n\n return {\n uris: page.items.map((l) => l.uri),\n cursor: page.cursor,\n }\n },\n\n // @NOTE deprecated in favor of getLikesBySubjectSorted\n async getLikesBySubject(req, context) {\n assert(this.getLikesBySubjectSorted)\n return this.getLikesBySubjectSorted(req, context)\n },\n\n async getLikesByActorAndSubjects(req) {\n const { actorDid, refs } = req\n if (refs.length === 0) {\n return { uris: [] }\n }\n // @NOTE ignoring ref.cid\n const res = await db.db\n .selectFrom('like')\n .where('creator', '=', actorDid)\n .where(\n 'subject',\n 'in',\n refs.map(({ uri }) => uri),\n )\n .selectAll()\n .execute()\n const bySubject = keyBy(res, 'subject')\n const uris = refs.map(({ uri }) => bySubject.get(uri)?.uri ?? '')\n return { uris }\n },\n\n async getActorLikes(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('like')\n .where('like.creator', '=', actorDid)\n .selectAll()\n\n const keyset = new TimeCidKeyset(ref('like.sortAt'), ref('like.cid'))\n\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n\n const page = keyset.page(await builder.execute(), limit)\n\n return {\n likes: page.items.map((l) => ({\n uri: l.uri,\n subject: l.subject,\n })),\n cursor: page.cursor,\n }\n },\n})\n"]}
|
|
@@ -16,10 +16,10 @@ export default (db) => ({
|
|
|
16
16
|
keyset,
|
|
17
17
|
tryIndex: true,
|
|
18
18
|
});
|
|
19
|
-
const
|
|
19
|
+
const page = keyset.page(await builder.execute(), limit);
|
|
20
20
|
return {
|
|
21
|
-
listUris:
|
|
22
|
-
cursor:
|
|
21
|
+
listUris: page.items.map((item) => item.uri),
|
|
22
|
+
cursor: page.cursor,
|
|
23
23
|
};
|
|
24
24
|
},
|
|
25
25
|
async getListMembers(req) {
|
|
@@ -36,13 +36,13 @@ export default (db) => ({
|
|
|
36
36
|
keyset,
|
|
37
37
|
tryIndex: true,
|
|
38
38
|
});
|
|
39
|
-
const
|
|
39
|
+
const page = keyset.page(await builder.execute(), limit);
|
|
40
40
|
return {
|
|
41
|
-
listitems:
|
|
41
|
+
listitems: page.items.map((item) => ({
|
|
42
42
|
uri: item.uri,
|
|
43
43
|
did: item.subjectDid,
|
|
44
44
|
})),
|
|
45
|
-
cursor:
|
|
45
|
+
cursor: page.cursor,
|
|
46
46
|
};
|
|
47
47
|
},
|
|
48
48
|
async getListMembership(req) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lists.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/lists.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAGvC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,eAAe,CAAC,EAAY,EAAwC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,aAAa,CAAC,GAAG;QACrB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAA;QACvC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAC7B,IAAI,OAAO,GAAG,EAAE,CAAC,EAAE;aAChB,UAAU,CAAC,MAAM,CAAC;aAClB,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC;aAC/B,SAAS,EAAE,CAAA;QACd,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;QACrE,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE;YAC1B,KAAK;YACL,MAAM;YACN,MAAM;YACN,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QACF,MAAM,
|
|
1
|
+
{"version":3,"file":"lists.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/lists.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 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 getActorLists(req) {\n const { actorDid, cursor, limit } = req\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('list')\n .where('creator', '=', actorDid)\n .selectAll()\n const keyset = new TimeCidKeyset(ref('list.sortAt'), ref('list.cid'))\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n const page = keyset.page(await builder.execute(), limit)\n return {\n listUris: page.items.map((item) => item.uri),\n cursor: page.cursor,\n }\n },\n\n async getListMembers(req) {\n const { listUri, cursor, limit } = req\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('list_item')\n .where('listUri', '=', listUri)\n .selectAll()\n\n const keyset = new TimeCidKeyset(\n ref('list_item.sortAt'),\n ref('list_item.cid'),\n )\n\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n tryIndex: true,\n })\n\n const page = keyset.page(await builder.execute(), limit)\n return {\n listitems: page.items.map((item) => ({\n uri: item.uri,\n did: item.subjectDid,\n })),\n cursor: page.cursor,\n }\n },\n\n async getListMembership(req) {\n const { actorDid, listUris } = req\n if (listUris.length === 0) {\n return { listitemUris: [] }\n }\n const res = await db.db\n .selectFrom('list_item')\n .where('subjectDid', '=', actorDid)\n .where('listUri', 'in', listUris)\n .selectAll()\n .execute()\n const byListUri = keyBy(res, 'listUri')\n const listitemUris = listUris.map((uri) => byListUri.get(uri)?.uri ?? '')\n return {\n listitemUris,\n }\n },\n\n async getListCount(req) {\n const res = await db.db\n .selectFrom('list_item')\n .select(countAll.as('count'))\n .where('list_item.listUri', '=', req.listUri)\n .executeTakeFirst()\n return {\n count: res?.count,\n }\n },\n})\n"]}
|
|
@@ -35,15 +35,15 @@ export default (db) => ({
|
|
|
35
35
|
cursor,
|
|
36
36
|
keyset,
|
|
37
37
|
});
|
|
38
|
-
const
|
|
38
|
+
const page = keyset.page(await builder.execute(), limit);
|
|
39
39
|
return {
|
|
40
|
-
dids:
|
|
41
|
-
mutes:
|
|
40
|
+
dids: page.items.map((m) => m.did),
|
|
41
|
+
mutes: page.items.map((m) => ({
|
|
42
42
|
did: m.did,
|
|
43
43
|
onlyReposts: m.onlyReposts,
|
|
44
44
|
onlyQuoteposts: m.onlyQuoteposts,
|
|
45
45
|
})),
|
|
46
|
-
cursor:
|
|
46
|
+
cursor: page.cursor,
|
|
47
47
|
};
|
|
48
48
|
},
|
|
49
49
|
async getActorMutesActorViaList(req) {
|
|
@@ -90,10 +90,10 @@ export default (db) => ({
|
|
|
90
90
|
cursor,
|
|
91
91
|
keyset,
|
|
92
92
|
});
|
|
93
|
-
const
|
|
93
|
+
const page = keyset.page(await builder.execute(), limit);
|
|
94
94
|
return {
|
|
95
|
-
listUris:
|
|
96
|
-
cursor:
|
|
95
|
+
listUris: page.items.map((l) => l.uri),
|
|
96
|
+
cursor: page.cursor,
|
|
97
97
|
};
|
|
98
98
|
},
|
|
99
99
|
async createActorMute(req) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutes.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/mutes.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport type { ServiceImpl } from '@connectrpc/connect'\nimport { keyBy } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport { app } from '../../../lexicons/index.js'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport type { Database } from '../db/index.js'\nimport {\n CreatedAtDidKeyset,\n TimeCidKeyset,\n paginate,\n} from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorMutesActor(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('mute')\n .selectAll()\n .where('mutedByDid', '=', actorDid)\n .where('subjectDid', '=', targetDid)\n .executeTakeFirst()\n return {\n muted: res != null && !res.onlyReposts && !res.onlyQuoteposts,\n mutedOnlyReposts: res?.onlyReposts ?? false,\n mutedOnlyQuoteposts: res?.onlyQuoteposts ?? false,\n }\n },\n\n async getMutes(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('mute')\n .innerJoin('actor', 'actor.did', 'mute.subjectDid')\n .where('mute.mutedByDid', '=', actorDid)\n .selectAll('actor')\n .select('mute.createdAt as createdAt')\n .select('mute.onlyReposts as onlyReposts')\n .select('mute.onlyQuoteposts as onlyQuoteposts')\n\n const keyset = new CreatedAtDidKeyset(\n ref('mute.createdAt'),\n ref('mute.subjectDid'),\n )\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n\n const mutes = await builder.execute()\n\n return {\n dids: mutes.map((m) => m.did),\n mutes: mutes.map((m) => ({\n did: m.did,\n onlyReposts: m.onlyReposts,\n onlyQuoteposts: m.onlyQuoteposts,\n })),\n cursor: keyset.packFromResult(mutes),\n }\n },\n\n async getActorMutesActorViaList(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('list_mute')\n .innerJoin('list_item', 'list_item.listUri', 'list_mute.listUri')\n .where('list_mute.mutedByDid', '=', actorDid)\n .where('list_item.subjectDid', '=', targetDid)\n .select('list_mute.listUri')\n .limit(1)\n .executeTakeFirst()\n return {\n listUri: res?.listUri,\n }\n },\n\n async getMutelistSubscription(req) {\n const { actorDid, listUri } = req\n const res = await db.db\n .selectFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .where('listUri', '=', listUri)\n .selectAll()\n .limit(1)\n .executeTakeFirst()\n return {\n subscribed: !!res,\n }\n },\n\n async getMutelistSubscriptions(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('list')\n .where(({ exists }) =>\n exists(\n db.db\n .selectFrom('list_mute')\n .where('list_mute.mutedByDid', '=', actorDid)\n .whereRef('list_mute.listUri', '=', ref('list.uri'))\n .selectAll(),\n ),\n )\n .selectAll('list')\n\n const keyset = new TimeCidKeyset(ref('list.createdAt'), ref('list.cid'))\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n const lists = await builder.execute()\n\n return {\n listUris: lists.map((l) => l.uri),\n cursor: keyset.packFromResult(lists),\n }\n },\n\n async createActorMute(req) {\n const { actorDid, subjectDid, onlyReposts, onlyQuoteposts } = req\n assert(actorDid !== subjectDid, 'cannot mute yourself') // @TODO pass message through in http error\n await db.db\n .insertInto('mute')\n .values({\n subjectDid,\n mutedByDid: actorDid,\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 },\n\n async deleteActorMute(req) {\n const { actorDid, subjectDid } = req\n assert(actorDid !== subjectDid, 'cannot mute yourself')\n await db.db\n .deleteFrom('mute')\n .where('subjectDid', '=', subjectDid)\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async clearActorMutes(req) {\n const { actorDid } = req\n await db.db.deleteFrom('mute').where('mutedByDid', '=', actorDid).execute()\n },\n\n async createActorMutelistSubscription(req) {\n const { actorDid, subjectUri } = req\n assert(isListUri(subjectUri), 'must mute a list')\n await db.db\n .insertInto('list_mute')\n .values({\n listUri: subjectUri,\n mutedByDid: actorDid,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n },\n\n async deleteActorMutelistSubscription(req) {\n const { actorDid, subjectUri } = req\n assert(isListUri(subjectUri), 'must mute a list')\n await db.db\n .deleteFrom('list_mute')\n .where('listUri', '=', subjectUri)\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async clearActorMutelistSubscriptions(req) {\n const { actorDid } = req\n await db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async getThreadMutesOnSubjects(req) {\n const { actorDid, threadRoots } = req\n if (threadRoots.length === 0) {\n return { muted: [] }\n }\n const res = await db.db\n .selectFrom('thread_mute')\n .selectAll()\n .where('mutedByDid', '=', actorDid)\n .where('rootUri', 'in', threadRoots)\n .execute()\n const byRootUri = keyBy(res, 'rootUri')\n const muted = threadRoots.map((uri) => !!byRootUri.get(uri))\n return { muted }\n },\n})\n\nconst isListUri = (uri: string) =>\n new AtUri(uri).collection === app.bsky.graph.list.$type\n"]}
|
|
1
|
+
{"version":3,"file":"mutes.js","sourceRoot":"","sources":["../../../../src/data-plane/server/routes/mutes.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport type { ServiceImpl } from '@connectrpc/connect'\nimport { keyBy } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport { app } from '../../../lexicons/index.js'\nimport type { Service } from '../../../proto/bsky_connect.js'\nimport type { Database } from '../db/index.js'\nimport {\n CreatedAtDidKeyset,\n TimeCidKeyset,\n paginate,\n} from '../db/pagination.js'\n\nexport default (db: Database): Partial<ServiceImpl<typeof Service>> => ({\n async getActorMutesActor(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('mute')\n .selectAll()\n .where('mutedByDid', '=', actorDid)\n .where('subjectDid', '=', targetDid)\n .executeTakeFirst()\n return {\n muted: res != null && !res.onlyReposts && !res.onlyQuoteposts,\n mutedOnlyReposts: res?.onlyReposts ?? false,\n mutedOnlyQuoteposts: res?.onlyQuoteposts ?? false,\n }\n },\n\n async getMutes(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n\n let builder = db.db\n .selectFrom('mute')\n .innerJoin('actor', 'actor.did', 'mute.subjectDid')\n .where('mute.mutedByDid', '=', actorDid)\n .selectAll('actor')\n .select('mute.createdAt as createdAt')\n .select('mute.onlyReposts as onlyReposts')\n .select('mute.onlyQuoteposts as onlyQuoteposts')\n\n const keyset = new CreatedAtDidKeyset(\n ref('mute.createdAt'),\n ref('mute.subjectDid'),\n )\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n\n const page = keyset.page(await builder.execute(), limit)\n\n return {\n dids: page.items.map((m) => m.did),\n mutes: page.items.map((m) => ({\n did: m.did,\n onlyReposts: m.onlyReposts,\n onlyQuoteposts: m.onlyQuoteposts,\n })),\n cursor: page.cursor,\n }\n },\n\n async getActorMutesActorViaList(req) {\n const { actorDid, targetDid } = req\n const res = await db.db\n .selectFrom('list_mute')\n .innerJoin('list_item', 'list_item.listUri', 'list_mute.listUri')\n .where('list_mute.mutedByDid', '=', actorDid)\n .where('list_item.subjectDid', '=', targetDid)\n .select('list_mute.listUri')\n .limit(1)\n .executeTakeFirst()\n return {\n listUri: res?.listUri,\n }\n },\n\n async getMutelistSubscription(req) {\n const { actorDid, listUri } = req\n const res = await db.db\n .selectFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .where('listUri', '=', listUri)\n .selectAll()\n .limit(1)\n .executeTakeFirst()\n return {\n subscribed: !!res,\n }\n },\n\n async getMutelistSubscriptions(req) {\n const { actorDid, limit, cursor } = req\n const { ref } = db.db.dynamic\n let builder = db.db\n .selectFrom('list')\n .where(({ exists }) =>\n exists(\n db.db\n .selectFrom('list_mute')\n .where('list_mute.mutedByDid', '=', actorDid)\n .whereRef('list_mute.listUri', '=', ref('list.uri'))\n .selectAll(),\n ),\n )\n .selectAll('list')\n\n const keyset = new TimeCidKeyset(ref('list.createdAt'), ref('list.cid'))\n builder = paginate(builder, {\n limit,\n cursor,\n keyset,\n })\n const page = keyset.page(await builder.execute(), limit)\n\n return {\n listUris: page.items.map((l) => l.uri),\n cursor: page.cursor,\n }\n },\n\n async createActorMute(req) {\n const { actorDid, subjectDid, onlyReposts, onlyQuoteposts } = req\n assert(actorDid !== subjectDid, 'cannot mute yourself') // @TODO pass message through in http error\n await db.db\n .insertInto('mute')\n .values({\n subjectDid,\n mutedByDid: actorDid,\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 },\n\n async deleteActorMute(req) {\n const { actorDid, subjectDid } = req\n assert(actorDid !== subjectDid, 'cannot mute yourself')\n await db.db\n .deleteFrom('mute')\n .where('subjectDid', '=', subjectDid)\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async clearActorMutes(req) {\n const { actorDid } = req\n await db.db.deleteFrom('mute').where('mutedByDid', '=', actorDid).execute()\n },\n\n async createActorMutelistSubscription(req) {\n const { actorDid, subjectUri } = req\n assert(isListUri(subjectUri), 'must mute a list')\n await db.db\n .insertInto('list_mute')\n .values({\n listUri: subjectUri,\n mutedByDid: actorDid,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n },\n\n async deleteActorMutelistSubscription(req) {\n const { actorDid, subjectUri } = req\n assert(isListUri(subjectUri), 'must mute a list')\n await db.db\n .deleteFrom('list_mute')\n .where('listUri', '=', subjectUri)\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async clearActorMutelistSubscriptions(req) {\n const { actorDid } = req\n await db.db\n .deleteFrom('list_mute')\n .where('mutedByDid', '=', actorDid)\n .execute()\n },\n\n async getThreadMutesOnSubjects(req) {\n const { actorDid, threadRoots } = req\n if (threadRoots.length === 0) {\n return { muted: [] }\n }\n const res = await db.db\n .selectFrom('thread_mute')\n .selectAll()\n .where('mutedByDid', '=', actorDid)\n .where('rootUri', 'in', threadRoots)\n .execute()\n const byRootUri = keyBy(res, 'rootUri')\n const muted = threadRoots.map((uri) => !!byRootUri.get(uri))\n return { muted }\n },\n})\n\nconst isListUri = (uri: string) =>\n new AtUri(uri).collection === app.bsky.graph.list.$type\n"]}
|