@atproto/bsky 0.0.253 → 0.0.255
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 +37 -0
- package/dist/api/age-assurance/index.d.ts +1 -1
- package/dist/api/age-assurance/index.d.ts.map +1 -1
- package/dist/api/age-assurance/index.js.map +1 -1
- package/dist/api/age-assurance/redirects/kws-age-verified.d.ts +2 -2
- package/dist/api/age-assurance/redirects/kws-age-verified.d.ts.map +1 -1
- package/dist/api/age-assurance/redirects/kws-age-verified.js.map +1 -1
- package/dist/api/age-assurance/stash.d.ts +2 -2
- package/dist/api/age-assurance/stash.d.ts.map +1 -1
- package/dist/api/age-assurance/stash.js.map +1 -1
- package/dist/api/age-assurance/types.d.ts +3 -3
- package/dist/api/age-assurance/types.d.ts.map +1 -1
- package/dist/api/age-assurance/types.js.map +1 -1
- package/dist/api/age-assurance/util.d.ts +2 -2
- package/dist/api/age-assurance/util.d.ts.map +1 -1
- package/dist/api/age-assurance/util.js.map +1 -1
- package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts +2 -2
- package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts.map +1 -1
- package/dist/api/age-assurance/webhooks/kws-age-verified.js.map +1 -1
- package/dist/api/app/bsky/actor/getProfile.d.ts +2 -2
- package/dist/api/app/bsky/actor/getProfile.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/getProfile.js.map +1 -1
- package/dist/api/app/bsky/actor/getProfiles.d.ts +2 -2
- package/dist/api/app/bsky/actor/getProfiles.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/getProfiles.js.map +1 -1
- package/dist/api/app/bsky/actor/getSuggestions.d.ts +2 -2
- package/dist/api/app/bsky/actor/getSuggestions.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/getSuggestions.js.map +1 -1
- package/dist/api/app/bsky/actor/searchActors.d.ts +2 -2
- package/dist/api/app/bsky/actor/searchActors.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/searchActors.js.map +1 -1
- package/dist/api/app/bsky/actor/searchActorsTypeahead.d.ts +2 -2
- package/dist/api/app/bsky/actor/searchActorsTypeahead.d.ts.map +1 -1
- package/dist/api/app/bsky/actor/searchActorsTypeahead.js.map +1 -1
- package/dist/api/app/bsky/ageassurance/begin.d.ts +2 -2
- package/dist/api/app/bsky/ageassurance/begin.d.ts.map +1 -1
- package/dist/api/app/bsky/ageassurance/begin.js.map +1 -1
- package/dist/api/app/bsky/ageassurance/getConfig.d.ts +2 -2
- package/dist/api/app/bsky/ageassurance/getConfig.d.ts.map +1 -1
- package/dist/api/app/bsky/ageassurance/getConfig.js.map +1 -1
- package/dist/api/app/bsky/ageassurance/getState.d.ts +2 -2
- package/dist/api/app/bsky/ageassurance/getState.d.ts.map +1 -1
- package/dist/api/app/bsky/ageassurance/getState.js.map +1 -1
- package/dist/api/app/bsky/bookmark/createBookmark.d.ts +2 -2
- package/dist/api/app/bsky/bookmark/createBookmark.d.ts.map +1 -1
- package/dist/api/app/bsky/bookmark/createBookmark.js.map +1 -1
- package/dist/api/app/bsky/bookmark/deleteBookmark.d.ts +2 -2
- package/dist/api/app/bsky/bookmark/deleteBookmark.d.ts.map +1 -1
- package/dist/api/app/bsky/bookmark/deleteBookmark.js.map +1 -1
- package/dist/api/app/bsky/bookmark/getBookmarks.d.ts +2 -2
- package/dist/api/app/bsky/bookmark/getBookmarks.d.ts.map +1 -1
- package/dist/api/app/bsky/bookmark/getBookmarks.js.map +1 -1
- package/dist/api/app/bsky/contact/dismissMatch.d.ts +2 -2
- package/dist/api/app/bsky/contact/dismissMatch.d.ts.map +1 -1
- package/dist/api/app/bsky/contact/dismissMatch.js.map +1 -1
- package/dist/api/app/bsky/contact/getMatches.d.ts +2 -2
- package/dist/api/app/bsky/contact/getMatches.d.ts.map +1 -1
- package/dist/api/app/bsky/contact/getMatches.js.map +1 -1
- package/dist/api/app/bsky/contact/getSyncStatus.d.ts +2 -2
- package/dist/api/app/bsky/contact/getSyncStatus.d.ts.map +1 -1
- package/dist/api/app/bsky/contact/getSyncStatus.js.map +1 -1
- package/dist/api/app/bsky/contact/importContacts.d.ts +2 -2
- package/dist/api/app/bsky/contact/importContacts.d.ts.map +1 -1
- package/dist/api/app/bsky/contact/importContacts.js.map +1 -1
- package/dist/api/app/bsky/contact/removeData.d.ts +2 -2
- package/dist/api/app/bsky/contact/removeData.d.ts.map +1 -1
- package/dist/api/app/bsky/contact/removeData.js.map +1 -1
- package/dist/api/app/bsky/contact/sendNotification.d.ts +2 -2
- package/dist/api/app/bsky/contact/sendNotification.d.ts.map +1 -1
- package/dist/api/app/bsky/contact/sendNotification.js.map +1 -1
- package/dist/api/app/bsky/contact/startPhoneVerification.d.ts +2 -2
- package/dist/api/app/bsky/contact/startPhoneVerification.d.ts.map +1 -1
- package/dist/api/app/bsky/contact/startPhoneVerification.js.map +1 -1
- package/dist/api/app/bsky/contact/util.d.ts +2 -2
- package/dist/api/app/bsky/contact/util.d.ts.map +1 -1
- package/dist/api/app/bsky/contact/util.js.map +1 -1
- package/dist/api/app/bsky/contact/verifyPhone.d.ts +2 -2
- package/dist/api/app/bsky/contact/verifyPhone.d.ts.map +1 -1
- package/dist/api/app/bsky/contact/verifyPhone.js.map +1 -1
- package/dist/api/app/bsky/draft/createDraft.d.ts +2 -2
- package/dist/api/app/bsky/draft/createDraft.d.ts.map +1 -1
- package/dist/api/app/bsky/draft/createDraft.js.map +1 -1
- package/dist/api/app/bsky/draft/deleteDraft.d.ts +2 -2
- package/dist/api/app/bsky/draft/deleteDraft.d.ts.map +1 -1
- package/dist/api/app/bsky/draft/deleteDraft.js.map +1 -1
- package/dist/api/app/bsky/draft/getDrafts.d.ts +2 -2
- package/dist/api/app/bsky/draft/getDrafts.d.ts.map +1 -1
- package/dist/api/app/bsky/draft/getDrafts.js.map +1 -1
- package/dist/api/app/bsky/draft/updateDraft.d.ts +2 -2
- package/dist/api/app/bsky/draft/updateDraft.d.ts.map +1 -1
- package/dist/api/app/bsky/draft/updateDraft.js.map +1 -1
- package/dist/api/app/bsky/embed/getEmbedExternalView.d.ts +2 -2
- package/dist/api/app/bsky/embed/getEmbedExternalView.d.ts.map +1 -1
- package/dist/api/app/bsky/embed/getEmbedExternalView.js.map +1 -1
- package/dist/api/app/bsky/feed/getActorFeeds.d.ts +2 -2
- package/dist/api/app/bsky/feed/getActorFeeds.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getActorFeeds.js.map +1 -1
- package/dist/api/app/bsky/feed/getActorLikes.d.ts +2 -2
- package/dist/api/app/bsky/feed/getActorLikes.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getActorLikes.js.map +1 -1
- package/dist/api/app/bsky/feed/getAuthorFeed.d.ts +7 -7
- package/dist/api/app/bsky/feed/getAuthorFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getAuthorFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getFeed.d.ts +3 -3
- package/dist/api/app/bsky/feed/getFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getFeedGenerator.d.ts +2 -2
- package/dist/api/app/bsky/feed/getFeedGenerator.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getFeedGenerator.js.map +1 -1
- package/dist/api/app/bsky/feed/getFeedGenerators.d.ts +2 -2
- package/dist/api/app/bsky/feed/getFeedGenerators.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getFeedGenerators.js.map +1 -1
- package/dist/api/app/bsky/feed/getLikes.d.ts +2 -2
- package/dist/api/app/bsky/feed/getLikes.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getLikes.js.map +1 -1
- package/dist/api/app/bsky/feed/getListFeed.d.ts +6 -6
- package/dist/api/app/bsky/feed/getListFeed.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getListFeed.js.map +1 -1
- package/dist/api/app/bsky/feed/getPostThread.d.ts +2 -2
- package/dist/api/app/bsky/feed/getPostThread.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getPostThread.js.map +1 -1
- package/dist/api/app/bsky/feed/getPosts.d.ts +2 -2
- package/dist/api/app/bsky/feed/getPosts.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getPosts.js.map +1 -1
- package/dist/api/app/bsky/feed/getQuotes.d.ts +2 -2
- package/dist/api/app/bsky/feed/getQuotes.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getQuotes.js.map +1 -1
- package/dist/api/app/bsky/feed/getRepostedBy.d.ts +2 -2
- package/dist/api/app/bsky/feed/getRepostedBy.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getRepostedBy.js.map +1 -1
- package/dist/api/app/bsky/feed/getSuggestedFeeds.d.ts +2 -2
- package/dist/api/app/bsky/feed/getSuggestedFeeds.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getSuggestedFeeds.js.map +1 -1
- package/dist/api/app/bsky/feed/getTimeline.d.ts +6 -6
- package/dist/api/app/bsky/feed/getTimeline.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/getTimeline.js.map +1 -1
- package/dist/api/app/bsky/feed/searchPosts.d.ts +2 -2
- package/dist/api/app/bsky/feed/searchPosts.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/searchPosts.js +11 -3
- package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
- package/dist/api/app/bsky/feed/searchPostsV2.d.ts +2 -2
- package/dist/api/app/bsky/feed/searchPostsV2.d.ts.map +1 -1
- package/dist/api/app/bsky/feed/searchPostsV2.js +10 -2
- package/dist/api/app/bsky/feed/searchPostsV2.js.map +1 -1
- package/dist/api/app/bsky/graph/getActorStarterPacks.d.ts +2 -2
- package/dist/api/app/bsky/graph/getActorStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getActorStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/graph/getBlocks.d.ts +2 -2
- package/dist/api/app/bsky/graph/getBlocks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getBlocks.js.map +1 -1
- package/dist/api/app/bsky/graph/getFollowers.d.ts +2 -2
- package/dist/api/app/bsky/graph/getFollowers.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getFollowers.js.map +1 -1
- package/dist/api/app/bsky/graph/getFollows.d.ts +2 -2
- package/dist/api/app/bsky/graph/getFollows.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getFollows.js.map +1 -1
- package/dist/api/app/bsky/graph/getKnownFollowers.d.ts +2 -2
- package/dist/api/app/bsky/graph/getKnownFollowers.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getKnownFollowers.js.map +1 -1
- package/dist/api/app/bsky/graph/getList.d.ts +2 -2
- package/dist/api/app/bsky/graph/getList.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getList.js.map +1 -1
- package/dist/api/app/bsky/graph/getListBlocks.d.ts +2 -2
- package/dist/api/app/bsky/graph/getListBlocks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getListBlocks.js.map +1 -1
- package/dist/api/app/bsky/graph/getListMutes.d.ts +2 -2
- package/dist/api/app/bsky/graph/getListMutes.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getListMutes.js.map +1 -1
- package/dist/api/app/bsky/graph/getLists.d.ts +2 -2
- package/dist/api/app/bsky/graph/getLists.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getLists.js.map +1 -1
- package/dist/api/app/bsky/graph/getListsWithMembership.d.ts +2 -2
- package/dist/api/app/bsky/graph/getListsWithMembership.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getListsWithMembership.js.map +1 -1
- package/dist/api/app/bsky/graph/getMutes.d.ts +2 -2
- package/dist/api/app/bsky/graph/getMutes.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getMutes.js.map +1 -1
- package/dist/api/app/bsky/graph/getRelationships.d.ts +2 -2
- package/dist/api/app/bsky/graph/getRelationships.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getRelationships.js.map +1 -1
- package/dist/api/app/bsky/graph/getStarterPack.d.ts +2 -2
- package/dist/api/app/bsky/graph/getStarterPack.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getStarterPack.js.map +1 -1
- package/dist/api/app/bsky/graph/getStarterPacks.d.ts +2 -2
- package/dist/api/app/bsky/graph/getStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/graph/getStarterPacksWithMembership.d.ts +2 -2
- package/dist/api/app/bsky/graph/getStarterPacksWithMembership.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getStarterPacksWithMembership.js.map +1 -1
- package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.d.ts +2 -2
- package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/getSuggestedFollowsByActor.js.map +1 -1
- package/dist/api/app/bsky/graph/muteActor.d.ts +2 -2
- package/dist/api/app/bsky/graph/muteActor.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/muteActor.js.map +1 -1
- package/dist/api/app/bsky/graph/muteActorList.d.ts +2 -2
- package/dist/api/app/bsky/graph/muteActorList.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/muteActorList.js.map +1 -1
- package/dist/api/app/bsky/graph/muteThread.d.ts +2 -2
- package/dist/api/app/bsky/graph/muteThread.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/muteThread.js.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacks.d.ts +2 -2
- package/dist/api/app/bsky/graph/searchStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/searchStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/graph/unmuteActor.d.ts +2 -2
- package/dist/api/app/bsky/graph/unmuteActor.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/unmuteActor.js.map +1 -1
- package/dist/api/app/bsky/graph/unmuteActorList.d.ts +2 -2
- package/dist/api/app/bsky/graph/unmuteActorList.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/unmuteActorList.js.map +1 -1
- package/dist/api/app/bsky/graph/unmuteThread.d.ts +2 -2
- package/dist/api/app/bsky/graph/unmuteThread.d.ts.map +1 -1
- package/dist/api/app/bsky/graph/unmuteThread.js.map +1 -1
- package/dist/api/app/bsky/labeler/getServices.d.ts +2 -2
- package/dist/api/app/bsky/labeler/getServices.d.ts.map +1 -1
- package/dist/api/app/bsky/labeler/getServices.js.map +1 -1
- package/dist/api/app/bsky/notification/getPreferences.d.ts +2 -2
- package/dist/api/app/bsky/notification/getPreferences.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/getPreferences.js.map +1 -1
- package/dist/api/app/bsky/notification/getUnreadCount.d.ts +2 -2
- package/dist/api/app/bsky/notification/getUnreadCount.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/getUnreadCount.js.map +1 -1
- package/dist/api/app/bsky/notification/listActivitySubscriptions.d.ts +2 -2
- package/dist/api/app/bsky/notification/listActivitySubscriptions.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/listActivitySubscriptions.js.map +1 -1
- package/dist/api/app/bsky/notification/listNotifications.d.ts +2 -2
- package/dist/api/app/bsky/notification/listNotifications.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/listNotifications.js.map +1 -1
- package/dist/api/app/bsky/notification/putActivitySubscription.d.ts +2 -2
- package/dist/api/app/bsky/notification/putActivitySubscription.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/putActivitySubscription.js.map +1 -1
- package/dist/api/app/bsky/notification/putPreferences.d.ts +2 -2
- package/dist/api/app/bsky/notification/putPreferences.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/putPreferences.js.map +1 -1
- package/dist/api/app/bsky/notification/putPreferencesV2.d.ts +2 -2
- package/dist/api/app/bsky/notification/putPreferencesV2.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/putPreferencesV2.js.map +1 -1
- package/dist/api/app/bsky/notification/registerPush.d.ts +2 -2
- package/dist/api/app/bsky/notification/registerPush.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/registerPush.js.map +1 -1
- package/dist/api/app/bsky/notification/unregisterPush.d.ts +2 -2
- package/dist/api/app/bsky/notification/unregisterPush.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/unregisterPush.js.map +1 -1
- package/dist/api/app/bsky/notification/updateSeen.d.ts +2 -2
- package/dist/api/app/bsky/notification/updateSeen.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/updateSeen.js.map +1 -1
- package/dist/api/app/bsky/notification/util.d.ts +2 -2
- package/dist/api/app/bsky/notification/util.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/util.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getAgeAssuranceState.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getAgeAssuranceState.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getAgeAssuranceState.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getConfig.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getConfig.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getConfig.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getPopularFeedGenerators.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getPostThreadOtherV2.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getPostThreadOtherV2.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getPostThreadOtherV2.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getPostThreadV2.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getPostThreadV2.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getPostThreadV2.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedFeeds.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedOnboardingUsers.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getSuggestedOnboardingUsers.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedOnboardingUsers.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedStarterPacks.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForDiscover.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForDiscover.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForDiscover.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForExplore.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForExplore.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForExplore.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTaggedSuggestions.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getTaggedSuggestions.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTaggedSuggestions.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getTrendingTopics.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrendingTopics.js.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/getTrends.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/getTrends.js.map +1 -1
- package/dist/api/app/bsky/unspecced/initAgeAssurance.d.ts +2 -2
- package/dist/api/app/bsky/unspecced/initAgeAssurance.d.ts.map +1 -1
- package/dist/api/app/bsky/unspecced/initAgeAssurance.js.map +1 -1
- package/dist/api/blob-dispatcher.d.ts +2 -2
- package/dist/api/blob-dispatcher.d.ts.map +1 -1
- package/dist/api/blob-dispatcher.js.map +1 -1
- package/dist/api/blob-resolver.d.ts +6 -6
- package/dist/api/blob-resolver.d.ts.map +1 -1
- package/dist/api/blob-resolver.js.map +1 -1
- package/dist/api/com/atproto/admin/getAccountInfos.d.ts +2 -2
- package/dist/api/com/atproto/admin/getAccountInfos.d.ts.map +1 -1
- package/dist/api/com/atproto/admin/getAccountInfos.js.map +1 -1
- package/dist/api/com/atproto/admin/getSubjectStatus.d.ts +2 -2
- package/dist/api/com/atproto/admin/getSubjectStatus.d.ts.map +1 -1
- package/dist/api/com/atproto/admin/getSubjectStatus.js.map +1 -1
- package/dist/api/com/atproto/admin/updateSubjectStatus.d.ts +2 -2
- package/dist/api/com/atproto/admin/updateSubjectStatus.d.ts.map +1 -1
- package/dist/api/com/atproto/admin/updateSubjectStatus.js.map +1 -1
- package/dist/api/com/atproto/identity/resolveHandle.d.ts +2 -2
- package/dist/api/com/atproto/identity/resolveHandle.d.ts.map +1 -1
- package/dist/api/com/atproto/identity/resolveHandle.js.map +1 -1
- package/dist/api/com/atproto/label/queryLabels.d.ts +2 -2
- package/dist/api/com/atproto/label/queryLabels.d.ts.map +1 -1
- package/dist/api/com/atproto/label/queryLabels.js.map +1 -1
- package/dist/api/com/atproto/repo/getRecord.d.ts +2 -2
- package/dist/api/com/atproto/repo/getRecord.d.ts.map +1 -1
- package/dist/api/com/atproto/repo/getRecord.js.map +1 -1
- package/dist/api/com/atproto/temp/fetchLabels.d.ts +2 -2
- package/dist/api/com/atproto/temp/fetchLabels.d.ts.map +1 -1
- package/dist/api/com/atproto/temp/fetchLabels.js.map +1 -1
- package/dist/api/external.d.ts +1 -1
- package/dist/api/external.d.ts.map +1 -1
- package/dist/api/external.js.map +1 -1
- package/dist/api/health.d.ts +1 -1
- package/dist/api/health.d.ts.map +1 -1
- package/dist/api/health.js.map +1 -1
- package/dist/api/index.d.ts +2 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/bsky/actor/getProfiles.d.ts +2 -2
- package/dist/api/internal/bsky/actor/getProfiles.d.ts.map +1 -1
- package/dist/api/internal/bsky/actor/getProfiles.js.map +1 -1
- package/dist/api/kws/api.d.ts +2 -2
- package/dist/api/kws/api.d.ts.map +1 -1
- package/dist/api/kws/api.js.map +1 -1
- package/dist/api/kws/index.d.ts +1 -1
- package/dist/api/kws/index.d.ts.map +1 -1
- package/dist/api/kws/index.js.map +1 -1
- package/dist/api/kws/types.d.ts +3 -3
- package/dist/api/kws/types.d.ts.map +1 -1
- package/dist/api/kws/types.js.map +1 -1
- package/dist/api/kws/util.d.ts +4 -4
- package/dist/api/kws/util.d.ts.map +1 -1
- package/dist/api/kws/util.js.map +1 -1
- package/dist/api/kws/webhook.d.ts +2 -2
- package/dist/api/kws/webhook.d.ts.map +1 -1
- package/dist/api/kws/webhook.js.map +1 -1
- package/dist/api/sitemap.d.ts +1 -1
- package/dist/api/sitemap.d.ts.map +1 -1
- package/dist/api/sitemap.js.map +1 -1
- package/dist/api/util.d.ts +3 -3
- package/dist/api/util.d.ts.map +1 -1
- package/dist/api/util.js.map +1 -1
- package/dist/api/well-known.d.ts +1 -1
- package/dist/api/well-known.d.ts.map +1 -1
- package/dist/api/well-known.js.map +1 -1
- package/dist/auth-verifier.d.ts +5 -5
- package/dist/auth-verifier.d.ts.map +1 -1
- package/dist/auth-verifier.js +1 -1
- package/dist/auth-verifier.js.map +1 -1
- package/dist/bsync.d.ts +2 -2
- package/dist/bsync.d.ts.map +1 -1
- package/dist/bsync.js.map +1 -1
- package/dist/cache/read-through.d.ts +1 -1
- package/dist/cache/read-through.d.ts.map +1 -1
- package/dist/cache/read-through.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +18 -18
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/courier.d.ts +2 -2
- package/dist/courier.d.ts.map +1 -1
- package/dist/courier.js.map +1 -1
- package/dist/data-plane/client/hosts.d.ts +1 -1
- package/dist/data-plane/client/hosts.d.ts.map +1 -1
- package/dist/data-plane/client/hosts.js.map +1 -1
- package/dist/data-plane/client/index.d.ts +2 -2
- package/dist/data-plane/client/index.d.ts.map +1 -1
- package/dist/data-plane/client/index.js.map +1 -1
- package/dist/data-plane/client/util.d.ts +1 -1
- package/dist/data-plane/client/util.d.ts.map +1 -1
- package/dist/data-plane/client/util.js.map +1 -1
- package/dist/data-plane/server/bsync-subscription.d.ts +2 -2
- package/dist/data-plane/server/bsync-subscription.d.ts.map +1 -1
- package/dist/data-plane/server/bsync-subscription.js +1 -1
- package/dist/data-plane/server/bsync-subscription.js.map +1 -1
- package/dist/data-plane/server/db/database-schema.d.ts +44 -44
- 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/db.d.ts +2 -2
- package/dist/data-plane/server/db/db.d.ts.map +1 -1
- package/dist/data-plane/server/db/db.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230309T045948368Z-init.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230309T045948368Z-init.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230309T045948368Z-init.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230408T152211201Z-notification-init.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230408T152211201Z-notification-init.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230408T152211201Z-notification-init.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230417T210628672Z-moderation-init.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230417T210628672Z-moderation-init.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230417T210628672Z-moderation-init.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230420T211446071Z-did-cache.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230420T211446071Z-did-cache.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230420T211446071Z-did-cache.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230427T194702079Z-notif-record-index.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230427T194702079Z-notif-record-index.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230427T194702079Z-notif-record-index.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230605T144730094Z-post-profile-aggs.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230605T144730094Z-post-profile-aggs.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230605T144730094Z-post-profile-aggs.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230607T211442112Z-feed-generator-init.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230607T211442112Z-feed-generator-init.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230607T211442112Z-feed-generator-init.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230608T155101190Z-algo-whats-hot-view.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230608T155101190Z-algo-whats-hot-view.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230608T155101190Z-algo-whats-hot-view.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230608T201813132Z-mute-lists.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230608T201813132Z-mute-lists.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230608T201813132Z-mute-lists.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230608T205147239Z-mutes.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230608T205147239Z-mutes.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230608T205147239Z-mutes.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230609T153623961Z-blocks.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230609T153623961Z-blocks.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230609T153623961Z-blocks.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230609T232122649Z-actor-deletion-indexes.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230609T232122649Z-actor-deletion-indexes.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230609T232122649Z-actor-deletion-indexes.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230610T203555962Z-suggested-follows.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230610T203555962Z-suggested-follows.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230610T203555962Z-suggested-follows.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230611T215300060Z-actor-state.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230611T215300060Z-actor-state.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230611T215300060Z-actor-state.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230620T161134972Z-post-langs.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230620T161134972Z-post-langs.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230620T161134972Z-post-langs.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230627T212437895Z-optional-handle.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230629T220835893Z-remove-post-hierarchy.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230629T220835893Z-remove-post-hierarchy.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230629T220835893Z-remove-post-hierarchy.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230703T045536691Z-feed-and-label-indices.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230703T045536691Z-feed-and-label-indices.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230703T045536691Z-feed-and-label-indices.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230720T164800037Z-posts-cursor-idx.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230720T164800037Z-posts-cursor-idx.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230720T164800037Z-posts-cursor-idx.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230807T035309811Z-feed-item-delete-invite-for-user-idx.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230807T035309811Z-feed-item-delete-invite-for-user-idx.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230807T035309811Z-feed-item-delete-invite-for-user-idx.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230808T172902639Z-repo-rev.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230808T172902639Z-repo-rev.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230808T172902639Z-repo-rev.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230810T203349843Z-action-duration.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230810T203349843Z-action-duration.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230810T203349843Z-action-duration.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230817T195936007Z-native-notifications.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230817T195936007Z-native-notifications.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230817T195936007Z-native-notifications.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230830T205507322Z-suggested-feeds.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230830T205507322Z-suggested-feeds.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230830T205507322Z-suggested-feeds.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230904T211011773Z-block-lists.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230904T211011773Z-block-lists.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230904T211011773Z-block-lists.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230906T222220386Z-thread-gating.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230906T222220386Z-thread-gating.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230906T222220386Z-thread-gating.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230920T213858047Z-add-tags-to-post.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230920T213858047Z-add-tags-to-post.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230920T213858047Z-add-tags-to-post.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20230929T192920807Z-record-cursor-indexes.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20230929T192920807Z-record-cursor-indexes.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20230929T192920807Z-record-cursor-indexes.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20231003T202833377Z-create-moderation-subject-status.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20231003T202833377Z-create-moderation-subject-status.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20231003T202833377Z-create-moderation-subject-status.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20231220T225126090Z-blob-takedowns.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20231220T225126090Z-blob-takedowns.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20231220T225126090Z-blob-takedowns.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240124T023719200Z-tagged-suggestions.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240124T023719200Z-tagged-suggestions.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240124T023719200Z-tagged-suggestions.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240226T225725627Z-labelers.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240226T225725627Z-labelers.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240226T225725627Z-labelers.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240530T170337073Z-account-deactivation.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240530T170337073Z-account-deactivation.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240530T170337073Z-account-deactivation.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240606T171229898Z-thread-mutes.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240606T171229898Z-thread-mutes.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240606T171229898Z-thread-mutes.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240606T222548219Z-starter-packs.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240606T222548219Z-starter-packs.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240606T222548219Z-starter-packs.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240719T203853939Z-priority-notifs.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240719T203853939Z-priority-notifs.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240719T203853939Z-priority-notifs.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240723T220700077Z-quotes-post-aggs.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240723T220700077Z-quotes-post-aggs.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240723T220700077Z-quotes-post-aggs.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240723T220703655Z-quotes.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240723T220703655Z-quotes.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240723T220703655Z-quotes.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240801T193939827Z-post-gate.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240801T193939827Z-post-gate.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240801T193939827Z-post-gate.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240808T224251220Z-post-gate-flags.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240808T224251220Z-post-gate-flags.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240808T224251220Z-post-gate-flags.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240829T211238293Z-simplify-actor-sync.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240829T211238293Z-simplify-actor-sync.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240829T211238293Z-simplify-actor-sync.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20240831T134810923Z-pinned-posts.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20240831T134810923Z-pinned-posts.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240831T134810923Z-pinned-posts.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20241114T153108102Z-add-starter-packs-name.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20241114T153108102Z-add-starter-packs-name.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20241114T153108102Z-add-starter-packs-name.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20250116T222618297Z-post-embed-video.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20250116T222618297Z-post-embed-video.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20250116T222618297Z-post-embed-video.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20250207T174822012Z-add-label-exp.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20250207T174822012Z-add-label-exp.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20250207T174822012Z-add-label-exp.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20250404T163421487Z-verifications.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20250404T163421487Z-verifications.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20250404T163421487Z-verifications.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20250526T023712742Z-like-repost-via.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20250526T023712742Z-like-repost-via.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20250526T023712742Z-like-repost-via.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20250528T221913281Z-add-record-tags.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20250528T221913281Z-add-record-tags.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20250528T221913281Z-add-record-tags.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20250602T190357447Z-add-private-data.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20250602T190357447Z-add-private-data.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20250602T190357447Z-add-private-data.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20250611T140649895Z-add-activity-subscription.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20250611T140649895Z-add-activity-subscription.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20250611T140649895Z-add-activity-subscription.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20250627T025331240Z-add-actor-age-assurance-columns.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20250627T025331240Z-add-actor-age-assurance-columns.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20250627T025331240Z-add-actor-age-assurance-columns.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20250812T183735692Z-add-bookmarks.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20250812T183735692Z-add-bookmarks.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20250812T183735692Z-add-bookmarks.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20250813T174955711Z-add-post-agg-bookmarks.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20250813T174955711Z-add-post-agg-bookmarks.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20250813T174955711Z-add-post-agg-bookmarks.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20260112T133951271Z-add-drafts.js.map +1 -1
- package/dist/data-plane/server/db/migrations/20260604T224952774Z-post-embed-gallery-image.d.ts +1 -1
- package/dist/data-plane/server/db/migrations/20260604T224952774Z-post-embed-gallery-image.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20260604T224952774Z-post-embed-gallery-image.js.map +1 -1
- package/dist/data-plane/server/db/migrations/provider.d.ts +2 -2
- package/dist/data-plane/server/db/migrations/provider.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/provider.js.map +1 -1
- package/dist/data-plane/server/db/pagination.d.ts +2 -2
- package/dist/data-plane/server/db/pagination.d.ts.map +1 -1
- package/dist/data-plane/server/db/pagination.js.map +1 -1
- package/dist/data-plane/server/db/tables/actor-block.d.ts +1 -1
- package/dist/data-plane/server/db/tables/actor-block.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/actor-block.js.map +1 -1
- package/dist/data-plane/server/db/tables/actor.d.ts +1 -1
- package/dist/data-plane/server/db/tables/actor.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/actor.js.map +1 -1
- package/dist/data-plane/server/db/tables/did-cache.d.ts +1 -1
- package/dist/data-plane/server/db/tables/did-cache.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/did-cache.js.map +1 -1
- package/dist/data-plane/server/db/tables/feed-generator.d.ts +1 -1
- package/dist/data-plane/server/db/tables/feed-generator.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/feed-generator.js.map +1 -1
- package/dist/data-plane/server/db/tables/follow.d.ts +1 -1
- package/dist/data-plane/server/db/tables/follow.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/follow.js.map +1 -1
- package/dist/data-plane/server/db/tables/labeler.d.ts +1 -1
- package/dist/data-plane/server/db/tables/labeler.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/labeler.js.map +1 -1
- package/dist/data-plane/server/db/tables/like.d.ts +1 -1
- package/dist/data-plane/server/db/tables/like.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/like.js.map +1 -1
- package/dist/data-plane/server/db/tables/list-block.d.ts +1 -1
- package/dist/data-plane/server/db/tables/list-block.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/list-block.js.map +1 -1
- package/dist/data-plane/server/db/tables/list-item.d.ts +1 -1
- package/dist/data-plane/server/db/tables/list-item.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/list-item.js.map +1 -1
- package/dist/data-plane/server/db/tables/list.d.ts +1 -1
- package/dist/data-plane/server/db/tables/list.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/list.js.map +1 -1
- package/dist/data-plane/server/db/tables/notification.d.ts +1 -1
- package/dist/data-plane/server/db/tables/notification.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/notification.js.map +1 -1
- package/dist/data-plane/server/db/tables/post-agg.d.ts +1 -1
- package/dist/data-plane/server/db/tables/post-agg.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/post-agg.js.map +1 -1
- package/dist/data-plane/server/db/tables/post.d.ts +1 -1
- package/dist/data-plane/server/db/tables/post.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/post.js.map +1 -1
- package/dist/data-plane/server/db/tables/profile-agg.d.ts +1 -1
- package/dist/data-plane/server/db/tables/profile-agg.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/profile-agg.js.map +1 -1
- package/dist/data-plane/server/db/tables/quote.d.ts +1 -1
- package/dist/data-plane/server/db/tables/quote.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/quote.js.map +1 -1
- package/dist/data-plane/server/db/tables/record.d.ts +1 -1
- package/dist/data-plane/server/db/tables/record.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/record.js.map +1 -1
- package/dist/data-plane/server/db/tables/repost.d.ts +1 -1
- package/dist/data-plane/server/db/tables/repost.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/repost.js.map +1 -1
- package/dist/data-plane/server/db/tables/starter-pack.d.ts +1 -1
- package/dist/data-plane/server/db/tables/starter-pack.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/starter-pack.js.map +1 -1
- package/dist/data-plane/server/db/tables/verification.d.ts +1 -1
- package/dist/data-plane/server/db/tables/verification.d.ts.map +1 -1
- package/dist/data-plane/server/db/tables/verification.js.map +1 -1
- package/dist/data-plane/server/db/types.d.ts +1 -1
- package/dist/data-plane/server/db/types.d.ts.map +1 -1
- package/dist/data-plane/server/db/types.js.map +1 -1
- package/dist/data-plane/server/db/util.d.ts +2 -2
- package/dist/data-plane/server/db/util.d.ts.map +1 -1
- package/dist/data-plane/server/db/util.js.map +1 -1
- package/dist/data-plane/server/index.d.ts +2 -2
- package/dist/data-plane/server/index.d.ts.map +1 -1
- package/dist/data-plane/server/index.js.map +1 -1
- package/dist/data-plane/server/indexing/index.d.ts +5 -5
- package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/index.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/block.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/block.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/block.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/chat-declaration.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/chat-declaration.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/chat-declaration.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/feed-generator.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/feed-generator.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/follow.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/follow.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/follow.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/germ-declaration.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/germ-declaration.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/labeler.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/labeler.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/labeler.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/like.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/like.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/like.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/list-block.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/list-block.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/list-block.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/list-item.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/list-item.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/list-item.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/list.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/list.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/list.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/notif-declaration.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/notif-declaration.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/notif-declaration.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/post-gate.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/post-gate.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/post-gate.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/post.d.ts +4 -4
- package/dist/data-plane/server/indexing/plugins/post.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/post.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/profile.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/profile.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/profile.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/repost.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/repost.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/repost.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/starter-pack.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/starter-pack.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/status.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/status.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/status.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/thread-gate.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/thread-gate.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/thread-gate.js.map +1 -1
- package/dist/data-plane/server/indexing/plugins/verification.d.ts +2 -2
- package/dist/data-plane/server/indexing/plugins/verification.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/plugins/verification.js.map +1 -1
- package/dist/data-plane/server/indexing/processor.d.ts +6 -6
- package/dist/data-plane/server/indexing/processor.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/processor.js +1 -1
- package/dist/data-plane/server/indexing/processor.js.map +1 -1
- package/dist/data-plane/server/routes/activity-subscription.d.ts +3 -3
- package/dist/data-plane/server/routes/activity-subscription.d.ts.map +1 -1
- package/dist/data-plane/server/routes/activity-subscription.js.map +1 -1
- package/dist/data-plane/server/routes/blocks.d.ts +3 -3
- package/dist/data-plane/server/routes/blocks.d.ts.map +1 -1
- package/dist/data-plane/server/routes/blocks.js.map +1 -1
- package/dist/data-plane/server/routes/bookmarks.d.ts +3 -3
- package/dist/data-plane/server/routes/bookmarks.d.ts.map +1 -1
- package/dist/data-plane/server/routes/bookmarks.js.map +1 -1
- package/dist/data-plane/server/routes/drafts.d.ts +3 -3
- package/dist/data-plane/server/routes/drafts.d.ts.map +1 -1
- package/dist/data-plane/server/routes/drafts.js.map +1 -1
- package/dist/data-plane/server/routes/feed-gens.d.ts +3 -3
- package/dist/data-plane/server/routes/feed-gens.d.ts.map +1 -1
- package/dist/data-plane/server/routes/feed-gens.js.map +1 -1
- package/dist/data-plane/server/routes/feeds.d.ts +3 -3
- package/dist/data-plane/server/routes/feeds.d.ts.map +1 -1
- package/dist/data-plane/server/routes/feeds.js.map +1 -1
- package/dist/data-plane/server/routes/follows.d.ts +3 -3
- package/dist/data-plane/server/routes/follows.d.ts.map +1 -1
- package/dist/data-plane/server/routes/follows.js.map +1 -1
- package/dist/data-plane/server/routes/identity.d.ts +4 -4
- package/dist/data-plane/server/routes/identity.d.ts.map +1 -1
- package/dist/data-plane/server/routes/identity.js +1 -1
- package/dist/data-plane/server/routes/identity.js.map +1 -1
- package/dist/data-plane/server/routes/index.d.ts +3 -3
- package/dist/data-plane/server/routes/index.d.ts.map +1 -1
- package/dist/data-plane/server/routes/index.js.map +1 -1
- package/dist/data-plane/server/routes/interactions.d.ts +3 -3
- package/dist/data-plane/server/routes/interactions.d.ts.map +1 -1
- package/dist/data-plane/server/routes/interactions.js.map +1 -1
- package/dist/data-plane/server/routes/labels.d.ts +3 -3
- package/dist/data-plane/server/routes/labels.d.ts.map +1 -1
- package/dist/data-plane/server/routes/labels.js.map +1 -1
- package/dist/data-plane/server/routes/likes.d.ts +3 -3
- package/dist/data-plane/server/routes/likes.d.ts.map +1 -1
- package/dist/data-plane/server/routes/likes.js.map +1 -1
- package/dist/data-plane/server/routes/lists.d.ts +3 -3
- package/dist/data-plane/server/routes/lists.d.ts.map +1 -1
- package/dist/data-plane/server/routes/lists.js.map +1 -1
- package/dist/data-plane/server/routes/moderation.d.ts +3 -3
- package/dist/data-plane/server/routes/moderation.d.ts.map +1 -1
- package/dist/data-plane/server/routes/moderation.js.map +1 -1
- package/dist/data-plane/server/routes/mutes.d.ts +3 -3
- package/dist/data-plane/server/routes/mutes.d.ts.map +1 -1
- package/dist/data-plane/server/routes/mutes.js.map +1 -1
- package/dist/data-plane/server/routes/notifs.d.ts +4 -4
- package/dist/data-plane/server/routes/notifs.d.ts.map +1 -1
- package/dist/data-plane/server/routes/notifs.js.map +1 -1
- package/dist/data-plane/server/routes/profile.d.ts +3 -3
- package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
- package/dist/data-plane/server/routes/profile.js +1 -1
- package/dist/data-plane/server/routes/profile.js.map +1 -1
- package/dist/data-plane/server/routes/quotes.d.ts +3 -3
- package/dist/data-plane/server/routes/quotes.d.ts.map +1 -1
- package/dist/data-plane/server/routes/quotes.js.map +1 -1
- package/dist/data-plane/server/routes/records.d.ts +3 -3
- package/dist/data-plane/server/routes/records.d.ts.map +1 -1
- package/dist/data-plane/server/routes/records.js.map +1 -1
- package/dist/data-plane/server/routes/relationships.d.ts +3 -3
- package/dist/data-plane/server/routes/relationships.d.ts.map +1 -1
- package/dist/data-plane/server/routes/relationships.js.map +1 -1
- package/dist/data-plane/server/routes/reposts.d.ts +3 -3
- package/dist/data-plane/server/routes/reposts.d.ts.map +1 -1
- package/dist/data-plane/server/routes/reposts.js.map +1 -1
- package/dist/data-plane/server/routes/search.d.ts +3 -3
- package/dist/data-plane/server/routes/search.d.ts.map +1 -1
- package/dist/data-plane/server/routes/search.js.map +1 -1
- package/dist/data-plane/server/routes/site-standard.d.ts +3 -3
- package/dist/data-plane/server/routes/site-standard.d.ts.map +1 -1
- package/dist/data-plane/server/routes/site-standard.js.map +1 -1
- package/dist/data-plane/server/routes/sitemap.d.ts +2 -2
- package/dist/data-plane/server/routes/sitemap.d.ts.map +1 -1
- package/dist/data-plane/server/routes/sitemap.js.map +1 -1
- package/dist/data-plane/server/routes/starter-packs.d.ts +3 -3
- package/dist/data-plane/server/routes/starter-packs.d.ts.map +1 -1
- package/dist/data-plane/server/routes/starter-packs.js.map +1 -1
- package/dist/data-plane/server/routes/suggestions.d.ts +3 -3
- package/dist/data-plane/server/routes/suggestions.d.ts.map +1 -1
- package/dist/data-plane/server/routes/suggestions.js.map +1 -1
- package/dist/data-plane/server/routes/sync.d.ts +3 -3
- package/dist/data-plane/server/routes/sync.d.ts.map +1 -1
- package/dist/data-plane/server/routes/sync.js.map +1 -1
- package/dist/data-plane/server/routes/threads.d.ts +3 -3
- package/dist/data-plane/server/routes/threads.d.ts.map +1 -1
- package/dist/data-plane/server/routes/threads.js.map +1 -1
- package/dist/data-plane/server/subscription.d.ts +2 -2
- package/dist/data-plane/server/subscription.d.ts.map +1 -1
- package/dist/data-plane/server/subscription.js +1 -1
- package/dist/data-plane/server/subscription.js.map +1 -1
- package/dist/data-plane/server/util.d.ts +2 -2
- package/dist/data-plane/server/util.d.ts.map +1 -1
- package/dist/data-plane/server/util.js.map +1 -1
- package/dist/error.d.ts +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js.map +1 -1
- package/dist/etcd.d.ts +1 -1
- package/dist/etcd.d.ts.map +1 -1
- package/dist/etcd.js.map +1 -1
- package/dist/feature-gates/index.d.ts +1 -1
- package/dist/feature-gates/index.d.ts.map +1 -1
- package/dist/feature-gates/index.js +1 -0
- package/dist/feature-gates/index.js.map +1 -1
- package/dist/feature-gates/types.d.ts +1 -1
- package/dist/feature-gates/types.d.ts.map +1 -1
- package/dist/feature-gates/types.js.map +1 -1
- package/dist/feature-gates/utils.d.ts +2 -2
- package/dist/feature-gates/utils.d.ts.map +1 -1
- package/dist/feature-gates/utils.js.map +1 -1
- package/dist/hydration/actor.d.ts +7 -5
- package/dist/hydration/actor.d.ts.map +1 -1
- package/dist/hydration/actor.js +2 -0
- package/dist/hydration/actor.js.map +1 -1
- package/dist/hydration/external.d.ts +4 -4
- package/dist/hydration/external.d.ts.map +1 -1
- package/dist/hydration/external.js +1 -1
- package/dist/hydration/external.js.map +1 -1
- package/dist/hydration/feed.d.ts +4 -4
- package/dist/hydration/feed.d.ts.map +1 -1
- package/dist/hydration/feed.js.map +1 -1
- package/dist/hydration/graph.d.ts +5 -5
- package/dist/hydration/graph.d.ts.map +1 -1
- package/dist/hydration/graph.js +1 -1
- package/dist/hydration/graph.js.map +1 -1
- package/dist/hydration/hydrator.d.ts +11 -11
- package/dist/hydration/hydrator.d.ts.map +1 -1
- package/dist/hydration/hydrator.js +1 -1
- package/dist/hydration/hydrator.js.map +1 -1
- package/dist/hydration/label.d.ts +5 -5
- package/dist/hydration/label.d.ts.map +1 -1
- package/dist/hydration/label.js +1 -1
- package/dist/hydration/label.js.map +1 -1
- package/dist/hydration/util.d.ts +3 -3
- package/dist/hydration/util.d.ts.map +1 -1
- package/dist/hydration/util.js.map +1 -1
- package/dist/image/invalidator.d.ts +1 -1
- package/dist/image/invalidator.d.ts.map +1 -1
- package/dist/image/invalidator.js.map +1 -1
- package/dist/image/server.d.ts +3 -3
- package/dist/image/server.d.ts.map +1 -1
- package/dist/image/server.js.map +1 -1
- package/dist/image/sharp.d.ts +2 -2
- package/dist/image/sharp.d.ts.map +1 -1
- package/dist/image/sharp.js.map +1 -1
- package/dist/image/uri.d.ts +2 -2
- package/dist/image/uri.d.ts.map +1 -1
- package/dist/image/uri.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/kws.d.ts +2 -2
- package/dist/kws.d.ts.map +1 -1
- package/dist/kws.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 +1 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/pipeline.d.ts +1 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js.map +1 -1
- package/dist/rolodex.d.ts +2 -2
- package/dist/rolodex.d.ts.map +1 -1
- package/dist/rolodex.js.map +1 -1
- package/dist/stash.d.ts +2 -2
- package/dist/stash.d.ts.map +1 -1
- package/dist/stash.js.map +1 -1
- package/dist/util/http.d.ts +1 -1
- package/dist/util/http.d.ts.map +1 -1
- package/dist/util/http.js.map +1 -1
- package/dist/util/standard-site.d.ts +1 -1
- package/dist/util/standard-site.d.ts.map +1 -1
- package/dist/util/standard-site.js.map +1 -1
- package/dist/util/uris.d.ts +2 -2
- package/dist/util/uris.d.ts.map +1 -1
- package/dist/util/uris.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js.map +1 -1
- package/dist/views/index.d.ts +11 -11
- package/dist/views/index.d.ts.map +1 -1
- package/dist/views/index.js.map +1 -1
- package/dist/views/threads-v2.d.ts +3 -3
- package/dist/views/threads-v2.d.ts.map +1 -1
- package/dist/views/threads-v2.js.map +1 -1
- package/dist/views/types.d.ts +1 -1
- package/dist/views/types.d.ts.map +1 -1
- package/dist/views/types.js.map +1 -1
- package/dist/views/util.d.ts +2 -2
- package/dist/views/util.d.ts.map +1 -1
- package/dist/views/util.js.map +1 -1
- package/package.json +14 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/hydration/label.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/hydration/label.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,SAAS,EAEf,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EACL,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,UAAU,EAIhB,MAAM,WAAW,CAAA;AAElB,YAAY,EAAE,KAAK,EAAE,CAAA;AAErB,MAAM,MAAM,aAAa,GAAG;IAC1B,eAAe,EAAE,OAAO,CAAA;IACxB,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;CACpD,CAAA;AAED,qBAAa,MACX,SAAQ,YAAY,CAAC,SAAS,EAAE,aAAa,CAC7C,YAAW,MAAM;IAEjB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,MAAM,KAAK,MAAM,EAAE,CAE/C;IACD,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAYvB;IACD,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,KAAK,EAAE,CAQpC;CACF;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;AAE7D,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;AAC/C,MAAM,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAEvD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,WAAW,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAA;AAE7E,qBAAa,aAAa;IACL,SAAS,EAAE,eAAe;IAA7C,YAAmB,SAAS,EAAE,eAAe,EAAI;IAE3C,oBAAoB,CACxB,QAAQ,EAAE,SAAS,EAAE,EACrB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,CAuDjB;IAEK,WAAW,CACf,IAAI,EAAE,SAAS,EAAE,EACjB,gBAAgB,UAAQ,GACvB,OAAO,CAAC,QAAQ,CAAC,CAkBnB;IAEK,sBAAsB,CAC1B,IAAI,EAAE,SAAS,EAAE,EACjB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAiB9B;IAEK,oBAAoB,CACxB,IAAI,EAAE,SAAS,EAAE,EACjB,MAAM,EAAE,SAAS,GAAG,IAAI,GACvB,OAAO,CAAC,WAAW,CAAC,CAiBtB;CACF"}
|
package/dist/hydration/label.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../src/hydration/label.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtUriString, DidString, UriString, atUri } from '@atproto/lex'\nimport { DataPlaneClient } from '../data-plane/client/index.js'\nimport { app, com } from '../lexicons/index.js'\nimport { ParsedLabelers } from '../util.js'\nimport { Label, LabelerRecord } from '../views/types.js'\nimport {\n HydrationMap,\n Merges,\n RecordInfo,\n parseJsonBytes,\n parseRecord,\n parseString,\n} from './util.js'\n\nexport type { Label }\n\nexport type SubjectLabels = {\n isImpersonation: boolean\n isTakendown: boolean\n needsReview: boolean\n labels: HydrationMap<`${string}::${string}`, Label> // src + val -> label\n}\n\nexport class Labels\n extends HydrationMap<UriString, SubjectLabels>\n implements Merges\n{\n static key(label: Label): `${string}::${string}` {\n return `${label.src}::${label.val}`\n }\n merge(map: Labels): this {\n for (const [key, theirs] of map) {\n if (!theirs) continue\n const mine = this.get(key)\n if (mine) {\n mine.isTakendown = mine.isTakendown || theirs.isTakendown\n mine.labels = mine.labels.merge(theirs.labels)\n } else {\n this.set(key, theirs)\n }\n }\n return this\n }\n getBySubject(sub: UriString): Label[] {\n const it = this.get(sub)?.labels.values()\n if (!it) return []\n const labels: Label[] = []\n for (const label of it) {\n if (label) labels.push(label)\n }\n return labels\n }\n}\n\nexport type LabelerAgg = {\n likes: number\n}\n\nexport type LabelerAggs = HydrationMap<DidString, LabelerAgg>\n\nexport type Labeler = RecordInfo<LabelerRecord>\nexport type Labelers = HydrationMap<DidString, Labeler>\n\nexport type LabelerViewerState = {\n like?: AtUriString\n}\n\nexport type LabelerViewerStates = HydrationMap<DidString, LabelerViewerState>\n\nexport class LabelHydrator {\n constructor(public dataplane: DataPlaneClient) {}\n\n async getLabelsForSubjects(\n subjects: UriString[],\n labelers: ParsedLabelers,\n ): Promise<Labels> {\n const map = new Labels()\n\n if (!subjects.length || !labelers.dids.length) return map\n\n const res = await this.dataplane.getLabels({\n subjects,\n issuers: labelers.dids,\n })\n\n for (const cur of res.labels) {\n const parsed = parseJsonBytes(com.atproto.label.defs.label, cur)\n if (!parsed || parsed.neg) continue\n const { sig: _, ...label } = parsed\n let entry = map.get(label.uri)\n if (!entry) {\n entry = {\n isImpersonation: false,\n isTakendown: false,\n needsReview: false,\n labels: new HydrationMap(),\n }\n map.set(label.uri, entry)\n }\n\n const isActionableNeedsReview =\n label.val === NEEDS_REVIEW_LABEL &&\n !label.neg &&\n labelers.redact.has(label.src)\n\n // we action needs review labels on backend for now so don't send to client until client has proper logic for them\n if (!isActionableNeedsReview) {\n entry.labels.set(Labels.key(label), label)\n }\n\n if (\n TAKEDOWN_LABELS.includes(label.val) &&\n !label.neg &&\n labelers.redact.has(label.src)\n ) {\n entry.isTakendown = true\n }\n if (isActionableNeedsReview) {\n entry.needsReview = true\n }\n if (\n label.val === IMPERSONATION_LABEL &&\n !label.neg &&\n labelers.redact.has(label.src)\n ) {\n entry.isImpersonation = true\n }\n }\n\n return map\n }\n\n async getLabelers(\n dids: DidString[],\n includeTakedowns = false,\n ): Promise<Labelers> {\n const map: Labelers = new HydrationMap()\n if (!dids.length) return map\n\n const res = await this.dataplane.getLabelerRecords({\n uris: dids.map(labelerDidToUri),\n })\n for (let i = 0; i < dids.length; i++) {\n const did = dids[i]\n const record = parseRecord(\n app.bsky.labeler.service.main,\n res.records[i],\n includeTakedowns,\n )\n map.set(did, record ?? null)\n }\n\n return map\n }\n\n async getLabelerViewerStates(\n dids: DidString[],\n viewer: DidString,\n ): Promise<LabelerViewerStates> {\n const map: LabelerViewerStates = new HydrationMap()\n if (!dids.length) return map\n\n const likes = await this.dataplane.getLikesByActorAndSubjects({\n actorDid: viewer,\n refs: dids.map((did) => ({ uri: labelerDidToUri(did) })),\n })\n\n for (let i = 0; i < dids.length; i++) {\n const did = dids[i]\n map.set(did, {\n like: parseString(likes.uris[i]),\n })\n }\n\n return map\n }\n\n async getLabelerAggregates(\n dids: DidString[],\n viewer: DidString | null,\n ): Promise<LabelerAggs> {\n const map: LabelerAggs = new HydrationMap()\n if (!dids.length) return map\n\n const refs = dids.map((did) => ({ uri: labelerDidToUri(did) }))\n const counts = await this.dataplane.getInteractionCounts({\n refs,\n skipCacheForDids: viewer ? [viewer] : undefined,\n })\n for (let i = 0; i < dids.length; i++) {\n const did = dids[i]\n map.set(did, {\n likes: counts.likes[i] ?? 0,\n })\n }\n\n return map\n }\n}\n\nfunction labelerDidToUri<T extends DidString>(did: T) {\n return atUri(did, app.bsky.labeler.service)\n}\n\nconst IMPERSONATION_LABEL = 'impersonation'\nconst TAKEDOWN_LABELS = ['!takedown', '!suspend']\nconst NEEDS_REVIEW_LABEL = 'needs-review'\n"]}
|
|
1
|
+
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../src/hydration/label.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type AtUriString,\n type DidString,\n type UriString,\n atUri,\n} from '@atproto/lex'\nimport type { DataPlaneClient } from '../data-plane/client/index.js'\nimport { app, com } from '../lexicons/index.js'\nimport type { ParsedLabelers } from '../util.js'\nimport type { Label, LabelerRecord } from '../views/types.js'\nimport {\n HydrationMap,\n type Merges,\n type RecordInfo,\n parseJsonBytes,\n parseRecord,\n parseString,\n} from './util.js'\n\nexport type { Label }\n\nexport type SubjectLabels = {\n isImpersonation: boolean\n isTakendown: boolean\n needsReview: boolean\n labels: HydrationMap<`${string}::${string}`, Label> // src + val -> label\n}\n\nexport class Labels\n extends HydrationMap<UriString, SubjectLabels>\n implements Merges\n{\n static key(label: Label): `${string}::${string}` {\n return `${label.src}::${label.val}`\n }\n merge(map: Labels): this {\n for (const [key, theirs] of map) {\n if (!theirs) continue\n const mine = this.get(key)\n if (mine) {\n mine.isTakendown = mine.isTakendown || theirs.isTakendown\n mine.labels = mine.labels.merge(theirs.labels)\n } else {\n this.set(key, theirs)\n }\n }\n return this\n }\n getBySubject(sub: UriString): Label[] {\n const it = this.get(sub)?.labels.values()\n if (!it) return []\n const labels: Label[] = []\n for (const label of it) {\n if (label) labels.push(label)\n }\n return labels\n }\n}\n\nexport type LabelerAgg = {\n likes: number\n}\n\nexport type LabelerAggs = HydrationMap<DidString, LabelerAgg>\n\nexport type Labeler = RecordInfo<LabelerRecord>\nexport type Labelers = HydrationMap<DidString, Labeler>\n\nexport type LabelerViewerState = {\n like?: AtUriString\n}\n\nexport type LabelerViewerStates = HydrationMap<DidString, LabelerViewerState>\n\nexport class LabelHydrator {\n constructor(public dataplane: DataPlaneClient) {}\n\n async getLabelsForSubjects(\n subjects: UriString[],\n labelers: ParsedLabelers,\n ): Promise<Labels> {\n const map = new Labels()\n\n if (!subjects.length || !labelers.dids.length) return map\n\n const res = await this.dataplane.getLabels({\n subjects,\n issuers: labelers.dids,\n })\n\n for (const cur of res.labels) {\n const parsed = parseJsonBytes(com.atproto.label.defs.label, cur)\n if (!parsed || parsed.neg) continue\n const { sig: _, ...label } = parsed\n let entry = map.get(label.uri)\n if (!entry) {\n entry = {\n isImpersonation: false,\n isTakendown: false,\n needsReview: false,\n labels: new HydrationMap(),\n }\n map.set(label.uri, entry)\n }\n\n const isActionableNeedsReview =\n label.val === NEEDS_REVIEW_LABEL &&\n !label.neg &&\n labelers.redact.has(label.src)\n\n // we action needs review labels on backend for now so don't send to client until client has proper logic for them\n if (!isActionableNeedsReview) {\n entry.labels.set(Labels.key(label), label)\n }\n\n if (\n TAKEDOWN_LABELS.includes(label.val) &&\n !label.neg &&\n labelers.redact.has(label.src)\n ) {\n entry.isTakendown = true\n }\n if (isActionableNeedsReview) {\n entry.needsReview = true\n }\n if (\n label.val === IMPERSONATION_LABEL &&\n !label.neg &&\n labelers.redact.has(label.src)\n ) {\n entry.isImpersonation = true\n }\n }\n\n return map\n }\n\n async getLabelers(\n dids: DidString[],\n includeTakedowns = false,\n ): Promise<Labelers> {\n const map: Labelers = new HydrationMap()\n if (!dids.length) return map\n\n const res = await this.dataplane.getLabelerRecords({\n uris: dids.map(labelerDidToUri),\n })\n for (let i = 0; i < dids.length; i++) {\n const did = dids[i]\n const record = parseRecord(\n app.bsky.labeler.service.main,\n res.records[i],\n includeTakedowns,\n )\n map.set(did, record ?? null)\n }\n\n return map\n }\n\n async getLabelerViewerStates(\n dids: DidString[],\n viewer: DidString,\n ): Promise<LabelerViewerStates> {\n const map: LabelerViewerStates = new HydrationMap()\n if (!dids.length) return map\n\n const likes = await this.dataplane.getLikesByActorAndSubjects({\n actorDid: viewer,\n refs: dids.map((did) => ({ uri: labelerDidToUri(did) })),\n })\n\n for (let i = 0; i < dids.length; i++) {\n const did = dids[i]\n map.set(did, {\n like: parseString(likes.uris[i]),\n })\n }\n\n return map\n }\n\n async getLabelerAggregates(\n dids: DidString[],\n viewer: DidString | null,\n ): Promise<LabelerAggs> {\n const map: LabelerAggs = new HydrationMap()\n if (!dids.length) return map\n\n const refs = dids.map((did) => ({ uri: labelerDidToUri(did) }))\n const counts = await this.dataplane.getInteractionCounts({\n refs,\n skipCacheForDids: viewer ? [viewer] : undefined,\n })\n for (let i = 0; i < dids.length; i++) {\n const did = dids[i]\n map.set(did, {\n likes: counts.likes[i] ?? 0,\n })\n }\n\n return map\n }\n}\n\nfunction labelerDidToUri<T extends DidString>(did: T) {\n return atUri(did, app.bsky.labeler.service)\n}\n\nconst IMPERSONATION_LABEL = 'impersonation'\nconst TAKEDOWN_LABELS = ['!takedown', '!suspend']\nconst NEEDS_REVIEW_LABEL = 'needs-review'\n"]}
|
package/dist/hydration/util.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Timestamp } from '@bufbuild/protobuf';
|
|
2
|
-
import { AtUriString, Cid, InferInput, InferOutput, LexValue, RecordSchema, Schema, TypedLexMap } from '@atproto/lex';
|
|
3
|
-
import { Record as RecordEntry } from '../proto/bsky_pb.js';
|
|
1
|
+
import type { Timestamp } from '@bufbuild/protobuf';
|
|
2
|
+
import { type AtUriString, type Cid, type InferInput, type InferOutput, type LexValue, type RecordSchema, type Schema, type TypedLexMap } from '@atproto/lex';
|
|
3
|
+
import type { Record as RecordEntry } from '../proto/bsky_pb.js';
|
|
4
4
|
export declare class HydrationMap<K, T> extends Map<K, T | null> implements Merges {
|
|
5
5
|
merge(map: HydrationMap<K, T>): this;
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/hydration/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/hydration/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/hydration/util.ts"],"names":[],"mappings":"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","sourcesContent":["import { Timestamp } from '@bufbuild/protobuf'\nimport {\n AtUriString,\n Cid,\n InferInput,\n InferOutput,\n LexParseOptions,\n LexValue,\n RecordSchema,\n Schema,\n TypedLexMap,\n ValidateOptions,\n lexParseJsonBytes,\n parseCidSafe,\n} from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport { Record as RecordEntry } from '../proto/bsky_pb.js'\n\nconst PARSE_OPTIONS: LexParseOptions & ValidateOptions = {\n strict: false,\n}\n\nexport class HydrationMap<K, T> extends Map<K, T | null> implements Merges {\n merge(map: HydrationMap<K, T>): this {\n for (const [key, val] of map) {\n this.set(key, val)\n }\n return this\n }\n}\n\nexport interface Merges {\n merge<T extends this>(map: T): this\n}\n\nexport type RecordInfo<T extends TypedLexMap> = {\n record: T\n cid: string\n sortedAt: Date\n indexedAt: Date\n takedownRef: string | undefined\n}\n\nexport const mergeMaps = <V extends HydrationMap<any, any>>(\n mapA?: V,\n mapB?: V,\n): V | undefined => {\n if (!mapA) return mapB\n if (!mapB) return mapA\n return mapA.merge(mapB)\n}\n\nexport const mergeNestedMaps = <K, V extends HydrationMap<any, any>>(\n mapA?: HydrationMap<K, V>,\n mapB?: HydrationMap<K, V>,\n): HydrationMap<K, V> | undefined => {\n if (!mapA) return mapB\n if (!mapB) return mapA\n\n for (const [key, map] of mapB) {\n const merged = mergeMaps(mapA.get(key) ?? undefined, map ?? undefined)\n mapA.set(key, merged ?? null)\n }\n\n return mapA\n}\n\nexport const mergeManyMaps = <K, T>(...maps: HydrationMap<K, T>[]) => {\n return maps.reduce(mergeMaps, undefined as HydrationMap<K, T> | undefined)\n}\n\nexport type ItemRef = { uri: AtUriString; cid?: string }\n\nexport function parseRecord<TSchema extends RecordSchema>(\n recordSchema: TSchema,\n recordEntry: RecordEntry,\n includeTakedowns: boolean,\n): RecordInfo<InferInput<TSchema>> | undefined {\n if (!includeTakedowns && recordEntry.takenDown) {\n return undefined\n }\n\n const cid = recordEntry.cid\n if (!cid) {\n return undefined\n }\n\n if (recordEntry.record.byteLength === 0) {\n return undefined\n }\n\n const record = lexParseJsonBytes(recordEntry.record, PARSE_OPTIONS)\n if (!record) {\n return undefined\n }\n\n // @NOTE We cannot use parse mode here. We must return the original to ensure\n // that the caller gets the same data as what is stored in the PDS (in case of\n // records). This is important because the receiver of the data should be able\n // to compute the right record CID.\n\n if (!recordSchema.$matches(record, PARSE_OPTIONS)) {\n return undefined\n }\n\n return {\n record,\n cid,\n sortedAt: parseDate(recordEntry.sortedAt) ?? new Date(0),\n indexedAt: parseDate(recordEntry.indexedAt) ?? new Date(0),\n takedownRef: safeTakedownRef(recordEntry),\n }\n}\n\n/**\n * Decodes binary data containing a JSON representation of a Lex value, and\n * validates it against the provided schema, in parse mode (i.e., allowing\n * coercion & defaults).\n *\n * Returns undefined if the input is empty (from dataplane's empty value\n * convention), or if the validation fails.\n */\nexport const parseJsonBytes = <TSchema extends Schema<LexValue>>(\n schema: TSchema,\n bytes: Uint8Array | undefined,\n): InferOutput<TSchema> | undefined => {\n if (!bytes || bytes.byteLength === 0) return undefined\n const value = lexParseJsonBytes(bytes, PARSE_OPTIONS)\n const result = schema.safeParse(value, PARSE_OPTIONS)\n return result.success ? result.value : undefined\n}\n\nexport const parseString = <T extends string | undefined>(\n str: undefined | string,\n): T | undefined => {\n return str ? (str as T) : undefined\n}\n\nexport const parseCid = (cidStr: string | undefined): Cid | null => {\n if (!cidStr) return null\n return parseCidSafe(cidStr)\n}\n\nexport const parseDate = (\n timestamp: Timestamp | undefined,\n): Date | undefined => {\n if (!timestamp) return undefined\n const date = timestamp.toDate()\n // Check for year 1 (0001-01-01 00:00:00 UTC) which is -62135596800000ms from epoch.\n // The Go dataplane gives us those values as they come from the Go zero-value for dates.\n if (date.getTime() === -62135596800000) return undefined\n return date\n}\n\nexport const urisByCollection = <T extends string>(\n uris: Iterable<T>,\n): Map<string, T[]> => {\n const result = new Map<string, T[]>()\n for (const uri of uris) {\n const collection = new AtUri(uri).collection\n const items = result.get(collection) ?? []\n items.push(uri)\n result.set(collection, items)\n }\n return result\n}\n\nexport const split = <T>(\n items: T[],\n predicate: (item: T) => boolean,\n): [T[], T[]] => {\n const yes: T[] = []\n const no: T[] = []\n for (const item of items) {\n if (predicate(item)) {\n yes.push(item)\n } else {\n no.push(item)\n }\n }\n return [yes, no]\n}\n\nexport const safeTakedownRef = (obj?: {\n takenDown: boolean\n takedownRef: string\n}): string | undefined => {\n if (!obj) return\n if (obj.takedownRef) return obj.takedownRef\n if (obj.takenDown) return 'BSKY-TAKEDOWN-UNKNOWN'\n}\n\nexport const isActivitySubscriptionEnabled = ({\n post,\n reply,\n}: {\n post: boolean\n reply: boolean\n}): boolean => post || reply\n"]}
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/hydration/util.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Timestamp } from '@bufbuild/protobuf'\nimport {\n type AtUriString,\n type Cid,\n type InferInput,\n type InferOutput,\n type LexParseOptions,\n type LexValue,\n type RecordSchema,\n type Schema,\n type TypedLexMap,\n type ValidateOptions,\n lexParseJsonBytes,\n parseCidSafe,\n} from '@atproto/lex'\nimport { AtUri } from '@atproto/syntax'\nimport type { Record as RecordEntry } from '../proto/bsky_pb.js'\n\nconst PARSE_OPTIONS: LexParseOptions & ValidateOptions = {\n strict: false,\n}\n\nexport class HydrationMap<K, T> extends Map<K, T | null> implements Merges {\n merge(map: HydrationMap<K, T>): this {\n for (const [key, val] of map) {\n this.set(key, val)\n }\n return this\n }\n}\n\nexport interface Merges {\n merge<T extends this>(map: T): this\n}\n\nexport type RecordInfo<T extends TypedLexMap> = {\n record: T\n cid: string\n sortedAt: Date\n indexedAt: Date\n takedownRef: string | undefined\n}\n\nexport const mergeMaps = <V extends HydrationMap<any, any>>(\n mapA?: V,\n mapB?: V,\n): V | undefined => {\n if (!mapA) return mapB\n if (!mapB) return mapA\n return mapA.merge(mapB)\n}\n\nexport const mergeNestedMaps = <K, V extends HydrationMap<any, any>>(\n mapA?: HydrationMap<K, V>,\n mapB?: HydrationMap<K, V>,\n): HydrationMap<K, V> | undefined => {\n if (!mapA) return mapB\n if (!mapB) return mapA\n\n for (const [key, map] of mapB) {\n const merged = mergeMaps(mapA.get(key) ?? undefined, map ?? undefined)\n mapA.set(key, merged ?? null)\n }\n\n return mapA\n}\n\nexport const mergeManyMaps = <K, T>(...maps: HydrationMap<K, T>[]) => {\n return maps.reduce(mergeMaps, undefined as HydrationMap<K, T> | undefined)\n}\n\nexport type ItemRef = { uri: AtUriString; cid?: string }\n\nexport function parseRecord<TSchema extends RecordSchema>(\n recordSchema: TSchema,\n recordEntry: RecordEntry,\n includeTakedowns: boolean,\n): RecordInfo<InferInput<TSchema>> | undefined {\n if (!includeTakedowns && recordEntry.takenDown) {\n return undefined\n }\n\n const cid = recordEntry.cid\n if (!cid) {\n return undefined\n }\n\n if (recordEntry.record.byteLength === 0) {\n return undefined\n }\n\n const record = lexParseJsonBytes(recordEntry.record, PARSE_OPTIONS)\n if (!record) {\n return undefined\n }\n\n // @NOTE We cannot use parse mode here. We must return the original to ensure\n // that the caller gets the same data as what is stored in the PDS (in case of\n // records). This is important because the receiver of the data should be able\n // to compute the right record CID.\n\n if (!recordSchema.$matches(record, PARSE_OPTIONS)) {\n return undefined\n }\n\n return {\n record,\n cid,\n sortedAt: parseDate(recordEntry.sortedAt) ?? new Date(0),\n indexedAt: parseDate(recordEntry.indexedAt) ?? new Date(0),\n takedownRef: safeTakedownRef(recordEntry),\n }\n}\n\n/**\n * Decodes binary data containing a JSON representation of a Lex value, and\n * validates it against the provided schema, in parse mode (i.e., allowing\n * coercion & defaults).\n *\n * Returns undefined if the input is empty (from dataplane's empty value\n * convention), or if the validation fails.\n */\nexport const parseJsonBytes = <TSchema extends Schema<LexValue>>(\n schema: TSchema,\n bytes: Uint8Array | undefined,\n): InferOutput<TSchema> | undefined => {\n if (!bytes || bytes.byteLength === 0) return undefined\n const value = lexParseJsonBytes(bytes, PARSE_OPTIONS)\n const result = schema.safeParse(value, PARSE_OPTIONS)\n return result.success ? result.value : undefined\n}\n\nexport const parseString = <T extends string | undefined>(\n str: undefined | string,\n): T | undefined => {\n return str ? (str as T) : undefined\n}\n\nexport const parseCid = (cidStr: string | undefined): Cid | null => {\n if (!cidStr) return null\n return parseCidSafe(cidStr)\n}\n\nexport const parseDate = (\n timestamp: Timestamp | undefined,\n): Date | undefined => {\n if (!timestamp) return undefined\n const date = timestamp.toDate()\n // Check for year 1 (0001-01-01 00:00:00 UTC) which is -62135596800000ms from epoch.\n // The Go dataplane gives us those values as they come from the Go zero-value for dates.\n if (date.getTime() === -62135596800000) return undefined\n return date\n}\n\nexport const urisByCollection = <T extends string>(\n uris: Iterable<T>,\n): Map<string, T[]> => {\n const result = new Map<string, T[]>()\n for (const uri of uris) {\n const collection = new AtUri(uri).collection\n const items = result.get(collection) ?? []\n items.push(uri)\n result.set(collection, items)\n }\n return result\n}\n\nexport const split = <T>(\n items: T[],\n predicate: (item: T) => boolean,\n): [T[], T[]] => {\n const yes: T[] = []\n const no: T[] = []\n for (const item of items) {\n if (predicate(item)) {\n yes.push(item)\n } else {\n no.push(item)\n }\n }\n return [yes, no]\n}\n\nexport const safeTakedownRef = (obj?: {\n takenDown: boolean\n takedownRef: string\n}): string | undefined => {\n if (!obj) return\n if (obj.takedownRef) return obj.takedownRef\n if (obj.takenDown) return 'BSKY-TAKEDOWN-UNKNOWN'\n}\n\nexport const isActivitySubscriptionEnabled = ({\n post,\n reply,\n}: {\n post: boolean\n reply: boolean\n}): boolean => post || reply\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invalidator.d.ts","sourceRoot":"","sources":["../../src/image/invalidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"invalidator.d.ts","sourceRoot":"","sources":["../../src/image/invalidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAO5C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5D;AAED,qBAAa,gCAAiC,YAAW,gBAAgB;IAC3D,OAAO,CAAC,KAAK;IAAzB,YAAoB,KAAK,EAAE,SAAS,EAAI;IAClC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,iBAkBjD;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invalidator.js","sourceRoot":"","sources":["../../src/image/invalidator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAU1C,MAAM,OAAO,gCAAgC;IAC3C,YAAoB,KAAgB;qBAAhB,KAAK;IAAc,CAAC;IACxC,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAe;QAChD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACrC,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACpD,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YAChD,MAAM,QAAQ,GAAG;gBACf,OAAO,CAAC,GAAG;gBACX,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;gBACtB,OAAO,CAAC,MAAM;aACf,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACZ,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAClC,CAAC,CAAC,CACH,CAAA;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAC5B,CAAC,MAAM,EAAmC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAC1E,CAAA;QACD,IAAI,SAAS;YAAE,MAAM,SAAS,CAAC,MAAM,CAAA;IACvC,CAAC;CACF","sourcesContent":["import { BlobCache } from './server.js'\nimport { ImageUriBuilder } from './uri.js'\n\n// Invalidation is a general interface for propagating an image blob\n// takedown through any caches where a representation of it may be stored.\n// @NOTE this does not remove the blob from storage: just invalidates it from caches.\n// @NOTE keep in sync with same interface in aws/src/cloudfront.ts\nexport interface ImageInvalidator {\n invalidate(subject: string, paths: string[]): Promise<void>\n}\n\nexport class ImageProcessingServerInvalidator implements ImageInvalidator {\n constructor(private cache: BlobCache) {}\n async invalidate(_subject: string, paths: string[]) {\n const results = await Promise.allSettled(\n paths.map(async (path) => {\n const [, signature] = path.split('/')\n if (!signature) throw new Error('Missing signature')\n const options = ImageUriBuilder.getOptions(path)\n const cacheKey = [\n options.did,\n options.cid.toString(),\n options.preset,\n ].join('::')\n await this.cache.clear(cacheKey)\n }),\n )\n const rejection = results.find(\n (result): result is PromiseRejectedResult => result.status === 'rejected',\n )\n if (rejection) throw rejection.reason\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"invalidator.js","sourceRoot":"","sources":["../../src/image/invalidator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAU1C,MAAM,OAAO,gCAAgC;IAC3C,YAAoB,KAAgB;qBAAhB,KAAK;IAAc,CAAC;IACxC,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAe;QAChD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACrC,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACpD,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YAChD,MAAM,QAAQ,GAAG;gBACf,OAAO,CAAC,GAAG;gBACX,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;gBACtB,OAAO,CAAC,MAAM;aACf,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACZ,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAClC,CAAC,CAAC,CACH,CAAA;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAC5B,CAAC,MAAM,EAAmC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAC1E,CAAA;QACD,IAAI,SAAS;YAAE,MAAM,SAAS,CAAC,MAAM,CAAA;IACvC,CAAC;CACF","sourcesContent":["import type { BlobCache } from './server.js'\nimport { ImageUriBuilder } from './uri.js'\n\n// Invalidation is a general interface for propagating an image blob\n// takedown through any caches where a representation of it may be stored.\n// @NOTE this does not remove the blob from storage: just invalidates it from caches.\n// @NOTE keep in sync with same interface in aws/src/cloudfront.ts\nexport interface ImageInvalidator {\n invalidate(subject: string, paths: string[]): Promise<void>\n}\n\nexport class ImageProcessingServerInvalidator implements ImageInvalidator {\n constructor(private cache: BlobCache) {}\n async invalidate(_subject: string, paths: string[]) {\n const results = await Promise.allSettled(\n paths.map(async (path) => {\n const [, signature] = path.split('/')\n if (!signature) throw new Error('Missing signature')\n const options = ImageUriBuilder.getOptions(path)\n const cacheKey = [\n options.did,\n options.cid.toString(),\n options.preset,\n ].join('::')\n await this.cache.clear(cacheKey)\n }),\n )\n const rejection = results.find(\n (result): result is PromiseRejectedResult => result.status === 'rejected',\n )\n if (rejection) throw rejection.reason\n }\n}\n"]}
|
package/dist/image/server.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fsSync from 'node:fs';
|
|
2
|
-
import { Readable } from 'node:stream';
|
|
3
|
-
import { AppContext } from '../context.js';
|
|
4
|
-
import { Middleware } from '../util/http.js';
|
|
2
|
+
import type { Readable } from 'node:stream';
|
|
3
|
+
import type { AppContext } from '../context.js';
|
|
4
|
+
import { type Middleware } from '../util/http.js';
|
|
5
5
|
export declare function createMiddleware(ctx: AppContext, { prefix }?: {
|
|
6
6
|
prefix?: string;
|
|
7
7
|
}): Middleware;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/image/server.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAI5B,OAAO,EAAU,QAAQ,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/image/server.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAI5B,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,aAAa,CAAA;AAYnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,iBAAiB,CAAA;AAMjE,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,UAAU,EACf,EAAE,MAAY,EAAE,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACzC,UAAU,CA0HZ;AAsBD,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAED,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,QAAQ,CAAC,EAAE,MAAM,EAW5B;IAEK,GAAG,CAAC,MAAM,EAAE,MAAM;;OAcvB;IAEK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,iBASzC;IAEK,KAAK,CAAC,MAAM,EAAE,MAAM,iBAGzB;IAEK,QAAQ,kBAEb;CACF"}
|
package/dist/image/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/image/server.ts"],"names":[],"mappings":"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","sourcesContent":["import fsSync from 'node:fs'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { Duplex, Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport createError, { isHttpError } from 'http-errors'\nimport {\n VerifyCidError,\n VerifyCidTransform,\n cloneStream,\n createDecoders,\n isErrnoException,\n} from '@atproto/common'\nimport { BlobNotFoundError } from '@atproto/repo'\nimport { StreamBlobOptions, streamBlob } from '../api/blob-resolver.js'\nimport { AppContext } from '../context.js'\nimport { Middleware, responseSignal } from '../util/http.js'\nimport log from './logger.js'\nimport { createImageProcessor, createImageUpscaler } from './sharp.js'\nimport { BadPathError, ImageUriBuilder } from './uri.js'\nimport { Options, SharpInfo, formatsToMimes } from './util.js'\n\nexport function createMiddleware(\n ctx: AppContext,\n { prefix = '/' }: { prefix?: string } = {},\n): Middleware {\n if (!prefix.startsWith('/') || !prefix.endsWith('/')) {\n throw new TypeError('Prefix must start and end with a slash')\n }\n\n // If there is a CDN, we don't need to serve images\n if (ctx.cfg.cdnUrl) {\n return (req, res, next) => next()\n }\n\n const cache = new BlobDiskCache(ctx.cfg.blobCacheLocation)\n\n return async (req, res, next) => {\n if (res.destroyed) return\n if (req.method !== 'GET' && req.method !== 'HEAD') return next()\n if (!req.url?.startsWith(prefix)) return next()\n const { 0: path, 1: _search } = req.url.slice(prefix.length - 1).split('?')\n if (!path.startsWith('/') || path === '/') return next()\n\n try {\n const options = ImageUriBuilder.getOptions(path)\n\n const cacheKey = [options.did, options.cid, options.preset].join('::')\n\n // Cached flow\n\n try {\n const cachedImage = await cache.get(cacheKey)\n res.statusCode = 200\n res.setHeader('x-cache', 'hit')\n res.setHeader('content-type', getMime(options.format))\n res.setHeader('cache-control', `public, max-age=31536000`) // 1 year\n res.setHeader('content-length', cachedImage.size)\n await pipeline(cachedImage, res)\n return\n } catch (err) {\n if (!(err instanceof BlobNotFoundError)) {\n log.error({ cacheKey, err }, 'failed to serve cached image')\n }\n\n if (res.headersSent || res.destroyed) {\n res.destroy()\n return // nothing we can do...\n } else {\n // Ignore and move on to non-cached flow.\n res.removeHeader('x-cache')\n res.removeHeader('content-type')\n res.removeHeader('cache-control')\n res.removeHeader('content-length')\n }\n }\n\n // Non-cached flow\n\n const streamOptions: StreamBlobOptions = {\n did: options.did,\n cid: options.cid,\n signal: responseSignal(res),\n }\n\n await streamBlob(ctx, streamOptions, (upstream, { did, cid, url }) => {\n // Definitely not an image ? Let's fail right away.\n if (isImageMime(upstream.headers['content-type']) === false) {\n throw createError(400, 'Not an image')\n }\n\n // Let's transform (decompress, verify CID, upscale), process and respond\n\n const transforms: Duplex[] = [\n ...createDecoders(upstream.headers['content-encoding']),\n new VerifyCidTransform(cid),\n createImageUpscaler(options),\n ]\n const processor = createImageProcessor(options)\n\n // Cache in the background\n cache\n .put(cacheKey, cloneStream(processor))\n .catch((err) => log.error({ err }, 'failed to cache image'))\n\n res.statusCode = 200\n res.setHeader('cache-control', `public, max-age=31536000`) // 1 year\n res.setHeader('x-cache', 'miss')\n processor.once('info', ({ size, format }: SharpInfo) => {\n const type = formatsToMimes.get(format) || 'application/octet-stream'\n\n // @NOTE sharp does emit this in time to be set as a header\n res.setHeader('content-length', size)\n res.setHeader('content-type', type)\n })\n\n const streams = [...transforms, processor, res]\n void pipeline(streams).catch((err: unknown) => {\n log.warn(\n { err, did, cid: cid.toString(), pds: url.origin },\n 'blob resolution failed during transmission',\n )\n })\n\n return streams[0]!\n })\n } catch (err) {\n if (res.headersSent || res.destroyed) {\n res.destroy()\n } else {\n res.removeHeader('content-type')\n res.removeHeader('content-length')\n res.removeHeader('cache-control')\n res.removeHeader('x-cache')\n\n if (err instanceof BadPathError) {\n next(createError(400, err))\n } else if (err instanceof VerifyCidError) {\n next(createError(404, 'Blob not found', err))\n } else if (isHttpError(err)) {\n next(err)\n } else {\n next(createError(502, 'Upstream Error', { cause: err }))\n }\n }\n }\n }\n}\n\nfunction isImageMime(\n contentType: string | string[] | undefined,\n): undefined | boolean {\n if (contentType == null || contentType === 'application/octet-stream') {\n return undefined // maybe\n }\n if (Array.isArray(contentType)) {\n if (contentType.length === 0) return undefined // should never happen\n if (contentType.length === 1) return isImageMime(contentType[0])\n return contentType.every(isImageMime) // Should we throw a 502 here?\n }\n return contentType.startsWith('image/')\n}\n\nfunction getMime(format: Options['format']) {\n const mime = formatsToMimes.get(format)\n if (!mime) throw new Error('Unknown format')\n return mime\n}\n\nexport interface BlobCache {\n get(fileId: string): Promise<Readable & { size: number }>\n put(fileId: string, stream: Readable): Promise<void>\n clear(fileId: string): Promise<void>\n clearAll(): Promise<void>\n}\n\nexport class BlobDiskCache implements BlobCache {\n tempDir: string\n constructor(basePath?: string) {\n this.tempDir = basePath || path.join(os.tmpdir(), 'bsky--processed-images')\n if (!path.isAbsolute(this.tempDir)) {\n throw new Error('Must provide an absolute path')\n }\n try {\n fsSync.mkdirSync(this.tempDir, { recursive: true })\n } catch (err) {\n // All good if cache dir already exists\n if (isErrnoException(err) && err.code === 'EEXIST') return\n }\n }\n\n async get(fileId: string) {\n try {\n const handle = await fs.open(path.join(this.tempDir, fileId), 'r')\n const { size } = await handle.stat()\n if (size === 0) {\n throw new BlobNotFoundError()\n }\n return Object.assign(handle.createReadStream(), { size })\n } catch (err) {\n if (isErrnoException(err) && err.code === 'ENOENT') {\n throw new BlobNotFoundError()\n }\n throw err\n }\n }\n\n async put(fileId: string, stream: Readable) {\n const filename = path.join(this.tempDir, fileId)\n try {\n await fs.writeFile(filename, stream, { flag: 'wx' })\n } catch (err) {\n // Do not overwrite existing file, just ignore the error\n if (isErrnoException(err) && err.code === 'EEXIST') return\n throw err\n }\n }\n\n async clear(fileId: string) {\n const filename = path.join(this.tempDir, fileId)\n await fs.rm(filename, { force: true })\n }\n\n async clearAll() {\n await fs.rm(this.tempDir, { recursive: true, force: true })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/image/server.ts"],"names":[],"mappings":"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","sourcesContent":["import fsSync from 'node:fs'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport type { Duplex, Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport createError, { isHttpError } from 'http-errors'\nimport {\n VerifyCidError,\n VerifyCidTransform,\n cloneStream,\n createDecoders,\n isErrnoException,\n} from '@atproto/common'\nimport { BlobNotFoundError } from '@atproto/repo'\nimport { type StreamBlobOptions, streamBlob } from '../api/blob-resolver.js'\nimport type { AppContext } from '../context.js'\nimport { type Middleware, responseSignal } from '../util/http.js'\nimport log from './logger.js'\nimport { createImageProcessor, createImageUpscaler } from './sharp.js'\nimport { BadPathError, ImageUriBuilder } from './uri.js'\nimport { type Options, type SharpInfo, formatsToMimes } from './util.js'\n\nexport function createMiddleware(\n ctx: AppContext,\n { prefix = '/' }: { prefix?: string } = {},\n): Middleware {\n if (!prefix.startsWith('/') || !prefix.endsWith('/')) {\n throw new TypeError('Prefix must start and end with a slash')\n }\n\n // If there is a CDN, we don't need to serve images\n if (ctx.cfg.cdnUrl) {\n return (req, res, next) => next()\n }\n\n const cache = new BlobDiskCache(ctx.cfg.blobCacheLocation)\n\n return async (req, res, next) => {\n if (res.destroyed) return\n if (req.method !== 'GET' && req.method !== 'HEAD') return next()\n if (!req.url?.startsWith(prefix)) return next()\n const { 0: path, 1: _search } = req.url.slice(prefix.length - 1).split('?')\n if (!path.startsWith('/') || path === '/') return next()\n\n try {\n const options = ImageUriBuilder.getOptions(path)\n\n const cacheKey = [options.did, options.cid, options.preset].join('::')\n\n // Cached flow\n\n try {\n const cachedImage = await cache.get(cacheKey)\n res.statusCode = 200\n res.setHeader('x-cache', 'hit')\n res.setHeader('content-type', getMime(options.format))\n res.setHeader('cache-control', `public, max-age=31536000`) // 1 year\n res.setHeader('content-length', cachedImage.size)\n await pipeline(cachedImage, res)\n return\n } catch (err) {\n if (!(err instanceof BlobNotFoundError)) {\n log.error({ cacheKey, err }, 'failed to serve cached image')\n }\n\n if (res.headersSent || res.destroyed) {\n res.destroy()\n return // nothing we can do...\n } else {\n // Ignore and move on to non-cached flow.\n res.removeHeader('x-cache')\n res.removeHeader('content-type')\n res.removeHeader('cache-control')\n res.removeHeader('content-length')\n }\n }\n\n // Non-cached flow\n\n const streamOptions: StreamBlobOptions = {\n did: options.did,\n cid: options.cid,\n signal: responseSignal(res),\n }\n\n await streamBlob(ctx, streamOptions, (upstream, { did, cid, url }) => {\n // Definitely not an image ? Let's fail right away.\n if (isImageMime(upstream.headers['content-type']) === false) {\n throw createError(400, 'Not an image')\n }\n\n // Let's transform (decompress, verify CID, upscale), process and respond\n\n const transforms: Duplex[] = [\n ...createDecoders(upstream.headers['content-encoding']),\n new VerifyCidTransform(cid),\n createImageUpscaler(options),\n ]\n const processor = createImageProcessor(options)\n\n // Cache in the background\n cache\n .put(cacheKey, cloneStream(processor))\n .catch((err) => log.error({ err }, 'failed to cache image'))\n\n res.statusCode = 200\n res.setHeader('cache-control', `public, max-age=31536000`) // 1 year\n res.setHeader('x-cache', 'miss')\n processor.once('info', ({ size, format }: SharpInfo) => {\n const type = formatsToMimes.get(format) || 'application/octet-stream'\n\n // @NOTE sharp does emit this in time to be set as a header\n res.setHeader('content-length', size)\n res.setHeader('content-type', type)\n })\n\n const streams = [...transforms, processor, res]\n void pipeline(streams).catch((err: unknown) => {\n log.warn(\n { err, did, cid: cid.toString(), pds: url.origin },\n 'blob resolution failed during transmission',\n )\n })\n\n return streams[0]!\n })\n } catch (err) {\n if (res.headersSent || res.destroyed) {\n res.destroy()\n } else {\n res.removeHeader('content-type')\n res.removeHeader('content-length')\n res.removeHeader('cache-control')\n res.removeHeader('x-cache')\n\n if (err instanceof BadPathError) {\n next(createError(400, err))\n } else if (err instanceof VerifyCidError) {\n next(createError(404, 'Blob not found', err))\n } else if (isHttpError(err)) {\n next(err)\n } else {\n next(createError(502, 'Upstream Error', { cause: err }))\n }\n }\n }\n }\n}\n\nfunction isImageMime(\n contentType: string | string[] | undefined,\n): undefined | boolean {\n if (contentType == null || contentType === 'application/octet-stream') {\n return undefined // maybe\n }\n if (Array.isArray(contentType)) {\n if (contentType.length === 0) return undefined // should never happen\n if (contentType.length === 1) return isImageMime(contentType[0])\n return contentType.every(isImageMime) // Should we throw a 502 here?\n }\n return contentType.startsWith('image/')\n}\n\nfunction getMime(format: Options['format']) {\n const mime = formatsToMimes.get(format)\n if (!mime) throw new Error('Unknown format')\n return mime\n}\n\nexport interface BlobCache {\n get(fileId: string): Promise<Readable & { size: number }>\n put(fileId: string, stream: Readable): Promise<void>\n clear(fileId: string): Promise<void>\n clearAll(): Promise<void>\n}\n\nexport class BlobDiskCache implements BlobCache {\n tempDir: string\n constructor(basePath?: string) {\n this.tempDir = basePath || path.join(os.tmpdir(), 'bsky--processed-images')\n if (!path.isAbsolute(this.tempDir)) {\n throw new Error('Must provide an absolute path')\n }\n try {\n fsSync.mkdirSync(this.tempDir, { recursive: true })\n } catch (err) {\n // All good if cache dir already exists\n if (isErrnoException(err) && err.code === 'EEXIST') return\n }\n }\n\n async get(fileId: string) {\n try {\n const handle = await fs.open(path.join(this.tempDir, fileId), 'r')\n const { size } = await handle.stat()\n if (size === 0) {\n throw new BlobNotFoundError()\n }\n return Object.assign(handle.createReadStream(), { size })\n } catch (err) {\n if (isErrnoException(err) && err.code === 'ENOENT') {\n throw new BlobNotFoundError()\n }\n throw err\n }\n }\n\n async put(fileId: string, stream: Readable) {\n const filename = path.join(this.tempDir, fileId)\n try {\n await fs.writeFile(filename, stream, { flag: 'wx' })\n } catch (err) {\n // Do not overwrite existing file, just ignore the error\n if (isErrnoException(err) && err.code === 'EEXIST') return\n throw err\n }\n }\n\n async clear(fileId: string) {\n const filename = path.join(this.tempDir, fileId)\n await fs.rm(filename, { force: true })\n }\n\n async clearAll() {\n await fs.rm(this.tempDir, { recursive: true, force: true })\n }\n}\n"]}
|
package/dist/image/sharp.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { PassThrough, Readable } from 'node:stream';
|
|
1
|
+
import { PassThrough, type Readable } from 'node:stream';
|
|
2
2
|
import sharp from 'sharp';
|
|
3
|
-
import { ImageInfo, Options } from './util.js';
|
|
3
|
+
import { type ImageInfo, type Options } from './util.js';
|
|
4
4
|
export type { Options };
|
|
5
5
|
/**
|
|
6
6
|
* Scale up to hit any specified minimum size
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharp.d.ts","sourceRoot":"","sources":["../../src/image/sharp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"sharp.d.ts","sourceRoot":"","sources":["../../src/image/sharp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAExD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAkB,MAAM,WAAW,CAAA;AAExE,YAAY,EAAE,OAAO,EAAE,CAAA;AAEvB;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,GAAW,EAAE,EAAE,OAAO,6BAY3D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,KAAK,EACL,GAAW,EACX,GAAa,EACb,MAAM,EACN,OAAa,GACd,EAAE,OAAO,eAeT;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAyB3B;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAMlE"}
|
package/dist/image/sharp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharp.js","sourceRoot":"","sources":["../../src/image/sharp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"sharp.js","sourceRoot":"","sources":["../../src/image/sharp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAgC,cAAc,EAAE,MAAM,WAAW,CAAA;AAIxE;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAE,GAAG,GAAG,KAAK,EAAW;IAC1D,6EAA6E;IAC7E,qBAAqB;IACrB,OAAO,OAAO,GAAG,KAAK,SAAS;QAC7B,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC;YACb,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,gBAAgB,EAAE,IAAI;YACtB,kBAAkB,EAAE,KAAK;SAC1B,CAAC;QACJ,CAAC,CAAC,IAAI,WAAW,EAAE,CAAA;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,MAAM,EACN,KAAK,EACL,GAAG,GAAG,KAAK,EACX,GAAG,GAAG,OAAO,EACb,MAAM,EACN,OAAO,GAAG,GAAG,GACL;IACR,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC;QAC/B,GAAG;QACH,KAAK;QACL,MAAM;QACN,kBAAkB,EAAE,GAAG,KAAK,IAAI;KACjC,CAAC,CAAA;IAEF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,KAAK,EAAE,CAAA;QAEzB,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1D,SAAS,CAAC,QAAQ,EAAE;YACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,4BAA4B;SAC1D,CAAC,CAAA;QAEF,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACtE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO;YACL,MAAM;YACN,KAAK;YACL,IAAI;YACJ,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;SAC9C,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,SAAS,CAAC,GAAG,EAAE,gDAAgD,CAAC,EAAE,CAAC;YACrE,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAgB;IAC5C,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;IAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["import { PassThrough, type Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport sharp from 'sharp'\nimport { errHasMsg } from '@atproto/common'\nimport { type ImageInfo, type Options, formatsToMimes } from './util.js'\n\nexport type { Options }\n\n/**\n * Scale up to hit any specified minimum size\n */\nexport function createImageUpscaler({ min = false }: Options) {\n // Due to the way sharp works, up-scaling must happen in a separate processor\n // than down-scaling.\n return typeof min !== 'boolean'\n ? sharp().resize({\n fit: 'outside',\n width: min.width,\n height: min.height,\n withoutReduction: true,\n withoutEnlargement: false,\n })\n : new PassThrough()\n}\n\n/**\n * Scale down (or possibly up if min is true) to desired size, then compress\n * to the desired format.\n */\nexport function createImageProcessor({\n height,\n width,\n min = false,\n fit = 'cover',\n format,\n quality = 100,\n}: Options) {\n const processor = sharp().resize({\n fit,\n width,\n height,\n withoutEnlargement: min !== true,\n })\n\n if (format === 'jpeg') {\n return processor.jpeg({ quality })\n } else if (format === 'webp') {\n return processor.webp({ quality })\n } else {\n throw new Error(`Unhandled case: ${format}`)\n }\n}\n\nexport async function maybeGetInfo(\n stream: Readable,\n): Promise<ImageInfo | null> {\n try {\n const processor = sharp()\n\n const [{ size, height, width, format }] = await Promise.all([\n processor.metadata(),\n pipeline(stream, processor), // Handles error propagation\n ])\n\n if (size == null || height == null || width == null || format == null) {\n return null\n }\n\n return {\n height,\n width,\n size,\n mime: formatsToMimes.get(format) ?? 'unknown',\n }\n } catch (err) {\n if (errHasMsg(err, 'Input buffer contains unsupported image format')) {\n return null\n }\n throw err\n }\n}\n\nexport async function getInfo(stream: Readable): Promise<ImageInfo> {\n const maybeInfo = await maybeGetInfo(stream)\n if (!maybeInfo) {\n throw new Error('could not obtain all image metadata')\n }\n return maybeInfo\n}\n"]}
|
package/dist/image/uri.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { UriString } from '@atproto/lex';
|
|
2
|
-
import { Options } from './util.js';
|
|
1
|
+
import { type UriString } from '@atproto/lex';
|
|
2
|
+
import type { Options } from './util.js';
|
|
3
3
|
export type ImagePreset = 'avatar' | 'banner' | 'feed_thumbnail' | 'feed_fullsize';
|
|
4
4
|
export declare class ImageUriBuilder {
|
|
5
5
|
endpoint: UriString;
|
package/dist/image/uri.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../src/image/uri.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../src/image/uri.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,cAAc,CAAA;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,gBAAgB,GAChB,eAAe,CAAA;AAInB,qBAAa,eAAe;IACnB,QAAQ,EAAE,SAAS,CAAA;IAE1B,YAAY,QAAQ,EAAE,MAAM,EAK3B;IAED,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,CAK5B;IAED,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAajE;IAED,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,GAAG,YAAY,UAE1D;IAED,MAAM,CAAC,UAAU,CACf,IAAI,EAAE,MAAM,GACX,OAAO,GAAG,YAAY,GAAG;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,CAyBlD;CACF;AAED,KAAK,YAAY,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhD,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAI1C,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CA6BhD,CAAA"}
|
package/dist/image/uri.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/image/uri.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/image/uri.ts"],"names":[],"mappings":"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","sourcesContent":["import { type UriString, isUriString } from '@atproto/lex'\nimport type { Options } from './util.js'\n\n// @NOTE if there are any additions here, ensure to include them on ImageUriBuilder.presets\nexport type ImagePreset =\n | 'avatar'\n | 'banner'\n | 'feed_thumbnail'\n | 'feed_fullsize'\n\nconst PATH_REGEX = /^\\/(.+?)\\/plain\\/(.+?)\\/(.+?)(?:@(.+?))?$/\n\nexport class ImageUriBuilder {\n public endpoint: UriString\n\n constructor(endpoint: string) {\n if (!isUriString(endpoint)) {\n throw new Error('ImageUriBuilder endpoint must be a valid UriString')\n }\n this.endpoint = endpoint\n }\n\n static presets: ImagePreset[] = [\n 'avatar',\n 'banner',\n 'feed_thumbnail',\n 'feed_fullsize',\n ]\n\n getPresetUri(id: ImagePreset, did: string, cid: string): UriString {\n const options = presets[id]\n if (!options) {\n throw new Error(`Unrecognized requested common uri type: ${id}`)\n }\n\n const path = ImageUriBuilder.getPath({\n preset: id,\n did,\n cid,\n })\n\n return `${this.endpoint}${path}`\n }\n\n static getPath(opts: { preset: ImagePreset } & BlobLocation) {\n return `/${opts.preset}/plain/${opts.did}/${opts.cid}`\n }\n\n static getOptions(\n path: string,\n ): Options & BlobLocation & { preset: ImagePreset } {\n const match = path.match(PATH_REGEX)\n if (!match) {\n throw new BadPathError('Invalid path')\n }\n const [, presetUnsafe, did, cid, formatUnsafe] = match\n if (!(ImageUriBuilder.presets as string[]).includes(presetUnsafe)) {\n throw new BadPathError('Invalid path: bad preset')\n }\n if (\n formatUnsafe !== undefined &&\n formatUnsafe !== 'jpeg' &&\n formatUnsafe !== 'webp'\n ) {\n throw new BadPathError('Invalid path: bad format')\n }\n const preset = presetUnsafe as ImagePreset\n const format = formatUnsafe as Options['format']\n return {\n ...presets[preset],\n format: format ?? presets[preset].format,\n did,\n cid,\n preset,\n }\n }\n}\n\ntype BlobLocation = { cid: string; did: string }\n\nexport class BadPathError extends Error {}\n\n// @NOTE these prefix settings don't get used anywhere in this package,\n// but they serve as soft documentation of the behavior in production.\nexport const presets: Record<ImagePreset, Options> = {\n avatar: {\n format: 'webp',\n fit: 'cover',\n height: 1000,\n width: 1000,\n min: true,\n },\n banner: {\n format: 'webp',\n fit: 'cover',\n height: 1000,\n width: 3000,\n min: true,\n },\n feed_thumbnail: {\n format: 'webp',\n fit: 'inside',\n height: 2000,\n width: 2000,\n min: true,\n },\n feed_fullsize: {\n format: 'webp',\n fit: 'inside',\n height: 1000,\n width: 1000,\n min: true,\n },\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import http from 'node:http';
|
|
1
|
+
import type http from 'node:http';
|
|
2
2
|
import express from 'express';
|
|
3
|
-
import { Keypair } from '@atproto/crypto';
|
|
4
|
-
import { ServerConfig } from './config.js';
|
|
3
|
+
import type { Keypair } from '@atproto/crypto';
|
|
4
|
+
import type { ServerConfig } from './config.js';
|
|
5
5
|
import { AppContext } from './context.js';
|
|
6
6
|
export { ServerConfig } from './config.js';
|
|
7
7
|
export type { ServerConfigValues } from './config.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAKjC,OAAO,OAAO,MAAM,SAAS,CAAA;AAI7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAc9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAyBzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,qBAAa,WAAW;IACf,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IAC3B,OAAO,CAAC,UAAU,CAAC,CAA+B;IAElD,YAAY,IAAI,EAAE;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;KAAE,EAG9D;IAED,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAClB,MAAM,EAAE,YAAY,CAAA;QACpB,UAAU,EAAE,OAAO,CAAA;KACpB,GAAG,WAAW,CA6Md;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAalC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAU7B;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF;eAEc,WAAW"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import events from 'node:events'\nimport http from 'node:http'\nimport { AddressInfo } from 'node:net'\nimport compression from 'compression'\nimport cors from 'cors'\nimport { Etcd3 } from 'etcd3'\nimport express from 'express'\n// eslint-disable-next-line import/default\nimport httpTerminator from 'http-terminator'\nimport { DAY, SECOND } from '@atproto/common'\nimport { Keypair } from '@atproto/crypto'\nimport { IdResolver } from '@atproto/identity'\nimport { Client } from '@atproto/lex'\nimport { createServer } from '@atproto/xrpc-server'\nimport { createBlobDispatcher } from './api/blob-dispatcher.js'\nimport API, {\n blobResolver,\n external,\n health,\n sitemap,\n wellKnown,\n} from './api/index.js'\nimport { AuthVerifier, createPublicKeyObject } from './auth-verifier.js'\nimport { authWithApiKey as bsyncAuth, createBsyncClient } from './bsync.js'\nimport { ServerConfig } from './config.js'\nimport { AppContext } from './context.js'\nimport {\n authWithApiKey as courierAuth,\n createCourierClient,\n} from './courier.js'\nimport {\n BasicHostList,\n EtcdHostList,\n createDataPlaneClient,\n} from './data-plane/client/index.js'\nimport * as error from './error.js'\nimport { FeatureGatesClient } from './feature-gates/index.js'\nimport { Hydrator } from './hydration/hydrator.js'\nimport * as imageServer from './image/server.js'\nimport { ImageUriBuilder } from './image/uri.js'\nimport { createKwsClient } from './kws.js'\nimport { loggerMiddleware } from './logger.js'\nimport {\n authWithApiKey as rolodexAuth,\n createRolodexClient,\n} from './rolodex.js'\nimport { createStashClient } from './stash.js'\nimport { Views } from './views/index.js'\nimport { VideoUriBuilder } from './views/util.js'\n\nexport { ServerConfig } from './config.js'\nexport type { ServerConfigValues } from './config.js'\nexport { AppContext } from './context.js'\nexport * from './data-plane/index.js'\nexport { BackgroundQueue } from './data-plane/server/background.js'\nexport { Database } from './data-plane/server/db/index.js'\nexport { Redis } from './redis.js'\n\nexport class BskyAppView {\n public ctx: AppContext\n public app: express.Application\n public server?: http.Server\n private terminator?: httpTerminator.HttpTerminator\n\n constructor(opts: { ctx: AppContext; app: express.Application }) {\n this.ctx = opts.ctx\n this.app = opts.app\n }\n\n static create(opts: {\n config: ServerConfig\n signingKey: Keypair\n }): BskyAppView {\n const { config, signingKey } = opts\n const app = express()\n app.set('trust proxy', true)\n app.use(cors({ maxAge: DAY / SECOND }))\n app.use(loggerMiddleware)\n app.use(compression())\n\n // used solely for handle resolution: identity lookups occur on dataplane\n const idResolver = new IdResolver({\n plcUrl: config.didPlcUrl,\n backupNameservers: config.handleResolveNameservers,\n })\n\n const imgUriBuilderUrl =\n config.cdnUrl ||\n (config.publicUrl ? `${config.publicUrl}/img` : undefined)\n if (!imgUriBuilderUrl) {\n throw new Error('No image URI builder URL could be determined')\n }\n const imgUriBuilder = new ImageUriBuilder(imgUriBuilderUrl)\n const videoUriBuilder = new VideoUriBuilder({\n playlistUrlPattern:\n config.videoPlaylistUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/playlist.m3u8`,\n thumbnailUrlPattern:\n config.videoThumbnailUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/thumbnail.jpg`,\n })\n\n const searchClient = config.searchUrl\n ? new Client(\n {\n service: config.searchUrl,\n },\n {\n // Trust internal services to send us well-formed responses\n strictResponseProcessing: false,\n validateResponse: config.debugMode,\n },\n )\n : undefined\n\n const suggestionsClient = config.suggestionsUrl\n ? new Client(\n {\n service: config.suggestionsUrl,\n headers: config.suggestionsApiKey\n ? { authorization: `Bearer ${config.suggestionsApiKey}` }\n : undefined,\n },\n {\n // Trust internal services to send us well-formed responses\n strictResponseProcessing: false,\n validateResponse: config.debugMode,\n },\n )\n : undefined\n\n const topicsClient = config.topicsUrl\n ? new Client(\n {\n service: config.topicsUrl,\n headers: config.topicsApiKey\n ? { authorization: `Bearer ${config.topicsApiKey}` }\n : undefined,\n },\n {\n // Trust internal services to send us well-formed responses\n strictResponseProcessing: false,\n validateResponse: config.debugMode,\n },\n )\n : undefined\n\n const etcd = config.etcdHosts.length\n ? new Etcd3({ hosts: config.etcdHosts })\n : undefined\n\n const dataplaneHostList =\n etcd && config.dataplaneUrlsEtcdKeyPrefix\n ? new EtcdHostList(\n etcd,\n config.dataplaneUrlsEtcdKeyPrefix,\n config.dataplaneUrls,\n )\n : new BasicHostList(config.dataplaneUrls)\n\n const featureGatesClient = new FeatureGatesClient({\n growthBookApiHost: config.growthBookApiHost,\n growthBookClientKey: config.growthBookClientKey,\n eventProxyTrackingEndpoint: config.eventProxyTrackingEndpoint,\n })\n\n const dataplane = createDataPlaneClient(dataplaneHostList, {\n httpVersion: config.dataplaneHttpVersion,\n rejectUnauthorized: !config.dataplaneIgnoreBadTls,\n })\n const hydrator = new Hydrator(dataplane, config.labelsFromIssuerDids, {\n debugFieldAllowedDids: config.debugFieldAllowedDids,\n featureGatesClient,\n })\n const views = new Views({\n imgUriBuilder: imgUriBuilder,\n videoUriBuilder: videoUriBuilder,\n indexedAtEpoch: config.indexedAtEpoch,\n threadTagsBumpDown: [...config.threadTagsBumpDown],\n threadTagsHide: [...config.threadTagsHide],\n visibilityTagHide: config.visibilityTagHide,\n visibilityTagRankPrefix: config.visibilityTagRankPrefix,\n })\n\n const bsyncClient = createBsyncClient({\n baseUrl: config.bsyncUrl,\n httpVersion: config.bsyncHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.bsyncIgnoreBadTls },\n interceptors: config.bsyncApiKey ? [bsyncAuth(config.bsyncApiKey)] : [],\n })\n\n const stashClient = createStashClient(bsyncClient)\n\n const courierClient = config.courierUrl\n ? createCourierClient({\n baseUrl: config.courierUrl,\n httpVersion: config.courierHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.courierIgnoreBadTls },\n interceptors: config.courierApiKey\n ? [courierAuth(config.courierApiKey)]\n : [],\n })\n : undefined\n\n const rolodexClient = config.rolodexUrl\n ? createRolodexClient({\n baseUrl: config.rolodexUrl,\n httpVersion: config.rolodexHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.rolodexIgnoreBadTls },\n interceptors: config.rolodexApiKey\n ? [rolodexAuth(config.rolodexApiKey)]\n : [],\n })\n : undefined\n\n const kwsClient = config.kws ? createKwsClient(config.kws) : undefined\n\n const entrywayJwtPublicKey = config.entrywayJwtPublicKeyHex\n ? createPublicKeyObject(config.entrywayJwtPublicKeyHex)\n : undefined\n const authVerifier = new AuthVerifier(dataplane, {\n ownDid: config.serverDid,\n alternateAudienceDids: config.alternateAudienceDids,\n modServiceDid: config.modServiceDid,\n adminPasses: config.adminPasswords,\n entrywayJwtPublicKey,\n })\n\n const blobDispatcher = createBlobDispatcher(config)\n\n const ctx = new AppContext({\n cfg: config,\n etcd,\n dataplane,\n dataplaneHostList,\n searchClient,\n suggestionsClient,\n topicsClient,\n hydrator,\n views,\n signingKey,\n idResolver,\n bsyncClient,\n stashClient,\n courierClient,\n rolodexClient,\n authVerifier,\n featureGatesClient,\n blobDispatcher,\n kwsClient,\n })\n\n const server = createServer([], {\n validateResponse: config.debugMode,\n payload: {\n jsonLimit: 100 * 1024, // 100kb\n textLimit: 100 * 1024, // 100kb\n blobLimit: 5 * 1024 * 1024, // 5mb\n },\n })\n\n API(server, ctx)\n\n app.use(health.createRouter(ctx))\n app.use(wellKnown.createRouter(ctx))\n app.use(blobResolver.createMiddleware(ctx))\n app.use(imageServer.createMiddleware(ctx, { prefix: '/img/' }))\n\n if (config.dataplaneUrls.length > 0 || config.dataplaneUrlsEtcdKeyPrefix) {\n app.use(sitemap.createRouter(ctx))\n }\n\n app.use(server.router)\n app.use(error.handler)\n app.use('/external', external.createRouter(ctx))\n\n return new BskyAppView({ ctx, app })\n }\n\n async start(): Promise<http.Server> {\n if (this.ctx.dataplaneHostList instanceof EtcdHostList) {\n await this.ctx.dataplaneHostList.connect()\n }\n this.ctx.featureGatesClient.start() // lazy, no await\n const server = this.app.listen(this.ctx.cfg.port)\n this.server = server\n server.keepAliveTimeout = 90000\n this.terminator = httpTerminator.createHttpTerminator({ server })\n await events.once(server, 'listening')\n const { port } = server.address() as AddressInfo\n this.ctx.cfg.assignPort(port)\n return server\n }\n\n async destroy(): Promise<void> {\n try {\n await this.ctx.featureGatesClient.destroy()\n } finally {\n try {\n await this.terminator?.terminate()\n } finally {\n await this.ctx.etcd?.close()\n }\n }\n }\n\n async [Symbol.asyncDispose]() {\n await this.destroy()\n }\n}\n\nexport default BskyAppView\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import events from 'node:events'\nimport type http from 'node:http'\nimport type { AddressInfo } from 'node:net'\nimport compression from 'compression'\nimport cors from 'cors'\nimport { Etcd3 } from 'etcd3'\nimport express from 'express'\n// eslint-disable-next-line import/default\nimport httpTerminator from 'http-terminator'\nimport { DAY, SECOND } from '@atproto/common'\nimport type { Keypair } from '@atproto/crypto'\nimport { IdResolver } from '@atproto/identity'\nimport { Client } from '@atproto/lex'\nimport { createServer } from '@atproto/xrpc-server'\nimport { createBlobDispatcher } from './api/blob-dispatcher.js'\nimport API, {\n blobResolver,\n external,\n health,\n sitemap,\n wellKnown,\n} from './api/index.js'\nimport { AuthVerifier, createPublicKeyObject } from './auth-verifier.js'\nimport { authWithApiKey as bsyncAuth, createBsyncClient } from './bsync.js'\nimport type { ServerConfig } from './config.js'\nimport { AppContext } from './context.js'\nimport {\n authWithApiKey as courierAuth,\n createCourierClient,\n} from './courier.js'\nimport {\n BasicHostList,\n EtcdHostList,\n createDataPlaneClient,\n} from './data-plane/client/index.js'\nimport * as error from './error.js'\nimport { FeatureGatesClient } from './feature-gates/index.js'\nimport { Hydrator } from './hydration/hydrator.js'\nimport * as imageServer from './image/server.js'\nimport { ImageUriBuilder } from './image/uri.js'\nimport { createKwsClient } from './kws.js'\nimport { loggerMiddleware } from './logger.js'\nimport {\n authWithApiKey as rolodexAuth,\n createRolodexClient,\n} from './rolodex.js'\nimport { createStashClient } from './stash.js'\nimport { Views } from './views/index.js'\nimport { VideoUriBuilder } from './views/util.js'\n\nexport { ServerConfig } from './config.js'\nexport type { ServerConfigValues } from './config.js'\nexport { AppContext } from './context.js'\nexport * from './data-plane/index.js'\nexport { BackgroundQueue } from './data-plane/server/background.js'\nexport { Database } from './data-plane/server/db/index.js'\nexport { Redis } from './redis.js'\n\nexport class BskyAppView {\n public ctx: AppContext\n public app: express.Application\n public server?: http.Server\n private terminator?: httpTerminator.HttpTerminator\n\n constructor(opts: { ctx: AppContext; app: express.Application }) {\n this.ctx = opts.ctx\n this.app = opts.app\n }\n\n static create(opts: {\n config: ServerConfig\n signingKey: Keypair\n }): BskyAppView {\n const { config, signingKey } = opts\n const app = express()\n app.set('trust proxy', true)\n app.use(cors({ maxAge: DAY / SECOND }))\n app.use(loggerMiddleware)\n app.use(compression())\n\n // used solely for handle resolution: identity lookups occur on dataplane\n const idResolver = new IdResolver({\n plcUrl: config.didPlcUrl,\n backupNameservers: config.handleResolveNameservers,\n })\n\n const imgUriBuilderUrl =\n config.cdnUrl ||\n (config.publicUrl ? `${config.publicUrl}/img` : undefined)\n if (!imgUriBuilderUrl) {\n throw new Error('No image URI builder URL could be determined')\n }\n const imgUriBuilder = new ImageUriBuilder(imgUriBuilderUrl)\n const videoUriBuilder = new VideoUriBuilder({\n playlistUrlPattern:\n config.videoPlaylistUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/playlist.m3u8`,\n thumbnailUrlPattern:\n config.videoThumbnailUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/thumbnail.jpg`,\n })\n\n const searchClient = config.searchUrl\n ? new Client(\n {\n service: config.searchUrl,\n },\n {\n // Trust internal services to send us well-formed responses\n strictResponseProcessing: false,\n validateResponse: config.debugMode,\n },\n )\n : undefined\n\n const suggestionsClient = config.suggestionsUrl\n ? new Client(\n {\n service: config.suggestionsUrl,\n headers: config.suggestionsApiKey\n ? { authorization: `Bearer ${config.suggestionsApiKey}` }\n : undefined,\n },\n {\n // Trust internal services to send us well-formed responses\n strictResponseProcessing: false,\n validateResponse: config.debugMode,\n },\n )\n : undefined\n\n const topicsClient = config.topicsUrl\n ? new Client(\n {\n service: config.topicsUrl,\n headers: config.topicsApiKey\n ? { authorization: `Bearer ${config.topicsApiKey}` }\n : undefined,\n },\n {\n // Trust internal services to send us well-formed responses\n strictResponseProcessing: false,\n validateResponse: config.debugMode,\n },\n )\n : undefined\n\n const etcd = config.etcdHosts.length\n ? new Etcd3({ hosts: config.etcdHosts })\n : undefined\n\n const dataplaneHostList =\n etcd && config.dataplaneUrlsEtcdKeyPrefix\n ? new EtcdHostList(\n etcd,\n config.dataplaneUrlsEtcdKeyPrefix,\n config.dataplaneUrls,\n )\n : new BasicHostList(config.dataplaneUrls)\n\n const featureGatesClient = new FeatureGatesClient({\n growthBookApiHost: config.growthBookApiHost,\n growthBookClientKey: config.growthBookClientKey,\n eventProxyTrackingEndpoint: config.eventProxyTrackingEndpoint,\n })\n\n const dataplane = createDataPlaneClient(dataplaneHostList, {\n httpVersion: config.dataplaneHttpVersion,\n rejectUnauthorized: !config.dataplaneIgnoreBadTls,\n })\n const hydrator = new Hydrator(dataplane, config.labelsFromIssuerDids, {\n debugFieldAllowedDids: config.debugFieldAllowedDids,\n featureGatesClient,\n })\n const views = new Views({\n imgUriBuilder: imgUriBuilder,\n videoUriBuilder: videoUriBuilder,\n indexedAtEpoch: config.indexedAtEpoch,\n threadTagsBumpDown: [...config.threadTagsBumpDown],\n threadTagsHide: [...config.threadTagsHide],\n visibilityTagHide: config.visibilityTagHide,\n visibilityTagRankPrefix: config.visibilityTagRankPrefix,\n })\n\n const bsyncClient = createBsyncClient({\n baseUrl: config.bsyncUrl,\n httpVersion: config.bsyncHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.bsyncIgnoreBadTls },\n interceptors: config.bsyncApiKey ? [bsyncAuth(config.bsyncApiKey)] : [],\n })\n\n const stashClient = createStashClient(bsyncClient)\n\n const courierClient = config.courierUrl\n ? createCourierClient({\n baseUrl: config.courierUrl,\n httpVersion: config.courierHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.courierIgnoreBadTls },\n interceptors: config.courierApiKey\n ? [courierAuth(config.courierApiKey)]\n : [],\n })\n : undefined\n\n const rolodexClient = config.rolodexUrl\n ? createRolodexClient({\n baseUrl: config.rolodexUrl,\n httpVersion: config.rolodexHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.rolodexIgnoreBadTls },\n interceptors: config.rolodexApiKey\n ? [rolodexAuth(config.rolodexApiKey)]\n : [],\n })\n : undefined\n\n const kwsClient = config.kws ? createKwsClient(config.kws) : undefined\n\n const entrywayJwtPublicKey = config.entrywayJwtPublicKeyHex\n ? createPublicKeyObject(config.entrywayJwtPublicKeyHex)\n : undefined\n const authVerifier = new AuthVerifier(dataplane, {\n ownDid: config.serverDid,\n alternateAudienceDids: config.alternateAudienceDids,\n modServiceDid: config.modServiceDid,\n adminPasses: config.adminPasswords,\n entrywayJwtPublicKey,\n })\n\n const blobDispatcher = createBlobDispatcher(config)\n\n const ctx = new AppContext({\n cfg: config,\n etcd,\n dataplane,\n dataplaneHostList,\n searchClient,\n suggestionsClient,\n topicsClient,\n hydrator,\n views,\n signingKey,\n idResolver,\n bsyncClient,\n stashClient,\n courierClient,\n rolodexClient,\n authVerifier,\n featureGatesClient,\n blobDispatcher,\n kwsClient,\n })\n\n const server = createServer([], {\n validateResponse: config.debugMode,\n payload: {\n jsonLimit: 100 * 1024, // 100kb\n textLimit: 100 * 1024, // 100kb\n blobLimit: 5 * 1024 * 1024, // 5mb\n },\n })\n\n API(server, ctx)\n\n app.use(health.createRouter(ctx))\n app.use(wellKnown.createRouter(ctx))\n app.use(blobResolver.createMiddleware(ctx))\n app.use(imageServer.createMiddleware(ctx, { prefix: '/img/' }))\n\n if (config.dataplaneUrls.length > 0 || config.dataplaneUrlsEtcdKeyPrefix) {\n app.use(sitemap.createRouter(ctx))\n }\n\n app.use(server.router)\n app.use(error.handler)\n app.use('/external', external.createRouter(ctx))\n\n return new BskyAppView({ ctx, app })\n }\n\n async start(): Promise<http.Server> {\n if (this.ctx.dataplaneHostList instanceof EtcdHostList) {\n await this.ctx.dataplaneHostList.connect()\n }\n this.ctx.featureGatesClient.start() // lazy, no await\n const server = this.app.listen(this.ctx.cfg.port)\n this.server = server\n server.keepAliveTimeout = 90000\n this.terminator = httpTerminator.createHttpTerminator({ server })\n await events.once(server, 'listening')\n const { port } = server.address() as AddressInfo\n this.ctx.cfg.assignPort(port)\n return server\n }\n\n async destroy(): Promise<void> {\n try {\n await this.ctx.featureGatesClient.destroy()\n } finally {\n try {\n await this.terminator?.terminate()\n } finally {\n await this.ctx.etcd?.close()\n }\n }\n }\n\n async [Symbol.asyncDispose]() {\n await this.destroy()\n }\n}\n\nexport default BskyAppView\n"]}
|
package/dist/kws.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { KwsExternalPayload } from './api/kws/types.js';
|
|
2
|
-
import { KwsConfig } from './config.js';
|
|
1
|
+
import type { KwsExternalPayload } from './api/kws/types.js';
|
|
2
|
+
import type { KwsConfig } from './config.js';
|
|
3
3
|
export declare const createKwsClient: (cfg: KwsConfig) => KwsClient;
|
|
4
4
|
/**
|
|
5
5
|
* Thrown when the provided external payload exceeds KWS's character limit.
|
package/dist/kws.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kws.d.ts","sourceRoot":"","sources":["../src/kws.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"kws.d.ts","sourceRoot":"","sources":["../src/kws.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAG5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAG5C,eAAO,MAAM,eAAe,QAAS,SAAS,KAAG,SAEhD,CAAA;AAkBD;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;CAAG;AAErD,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAC3B,CAAC,yBAAyB,GAAG;IAC3B,WAAW,EAAE,OAAO,CAAA;CACrB,CAAC,GACF,CAAC,yBAAyB,GAAG;IAC3B,WAAW,EAAE,KAAK,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;AAEN,qBAAa,SAAS;IAMD,GAAG,EAAE,SAAS;IALjC,OAAO,CAAC,WAAW,CAAC,CAAa;IAGjC,OAAO,CAAC,WAAW,CAAC,CAAiB;IAErC,YAAmB,GAAG,EAAE,SAAS,EAAI;IAErC;;;;OAIG;YACW,IAAI;YAaJ,UAAU;YAgDV,aAAa;IA2B3B;;OAEG;IACG,SAAS,CAAC,EACd,WAAW,EACX,KAAK,EACL,eAAe,EACf,QAAQ,GACT,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,KAAK,EAAE,MAAM,CAAA;QACb,eAAe,EAAE,kBAAkB,CAAA;QACnC,QAAQ,EAAE,MAAM,CAAA;KACjB,oBAkCA;IAED;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,mBAAmB,oBA4BrC;IAED;;;OAGG;IACG,0BAA0B,CAAC,KAAK,EAAE,yBAAyB,oBAKhE;IAED;;;OAGG;IACG,wBAAwB,CAAC,KAAK,EAAE,yBAAyB,oBAM9D;CACF"}
|
package/dist/kws.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kws.js","sourceRoot":"","sources":["../src/kws.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { KwsExternalPayload } from './api/kws/types.js'\nimport { serializeExternalPayload } from './api/kws/util.js'\nimport { buildBasicAuth } from './auth-verifier.js'\nimport { KwsConfig } from './config.js'\nimport { httpLogger as log } from './logger.js'\n\nexport const createKwsClient = (cfg: KwsConfig): KwsClient => {\n return new KwsClient(cfg)\n}\n\n// Not `.strict()` to avoid breaking if KWS adds fields.\nconst authResponseSchema = z.object({\n access_token: z.string(),\n // Seconds the token remains valid. KWS notes this varies with usage, and\n // it's optional here: if absent we can't anticipate expiry, so we skip\n // caching and lean on the reactive re-auth-on-401 path instead.\n expires_in: z.number().optional(),\n})\n\n// Re-authenticate once the token has burned through this fraction of its\n// advertised lifetime, so we never send a token that's on the edge of expiry.\nconst TOKEN_LIFETIME_REFRESH_RATIO = 0.9\n\ntype CachedToken = { accessToken: string; expiresAt: number }\n\nconst EXTERNAL_PAYLOAD_CHAR_LIMIT = 200\n/**\n * Thrown when the provided external payload exceeds KWS's character limit.\n * This is most commonly caused by DIDs that are too long, such as for\n * `did:web` DIDs. But it's very rare, and the client has special handling for\n * this case.\n */\nexport class KwsExternalPayloadError extends Error {}\n\nexport type KWSSendEmailRequestCommon = {\n email: string\n location: string\n language: string\n externalPayload: string\n}\n\nexport type KWSSendEmailRequest =\n | (KWSSendEmailRequestCommon & {\n userContext: 'adult'\n })\n | (KWSSendEmailRequestCommon & {\n userContext: 'age'\n minimumAge: number\n })\n\nexport class KwsClient {\n private cachedToken?: CachedToken\n // In-flight auth request, so concurrent callers share a single token fetch\n // rather than each hitting the token endpoint (which the WAF rate-limits).\n private pendingAuth?: Promise<string>\n\n constructor(public cfg: KwsConfig) {}\n\n /**\n * Returns a valid access token, reusing the cached one until it nears\n * expiry. Pass `force` to bypass the cache and mint a fresh token, e.g.\n * after a 401 from the API indicates the current token was rejected.\n */\n private async auth(force = false): Promise<string> {\n if (!force && this.cachedToken && Date.now() < this.cachedToken.expiresAt) {\n return this.cachedToken.accessToken\n }\n // Coalesce concurrent (re-)auth attempts onto one request.\n if (!this.pendingAuth) {\n this.pendingAuth = this.fetchToken().finally(() => {\n this.pendingAuth = undefined\n })\n }\n return this.pendingAuth\n }\n\n private async fetchToken(): Promise<string> {\n try {\n const res = await fetch(\n `${this.cfg.authOrigin}/auth/realms/kws/protocol/openid-connect/token`,\n {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: buildBasicAuth(this.cfg.clientId, this.cfg.apiKey),\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n scope: 'verification',\n }),\n },\n )\n if (!res.ok) {\n const errorText = await res.text()\n throw new Error(\n `Failed to fetch age assurance access token: status: ${res.status}, statusText: ${res.statusText}, errorText: ${errorText}`,\n )\n }\n\n const auth = await res.json()\n const authResponse = authResponseSchema.parse(auth)\n if (authResponse.expires_in == null) {\n // Without a lifetime we can't proactively refresh, but we still cache\n // the token and reuse it until a 401 triggers the re-auth-on-401 path.\n log.error('KWS auth response missing expires_in; caching without a TTL')\n }\n this.cachedToken = {\n accessToken: authResponse.access_token,\n expiresAt:\n authResponse.expires_in == null\n ? Infinity\n : Date.now() +\n authResponse.expires_in * 1000 * TOKEN_LIFETIME_REFRESH_RATIO,\n }\n return authResponse.access_token\n } catch (err) {\n // Drop any stale cache so the next call retries the token fetch.\n this.cachedToken = undefined\n log.error({ err }, 'Failed to authenticate with KWS')\n throw err\n }\n }\n\n private async fetchWithAuth(\n url: string,\n init: RequestInit,\n ): Promise<Response> {\n const res = await fetch(url, {\n ...init,\n headers: {\n ...(init.headers ?? {}),\n Authorization: `Bearer ${await this.auth()}`,\n },\n })\n\n // A 401 means the token expired (KWS token TTL is variable). Re-auth once\n // with a fresh token and retry, per the KWS integration docs.\n if (res.status === 401) {\n return fetch(url, {\n ...init,\n headers: {\n ...(init.headers ?? {}),\n Authorization: `Bearer ${await this.auth(true)}`,\n },\n })\n }\n\n return res\n }\n\n /**\n * @deprecated Use `sendAdultVerifiedFlowEmail` or `sendAgeVerifiedFlowEmail` instead.\n */\n async sendEmail({\n countryCode,\n email,\n externalPayload,\n language,\n }: {\n countryCode: string\n email: string\n externalPayload: KwsExternalPayload\n language: string\n }) {\n const serializedExternalPayload = serializeExternalPayload(externalPayload)\n if (serializedExternalPayload.length > EXTERNAL_PAYLOAD_CHAR_LIMIT) {\n throw new KwsExternalPayloadError()\n }\n\n const res = await this.fetchWithAuth(\n `${this.cfg.apiOrigin}/v1/verifications/send-email`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': this.cfg.userAgent,\n },\n body: JSON.stringify({\n email,\n externalPayload: serializedExternalPayload,\n language,\n location: countryCode,\n userContext: 'adult',\n }),\n },\n )\n\n if (!res.ok) {\n const errorText = await res.text()\n log.error(\n { status: res.status, statusText: res.statusText, errorText },\n 'Failed to send age assurance email',\n )\n throw new Error('Failed to send age assurance email')\n }\n\n return res.json()\n }\n\n /**\n * Sends a KWS verification email with the given properties.\n */\n async email(props: KWSSendEmailRequest) {\n const res = await this.fetchWithAuth(\n `${this.cfg.apiOrigin}/v1/verifications/send-email`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': this.cfg.userAgent,\n },\n body: JSON.stringify(props),\n },\n )\n\n if (!res.ok) {\n const errorText = await res.text()\n log.error(\n {\n status: res.status,\n statusText: res.statusText,\n errorText,\n flow: props.userContext,\n },\n 'Failed to send KWS email',\n )\n throw new Error('Failed to send KWS email')\n }\n\n return res.json()\n }\n\n /**\n * Sends an email to the user initiating an `adult` verification flow, which\n * results in `adult-verified` events/webhooks.\n */\n async sendAdultVerifiedFlowEmail(props: KWSSendEmailRequestCommon) {\n return this.email({\n ...props,\n userContext: 'adult',\n })\n }\n\n /**\n * Sends an email to the user initiating an `age` verification flow, which\n * results in `age-verified` events/webhooks.\n */\n async sendAgeVerifiedFlowEmail(props: KWSSendEmailRequestCommon) {\n return this.email({\n ...props,\n userContext: 'age',\n minimumAge: 16, // KWS required value\n })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kws.js","sourceRoot":"","sources":["../src/kws.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport type { KwsExternalPayload } from './api/kws/types.js'\nimport { serializeExternalPayload } from './api/kws/util.js'\nimport { buildBasicAuth } from './auth-verifier.js'\nimport type { KwsConfig } from './config.js'\nimport { httpLogger as log } from './logger.js'\n\nexport const createKwsClient = (cfg: KwsConfig): KwsClient => {\n return new KwsClient(cfg)\n}\n\n// Not `.strict()` to avoid breaking if KWS adds fields.\nconst authResponseSchema = z.object({\n access_token: z.string(),\n // Seconds the token remains valid. KWS notes this varies with usage, and\n // it's optional here: if absent we can't anticipate expiry, so we skip\n // caching and lean on the reactive re-auth-on-401 path instead.\n expires_in: z.number().optional(),\n})\n\n// Re-authenticate once the token has burned through this fraction of its\n// advertised lifetime, so we never send a token that's on the edge of expiry.\nconst TOKEN_LIFETIME_REFRESH_RATIO = 0.9\n\ntype CachedToken = { accessToken: string; expiresAt: number }\n\nconst EXTERNAL_PAYLOAD_CHAR_LIMIT = 200\n/**\n * Thrown when the provided external payload exceeds KWS's character limit.\n * This is most commonly caused by DIDs that are too long, such as for\n * `did:web` DIDs. But it's very rare, and the client has special handling for\n * this case.\n */\nexport class KwsExternalPayloadError extends Error {}\n\nexport type KWSSendEmailRequestCommon = {\n email: string\n location: string\n language: string\n externalPayload: string\n}\n\nexport type KWSSendEmailRequest =\n | (KWSSendEmailRequestCommon & {\n userContext: 'adult'\n })\n | (KWSSendEmailRequestCommon & {\n userContext: 'age'\n minimumAge: number\n })\n\nexport class KwsClient {\n private cachedToken?: CachedToken\n // In-flight auth request, so concurrent callers share a single token fetch\n // rather than each hitting the token endpoint (which the WAF rate-limits).\n private pendingAuth?: Promise<string>\n\n constructor(public cfg: KwsConfig) {}\n\n /**\n * Returns a valid access token, reusing the cached one until it nears\n * expiry. Pass `force` to bypass the cache and mint a fresh token, e.g.\n * after a 401 from the API indicates the current token was rejected.\n */\n private async auth(force = false): Promise<string> {\n if (!force && this.cachedToken && Date.now() < this.cachedToken.expiresAt) {\n return this.cachedToken.accessToken\n }\n // Coalesce concurrent (re-)auth attempts onto one request.\n if (!this.pendingAuth) {\n this.pendingAuth = this.fetchToken().finally(() => {\n this.pendingAuth = undefined\n })\n }\n return this.pendingAuth\n }\n\n private async fetchToken(): Promise<string> {\n try {\n const res = await fetch(\n `${this.cfg.authOrigin}/auth/realms/kws/protocol/openid-connect/token`,\n {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: buildBasicAuth(this.cfg.clientId, this.cfg.apiKey),\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n scope: 'verification',\n }),\n },\n )\n if (!res.ok) {\n const errorText = await res.text()\n throw new Error(\n `Failed to fetch age assurance access token: status: ${res.status}, statusText: ${res.statusText}, errorText: ${errorText}`,\n )\n }\n\n const auth = await res.json()\n const authResponse = authResponseSchema.parse(auth)\n if (authResponse.expires_in == null) {\n // Without a lifetime we can't proactively refresh, but we still cache\n // the token and reuse it until a 401 triggers the re-auth-on-401 path.\n log.error('KWS auth response missing expires_in; caching without a TTL')\n }\n this.cachedToken = {\n accessToken: authResponse.access_token,\n expiresAt:\n authResponse.expires_in == null\n ? Infinity\n : Date.now() +\n authResponse.expires_in * 1000 * TOKEN_LIFETIME_REFRESH_RATIO,\n }\n return authResponse.access_token\n } catch (err) {\n // Drop any stale cache so the next call retries the token fetch.\n this.cachedToken = undefined\n log.error({ err }, 'Failed to authenticate with KWS')\n throw err\n }\n }\n\n private async fetchWithAuth(\n url: string,\n init: RequestInit,\n ): Promise<Response> {\n const res = await fetch(url, {\n ...init,\n headers: {\n ...(init.headers ?? {}),\n Authorization: `Bearer ${await this.auth()}`,\n },\n })\n\n // A 401 means the token expired (KWS token TTL is variable). Re-auth once\n // with a fresh token and retry, per the KWS integration docs.\n if (res.status === 401) {\n return fetch(url, {\n ...init,\n headers: {\n ...(init.headers ?? {}),\n Authorization: `Bearer ${await this.auth(true)}`,\n },\n })\n }\n\n return res\n }\n\n /**\n * @deprecated Use `sendAdultVerifiedFlowEmail` or `sendAgeVerifiedFlowEmail` instead.\n */\n async sendEmail({\n countryCode,\n email,\n externalPayload,\n language,\n }: {\n countryCode: string\n email: string\n externalPayload: KwsExternalPayload\n language: string\n }) {\n const serializedExternalPayload = serializeExternalPayload(externalPayload)\n if (serializedExternalPayload.length > EXTERNAL_PAYLOAD_CHAR_LIMIT) {\n throw new KwsExternalPayloadError()\n }\n\n const res = await this.fetchWithAuth(\n `${this.cfg.apiOrigin}/v1/verifications/send-email`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': this.cfg.userAgent,\n },\n body: JSON.stringify({\n email,\n externalPayload: serializedExternalPayload,\n language,\n location: countryCode,\n userContext: 'adult',\n }),\n },\n )\n\n if (!res.ok) {\n const errorText = await res.text()\n log.error(\n { status: res.status, statusText: res.statusText, errorText },\n 'Failed to send age assurance email',\n )\n throw new Error('Failed to send age assurance email')\n }\n\n return res.json()\n }\n\n /**\n * Sends a KWS verification email with the given properties.\n */\n async email(props: KWSSendEmailRequest) {\n const res = await this.fetchWithAuth(\n `${this.cfg.apiOrigin}/v1/verifications/send-email`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': this.cfg.userAgent,\n },\n body: JSON.stringify(props),\n },\n )\n\n if (!res.ok) {\n const errorText = await res.text()\n log.error(\n {\n status: res.status,\n statusText: res.statusText,\n errorText,\n flow: props.userContext,\n },\n 'Failed to send KWS email',\n )\n throw new Error('Failed to send KWS email')\n }\n\n return res.json()\n }\n\n /**\n * Sends an email to the user initiating an `adult` verification flow, which\n * results in `adult-verified` events/webhooks.\n */\n async sendAdultVerifiedFlowEmail(props: KWSSendEmailRequestCommon) {\n return this.email({\n ...props,\n userContext: 'adult',\n })\n }\n\n /**\n * Sends an email to the user initiating an `age` verification flow, which\n * results in `age-verified` events/webhooks.\n */\n async sendAgeVerifiedFlowEmail(props: KWSSendEmailRequestCommon) {\n return this.email({\n ...props,\n userContext: 'age',\n minimumAge: 16, // KWS required value\n })\n }\n}\n"]}
|