@atproto/bsky 0.0.210 → 0.0.211

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE.txt +1 -1
  3. package/dist/api/app/bsky/draft/createDraft.d.ts +4 -0
  4. package/dist/api/app/bsky/draft/createDraft.d.ts.map +1 -0
  5. package/dist/api/app/bsky/draft/createDraft.js +38 -0
  6. package/dist/api/app/bsky/draft/createDraft.js.map +1 -0
  7. package/dist/api/app/bsky/draft/deleteDraft.d.ts +4 -0
  8. package/dist/api/app/bsky/draft/deleteDraft.d.ts.map +1 -0
  9. package/dist/api/app/bsky/draft/deleteDraft.js +19 -0
  10. package/dist/api/app/bsky/draft/deleteDraft.js.map +1 -0
  11. package/dist/api/app/bsky/draft/getDrafts.d.ts +4 -0
  12. package/dist/api/app/bsky/draft/getDrafts.d.ts.map +1 -0
  13. package/dist/api/app/bsky/draft/getDrafts.js +36 -0
  14. package/dist/api/app/bsky/draft/getDrafts.js.map +1 -0
  15. package/dist/api/app/bsky/draft/updateDraft.d.ts +4 -0
  16. package/dist/api/app/bsky/draft/updateDraft.d.ts.map +1 -0
  17. package/dist/api/app/bsky/draft/updateDraft.js +24 -0
  18. package/dist/api/app/bsky/draft/updateDraft.js.map +1 -0
  19. package/dist/api/app/bsky/feed/searchPosts.js +3 -3
  20. package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
  21. package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.d.ts.map +1 -1
  22. package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js +9 -8
  23. package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js.map +1 -1
  24. package/dist/api/app/bsky/unspecced/getPostThreadV2.js +1 -1
  25. package/dist/api/app/bsky/unspecced/getPostThreadV2.js.map +1 -1
  26. package/dist/api/app/bsky/unspecced/getSuggestedFeeds.d.ts.map +1 -1
  27. package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js +3 -4
  28. package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js.map +1 -1
  29. package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.d.ts.map +1 -1
  30. package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js +9 -8
  31. package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js.map +1 -1
  32. package/dist/api/app/bsky/unspecced/getSuggestedUsers.d.ts.map +1 -1
  33. package/dist/api/app/bsky/unspecced/getSuggestedUsers.js +37 -20
  34. package/dist/api/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
  35. package/dist/api/app/bsky/unspecced/getTrendingTopics.d.ts.map +1 -1
  36. package/dist/api/app/bsky/unspecced/getTrendingTopics.js +6 -2
  37. package/dist/api/app/bsky/unspecced/getTrendingTopics.js.map +1 -1
  38. package/dist/api/app/bsky/unspecced/getTrends.d.ts.map +1 -1
  39. package/dist/api/app/bsky/unspecced/getTrends.js +9 -8
  40. package/dist/api/app/bsky/unspecced/getTrends.js.map +1 -1
  41. package/dist/api/index.d.ts.map +1 -1
  42. package/dist/api/index.js +8 -0
  43. package/dist/api/index.js.map +1 -1
  44. package/dist/config.d.ts +6 -4
  45. package/dist/config.d.ts.map +1 -1
  46. package/dist/config.js +18 -21
  47. package/dist/config.js.map +1 -1
  48. package/dist/data-plane/bsync/index.js +38 -0
  49. package/dist/data-plane/bsync/index.js.map +1 -1
  50. package/dist/data-plane/server/db/database-schema.d.ts +2 -1
  51. package/dist/data-plane/server/db/database-schema.d.ts.map +1 -1
  52. package/dist/data-plane/server/db/database-schema.js.map +1 -1
  53. package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.d.ts +4 -0
  54. package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.d.ts.map +1 -0
  55. package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.js +25 -0
  56. package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.js.map +1 -0
  57. package/dist/data-plane/server/db/migrations/index.d.ts +1 -0
  58. package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
  59. package/dist/data-plane/server/db/migrations/index.js +2 -1
  60. package/dist/data-plane/server/db/migrations/index.js.map +1 -1
  61. package/dist/data-plane/server/db/pagination.d.ts +9 -0
  62. package/dist/data-plane/server/db/pagination.d.ts.map +1 -1
  63. package/dist/data-plane/server/db/pagination.js +7 -1
  64. package/dist/data-plane/server/db/pagination.js.map +1 -1
  65. package/dist/data-plane/server/db/tables/draft.d.ts +12 -0
  66. package/dist/data-plane/server/db/tables/draft.d.ts.map +1 -0
  67. package/dist/data-plane/server/db/tables/draft.js +5 -0
  68. package/dist/data-plane/server/db/tables/draft.js.map +1 -0
  69. package/dist/data-plane/server/indexing/index.d.ts +2 -0
  70. package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
  71. package/dist/data-plane/server/indexing/index.js +2 -0
  72. package/dist/data-plane/server/indexing/index.js.map +1 -1
  73. package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts +7 -0
  74. package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts.map +1 -0
  75. package/dist/data-plane/server/indexing/plugins/germ-declaration.js +75 -0
  76. package/dist/data-plane/server/indexing/plugins/germ-declaration.js.map +1 -0
  77. package/dist/data-plane/server/routes/drafts.d.ts +6 -0
  78. package/dist/data-plane/server/routes/drafts.d.ts.map +1 -0
  79. package/dist/data-plane/server/routes/drafts.js +30 -0
  80. package/dist/data-plane/server/routes/drafts.js.map +1 -0
  81. package/dist/data-plane/server/routes/index.d.ts.map +1 -1
  82. package/dist/data-plane/server/routes/index.js +2 -0
  83. package/dist/data-plane/server/routes/index.js.map +1 -1
  84. package/dist/data-plane/server/routes/interactions.d.ts.map +1 -1
  85. package/dist/data-plane/server/routes/interactions.js +6 -0
  86. package/dist/data-plane/server/routes/interactions.js.map +1 -1
  87. package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
  88. package/dist/data-plane/server/routes/profile.js +5 -1
  89. package/dist/data-plane/server/routes/profile.js.map +1 -1
  90. package/dist/data-plane/server/routes/records.d.ts.map +1 -1
  91. package/dist/data-plane/server/routes/records.js +1 -0
  92. package/dist/data-plane/server/routes/records.js.map +1 -1
  93. package/dist/data-plane/server/util.d.ts +6 -6
  94. package/dist/feature-gates.d.ts +17 -14
  95. package/dist/feature-gates.d.ts.map +1 -1
  96. package/dist/feature-gates.js +67 -35
  97. package/dist/feature-gates.js.map +1 -1
  98. package/dist/hydration/actor.d.ts +5 -0
  99. package/dist/hydration/actor.d.ts.map +1 -1
  100. package/dist/hydration/actor.js +13 -0
  101. package/dist/hydration/actor.js.map +1 -1
  102. package/dist/hydration/hydrator.d.ts +1 -1
  103. package/dist/hydration/hydrator.d.ts.map +1 -1
  104. package/dist/hydration/hydrator.js +6 -1
  105. package/dist/hydration/hydrator.js.map +1 -1
  106. package/dist/index.js +3 -3
  107. package/dist/index.js.map +1 -1
  108. package/dist/lexicon/index.d.ts +18 -0
  109. package/dist/lexicon/index.d.ts.map +1 -1
  110. package/dist/lexicon/index.js +55 -1
  111. package/dist/lexicon/index.js.map +1 -1
  112. package/dist/lexicon/lexicons.d.ts +1156 -278
  113. package/dist/lexicon/lexicons.d.ts.map +1 -1
  114. package/dist/lexicon/lexicons.js +455 -2
  115. package/dist/lexicon/lexicons.js.map +1 -1
  116. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +19 -1
  117. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  118. package/dist/lexicon/types/app/bsky/actor/defs.js +18 -0
  119. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  120. package/dist/lexicon/types/app/bsky/draft/createDraft.d.ts +27 -0
  121. package/dist/lexicon/types/app/bsky/draft/createDraft.d.ts.map +1 -0
  122. package/dist/lexicon/types/app/bsky/draft/createDraft.js +7 -0
  123. package/dist/lexicon/types/app/bsky/draft/createDraft.js.map +1 -0
  124. package/dist/lexicon/types/app/bsky/draft/defs.d.ts +106 -0
  125. package/dist/lexicon/types/app/bsky/draft/defs.d.ts.map +1 -0
  126. package/dist/lexicon/types/app/bsky/draft/defs.js +97 -0
  127. package/dist/lexicon/types/app/bsky/draft/defs.js.map +1 -0
  128. package/dist/lexicon/types/app/bsky/draft/deleteDraft.d.ts +14 -0
  129. package/dist/lexicon/types/app/bsky/draft/deleteDraft.d.ts.map +1 -0
  130. package/dist/lexicon/types/app/bsky/draft/deleteDraft.js +7 -0
  131. package/dist/lexicon/types/app/bsky/draft/deleteDraft.js.map +1 -0
  132. package/dist/lexicon/types/app/bsky/draft/getDrafts.d.ts +24 -0
  133. package/dist/lexicon/types/app/bsky/draft/getDrafts.d.ts.map +1 -0
  134. package/dist/lexicon/types/app/bsky/draft/getDrafts.js +7 -0
  135. package/dist/lexicon/types/app/bsky/draft/getDrafts.js.map +1 -0
  136. package/dist/lexicon/types/app/bsky/draft/updateDraft.d.ts +15 -0
  137. package/dist/lexicon/types/app/bsky/draft/updateDraft.d.ts.map +1 -0
  138. package/dist/lexicon/types/app/bsky/draft/updateDraft.js +7 -0
  139. package/dist/lexicon/types/app/bsky/draft/updateDraft.js.map +1 -0
  140. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.d.ts +1 -1
  141. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
  142. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.d.ts +1 -1
  143. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.js.map +1 -1
  144. package/dist/lexicon/types/com/germnetwork/declaration.d.ts +24 -0
  145. package/dist/lexicon/types/com/germnetwork/declaration.d.ts.map +1 -0
  146. package/dist/lexicon/types/com/germnetwork/declaration.js +27 -0
  147. package/dist/lexicon/types/com/germnetwork/declaration.js.map +1 -0
  148. package/dist/proto/bsky_connect.d.ts +22 -1
  149. package/dist/proto/bsky_connect.d.ts.map +1 -1
  150. package/dist/proto/bsky_connect.js +21 -0
  151. package/dist/proto/bsky_connect.js.map +1 -1
  152. package/dist/proto/bsky_pb.d.ts +119 -0
  153. package/dist/proto/bsky_pb.d.ts.map +1 -1
  154. package/dist/proto/bsky_pb.js +343 -5
  155. package/dist/proto/bsky_pb.js.map +1 -1
  156. package/dist/stash.d.ts +1 -0
  157. package/dist/stash.d.ts.map +1 -1
  158. package/dist/stash.js +1 -0
  159. package/dist/stash.js.map +1 -1
  160. package/dist/views/index.d.ts.map +1 -1
  161. package/dist/views/index.js +15 -3
  162. package/dist/views/index.js.map +1 -1
  163. package/package.json +10 -10
  164. package/proto/bsky.proto +39 -1
  165. package/src/api/app/bsky/draft/createDraft.ts +46 -0
  166. package/src/api/app/bsky/draft/deleteDraft.ts +19 -0
  167. package/src/api/app/bsky/draft/getDrafts.ts +46 -0
  168. package/src/api/app/bsky/draft/updateDraft.ts +26 -0
  169. package/src/api/app/bsky/feed/searchPosts.ts +4 -4
  170. package/src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts +10 -10
  171. package/src/api/app/bsky/unspecced/getPostThreadV2.ts +2 -2
  172. package/src/api/app/bsky/unspecced/getSuggestedFeeds.ts +4 -5
  173. package/src/api/app/bsky/unspecced/getSuggestedStarterPacks.ts +10 -10
  174. package/src/api/app/bsky/unspecced/getSuggestedUsers.ts +60 -25
  175. package/src/api/app/bsky/unspecced/getTrendingTopics.ts +9 -5
  176. package/src/api/app/bsky/unspecced/getTrends.ts +10 -10
  177. package/src/api/index.ts +8 -0
  178. package/src/config.ts +23 -26
  179. package/src/data-plane/bsync/index.ts +47 -0
  180. package/src/data-plane/server/db/database-schema.ts +3 -1
  181. package/src/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.ts +24 -0
  182. package/src/data-plane/server/db/migrations/index.ts +1 -0
  183. package/src/data-plane/server/db/pagination.ts +8 -0
  184. package/src/data-plane/server/db/tables/draft.ts +11 -0
  185. package/src/data-plane/server/indexing/index.ts +3 -0
  186. package/src/data-plane/server/indexing/plugins/germ-declaration.ts +63 -0
  187. package/src/data-plane/server/routes/drafts.ts +37 -0
  188. package/src/data-plane/server/routes/index.ts +2 -0
  189. package/src/data-plane/server/routes/interactions.ts +6 -0
  190. package/src/data-plane/server/routes/profile.ts +8 -0
  191. package/src/data-plane/server/routes/records.ts +1 -0
  192. package/src/feature-gates.ts +83 -35
  193. package/src/hydration/actor.ts +26 -2
  194. package/src/hydration/hydrator.ts +8 -1
  195. package/src/index.ts +3 -3
  196. package/src/lexicon/index.ts +72 -0
  197. package/src/lexicon/lexicons.ts +465 -2
  198. package/src/lexicon/types/app/bsky/actor/defs.ts +37 -0
  199. package/src/lexicon/types/app/bsky/draft/createDraft.ts +46 -0
  200. package/src/lexicon/types/app/bsky/draft/defs.ts +208 -0
  201. package/src/lexicon/types/app/bsky/draft/deleteDraft.ts +33 -0
  202. package/src/lexicon/types/app/bsky/draft/getDrafts.ts +42 -0
  203. package/src/lexicon/types/app/bsky/draft/updateDraft.ts +34 -0
  204. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsers.ts +1 -1
  205. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts +1 -1
  206. package/src/lexicon/types/com/germnetwork/declaration.ts +53 -0
  207. package/src/proto/bsky_connect.ts +22 -1
  208. package/src/proto/bsky_pb.ts +235 -0
  209. package/src/stash.ts +3 -0
  210. package/src/views/index.ts +15 -3
  211. package/tests/views/__snapshots__/profile.test.ts.snap +7 -0
  212. package/tests/views/age-assurance-v2.test.ts +0 -2
  213. package/tests/views/age-assurance.test.ts +0 -2
  214. package/tests/views/drafts.test.ts +293 -0
  215. package/tests/views/profile.test.ts +58 -1
  216. package/tsconfig.build.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @atproto/bsky
