@atproto/bsky 0.0.262 → 0.0.263
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 +8 -0
- package/dist/api/app/bsky/feed/searchPosts.js +1 -1
- package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
- package/dist/api/app/bsky/feed/searchPostsV2.js +1 -1
- package/dist/api/app/bsky/feed/searchPostsV2.js.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacksV2.js +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacksV2.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.js +2 -0
- package/dist/api/app/bsky/unspecced/getTrends.js.map +1 -1
- package/dist/lexicons/app/bsky/unspecced/getTrends.defs.d.ts +2 -0
- package/dist/lexicons/app/bsky/unspecced/getTrends.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/unspecced/getTrends.defs.js +1 -0
- package/dist/lexicons/app/bsky/unspecced/getTrends.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/unspecced/getTrendsSkeleton.defs.d.ts +2 -0
- package/dist/lexicons/app/bsky/unspecced/getTrendsSkeleton.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/unspecced/getTrendsSkeleton.defs.js +1 -0
- package/dist/lexicons/app/bsky/unspecced/getTrendsSkeleton.defs.js.map +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @atproto/bsky
|
|
2
2
|
|
|
3
|
+
## 0.0.263
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#5251](https://github.com/bluesky-social/atproto/pull/5251) [`ac691c7`](https://github.com/bluesky-social/atproto/commit/ac691c7df9555df939076ed7b506329129ce2841) Thanks [@ds-boyce](https://github.com/ds-boyce)! - Return 0 for hitsTotal when there are no results
|
|
8
|
+
|
|
9
|
+
- [#5250](https://github.com/bluesky-social/atproto/pull/5250) [`5baa874`](https://github.com/bluesky-social/atproto/commit/5baa87496f4d68cba980c2e1011c67ec19c94190) Thanks [@ds-boyce](https://github.com/ds-boyce)! - Add recIdStr field to getTrends endpoint
|
|
10
|
+
|
|
3
11
|
## 0.0.262
|
|
4
12
|
|
|
5
13
|
### Patch Changes
|
|
@@ -109,7 +109,7 @@ const skeletonV2 = async (inputs) => {
|
|
|
109
109
|
return {
|
|
110
110
|
posts: res.posts.map(({ uri }) => uri),
|
|
111
111
|
cursor: parseString(res.pageInfo?.cursor),
|
|
112
|
-
hitsTotal: res.pageInfo?.hitsTotal
|
|
112
|
+
hitsTotal: res.pageInfo?.hitsTotal != null
|
|
113
113
|
? Number(res.pageInfo.hitsTotal)
|
|
114
114
|
: undefined,
|
|
115
115
|
parsedQuery,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchPosts.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/searchPosts.ts"],"names":[],"mappings":"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","sourcesContent":["import { Timestamp } from '@bufbuild/protobuf'\nimport { mapDefined } from '@atproto/common'\nimport type { AtUriString, Client } from '@atproto/lex'\nimport { InvalidRequestError, type Server } from '@atproto/xrpc-server'\nimport type { ServerConfig } from '../../../../config.js'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type DataPlaneClient,\n asInvalidRequest,\n} from '../../../../data-plane/index.js'\nimport {\n type PostSearchQuery,\n parsePostSearchQuery,\n} from '../../../../data-plane/server/util.js'\nimport type { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFnInput,\n type PresentationFnInput,\n type RulesFnInput,\n type SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport { SearchSortOrder } from '../../../../proto/bsky_pb.js'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris.js'\nimport type { Views } from '../../../../views/index.js'\nimport { resHeaders, resolveSearchV2Override } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchPosts = createPipeline(\n skeleton,\n hydration,\n noBlocksOrTagged,\n presentation,\n )\n server.add(app.bsky.feed.searchPosts, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const { viewer, isModService, skipViewerBlocks } =\n ctx.authVerifier.parseCreds(auth)\n\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const results = await searchPosts(\n {\n ...params,\n hydrateCtx,\n isModService,\n isV2Override: resolveSearchV2Override(req, ctx.cfg),\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: results,\n headers: resHeaders({ labelers: hydrateCtx.labelers }),\n }\n },\n })\n}\n\nconst skeletonV1 = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const parsedQuery = parsePostSearchQuery(params.q, {\n author: params.author,\n })\n\n if (ctx.searchClient) {\n // @NOTE cursors won't change on appview swap\n const res = await ctx.searchClient.call(\n app.bsky.unspecced.searchPostsSkeleton,\n {\n q: params.q,\n cursor: params.cursor,\n limit: params.limit,\n author: params.author,\n domain: params.domain,\n lang: params.lang,\n mentions: params.mentions,\n since: params.since,\n sort: params.sort,\n tag: params.tag,\n until: params.until,\n url: params.url,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n )\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.cursor),\n parsedQuery,\n }\n }\n\n const res = await ctx.dataplane.searchPosts({\n term: params.q,\n limit: params.limit,\n cursor: params.cursor,\n })\n return {\n posts: res.uris as AtUriString[],\n cursor: parseString(res.cursor),\n parsedQuery,\n }\n}\n\nconst skeletonV2 = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const parsedQuery = parsePostSearchQuery(params.q, {\n author: params.author,\n })\n // Surface dataplane InvalidArgument errors as a 400 rather than a 500.\n const res = await ctx.dataplane\n .searchPostsV2({\n allTime: true, // match v1 behavior, v2 defaults to false\n params: {\n query: params.q,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n cursor: sanitizeCursor(params.cursor),\n },\n sort: postSortToV2(params.sort),\n filters: {\n authors: params.author ? [params.author] : [],\n mentions: params.mentions ? [params.mentions] : [],\n domains: params.domain ? [params.domain] : [],\n urls: params.url ? [params.url] : [],\n hashtags: params.tag ?? [],\n languages: params.lang ? [params.lang] : [],\n },\n since: parseTimestamp(params.since),\n until: parseTimestamp(params.until),\n })\n .catch(asInvalidRequest())\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.pageInfo?.cursor),\n hitsTotal: res.pageInfo?.hitsTotal\n ? Number(res.pageInfo.hitsTotal)\n : undefined,\n parsedQuery,\n }\n}\n\nconst skeleton = async (input: SkeletonFnInput<Context, Params>) => {\n const useV2 =\n input.params.hydrateCtx.features.checkGate(\n input.params.hydrateCtx.features.Gate.SearchV2Enable,\n ) || input.params.isV2Override\n const skeletonFn = useV2 ? skeletonV2 : skeletonV1\n return skeletonFn(input)\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydratePosts(\n skeleton.posts.map((uri) => ({ uri })),\n params.hydrateCtx,\n undefined,\n {\n processDynamicTagsForView: params.hydrateCtx.features?.checkGate(\n params.hydrateCtx.features.Gate.SearchFilteringExplorationEnable,\n )\n ? 'search'\n : undefined,\n },\n )\n}\n\nconst noBlocksOrTagged = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, params, skeleton, hydration } = inputs\n const { parsedQuery } = skeleton\n\n skeleton.posts = skeleton.posts.filter((uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n const creator = creatorFromUri(uri)\n const isCuratedSearch = params.sort === 'top'\n const isPostByViewer = creator === params.hydrateCtx.viewer\n\n // Cases to always show.\n if (isPostByViewer) return true\n if (params.isModService) return true\n\n // Cases to never show.\n if (ctx.views.viewerBlockExists(creator, hydration)) return false\n\n // Roll the post's own tags together with moderation tags on its author,\n // so author-level tags are filtered the same way as post-level tags.\n const author = hydration.actors?.get(creator)\n const tags = new Set([\n ...post.tags,\n ...(author?.accountModerationTags ?? []),\n ...(author?.profileModerationTags ?? []),\n ])\n\n // Tags that are hidden from all search surfaces (Top and Latest),\n // regardless of curation or author filtering.\n const alwaysHidden = [...ctx.cfg.searchTagsHideAll].some((t) => tags.has(t))\n if (alwaysHidden) return false\n\n let tagged = false\n if (\n params.hydrateCtx.features?.checkGate(\n params.hydrateCtx.features.Gate.SearchFilteringExplorationEnable,\n )\n ) {\n tagged = tags.has(ctx.cfg.visibilityTagHide)\n } else {\n tagged = [...ctx.cfg.searchTagsHide].some((t) => tags.has(t))\n }\n\n // Cases to conditionally show based on tagging.\n if (isCuratedSearch && tagged) return false\n if (!parsedQuery.author && tagged) return false\n return true\n })\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const posts = mapDefined(skeleton.posts, (uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n return ctx.views.post(uri, hydration)\n })\n return {\n posts,\n cursor: skeleton.cursor,\n hitsTotal: skeleton.hitsTotal,\n }\n}\n\ntype Context = {\n cfg: ServerConfig\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n searchClient?: Client\n}\n\ntype Params = app.bsky.feed.searchPosts.$Params & {\n hydrateCtx: HydrateCtx\n isModService: boolean\n isV2Override: boolean\n}\n\ntype Skeleton = {\n posts: AtUriString[]\n hitsTotal?: number\n cursor?: string\n parsedQuery: PostSearchQuery\n}\n\nconst postSortToV2 = (sort: string | undefined): SearchSortOrder => {\n if (sort === 'top') return SearchSortOrder.TOP\n if (sort === 'latest') return SearchSortOrder.RECENT\n return SearchSortOrder.UNSPECIFIED\n}\n\nconst parseTimestamp = (value: string | undefined): Timestamp | undefined => {\n if (!value) return undefined\n const date = new Date(value)\n if (isNaN(date.getTime())) return undefined\n return Timestamp.fromDate(date)\n}\n\nconst sanitizeCursor = (cursor: string | undefined): string | undefined => {\n if (!cursor) return undefined\n try {\n const decoded = Buffer.from(cursor, 'base64').toString('utf-8')\n const parsed = JSON.parse(decoded)\n if (typeof parsed === 'object' && parsed !== null) {\n return cursor\n }\n } catch {\n // fall through to throw below\n }\n throw new InvalidRequestError('Invalid cursor format')\n}\n"]}
|
|
1
|
+
{"version":3,"file":"searchPosts.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/searchPosts.ts"],"names":[],"mappings":"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","sourcesContent":["import { Timestamp } from '@bufbuild/protobuf'\nimport { mapDefined } from '@atproto/common'\nimport type { AtUriString, Client } from '@atproto/lex'\nimport { InvalidRequestError, type Server } from '@atproto/xrpc-server'\nimport type { ServerConfig } from '../../../../config.js'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type DataPlaneClient,\n asInvalidRequest,\n} from '../../../../data-plane/index.js'\nimport {\n type PostSearchQuery,\n parsePostSearchQuery,\n} from '../../../../data-plane/server/util.js'\nimport type { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFnInput,\n type PresentationFnInput,\n type RulesFnInput,\n type SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport { SearchSortOrder } from '../../../../proto/bsky_pb.js'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris.js'\nimport type { Views } from '../../../../views/index.js'\nimport { resHeaders, resolveSearchV2Override } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchPosts = createPipeline(\n skeleton,\n hydration,\n noBlocksOrTagged,\n presentation,\n )\n server.add(app.bsky.feed.searchPosts, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const { viewer, isModService, skipViewerBlocks } =\n ctx.authVerifier.parseCreds(auth)\n\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const results = await searchPosts(\n {\n ...params,\n hydrateCtx,\n isModService,\n isV2Override: resolveSearchV2Override(req, ctx.cfg),\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: results,\n headers: resHeaders({ labelers: hydrateCtx.labelers }),\n }\n },\n })\n}\n\nconst skeletonV1 = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const parsedQuery = parsePostSearchQuery(params.q, {\n author: params.author,\n })\n\n if (ctx.searchClient) {\n // @NOTE cursors won't change on appview swap\n const res = await ctx.searchClient.call(\n app.bsky.unspecced.searchPostsSkeleton,\n {\n q: params.q,\n cursor: params.cursor,\n limit: params.limit,\n author: params.author,\n domain: params.domain,\n lang: params.lang,\n mentions: params.mentions,\n since: params.since,\n sort: params.sort,\n tag: params.tag,\n until: params.until,\n url: params.url,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n )\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.cursor),\n parsedQuery,\n }\n }\n\n const res = await ctx.dataplane.searchPosts({\n term: params.q,\n limit: params.limit,\n cursor: params.cursor,\n })\n return {\n posts: res.uris as AtUriString[],\n cursor: parseString(res.cursor),\n parsedQuery,\n }\n}\n\nconst skeletonV2 = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const parsedQuery = parsePostSearchQuery(params.q, {\n author: params.author,\n })\n // Surface dataplane InvalidArgument errors as a 400 rather than a 500.\n const res = await ctx.dataplane\n .searchPostsV2({\n allTime: true, // match v1 behavior, v2 defaults to false\n params: {\n query: params.q,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n cursor: sanitizeCursor(params.cursor),\n },\n sort: postSortToV2(params.sort),\n filters: {\n authors: params.author ? [params.author] : [],\n mentions: params.mentions ? [params.mentions] : [],\n domains: params.domain ? [params.domain] : [],\n urls: params.url ? [params.url] : [],\n hashtags: params.tag ?? [],\n languages: params.lang ? [params.lang] : [],\n },\n since: parseTimestamp(params.since),\n until: parseTimestamp(params.until),\n })\n .catch(asInvalidRequest())\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.pageInfo?.cursor),\n hitsTotal:\n res.pageInfo?.hitsTotal != null\n ? Number(res.pageInfo.hitsTotal)\n : undefined,\n parsedQuery,\n }\n}\n\nconst skeleton = async (input: SkeletonFnInput<Context, Params>) => {\n const useV2 =\n input.params.hydrateCtx.features.checkGate(\n input.params.hydrateCtx.features.Gate.SearchV2Enable,\n ) || input.params.isV2Override\n const skeletonFn = useV2 ? skeletonV2 : skeletonV1\n return skeletonFn(input)\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydratePosts(\n skeleton.posts.map((uri) => ({ uri })),\n params.hydrateCtx,\n undefined,\n {\n processDynamicTagsForView: params.hydrateCtx.features?.checkGate(\n params.hydrateCtx.features.Gate.SearchFilteringExplorationEnable,\n )\n ? 'search'\n : undefined,\n },\n )\n}\n\nconst noBlocksOrTagged = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, params, skeleton, hydration } = inputs\n const { parsedQuery } = skeleton\n\n skeleton.posts = skeleton.posts.filter((uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n const creator = creatorFromUri(uri)\n const isCuratedSearch = params.sort === 'top'\n const isPostByViewer = creator === params.hydrateCtx.viewer\n\n // Cases to always show.\n if (isPostByViewer) return true\n if (params.isModService) return true\n\n // Cases to never show.\n if (ctx.views.viewerBlockExists(creator, hydration)) return false\n\n // Roll the post's own tags together with moderation tags on its author,\n // so author-level tags are filtered the same way as post-level tags.\n const author = hydration.actors?.get(creator)\n const tags = new Set([\n ...post.tags,\n ...(author?.accountModerationTags ?? []),\n ...(author?.profileModerationTags ?? []),\n ])\n\n // Tags that are hidden from all search surfaces (Top and Latest),\n // regardless of curation or author filtering.\n const alwaysHidden = [...ctx.cfg.searchTagsHideAll].some((t) => tags.has(t))\n if (alwaysHidden) return false\n\n let tagged = false\n if (\n params.hydrateCtx.features?.checkGate(\n params.hydrateCtx.features.Gate.SearchFilteringExplorationEnable,\n )\n ) {\n tagged = tags.has(ctx.cfg.visibilityTagHide)\n } else {\n tagged = [...ctx.cfg.searchTagsHide].some((t) => tags.has(t))\n }\n\n // Cases to conditionally show based on tagging.\n if (isCuratedSearch && tagged) return false\n if (!parsedQuery.author && tagged) return false\n return true\n })\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const posts = mapDefined(skeleton.posts, (uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n return ctx.views.post(uri, hydration)\n })\n return {\n posts,\n cursor: skeleton.cursor,\n hitsTotal: skeleton.hitsTotal,\n }\n}\n\ntype Context = {\n cfg: ServerConfig\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n searchClient?: Client\n}\n\ntype Params = app.bsky.feed.searchPosts.$Params & {\n hydrateCtx: HydrateCtx\n isModService: boolean\n isV2Override: boolean\n}\n\ntype Skeleton = {\n posts: AtUriString[]\n hitsTotal?: number\n cursor?: string\n parsedQuery: PostSearchQuery\n}\n\nconst postSortToV2 = (sort: string | undefined): SearchSortOrder => {\n if (sort === 'top') return SearchSortOrder.TOP\n if (sort === 'latest') return SearchSortOrder.RECENT\n return SearchSortOrder.UNSPECIFIED\n}\n\nconst parseTimestamp = (value: string | undefined): Timestamp | undefined => {\n if (!value) return undefined\n const date = new Date(value)\n if (isNaN(date.getTime())) return undefined\n return Timestamp.fromDate(date)\n}\n\nconst sanitizeCursor = (cursor: string | undefined): string | undefined => {\n if (!cursor) return undefined\n try {\n const decoded = Buffer.from(cursor, 'base64').toString('utf-8')\n const parsed = JSON.parse(decoded)\n if (typeof parsed === 'object' && parsed !== null) {\n return cursor\n }\n } catch {\n // fall through to throw below\n }\n throw new InvalidRequestError('Invalid cursor format')\n}\n"]}
|
|
@@ -103,7 +103,7 @@ const skeleton = async (inputs) => {
|
|
|
103
103
|
return {
|
|
104
104
|
posts: res.posts.map(({ uri }) => uri),
|
|
105
105
|
cursor: parseString(res.pageInfo?.cursor),
|
|
106
|
-
hitsTotal: res.pageInfo?.hitsTotal
|
|
106
|
+
hitsTotal: res.pageInfo?.hitsTotal != null
|
|
107
107
|
? Number(res.pageInfo.hitsTotal)
|
|
108
108
|
: undefined,
|
|
109
109
|
detectedQueryLanguages: res.detectedQueryLanguages,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchPostsV2.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/searchPostsV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { Timestamp } from '@bufbuild/protobuf'\nimport { mapDefined } from '@atproto/common'\nimport type { AtUriString } from '@atproto/lex'\nimport {\n ForbiddenError,\n InvalidRequestError,\n type Server,\n} from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type DataPlaneClient,\n asInvalidRequest,\n} from '../../../../data-plane/index.js'\nimport {\n type PostSearchQuery,\n parsePostSearchQuery,\n} from '../../../../data-plane/server/util.js'\nimport type { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFnInput,\n type PresentationFnInput,\n type RulesFnInput,\n type SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport {\n SearchQueryLanguage,\n SearchSortOrder,\n} from '../../../../proto/bsky_pb.js'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris.js'\nimport type { Views } from '../../../../views/index.js'\nimport { resHeaders, resolveSearchV2Override } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchPostsV2 = createPipeline(\n skeleton,\n hydration,\n noBlocksOrTagged,\n presentation,\n )\n server.add(app.bsky.feed.searchPostsV2, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const { viewer, isModService, skipViewerBlocks } =\n ctx.authVerifier.parseCreds(auth)\n\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const isV2Enabled =\n hydrateCtx.features.checkGate(\n hydrateCtx.features.Gate.SearchV2Enable,\n ) || resolveSearchV2Override(req, ctx.cfg)\n if (!isV2Enabled) {\n throw new InvalidRequestError('Search v2 is not enabled')\n }\n\n /*\n * Matches v1 handling: allow one page of results for unauthenticated\n * users, but block further pages. This is a temporary measure until\n * we finalize moderation rules for search v2.\n */\n if (!viewer && params.cursor) {\n throw new ForbiddenError('Request forbidden by administrative rules.')\n }\n\n const results = await searchPostsV2(\n {\n ...params,\n // Default to curated 'top' ranking when unset; the backend rejects an\n // unspecified sort order.\n sort: params.sort ?? 'top',\n hydrateCtx,\n isModService,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: results,\n headers: resHeaders({ labelers: hydrateCtx.labelers }),\n }\n },\n })\n}\n\nconst skeleton = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const query = params.query ?? ''\n const parsedQuery = parsePostSearchQuery(query, {\n author: params.authors?.[0],\n })\n\n // Surface dataplane InvalidArgument errors as a 400 rather than a 500.\n const res = await ctx.dataplane\n .searchPostsV2({\n params: {\n query,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n cursor: params.cursor,\n },\n sort: postSortToV2(params.sort),\n filters: {\n authors: params.authors ?? [],\n mentions: params.mentions ?? [],\n domains: params.domains ?? [],\n urls: params.urls ?? [],\n embeddedAtUris: params.embeddedAtUris ?? [],\n hashtags: params.hashtags ?? [],\n languages: params.languages ?? [],\n },\n exclude: {\n authors: params.excludeAuthors ?? [],\n mentions: params.excludeMentions ?? [],\n domains: params.excludeDomains ?? [],\n urls: params.excludeUrls ?? [],\n embeddedAtUris: params.excludeEmbeddedAtUris ?? [],\n hashtags: params.excludeHashtags ?? [],\n languages: params.excludeLanguages ?? [],\n },\n since: parseTimestamp(params.since),\n until: parseTimestamp(params.until),\n allTime: params.allTime,\n hasMedia: params.hasMedia,\n hasVideo: params.hasVideo,\n replyParentUri: params.replyParentUri,\n threadRootUri: params.threadRootUri,\n excludeReplies: params.excludeReplies,\n repliesOnly: params.repliesOnly,\n following: params.following,\n queryLanguage: queryLanguageToV2(params.queryLanguage),\n })\n .catch(asInvalidRequest())\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.pageInfo?.cursor),\n hitsTotal: res.pageInfo?.hitsTotal\n ? Number(res.pageInfo.hitsTotal)\n : undefined,\n detectedQueryLanguages: res.detectedQueryLanguages,\n parsedQuery,\n }\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydratePosts(\n skeleton.posts.map((uri) => ({ uri })),\n params.hydrateCtx,\n )\n}\n\nconst noBlocksOrTagged = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, params, skeleton, hydration } = inputs\n const { parsedQuery } = skeleton\n\n skeleton.posts = skeleton.posts.filter((uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n const creator = creatorFromUri(uri)\n const isCuratedSearch = params.sort === 'top'\n const isPostByViewer = creator === params.hydrateCtx.viewer\n\n if (isPostByViewer) return true\n if (params.isModService) return true\n\n if (ctx.views.viewerBlockExists(creator, hydration)) return false\n\n // Roll the post's own tags together with moderation tags on its author,\n // so author-level tags are filtered the same way as post-level tags.\n const author = hydration.actors?.get(creator)\n const tags = new Set([\n ...post.tags,\n ...(author?.accountModerationTags ?? []),\n ...(author?.profileModerationTags ?? []),\n ])\n\n // Tags that are hidden from all search surfaces (Top and Latest),\n // regardless of curation or author filtering.\n const alwaysHidden = [...ctx.cfg.searchTagsHideAll].some((t) => tags.has(t))\n if (alwaysHidden) return false\n\n const tagged = [...ctx.cfg.searchTagsHide].some((t) => tags.has(t))\n\n if (isCuratedSearch && tagged) return false\n if (!(parsedQuery.author || params.authors?.length) && tagged) return false\n return true\n })\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const posts = mapDefined(skeleton.posts, (uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n return ctx.views.post(uri, hydration)\n })\n return {\n posts,\n cursor: skeleton.cursor,\n hitsTotal: skeleton.hitsTotal,\n detectedQueryLanguages: skeleton.detectedQueryLanguages,\n }\n}\n\ntype Context = {\n cfg: AppContext['cfg']\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n}\n\ntype Params = app.bsky.feed.searchPostsV2.$Params & {\n hydrateCtx: HydrateCtx\n isModService: boolean\n}\n\ntype Skeleton = {\n posts: AtUriString[]\n hitsTotal?: number\n cursor?: string\n detectedQueryLanguages?: string[]\n parsedQuery: PostSearchQuery\n}\n\nconst postSortToV2 = (sort?: string): SearchSortOrder => {\n if (sort === 'top') return SearchSortOrder.TOP\n if (sort === 'recent') return SearchSortOrder.RECENT\n return SearchSortOrder.UNSPECIFIED\n}\n\nconst queryLanguageToV2 = (\n lang: string | undefined,\n): SearchQueryLanguage | undefined => {\n if (lang === 'ja') return SearchQueryLanguage.JA\n if (lang === 'zh') return SearchQueryLanguage.ZH\n if (lang === 'ko') return SearchQueryLanguage.KO\n if (lang === 'th') return SearchQueryLanguage.TH\n if (lang === 'ar') return SearchQueryLanguage.AR\n return undefined\n}\n\nconst parseTimestamp = (value: string | undefined): Timestamp | undefined => {\n if (!value) return undefined\n const date = new Date(value)\n if (isNaN(date.getTime())) return undefined\n return Timestamp.fromDate(date)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"searchPostsV2.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/searchPostsV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { Timestamp } from '@bufbuild/protobuf'\nimport { mapDefined } from '@atproto/common'\nimport type { AtUriString } from '@atproto/lex'\nimport {\n ForbiddenError,\n InvalidRequestError,\n type Server,\n} from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type DataPlaneClient,\n asInvalidRequest,\n} from '../../../../data-plane/index.js'\nimport {\n type PostSearchQuery,\n parsePostSearchQuery,\n} from '../../../../data-plane/server/util.js'\nimport type { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFnInput,\n type PresentationFnInput,\n type RulesFnInput,\n type SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport {\n SearchQueryLanguage,\n SearchSortOrder,\n} from '../../../../proto/bsky_pb.js'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris.js'\nimport type { Views } from '../../../../views/index.js'\nimport { resHeaders, resolveSearchV2Override } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchPostsV2 = createPipeline(\n skeleton,\n hydration,\n noBlocksOrTagged,\n presentation,\n )\n server.add(app.bsky.feed.searchPostsV2, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const { viewer, isModService, skipViewerBlocks } =\n ctx.authVerifier.parseCreds(auth)\n\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const isV2Enabled =\n hydrateCtx.features.checkGate(\n hydrateCtx.features.Gate.SearchV2Enable,\n ) || resolveSearchV2Override(req, ctx.cfg)\n if (!isV2Enabled) {\n throw new InvalidRequestError('Search v2 is not enabled')\n }\n\n /*\n * Matches v1 handling: allow one page of results for unauthenticated\n * users, but block further pages. This is a temporary measure until\n * we finalize moderation rules for search v2.\n */\n if (!viewer && params.cursor) {\n throw new ForbiddenError('Request forbidden by administrative rules.')\n }\n\n const results = await searchPostsV2(\n {\n ...params,\n // Default to curated 'top' ranking when unset; the backend rejects an\n // unspecified sort order.\n sort: params.sort ?? 'top',\n hydrateCtx,\n isModService,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: results,\n headers: resHeaders({ labelers: hydrateCtx.labelers }),\n }\n },\n })\n}\n\nconst skeleton = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const query = params.query ?? ''\n const parsedQuery = parsePostSearchQuery(query, {\n author: params.authors?.[0],\n })\n\n // Surface dataplane InvalidArgument errors as a 400 rather than a 500.\n const res = await ctx.dataplane\n .searchPostsV2({\n params: {\n query,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n cursor: params.cursor,\n },\n sort: postSortToV2(params.sort),\n filters: {\n authors: params.authors ?? [],\n mentions: params.mentions ?? [],\n domains: params.domains ?? [],\n urls: params.urls ?? [],\n embeddedAtUris: params.embeddedAtUris ?? [],\n hashtags: params.hashtags ?? [],\n languages: params.languages ?? [],\n },\n exclude: {\n authors: params.excludeAuthors ?? [],\n mentions: params.excludeMentions ?? [],\n domains: params.excludeDomains ?? [],\n urls: params.excludeUrls ?? [],\n embeddedAtUris: params.excludeEmbeddedAtUris ?? [],\n hashtags: params.excludeHashtags ?? [],\n languages: params.excludeLanguages ?? [],\n },\n since: parseTimestamp(params.since),\n until: parseTimestamp(params.until),\n allTime: params.allTime,\n hasMedia: params.hasMedia,\n hasVideo: params.hasVideo,\n replyParentUri: params.replyParentUri,\n threadRootUri: params.threadRootUri,\n excludeReplies: params.excludeReplies,\n repliesOnly: params.repliesOnly,\n following: params.following,\n queryLanguage: queryLanguageToV2(params.queryLanguage),\n })\n .catch(asInvalidRequest())\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.pageInfo?.cursor),\n hitsTotal:\n res.pageInfo?.hitsTotal != null\n ? Number(res.pageInfo.hitsTotal)\n : undefined,\n detectedQueryLanguages: res.detectedQueryLanguages,\n parsedQuery,\n }\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydratePosts(\n skeleton.posts.map((uri) => ({ uri })),\n params.hydrateCtx,\n )\n}\n\nconst noBlocksOrTagged = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, params, skeleton, hydration } = inputs\n const { parsedQuery } = skeleton\n\n skeleton.posts = skeleton.posts.filter((uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n const creator = creatorFromUri(uri)\n const isCuratedSearch = params.sort === 'top'\n const isPostByViewer = creator === params.hydrateCtx.viewer\n\n if (isPostByViewer) return true\n if (params.isModService) return true\n\n if (ctx.views.viewerBlockExists(creator, hydration)) return false\n\n // Roll the post's own tags together with moderation tags on its author,\n // so author-level tags are filtered the same way as post-level tags.\n const author = hydration.actors?.get(creator)\n const tags = new Set([\n ...post.tags,\n ...(author?.accountModerationTags ?? []),\n ...(author?.profileModerationTags ?? []),\n ])\n\n // Tags that are hidden from all search surfaces (Top and Latest),\n // regardless of curation or author filtering.\n const alwaysHidden = [...ctx.cfg.searchTagsHideAll].some((t) => tags.has(t))\n if (alwaysHidden) return false\n\n const tagged = [...ctx.cfg.searchTagsHide].some((t) => tags.has(t))\n\n if (isCuratedSearch && tagged) return false\n if (!(parsedQuery.author || params.authors?.length) && tagged) return false\n return true\n })\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const posts = mapDefined(skeleton.posts, (uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n return ctx.views.post(uri, hydration)\n })\n return {\n posts,\n cursor: skeleton.cursor,\n hitsTotal: skeleton.hitsTotal,\n detectedQueryLanguages: skeleton.detectedQueryLanguages,\n }\n}\n\ntype Context = {\n cfg: AppContext['cfg']\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n}\n\ntype Params = app.bsky.feed.searchPostsV2.$Params & {\n hydrateCtx: HydrateCtx\n isModService: boolean\n}\n\ntype Skeleton = {\n posts: AtUriString[]\n hitsTotal?: number\n cursor?: string\n detectedQueryLanguages?: string[]\n parsedQuery: PostSearchQuery\n}\n\nconst postSortToV2 = (sort?: string): SearchSortOrder => {\n if (sort === 'top') return SearchSortOrder.TOP\n if (sort === 'recent') return SearchSortOrder.RECENT\n return SearchSortOrder.UNSPECIFIED\n}\n\nconst queryLanguageToV2 = (\n lang: string | undefined,\n): SearchQueryLanguage | undefined => {\n if (lang === 'ja') return SearchQueryLanguage.JA\n if (lang === 'zh') return SearchQueryLanguage.ZH\n if (lang === 'ko') return SearchQueryLanguage.KO\n if (lang === 'th') return SearchQueryLanguage.TH\n if (lang === 'ar') return SearchQueryLanguage.AR\n return undefined\n}\n\nconst parseTimestamp = (value: string | undefined): Timestamp | undefined => {\n if (!value) return undefined\n const date = new Date(value)\n if (isNaN(date.getTime())) return undefined\n return Timestamp.fromDate(date)\n}\n"]}
|
|
@@ -48,7 +48,7 @@ const skeleton = async (inputs) => {
|
|
|
48
48
|
return {
|
|
49
49
|
uris: res.starterPacks.map(({ uri }) => uri),
|
|
50
50
|
cursor: parseString(res.pageInfo?.cursor),
|
|
51
|
-
hitsTotal: res.pageInfo?.hitsTotal
|
|
51
|
+
hitsTotal: res.pageInfo?.hitsTotal != null
|
|
52
52
|
? Number(res.pageInfo.hitsTotal)
|
|
53
53
|
: undefined,
|
|
54
54
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchStarterPacksV2.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/graph/searchStarterPacksV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI5C,OAAO,EAEL,gBAAgB,GACjB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAKL,cAAc,GACf,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,oBAAoB,GAAG,cAAc,CACzC,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;QAC9C,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;YACvC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAClD,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YACrC,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAClD,MAAM;gBACN,QAAQ;gBACR,gBAAgB;gBAChB,gBAAgB;gBAChB,QAAQ,EAAE,GAAG,CAAC,kBAAkB,CAAC,KAAK,CACpC,GAAG,CAAC,kBAAkB,CAAC,2BAA2B,CAAC;oBACjD,MAAM;oBACN,GAAG;iBACJ,CAAC,CACH;aACF,CAAC,CAAA;YAEF,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,EAAE,GAAG,CAAC,CAAA;YAC1E,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;aACvD,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,QAAQ,GAAG,KAAK,EACpB,MAAwC,EACrB,EAAE;IACrB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IAC9B,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,CAAA;IAEpB,uEAAuE;IACvE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,SAAS;SAC5B,oBAAoB,CAAC;QACpB,MAAM,EAAE;YACN,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS;YAC7C,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB;KACF,CAAC;SACD,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAA;IAC5B,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAkB,CAAC;QAC3D,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;QACzC,SAAS,
|
|
1
|
+
{"version":3,"file":"searchStarterPacksV2.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/graph/searchStarterPacksV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { mapDefined } from '@atproto/common'\nimport type { AtUriString } from '@atproto/lex'\nimport type { Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type DataPlaneClient,\n asInvalidRequest,\n} from '../../../../data-plane/index.js'\nimport type { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFnInput,\n type PresentationFnInput,\n type RulesFnInput,\n type SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris.js'\nimport type { Views } from '../../../../views/index.js'\nimport { resHeaders } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchStarterPacksV2 = createPipeline(\n skeleton,\n hydration,\n noBlocks,\n presentation,\n )\n server.add(app.bsky.graph.searchStarterPacksV2, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const { viewer, includeTakedowns, skipViewerBlocks } =\n ctx.authVerifier.parseCreds(auth)\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n viewer,\n labelers,\n includeTakedowns,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n\n const results = await searchStarterPacksV2({ ...params, hydrateCtx }, ctx)\n return {\n encoding: 'application/json',\n body: results,\n headers: resHeaders({ labelers: hydrateCtx.labelers }),\n }\n },\n })\n}\n\nconst skeleton = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const { q } = params\n\n // Surface dataplane InvalidArgument errors as a 400 rather than a 500.\n const res = await ctx.dataplane\n .searchStarterPacksV2({\n params: {\n query: q,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n cursor: params.cursor,\n },\n })\n .catch(asInvalidRequest())\n return {\n uris: res.starterPacks.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.pageInfo?.cursor),\n hitsTotal:\n res.pageInfo?.hitsTotal != null\n ? Number(res.pageInfo.hitsTotal)\n : undefined,\n }\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydrateStarterPacks(skeleton.uris, params.hydrateCtx)\n}\n\nconst noBlocks = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, skeleton, hydration } = inputs\n skeleton.uris = skeleton.uris.filter((uri) => {\n const creator = creatorFromUri(uri)\n return !ctx.views.viewerBlockExists(creator, hydration)\n })\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const starterPacks = mapDefined(skeleton.uris, (uri) =>\n ctx.views.starterPack(uri, hydration),\n )\n return {\n starterPacks,\n cursor: skeleton.cursor,\n hitsTotal: skeleton.hitsTotal,\n }\n}\n\ntype Context = {\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n}\n\ntype Params = app.bsky.graph.searchStarterPacksV2.$Params & {\n hydrateCtx: HydrateCtx\n}\n\ntype Skeleton = {\n uris: AtUriString[]\n cursor?: string\n hitsTotal?: number\n}\n"]}
|
|
@@ -78,6 +78,7 @@ const noBlocks = (input) => {
|
|
|
78
78
|
}
|
|
79
79
|
const blocks = hydration.bidirectionalBlocks?.get(viewer);
|
|
80
80
|
return {
|
|
81
|
+
recIdStr: skeleton.recIdStr,
|
|
81
82
|
trends: skeleton.trends.map((t) => ({
|
|
82
83
|
...t,
|
|
83
84
|
dids: t.dids.filter((did) => !blocks?.get(did)),
|
|
@@ -87,6 +88,7 @@ const noBlocks = (input) => {
|
|
|
87
88
|
const presentation = (input) => {
|
|
88
89
|
const { ctx, skeleton, hydration } = input;
|
|
89
90
|
return {
|
|
91
|
+
recIdStr: skeleton.recIdStr,
|
|
90
92
|
trends: skeleton.trends.map((t) => ({
|
|
91
93
|
topic: t.topic,
|
|
92
94
|
displayName: t.displayName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTrends.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getTrends.ts"],"names":[],"mappings":"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","sourcesContent":["import { mapDefined, noUndefinedVals } from '@atproto/common'\nimport type { Client, DidString } from '@atproto/lex'\nimport { MethodNotImplementedError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type HydrateCtx,\n type Hydrator,\n mergeManyStates,\n} from '../../../../hydration/hydrator.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFn,\n type PresentationFn,\n type RulesFn,\n type SkeletonFn,\n createPipeline,\n} from '../../../../pipeline.js'\nimport type { Views } from '../../../../views/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getTrends = createPipeline(skeleton, hydration, noBlocks, presentation)\n server.add(app.bsky.unspecced.getTrends, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const viewer = auth.credentials.iss\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const headers = noUndefinedVals({\n 'accept-language': req.headers['accept-language'],\n 'x-bsky-topics': Array.isArray(req.headers['x-bsky-topics'])\n ? req.headers['x-bsky-topics'].join(',')\n : req.headers['x-bsky-topics'],\n })\n const result = await getTrends(\n {\n ...params,\n hydrateCtx,\n headers,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: result,\n }\n },\n })\n}\n\nconst skeleton: SkeletonFn<Context, Params, SkeletonState> = async (input) => {\n const { params, ctx } = input\n\n // Route treatment users to iris (trending-topics v2), everyone else stays on\n // the existing hot-topic service.\n const useIris = params.hydrateCtx.features.checkGate(\n params.hydrateCtx.features.Gate.TrendingTopicsV2,\n )\n const topicsClient = (useIris && ctx.irisClient) || ctx.topicsClient\n\n if (!topicsClient) {\n // Use 501 instead of 500 as these are not considered retry-able by clients\n throw new MethodNotImplementedError('Topics agent not available')\n }\n\n const skeleton = await topicsClient.call(\n app.bsky.unspecced.getTrendsSkeleton,\n {\n limit: params.limit,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n },\n )\n\n // @TODO Make sure upstream always provides this\n for (const trend of skeleton.trends) trend.dids ??= []\n\n return skeleton\n}\n\nconst hydration: HydrationFn<Context, Params, SkeletonState> = async (\n input,\n) => {\n const { ctx, params, skeleton } = input\n const dids = getUniqueDidsFromTrends(skeleton.trends)\n const pairs: Map<DidString, DidString[]> = new Map()\n const viewer = params.hydrateCtx.viewer\n if (viewer) pairs.set(viewer, dids)\n\n const [profileState, bidirectionalBlocks] = await Promise.all([\n ctx.hydrator.hydrateProfilesBasic(dids, params.hydrateCtx),\n ctx.hydrator.hydrateBidirectionalBlocks(pairs, params.hydrateCtx),\n ])\n\n return mergeManyStates(profileState, { bidirectionalBlocks })\n}\n\nconst noBlocks: RulesFn<Context, Params, SkeletonState> = (input) => {\n const { skeleton, params, hydration } = input\n const viewer = params.hydrateCtx.viewer\n if (!viewer) {\n return skeleton\n }\n\n const blocks = hydration.bidirectionalBlocks?.get(viewer)\n\n return {\n trends: skeleton.trends.map((t) => ({\n ...t,\n dids: t.dids.filter((did) => !blocks?.get(did)),\n })),\n }\n}\n\nconst presentation: PresentationFn<\n Context,\n Params,\n SkeletonState,\n app.bsky.unspecced.getTrends.$OutputBody\n> = (input) => {\n const { ctx, skeleton, hydration } = input\n\n return {\n trends: skeleton.trends.map((t) => ({\n topic: t.topic,\n displayName: t.displayName,\n link: t.link,\n startedAt: t.startedAt,\n postCount: t.postCount,\n status: t.status,\n category: t.category,\n actors: mapDefined(t.dids, (did) =>\n ctx.views.profileBasic(did, hydration),\n ),\n })),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n topicsClient: Client | undefined\n irisClient: Client | undefined\n}\n\ntype Params = app.bsky.unspecced.getTrendingTopics.$Params & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n}\n\ntype SkeletonState = app.bsky.unspecced.getTrendsSkeleton.$OutputBody\n\nfunction getUniqueDidsFromTrends(\n trends?: app.bsky.unspecced.defs.SkeletonTrend[],\n): DidString[] {\n if (!trends) return []\n\n const dids = new Set<DidString>()\n\n for (const trend of trends) {\n if (trend.dids) {\n for (const did of trend.dids) {\n dids.add(did)\n }\n }\n }\n\n return Array.from(dids)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"getTrends.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getTrends.ts"],"names":[],"mappings":"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","sourcesContent":["import { mapDefined, noUndefinedVals } from '@atproto/common'\nimport type { Client, DidString } from '@atproto/lex'\nimport { MethodNotImplementedError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport {\n type HydrateCtx,\n type Hydrator,\n mergeManyStates,\n} from '../../../../hydration/hydrator.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n type HydrationFn,\n type PresentationFn,\n type RulesFn,\n type SkeletonFn,\n createPipeline,\n} from '../../../../pipeline.js'\nimport type { Views } from '../../../../views/index.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getTrends = createPipeline(skeleton, hydration, noBlocks, presentation)\n server.add(app.bsky.unspecced.getTrends, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const viewer = auth.credentials.iss\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const headers = noUndefinedVals({\n 'accept-language': req.headers['accept-language'],\n 'x-bsky-topics': Array.isArray(req.headers['x-bsky-topics'])\n ? req.headers['x-bsky-topics'].join(',')\n : req.headers['x-bsky-topics'],\n })\n const result = await getTrends(\n {\n ...params,\n hydrateCtx,\n headers,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: result,\n }\n },\n })\n}\n\nconst skeleton: SkeletonFn<Context, Params, SkeletonState> = async (input) => {\n const { params, ctx } = input\n\n // Route treatment users to iris (trending-topics v2), everyone else stays on\n // the existing hot-topic service.\n const useIris = params.hydrateCtx.features.checkGate(\n params.hydrateCtx.features.Gate.TrendingTopicsV2,\n )\n const topicsClient = (useIris && ctx.irisClient) || ctx.topicsClient\n\n if (!topicsClient) {\n // Use 501 instead of 500 as these are not considered retry-able by clients\n throw new MethodNotImplementedError('Topics agent not available')\n }\n\n const skeleton = await topicsClient.call(\n app.bsky.unspecced.getTrendsSkeleton,\n {\n limit: params.limit,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n },\n )\n\n // @TODO Make sure upstream always provides this\n for (const trend of skeleton.trends) trend.dids ??= []\n\n return skeleton\n}\n\nconst hydration: HydrationFn<Context, Params, SkeletonState> = async (\n input,\n) => {\n const { ctx, params, skeleton } = input\n const dids = getUniqueDidsFromTrends(skeleton.trends)\n const pairs: Map<DidString, DidString[]> = new Map()\n const viewer = params.hydrateCtx.viewer\n if (viewer) pairs.set(viewer, dids)\n\n const [profileState, bidirectionalBlocks] = await Promise.all([\n ctx.hydrator.hydrateProfilesBasic(dids, params.hydrateCtx),\n ctx.hydrator.hydrateBidirectionalBlocks(pairs, params.hydrateCtx),\n ])\n\n return mergeManyStates(profileState, { bidirectionalBlocks })\n}\n\nconst noBlocks: RulesFn<Context, Params, SkeletonState> = (input) => {\n const { skeleton, params, hydration } = input\n const viewer = params.hydrateCtx.viewer\n if (!viewer) {\n return skeleton\n }\n\n const blocks = hydration.bidirectionalBlocks?.get(viewer)\n\n return {\n recIdStr: skeleton.recIdStr,\n trends: skeleton.trends.map((t) => ({\n ...t,\n dids: t.dids.filter((did) => !blocks?.get(did)),\n })),\n }\n}\n\nconst presentation: PresentationFn<\n Context,\n Params,\n SkeletonState,\n app.bsky.unspecced.getTrends.$OutputBody\n> = (input) => {\n const { ctx, skeleton, hydration } = input\n\n return {\n recIdStr: skeleton.recIdStr,\n trends: skeleton.trends.map((t) => ({\n topic: t.topic,\n displayName: t.displayName,\n link: t.link,\n startedAt: t.startedAt,\n postCount: t.postCount,\n status: t.status,\n category: t.category,\n actors: mapDefined(t.dids, (did) =>\n ctx.views.profileBasic(did, hydration),\n ),\n })),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n topicsClient: Client | undefined\n irisClient: Client | undefined\n}\n\ntype Params = app.bsky.unspecced.getTrendingTopics.$Params & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n}\n\ntype SkeletonState = app.bsky.unspecced.getTrendsSkeleton.$OutputBody\n\nfunction getUniqueDidsFromTrends(\n trends?: app.bsky.unspecced.defs.SkeletonTrend[],\n): DidString[] {\n if (!trends) return []\n\n const dids = new Set<DidString>()\n\n for (const trend of trends) {\n if (trend.dids) {\n for (const did of trend.dids) {\n dids.add(did)\n }\n }\n }\n\n return Array.from(dids)\n}\n"]}
|
|
@@ -8,6 +8,7 @@ export declare const $params: l.ParamsSchema<{
|
|
|
8
8
|
export type $Params = l.InferOutput<typeof $params>;
|
|
9
9
|
export declare const $output: l.Payload<"application/json", l.ObjectSchema<{
|
|
10
10
|
trends: l.ArraySchema<l.RefSchema<l.Validator<UnspeccedDefs.TrendView, UnspeccedDefs.TrendView>>>;
|
|
11
|
+
recIdStr: l.OptionalSchema<l.StringSchema<{}>>;
|
|
11
12
|
}>>;
|
|
12
13
|
export type $Output<B = l.BinaryData> = l.InferPayload<typeof $output, B>;
|
|
13
14
|
export type $OutputBody<B = l.BinaryData> = l.InferPayloadBody<typeof $output, B>;
|
|
@@ -16,6 +17,7 @@ declare const main: l.Query<"app.bsky.unspecced.getTrends", l.ParamsSchema<{
|
|
|
16
17
|
readonly limit: l.OptionalSchema<l.WithDefaultSchema<l.IntegerSchema>>;
|
|
17
18
|
}>, l.Payload<"application/json", l.ObjectSchema<{
|
|
18
19
|
trends: l.ArraySchema<l.RefSchema<l.Validator<UnspeccedDefs.TrendView, UnspeccedDefs.TrendView>>>;
|
|
20
|
+
recIdStr: l.OptionalSchema<l.StringSchema<{}>>;
|
|
19
21
|
}>>, undefined>;
|
|
20
22
|
export { main };
|
|
21
23
|
export declare const $lxm = "app.bsky.unspecced.getTrends";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTrends.defs.d.ts","sourceRoot":"","sources":["../../../../../src/lexicons/app/bsky/unspecced/getTrends.defs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAE/C,QAAA,MAAM,KAAK,iCAAiC,CAAA;AAE5C,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,eAAO,MAAM,OAAO;;EAOlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAA;AAEnD,eAAO,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"getTrends.defs.d.ts","sourceRoot":"","sources":["../../../../../src/lexicons/app/bsky/unspecced/getTrends.defs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAE/C,QAAA,MAAM,KAAK,iCAAiC,CAAA;AAE5C,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,eAAO,MAAM,OAAO;;EAOlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAA;AAEnD,eAAO,MAAM,OAAO;;;GAOlB,CAAA;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAA;AACzE,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,gBAAgB,CAC5D,OAAO,OAAO,EACd,CAAC,CACF,CAAA;AAED,4CAA4C;AAC5C,QAAA,MAAM,IAAI;;;;;eAAiD,CAAA;AAE3D,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,eAAO,MAAM,IAAI,iCAAQ,CAAA"}
|
|
@@ -13,6 +13,7 @@ export const $params = /*#__PURE__*/ l.params({
|
|
|
13
13
|
export const $output = /*#__PURE__*/ l.jsonPayload({
|
|
14
14
|
trends: /*#__PURE__*/ l.array(
|
|
15
15
|
/*#__PURE__*/ l.ref((() => UnspeccedDefs.trendView))),
|
|
16
|
+
recIdStr: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),
|
|
16
17
|
});
|
|
17
18
|
/** Get the current trends on the network */
|
|
18
19
|
const main = /*#__PURE__*/ l.query($nsid, $params, $output);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTrends.defs.js","sourceRoot":"","sources":["../../../../../src/lexicons/app/bsky/unspecced/getTrends.defs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAE/C,MAAM,KAAK,GAAG,8BAA8B,CAAA;AAE5C,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ;IAC7B,aAAa,CAAC,CAAC,CAAC,WAAW;IACzB,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EACpD,EAAE,CACH,CACF;CACF,CAAC,CAAA;AAIF,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;IACjD,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK;IAC3B,aAAa,CAAC,CAAC,CAAC,GAAG,CACjB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAQ,CACvC,CACF;
|
|
1
|
+
{"version":3,"file":"getTrends.defs.js","sourceRoot":"","sources":["../../../../../src/lexicons/app/bsky/unspecced/getTrends.defs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAE/C,MAAM,KAAK,GAAG,8BAA8B,CAAA;AAE5C,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ;IAC7B,aAAa,CAAC,CAAC,CAAC,WAAW;IACzB,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EACpD,EAAE,CACH,CACF;CACF,CAAC,CAAA;AAIF,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;IACjD,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK;IAC3B,aAAa,CAAC,CAAC,CAAC,GAAG,CACjB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAQ,CACvC,CACF;IACD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC7D,CAAC,CAAA;AAQF,4CAA4C;AAC5C,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAE3D,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAA","sourcesContent":["/*\n * THIS FILE WAS GENERATED BY \"@atproto/lex\". DO NOT EDIT.\n */\n\nimport { l } from '@atproto/lex'\nimport * as UnspeccedDefs from './defs.defs.js'\n\nconst $nsid = 'app.bsky.unspecced.getTrends'\n\nexport { $nsid }\n\nexport const $params = /*#__PURE__*/ l.params({\n limit: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.withDefault(\n /*#__PURE__*/ l.integer({ minimum: 1, maximum: 25 }),\n 10,\n ),\n ),\n})\n\nexport type $Params = l.InferOutput<typeof $params>\n\nexport const $output = /*#__PURE__*/ l.jsonPayload({\n trends: /*#__PURE__*/ l.array(\n /*#__PURE__*/ l.ref<UnspeccedDefs.TrendView>(\n (() => UnspeccedDefs.trendView) as any,\n ),\n ),\n recIdStr: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),\n})\n\nexport type $Output<B = l.BinaryData> = l.InferPayload<typeof $output, B>\nexport type $OutputBody<B = l.BinaryData> = l.InferPayloadBody<\n typeof $output,\n B\n>\n\n/** Get the current trends on the network */\nconst main = /*#__PURE__*/ l.query($nsid, $params, $output)\n\nexport { main }\n\nexport const $lxm = $nsid\n"]}
|
|
@@ -11,6 +11,7 @@ export declare const $params: l.ParamsSchema<{
|
|
|
11
11
|
export type $Params = l.InferOutput<typeof $params>;
|
|
12
12
|
export declare const $output: l.Payload<"application/json", l.ObjectSchema<{
|
|
13
13
|
trends: l.ArraySchema<l.RefSchema<l.Validator<UnspeccedDefs.SkeletonTrend, UnspeccedDefs.SkeletonTrend>>>;
|
|
14
|
+
recIdStr: l.OptionalSchema<l.StringSchema<{}>>;
|
|
14
15
|
}>>;
|
|
15
16
|
export type $Output<B = l.BinaryData> = l.InferPayload<typeof $output, B>;
|
|
16
17
|
export type $OutputBody<B = l.BinaryData> = l.InferPayloadBody<typeof $output, B>;
|
|
@@ -22,6 +23,7 @@ declare const main: l.Query<"app.bsky.unspecced.getTrendsSkeleton", l.ParamsSche
|
|
|
22
23
|
readonly limit: l.OptionalSchema<l.WithDefaultSchema<l.IntegerSchema>>;
|
|
23
24
|
}>, l.Payload<"application/json", l.ObjectSchema<{
|
|
24
25
|
trends: l.ArraySchema<l.RefSchema<l.Validator<UnspeccedDefs.SkeletonTrend, UnspeccedDefs.SkeletonTrend>>>;
|
|
26
|
+
recIdStr: l.OptionalSchema<l.StringSchema<{}>>;
|
|
25
27
|
}>>, undefined>;
|
|
26
28
|
export { main };
|
|
27
29
|
export declare const $lxm = "app.bsky.unspecced.getTrendsSkeleton";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTrendsSkeleton.defs.d.ts","sourceRoot":"","sources":["../../../../../src/lexicons/app/bsky/unspecced/getTrendsSkeleton.defs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAE/C,QAAA,MAAM,KAAK,yCAAyC,CAAA;AAEpD,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,eAAO,MAAM,OAAO;;;;;EAQlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAA;AAEnD,eAAO,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"getTrendsSkeleton.defs.d.ts","sourceRoot":"","sources":["../../../../../src/lexicons/app/bsky/unspecced/getTrendsSkeleton.defs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAE/C,QAAA,MAAM,KAAK,yCAAyC,CAAA;AAEpD,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,eAAO,MAAM,OAAO;;;;;EAQlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,OAAO,CAAC,CAAA;AAEnD,eAAO,MAAM,OAAO;;;GAOlB,CAAA;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAA;AACzE,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,gBAAgB,CAC5D,OAAO,OAAO,EACd,CAAC,CACF,CAAA;AAED,8HAA8H;AAC9H,QAAA,MAAM,IAAI;;;;;;;;eAAiD,CAAA;AAE3D,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,eAAO,MAAM,IAAI,yCAAQ,CAAA"}
|
|
@@ -14,6 +14,7 @@ export const $params = /*#__PURE__*/ l.params({
|
|
|
14
14
|
export const $output = /*#__PURE__*/ l.jsonPayload({
|
|
15
15
|
trends: /*#__PURE__*/ l.array(
|
|
16
16
|
/*#__PURE__*/ l.ref((() => UnspeccedDefs.skeletonTrend))),
|
|
17
|
+
recIdStr: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),
|
|
17
18
|
});
|
|
18
19
|
/** Get the skeleton of trends on the network. Intended to be called and then hydrated through app.bsky.unspecced.getTrends */
|
|
19
20
|
const main = /*#__PURE__*/ l.query($nsid, $params, $output);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTrendsSkeleton.defs.js","sourceRoot":"","sources":["../../../../../src/lexicons/app/bsky/unspecced/getTrendsSkeleton.defs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAE/C,MAAM,KAAK,GAAG,sCAAsC,CAAA;AAEpD,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ;IAC7B,aAAa,CAAC,CAAC,CAAC,WAAW;IACzB,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EACpD,EAAE,CACH,CACF;CACF,CAAC,CAAA;AAIF,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;IACjD,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK;IAC3B,aAAa,CAAC,CAAC,CAAC,GAAG,CACjB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,aAAa,CAAQ,CAC3C,CACF;
|
|
1
|
+
{"version":3,"file":"getTrendsSkeleton.defs.js","sourceRoot":"","sources":["../../../../../src/lexicons/app/bsky/unspecced/getTrendsSkeleton.defs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAE/C,MAAM,KAAK,GAAG,sCAAsC,CAAA;AAEpD,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ;IAC7B,aAAa,CAAC,CAAC,CAAC,WAAW;IACzB,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EACpD,EAAE,CACH,CACF;CACF,CAAC,CAAA;AAIF,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;IACjD,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK;IAC3B,aAAa,CAAC,CAAC,CAAC,GAAG,CACjB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,aAAa,CAAQ,CAC3C,CACF;IACD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC7D,CAAC,CAAA;AAQF,8HAA8H;AAC9H,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAE3D,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAA","sourcesContent":["/*\n * THIS FILE WAS GENERATED BY \"@atproto/lex\". DO NOT EDIT.\n */\n\nimport { l } from '@atproto/lex'\nimport * as UnspeccedDefs from './defs.defs.js'\n\nconst $nsid = 'app.bsky.unspecced.getTrendsSkeleton'\n\nexport { $nsid }\n\nexport const $params = /*#__PURE__*/ l.params({\n viewer: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string({ format: 'did' })),\n limit: /*#__PURE__*/ l.optional(\n /*#__PURE__*/ l.withDefault(\n /*#__PURE__*/ l.integer({ minimum: 1, maximum: 25 }),\n 10,\n ),\n ),\n})\n\nexport type $Params = l.InferOutput<typeof $params>\n\nexport const $output = /*#__PURE__*/ l.jsonPayload({\n trends: /*#__PURE__*/ l.array(\n /*#__PURE__*/ l.ref<UnspeccedDefs.SkeletonTrend>(\n (() => UnspeccedDefs.skeletonTrend) as any,\n ),\n ),\n recIdStr: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string()),\n})\n\nexport type $Output<B = l.BinaryData> = l.InferPayload<typeof $output, B>\nexport type $OutputBody<B = l.BinaryData> = l.InferPayloadBody<\n typeof $output,\n B\n>\n\n/** Get the skeleton of trends on the network. Intended to be called and then hydrated through app.bsky.unspecced.getTrends */\nconst main = /*#__PURE__*/ l.query($nsid, $params, $output)\n\nexport { main }\n\nexport const $lxm = $nsid\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/bsky",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.263",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Reference implementation of app.bsky App View (Bluesky API)",
|
|
6
6
|
"keywords": [
|
|
@@ -61,15 +61,15 @@
|
|
|
61
61
|
"undici": "^8.5.0",
|
|
62
62
|
"zod": "3.23.8",
|
|
63
63
|
"@atproto-labs/fetch-node": "^0.3.5",
|
|
64
|
-
"@atproto/api": "^0.20.30",
|
|
65
64
|
"@atproto-labs/xrpc-utils": "^0.1.9",
|
|
65
|
+
"@atproto/common": "^0.7.2",
|
|
66
66
|
"@atproto/crypto": "^0.5.4",
|
|
67
|
-
"@atproto/
|
|
68
|
-
"@atproto/lex": "^0.3.0",
|
|
67
|
+
"@atproto/api": "^0.20.30",
|
|
69
68
|
"@atproto/did": "^0.5.4",
|
|
70
|
-
"@atproto/
|
|
71
|
-
"@atproto/
|
|
69
|
+
"@atproto/lex": "^0.3.0",
|
|
70
|
+
"@atproto/identity": "^0.5.6",
|
|
72
71
|
"@atproto/repo": "^0.10.6",
|
|
72
|
+
"@atproto/sync": "^0.3.12",
|
|
73
73
|
"@atproto/syntax": "^0.7.2",
|
|
74
74
|
"@atproto/xrpc-server": "^0.11.10"
|
|
75
75
|
},
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"@types/pg": "^8.15.5",
|
|
86
86
|
"@types/qs": "^6.9.7",
|
|
87
87
|
"vitest": "^4.0.16",
|
|
88
|
-
"@atproto/pds": "^0.5.
|
|
88
|
+
"@atproto/pds": "^0.5.20"
|
|
89
89
|
},
|
|
90
90
|
"scripts": {
|
|
91
91
|
"codegen:buf": "buf generate ../bsync/proto && buf generate ./proto",
|