@atproto/bsky 0.0.249 → 0.0.251
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 +30 -0
- package/dist/api/age-assurance/const.d.ts.map +1 -1
- package/dist/api/age-assurance/const.js +19 -0
- package/dist/api/age-assurance/const.js.map +1 -1
- package/dist/api/age-assurance/kws/age-verified.d.ts +20 -0
- package/dist/api/age-assurance/kws/age-verified.d.ts.map +1 -1
- package/dist/api/age-assurance/kws/age-verified.js +6 -0
- package/dist/api/age-assurance/kws/age-verified.js.map +1 -1
- package/dist/api/app/bsky/feed/getFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getFeed.js +4 -0
- package/dist/api/app/bsky/feed/getFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/searchPosts.js +5 -0
- package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
- package/dist/api/app/bsky/feed/searchPostsV2.js +5 -0
- package/dist/api/app/bsky/feed/searchPostsV2.js.map +1 -1
- package/dist/api/app/bsky/graph/muteActor.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/muteActor.js +3 -0
- package/dist/api/app/bsky/graph/muteActor.js.map +1 -1
- package/dist/api/kws/types.d.ts +33 -0
- package/dist/api/kws/types.d.ts.map +1 -1
- package/dist/api/kws/types.js +3 -0
- package/dist/api/kws/types.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -1
- package/dist/data-plane/index.d.ts +0 -1
- package/dist/data-plane/index.d.ts.map +1 -1
- package/dist/data-plane/index.js +0 -1
- package/dist/data-plane/index.js.map +1 -1
- package/dist/data-plane/server/bsync-subscription.d.ts +47 -0
- package/dist/data-plane/server/bsync-subscription.d.ts.map +1 -0
- package/dist/data-plane/server/bsync-subscription.js +461 -0
- package/dist/data-plane/server/bsync-subscription.js.map +1 -0
- package/dist/data-plane/server/index.d.ts +1 -0
- package/dist/data-plane/server/index.d.ts.map +1 -1
- package/dist/data-plane/server/index.js +1 -0
- package/dist/data-plane/server/index.js.map +1 -1
- package/dist/hydration/feed.d.ts +1 -2
- package/dist/hydration/feed.d.ts.map +1 -1
- package/dist/hydration/feed.js.map +1 -1
- package/dist/lexicons/app/bsky/ageassurance/defs.defs.d.ts +4 -0
- package/dist/lexicons/app/bsky/ageassurance/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/ageassurance/defs.defs.js +3 -0
- package/dist/lexicons/app/bsky/ageassurance/defs.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/defs.defs.js +1 -1
- package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/group/editGroup.defs.d.ts +4 -4
- package/dist/lexicons/chat/bsky/group/editGroup.defs.js +2 -2
- package/dist/lexicons/chat/bsky/group/editGroup.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/moderation/defs.defs.js +1 -1
- package/dist/lexicons/chat/bsky/moderation/defs.defs.js.map +1 -1
- package/package.json +10 -10
- package/src/api/age-assurance/const.ts +19 -0
- package/src/api/age-assurance/kws/age-verified.test.ts +98 -0
- package/src/api/age-assurance/kws/age-verified.ts +6 -0
- package/src/api/app/bsky/feed/getFeed.ts +5 -0
- package/src/api/app/bsky/feed/searchPosts.ts +7 -0
- package/src/api/app/bsky/feed/searchPostsV2.ts +7 -0
- package/src/api/app/bsky/graph/muteActor.ts +3 -0
- package/src/api/kws/types.ts +11 -0
- package/src/api/kws/util.test.ts +50 -0
- package/src/config.ts +9 -0
- package/src/data-plane/index.ts +0 -1
- package/src/data-plane/{bsync/index.ts → server/bsync-subscription.ts} +245 -121
- package/src/data-plane/server/index.ts +1 -0
- package/src/hydration/feed.ts +1 -2
- package/tests/__snapshots__/feed-generation.test.ts.snap +62 -15
- package/tests/data-plane/thread-mutes.test.ts +2 -0
- package/tests/feed-generation.test.ts +55 -9
- package/tests/stash.test.ts +6 -1
- package/tests/views/age-assurance-v2.test.ts +3 -0
- package/tests/views/age-assurance.test.ts +8 -0
- package/tests/views/bookmarks.test.ts +19 -0
- package/tests/views/drafts.test.ts +25 -2
- package/tests/views/mute-lists.test.ts +2 -0
- package/tests/views/mutes.test.ts +1 -0
- package/tests/views/notifications.test.ts +16 -0
- package/tests/views/post-search.test.ts +81 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/data-plane/bsync/index.d.ts +0 -11
- package/dist/data-plane/bsync/index.d.ts.map +0 -1
- package/dist/data-plane/bsync/index.js +0 -376
- package/dist/data-plane/bsync/index.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# @atproto/bsky
|
|
2
2
|
|
|
3
|
+
## 0.0.251
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#5163](https://github.com/bluesky-social/atproto/pull/5163) [`8ffe18b`](https://github.com/bluesky-social/atproto/commit/8ffe18ba1ed6923651d68c91b86823881c04e21b) Thanks [@spacecowboy37](https://github.com/spacecowboy37)! - Pass through `#reasonPin` in feed hydration to allow feedgens to pin post
|
|
8
|
+
|
|
9
|
+
- [#5172](https://github.com/bluesky-social/atproto/pull/5172) [`6125ccb`](https://github.com/bluesky-social/atproto/commit/6125ccb6f7704717ebec95e0ae078694567e021b) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Add `searchTagsHideAll` config to filter tagged posts from all search surfaces
|
|
10
|
+
|
|
11
|
+
- Updated dependencies []:
|
|
12
|
+
- @atproto/lex@0.1.6
|
|
13
|
+
- @atproto/xrpc-server@0.11.5
|
|
14
|
+
- @atproto/sync@0.3.6
|
|
15
|
+
- @atproto-labs/xrpc-utils@0.1.4
|
|
16
|
+
|
|
17
|
+
## 0.0.250
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- [#5164](https://github.com/bluesky-social/atproto/pull/5164) [`7f88ef3`](https://github.com/bluesky-social/atproto/commit/7f88ef3a37b81a35cdb727c1daee00dfe89db6ca) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Support the new `timestamp` field, along with `transactionId` and `errorCode`, on KWS age verification status payloads.
|
|
22
|
+
|
|
23
|
+
- [#5166](https://github.com/bluesky-social/atproto/pull/5166) [`45278fd`](https://github.com/bluesky-social/atproto/commit/45278fd367ee50654ac5d09bd6da1451c8b0cd98) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Add `additionalVerificationMethods` to Age Assurance config and add required config for Texas
|
|
24
|
+
|
|
25
|
+
- [#4179](https://github.com/bluesky-social/atproto/pull/4179) [`85c25ef`](https://github.com/bluesky-social/atproto/commit/85c25efde14c1d0383f32bba21b21bdad2ae2619) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Subscribe to the real bsync service in dev-env instead of using a mock, with a `BsyncSubscription` on the bsky dataplane that consumes the mute, notif, and operation streams. Supports immediate shutdown (aborting in-flight long-polls) and cursor-based draining so tests stay fast.
|
|
26
|
+
|
|
27
|
+
- Updated dependencies [[`f2a0efe`](https://github.com/bluesky-social/atproto/commit/f2a0efe11140c8bebe488ac1f737e242d7f23f0b), [`45278fd`](https://github.com/bluesky-social/atproto/commit/45278fd367ee50654ac5d09bd6da1451c8b0cd98), [`f2a0efe`](https://github.com/bluesky-social/atproto/commit/f2a0efe11140c8bebe488ac1f737e242d7f23f0b)]:
|
|
28
|
+
- @atproto/xrpc-server@0.11.4
|
|
29
|
+
- @atproto/api@0.20.23
|
|
30
|
+
- @atproto-labs/xrpc-utils@0.1.3
|
|
31
|
+
- @atproto/sync@0.3.5
|
|
32
|
+
|
|
3
33
|
## 0.0.249
|
|
4
34
|
|
|
5
35
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../../src/api/age-assurance/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAE7C;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB;;;
|
|
1
|
+
{"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../../src/api/age-assurance/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAE7C;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB;;;CAgM/B,CAAA"}
|
|
@@ -157,6 +157,25 @@ export const AGE_ASSURANCE_CONFIG = app.bsky.ageassurance.defs.config.$build({
|
|
|
157
157
|
}),
|
|
158
158
|
],
|
|
159
159
|
},
|
|
160
|
+
{
|
|
161
|
+
countryCode: 'US',
|
|
162
|
+
regionCode: 'TX',
|
|
163
|
+
minAccessAge: 18,
|
|
164
|
+
// On-device age verification is permitted here in addition to the
|
|
165
|
+
// third-party (KWS) flow, which is always supported and remains as a
|
|
166
|
+
// fallback for platforms without the native age API (e.g. web) or
|
|
167
|
+
// insufficient device results.
|
|
168
|
+
additionalVerificationMethods: ['device'],
|
|
169
|
+
rules: [
|
|
170
|
+
app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({
|
|
171
|
+
age: 18,
|
|
172
|
+
access: 'full',
|
|
173
|
+
}),
|
|
174
|
+
app.bsky.ageassurance.defs.configRegionRuleDefault.$build({
|
|
175
|
+
access: 'none',
|
|
176
|
+
}),
|
|
177
|
+
],
|
|
178
|
+
},
|
|
160
179
|
{
|
|
161
180
|
countryCode: 'BR',
|
|
162
181
|
regionCode: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../src/api/age-assurance/const.ts"],"names":[],"mappings":"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","sourcesContent":["import { app } from '../../lexicons/index.js'\n\n/**\n * Age assurance configuration defining rules for various regions.\n *\n * NOTE: These rules are matched in order, and the first matching rule\n * determines the access level granted.\n *\n * NOTE: all regions MUST have a default rule as the last rule.\n */\nexport const AGE_ASSURANCE_CONFIG = app.bsky.ageassurance.defs.config.$build({\n regions: [\n {\n countryCode: 'GB',\n regionCode: undefined,\n minAccessAge: 13,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 13,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'AU',\n regionCode: undefined,\n minAccessAge: 16,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAccountNewerThan.$build({\n date: '2025-12-10T00:00:00Z',\n access: 'none',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 16,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 16,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'SD',\n minAccessAge: 13,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 13,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'WY',\n minAccessAge: 13,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 13,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'OH',\n minAccessAge: 13,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 13,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'MS',\n minAccessAge: 18,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'VA',\n minAccessAge: 16,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 16,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 16,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'TN',\n minAccessAge: 18,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'BR',\n regionCode: undefined,\n minAccessAge: 13,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 13,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n ],\n})\n"]}
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../src/api/age-assurance/const.ts"],"names":[],"mappings":"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","sourcesContent":["import { app } from '../../lexicons/index.js'\n\n/**\n * Age assurance configuration defining rules for various regions.\n *\n * NOTE: These rules are matched in order, and the first matching rule\n * determines the access level granted.\n *\n * NOTE: all regions MUST have a default rule as the last rule.\n */\nexport const AGE_ASSURANCE_CONFIG = app.bsky.ageassurance.defs.config.$build({\n regions: [\n {\n countryCode: 'GB',\n regionCode: undefined,\n minAccessAge: 13,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 13,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'AU',\n regionCode: undefined,\n minAccessAge: 16,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAccountNewerThan.$build({\n date: '2025-12-10T00:00:00Z',\n access: 'none',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 16,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 16,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'SD',\n minAccessAge: 13,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 13,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'WY',\n minAccessAge: 13,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 13,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'OH',\n minAccessAge: 13,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 13,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'MS',\n minAccessAge: 18,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'VA',\n minAccessAge: 16,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 16,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 16,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'TN',\n minAccessAge: 18,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'US',\n regionCode: 'TX',\n minAccessAge: 18,\n // On-device age verification is permitted here in addition to the\n // third-party (KWS) flow, which is always supported and remains as a\n // fallback for platforms without the native age API (e.g. web) or\n // insufficient device results.\n additionalVerificationMethods: ['device'],\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n {\n countryCode: 'BR',\n regionCode: undefined,\n minAccessAge: 13,\n rules: [\n app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 18,\n access: 'full',\n }),\n app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({\n age: 13,\n access: 'safe',\n }),\n app.bsky.ageassurance.defs.configRegionRuleDefault.$build({\n access: 'none',\n }),\n ],\n },\n ],\n})\n"]}
|
|
@@ -6,14 +6,20 @@ export declare const KWSAgeVerifiedStatusSchema: z.ZodObject<{
|
|
|
6
6
|
verified: z.ZodBoolean;
|
|
7
7
|
verifiedMinimumAge: z.ZodNumber;
|
|
8
8
|
transactionId: z.ZodOptional<z.ZodString>;
|
|
9
|
+
errorCode: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
10
|
+
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
9
11
|
}, "strip", z.ZodTypeAny, {
|
|
10
12
|
verified: boolean;
|
|
11
13
|
verifiedMinimumAge: number;
|
|
12
14
|
transactionId?: string | undefined;
|
|
15
|
+
errorCode?: string | null | undefined;
|
|
16
|
+
timestamp?: number | undefined;
|
|
13
17
|
}, {
|
|
14
18
|
verified: boolean;
|
|
15
19
|
verifiedMinimumAge: number;
|
|
16
20
|
transactionId?: string | undefined;
|
|
21
|
+
errorCode?: string | null | undefined;
|
|
22
|
+
timestamp?: number | undefined;
|
|
17
23
|
}>;
|
|
18
24
|
/**
|
|
19
25
|
* The KWS `status` object on `age-verified` payloads.
|
|
@@ -43,14 +49,20 @@ export declare const KWSAgeVerifiedWebhookSchema: z.ZodObject<{
|
|
|
43
49
|
verified: z.ZodBoolean;
|
|
44
50
|
verifiedMinimumAge: z.ZodNumber;
|
|
45
51
|
transactionId: z.ZodOptional<z.ZodString>;
|
|
52
|
+
errorCode: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
53
|
+
timestamp: z.ZodOptional<z.ZodNumber>;
|
|
46
54
|
}, "strip", z.ZodTypeAny, {
|
|
47
55
|
verified: boolean;
|
|
48
56
|
verifiedMinimumAge: number;
|
|
49
57
|
transactionId?: string | undefined;
|
|
58
|
+
errorCode?: string | null | undefined;
|
|
59
|
+
timestamp?: number | undefined;
|
|
50
60
|
}, {
|
|
51
61
|
verified: boolean;
|
|
52
62
|
verifiedMinimumAge: number;
|
|
53
63
|
transactionId?: string | undefined;
|
|
64
|
+
errorCode?: string | null | undefined;
|
|
65
|
+
timestamp?: number | undefined;
|
|
54
66
|
}>;
|
|
55
67
|
}, "strip", z.ZodTypeAny, {
|
|
56
68
|
email: string;
|
|
@@ -59,6 +71,8 @@ export declare const KWSAgeVerifiedWebhookSchema: z.ZodObject<{
|
|
|
59
71
|
verified: boolean;
|
|
60
72
|
verifiedMinimumAge: number;
|
|
61
73
|
transactionId?: string | undefined;
|
|
74
|
+
errorCode?: string | null | undefined;
|
|
75
|
+
timestamp?: number | undefined;
|
|
62
76
|
};
|
|
63
77
|
}, {
|
|
64
78
|
email: string;
|
|
@@ -67,6 +81,8 @@ export declare const KWSAgeVerifiedWebhookSchema: z.ZodObject<{
|
|
|
67
81
|
verified: boolean;
|
|
68
82
|
verifiedMinimumAge: number;
|
|
69
83
|
transactionId?: string | undefined;
|
|
84
|
+
errorCode?: string | null | undefined;
|
|
85
|
+
timestamp?: number | undefined;
|
|
70
86
|
};
|
|
71
87
|
}>;
|
|
72
88
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -81,6 +97,8 @@ export declare const KWSAgeVerifiedWebhookSchema: z.ZodObject<{
|
|
|
81
97
|
verified: boolean;
|
|
82
98
|
verifiedMinimumAge: number;
|
|
83
99
|
transactionId?: string | undefined;
|
|
100
|
+
errorCode?: string | null | undefined;
|
|
101
|
+
timestamp?: number | undefined;
|
|
84
102
|
};
|
|
85
103
|
};
|
|
86
104
|
}, {
|
|
@@ -95,6 +113,8 @@ export declare const KWSAgeVerifiedWebhookSchema: z.ZodObject<{
|
|
|
95
113
|
verified: boolean;
|
|
96
114
|
verifiedMinimumAge: number;
|
|
97
115
|
transactionId?: string | undefined;
|
|
116
|
+
errorCode?: string | null | undefined;
|
|
117
|
+
timestamp?: number | undefined;
|
|
98
118
|
};
|
|
99
119
|
};
|
|
100
120
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"age-verified.d.ts","sourceRoot":"","sources":["../../../../src/api/age-assurance/kws/age-verified.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;GAEG;AACH,eAAO,MAAM,0BAA0B
|
|
1
|
+
{"version":3,"file":"age-verified.d.ts","sourceRoot":"","sources":["../../../../src/api/age-assurance/kws/age-verified.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;EAUrC,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAE7E,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,oBAAoB,GAC3B,MAAM,CAER;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,QAC/B,MAAM,KACV,oBASF,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUtC,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAE/E;;GAEG;AACH,eAAO,MAAM,0BAA0B,QAChC,MAAM,KACV,qBAOF,CAAA"}
|
|
@@ -6,6 +6,12 @@ export const KWSAgeVerifiedStatusSchema = z.object({
|
|
|
6
6
|
verified: z.boolean(),
|
|
7
7
|
verifiedMinimumAge: z.number(),
|
|
8
8
|
transactionId: z.string().optional(),
|
|
9
|
+
// A code indicating the reason for failure, or null when verification
|
|
10
|
+
// succeeded.
|
|
11
|
+
errorCode: z.string().nullable().optional(),
|
|
12
|
+
// Epoch seconds indicating when KWS generated the payload. Optional so we
|
|
13
|
+
// remain compatible with payloads sent before this field was introduced.
|
|
14
|
+
timestamp: z.number().optional(),
|
|
9
15
|
});
|
|
10
16
|
export function serializeKWSAgeVerifiedStatus(status) {
|
|
11
17
|
return JSON.stringify(KWSAgeVerifiedStatusSchema.parse(status));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"age-verified.js","sourceRoot":"","sources":["../../../../src/api/age-assurance/kws/age-verified.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC9B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"age-verified.js","sourceRoot":"","sources":["../../../../src/api/age-assurance/kws/age-verified.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC9B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,sEAAsE;IACtE,aAAa;IACb,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,0EAA0E;IAC1E,yEAAyE;IACzE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAA;AAOF,MAAM,UAAU,6BAA6B,CAC3C,MAA4B;IAE5B,OAAO,IAAI,CAAC,SAAS,CAAC,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,GAAW,EACW,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7B,OAAO,0BAA0B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,EAAE,EAAE;YACzD,KAAK,EAAE,GAAG;SACX,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,6CAA6C;IAC/D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACvC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,2BAA2B;QAC9C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;QAC3B,MAAM,EAAE,0BAA0B;KACnC,CAAC;CACH,CAAC,CAAA;AAOF;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,GAAW,EACY,EAAE;IACzB,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACtC,OAAO,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IACjE,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { z } from 'zod'\n\n/**\n * Schema for KWS the `status` object on `age-verified` payloads.\n */\nexport const KWSAgeVerifiedStatusSchema = z.object({\n verified: z.boolean(),\n verifiedMinimumAge: z.number(),\n transactionId: z.string().optional(),\n // A code indicating the reason for failure, or null when verification\n // succeeded.\n errorCode: z.string().nullable().optional(),\n // Epoch seconds indicating when KWS generated the payload. Optional so we\n // remain compatible with payloads sent before this field was introduced.\n timestamp: z.number().optional(),\n})\n\n/**\n * The KWS `status` object on `age-verified` payloads.\n */\nexport type KWSAgeVerifiedStatus = z.infer<typeof KWSAgeVerifiedStatusSchema>\n\nexport function serializeKWSAgeVerifiedStatus(\n status: KWSAgeVerifiedStatus,\n): string {\n return JSON.stringify(KWSAgeVerifiedStatusSchema.parse(status))\n}\n\n/**\n * Parse KWS `age-verified` status object.\n */\nexport const parseKWSAgeVerifiedStatus = (\n raw: string,\n): KWSAgeVerifiedStatus => {\n try {\n const value = JSON.parse(raw)\n return KWSAgeVerifiedStatusSchema.parse(value)\n } catch (err) {\n throw new Error(`Invalid KWS age-verified status: ${raw}`, {\n cause: err,\n })\n }\n}\n\n/**\n * Schema for KWS `age-verified` webhooks.\n *\n * Note: we don't use `.strict()` here so that we avoid breaking if KWS adds\n * fields, and some fields below are not strictly typed since we're not using\n * them.\n */\nexport const KWSAgeVerifiedWebhookSchema = z.object({\n name: z.string(),\n time: z.string(), // ISO8601 timestamp, but don't validate here\n orgId: z.string().uuid().optional(),\n productId: z.string().uuid().optional(),\n payload: z.object({\n email: z.string(), // no need to validate here\n externalPayload: z.string(),\n status: KWSAgeVerifiedStatusSchema,\n }),\n})\n\n/**\n * The raw KWS `age-verified` webhook body\n */\nexport type KWSWebhookAgeVerified = z.infer<typeof KWSAgeVerifiedWebhookSchema>\n\n/**\n * Parse KWS `age-verified` webhook body and its external payload.\n */\nexport const parseKWSAgeVerifiedWebhook = (\n raw: string,\n): KWSWebhookAgeVerified => {\n try {\n const value: unknown = JSON.parse(raw)\n return KWSAgeVerifiedWebhookSchema.parse(value)\n } catch (err) {\n throw new Error(`Invalid webhook body: ${raw}`, { cause: err })\n }\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,OAAO,IAAI,UAAU,EAErB,MAAM,EAKP,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAOnD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAaxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAgDvD;
|
|
1
|
+
{"version":3,"file":"getFeed.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/getFeed.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,OAAO,IAAI,UAAU,EAErB,MAAM,EAKP,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAOnD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAaxD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAgDvD;AA6LD,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"}
|
|
@@ -153,6 +153,10 @@ const skeletonFromFeedGen = async (ctx, params) => {
|
|
|
153
153
|
app.bsky.feed.defs.skeletonReasonRepost.$isTypeOf(item.reason)
|
|
154
154
|
? { uri: item.reason.repost }
|
|
155
155
|
: undefined,
|
|
156
|
+
authorPinned: item.reason != null &&
|
|
157
|
+
app.bsky.feed.defs.skeletonReasonPin.$isTypeOf(item.reason)
|
|
158
|
+
? true
|
|
159
|
+
: undefined,
|
|
156
160
|
feedContext: item.feedContext,
|
|
157
161
|
}));
|
|
158
162
|
const contentLang = result.headers.get('content-language');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFeed.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/getFeed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,QAAQ,GACT,MAAM,cAAc,CAAA;AACrB,OAAO,EAEL,mBAAmB,EAEnB,WAAW,EACX,oBAAoB,EACpB,SAAS,EACT,kBAAkB,GACnB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,IAAI,EACJ,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAKL,cAAc,GACf,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE9D,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,OAAO,GAAG,cAAc,CAC5B,QAAQ,EACR,SAAS,EACT,eAAe,EACf,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QAChC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,6BAA6B,CAAC;YACnD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBACnB,OAAO,CACL,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI;oBAC7C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CACtC,CAAA;YACH,CAAC;YACD,YAAY,EAAE,IAAI;SACnB,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,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,eAAe,CAAC;gBAC9B,YAAY,EAAE,eAAe;gBAC7B,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC;gBAC3C,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,4DAA4D;YAC5D,MAAM,EACJ,UAAU,EACV,SAAS,EACT,UAAU,EAAE,cAAc,EAC1B,GAAG,MAAM,EACV,GAAG,MAAM,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;YAE1D,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,GAAG,cAAc;oBACjB,GAAG,UAAU,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;oBAChD,eAAe,EAAE,kBAAkB,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;iBAC7D;aACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,QAAQ,GAAG,KAAK,EACpB,MAAwC,EACrB,EAAE;IACrB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IAC9B,MAAM,UAAU,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAA;IACnD,MAAM,EACJ,SAAS,EAAE,SAAS,EACpB,KAAK,EACL,MAAM,EACN,UAAU,EACV,GAAG,WAAW,EACf,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAE1C,OAAO;QACL,MAAM;QACN,KAAK,EAAE,SAAS;QAChB,KAAK;QACL,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE;QAC7B,SAAS,EAAE,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE;QAC1C,UAAU;QACV,WAAW;KACZ,CAAA;AACH,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,KAAK,EACrB,MAAmD,EACnD,EAAE;IACF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IACxC,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;IACjD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CACnD,QAAQ,CAAC,KAAK,EACd,MAAM,CAAC,UAAU,CAClB,CAAA;IACD,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;IACrC,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,MAA+C,EAAE,EAAE;IAC1E,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAC3C,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAC7D,OAAO,CACL,CAAC,GAAG,CAAC,aAAa;YAClB,CAAC,GAAG,CAAC,WAAW;YAChB,CAAC,GAAG,CAAC,iBAAiB;YACtB,CAAC,GAAG,CAAC,eAAe;YACpB,CAAC,GAAG,CAAC,qBAAqB,CAC3B,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,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,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;QAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QACpD,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,OAAO;YACL,GAAG,IAAI;YACP,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1D,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,GAAG,QAAQ,CAAC,WAAW;KACxB,CAAA;AACH,CAAC,CAAA;AAmBD,MAAM,mBAAmB,GAAG,KAAK,EAC/B,GAAY,EACZ,MAAc,EACS,EAAE;IACzB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAChC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;IAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,GAAG,CAAA;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,QAAkC,CAAA;IACtC,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,mBAAmB,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAA;QACzE,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC1D,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,EAAE;QAC9C,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,mBAAmB;KAC1B,CAAC,CAAA;IACF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,mBAAmB,CAC3B,2DAA2D,OAAO,EAAE,CACrE,CAAA;IACH,CAAC;IAED,oDAAoD;IACpD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;QACvE,wBAAwB,EAAE,KAAK;QAC/B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;QACnC,OAAO;QACP,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,mEAAmE;YACnE,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAA;QAE3B,yEAAyE;QACzE,cAAc;QACd,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;YACvC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAA;YAClD,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QAClE,CAAC;QAED,yCAAyC;QACzC,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;YAC9C,MAAM,IAAI,oBAAoB,CAC5B,mCAAmC,EACnC,qBAAqB,EACrB,EAAE,KAAK,EAAE,CACV,CAAA;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,CAAA;IACzD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE;QACxB,MAAM,EACJ,IAAI,CAAC,MAAM,IAAI,IAAI;YACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5D,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC7B,CAAC,CAAC,SAAS;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC,CAAA;IAEH,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAE1D,OAAO;QACL,GAAG,KAAK;QACR,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;QACzE,SAAS;QACT,kEAAkE;QAClE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;KACtD,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { mapDefined, noUndefinedVals } from '@atproto/common'\nimport {\n XrpcInvalidResponseError,\n XrpcResponseError,\n xrpcSafe,\n} from '@atproto/lex'\nimport {\n Headers as HeadersMap,\n InvalidRequestError,\n Server,\n ServerTimer,\n UpstreamFailureError,\n XRPCError,\n serverTimingHeader,\n} from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context.js'\nimport {\n Code,\n getServiceEndpoint,\n isDataplaneError,\n unpackIdentityServices,\n} from '../../../../data-plane/index.js'\nimport { FeedItem } from '../../../../hydration/feed.js'\nimport { HydrateCtx } from '../../../../hydration/hydrator.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n RulesFnInput,\n SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport { GetIdentityByDidResponse } from '../../../../proto/bsky_pb.js'\nimport { BSKY_USER_AGENT, resHeaders } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getFeed = createPipeline(\n skeleton,\n hydration,\n noBlocksOrMutes,\n presentation,\n )\n server.add(app.bsky.feed.getFeed, {\n auth: ctx.authVerifier.standardOptionalParameterized({\n lxmCheck: (method) => {\n return (\n method === app.bsky.feed.getFeedSkeleton.$lxm ||\n method === app.bsky.feed.getFeed.$lxm\n )\n },\n skipAudCheck: true,\n }),\n handler: async ({ params, auth, 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 'user-agent': BSKY_USER_AGENT,\n authorization: req.headers['authorization'],\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 // @NOTE feed cursors should not be affected by appview swap\n const {\n timerSkele,\n timerHydr,\n resHeaders: feedResHeaders,\n ...result\n } = await getFeed({ ...params, hydrateCtx, headers }, ctx)\n\n return {\n encoding: 'application/json',\n body: result,\n headers: {\n ...feedResHeaders,\n ...resHeaders({ labelers: hydrateCtx.labelers }),\n 'server-timing': serverTimingHeader([timerSkele, timerHydr]),\n },\n }\n },\n })\n}\n\nconst skeleton = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const timerSkele = new ServerTimer('skele').start()\n const {\n feedItems: algoItems,\n reqId,\n cursor,\n resHeaders,\n ...passthrough\n } = await skeletonFromFeedGen(ctx, params)\n\n return {\n cursor,\n items: algoItems,\n reqId,\n timerSkele: timerSkele.stop(),\n timerHydr: new ServerTimer('hydr').start(),\n resHeaders,\n passthrough,\n }\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n const timerHydr = new ServerTimer('hydr').start()\n const hydration = await ctx.hydrator.hydrateFeedItems(\n skeleton.items,\n params.hydrateCtx,\n )\n skeleton.timerHydr = timerHydr.stop()\n return hydration\n}\n\nconst noBlocksOrMutes = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, skeleton, hydration } = inputs\n skeleton.items = skeleton.items.filter((item) => {\n const bam = ctx.views.feedItemBlocksAndMutes(item, hydration)\n return (\n !bam.authorBlocked &&\n !bam.authorMuted &&\n !bam.originatorBlocked &&\n !bam.originatorMuted &&\n !bam.ancestorAuthorBlocked\n )\n })\n\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const feed = mapDefined(skeleton.items, (item) => {\n const post = ctx.views.feedViewPost(item, hydration)\n if (!post) return\n return {\n ...post,\n feedContext: item.feedContext,\n }\n })\n return {\n feed: feed.map((fi) => ({ ...fi, reqId: skeleton.reqId })),\n cursor: skeleton.cursor,\n timerSkele: skeleton.timerSkele,\n timerHydr: skeleton.timerHydr,\n resHeaders: skeleton.resHeaders,\n ...skeleton.passthrough,\n }\n}\n\ntype Context = AppContext\n\ntype Params = app.bsky.feed.getFeed.$Params & {\n hydrateCtx: HydrateCtx\n headers: HeadersMap\n}\n\ntype Skeleton = {\n items: AlgoResponseItem[]\n reqId?: string\n passthrough: Record<string, unknown> // pass through additional items in feedgen response\n resHeaders?: HeadersMap\n cursor?: string\n timerSkele: ServerTimer\n timerHydr: ServerTimer\n}\n\nconst skeletonFromFeedGen = async (\n ctx: Context,\n params: Params,\n): Promise<AlgoResponse> => {\n const { feed, headers } = params\n const found = await ctx.hydrator.feed.getFeedGens([feed], true)\n const feedDid = found.get(feed)?.record.did\n if (!feedDid) {\n throw new InvalidRequestError('could not find feed')\n }\n\n let identity: GetIdentityByDidResponse\n try {\n identity = await ctx.dataplane.getIdentityByDid({ did: feedDid })\n } catch (err) {\n if (isDataplaneError(err, Code.NotFound)) {\n throw new InvalidRequestError(`could not resolve identity: ${feedDid}`)\n }\n throw err\n }\n\n const services = unpackIdentityServices(identity.services)\n const fgEndpoint = getServiceEndpoint(services, {\n id: 'bsky_fg',\n type: 'BskyFeedGenerator',\n })\n if (!fgEndpoint) {\n throw new InvalidRequestError(\n `invalid feed generator service details in did document: ${feedDid}`,\n )\n }\n\n // @TODO currently passthrough auth headers from pds\n const result = await xrpcSafe(fgEndpoint, app.bsky.feed.getFeedSkeleton, {\n strictResponseProcessing: false,\n signal: AbortSignal.timeout(10_000),\n headers,\n params: {\n feed: params.feed,\n // The feedgen is not guaranteed to honor the limit, but we try it.\n limit: params.limit,\n cursor: params.cursor,\n },\n })\n\n if (!result.success) {\n const cause = result.reason\n\n // Pass through structurally valid XRPC error response (4xx/5xx), such as\n // auth errors\n if (cause instanceof XrpcResponseError) {\n const { status, body } = cause.toDownstreamError()\n throw new XRPCError(status, body.message, body.error, { cause })\n }\n\n // The response does not match the schema\n if (cause instanceof XrpcInvalidResponseError) {\n throw new UpstreamFailureError(\n 'feed provided an invalid response',\n 'InvalidFeedResponse',\n { cause },\n )\n }\n\n // Typically a network error.\n throw new UpstreamFailureError('feed unavailable', undefined, { cause })\n }\n\n const { feed: feedSkele, cursor, ...skele } = result.body\n const feedItems = feedSkele.slice(0, params.limit).map((item) => ({\n post: { uri: item.post },\n repost:\n item.reason != null &&\n app.bsky.feed.defs.skeletonReasonRepost.$isTypeOf(item.reason)\n ? { uri: item.reason.repost }\n : undefined,\n feedContext: item.feedContext,\n }))\n\n const contentLang = result.headers.get('content-language')\n\n return {\n ...skele,\n resHeaders: contentLang ? { 'content-language': contentLang } : undefined,\n feedItems,\n // Prevents loops if the custom feed echoes the input cursor back.\n cursor: cursor === params.cursor ? undefined : cursor,\n }\n}\n\nexport type AlgoResponse = {\n feedItems: AlgoResponseItem[]\n resHeaders?: HeadersMap\n cursor?: string\n reqId?: string\n}\n\nexport type AlgoResponseItem = FeedItem & {\n feedContext?: string\n}\n"]}
|
|
1
|
+
{"version":3,"file":"getFeed.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/getFeed.ts"],"names":[],"mappings":"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","sourcesContent":["import { mapDefined, noUndefinedVals } from '@atproto/common'\nimport {\n XrpcInvalidResponseError,\n XrpcResponseError,\n xrpcSafe,\n} from '@atproto/lex'\nimport {\n Headers as HeadersMap,\n InvalidRequestError,\n Server,\n ServerTimer,\n UpstreamFailureError,\n XRPCError,\n serverTimingHeader,\n} from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context.js'\nimport {\n Code,\n getServiceEndpoint,\n isDataplaneError,\n unpackIdentityServices,\n} from '../../../../data-plane/index.js'\nimport { FeedItem } from '../../../../hydration/feed.js'\nimport { HydrateCtx } from '../../../../hydration/hydrator.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n RulesFnInput,\n SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport { GetIdentityByDidResponse } from '../../../../proto/bsky_pb.js'\nimport { BSKY_USER_AGENT, resHeaders } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const getFeed = createPipeline(\n skeleton,\n hydration,\n noBlocksOrMutes,\n presentation,\n )\n server.add(app.bsky.feed.getFeed, {\n auth: ctx.authVerifier.standardOptionalParameterized({\n lxmCheck: (method) => {\n return (\n method === app.bsky.feed.getFeedSkeleton.$lxm ||\n method === app.bsky.feed.getFeed.$lxm\n )\n },\n skipAudCheck: true,\n }),\n handler: async ({ params, auth, 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 'user-agent': BSKY_USER_AGENT,\n authorization: req.headers['authorization'],\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 // @NOTE feed cursors should not be affected by appview swap\n const {\n timerSkele,\n timerHydr,\n resHeaders: feedResHeaders,\n ...result\n } = await getFeed({ ...params, hydrateCtx, headers }, ctx)\n\n return {\n encoding: 'application/json',\n body: result,\n headers: {\n ...feedResHeaders,\n ...resHeaders({ labelers: hydrateCtx.labelers }),\n 'server-timing': serverTimingHeader([timerSkele, timerHydr]),\n },\n }\n },\n })\n}\n\nconst skeleton = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const timerSkele = new ServerTimer('skele').start()\n const {\n feedItems: algoItems,\n reqId,\n cursor,\n resHeaders,\n ...passthrough\n } = await skeletonFromFeedGen(ctx, params)\n\n return {\n cursor,\n items: algoItems,\n reqId,\n timerSkele: timerSkele.stop(),\n timerHydr: new ServerTimer('hydr').start(),\n resHeaders,\n passthrough,\n }\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n const timerHydr = new ServerTimer('hydr').start()\n const hydration = await ctx.hydrator.hydrateFeedItems(\n skeleton.items,\n params.hydrateCtx,\n )\n skeleton.timerHydr = timerHydr.stop()\n return hydration\n}\n\nconst noBlocksOrMutes = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, skeleton, hydration } = inputs\n skeleton.items = skeleton.items.filter((item) => {\n const bam = ctx.views.feedItemBlocksAndMutes(item, hydration)\n return (\n !bam.authorBlocked &&\n !bam.authorMuted &&\n !bam.originatorBlocked &&\n !bam.originatorMuted &&\n !bam.ancestorAuthorBlocked\n )\n })\n\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const feed = mapDefined(skeleton.items, (item) => {\n const post = ctx.views.feedViewPost(item, hydration)\n if (!post) return\n return {\n ...post,\n feedContext: item.feedContext,\n }\n })\n return {\n feed: feed.map((fi) => ({ ...fi, reqId: skeleton.reqId })),\n cursor: skeleton.cursor,\n timerSkele: skeleton.timerSkele,\n timerHydr: skeleton.timerHydr,\n resHeaders: skeleton.resHeaders,\n ...skeleton.passthrough,\n }\n}\n\ntype Context = AppContext\n\ntype Params = app.bsky.feed.getFeed.$Params & {\n hydrateCtx: HydrateCtx\n headers: HeadersMap\n}\n\ntype Skeleton = {\n items: AlgoResponseItem[]\n reqId?: string\n passthrough: Record<string, unknown> // pass through additional items in feedgen response\n resHeaders?: HeadersMap\n cursor?: string\n timerSkele: ServerTimer\n timerHydr: ServerTimer\n}\n\nconst skeletonFromFeedGen = async (\n ctx: Context,\n params: Params,\n): Promise<AlgoResponse> => {\n const { feed, headers } = params\n const found = await ctx.hydrator.feed.getFeedGens([feed], true)\n const feedDid = found.get(feed)?.record.did\n if (!feedDid) {\n throw new InvalidRequestError('could not find feed')\n }\n\n let identity: GetIdentityByDidResponse\n try {\n identity = await ctx.dataplane.getIdentityByDid({ did: feedDid })\n } catch (err) {\n if (isDataplaneError(err, Code.NotFound)) {\n throw new InvalidRequestError(`could not resolve identity: ${feedDid}`)\n }\n throw err\n }\n\n const services = unpackIdentityServices(identity.services)\n const fgEndpoint = getServiceEndpoint(services, {\n id: 'bsky_fg',\n type: 'BskyFeedGenerator',\n })\n if (!fgEndpoint) {\n throw new InvalidRequestError(\n `invalid feed generator service details in did document: ${feedDid}`,\n )\n }\n\n // @TODO currently passthrough auth headers from pds\n const result = await xrpcSafe(fgEndpoint, app.bsky.feed.getFeedSkeleton, {\n strictResponseProcessing: false,\n signal: AbortSignal.timeout(10_000),\n headers,\n params: {\n feed: params.feed,\n // The feedgen is not guaranteed to honor the limit, but we try it.\n limit: params.limit,\n cursor: params.cursor,\n },\n })\n\n if (!result.success) {\n const cause = result.reason\n\n // Pass through structurally valid XRPC error response (4xx/5xx), such as\n // auth errors\n if (cause instanceof XrpcResponseError) {\n const { status, body } = cause.toDownstreamError()\n throw new XRPCError(status, body.message, body.error, { cause })\n }\n\n // The response does not match the schema\n if (cause instanceof XrpcInvalidResponseError) {\n throw new UpstreamFailureError(\n 'feed provided an invalid response',\n 'InvalidFeedResponse',\n { cause },\n )\n }\n\n // Typically a network error.\n throw new UpstreamFailureError('feed unavailable', undefined, { cause })\n }\n\n const { feed: feedSkele, cursor, ...skele } = result.body\n const feedItems = feedSkele.slice(0, params.limit).map((item) => ({\n post: { uri: item.post },\n repost:\n item.reason != null &&\n app.bsky.feed.defs.skeletonReasonRepost.$isTypeOf(item.reason)\n ? { uri: item.reason.repost }\n : undefined,\n authorPinned:\n item.reason != null &&\n app.bsky.feed.defs.skeletonReasonPin.$isTypeOf(item.reason)\n ? true\n : undefined,\n feedContext: item.feedContext,\n }))\n\n const contentLang = result.headers.get('content-language')\n\n return {\n ...skele,\n resHeaders: contentLang ? { 'content-language': contentLang } : undefined,\n feedItems,\n // Prevents loops if the custom feed echoes the input cursor back.\n cursor: cursor === params.cursor ? undefined : cursor,\n }\n}\n\nexport type AlgoResponse = {\n feedItems: AlgoResponseItem[]\n resHeaders?: HeadersMap\n cursor?: string\n reqId?: string\n}\n\nexport type AlgoResponseItem = FeedItem & {\n feedContext?: string\n}\n"]}
|
|
@@ -140,6 +140,11 @@ const noBlocksOrTagged = (inputs) => {
|
|
|
140
140
|
// Cases to never show.
|
|
141
141
|
if (ctx.views.viewerBlockExists(creator, hydration))
|
|
142
142
|
return false;
|
|
143
|
+
// Tags that are hidden from all search surfaces (Top and Latest),
|
|
144
|
+
// regardless of curation or author filtering.
|
|
145
|
+
const alwaysHidden = [...ctx.cfg.searchTagsHideAll].some((t) => post.tags.has(t));
|
|
146
|
+
if (alwaysHidden)
|
|
147
|
+
return false;
|
|
143
148
|
let tagged = false;
|
|
144
149
|
if (params.hydrateCtx.features?.checkGate(params.hydrateCtx.features.Gate.SearchFilteringExplorationEnable)) {
|
|
145
150
|
tagged = post.tags.has(ctx.cfg.visibilityTagHide);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchPosts.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/searchPosts.ts"],"names":[],"mappings":"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","sourcesContent":["import { Timestamp } from '@bufbuild/protobuf'\nimport { mapDefined } from '@atproto/common'\nimport { AtUriString, Client } from '@atproto/lex'\nimport { Server } from '@atproto/xrpc-server'\nimport { ServerConfig } from '../../../../config.js'\nimport { AppContext } from '../../../../context.js'\nimport { DataPlaneClient } from '../../../../data-plane/index.js'\nimport {\n PostSearchQuery,\n parsePostSearchQuery,\n} from '../../../../data-plane/server/util.js'\nimport { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n RulesFnInput,\n SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport { SearchSortOrder } from '../../../../proto/bsky_pb.js'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris.js'\nimport { Views } from '../../../../views/index.js'\nimport { resHeaders, resolveSearchV2Override } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchPosts = createPipeline(\n skeleton,\n hydration,\n noBlocksOrTagged,\n presentation,\n )\n server.add(app.bsky.feed.searchPosts, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const { viewer, isModService, skipViewerBlocks } =\n ctx.authVerifier.parseCreds(auth)\n\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const results = await searchPosts(\n {\n ...params,\n hydrateCtx,\n isModService,\n isV2Override: resolveSearchV2Override(req, ctx.cfg),\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: results,\n headers: resHeaders({ labelers: hydrateCtx.labelers }),\n }\n },\n })\n}\n\nconst skeletonV1 = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const parsedQuery = parsePostSearchQuery(params.q, {\n author: params.author,\n })\n\n if (ctx.searchClient) {\n // @NOTE cursors won't change on appview swap\n const res = await ctx.searchClient.call(\n app.bsky.unspecced.searchPostsSkeleton,\n {\n q: params.q,\n cursor: params.cursor,\n limit: params.limit,\n author: params.author,\n domain: params.domain,\n lang: params.lang,\n mentions: params.mentions,\n since: params.since,\n sort: params.sort,\n tag: params.tag,\n until: params.until,\n url: params.url,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n )\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.cursor),\n parsedQuery,\n }\n }\n\n const res = await ctx.dataplane.searchPosts({\n term: params.q,\n limit: params.limit,\n cursor: params.cursor,\n })\n return {\n posts: res.uris as AtUriString[],\n cursor: parseString(res.cursor),\n parsedQuery,\n }\n}\n\nconst skeletonV2 = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const parsedQuery = parsePostSearchQuery(params.q, {\n author: params.author,\n })\n const res = await ctx.dataplane.searchPostsV2({\n params: {\n query: params.q,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n cursor: params.cursor,\n },\n sort: postSortToV2(params.sort),\n filters: {\n authors: params.author ? [params.author] : [],\n mentions: params.mentions ? [params.mentions] : [],\n domains: params.domain ? [params.domain] : [],\n urls: params.url ? [params.url] : [],\n hashtags: params.tag ?? [],\n languages: params.lang ? [params.lang] : [],\n },\n since: parseTimestamp(params.since),\n until: parseTimestamp(params.until),\n })\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.pageInfo?.cursor),\n hitsTotal: res.pageInfo?.hitsTotal\n ? Number(res.pageInfo.hitsTotal)\n : undefined,\n parsedQuery,\n }\n}\n\nconst skeleton = async (input: SkeletonFnInput<Context, Params>) => {\n const useV2 =\n input.params.hydrateCtx.features.checkGate(\n input.params.hydrateCtx.features.Gate.SearchV2Enable,\n ) || input.params.isV2Override\n const skeletonFn = useV2 ? skeletonV2 : skeletonV1\n return skeletonFn(input)\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydratePosts(\n skeleton.posts.map((uri) => ({ uri })),\n params.hydrateCtx,\n undefined,\n {\n processDynamicTagsForView: params.hydrateCtx.features?.checkGate(\n params.hydrateCtx.features.Gate.SearchFilteringExplorationEnable,\n )\n ? 'search'\n : undefined,\n },\n )\n}\n\nconst noBlocksOrTagged = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, params, skeleton, hydration } = inputs\n const { parsedQuery } = skeleton\n\n skeleton.posts = skeleton.posts.filter((uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n const creator = creatorFromUri(uri)\n const isCuratedSearch = params.sort === 'top'\n const isPostByViewer = creator === params.hydrateCtx.viewer\n\n // Cases to always show.\n if (isPostByViewer) return true\n if (params.isModService) return true\n\n // Cases to never show.\n if (ctx.views.viewerBlockExists(creator, hydration)) return false\n\n let tagged = false\n if (\n params.hydrateCtx.features?.checkGate(\n params.hydrateCtx.features.Gate.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 searchClient?: Client\n}\n\ntype Params = app.bsky.feed.searchPosts.$Params & {\n hydrateCtx: HydrateCtx\n isModService: boolean\n isV2Override: boolean\n}\n\ntype Skeleton = {\n posts: AtUriString[]\n hitsTotal?: number\n cursor?: string\n parsedQuery: PostSearchQuery\n}\n\nconst postSortToV2 = (sort: string | undefined): SearchSortOrder => {\n if (sort === 'top') return SearchSortOrder.TOP\n if (sort === 'latest') return SearchSortOrder.RECENT\n return SearchSortOrder.UNSPECIFIED\n}\n\nconst parseTimestamp = (value: string | undefined): Timestamp | undefined => {\n if (!value) return undefined\n const date = new Date(value)\n if (isNaN(date.getTime())) return undefined\n return Timestamp.fromDate(date)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"searchPosts.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/searchPosts.ts"],"names":[],"mappings":"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","sourcesContent":["import { Timestamp } from '@bufbuild/protobuf'\nimport { mapDefined } from '@atproto/common'\nimport { AtUriString, Client } from '@atproto/lex'\nimport { Server } from '@atproto/xrpc-server'\nimport { ServerConfig } from '../../../../config.js'\nimport { AppContext } from '../../../../context.js'\nimport { DataPlaneClient } from '../../../../data-plane/index.js'\nimport {\n PostSearchQuery,\n parsePostSearchQuery,\n} from '../../../../data-plane/server/util.js'\nimport { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n RulesFnInput,\n SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport { SearchSortOrder } from '../../../../proto/bsky_pb.js'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris.js'\nimport { Views } from '../../../../views/index.js'\nimport { resHeaders, resolveSearchV2Override } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchPosts = createPipeline(\n skeleton,\n hydration,\n noBlocksOrTagged,\n presentation,\n )\n server.add(app.bsky.feed.searchPosts, {\n auth: ctx.authVerifier.standardOptional,\n handler: async ({ auth, params, req }) => {\n const { viewer, isModService, skipViewerBlocks } =\n ctx.authVerifier.parseCreds(auth)\n\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const results = await searchPosts(\n {\n ...params,\n hydrateCtx,\n isModService,\n isV2Override: resolveSearchV2Override(req, ctx.cfg),\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: results,\n headers: resHeaders({ labelers: hydrateCtx.labelers }),\n }\n },\n })\n}\n\nconst skeletonV1 = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const parsedQuery = parsePostSearchQuery(params.q, {\n author: params.author,\n })\n\n if (ctx.searchClient) {\n // @NOTE cursors won't change on appview swap\n const res = await ctx.searchClient.call(\n app.bsky.unspecced.searchPostsSkeleton,\n {\n q: params.q,\n cursor: params.cursor,\n limit: params.limit,\n author: params.author,\n domain: params.domain,\n lang: params.lang,\n mentions: params.mentions,\n since: params.since,\n sort: params.sort,\n tag: params.tag,\n until: params.until,\n url: params.url,\n viewer: params.hydrateCtx.viewer ?? undefined,\n },\n )\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.cursor),\n parsedQuery,\n }\n }\n\n const res = await ctx.dataplane.searchPosts({\n term: params.q,\n limit: params.limit,\n cursor: params.cursor,\n })\n return {\n posts: res.uris as AtUriString[],\n cursor: parseString(res.cursor),\n parsedQuery,\n }\n}\n\nconst skeletonV2 = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const parsedQuery = parsePostSearchQuery(params.q, {\n author: params.author,\n })\n const res = await ctx.dataplane.searchPostsV2({\n params: {\n query: params.q,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n cursor: params.cursor,\n },\n sort: postSortToV2(params.sort),\n filters: {\n authors: params.author ? [params.author] : [],\n mentions: params.mentions ? [params.mentions] : [],\n domains: params.domain ? [params.domain] : [],\n urls: params.url ? [params.url] : [],\n hashtags: params.tag ?? [],\n languages: params.lang ? [params.lang] : [],\n },\n since: parseTimestamp(params.since),\n until: parseTimestamp(params.until),\n })\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.pageInfo?.cursor),\n hitsTotal: res.pageInfo?.hitsTotal\n ? Number(res.pageInfo.hitsTotal)\n : undefined,\n parsedQuery,\n }\n}\n\nconst skeleton = async (input: SkeletonFnInput<Context, Params>) => {\n const useV2 =\n input.params.hydrateCtx.features.checkGate(\n input.params.hydrateCtx.features.Gate.SearchV2Enable,\n ) || input.params.isV2Override\n const skeletonFn = useV2 ? skeletonV2 : skeletonV1\n return skeletonFn(input)\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydratePosts(\n skeleton.posts.map((uri) => ({ uri })),\n params.hydrateCtx,\n undefined,\n {\n processDynamicTagsForView: params.hydrateCtx.features?.checkGate(\n params.hydrateCtx.features.Gate.SearchFilteringExplorationEnable,\n )\n ? 'search'\n : undefined,\n },\n )\n}\n\nconst noBlocksOrTagged = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, params, skeleton, hydration } = inputs\n const { parsedQuery } = skeleton\n\n skeleton.posts = skeleton.posts.filter((uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n const creator = creatorFromUri(uri)\n const isCuratedSearch = params.sort === 'top'\n const isPostByViewer = creator === params.hydrateCtx.viewer\n\n // Cases to always show.\n if (isPostByViewer) return true\n if (params.isModService) return true\n\n // Cases to never show.\n if (ctx.views.viewerBlockExists(creator, hydration)) return false\n\n // Tags that are hidden from all search surfaces (Top and Latest),\n // regardless of curation or author filtering.\n const alwaysHidden = [...ctx.cfg.searchTagsHideAll].some((t) =>\n post.tags.has(t),\n )\n if (alwaysHidden) return false\n\n let tagged = false\n if (\n params.hydrateCtx.features?.checkGate(\n params.hydrateCtx.features.Gate.SearchFilteringExplorationEnable,\n )\n ) {\n tagged = 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 searchClient?: Client\n}\n\ntype Params = app.bsky.feed.searchPosts.$Params & {\n hydrateCtx: HydrateCtx\n isModService: boolean\n isV2Override: boolean\n}\n\ntype Skeleton = {\n posts: AtUriString[]\n hitsTotal?: number\n cursor?: string\n parsedQuery: PostSearchQuery\n}\n\nconst postSortToV2 = (sort: string | undefined): SearchSortOrder => {\n if (sort === 'top') return SearchSortOrder.TOP\n if (sort === 'latest') return SearchSortOrder.RECENT\n return SearchSortOrder.UNSPECIFIED\n}\n\nconst parseTimestamp = (value: string | undefined): Timestamp | undefined => {\n if (!value) return undefined\n const date = new Date(value)\n if (isNaN(date.getTime())) return undefined\n return Timestamp.fromDate(date)\n}\n"]}
|
|
@@ -118,6 +118,11 @@ const noBlocksOrTagged = (inputs) => {
|
|
|
118
118
|
return true;
|
|
119
119
|
if (ctx.views.viewerBlockExists(creator, hydration))
|
|
120
120
|
return false;
|
|
121
|
+
// Tags that are hidden from all search surfaces (Top and Latest),
|
|
122
|
+
// regardless of curation or author filtering.
|
|
123
|
+
const alwaysHidden = [...ctx.cfg.searchTagsHideAll].some((t) => post.tags.has(t));
|
|
124
|
+
if (alwaysHidden)
|
|
125
|
+
return false;
|
|
121
126
|
const tagged = [...ctx.cfg.searchTagsHide].some((t) => post.tags.has(t));
|
|
122
127
|
if (isCuratedSearch && tagged)
|
|
123
128
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchPostsV2.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/searchPostsV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { Timestamp } from '@bufbuild/protobuf'\nimport { mapDefined } from '@atproto/common'\nimport { AtUriString } from '@atproto/lex'\nimport { InvalidRequestError, Server } from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context.js'\nimport { DataPlaneClient } from '../../../../data-plane/index.js'\nimport {\n PostSearchQuery,\n parsePostSearchQuery,\n} from '../../../../data-plane/server/util.js'\nimport { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n RulesFnInput,\n SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport {\n SearchQueryLanguage,\n SearchSortOrder,\n} from '../../../../proto/bsky_pb.js'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris.js'\nimport { Views } from '../../../../views/index.js'\nimport { resHeaders, resolveSearchV2Override } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchPostsV2 = createPipeline(\n skeleton,\n hydration,\n noBlocksOrTagged,\n presentation,\n )\n server.add(app.bsky.feed.searchPostsV2, {\n auth: ctx.authVerifier.standard,\n handler: async ({ auth, params, req }) => {\n const { viewer, isModService, skipViewerBlocks } =\n ctx.authVerifier.parseCreds(auth)\n\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const isV2Enabled =\n hydrateCtx.features.checkGate(\n hydrateCtx.features.Gate.SearchV2Enable,\n ) || resolveSearchV2Override(req, ctx.cfg)\n if (!isV2Enabled) {\n throw new InvalidRequestError('Search v2 is not enabled')\n }\n\n const results = await searchPostsV2(\n {\n ...params,\n // Default to curated 'top' ranking when unset; the backend rejects an\n // unspecified sort order.\n sort: params.sort ?? 'top',\n hydrateCtx,\n isModService,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: results,\n headers: resHeaders({ labelers: hydrateCtx.labelers }),\n }\n },\n })\n}\n\nconst skeleton = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const query = params.query ?? ''\n const parsedQuery = parsePostSearchQuery(query, {\n author: params.authors?.[0],\n })\n\n const res = await ctx.dataplane.searchPostsV2({\n params: {\n query,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n cursor: params.cursor,\n },\n sort: postSortToV2(params.sort),\n filters: {\n authors: params.authors ?? [],\n mentions: params.mentions ?? [],\n domains: params.domains ?? [],\n urls: params.urls ?? [],\n embeddedAtUris: params.embeddedAtUris ?? [],\n hashtags: params.hashtags ?? [],\n languages: params.languages ?? [],\n },\n exclude: {\n authors: params.excludeAuthors ?? [],\n mentions: params.excludeMentions ?? [],\n domains: params.excludeDomains ?? [],\n urls: params.excludeUrls ?? [],\n embeddedAtUris: params.excludeEmbeddedAtUris ?? [],\n hashtags: params.excludeHashtags ?? [],\n languages: params.excludeLanguages ?? [],\n },\n since: parseTimestamp(params.since),\n until: parseTimestamp(params.until),\n allTime: params.allTime,\n hasMedia: params.hasMedia,\n hasVideo: params.hasVideo,\n replyParentUri: params.replyParentUri,\n threadRootUri: params.threadRootUri,\n excludeReplies: params.excludeReplies,\n repliesOnly: params.repliesOnly,\n following: params.following,\n queryLanguage: queryLanguageToV2(params.queryLanguage),\n })\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.pageInfo?.cursor),\n hitsTotal: res.pageInfo?.hitsTotal\n ? Number(res.pageInfo.hitsTotal)\n : undefined,\n detectedQueryLanguages: res.detectedQueryLanguages,\n parsedQuery,\n }\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydratePosts(\n skeleton.posts.map((uri) => ({ uri })),\n params.hydrateCtx,\n )\n}\n\nconst noBlocksOrTagged = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, params, skeleton, hydration } = inputs\n const { parsedQuery } = skeleton\n\n skeleton.posts = skeleton.posts.filter((uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n const creator = creatorFromUri(uri)\n const isCuratedSearch = params.sort === 'top'\n const isPostByViewer = creator === params.hydrateCtx.viewer\n\n if (isPostByViewer) return true\n if (params.isModService) return true\n\n if (ctx.views.viewerBlockExists(creator, hydration)) return false\n\n const tagged = [...ctx.cfg.searchTagsHide].some((t) => post.tags.has(t))\n\n if (isCuratedSearch && tagged) return false\n if (!(parsedQuery.author || params.authors?.length) && tagged) return false\n return true\n })\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const posts = mapDefined(skeleton.posts, (uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n return ctx.views.post(uri, hydration)\n })\n return {\n posts,\n cursor: skeleton.cursor,\n hitsTotal: skeleton.hitsTotal,\n detectedQueryLanguages: skeleton.detectedQueryLanguages,\n }\n}\n\ntype Context = {\n cfg: AppContext['cfg']\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n}\n\ntype Params = app.bsky.feed.searchPostsV2.$Params & {\n hydrateCtx: HydrateCtx\n isModService: boolean\n}\n\ntype Skeleton = {\n posts: AtUriString[]\n hitsTotal?: number\n cursor?: string\n detectedQueryLanguages?: string[]\n parsedQuery: PostSearchQuery\n}\n\nconst postSortToV2 = (sort?: string): SearchSortOrder => {\n if (sort === 'top') return SearchSortOrder.TOP\n if (sort === 'recent') return SearchSortOrder.RECENT\n return SearchSortOrder.UNSPECIFIED\n}\n\nconst queryLanguageToV2 = (\n lang: string | undefined,\n): SearchQueryLanguage | undefined => {\n if (lang === 'ja') return SearchQueryLanguage.JA\n if (lang === 'zh') return SearchQueryLanguage.ZH\n if (lang === 'ko') return SearchQueryLanguage.KO\n if (lang === 'th') return SearchQueryLanguage.TH\n if (lang === 'ar') return SearchQueryLanguage.AR\n return undefined\n}\n\nconst parseTimestamp = (value: string | undefined): Timestamp | undefined => {\n if (!value) return undefined\n const date = new Date(value)\n if (isNaN(date.getTime())) return undefined\n return Timestamp.fromDate(date)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"searchPostsV2.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/feed/searchPostsV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { Timestamp } from '@bufbuild/protobuf'\nimport { mapDefined } from '@atproto/common'\nimport { AtUriString } from '@atproto/lex'\nimport { InvalidRequestError, Server } from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context.js'\nimport { DataPlaneClient } from '../../../../data-plane/index.js'\nimport {\n PostSearchQuery,\n parsePostSearchQuery,\n} from '../../../../data-plane/server/util.js'\nimport { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js'\nimport { parseString } from '../../../../hydration/util.js'\nimport { app } from '../../../../lexicons/index.js'\nimport {\n HydrationFnInput,\n PresentationFnInput,\n RulesFnInput,\n SkeletonFnInput,\n createPipeline,\n} from '../../../../pipeline.js'\nimport {\n SearchQueryLanguage,\n SearchSortOrder,\n} from '../../../../proto/bsky_pb.js'\nimport { uriToDid as creatorFromUri } from '../../../../util/uris.js'\nimport { Views } from '../../../../views/index.js'\nimport { resHeaders, resolveSearchV2Override } from '../../../util.js'\n\nexport default function (server: Server, ctx: AppContext) {\n const searchPostsV2 = createPipeline(\n skeleton,\n hydration,\n noBlocksOrTagged,\n presentation,\n )\n server.add(app.bsky.feed.searchPostsV2, {\n auth: ctx.authVerifier.standard,\n handler: async ({ auth, params, req }) => {\n const { viewer, isModService, skipViewerBlocks } =\n ctx.authVerifier.parseCreds(auth)\n\n const labelers = ctx.reqLabelers(req)\n const hydrateCtx = await ctx.hydrator.createContext({\n labelers,\n viewer,\n skipViewerBlocks,\n features: ctx.featureGatesClient.scope(\n ctx.featureGatesClient.parseUserContextFromHandler({\n viewer,\n req,\n }),\n ),\n })\n const isV2Enabled =\n hydrateCtx.features.checkGate(\n hydrateCtx.features.Gate.SearchV2Enable,\n ) || resolveSearchV2Override(req, ctx.cfg)\n if (!isV2Enabled) {\n throw new InvalidRequestError('Search v2 is not enabled')\n }\n\n const results = await searchPostsV2(\n {\n ...params,\n // Default to curated 'top' ranking when unset; the backend rejects an\n // unspecified sort order.\n sort: params.sort ?? 'top',\n hydrateCtx,\n isModService,\n },\n ctx,\n )\n return {\n encoding: 'application/json',\n body: results,\n headers: resHeaders({ labelers: hydrateCtx.labelers }),\n }\n },\n })\n}\n\nconst skeleton = async (\n inputs: SkeletonFnInput<Context, Params>,\n): Promise<Skeleton> => {\n const { ctx, params } = inputs\n const query = params.query ?? ''\n const parsedQuery = parsePostSearchQuery(query, {\n author: params.authors?.[0],\n })\n\n const res = await ctx.dataplane.searchPostsV2({\n params: {\n query,\n viewer: params.hydrateCtx.viewer ?? undefined,\n limit: params.limit,\n cursor: params.cursor,\n },\n sort: postSortToV2(params.sort),\n filters: {\n authors: params.authors ?? [],\n mentions: params.mentions ?? [],\n domains: params.domains ?? [],\n urls: params.urls ?? [],\n embeddedAtUris: params.embeddedAtUris ?? [],\n hashtags: params.hashtags ?? [],\n languages: params.languages ?? [],\n },\n exclude: {\n authors: params.excludeAuthors ?? [],\n mentions: params.excludeMentions ?? [],\n domains: params.excludeDomains ?? [],\n urls: params.excludeUrls ?? [],\n embeddedAtUris: params.excludeEmbeddedAtUris ?? [],\n hashtags: params.excludeHashtags ?? [],\n languages: params.excludeLanguages ?? [],\n },\n since: parseTimestamp(params.since),\n until: parseTimestamp(params.until),\n allTime: params.allTime,\n hasMedia: params.hasMedia,\n hasVideo: params.hasVideo,\n replyParentUri: params.replyParentUri,\n threadRootUri: params.threadRootUri,\n excludeReplies: params.excludeReplies,\n repliesOnly: params.repliesOnly,\n following: params.following,\n queryLanguage: queryLanguageToV2(params.queryLanguage),\n })\n return {\n posts: res.posts.map(({ uri }) => uri as AtUriString),\n cursor: parseString(res.pageInfo?.cursor),\n hitsTotal: res.pageInfo?.hitsTotal\n ? Number(res.pageInfo.hitsTotal)\n : undefined,\n detectedQueryLanguages: res.detectedQueryLanguages,\n parsedQuery,\n }\n}\n\nconst hydration = async (\n inputs: HydrationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, params, skeleton } = inputs\n return ctx.hydrator.hydratePosts(\n skeleton.posts.map((uri) => ({ uri })),\n params.hydrateCtx,\n )\n}\n\nconst noBlocksOrTagged = (inputs: RulesFnInput<Context, Params, Skeleton>) => {\n const { ctx, params, skeleton, hydration } = inputs\n const { parsedQuery } = skeleton\n\n skeleton.posts = skeleton.posts.filter((uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n const creator = creatorFromUri(uri)\n const isCuratedSearch = params.sort === 'top'\n const isPostByViewer = creator === params.hydrateCtx.viewer\n\n if (isPostByViewer) return true\n if (params.isModService) return true\n\n if (ctx.views.viewerBlockExists(creator, hydration)) return false\n\n // Tags that are hidden from all search surfaces (Top and Latest),\n // regardless of curation or author filtering.\n const alwaysHidden = [...ctx.cfg.searchTagsHideAll].some((t) =>\n post.tags.has(t),\n )\n if (alwaysHidden) return false\n\n const tagged = [...ctx.cfg.searchTagsHide].some((t) => post.tags.has(t))\n\n if (isCuratedSearch && tagged) return false\n if (!(parsedQuery.author || params.authors?.length) && tagged) return false\n return true\n })\n return skeleton\n}\n\nconst presentation = (\n inputs: PresentationFnInput<Context, Params, Skeleton>,\n) => {\n const { ctx, skeleton, hydration } = inputs\n const posts = mapDefined(skeleton.posts, (uri) => {\n const post = hydration.posts?.get(uri)\n if (!post) return\n\n return ctx.views.post(uri, hydration)\n })\n return {\n posts,\n cursor: skeleton.cursor,\n hitsTotal: skeleton.hitsTotal,\n detectedQueryLanguages: skeleton.detectedQueryLanguages,\n }\n}\n\ntype Context = {\n cfg: AppContext['cfg']\n dataplane: DataPlaneClient\n hydrator: Hydrator\n views: Views\n}\n\ntype Params = app.bsky.feed.searchPostsV2.$Params & {\n hydrateCtx: HydrateCtx\n isModService: boolean\n}\n\ntype Skeleton = {\n posts: AtUriString[]\n hitsTotal?: number\n cursor?: string\n detectedQueryLanguages?: string[]\n parsedQuery: PostSearchQuery\n}\n\nconst postSortToV2 = (sort?: string): SearchSortOrder => {\n if (sort === 'top') return SearchSortOrder.TOP\n if (sort === 'recent') return SearchSortOrder.RECENT\n return SearchSortOrder.UNSPECIFIED\n}\n\nconst queryLanguageToV2 = (\n lang: string | undefined,\n): SearchQueryLanguage | undefined => {\n if (lang === 'ja') return SearchQueryLanguage.JA\n if (lang === 'zh') return SearchQueryLanguage.ZH\n if (lang === 'ko') return SearchQueryLanguage.KO\n if (lang === 'th') return SearchQueryLanguage.TH\n if (lang === 'ar') return SearchQueryLanguage.AR\n return undefined\n}\n\nconst parseTimestamp = (value: string | undefined): Timestamp | undefined => {\n if (!value) return undefined\n const date = new Date(value)\n if (isNaN(date.getTime())) return undefined\n return Timestamp.fromDate(date)\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muteActor.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/graph/muteActor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAInD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"muteActor.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/graph/muteActor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAInD,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAkBvD"}
|
|
@@ -10,6 +10,9 @@ export default function (server, ctx) {
|
|
|
10
10
|
const [did] = await ctx.hydrator.actor.getDids([actor]);
|
|
11
11
|
if (!did)
|
|
12
12
|
throw new InvalidRequestError('Actor not found');
|
|
13
|
+
if (requester === did) {
|
|
14
|
+
throw new InvalidRequestError('Actor cannot mute themselves');
|
|
15
|
+
}
|
|
13
16
|
await ctx.bsyncClient.addMuteOperation({
|
|
14
17
|
type: MuteOperation_Type.ADD,
|
|
15
18
|
actorDid: requester,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muteActor.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/graph/muteActor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAU,MAAM,sBAAsB,CAAA;AAElE,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACnC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ;QAC/B,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YACjC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAA;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;YACtC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YACvD,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,CAAA;YAC1D,MAAM,GAAG,CAAC,WAAW,CAAC,gBAAgB,CAAC;gBACrC,IAAI,EAAE,kBAAkB,CAAC,GAAG;gBAC5B,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,GAAG;aACb,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { InvalidRequestError, Server } from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context.js'\nimport { app } from '../../../../lexicons/index.js'\nimport { MuteOperation_Type } from '../../../../proto/bsync_pb.js'\n\nexport default function (server: Server, ctx: AppContext) {\n server.add(app.bsky.graph.muteActor, {\n auth: ctx.authVerifier.standard,\n handler: async ({ auth, input }) => {\n const { actor } = input.body\n const requester = auth.credentials.iss\n const [did] = await ctx.hydrator.actor.getDids([actor])\n if (!did) throw new InvalidRequestError('Actor not found')\n await ctx.bsyncClient.addMuteOperation({\n type: MuteOperation_Type.ADD,\n actorDid: requester,\n subject: did,\n })\n },\n })\n}\n"]}
|
|
1
|
+
{"version":3,"file":"muteActor.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/graph/muteActor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAU,MAAM,sBAAsB,CAAA;AAElE,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,MAAM,CAAC,OAAO,WAAW,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACnC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ;QAC/B,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YACjC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAA;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;YACtC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YACvD,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,CAAA;YAC1D,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;gBACtB,MAAM,IAAI,mBAAmB,CAAC,8BAA8B,CAAC,CAAA;YAC/D,CAAC;YACD,MAAM,GAAG,CAAC,WAAW,CAAC,gBAAgB,CAAC;gBACrC,IAAI,EAAE,kBAAkB,CAAC,GAAG;gBAC5B,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,GAAG;aACb,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { InvalidRequestError, Server } from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context.js'\nimport { app } from '../../../../lexicons/index.js'\nimport { MuteOperation_Type } from '../../../../proto/bsync_pb.js'\n\nexport default function (server: Server, ctx: AppContext) {\n server.add(app.bsky.graph.muteActor, {\n auth: ctx.authVerifier.standard,\n handler: async ({ auth, input }) => {\n const { actor } = input.body\n const requester = auth.credentials.iss\n const [did] = await ctx.hydrator.actor.getDids([actor])\n if (!did) throw new InvalidRequestError('Actor not found')\n if (requester === did) {\n throw new InvalidRequestError('Actor cannot mute themselves')\n }\n await ctx.bsyncClient.addMuteOperation({\n type: MuteOperation_Type.ADD,\n actorDid: requester,\n subject: did,\n })\n },\n })\n}\n"]}
|