2
2
 
3
+ ## 0.0.211
4
+
5
+ ### Patch Changes
6
+
7
+ - [#4565](https://github.com/bluesky-social/atproto/pull/4565) [`cbd5837`](https://github.com/bluesky-social/atproto/commit/cbd5837f015e6b5e098a60098faea82e7f9419f3) Thanks [@cuducos](https://github.com/cuducos)! - Re-add `recId` to suggested users (now, as string)
8
+
9
+ - [#4547](https://github.com/bluesky-social/atproto/pull/4547) [`d8e5363`](https://github.com/bluesky-social/atproto/commit/d8e53636c84da6dd3dd69e1d260f4fa617f3883c) Thanks [@cuducos](https://github.com/cuducos)! - Removes `recId` from suggested users — we need it as a string, so we're gonna re-add it as string (instead of integer) later.
10
+
11
+ - [#4415](https://github.com/bluesky-social/atproto/pull/4415) [`9bdd358`](https://github.com/bluesky-social/atproto/commit/9bdd35881aa7efce6595ef708ba13d99c473d114) Thanks [@bnewbold](https://github.com/bnewbold)! - support for Germ Networks chat declaration records
12
+
13
+ - [#4526](https://github.com/bluesky-social/atproto/pull/4526) [`e6e43f3`](https://github.com/bluesky-social/atproto/commit/e6e43f3ad3594e7cb24e2f3effe5ef4b1696c8ff) Thanks [@cuducos](https://github.com/cuducos)! - Swaps StatSig for GrowthBook in AppView
14
+
15
+ - [#4576](https://github.com/bluesky-social/atproto/pull/4576) [`ce356cd`](https://github.com/bluesky-social/atproto/commit/ce356cde55c9ff46758d0a6f39397d6710509b40) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Use requester DID to accurately perform personalized suggestions
16
+
17
+ - [#4562](https://github.com/bluesky-social/atproto/pull/4562) [`7310b97`](https://github.com/bluesky-social/atproto/commit/7310b9704de678a3b389a741784d58bb7f79b10b) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Improve performances of `noUndefinedVals` utility
18
+
19
+ - Updated dependencies [[`cbd5837`](https://github.com/bluesky-social/atproto/commit/cbd5837f015e6b5e098a60098faea82e7f9419f3), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101), [`d8e5363`](https://github.com/bluesky-social/atproto/commit/d8e53636c84da6dd3dd69e1d260f4fa617f3883c), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101), [`9bdd358`](https://github.com/bluesky-social/atproto/commit/9bdd35881aa7efce6595ef708ba13d99c473d114), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101)]:
20
+ - @atproto/api@0.18.17
21
+ - @atproto/syntax@0.4.3
22
+ - @atproto/lexicon@0.6.1
23
+ - @atproto/common@0.5.9
24
+ - @atproto/xrpc-server@0.10.10
25
+
3
26
  ## 0.0.210
4
27
 
5
28
  ### Patch Changes
package/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  Dual MIT/Apache-2.0 License
2
2
 
3
- Copyright (c) 2022-2025 Bluesky Social PBC, and Contributors
3
+ Copyright (c) 2022-2026 Bluesky Social PBC, and Contributors
4
4
 
5
5
  Except as otherwise noted in individual files, this software is licensed under the MIT license (<http://opensource.org/licenses/MIT>), or the Apache License, Version 2.0 (<http://www.apache.org/licenses/LICENSE-2.0>).
6
6
 
@@ -0,0 +1,4 @@
1
+ import { AppContext } from '../../../../context';
2
+ import { Server } from '../../../../lexicon';
3
+ export default function (server: Server, ctx: AppContext): void;
4
+ //# sourceMappingURL=createDraft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDraft.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/draft/createDraft.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAI5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAsCvD"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = default_1;
4
+ const common_1 = require("@atproto/common");
5
+ const xrpc_server_1 = require("@atproto/xrpc-server");
6
+ const stash_1 = require("../../../../stash");
7
+ function default_1(server, ctx) {
8
+ server.app.bsky.draft.createDraft({
9
+ auth: ctx.authVerifier.standard,
10
+ handler: async ({ input, auth }) => {
11
+ const actorDid = auth.credentials.iss;
12
+ const { draft } = input.body;
13
+ const res = await ctx.dataplane.getCountsForUsers({
14
+ dids: [actorDid],
15
+ });
16
+ const draftsCount = res.drafts[0];
17
+ if (draftsCount >= ctx.cfg.draftsLimit) {
18
+ throw new xrpc_server_1.InvalidRequestError(`Drafts limit reached`, 'DraftLimitReached');
19
+ }
20
+ const draftId = common_1.TID.nextStr();
21
+ const draftWithId = {
22
+ id: draftId,
23
+ draft,
24
+ };
25
+ await ctx.stashClient.create({
26
+ actorDid,
27
+ namespace: stash_1.Namespaces.AppBskyDraftDefsDraftWithId,
28
+ payload: draftWithId,
29
+ key: draftId,
30
+ });
31
+ return {
32
+ encoding: 'application/json',
33
+ body: { id: draftId },
34
+ };
35
+ },
36
+ });
37
+ }
38
+ //# sourceMappingURL=createDraft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDraft.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/draft/createDraft.ts"],"names":[],"mappings":";;AAOA,4BAsCC;AA7CD,4CAAqC;AACrC,sDAA0D;AAI1D,6CAA8C;AAE9C,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAChC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ;QAC/B,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;YACrC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAA;YAE5B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC;gBAChD,IAAI,EAAE,CAAC,QAAQ,CAAC;aACjB,CAAC,CAAA;YAEF,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACjC,IAAI,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACvC,MAAM,IAAI,iCAAmB,CAC3B,sBAAsB,EACtB,mBAAmB,CACpB,CAAA;YACH,CAAC;YAED,MAAM,OAAO,GAAG,YAAG,CAAC,OAAO,EAAE,CAAA;YAC7B,MAAM,WAAW,GAAgB;gBAC/B,EAAE,EAAE,OAAO;gBACX,KAAK;aACN,CAAA;YAED,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;gBAC3B,QAAQ;gBACR,SAAS,EAAE,kBAAU,CAAC,2BAA2B;gBACjD,OAAO,EAAE,WAAW;gBACpB,GAAG,EAAE,OAAO;aACb,CAAC,CAAA;YAEF,OAAO;gBACL,QAAQ,EAAE,kBAA2B;gBACrC,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;aACtB,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { TID } from '@atproto/common'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context'\nimport { Server } from '../../../../lexicon'\nimport { DraftWithId } from '../../../../lexicon/types/app/bsky/draft/defs'\nimport { Namespaces } from '../../../../stash'\n\nexport default function (server: Server, ctx: AppContext) {\n server.app.bsky.draft.createDraft({\n auth: ctx.authVerifier.standard,\n handler: async ({ input, auth }) => {\n const actorDid = auth.credentials.iss\n const { draft } = input.body\n\n const res = await ctx.dataplane.getCountsForUsers({\n dids: [actorDid],\n })\n\n const draftsCount = res.drafts[0]\n if (draftsCount >= ctx.cfg.draftsLimit) {\n throw new InvalidRequestError(\n `Drafts limit reached`,\n 'DraftLimitReached',\n )\n }\n\n const draftId = TID.nextStr()\n const draftWithId: DraftWithId = {\n id: draftId,\n draft,\n }\n\n await ctx.stashClient.create({\n actorDid,\n namespace: Namespaces.AppBskyDraftDefsDraftWithId,\n payload: draftWithId,\n key: draftId,\n })\n\n return {\n encoding: 'application/json' as const,\n body: { id: draftId },\n }\n },\n })\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { AppContext } from '../../../../context';
2
+ import { Server } from '../../../../lexicon';
3
+ export default function (server: Server, ctx: AppContext): void;
4
+ //# sourceMappingURL=deleteDraft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteDraft.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/draft/deleteDraft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAG5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAcvD"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = default_1;
4
+ const stash_1 = require("../../../../stash");
5
+ function default_1(server, ctx) {
6
+ server.app.bsky.draft.deleteDraft({
7
+ auth: ctx.authVerifier.standard,
8
+ handler: async ({ input, auth }) => {
9
+ const actorDid = auth.credentials.iss;
10
+ const { id } = input.body;
11
+ await ctx.stashClient.delete({
12
+ actorDid,
13
+ namespace: stash_1.Namespaces.AppBskyDraftDefsDraftWithId,
14
+ key: id,
15
+ });
16
+ },
17
+ });
18
+ }
19
+ //# sourceMappingURL=deleteDraft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteDraft.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/draft/deleteDraft.ts"],"names":[],"mappings":";;AAIA,4BAcC;AAhBD,6CAA8C;AAE9C,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAChC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ;QAC/B,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;YACrC,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAA;YAEzB,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;gBAC3B,QAAQ;gBACR,SAAS,EAAE,kBAAU,CAAC,2BAA2B;gBACjD,GAAG,EAAE,EAAE;aACR,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { AppContext } from '../../../../context'\nimport { Server } from '../../../../lexicon'\nimport { Namespaces } from '../../../../stash'\n\nexport default function (server: Server, ctx: AppContext) {\n server.app.bsky.draft.deleteDraft({\n auth: ctx.authVerifier.standard,\n handler: async ({ input, auth }) => {\n const actorDid = auth.credentials.iss\n const { id } = input.body\n\n await ctx.stashClient.delete({\n actorDid,\n namespace: Namespaces.AppBskyDraftDefsDraftWithId,\n key: id,\n })\n },\n })\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { AppContext } from '../../../../context';
2
+ import { Server } from '../../../../lexicon';
3
+ export default function (server: Server, ctx: AppContext): void;
4
+ //# sourceMappingURL=getDrafts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDrafts.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/draft/getDrafts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAM5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAqCvD"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = default_1;
4
+ const lexicon_1 = require("@atproto/lexicon");
5
+ function default_1(server, ctx) {
6
+ server.app.bsky.draft.getDrafts({
7
+ auth: ctx.authVerifier.standard,
8
+ handler: async ({ params, auth }) => {
9
+ const viewer = auth.credentials.iss;
10
+ const { cursor, drafts } = await ctx.hydrator.dataplane.getActorDrafts({
11
+ actorDid: viewer,
12
+ limit: params.limit,
13
+ cursor: params.cursor,
14
+ });
15
+ const draftViews = drafts.map((d) => {
16
+ const draftWithId = (0, lexicon_1.jsonStringToLex)(Buffer.from(d.payload).toString('utf8'));
17
+ return {
18
+ id: draftWithId.id,
19
+ draft: draftWithId.draft,
20
+ // The date should always be present, but we avoid required fields on protobuf by convention,
21
+ // so requires a fallback value to please TS.
22
+ createdAt: d.createdAt?.toDate().toISOString() ?? new Date(0).toISOString(),
23
+ updatedAt: d.updatedAt?.toDate().toISOString() ?? new Date(0).toISOString(),
24
+ };
25
+ });
26
+ return {
27
+ encoding: 'application/json',
28
+ body: {
29
+ cursor,
30
+ drafts: draftViews,
31
+ },
32
+ };
33
+ },
34
+ });
35
+ }
36
+ //# sourceMappingURL=getDrafts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDrafts.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/draft/getDrafts.ts"],"names":[],"mappings":";;AAQA,4BAqCC;AA7CD,8CAAkD;AAQlD,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAC9B,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ;QAC/B,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;YAEnC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC;gBACrE,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAA;YAEF,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAa,EAAE;gBAC7C,MAAM,WAAW,GAAG,IAAA,yBAAe,EACjC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CACzB,CAAA;gBAChB,OAAO;oBACL,EAAE,EAAE,WAAW,CAAC,EAAE;oBAClB,KAAK,EAAE,WAAW,CAAC,KAAK;oBACxB,6FAA6F;oBAC7F,6CAA6C;oBAC7C,SAAS,EACP,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;oBAClE,SAAS,EACP,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;iBACnE,CAAA;YACH,CAAC,CAAC,CAAA;YAEF,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE;oBACJ,MAAM;oBACN,MAAM,EAAE,UAAU;iBACnB;aACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { jsonStringToLex } from '@atproto/lexicon'\nimport { AppContext } from '../../../../context'\nimport { Server } from '../../../../lexicon'\nimport {\n DraftView,\n DraftWithId,\n} from '../../../../lexicon/types/app/bsky/draft/defs'\n\nexport default function (server: Server, ctx: AppContext) {\n server.app.bsky.draft.getDrafts({\n auth: ctx.authVerifier.standard,\n handler: async ({ params, auth }) => {\n const viewer = auth.credentials.iss\n\n const { cursor, drafts } = await ctx.hydrator.dataplane.getActorDrafts({\n actorDid: viewer,\n limit: params.limit,\n cursor: params.cursor,\n })\n\n const draftViews = drafts.map((d): DraftView => {\n const draftWithId = jsonStringToLex(\n Buffer.from(d.payload).toString('utf8'),\n ) as DraftWithId\n return {\n id: draftWithId.id,\n draft: draftWithId.draft,\n // The date should always be present, but we avoid required fields on protobuf by convention,\n // so requires a fallback value to please TS.\n createdAt:\n d.createdAt?.toDate().toISOString() ?? new Date(0).toISOString(),\n updatedAt:\n d.updatedAt?.toDate().toISOString() ?? new Date(0).toISOString(),\n }\n })\n\n return {\n encoding: 'application/json',\n body: {\n cursor,\n drafts: draftViews,\n },\n }\n },\n })\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { AppContext } from '../../../../context';
2
+ import { Server } from '../../../../lexicon';
3
+ export default function (server: Server, ctx: AppContext): void;
4
+ //# sourceMappingURL=updateDraft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateDraft.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/draft/updateDraft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAI5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAoBvD"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = default_1;
4
+ const stash_1 = require("../../../../stash");
5
+ function default_1(server, ctx) {
6
+ server.app.bsky.draft.updateDraft({
7
+ auth: ctx.authVerifier.standard,
8
+ handler: async ({ input, auth }) => {
9
+ const actorDid = auth.credentials.iss;
10
+ const { draft: draftWithId } = input.body;
11
+ // NOTE: update drafts does not enforce limits, because if it did, we would not allow updating when the limit is reached,
12
+ // which is not the desired behavior.
13
+ // But this means the consumer of the stash operations can't do an upsert behavior on update, and needs instead to drop non-existent
14
+ // drafts. This avoid misusing the update as a create that does not check limits.
15
+ await ctx.stashClient.update({
16
+ actorDid,
17
+ namespace: stash_1.Namespaces.AppBskyDraftDefsDraftWithId,
18
+ payload: draftWithId,
19
+ key: draftWithId.id,
20
+ });
21
+ },
22
+ });
23
+ }
24
+ //# sourceMappingURL=updateDraft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateDraft.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/draft/updateDraft.ts"],"names":[],"mappings":";;AAKA,4BAoBC;AAtBD,6CAA8C;AAE9C,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAChC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ;QAC/B,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;YACrC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,IAAI,CAAA;YAEzC,yHAAyH;YACzH,qCAAqC;YACrC,oIAAoI;YACpI,iFAAiF;YAEjF,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;gBAC3B,QAAQ;gBACR,SAAS,EAAE,kBAAU,CAAC,2BAA2B;gBACjD,OAAO,EAAE,WAAiC;gBAC1C,GAAG,EAAE,WAAW,CAAC,EAAE;aACpB,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { AppContext } from '../../../../context'\nimport { Server } from '../../../../lexicon'\nimport { DraftWithId } from '../../../../lexicon/types/app/bsky/draft/defs'\nimport { Namespaces } from '../../../../stash'\n\nexport default function (server: Server, ctx: AppContext) {\n server.app.bsky.draft.updateDraft({\n auth: ctx.authVerifier.standard,\n handler: async ({ input, auth }) => {\n const actorDid = auth.credentials.iss\n const { draft: draftWithId } = input.body\n\n // NOTE: update drafts does not enforce limits, because if it did, we would not allow updating when the limit is reached,\n // which is not the desired behavior.\n // But this means the consumer of the stash operations can't do an upsert behavior on update, and needs instead to drop non-existent\n // drafts. This avoid misusing the update as a create that does not check limits.\n\n await ctx.stashClient.update({\n actorDid,\n namespace: Namespaces.AppBskyDraftDefsDraftWithId,\n payload: draftWithId satisfies DraftWithId,\n key: draftWithId.id,\n })\n },\n })\n}\n"]}
@@ -18,7 +18,7 @@ function default_1(server, ctx) {
18
18
  const hydrateCtx = await ctx.hydrator.createContext({
19
19
  labelers,
20
20
  viewer,
21
- featureGates: ctx.featureGates.checkGates([ctx.featureGates.ids.SearchFilteringExploration], ctx.featureGates.user({ did: viewer ?? '' })),
21
+ featureGates: ctx.featureGates.checkGates([ctx.featureGates.ids.SearchFilteringExplorationEnable], ctx.featureGates.userContext({ did: viewer })),
22
22
  });
23
23
  const results = await searchPosts({ ...params, hydrateCtx, isModService }, ctx);
24
24
  return {
@@ -71,7 +71,7 @@ const skeleton = async (inputs) => {
71
71
  const hydration = async (inputs) => {
72
72
  const { ctx, params, skeleton } = inputs;
73
73
  return ctx.hydrator.hydratePosts(skeleton.posts.map((uri) => ({ uri })), params.hydrateCtx, undefined, {
74
- processDynamicTagsForView: params.hydrateCtx.featureGates.get(feature_gates_1.FeatureGateID.SearchFilteringExploration)
74
+ processDynamicTagsForView: params.hydrateCtx.featureGates.get(feature_gates_1.FeatureGateID.SearchFilteringExplorationEnable)
75
75
  ? 'search'
76
76
  : undefined,
77
77
  });
@@ -95,7 +95,7 @@ const noBlocksOrTagged = (inputs) => {
95
95
  if (ctx.views.viewerBlockExists(creator, hydration))
96
96
  return false;
97
97
  let tagged = false;
98
- if (params.hydrateCtx.featureGates.get(feature_gates_1.FeatureGateID.SearchFilteringExploration)) {
98
+ if (params.hydrateCtx.featureGates.get(feature_gates_1.FeatureGateID.SearchFilteringExplorationEnable)) {
99
99
  tagged = post.tags.has(ctx.cfg.visibilityTagHide);
100
100
  }
101
101
  else {
@@ -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 { AtpAgent } from '@atproto/api'\nimport { mapDefined } from '@atproto/common'\nimport { ServerConfig } from '../../../../config'\nimport { AppContext } from '../../../../context'\nimport { DataPlaneClient } from '../../../../data-plane'\nimport {\n PostSearchQuery,\n parsePostSearchQuery,\n} from '../../../../data-plane/server/util'\nimport { FeatureGateID } from '../../../../feature-gates'\nimport { HydrateCtx, Hydrator } from '../../../../hydration/hydrator'\nimport { parseString } from '../../../../hydration/util'\nimport { Server } from '../../../../lexicon'\nimport { QueryParams } from '../../../../lexicon/types/app/bsky/feed/searchPosts'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n RulesFnInput,\n SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris'\nimport { Views } from '../../../../views'\nimport { resHeaders } from '../../../util'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchPosts = createPipeline(\n skeleton,\n hydration,\n noBlocksOrTagged,\n presentation,\n )\n server.app.bsky.feed.searchPosts({\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const { viewer, isModService } = ctx.authVerifier.parseCreds(auth)\n\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n featureGates: ctx.featureGates.checkGates(\n [ctx.featureGates.ids.SearchFilteringExploration],\n ctx.featureGates.user({ did: viewer ?? '' }),\n ),\n })\n const results = await searchPosts(\n { ...params, hydrateCtx, isModService },\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 (inputs: SkeletonFnInput<Context, Params>) => {\n const { ctx, params } = inputs\n const parsedQuery = parsePostSearchQuery(params.q, {\n author: params.author,\n })\n\n if (ctx.searchAgent) {\n // @NOTE cursors won't change on appview swap\n const { data: res } =\n await ctx.searchAgent.api.app.bsky.unspecced.searchPostsSkeleton({\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 return {\n posts: res.posts.map(({ uri }) => uri),\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,\n cursor: parseString(res.cursor),\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 undefined,\n {\n processDynamicTagsForView: params.hydrateCtx.featureGates.get(\n FeatureGateID.SearchFilteringExploration,\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 let tagged = false\n if (\n params.hydrateCtx.featureGates.get(\n FeatureGateID.SearchFilteringExploration,\n )\n ) {\n tagged = post.tags.has(ctx.cfg.visibilityTagHide)\n } else {\n tagged = [...ctx.cfg.searchTagsHide].some((t) => post.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 searchAgent?: AtpAgent\n}\n\ntype Params = QueryParams & {\n hydrateCtx: HydrateCtx\n isModService: boolean\n}\n\ntype Skeleton = {\n posts: string[]\n hitsTotal?: number\n cursor?: string\n parsedQuery: PostSearchQuery\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 { AtpAgent } from '@atproto/api'\nimport { mapDefined } from '@atproto/common'\nimport { ServerConfig } from '../../../../config'\nimport { AppContext } from '../../../../context'\nimport { DataPlaneClient } from '../../../../data-plane'\nimport {\n PostSearchQuery,\n parsePostSearchQuery,\n} from '../../../../data-plane/server/util'\nimport { FeatureGateID } from '../../../../feature-gates'\nimport { HydrateCtx, Hydrator } from '../../../../hydration/hydrator'\nimport { parseString } from '../../../../hydration/util'\nimport { Server } from '../../../../lexicon'\nimport { QueryParams } from '../../../../lexicon/types/app/bsky/feed/searchPosts'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n RulesFnInput,\n SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris'\nimport { Views } from '../../../../views'\nimport { resHeaders } from '../../../util'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchPosts = createPipeline(\n skeleton,\n hydration,\n noBlocksOrTagged,\n presentation,\n )\n server.app.bsky.feed.searchPosts({\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const { viewer, isModService } = ctx.authVerifier.parseCreds(auth)\n\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n featureGates: ctx.featureGates.checkGates(\n [ctx.featureGates.ids.SearchFilteringExplorationEnable],\n ctx.featureGates.userContext({ did: viewer }),\n ),\n })\n const results = await searchPosts(\n { ...params, hydrateCtx, isModService },\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 (inputs: SkeletonFnInput<Context, Params>) => {\n const { ctx, params } = inputs\n const parsedQuery = parsePostSearchQuery(params.q, {\n author: params.author,\n })\n\n if (ctx.searchAgent) {\n // @NOTE cursors won't change on appview swap\n const { data: res } =\n await ctx.searchAgent.api.app.bsky.unspecced.searchPostsSkeleton({\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 return {\n posts: res.posts.map(({ uri }) => uri),\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,\n cursor: parseString(res.cursor),\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 undefined,\n {\n processDynamicTagsForView: params.hydrateCtx.featureGates.get(\n FeatureGateID.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 let tagged = false\n if (\n params.hydrateCtx.featureGates.get(\n FeatureGateID.SearchFilteringExplorationEnable,\n )\n ) {\n tagged = post.tags.has(ctx.cfg.visibilityTagHide)\n } else {\n tagged = [...ctx.cfg.searchTagsHide].some((t) => post.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 searchAgent?: AtpAgent\n}\n\ntype Params = QueryParams & {\n hydrateCtx: HydrateCtx\n isModService: boolean\n}\n\ntype Skeleton = {\n posts: string[]\n hitsTotal?: number\n cursor?: string\n parsedQuery: PostSearchQuery\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"getOnboardingSuggestedStarterPacks.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAMhD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAW5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAkCvD"}
1
+ {"version":3,"file":"getOnboardingSuggestedStarterPacks.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAMhD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAW5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAiCvD"}
@@ -20,10 +20,9 @@ function default_1(server, ctx) {
20
20
  ? req.headers['x-bsky-topics'].join(',')
21
21
  : req.headers['x-bsky-topics'],
22
22
  });
23
- const { ...result } = await getOnboardingSuggestedStarterPacks({
23
+ const result = await getOnboardingSuggestedStarterPacks({
24
24
  ...params,
25
- viewer: viewer ?? undefined,
26
- hydrateCtx: hydrateCtx.copy({ viewer }),
25
+ hydrateCtx,
27
26
  headers,
28
27
  }, ctx);
29
28
  return {
@@ -38,7 +37,7 @@ const skeleton = async (input) => {
38
37
  if (ctx.topicsAgent) {
39
38
  const res = await ctx.topicsAgent.app.bsky.unspecced.getOnboardingSuggestedStarterPacksSkeleton({
40
39
  limit: params.limit,
41
- viewer: params.viewer,
40
+ viewer: params.hydrateCtx.viewer ?? undefined,
42
41
  }, {
43
42
  headers: params.headers,
44
43
  });
@@ -63,8 +62,9 @@ const hydration = async (input) => {
63
62
  }
64
63
  dids = (0, common_1.dedupeStrs)(dids);
65
64
  const pairs = new Map();
66
- if (params.viewer) {
67
- pairs.set(params.viewer, dids);
65
+ const viewer = params.hydrateCtx.viewer;
66
+ if (viewer) {
67
+ pairs.set(viewer, dids);
68
68
  }
69
69
  const [starterPacksState, bidirectionalBlocks] = await Promise.all([
70
70
  ctx.hydrator.hydrateStarterPacks(skeleton.starterPacks, params.hydrateCtx),
@@ -74,10 +74,11 @@ const hydration = async (input) => {
74
74
  };
75
75
  const noBlocks = (input) => {
76
76
  const { skeleton, params, hydration } = input;
77
- if (!params.viewer) {
77
+ const viewer = params.hydrateCtx.viewer;
78
+ if (!viewer) {
78
79
  return skeleton;
79
80
  }
80
- const blocks = hydration.bidirectionalBlocks?.get(params.viewer);
81
+ const blocks = hydration.bidirectionalBlocks?.get(viewer);
81
82
  const filteredSkeleton = {
82
83
  starterPacks: skeleton.starterPacks.filter((uri) => {
83
84
  let aturi;
@@ -1 +1 @@
1
- {"version":3,"file":"getOnboardingSuggestedStarterPacks.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts"],"names":[],"mappings":"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","sourcesContent":["import AtpAgent, { AtUri } from '@atproto/api'\nimport { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common'\nimport { InternalServerError } from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context'\nimport {\n HydrateCtx,\n Hydrator,\n mergeManyStates,\n} from '../../../../hydration/hydrator'\nimport { Server } from '../../../../lexicon'\nimport { QueryParams } from '../../../../lexicon/types/app/bsky/unspecced/getTrendingTopics'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n RulesFnInput,\n SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline'\nimport { Views } from '../../../../views'\n\nexport default function (server: Server, ctx: AppContext) {\n const getOnboardingSuggestedStarterPacks = createPipeline(\n skeleton,\n hydration,\n noBlocks,\n presentation,\n )\n server.app.bsky.unspecced.getOnboardingSuggestedStarterPacks({\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({ labelers, viewer })\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 getOnboardingSuggestedStarterPacks(\n {\n ...params,\n viewer: viewer ?? undefined,\n hydrateCtx: hydrateCtx.copy({ viewer }),\n headers,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: result,\n }\n },\n })\n}\n\nconst skeleton = async (input: SkeletonFnInput<Context, Params>) => {\n const { params, ctx } = input\n if (ctx.topicsAgent) {\n const res =\n await ctx.topicsAgent.app.bsky.unspecced.getOnboardingSuggestedStarterPacksSkeleton(\n {\n limit: params.limit,\n viewer: params.viewer,\n },\n {\n headers: params.headers,\n },\n )\n\n return res.data\n } else {\n throw new InternalServerError('Topics agent not available')\n }\n}\n\nconst hydration = async (\n input: HydrationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, params, skeleton } = input\n let dids: string[] = []\n for (const uri of skeleton.starterPacks) {\n let aturi: AtUri | undefined\n try {\n aturi = new AtUri(uri)\n } catch {\n continue\n }\n dids.push(aturi.hostname)\n }\n dids = dedupeStrs(dids)\n const pairs: Map<string, string[]> = new Map()\n if (params.viewer) {\n pairs.set(params.viewer, dids)\n }\n const [starterPacksState, bidirectionalBlocks] = await Promise.all([\n ctx.hydrator.hydrateStarterPacks(skeleton.starterPacks, params.hydrateCtx),\n ctx.hydrator.hydrateBidirectionalBlocks(pairs, params.hydrateCtx),\n ])\n\n return mergeManyStates(starterPacksState, { bidirectionalBlocks })\n}\n\nconst noBlocks = (input: RulesFnInput<Context, Params, SkeletonState>) => {\n const { skeleton, params, hydration } = input\n\n if (!params.viewer) {\n return skeleton\n }\n\n const blocks = hydration.bidirectionalBlocks?.get(params.viewer)\n const filteredSkeleton: SkeletonState = {\n starterPacks: skeleton.starterPacks.filter((uri) => {\n let aturi: AtUri | undefined\n try {\n aturi = new AtUri(uri)\n } catch {\n return false\n }\n return !blocks?.get(aturi.hostname)\n }),\n }\n\n return filteredSkeleton\n}\n\nconst presentation = (\n input: PresentationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, hydration } = input\n\n return {\n starterPacks: mapDefined(skeleton.starterPacks, (uri) =>\n ctx.views.starterPack(uri, hydration),\n ),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n topicsAgent: AtpAgent | undefined\n}\n\ntype Params = QueryParams & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n}\n\ntype SkeletonState = {\n starterPacks: string[]\n}\n"]}
1
+ {"version":3,"file":"getOnboardingSuggestedStarterPacks.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts"],"names":[],"mappings":"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","sourcesContent":["import AtpAgent, { AtUri } from '@atproto/api'\nimport { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common'\nimport { InternalServerError } from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context'\nimport {\n HydrateCtx,\n Hydrator,\n mergeManyStates,\n} from '../../../../hydration/hydrator'\nimport { Server } from '../../../../lexicon'\nimport { QueryParams } from '../../../../lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n RulesFnInput,\n SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline'\nimport { Views } from '../../../../views'\n\nexport default function (server: Server, ctx: AppContext) {\n const getOnboardingSuggestedStarterPacks = createPipeline(\n skeleton,\n hydration,\n noBlocks,\n presentation,\n )\n server.app.bsky.unspecced.getOnboardingSuggestedStarterPacks({\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({ labelers, viewer })\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 getOnboardingSuggestedStarterPacks(\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 = async (input: SkeletonFnInput<Context, Params>) => {\n const { params, ctx } = input\n if (ctx.topicsAgent) {\n const res =\n await ctx.topicsAgent.app.bsky.unspecced.getOnboardingSuggestedStarterPacksSkeleton(\n {\n limit: params.limit,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n },\n )\n\n return res.data\n } else {\n throw new InternalServerError('Topics agent not available')\n }\n}\n\nconst hydration = async (\n input: HydrationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, params, skeleton } = input\n let dids: string[] = []\n for (const uri of skeleton.starterPacks) {\n let aturi: AtUri | undefined\n try {\n aturi = new AtUri(uri)\n } catch {\n continue\n }\n dids.push(aturi.hostname)\n }\n dids = dedupeStrs(dids)\n const pairs: Map<string, string[]> = new Map()\n const viewer = params.hydrateCtx.viewer\n if (viewer) {\n pairs.set(viewer, dids)\n }\n const [starterPacksState, bidirectionalBlocks] = await Promise.all([\n ctx.hydrator.hydrateStarterPacks(skeleton.starterPacks, params.hydrateCtx),\n ctx.hydrator.hydrateBidirectionalBlocks(pairs, params.hydrateCtx),\n ])\n\n return mergeManyStates(starterPacksState, { bidirectionalBlocks })\n}\n\nconst noBlocks = (input: RulesFnInput<Context, Params, SkeletonState>) => {\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 const filteredSkeleton: SkeletonState = {\n starterPacks: skeleton.starterPacks.filter((uri) => {\n let aturi: AtUri | undefined\n try {\n aturi = new AtUri(uri)\n } catch {\n return false\n }\n return !blocks?.get(aturi.hostname)\n }),\n }\n\n return filteredSkeleton\n}\n\nconst presentation = (\n input: PresentationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, hydration } = input\n\n return {\n starterPacks: mapDefined(skeleton.starterPacks, (uri) =>\n ctx.views.starterPack(uri, hydration),\n ),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n topicsAgent: AtpAgent | undefined\n}\n\ntype Params = QueryParams & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n}\n\ntype SkeletonState = {\n starterPacks: string[]\n}\n"]}
@@ -18,7 +18,7 @@ function default_1(server, ctx) {
18
18
  viewer,
19
19
  includeTakedowns,
20
20
  include3pBlocks,
21
- featureGates: ctx.featureGates.checkGates([ctx.featureGates.ids.ThreadsV2ReplyRankingExploration], ctx.featureGates.user({ did: viewer ?? '' })),
21
+ featureGates: ctx.featureGates.checkGates([ctx.featureGates.ids.ThreadsReplyRankingExplorationEnable], ctx.featureGates.userContext({ did: viewer })),
22
22
  });
23
23
  return {
24
24
  encoding: 'application/json',
@@ -1 +1 @@
1
- {"version":3,"file":"getPostThreadV2.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getPostThreadV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { ServerConfig } from '../../../../config'\nimport { AppContext } from '../../../../context'\nimport { Code, DataPlaneClient, isDataplaneError } from '../../../../data-plane'\nimport { HydrateCtx, Hydrator } from '../../../../hydration/hydrator'\nimport { Server } from '../../../../lexicon'\nimport { QueryParams } from '../../../../lexicon/types/app/bsky/unspecced/getPostThreadV2'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n SkeletonFnInput,\n createPipeline,\n noRules,\n} from '../../../../pipeline'\nimport { postUriToThreadgateUri } from '../../../../util/uris'\nimport { Views } from '../../../../views'\nimport { resHeaders } from '../../../util'\n\nexport default function (server: Server, ctx: AppContext) {\n const getPostThread = createPipeline(\n skeleton,\n hydration,\n noRules, // handled in presentation: 3p block-violating replies are turned to #blockedPost, viewer blocks turned to #notFoundPost.\n presentation,\n )\n server.app.bsky.unspecced.getPostThreadV2({\n auth: ctx.authVerifier.optionalStandardOrRole,\n handler: async ({ params, auth, req }) => {\n const { viewer, includeTakedowns, include3pBlocks } =\n ctx.authVerifier.parseCreds(auth)\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n includeTakedowns,\n include3pBlocks,\n featureGates: ctx.featureGates.checkGates(\n [ctx.featureGates.ids.ThreadsV2ReplyRankingExploration],\n ctx.featureGates.user({ did: viewer ?? '' }),\n ),\n })\n\n return {\n encoding: 'application/json',\n body: await getPostThread({ ...params, hydrateCtx }, ctx),\n headers: resHeaders({\n labelers: hydrateCtx.labelers,\n }),\n }\n },\n })\n}\n\nconst skeleton = async (inputs: SkeletonFnInput<Context, Params>) => {\n const { ctx, params } = inputs\n const anchor = await ctx.hydrator.resolveUri(params.anchor)\n try {\n const res = await ctx.dataplane.getThread({\n postUri: anchor,\n above: calculateAbove(ctx, params),\n below: calculateBelow(ctx, anchor, params),\n })\n return {\n anchor,\n uris: res.uris,\n }\n } catch (err) {\n if (isDataplaneError(err, Code.NotFound)) {\n return {\n anchor,\n uris: [],\n }\n } else {\n throw err\n }\n }\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydrateThreadPosts(\n skeleton.uris.map((uri) => ({ uri })),\n params.hydrateCtx,\n )\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton, hydration } = inputs\n const { hasOtherReplies, thread } = ctx.views.threadV2(skeleton, hydration, {\n above: calculateAbove(ctx, params),\n below: calculateBelow(ctx, skeleton.anchor, params),\n branchingFactor: params.branchingFactor,\n sort: params.sort,\n })\n\n const rootUri =\n hydration.posts?.get(skeleton.anchor)?.record.reply?.root.uri ??\n skeleton.anchor\n const threadgate = ctx.views.threadgate(\n postUriToThreadgateUri(rootUri),\n hydration,\n )\n return { hasOtherReplies, thread, threadgate }\n}\n\ntype Context = {\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n cfg: ServerConfig\n}\n\ntype Params = QueryParams & { hydrateCtx: HydrateCtx }\n\ntype Skeleton = {\n anchor: string\n uris: string[]\n}\n\nconst calculateAbove = (ctx: Context, params: Params) => {\n return params.above ? ctx.cfg.maxThreadParents : 0\n}\n\nconst calculateBelow = (ctx: Context, anchor: string, params: Params) => {\n let maxDepth = ctx.cfg.maxThreadDepth\n if (ctx.cfg.bigThreadUris.has(anchor) && ctx.cfg.bigThreadDepth) {\n maxDepth = ctx.cfg.bigThreadDepth\n }\n return maxDepth ? Math.min(maxDepth, params.below) : params.below\n}\n"]}
1
+ {"version":3,"file":"getPostThreadV2.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getPostThreadV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { ServerConfig } from '../../../../config'\nimport { AppContext } from '../../../../context'\nimport { Code, DataPlaneClient, isDataplaneError } from '../../../../data-plane'\nimport { HydrateCtx, Hydrator } from '../../../../hydration/hydrator'\nimport { Server } from '../../../../lexicon'\nimport { QueryParams } from '../../../../lexicon/types/app/bsky/unspecced/getPostThreadV2'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n SkeletonFnInput,\n createPipeline,\n noRules,\n} from '../../../../pipeline'\nimport { postUriToThreadgateUri } from '../../../../util/uris'\nimport { Views } from '../../../../views'\nimport { resHeaders } from '../../../util'\n\nexport default function (server: Server, ctx: AppContext) {\n const getPostThread = createPipeline(\n skeleton,\n hydration,\n noRules, // handled in presentation: 3p block-violating replies are turned to #blockedPost, viewer blocks turned to #notFoundPost.\n presentation,\n )\n server.app.bsky.unspecced.getPostThreadV2({\n auth: ctx.authVerifier.optionalStandardOrRole,\n handler: async ({ params, auth, req }) => {\n const { viewer, includeTakedowns, include3pBlocks } =\n ctx.authVerifier.parseCreds(auth)\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n includeTakedowns,\n include3pBlocks,\n featureGates: ctx.featureGates.checkGates(\n [ctx.featureGates.ids.ThreadsReplyRankingExplorationEnable],\n ctx.featureGates.userContext({ did: viewer }),\n ),\n })\n\n return {\n encoding: 'application/json',\n body: await getPostThread({ ...params, hydrateCtx }, ctx),\n headers: resHeaders({\n labelers: hydrateCtx.labelers,\n }),\n }\n },\n })\n}\n\nconst skeleton = async (inputs: SkeletonFnInput<Context, Params>) => {\n const { ctx, params } = inputs\n const anchor = await ctx.hydrator.resolveUri(params.anchor)\n try {\n const res = await ctx.dataplane.getThread({\n postUri: anchor,\n above: calculateAbove(ctx, params),\n below: calculateBelow(ctx, anchor, params),\n })\n return {\n anchor,\n uris: res.uris,\n }\n } catch (err) {\n if (isDataplaneError(err, Code.NotFound)) {\n return {\n anchor,\n uris: [],\n }\n } else {\n throw err\n }\n }\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydrateThreadPosts(\n skeleton.uris.map((uri) => ({ uri })),\n params.hydrateCtx,\n )\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton, hydration } = inputs\n const { hasOtherReplies, thread } = ctx.views.threadV2(skeleton, hydration, {\n above: calculateAbove(ctx, params),\n below: calculateBelow(ctx, skeleton.anchor, params),\n branchingFactor: params.branchingFactor,\n sort: params.sort,\n })\n\n const rootUri =\n hydration.posts?.get(skeleton.anchor)?.record.reply?.root.uri ??\n skeleton.anchor\n const threadgate = ctx.views.threadgate(\n postUriToThreadgateUri(rootUri),\n hydration,\n )\n return { hasOtherReplies, thread, threadgate }\n}\n\ntype Context = {\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n cfg: ServerConfig\n}\n\ntype Params = QueryParams & { hydrateCtx: HydrateCtx }\n\ntype Skeleton = {\n anchor: string\n uris: string[]\n}\n\nconst calculateAbove = (ctx: Context, params: Params) => {\n return params.above ? ctx.cfg.maxThreadParents : 0\n}\n\nconst calculateBelow = (ctx: Context, anchor: string, params: Params) => {\n let maxDepth = ctx.cfg.maxThreadDepth\n if (ctx.cfg.bigThreadUris.has(anchor) && ctx.cfg.bigThreadDepth) {\n maxDepth = ctx.cfg.bigThreadDepth\n }\n return maxDepth ? Math.min(maxDepth, params.below) : params.below\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"getSuggestedFeeds.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedFeeds.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAW5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA6BvD"}
1
+ {"version":3,"file":"getSuggestedFeeds.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedFeeds.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAW5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA4BvD"}
@@ -18,10 +18,9 @@ function default_1(server, ctx) {
18
18
  ? req.headers['x-bsky-topics'].join(',')
19
19
  : req.headers['x-bsky-topics'],
20
20
  });
21
- const { ...result } = await getFeeds({
21
+ const result = await getFeeds({
22
22
  ...params,
23
- viewer: viewer ?? undefined,
24
- hydrateCtx: hydrateCtx.copy({ viewer }),
23
+ hydrateCtx,
25
24
  headers,
26
25
  }, ctx);
27
26
  return {
@@ -36,7 +35,7 @@ const skeleton = async (input) => {
36
35
  if (ctx.topicsAgent) {
37
36
  const res = await ctx.topicsAgent.app.bsky.unspecced.getSuggestedFeedsSkeleton({
38
37
  limit: params.limit,
39
- viewer: params.viewer,
38
+ viewer: params.hydrateCtx.viewer ?? undefined,
40
39
  }, {
41
40
  headers: params.headers,
42
41
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getSuggestedFeeds.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedFeeds.ts"],"names":[],"mappings":"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","sourcesContent":["import AtpAgent from '@atproto/api'\nimport { mapDefined, noUndefinedVals } from '@atproto/common'\nimport { InternalServerError } from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context'\nimport { HydrateCtx, Hydrator } from '../../../../hydration/hydrator'\nimport { Server } from '../../../../lexicon'\nimport { QueryParams } from '../../../../lexicon/types/app/bsky/unspecced/getTrendingTopics'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n SkeletonFnInput,\n createPipeline,\n noRules,\n} from '../../../../pipeline'\nimport { Views } from '../../../../views'\n\nexport default function (server: Server, ctx: AppContext) {\n const getFeeds = createPipeline(skeleton, hydration, noRules, presentation)\n server.app.bsky.unspecced.getSuggestedFeeds({\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({ labelers, viewer })\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 getFeeds(\n {\n ...params,\n viewer: viewer ?? undefined,\n hydrateCtx: hydrateCtx.copy({ viewer }),\n headers,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: result,\n }\n },\n })\n}\n\nconst skeleton = async (input: SkeletonFnInput<Context, Params>) => {\n const { params, ctx } = input\n if (ctx.topicsAgent) {\n const res =\n await ctx.topicsAgent.app.bsky.unspecced.getSuggestedFeedsSkeleton(\n {\n limit: params.limit,\n viewer: params.viewer,\n },\n {\n headers: params.headers,\n },\n )\n\n return res.data\n } else {\n throw new InternalServerError('Topics agent not available')\n }\n}\n\nconst hydration = async (\n input: HydrationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, params, skeleton } = input\n return await ctx.hydrator.hydrateFeedGens(skeleton.feeds, params.hydrateCtx)\n}\n\nconst presentation = (\n input: PresentationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, hydration } = input\n\n return {\n feeds: mapDefined(skeleton.feeds, (uri) =>\n ctx.views.feedGenerator(uri, hydration),\n ),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n topicsAgent: AtpAgent | undefined\n}\n\ntype Params = QueryParams & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n}\n\ntype SkeletonState = {\n feeds: string[]\n}\n"]}
1
+ {"version":3,"file":"getSuggestedFeeds.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedFeeds.ts"],"names":[],"mappings":";;AAgBA,4BA4BC;AA3CD,4CAA6D;AAC7D,sDAA0D;AAK1D,mDAM6B;AAG7B,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,QAAQ,GAAG,IAAA,yBAAc,EAAC,QAAQ,EAAE,SAAS,EAAE,kBAAO,EAAE,YAAY,CAAC,CAAA;IAC3E,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;QAC1C,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;YACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YACrC,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;YACzE,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC;gBAC9B,iBAAiB,EAAE,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC;gBACjD,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;oBAC1D,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBACxC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC;aACjC,CAAC,CAAA;YACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;gBACE,GAAG,MAAM;gBACT,UAAU;gBACV,OAAO;aACR,EACD,GAAG,CACJ,CAAA;YACD,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,MAAM;aACb,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAuC,EAAE,EAAE;IACjE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAA;IAC7B,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,MAAM,GAAG,GACP,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAChE;YACE,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS;SAC9C,EACD;YACE,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CACF,CAAA;QAEH,OAAO,GAAG,CAAC,IAAI,CAAA;IACjB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,iCAAmB,CAAC,4BAA4B,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,KAAK,EACrB,KAAuD,EACvD,EAAE;IACF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IACvC,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAC9E,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CACnB,KAA0D,EAC1D,EAAE;IACF,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IAE1C,OAAO;QACL,KAAK,EAAE,IAAA,mBAAU,EAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACxC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CACxC;KACF,CAAA;AACH,CAAC,CAAA","sourcesContent":["import AtpAgent from '@atproto/api'\nimport { mapDefined, noUndefinedVals } from '@atproto/common'\nimport { InternalServerError } from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context'\nimport { HydrateCtx, Hydrator } from '../../../../hydration/hydrator'\nimport { Server } from '../../../../lexicon'\nimport { QueryParams } from '../../../../lexicon/types/app/bsky/unspecced/getSuggestedFeeds'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n SkeletonFnInput,\n createPipeline,\n noRules,\n} from '../../../../pipeline'\nimport { Views } from '../../../../views'\n\nexport default function (server: Server, ctx: AppContext) {\n const getFeeds = createPipeline(skeleton, hydration, noRules, presentation)\n server.app.bsky.unspecced.getSuggestedFeeds({\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({ labelers, viewer })\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 getFeeds(\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 = async (input: SkeletonFnInput<Context, Params>) => {\n const { params, ctx } = input\n if (ctx.topicsAgent) {\n const res =\n await ctx.topicsAgent.app.bsky.unspecced.getSuggestedFeedsSkeleton(\n {\n limit: params.limit,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n {\n headers: params.headers,\n },\n )\n\n return res.data\n } else {\n throw new InternalServerError('Topics agent not available')\n }\n}\n\nconst hydration = async (\n input: HydrationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, params, skeleton } = input\n return await ctx.hydrator.hydrateFeedGens(skeleton.feeds, params.hydrateCtx)\n}\n\nconst presentation = (\n input: PresentationFnInput<Context, Params, SkeletonState>,\n) => {\n const { ctx, skeleton, hydration } = input\n\n return {\n feeds: mapDefined(skeleton.feeds, (uri) =>\n ctx.views.feedGenerator(uri, hydration),\n ),\n }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n topicsAgent: AtpAgent | undefined\n}\n\ntype Params = QueryParams & {\n hydrateCtx: HydrateCtx & { viewer: string | null }\n headers: Record<string, string>\n}\n\ntype SkeletonState = {\n feeds: string[]\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"getSuggestedStarterPacks.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedStarterPacks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAMhD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAW5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAkCvD"}
1
+ {"version":3,"file":"getSuggestedStarterPacks.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/getSuggestedStarterPacks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAMhD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAW5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAiCvD"}
@@ -20,10 +20,9 @@ function default_1(server, ctx) {
20
20
  ? req.headers['x-bsky-topics'].join(',')
21
21
  : req.headers['x-bsky-topics'],
22
22
  });
23
- const { ...result } = await getSuggestedStarterPacks({
23
+ const result = await getSuggestedStarterPacks({
24
24
  ...params,
25
- viewer: viewer ?? undefined,
26
- hydrateCtx: hydrateCtx.copy({ viewer }),
25
+ hydrateCtx,
27
26
  headers,
28
27
  }, ctx);
29
28
  return {
@@ -38,7 +37,7 @@ const skeleton = async (input) => {
38
37
  if (ctx.topicsAgent) {
39
38
  const res = await ctx.topicsAgent.app.bsky.unspecced.getSuggestedStarterPacksSkeleton({
40
39
  limit: params.limit,
41
- viewer: params.viewer,
40
+ viewer: params.hydrateCtx.viewer ?? undefined,
42
41
  }, {
43
42
  headers: params.headers,
44
43
  });
@@ -63,8 +62,9 @@ const hydration = async (input) => {
63
62
  }
64
63
  dids = (0, common_1.dedupeStrs)(dids);
65
64
  const pairs = new Map();
66
- if (params.viewer) {
67
- pairs.set(params.viewer, dids);
65
+ const viewer = params.hydrateCtx.viewer;
66
+ if (viewer) {
67
+ pairs.set(viewer, dids);
68
68
  }
69
69
  const [starterPacksState, bidirectionalBlocks] = await Promise.all([
70
70
  ctx.hydrator.hydrateStarterPacks(skeleton.starterPacks, params.hydrateCtx),
@@ -74,10 +74,11 @@ const hydration = async (input) => {
74
74
  };
75
75
  const noBlocks = (input) => {
76
76
  const { skeleton, params, hydration } = input;
77
- if (!params.viewer) {
77
+ const viewer = params.hydrateCtx.viewer;
78
+ if (!viewer) {
78
79
  return skeleton;
79
80
  }
80
- const blocks = hydration.bidirectionalBlocks?.get(params.viewer);
81
+ const blocks = hydration.bidirectionalBlocks?.get(viewer);
81
82
  const filteredSkeleton = {
82
83
  starterPacks: skeleton.starterPacks.filter((uri) => {
83
84
  let aturi;