@atproto/bsky 0.0.277 → 0.0.279
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 +65 -0
- package/dist/api/app/bsky/actor/getSuggestions.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/getSuggestions.js +5 -5
- package/dist/api/app/bsky/actor/getSuggestions.js.map +1 -1
- package/dist/api/app/bsky/actor/searchActors.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/searchActors.js +3 -2
- package/dist/api/app/bsky/actor/searchActors.js.map +1 -1
- package/dist/api/app/bsky/actor/searchActorsTypeahead.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/searchActorsTypeahead.js +3 -2
- package/dist/api/app/bsky/actor/searchActorsTypeahead.js.map +1 -1
- package/dist/api/app/bsky/feed/getAuthorFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getAuthorFeed.js +2 -4
- package/dist/api/app/bsky/feed/getAuthorFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getFeed.js +10 -10
- package/dist/api/app/bsky/feed/getFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getTimeline.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getTimeline.js +2 -4
- package/dist/api/app/bsky/feed/getTimeline.js.map +1 -1
- package/dist/api/app/bsky/feed/searchPosts.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/searchPosts.js +3 -2
- package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
- package/dist/api/app/bsky/graph/getList.js +4 -1
- package/dist/api/app/bsky/graph/getList.js.map +1 -1
- package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.js +5 -5
- package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.js.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacks.js +3 -2
- package/dist/api/app/bsky/graph/searchStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/notification/getUnreadCount.js +0 -8
- package/dist/api/app/bsky/notification/getUnreadCount.js.map +1 -1
- package/dist/api/app/bsky/notification/listNotifications.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/listNotifications.js +22 -20
- package/dist/api/app/bsky/notification/listNotifications.js.map +1 -1
- package/dist/api/app/bsky/notification/updateSeen.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/updateSeen.js +2 -11
- package/dist/api/app/bsky/notification/updateSeen.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js +5 -5
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js +5 -4
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedOnboardingUsers.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedOnboardingUsers.js +5 -4
- package/dist/api/app/bsky/unspecced/getSuggestedOnboardingUsers.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js +5 -4
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.js +6 -4
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForDiscover.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForDiscover.js +4 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForDiscover.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForExplore.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForExplore.js +4 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForExplore.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.js +4 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.js +3 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.js +5 -4
- package/dist/api/app/bsky/unspecced/getTrends.js.map +1 -1
- package/dist/api/blob-dispatcher.d.ts.map +1 -1
- package/dist/api/blob-dispatcher.js +1 -0
- package/dist/api/blob-dispatcher.js.map +1 -1
- package/dist/api/util.d.ts.map +1 -1
- package/dist/api/util.js +4 -1
- package/dist/api/util.js.map +1 -1
- package/dist/bsync.d.ts.map +1 -1
- package/dist/bsync.js +18 -1
- package/dist/bsync.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -1
- package/dist/config.js.map +1 -1
- package/dist/data-plane/client/index.d.ts.map +1 -1
- package/dist/data-plane/client/index.js +3 -2
- package/dist/data-plane/client/index.js.map +1 -1
- package/dist/data-plane/client/util.d.ts +0 -1
- package/dist/data-plane/client/util.d.ts.map +1 -1
- package/dist/data-plane/client/util.js +0 -45
- package/dist/data-plane/client/util.js.map +1 -1
- package/dist/data-plane/server/db/database-schema.d.ts +2 -1
- package/dist/data-plane/server/db/database-schema.d.ts.map +1 -1
- package/dist/data-plane/server/db/database-schema.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20260827T200000000Z-reference-list-opt-outs.d.ts +4 -0
- package/dist/data-plane/server/db/migrations/20260827T200000000Z-reference-list-opt-outs.d.ts.map +1 -0
- package/dist/data-plane/server/db/migrations/20260827T200000000Z-reference-list-opt-outs.js +24 -0
- package/dist/data-plane/server/db/migrations/20260827T200000000Z-reference-list-opt-outs.js.map +1 -0
- package/dist/data-plane/server/db/migrations/20260904T130000000Z-remove-last-seen-priority-notifs.d.ts +4 -0
- package/dist/data-plane/server/db/migrations/20260904T130000000Z-remove-last-seen-priority-notifs.d.ts.map +1 -0
- package/dist/data-plane/server/db/migrations/20260904T130000000Z-remove-last-seen-priority-notifs.js +13 -0
- package/dist/data-plane/server/db/migrations/20260904T130000000Z-remove-last-seen-priority-notifs.js.map +1 -0
- package/dist/data-plane/server/db/migrations/index.d.ts +2 -0
- package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/index.js +2 -0
- package/dist/data-plane/server/db/migrations/index.js.map +1 -1
- package/dist/data-plane/server/db/tables/actor-state.d.ts +0 -1
- package/dist/data-plane/server/db/tables/actor-state.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/actor-state.js.map +1 -1
- package/dist/data-plane/server/db/tables/reference-list-opt-out.d.ts +15 -0
- package/dist/data-plane/server/db/tables/reference-list-opt-out.d.ts.map +1 -0
- package/dist/data-plane/server/db/tables/reference-list-opt-out.js +2 -0
- package/dist/data-plane/server/db/tables/reference-list-opt-out.js.map +1 -0
- package/dist/data-plane/server/indexing/index.d.ts +10 -0
- package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/index.js +6 -0
- package/dist/data-plane/server/indexing/index.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/reference-list-opt-out.d.ts +16 -0
- package/dist/data-plane/server/indexing/plugins/reference-list-opt-out.d.ts.map +1 -0
- package/dist/data-plane/server/indexing/plugins/reference-list-opt-out.js +73 -0
- package/dist/data-plane/server/indexing/plugins/reference-list-opt-out.js.map +1 -0
- package/dist/data-plane/server/indexing/processor.d.ts +1 -0
- package/dist/data-plane/server/indexing/processor.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/processor.js +3 -0
- package/dist/data-plane/server/indexing/processor.js.map +1 -1
- package/dist/data-plane/server/routes/feeds.d.ts.map +1 -1
- package/dist/data-plane/server/routes/feeds.js +13 -0
- package/dist/data-plane/server/routes/feeds.js.map +1 -1
- package/dist/data-plane/server/routes/lists.d.ts.map +1 -1
- package/dist/data-plane/server/routes/lists.js +45 -1
- package/dist/data-plane/server/routes/lists.js.map +1 -1
- package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
- package/dist/data-plane/server/routes/notifs.js +10 -32
- package/dist/data-plane/server/routes/notifs.js.map +1 -1
- package/dist/data-plane/server/util.d.ts +4 -4
- package/dist/hydration/actor.d.ts.map +1 -1
- package/dist/hydration/actor.js +7 -4
- package/dist/hydration/actor.js.map +1 -1
- package/dist/hydration/graph.d.ts +1 -0
- package/dist/hydration/graph.d.ts.map +1 -1
- package/dist/hydration/graph.js +12 -5
- package/dist/hydration/graph.js.map +1 -1
- package/dist/hydration/hydrator.d.ts +9 -1
- package/dist/hydration/hydrator.d.ts.map +1 -1
- package/dist/hydration/hydrator.js +28 -3
- package/dist/hydration/hydrator.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -2
- package/dist/index.js.map +1 -1
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +6 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor/defs.defs.js +2 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.js +1 -0
- package/dist/lexicons/app/bsky/authFullApp.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/graph/defs.defs.d.ts +8 -0
- package/dist/lexicons/app/bsky/graph/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph/defs.defs.js +3 -0
- package/dist/lexicons/app/bsky/graph/defs.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/graph/referencelistoptout.d.ts +3 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.defs.d.ts +77 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.defs.js +27 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.js +6 -0
- package/dist/lexicons/app/bsky/graph/referencelistoptout.js.map +1 -0
- package/dist/lexicons/app/bsky/graph.d.ts +1 -0
- package/dist/lexicons/app/bsky/graph.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/graph.js +1 -0
- package/dist/lexicons/app/bsky/graph.js.map +1 -1
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.d.ts +3 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.defs.d.ts +29 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.defs.js +19 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.js +6 -0
- package/dist/lexicons/tools/ozone/moderation/getAccountPreferences.js.map +1 -0
- package/dist/lexicons/tools/ozone/moderation.d.ts +1 -0
- package/dist/lexicons/tools/ozone/moderation.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/moderation.js +1 -0
- package/dist/lexicons/tools/ozone/moderation.js.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -0
- package/dist/logger.js.map +1 -1
- package/dist/proto/bsky_connect.d.ts +10 -1
- package/dist/proto/bsky_connect.d.ts.map +1 -1
- package/dist/proto/bsky_connect.js +11 -2
- package/dist/proto/bsky_connect.js.map +1 -1
- package/dist/proto/bsky_pb.d.ts +46 -12
- package/dist/proto/bsky_pb.d.ts.map +1 -1
- package/dist/proto/bsky_pb.js +75 -15
- package/dist/proto/bsky_pb.js.map +1 -1
- package/dist/proto/bsync_connect.d.ts +10 -1
- package/dist/proto/bsync_connect.d.ts.map +1 -1
- package/dist/proto/bsync_connect.js +11 -2
- package/dist/proto/bsync_connect.js.map +1 -1
- package/dist/proto/bsync_pb.d.ts +35 -1
- package/dist/proto/bsync_pb.d.ts.map +1 -1
- package/dist/proto/bsync_pb.js +56 -1
- package/dist/proto/bsync_pb.js.map +1 -1
- package/dist/proto/courier_connect.js +1 -1
- package/dist/proto/courier_connect.js.map +1 -1
- package/dist/proto/dataplane_connect.d.ts +20 -0
- package/dist/proto/dataplane_connect.d.ts.map +1 -0
- package/dist/proto/dataplane_connect.js +24 -0
- package/dist/proto/dataplane_connect.js.map +1 -0
- package/dist/proto/dataplane_pb.d.ts +37 -0
- package/dist/proto/dataplane_pb.d.ts.map +1 -0
- package/dist/proto/dataplane_pb.js +61 -0
- package/dist/proto/dataplane_pb.js.map +1 -0
- package/dist/proto/rolodex_connect.js +1 -1
- package/dist/proto/rolodex_connect.js.map +1 -1
- package/dist/telemetry/events.d.ts +31 -0
- package/dist/telemetry/events.d.ts.map +1 -0
- package/dist/telemetry/events.js +65 -0
- package/dist/telemetry/events.js.map +1 -0
- package/dist/telemetry/rpc.d.ts +21 -0
- package/dist/telemetry/rpc.d.ts.map +1 -0
- package/dist/telemetry/rpc.js +70 -0
- package/dist/telemetry/rpc.js.map +1 -0
- package/dist/{telemetry.d.ts.map → telemetry/telemetry.d.ts.map} +1 -1
- package/dist/{telemetry.js → telemetry/telemetry.js} +1 -1
- package/dist/telemetry/telemetry.js.map +1 -0
- package/dist/telemetry/util.d.ts +14 -0
- package/dist/telemetry/util.d.ts.map +1 -0
- package/dist/telemetry/util.js +23 -0
- package/dist/telemetry/util.js.map +1 -0
- package/dist/undici.d.ts +29 -0
- package/dist/undici.d.ts.map +1 -0
- package/dist/undici.js +43 -0
- package/dist/undici.js.map +1 -0
- package/dist/util/headers.d.ts +5 -0
- package/dist/util/headers.d.ts.map +1 -0
- package/dist/util/headers.js +19 -0
- package/dist/util/headers.js.map +1 -0
- package/dist/util/uris.js +1 -1
- package/dist/util/uris.js.map +1 -1
- package/dist/views/index.d.ts +4 -2
- package/dist/views/index.d.ts.map +1 -1
- package/dist/views/index.js +24 -11
- package/dist/views/index.js.map +1 -1
- package/package.json +24 -19
- package/dist/telemetry.js.map +0 -1
- /package/dist/{telemetry.d.ts → telemetry/telemetry.d.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,70 @@
|
|
|
1
1
|
# @atproto/bsky
|
|
2
2
|
|
|
3
|
+
## 0.0.279
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#5488](https://github.com/bluesky-social/atproto/pull/5488) [`fe4087e`](https://github.com/bluesky-social/atproto/commit/fe4087ecb7a7cc53c7081c9f97d49121e5251c36) Thanks [@dependabot](https://github.com/apps/dependabot)! - Bump the dev-dependencies group across 1 directory with 30 updates
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`0287dce`](https://github.com/bluesky-social/atproto/commit/0287dcece76c2c2453406cb3b51591ce0f983a98), [`fe4087e`](https://github.com/bluesky-social/atproto/commit/fe4087ecb7a7cc53c7081c9f97d49121e5251c36)]:
|
|
10
|
+
- @atproto-labs/opentelemetry-node@0.2.1
|
|
11
|
+
- @atproto/api@0.20.44
|
|
12
|
+
- @atproto/crypto@0.5.5
|
|
13
|
+
- @atproto/did@0.5.5
|
|
14
|
+
- @atproto/identity@0.5.12
|
|
15
|
+
- @atproto/repo@0.10.14
|
|
16
|
+
- @atproto/sync@0.4.9
|
|
17
|
+
- @atproto/xrpc-server@0.13.1
|
|
18
|
+
- @atproto/common@0.8.3
|
|
19
|
+
- @atproto/lex@0.3.10
|
|
20
|
+
- @atproto-labs/xrpc-utils@0.1.22
|
|
21
|
+
|
|
22
|
+
## 0.0.278
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- [#5457](https://github.com/bluesky-social/atproto/pull/5457) [`ffcb7c5`](https://github.com/bluesky-social/atproto/commit/ffcb7c54e4dcedb10eed9175fbc939761462bca6) Thanks [@treethought](https://github.com/treethought)! - Abort upstream calls made by read endpoints when the client disconnects. Feed, search, and suggestion queries now forward the request's cancellation signal to their outbound calls, so a caller hanging up no longer leaves those requests running.
|
|
27
|
+
|
|
28
|
+
- [#5461](https://github.com/bluesky-social/atproto/pull/5461) [`60c4395`](https://github.com/bluesky-social/atproto/commit/60c439595101fbcbe612463e6f23200590c5daaf) Thanks [@blackmichael](https://github.com/blackmichael)! - Add reference-list opt-out records and enforce them in AppView list, list feed, and starter-pack views.
|
|
29
|
+
|
|
30
|
+
- [#5485](https://github.com/bluesky-social/atproto/pull/5485) [`908cd55`](https://github.com/bluesky-social/atproto/commit/908cd559d57c207ed0a67c8fbbb8be6091dd7534) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Route notification read updates exclusively through bsync fanout.
|
|
31
|
+
|
|
32
|
+
- [#5465](https://github.com/bluesky-social/atproto/pull/5465) [`328a4a8`](https://github.com/bluesky-social/atproto/commit/328a4a86a999357eeae12a6da897bf686b4da88e) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Issue iris and topics requests through the global fetch, using long-lived dispatchers that are closed on shutdown.
|
|
33
|
+
|
|
34
|
+
- [#5464](https://github.com/bluesky-social/atproto/pull/5464) [`a058557`](https://github.com/bluesky-social/atproto/commit/a0585579f000dc489b5524b02955fdca1de6665c) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Setup OTEL metrics on bsky and report some hydration failures
|
|
35
|
+
|
|
36
|
+
- [#5454](https://github.com/bluesky-social/atproto/pull/5454) [`f7fe823`](https://github.com/bluesky-social/atproto/commit/f7fe8237f6cc83da45c1494ca90c94c4b2a65a23) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Add a 1s timeout to requests to iris.
|
|
37
|
+
|
|
38
|
+
- [#5455](https://github.com/bluesky-social/atproto/pull/5455) [`9a72c51`](https://github.com/bluesky-social/atproto/commit/9a72c515b1886256f05b1e28d61e5a1caade1d74) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Use a connection timeout for requests to iris and topics.
|
|
39
|
+
|
|
40
|
+
- [#5451](https://github.com/bluesky-social/atproto/pull/5451) [`ff99ec0`](https://github.com/bluesky-social/atproto/commit/ff99ec0a35e3b2b91cb8fb8fef780abb623a1f90) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Serve known likers on the root post of each feed item instead of on the feed item itself.
|
|
41
|
+
|
|
42
|
+
- [#5473](https://github.com/bluesky-social/atproto/pull/5473) [`cae15d9`](https://github.com/bluesky-social/atproto/commit/cae15d9fd007206878d51f990b321a508b3044b7) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Add a `BSKY_FEED_GEN_SKELETON_TIMEOUT` option, bounding feed generator skeleton requests. Defaults to 5s, lowered from the previously hardcoded 10s.
|
|
43
|
+
|
|
44
|
+
- [#5484](https://github.com/bluesky-social/atproto/pull/5484) [`14bd634`](https://github.com/bluesky-social/atproto/commit/14bd63433726fb2acf1b77358710950341f4b949) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Fan out notification read timestamps through bsync and prevent older timestamps from replacing newer ones.
|
|
45
|
+
|
|
46
|
+
- [#5472](https://github.com/bluesky-social/atproto/pull/5472) [`222f4bc`](https://github.com/bluesky-social/atproto/commit/222f4bc600fb89c75fafee95ef3c837b1721601e) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Move the RPC telemetry constants shared by both halves of a bsync call into `@atproto-labs/opentelemetry-node`: the `bsync.namespace` and `bsync.operation` attribute keys and `RPC_CALL_DURATION_BUCKETS` are now exported from the `/conventions` entrypoint, and `statusCodeToString()` from the new `/util` entrypoint. Previously the AppView imported these from `@atproto/bsync`, which made a whole service package a runtime dependency of another just to agree on a metric label.
|
|
47
|
+
|
|
48
|
+
- [#5456](https://github.com/bluesky-social/atproto/pull/5456) [`db6e2e7`](https://github.com/bluesky-social/atproto/commit/db6e2e70d1168c1a2fcf068ec42eaac6fd1702d5) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Reduce dataplane calls when refilling paginated responses. Pages are now served once they hold half of the requested limit, and `listNotifications` reads the viewer's priority setting and last-seen time once per request instead of once per page.
|
|
49
|
+
|
|
50
|
+
- [#5448](https://github.com/bluesky-social/atproto/pull/5448) [`80d391a`](https://github.com/bluesky-social/atproto/commit/80d391a2b5762b1c50037303f77f73db345bec1e) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Forward `x-atproto-bsky-topics` alongside the legacy `x-bsky-topics` header.
|
|
51
|
+
|
|
52
|
+
- [#5470](https://github.com/bluesky-social/atproto/pull/5470) [`715caf1`](https://github.com/bluesky-social/atproto/commit/715caf130a9347b36b9cbdf479ae5d6113e030c6) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Record client and server latency metrics and traces for bsync requests, including operation namespaces.
|
|
53
|
+
|
|
54
|
+
- [#5465](https://github.com/bluesky-social/atproto/pull/5465) [`328a4a8`](https://github.com/bluesky-social/atproto/commit/328a4a86a999357eeae12a6da897bf686b4da88e) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Add a `BSKY_PROXY_CONNECT_TIMEOUT` option, bounding the connection phase of blob proxy requests.
|
|
55
|
+
|
|
56
|
+
- Updated dependencies [[`8a4631a`](https://github.com/bluesky-social/atproto/commit/8a4631a47ce6791b3868f06d1c930aa21327748c), [`60c4395`](https://github.com/bluesky-social/atproto/commit/60c439595101fbcbe612463e6f23200590c5daaf), [`f0d4877`](https://github.com/bluesky-social/atproto/commit/f0d4877a03dc8ede0d3e9a36d5b72ada63b5d2e0), [`5c154f9`](https://github.com/bluesky-social/atproto/commit/5c154f9c5173e7823a5353eab92207508a7dea99), [`ed0b7d3`](https://github.com/bluesky-social/atproto/commit/ed0b7d38811bb24952a3f1da988b02e39934d222), [`222f4bc`](https://github.com/bluesky-social/atproto/commit/222f4bc600fb89c75fafee95ef3c837b1721601e), [`46fdec9`](https://github.com/bluesky-social/atproto/commit/46fdec90d4eca8c8d7c8eeb7dc801cf52ffaaed6), [`ed0b7d3`](https://github.com/bluesky-social/atproto/commit/ed0b7d38811bb24952a3f1da988b02e39934d222), [`ffcb7c5`](https://github.com/bluesky-social/atproto/commit/ffcb7c54e4dcedb10eed9175fbc939761462bca6)]:
|
|
57
|
+
- @atproto/xrpc-server@0.13.0
|
|
58
|
+
- @atproto/api@0.20.43
|
|
59
|
+
- @atproto/lex@0.3.9
|
|
60
|
+
- @atproto-labs/opentelemetry-node@0.2.0
|
|
61
|
+
- @atproto/syntax@0.7.6
|
|
62
|
+
- @atproto-labs/xrpc-utils@0.1.21
|
|
63
|
+
- @atproto/sync@0.4.8
|
|
64
|
+
- @atproto/repo@0.10.13
|
|
65
|
+
- @atproto/common@0.8.2
|
|
66
|
+
- @atproto/identity@0.5.11
|
|
67
|
+
|
|
3
68
|
## 0.0.277
|
|
4
69
|
|
|
5
70
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSuggestions.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/getSuggestions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAyB,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"getSuggestions.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/getSuggestions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAyB,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAcxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAwCvD"}
|
|
@@ -3,25 +3,24 @@ import { isDidString } from '@atproto/lex';
|
|
|
3
3
|
import { parseString } from '../../../../hydration/util.js';
|
|
4
4
|
import { app } from '../../../../lexicons/index.js';
|
|
5
5
|
import { createPipeline } from '../../../../pipeline.js';
|
|
6
|
+
import { getAtprotoPassthroughHeaders } from '../../../../util/headers.js';
|
|
6
7
|
import { fillPage, resHeaders } from '../../../util.js';
|
|
7
8
|
export default function (server, ctx) {
|
|
8
9
|
const getSuggestions = createPipeline(skeleton, hydration, noBlocksOrMutes, presentation);
|
|
9
10
|
server.add(app.bsky.actor.getSuggestions, {
|
|
10
11
|
auth: ctx.authVerifier.standardOptional,
|
|
11
|
-
handler: async ({ params, auth, req }) => {
|
|
12
|
+
handler: async ({ params, auth, req, signal }) => {
|
|
12
13
|
const viewer = auth.credentials.iss;
|
|
13
14
|
const labelers = ctx.reqLabelers(req);
|
|
14
15
|
const hydrateCtx = await ctx.hydrator.createContext({ viewer, labelers });
|
|
15
16
|
const headers = noUndefinedVals({
|
|
16
17
|
'accept-language': req.headers['accept-language'],
|
|
17
|
-
|
|
18
|
-
? req.headers['x-bsky-topics'].join(',')
|
|
19
|
-
: req.headers['x-bsky-topics'],
|
|
18
|
+
...getAtprotoPassthroughHeaders(req),
|
|
20
19
|
});
|
|
21
20
|
const { resHeaders: resultHeaders, ...result } = await fillPage({
|
|
22
21
|
cursor: params.cursor,
|
|
23
22
|
limit: params.limit,
|
|
24
|
-
fetch: ({ cursor, limit }) => getSuggestions({ ...params, cursor, limit, hydrateCtx, headers }, ctx),
|
|
23
|
+
fetch: ({ cursor, limit }) => getSuggestions({ ...params, cursor, limit, hydrateCtx, headers, signal }, ctx),
|
|
25
24
|
items: (r) => r.actors,
|
|
26
25
|
});
|
|
27
26
|
const suggestionsResHeaders = noUndefinedVals({
|
|
@@ -44,6 +43,7 @@ const skeleton = async (input) => {
|
|
|
44
43
|
if (viewer && ctx.suggestionsClient) {
|
|
45
44
|
const res = await ctx.suggestionsClient.xrpc(app.bsky.unspecced.getSuggestionsSkeleton, {
|
|
46
45
|
headers: params.headers,
|
|
46
|
+
signal: params.signal,
|
|
47
47
|
params: {
|
|
48
48
|
relativeToDid: viewer,
|
|
49
49
|
viewer: viewer ?? undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSuggestions.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/getSuggestions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAA+B,WAAW,EAAE,MAAM,cAAc,CAAA;AASvE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"getSuggestions.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/getSuggestions.ts"],"names":[],"mappings":"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","sourcesContent":["import { mapDefined, noUndefinedVals } from '@atproto/common'\nimport { type Client, type DidString, isDidString } from '@atproto/lex'\nimport type { Headers as HeadersMap, Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport type { DataPlaneClient } from '../../../../data-plane/index.js'\nimport type {\n HydrateCtx,\n HydrationState,\n Hydrator,\n} from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport { createPipeline } from '../../../../pipeline.js'\nimport { getAtprotoPassthroughHeaders } from '../../../../util/headers.js'\nimport type { Views } from '../../../../views/index.js'\nimport { fillPage, resHeaders } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getSuggestions = createPipeline(\n skeleton,\n hydration,\n noBlocksOrMutes,\n presentation,\n )\n server.add(app.bsky.actor.getSuggestions, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ params, auth, req, signal }) => {\n const viewer = auth.credentials.iss\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({ viewer, labelers })\n const headers = noUndefinedVals({\n 'accept-language': req.headers['accept-language'],\n ...getAtprotoPassthroughHeaders(req),\n })\n const { resHeaders: resultHeaders, ...result } = await fillPage({\n cursor: params.cursor,\n limit: params.limit,\n fetch: ({ cursor, limit }) =>\n getSuggestions(\n { ...params, cursor, limit, hydrateCtx, headers, signal },\n ctx,\n ),\n items: (r) => r.actors,\n })\n const suggestionsResHeaders = noUndefinedVals({\n 'content-language': resultHeaders?.get('content-language'),\n })\n return {\n encoding: 'application/json',\n body: result,\n headers: {\n ...suggestionsResHeaders,\n ...resHeaders({ labelers: hydrateCtx.labelers }),\n },\n }\n },\n })\n}\n\nconst skeleton = async (input: {\n ctx: Context\n params: Params\n}): Promise<Skeleton> => {\n const { ctx, params } = input\n const viewer = params.hydrateCtx.viewer\n\n if (viewer && ctx.suggestionsClient) {\n const res = await ctx.suggestionsClient.xrpc(\n app.bsky.unspecced.getSuggestionsSkeleton,\n {\n headers: params.headers,\n signal: params.signal,\n params: {\n relativeToDid: viewer,\n viewer: viewer ?? undefined,\n limit: params.limit,\n cursor: params.cursor,\n },\n },\n )\n return {\n dids: res.body.actors.map((a) => a.did),\n cursor: res.body.cursor,\n recId: res.body.recId,\n recIdStr: res.body.recIdStr,\n resHeaders: res.headers,\n }\n } else {\n // @NOTE for appview swap moving to rkey-based cursors which are somewhat permissive, should not hard-break pagination\n const suggestions = await ctx.dataplane.getFollowSuggestions({\n actorDid: viewer ?? undefined,\n cursor: params.cursor,\n limit: params.limit,\n })\n // @NOTE filtering to avoid type casting\n let dids = suggestions.dids.filter(isDidString)\n if (viewer !== null) {\n const follows = await ctx.dataplane.getActorFollowsActors({\n actorDid: viewer,\n targetDids: dids,\n })\n dids = dids.filter((did, i) => !follows.uris[i] && did !== viewer)\n }\n return { dids, cursor: parseString(suggestions.cursor) }\n }\n}\n\nconst hydration = async (input: {\n ctx: Context\n params: Params\n skeleton: Skeleton\n}) => {\n const { ctx, params, skeleton } = input\n return ctx.hydrator.hydrateProfilesDetailed(skeleton.dids, params.hydrateCtx)\n}\n\nconst noBlocksOrMutes = (input: {\n ctx: Context\n params: Params\n skeleton: Skeleton\n hydration: HydrationState\n}) => {\n const { ctx, skeleton, hydration } = input\n skeleton.dids = skeleton.dids.filter(\n (did) =>\n !ctx.views.viewerBlockExists(did, hydration) &&\n !ctx.views.viewerMuteExists(did, hydration),\n )\n return skeleton\n}\n\nconst presentation = (input: {\n ctx: Context\n params: Params\n skeleton: Skeleton\n hydration: HydrationState\n}) => {\n const { ctx, skeleton, hydration } = input\n const actors = mapDefined(skeleton.dids, (did) =>\n ctx.views.profileKnownFollowers(did, hydration),\n )\n return {\n actors,\n cursor: skeleton.cursor,\n recId: skeleton.recId,\n recIdStr: skeleton.recIdStr,\n resHeaders: skeleton.resHeaders,\n }\n}\n\ntype Context = {\n suggestionsClient: Client | undefined\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n}\n\ntype Params = app.bsky.actor.getSuggestions.$Params & {\n hydrateCtx: HydrateCtx\n headers: HeadersMap\n signal: AbortSignal\n}\n\ntype Skeleton = {\n dids: DidString[]\n cursor?: string\n recId?: number\n recIdStr?: string\n resHeaders?: Headers\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchActors.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/searchActors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAkBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"searchActors.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/searchActors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAkBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAiDvD"}
|
|
@@ -8,7 +8,7 @@ export default function (server, ctx) {
|
|
|
8
8
|
const searchActors = createPipeline(skeleton, hydration, noBlocks, presentation);
|
|
9
9
|
server.add(app.bsky.actor.searchActors, {
|
|
10
10
|
auth: ctx.authVerifier.standardOptional,
|
|
11
|
-
handler: async ({ auth, params, req }) => {
|
|
11
|
+
handler: async ({ auth, params, req, signal }) => {
|
|
12
12
|
const { viewer, includeTakedowns, skipViewerBlocks } = ctx.authVerifier.parseCreds(auth);
|
|
13
13
|
const labelers = ctx.reqLabelers(req);
|
|
14
14
|
const hydrateCtx = await ctx.hydrator.createContext({
|
|
@@ -29,6 +29,7 @@ export default function (server, ctx) {
|
|
|
29
29
|
cursor,
|
|
30
30
|
limit,
|
|
31
31
|
hydrateCtx,
|
|
32
|
+
signal,
|
|
32
33
|
isV2Override: resolveSearchV2Override(req, ctx.cfg),
|
|
33
34
|
}, ctx),
|
|
34
35
|
items: (r) => r.actors,
|
|
@@ -53,7 +54,7 @@ const skeletonV1 = async (inputs) => {
|
|
|
53
54
|
cursor: params.cursor,
|
|
54
55
|
limit: params.limit,
|
|
55
56
|
viewer: params.hydrateCtx.viewer ?? undefined,
|
|
56
|
-
});
|
|
57
|
+
}, { signal: params.signal });
|
|
57
58
|
return {
|
|
58
59
|
dids: res.actors.map(({ did }) => did),
|
|
59
60
|
cursor: parseString(res.cursor),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchActors.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/searchActors.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;AAEhC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,YAAY,GAAG,cAAc,CACjC,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACtC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"searchActors.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/searchActors.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;AAEhC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,YAAY,GAAG,cAAc,CACjC,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACtC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;YAC/C,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;YACF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC;gBAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,YAAY,CACV;oBACE,GAAG,MAAM;oBACT,MAAM;oBACN,KAAK;oBACL,UAAU;oBACV,MAAM;oBACN,YAAY,EAAE,uBAAuB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;iBACpD,EACD,GAAG,CACJ;gBACH,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;aACvB,CAAC,CAAA;YACF,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,UAAU,GAAG,KAAK,EACtB,MAAwC,EACrB,EAAE;IACrB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAA;IAE1C,QAAQ;IACR,iBAAiB;IAEjB,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACrB,6CAA6C;QAC7C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CACrC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,EACvC;YACE,CAAC,EAAE,IAAI;YACP,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS;SAC9C,EACD,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAC1B,CAAA;QACD,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAgB,CAAC;YACnD,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;SAChC,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC;QAC3C,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAA;IACF,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAmB;QAC7B,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;KAChC,CAAA;AACH,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,KAAK,EACtB,MAAwC,EACrB,EAAE;IACrB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAA;IAE1C,uEAAuE;IACvE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,SAAS;SAC5B,cAAc,CAAC;QACd,MAAM,EAAE;YACN,KAAK,EAAE,IAAI;YACX,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,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAgB,CAAC;QACnD,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC1C,CAAA;AACH,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAuC,EAAE,EAAE;IACjE,MAAM,KAAK,GACT,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CACxC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CACrD,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAA;IAChC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAA;IAClD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,KAAK,EACrB,MAAmD,EACnD,EAAE;IACF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IACxC,OAAO,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AACvE,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,MAA+C,EAAE,EAAE;IACnE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAC3C,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CACtD,CAAA;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CACnB,MAAsD,EACtD,EAAE;IACF,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAC/C,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAClC,CAAA;IACD,OAAO;QACL,MAAM;QACN,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { mapDefined } from '@atproto/common'\nimport type { Client, DidString } 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 type { Views } from '../../../../views/index.js'\nimport { fillPage, resHeaders, resolveSearchV2Override } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchActors = createPipeline(\n skeleton,\n hydration,\n noBlocks,\n presentation,\n )\n server.add(app.bsky.actor.searchActors, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req, signal }) => {\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 const results = await fillPage({\n cursor: params.cursor,\n limit: params.limit,\n fetch: ({ cursor, limit }) =>\n searchActors(\n {\n ...params,\n cursor,\n limit,\n hydrateCtx,\n signal,\n isV2Override: resolveSearchV2Override(req, ctx.cfg),\n },\n ctx,\n ),\n items: (r) => r.actors,\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 term = params.q ?? params.term ?? ''\n\n // @TODO\n // add hits total\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.searchActorsSkeleton,\n {\n q: term,\n cursor: params.cursor,\n limit: params.limit,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n { signal: params.signal },\n )\n return {\n dids: res.actors.map(({ did }) => did as DidString),\n cursor: parseString(res.cursor),\n }\n }\n\n const res = await ctx.dataplane.searchActors({\n term,\n limit: params.limit,\n cursor: params.cursor,\n })\n return {\n dids: res.dids as DidString[],\n cursor: parseString(res.cursor),\n }\n}\n\nconst skeletonV2 = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const term = params.q ?? params.term ?? ''\n\n // Surface dataplane InvalidArgument errors as a 400 rather than a 500.\n const res = await ctx.dataplane\n .searchActorsV2({\n params: {\n query: term,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n cursor: params.cursor,\n },\n })\n .catch(asInvalidRequest())\n return {\n dids: res.actors.map(({ did }) => did as DidString),\n cursor: parseString(res.pageInfo?.cursor),\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.hydrateProfiles(skeleton.dids, params.hydrateCtx)\n}\n\nconst noBlocks = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, skeleton, hydration } = inputs\n skeleton.dids = skeleton.dids.filter(\n (did) => !ctx.views.viewerBlockExists(did, hydration),\n )\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const actors = mapDefined(skeleton.dids, (did) =>\n ctx.views.profile(did, hydration),\n )\n return {\n actors,\n cursor: skeleton.cursor,\n }\n}\n\ntype Context = {\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n searchClient?: Client\n}\n\ntype Params = app.bsky.actor.searchActors.$Params & {\n hydrateCtx: HydrateCtx\n signal: AbortSignal\n isV2Override: boolean\n}\n\ntype Skeleton = {\n dids: DidString[]\n hitsTotal?: number\n cursor?: string\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchActorsTypeahead.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/searchActorsTypeahead.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAiBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"searchActorsTypeahead.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/searchActorsTypeahead.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAiBxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAsCvD"}
|
|
@@ -7,7 +7,7 @@ export default function (server, ctx) {
|
|
|
7
7
|
const searchActorsTypeahead = createPipeline(skeleton, hydration, noBlocks, presentation);
|
|
8
8
|
server.add(app.bsky.actor.searchActorsTypeahead, {
|
|
9
9
|
auth: ctx.authVerifier.standardOptional,
|
|
10
|
-
handler: async ({ params, auth, req }) => {
|
|
10
|
+
handler: async ({ params, auth, req, signal }) => {
|
|
11
11
|
const viewer = auth.credentials.iss;
|
|
12
12
|
const labelers = ctx.reqLabelers(req);
|
|
13
13
|
const hydrateCtx = await ctx.hydrator.createContext({
|
|
@@ -21,6 +21,7 @@ export default function (server, ctx) {
|
|
|
21
21
|
const results = await searchActorsTypeahead({
|
|
22
22
|
...params,
|
|
23
23
|
hydrateCtx,
|
|
24
|
+
signal,
|
|
24
25
|
isV2Override: resolveSearchV2Override(req, ctx.cfg),
|
|
25
26
|
}, ctx);
|
|
26
27
|
return {
|
|
@@ -43,7 +44,7 @@ const skeletonV1 = async (inputs) => {
|
|
|
43
44
|
q: term,
|
|
44
45
|
limit: params.limit,
|
|
45
46
|
viewer: params.hydrateCtx.viewer ?? undefined,
|
|
46
|
-
});
|
|
47
|
+
}, { signal: params.signal });
|
|
47
48
|
return {
|
|
48
49
|
dids: actors.map(({ did }) => did),
|
|
49
50
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchActorsTypeahead.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/searchActorsTypeahead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI5C,OAAO,EAEL,gBAAgB,GACjB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAKL,cAAc,GACf,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAEtE,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,qBAAqB,GAAG,cAAc,CAC1C,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE;QAC/C,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"searchActorsTypeahead.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/actor/searchActorsTypeahead.ts"],"names":[],"mappings":"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","sourcesContent":["import { mapDefined } from '@atproto/common'\nimport type { Client, DidString } 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 { 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 type { Views } from '../../../../views/index.js'\nimport { resHeaders, resolveSearchV2Override } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchActorsTypeahead = createPipeline(\n skeleton,\n hydration,\n noBlocks,\n presentation,\n )\n server.add(app.bsky.actor.searchActorsTypeahead, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ params, auth, req, signal }) => {\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 results = await searchActorsTypeahead(\n {\n ...params,\n hydrateCtx,\n signal,\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 term = params.q ?? params.term ?? ''\n\n // @TODO\n // add typeahead option\n // add hits total\n\n if (ctx.searchClient) {\n const { actors } = await ctx.searchClient.call(\n app.bsky.unspecced.searchActorsSkeleton,\n {\n typeahead: true,\n q: term,\n limit: params.limit,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n { signal: params.signal },\n )\n return {\n dids: actors.map(({ did }) => did),\n }\n }\n\n const res = await ctx.dataplane.searchActors({\n term,\n limit: params.limit,\n })\n return {\n dids: res.dids as DidString[],\n }\n}\n\nconst skeletonV2 = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const term = params.q ?? params.term ?? ''\n\n // Surface dataplane InvalidArgument errors as a 400 rather than a 500.\n const res = await ctx.dataplane\n .searchActorsTypeahead({\n params: {\n query: term,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n },\n })\n .catch(asInvalidRequest())\n return {\n dids: res.actors.map(({ did }) => did as DidString),\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.hydrateProfilesBasic(skeleton.dids, params.hydrateCtx)\n}\n\nconst noBlocks = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, skeleton, hydration, params } = inputs\n skeleton.dids = skeleton.dids.filter((did) => {\n const actor = hydration.actors?.get(did)\n if (!actor) return false\n // Always display exact matches so that users can find profiles that they have blocked\n const term = (params.q ?? params.term ?? '').toLowerCase()\n const isExactMatch = actor.handle?.toLowerCase() === term\n return isExactMatch || !ctx.views.viewerBlockExists(did, hydration)\n })\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const actors = mapDefined(skeleton.dids, (did) =>\n ctx.views.profileBasic(did, hydration),\n )\n return {\n actors,\n }\n}\n\ntype Context = {\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n searchClient?: Client\n}\n\ntype Params = app.bsky.actor.searchActorsTypeahead.$Params & {\n hydrateCtx: HydrateCtx\n signal: AbortSignal\n isV2Override: boolean\n}\n\ntype Skeleton = {\n dids: DidString[]\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAuthorFeed.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/getAuthorFeed.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,+BAA+B,CAAA;AACnE,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,QAAQ,EAEd,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAInD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAGvD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA2CvD;AAUD,eAAO,MAAM,QAAQ,WAAkB;IACrC,GAAG,EAAE,OAAO,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf,KAAG,OAAO,CAAC,QAAQ,CA2DnB,CAAA;
|
|
1
|
+
{"version":3,"file":"getAuthorFeed.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/getAuthorFeed.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,+BAA+B,CAAA;AACnE,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,QAAQ,EAEd,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AAInD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAGvD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA2CvD;AAUD,eAAO,MAAM,QAAQ,WAAkB;IACrC,GAAG,EAAE,OAAO,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf,KAAG,OAAO,CAAC,QAAQ,CA2DnB,CAAA;AAqFD,KAAK,OAAO,GAAG;IACb,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,EAAE,eAAe,CAAA;CAC3B,CAAA;AAED,KAAK,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG;IAClD,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,KAAK,QAAQ,GAAG;IACd,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACrD,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA"}
|
|
@@ -103,10 +103,8 @@ const hydration = async (inputs) => {
|
|
|
103
103
|
const { ctx, params, skeleton } = inputs;
|
|
104
104
|
const [feedPostState, profileViewerState] = await Promise.all([
|
|
105
105
|
ctx.hydrator.hydrateFeedItems(skeleton.items, params.hydrateCtx, {
|
|
106
|
-
knownLikers: params.hydrateCtx.viewer &&
|
|
107
|
-
params.hydrateCtx.features.checkGate(params.hydrateCtx.features.Gate.KnownLikersFeedEnable)
|
|
108
|
-
? { subjectUris: skeleton.items.map((item) => item.post.uri) }
|
|
109
|
-
: undefined,
|
|
106
|
+
knownLikers: !!params.hydrateCtx.viewer &&
|
|
107
|
+
params.hydrateCtx.features.checkGate(params.hydrateCtx.features.Gate.KnownLikersFeedEnable),
|
|
110
108
|
}),
|
|
111
109
|
ctx.hydrator.hydrateProfileViewers([skeleton.actor.did], params.hydrateCtx),
|
|
112
110
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAuthorFeed.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/getAuthorFeed.ts"],"names":[],"mappings":"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","sourcesContent":["import { mapDefined } from '@atproto/common'\nimport type { AtUriString } from '@atproto/lex'\nimport { InvalidRequestError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport type { DataPlaneClient } from '../../../../data-plane/index.js'\nimport type { Actor } from '../../../../hydration/actor.js'\nimport type { FeedItem, Post } from '../../../../hydration/feed.js'\nimport {\n type HydrateCtx,\n type HydrationState,\n type Hydrator,\n mergeStates,\n} from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport { createPipeline } from '../../../../pipeline.js'\nimport { FeedType } from '../../../../proto/bsky_pb.js'\nimport { safePinnedPost, uriToDid } from '../../../../util/uris.js'\nimport type { Views } from '../../../../views/index.js'\nimport { clearlyBadCursor, fillPage, resHeaders } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getAuthorFeed = createPipeline(\n skeleton,\n hydration,\n noBlocksOrMutedReposts,\n presentation,\n )\n server.add(app.bsky.feed.getAuthorFeed, {\n auth: ctx.authVerifier.optionalStandardOrRole,\n handler: async ({ params, auth, 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 labelers,\n viewer,\n includeTakedowns,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({ viewer, req }),\n ),\n })\n\n const result = await fillPage({\n cursor: params.cursor,\n limit: params.limit,\n fetch: ({ cursor, limit }) =>\n getAuthorFeed({ ...params, cursor, limit, hydrateCtx }, ctx),\n items: (r) => r.feed,\n })\n\n const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer)\n\n return {\n encoding: 'application/json',\n body: result,\n headers: resHeaders({\n repoRev,\n labelers: hydrateCtx.labelers,\n }),\n }\n },\n })\n}\n\nconst FILTER_TO_FEED_TYPE = {\n posts_with_replies: undefined, // default: all posts, replies, and reposts\n posts_no_replies: FeedType.POSTS_NO_REPLIES,\n posts_with_media: FeedType.POSTS_WITH_MEDIA,\n posts_and_author_threads: FeedType.POSTS_AND_AUTHOR_THREADS,\n posts_with_video: FeedType.POSTS_WITH_VIDEO,\n}\n\nexport const skeleton = async (inputs: {\n ctx: Context\n params: Params\n}): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const [did] = await ctx.hydrator.actor.getDids([params.actor])\n if (!did) {\n throw new InvalidRequestError('Profile not found')\n }\n const actors = await ctx.hydrator.actor.getActors([did], {\n includeTakedowns: params.hydrateCtx.includeTakedowns,\n skipCacheForDids: params.hydrateCtx.skipCacheForViewer,\n })\n const actor = actors.get(did)\n if (!actor) {\n throw new InvalidRequestError('Profile not found')\n }\n if (clearlyBadCursor(params.cursor)) {\n return { actor, filter: params.filter, items: [] }\n }\n\n const pinnedPost = safePinnedPost(actor.profile?.pinnedPost)\n const isFirstPageRequest = !params.cursor\n const shouldInsertPinnedPost =\n isFirstPageRequest &&\n params.includePins &&\n pinnedPost &&\n uriToDid(pinnedPost.uri) === actor.did\n\n const res = await ctx.dataplane.getAuthorFeed({\n actorDid: did,\n limit: params.limit,\n cursor: params.cursor,\n feedType: FILTER_TO_FEED_TYPE[params.filter],\n })\n\n let items: FeedItem[] = res.items.map((item) => ({\n post: { uri: item.uri as AtUriString, cid: item.cid || undefined },\n repost: item.repost\n ? { uri: item.repost as AtUriString, cid: item.repostCid || undefined }\n : undefined,\n }))\n\n if (shouldInsertPinnedPost && pinnedPost) {\n const pinnedItem = {\n post: {\n uri: pinnedPost.uri,\n cid: pinnedPost.cid,\n },\n authorPinned: true,\n }\n\n items = items.filter((item) => item.post.uri !== pinnedItem.post.uri)\n items.unshift(pinnedItem)\n }\n\n return {\n actor,\n filter: params.filter,\n items,\n cursor: parseString(res.cursor),\n }\n}\n\nconst hydration = async (inputs: {\n ctx: Context\n params: Params\n skeleton: Skeleton\n}): Promise<HydrationState> => {\n const { ctx, params, skeleton } = inputs\n const [feedPostState, profileViewerState] = await Promise.all([\n ctx.hydrator.hydrateFeedItems(skeleton.items, params.hydrateCtx, {\n knownLikers:\n params.hydrateCtx.viewer &&\n params.hydrateCtx.features.checkGate(\n params.hydrateCtx.features.Gate.KnownLikersFeedEnable,\n )\n ? { subjectUris: skeleton.items.map((item) => item.post.uri) }\n : undefined,\n }),\n ctx.hydrator.hydrateProfileViewers([skeleton.actor.did], params.hydrateCtx),\n ])\n return mergeStates(feedPostState, profileViewerState)\n}\n\nconst noBlocksOrMutedReposts = (inputs: {\n ctx: Context\n skeleton: Skeleton\n hydration: HydrationState\n}): Skeleton => {\n const { ctx, skeleton, hydration } = inputs\n const relationship = hydration.profileViewers?.get(skeleton.actor.did)\n if (\n relationship &&\n (relationship.blocking || ctx.views.blockingByList(relationship, hydration))\n ) {\n throw new InvalidRequestError(\n `Requester has blocked actor: ${skeleton.actor.did}`,\n 'BlockedActor',\n )\n }\n if (\n relationship &&\n (relationship.blockedBy || ctx.views.blockedByList(relationship, hydration))\n ) {\n throw new InvalidRequestError(\n `Requester is blocked by actor: ${skeleton.actor.did}`,\n 'BlockedByActor',\n )\n }\n\n const checkBlocksAndMutes = (item: FeedItem) => {\n const bam = ctx.views.feedItemBlocksAndMutes(item, hydration)\n return (\n !bam.authorBlocked &&\n !bam.originatorBlocked &&\n (!bam.authorMuted || bam.originatorMuted) // repost of muted content\n )\n }\n\n if (skeleton.filter === 'posts_and_author_threads') {\n // ensure replies are only included if the feed contains all\n // replies up to the thread root (i.e. a complete self-thread.)\n const selfThread = new SelfThreadTracker(skeleton.items, hydration)\n skeleton.items = skeleton.items.filter((item) => {\n return (\n checkBlocksAndMutes(item) &&\n (item.repost || item.authorPinned || selfThread.ok(item.post.uri))\n )\n })\n } else {\n skeleton.items = skeleton.items.filter(checkBlocksAndMutes)\n }\n\n return skeleton\n}\n\nconst presentation = (inputs: {\n ctx: Context\n skeleton: Skeleton\n hydration: HydrationState\n}) => {\n const { ctx, skeleton, hydration } = inputs\n const feed = mapDefined(skeleton.items, (item) =>\n ctx.views.feedViewPost(item, hydration),\n )\n return { feed, cursor: skeleton.cursor }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n dataplane: DataPlaneClient\n}\n\ntype Params = app.bsky.feed.getAuthorFeed.$Params & {\n hydrateCtx: HydrateCtx\n}\n\ntype Skeleton = {\n actor: Actor\n items: FeedItem[]\n filter: app.bsky.feed.getAuthorFeed.$Params['filter']\n cursor?: string\n}\n\nclass SelfThreadTracker {\n feedUris = new Set<AtUriString>()\n cache = new Map<AtUriString, boolean>()\n\n constructor(\n items: FeedItem[],\n private hydration: HydrationState,\n ) {\n items.forEach((item) => {\n if (!item.repost) {\n this.feedUris.add(item.post.uri)\n }\n })\n }\n\n ok(uri: AtUriString, loop = new Set<AtUriString>()) {\n // if we've already checked this uri, pull from the cache\n if (this.cache.has(uri)) {\n return this.cache.get(uri) ?? false\n }\n // loop detection\n if (loop.has(uri)) {\n this.cache.set(uri, false)\n return false\n } else {\n loop.add(uri)\n }\n // cache through the result\n const result = this._ok(uri, loop)\n this.cache.set(uri, result)\n return result\n }\n\n private _ok(uri: AtUriString, loop: Set<AtUriString>): boolean {\n // must be in the feed to be in a self-thread\n if (!this.feedUris.has(uri)) {\n return false\n }\n // must be hydratable to be part of self-thread\n const post = this.hydration.posts?.get(uri)\n if (!post) {\n return false\n }\n // root posts (no parent) are trivial case of self-thread\n const parentUri = getParentUri(post)\n if (parentUri === null) {\n return true\n }\n // recurse w/ cache: this post is in a self-thread if its parent is.\n return this.ok(parentUri, loop)\n }\n}\n\nfunction getParentUri(post: Post) {\n return post.record.reply?.parent.uri ?? null\n}\n"]}
|
|
1
|
+
{"version":3,"file":"getAuthorFeed.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/getAuthorFeed.ts"],"names":[],"mappings":"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","sourcesContent":["import { mapDefined } from '@atproto/common'\nimport type { AtUriString } from '@atproto/lex'\nimport { InvalidRequestError, type Server } from '@atproto/xrpc-server'\nimport type { AppContext } from '../../../../context.js'\nimport type { DataPlaneClient } from '../../../../data-plane/index.js'\nimport type { Actor } from '../../../../hydration/actor.js'\nimport type { FeedItem, Post } from '../../../../hydration/feed.js'\nimport {\n type HydrateCtx,\n type HydrationState,\n type Hydrator,\n mergeStates,\n} from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport { createPipeline } from '../../../../pipeline.js'\nimport { FeedType } from '../../../../proto/bsky_pb.js'\nimport { safePinnedPost, uriToDid } from '../../../../util/uris.js'\nimport type { Views } from '../../../../views/index.js'\nimport { clearlyBadCursor, fillPage, resHeaders } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getAuthorFeed = createPipeline(\n skeleton,\n hydration,\n noBlocksOrMutedReposts,\n presentation,\n )\n server.add(app.bsky.feed.getAuthorFeed, {\n auth: ctx.authVerifier.optionalStandardOrRole,\n handler: async ({ params, auth, 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 labelers,\n viewer,\n includeTakedowns,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({ viewer, req }),\n ),\n })\n\n const result = await fillPage({\n cursor: params.cursor,\n limit: params.limit,\n fetch: ({ cursor, limit }) =>\n getAuthorFeed({ ...params, cursor, limit, hydrateCtx }, ctx),\n items: (r) => r.feed,\n })\n\n const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer)\n\n return {\n encoding: 'application/json',\n body: result,\n headers: resHeaders({\n repoRev,\n labelers: hydrateCtx.labelers,\n }),\n }\n },\n })\n}\n\nconst FILTER_TO_FEED_TYPE = {\n posts_with_replies: undefined, // default: all posts, replies, and reposts\n posts_no_replies: FeedType.POSTS_NO_REPLIES,\n posts_with_media: FeedType.POSTS_WITH_MEDIA,\n posts_and_author_threads: FeedType.POSTS_AND_AUTHOR_THREADS,\n posts_with_video: FeedType.POSTS_WITH_VIDEO,\n}\n\nexport const skeleton = async (inputs: {\n ctx: Context\n params: Params\n}): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const [did] = await ctx.hydrator.actor.getDids([params.actor])\n if (!did) {\n throw new InvalidRequestError('Profile not found')\n }\n const actors = await ctx.hydrator.actor.getActors([did], {\n includeTakedowns: params.hydrateCtx.includeTakedowns,\n skipCacheForDids: params.hydrateCtx.skipCacheForViewer,\n })\n const actor = actors.get(did)\n if (!actor) {\n throw new InvalidRequestError('Profile not found')\n }\n if (clearlyBadCursor(params.cursor)) {\n return { actor, filter: params.filter, items: [] }\n }\n\n const pinnedPost = safePinnedPost(actor.profile?.pinnedPost)\n const isFirstPageRequest = !params.cursor\n const shouldInsertPinnedPost =\n isFirstPageRequest &&\n params.includePins &&\n pinnedPost &&\n uriToDid(pinnedPost.uri) === actor.did\n\n const res = await ctx.dataplane.getAuthorFeed({\n actorDid: did,\n limit: params.limit,\n cursor: params.cursor,\n feedType: FILTER_TO_FEED_TYPE[params.filter],\n })\n\n let items: FeedItem[] = res.items.map((item) => ({\n post: { uri: item.uri as AtUriString, cid: item.cid || undefined },\n repost: item.repost\n ? { uri: item.repost as AtUriString, cid: item.repostCid || undefined }\n : undefined,\n }))\n\n if (shouldInsertPinnedPost && pinnedPost) {\n const pinnedItem = {\n post: {\n uri: pinnedPost.uri,\n cid: pinnedPost.cid,\n },\n authorPinned: true,\n }\n\n items = items.filter((item) => item.post.uri !== pinnedItem.post.uri)\n items.unshift(pinnedItem)\n }\n\n return {\n actor,\n filter: params.filter,\n items,\n cursor: parseString(res.cursor),\n }\n}\n\nconst hydration = async (inputs: {\n ctx: Context\n params: Params\n skeleton: Skeleton\n}): Promise<HydrationState> => {\n const { ctx, params, skeleton } = inputs\n const [feedPostState, profileViewerState] = await Promise.all([\n ctx.hydrator.hydrateFeedItems(skeleton.items, params.hydrateCtx, {\n knownLikers:\n !!params.hydrateCtx.viewer &&\n params.hydrateCtx.features.checkGate(\n params.hydrateCtx.features.Gate.KnownLikersFeedEnable,\n ),\n }),\n ctx.hydrator.hydrateProfileViewers([skeleton.actor.did], params.hydrateCtx),\n ])\n return mergeStates(feedPostState, profileViewerState)\n}\n\nconst noBlocksOrMutedReposts = (inputs: {\n ctx: Context\n skeleton: Skeleton\n hydration: HydrationState\n}): Skeleton => {\n const { ctx, skeleton, hydration } = inputs\n const relationship = hydration.profileViewers?.get(skeleton.actor.did)\n if (\n relationship &&\n (relationship.blocking || ctx.views.blockingByList(relationship, hydration))\n ) {\n throw new InvalidRequestError(\n `Requester has blocked actor: ${skeleton.actor.did}`,\n 'BlockedActor',\n )\n }\n if (\n relationship &&\n (relationship.blockedBy || ctx.views.blockedByList(relationship, hydration))\n ) {\n throw new InvalidRequestError(\n `Requester is blocked by actor: ${skeleton.actor.did}`,\n 'BlockedByActor',\n )\n }\n\n const checkBlocksAndMutes = (item: FeedItem) => {\n const bam = ctx.views.feedItemBlocksAndMutes(item, hydration)\n return (\n !bam.authorBlocked &&\n !bam.originatorBlocked &&\n (!bam.authorMuted || bam.originatorMuted) // repost of muted content\n )\n }\n\n if (skeleton.filter === 'posts_and_author_threads') {\n // ensure replies are only included if the feed contains all\n // replies up to the thread root (i.e. a complete self-thread.)\n const selfThread = new SelfThreadTracker(skeleton.items, hydration)\n skeleton.items = skeleton.items.filter((item) => {\n return (\n checkBlocksAndMutes(item) &&\n (item.repost || item.authorPinned || selfThread.ok(item.post.uri))\n )\n })\n } else {\n skeleton.items = skeleton.items.filter(checkBlocksAndMutes)\n }\n\n return skeleton\n}\n\nconst presentation = (inputs: {\n ctx: Context\n skeleton: Skeleton\n hydration: HydrationState\n}) => {\n const { ctx, skeleton, hydration } = inputs\n const feed = mapDefined(skeleton.items, (item) =>\n ctx.views.feedViewPost(item, hydration),\n )\n return { feed, cursor: skeleton.cursor }\n}\n\ntype Context = {\n hydrator: Hydrator\n views: Views\n dataplane: DataPlaneClient\n}\n\ntype Params = app.bsky.feed.getAuthorFeed.$Params & {\n hydrateCtx: HydrateCtx\n}\n\ntype Skeleton = {\n actor: Actor\n items: FeedItem[]\n filter: app.bsky.feed.getAuthorFeed.$Params['filter']\n cursor?: string\n}\n\nclass SelfThreadTracker {\n feedUris = new Set<AtUriString>()\n cache = new Map<AtUriString, boolean>()\n\n constructor(\n items: FeedItem[],\n private hydration: HydrationState,\n ) {\n items.forEach((item) => {\n if (!item.repost) {\n this.feedUris.add(item.post.uri)\n }\n })\n }\n\n ok(uri: AtUriString, loop = new Set<AtUriString>()) {\n // if we've already checked this uri, pull from the cache\n if (this.cache.has(uri)) {\n return this.cache.get(uri) ?? false\n }\n // loop detection\n if (loop.has(uri)) {\n this.cache.set(uri, false)\n return false\n } else {\n loop.add(uri)\n }\n // cache through the result\n const result = this._ok(uri, loop)\n this.cache.set(uri, result)\n return result\n }\n\n private _ok(uri: AtUriString, loop: Set<AtUriString>): boolean {\n // must be in the feed to be in a self-thread\n if (!this.feedUris.has(uri)) {\n return false\n }\n // must be hydratable to be part of self-thread\n const post = this.hydration.posts?.get(uri)\n if (!post) {\n return false\n }\n // root posts (no parent) are trivial case of self-thread\n const parentUri = getParentUri(post)\n if (parentUri === null) {\n return true\n }\n // recurse w/ cache: this post is in a self-thread if its parent is.\n return this.ok(parentUri, loop)\n }\n}\n\nfunction getParentUri(post: Post) {\n return post.record.reply?.parent.uri ?? null\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFeed.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/getFeed.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,OAAO,IAAI,UAAU,EAE1B,KAAK,MAAM,EAKZ,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAOxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;
|
|
1
|
+
{"version":3,"file":"getFeed.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/getFeed.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,OAAO,IAAI,UAAU,EAE1B,KAAK,MAAM,EAKZ,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAOxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAanE,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA0DvD;AAwGD;;;GAGG;AACH,eAAO,MAAM,cAAc,QACpB,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,cAAc,CAAC,UAC3C;IACN,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE;QACV,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC5B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,CAAA;KAC7D,CAAA;CACF,KACA,MAAM,GAAG,SAaX,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAC3B,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,qBAAqB,CAAC,UACzD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KACvB,MAAM,GAAG,SACgE,CAAA;AAsH5E,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,gBAAgB,EAAE,CAAA;IAC7B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG;IACxC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA"}
|
|
@@ -4,6 +4,7 @@ import { InvalidRequestError, ServerTimer, UpstreamFailureError, XRPCError, serv
|
|
|
4
4
|
import { Code, getServiceEndpoint, isDataplaneError, unpackIdentityServices, } from '../../../../data-plane/index.js';
|
|
5
5
|
import { app } from '../../../../lexicons/index.js';
|
|
6
6
|
import { createPipeline, } from '../../../../pipeline.js';
|
|
7
|
+
import { getAtprotoPassthroughHeaders } from '../../../../util/headers.js';
|
|
7
8
|
import { BSKY_USER_AGENT, resHeaders } from '../../../util.js';
|
|
8
9
|
export default function (server, ctx) {
|
|
9
10
|
const getFeed = createPipeline(skeleton, hydration, noBlocksOrMutes, presentation);
|
|
@@ -15,7 +16,7 @@ export default function (server, ctx) {
|
|
|
15
16
|
},
|
|
16
17
|
skipAudCheck: true,
|
|
17
18
|
}),
|
|
18
|
-
handler: async ({ params, auth, req }) => {
|
|
19
|
+
handler: async ({ params, auth, req, signal }) => {
|
|
19
20
|
const viewer = auth.credentials.iss;
|
|
20
21
|
const labelers = ctx.reqLabelers(req);
|
|
21
22
|
const hydrateCtx = await ctx.hydrator.createContext({
|
|
@@ -27,14 +28,12 @@ export default function (server, ctx) {
|
|
|
27
28
|
'user-agent': BSKY_USER_AGENT,
|
|
28
29
|
authorization: req.headers['authorization'],
|
|
29
30
|
'accept-language': req.headers['accept-language'],
|
|
30
|
-
|
|
31
|
-
? req.headers['x-bsky-topics'].join(',')
|
|
32
|
-
: req.headers['x-bsky-topics'],
|
|
31
|
+
...getAtprotoPassthroughHeaders(req),
|
|
33
32
|
});
|
|
34
33
|
// @NOTE feed cursors should not be affected by appview swap
|
|
35
34
|
// Do not refill filtered pages. Overfetching from algorithmic feeds can
|
|
36
35
|
// advance their state and prevent omitted items from appearing later.
|
|
37
|
-
const result = await getFeed({ ...params, hydrateCtx, headers }, ctx);
|
|
36
|
+
const result = await getFeed({ ...params, hydrateCtx, headers, signal }, ctx);
|
|
38
37
|
const { timerSkele, timerHydr, resHeaders: feedResHeaders, ...body } = result;
|
|
39
38
|
return {
|
|
40
39
|
encoding: 'application/json',
|
|
@@ -66,10 +65,8 @@ const hydration = async (inputs) => {
|
|
|
66
65
|
const { ctx, params, skeleton } = inputs;
|
|
67
66
|
const timerHydr = new ServerTimer('hydr').start();
|
|
68
67
|
const hydration = await ctx.hydrator.hydrateFeedItems(skeleton.items, params.hydrateCtx, {
|
|
69
|
-
knownLikers: params.hydrateCtx.viewer &&
|
|
70
|
-
params.hydrateCtx.features.checkGate(params.hydrateCtx.features.Gate.KnownLikersFeedEnable)
|
|
71
|
-
? { subjectUris: skeleton.items.map((item) => item.post.uri) }
|
|
72
|
-
: undefined,
|
|
68
|
+
knownLikers: !!params.hydrateCtx.viewer &&
|
|
69
|
+
params.hydrateCtx.features.checkGate(params.hydrateCtx.features.Gate.KnownLikersFeedEnable),
|
|
73
70
|
});
|
|
74
71
|
skeleton.timerHydr = timerHydr.stop();
|
|
75
72
|
return hydration;
|
|
@@ -169,7 +166,10 @@ const skeletonFromFeedGen = async (ctx, params) => {
|
|
|
169
166
|
// @TODO currently passthrough auth headers from pds
|
|
170
167
|
const result = await xrpcSafe(endpoint, app.bsky.feed.getFeedSkeleton, {
|
|
171
168
|
strictResponseProcessing: false,
|
|
172
|
-
signal: AbortSignal.
|
|
169
|
+
signal: AbortSignal.any([
|
|
170
|
+
params.signal,
|
|
171
|
+
AbortSignal.timeout(ctx.cfg.feedGenSkeletonTimeout),
|
|
172
|
+
]),
|
|
173
173
|
headers,
|
|
174
174
|
params: {
|
|
175
175
|
feed: params.feed,
|