@atproto/ozone 0.1.146 → 0.1.148
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 +18 -0
- package/dist/api/chat/getActorMetadata.js.map +1 -1
- package/dist/api/chat/getMessageContext.js.map +1 -1
- package/dist/api/chat/index.js.map +1 -1
- package/dist/api/communication/createTemplate.js.map +1 -1
- package/dist/api/communication/deleteTemplate.js.map +1 -1
- package/dist/api/communication/listTemplates.js.map +1 -1
- package/dist/api/communication/updateTemplate.js.map +1 -1
- package/dist/api/health.js.map +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +6 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/label/fetchLabels.js.map +1 -1
- package/dist/api/label/queryLabels.js.map +1 -1
- package/dist/api/label/subscribeLabels.js.map +1 -1
- package/dist/api/moderation/cancelScheduledActions.d.ts +4 -0
- package/dist/api/moderation/cancelScheduledActions.d.ts.map +1 -0
- package/dist/api/moderation/cancelScheduledActions.js +62 -0
- package/dist/api/moderation/cancelScheduledActions.js.map +1 -0
- package/dist/api/moderation/emitEvent.d.ts.map +1 -1
- package/dist/api/moderation/emitEvent.js +11 -47
- package/dist/api/moderation/emitEvent.js.map +1 -1
- package/dist/api/moderation/getAccountTimeline.js.map +1 -1
- package/dist/api/moderation/getEvent.js.map +1 -1
- package/dist/api/moderation/getRecord.js.map +1 -1
- package/dist/api/moderation/getRecords.js.map +1 -1
- package/dist/api/moderation/getRepo.js.map +1 -1
- package/dist/api/moderation/getReporterStats.js.map +1 -1
- package/dist/api/moderation/getRepos.js.map +1 -1
- package/dist/api/moderation/getSubjects.js.map +1 -1
- package/dist/api/moderation/listScheduledActions.d.ts +4 -0
- package/dist/api/moderation/listScheduledActions.d.ts.map +1 -0
- package/dist/api/moderation/listScheduledActions.js +31 -0
- package/dist/api/moderation/listScheduledActions.js.map +1 -0
- package/dist/api/moderation/queryEvents.js.map +1 -1
- package/dist/api/moderation/queryStatuses.js.map +1 -1
- package/dist/api/moderation/scheduleAction.d.ts +4 -0
- package/dist/api/moderation/scheduleAction.d.ts.map +1 -0
- package/dist/api/moderation/scheduleAction.js +115 -0
- package/dist/api/moderation/scheduleAction.js.map +1 -0
- package/dist/api/moderation/searchRepos.js.map +1 -1
- package/dist/api/moderation/util.d.ts +13 -0
- package/dist/api/moderation/util.d.ts.map +1 -0
- package/dist/api/moderation/util.js +52 -0
- package/dist/api/moderation/util.js.map +1 -0
- package/dist/api/proxied.js.map +1 -1
- package/dist/api/report/createReport.js.map +1 -1
- package/dist/api/safelink/addRule.js.map +1 -1
- package/dist/api/safelink/queryEvents.js.map +1 -1
- package/dist/api/safelink/queryRules.js.map +1 -1
- package/dist/api/safelink/removeRule.js.map +1 -1
- package/dist/api/safelink/updateRule.js.map +1 -1
- package/dist/api/server/getConfig.js.map +1 -1
- package/dist/api/set/addValues.js.map +1 -1
- package/dist/api/set/deleteSet.js.map +1 -1
- package/dist/api/set/deleteValues.js.map +1 -1
- package/dist/api/set/getValues.js.map +1 -1
- package/dist/api/set/querySets.js.map +1 -1
- package/dist/api/set/upsertSet.js.map +1 -1
- package/dist/api/setting/listOptions.js.map +1 -1
- package/dist/api/setting/removeOptions.js.map +1 -1
- package/dist/api/setting/upsertOption.js.map +1 -1
- package/dist/api/team/addMember.js.map +1 -1
- package/dist/api/team/deleteMember.js.map +1 -1
- package/dist/api/team/listMembers.js.map +1 -1
- package/dist/api/team/updateMember.js.map +1 -1
- package/dist/api/util.d.ts +4 -0
- package/dist/api/util.d.ts.map +1 -1
- package/dist/api/util.js +24 -1
- package/dist/api/util.js.map +1 -1
- package/dist/api/verification/grantVerifications.js.map +1 -1
- package/dist/api/verification/listVerifications.js.map +1 -1
- package/dist/api/verification/revokeVerifications.js.map +1 -1
- package/dist/api/well-known.js.map +1 -1
- package/dist/auth-verifier.js.map +1 -1
- package/dist/background.js.map +1 -1
- package/dist/communication-service/template.js.map +1 -1
- package/dist/communication-service/util.js.map +1 -1
- package/dist/config/config.js.map +1 -1
- package/dist/config/env.js.map +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/secrets.js.map +1 -1
- package/dist/context.d.ts +3 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +12 -6
- package/dist/context.js.map +1 -1
- package/dist/daemon/blob-diverter.js.map +1 -1
- package/dist/daemon/context.d.ts +3 -0
- package/dist/daemon/context.d.ts.map +1 -1
- package/dist/daemon/context.js +12 -0
- package/dist/daemon/context.js.map +1 -1
- package/dist/daemon/event-pusher.js.map +1 -1
- package/dist/daemon/event-reverser.js.map +1 -1
- package/dist/daemon/index.d.ts +1 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +3 -1
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/materialized-view-refresher.js.map +1 -1
- package/dist/daemon/scheduled-action-processor.d.ts +35 -0
- package/dist/daemon/scheduled-action-processor.d.ts.map +1 -0
- package/dist/daemon/scheduled-action-processor.js +211 -0
- package/dist/daemon/scheduled-action-processor.js.map +1 -0
- package/dist/daemon/team-profile-synchronizer.js.map +1 -1
- package/dist/daemon/verification-listener.js.map +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations/20231219T205730722Z-init.js.map +1 -1
- package/dist/db/migrations/20240116T085607200Z-communication-template.js.map +1 -1
- package/dist/db/migrations/20240201T051104136Z-mod-event-blobs.js.map +1 -1
- package/dist/db/migrations/20240208T213404429Z-add-tags-column-to-moderation-subject.js.map +1 -1
- package/dist/db/migrations/20240228T003647759Z-add-label-sigs.js.map +1 -1
- package/dist/db/migrations/20240408T192432676Z-mute-reporting.js.map +1 -1
- package/dist/db/migrations/20240506T225055595Z-message-subject.js.map +1 -1
- package/dist/db/migrations/20240521T211332580Z-member.js.map +1 -1
- package/dist/db/migrations/20240814T003647759Z-event-created-at-index.js.map +1 -1
- package/dist/db/migrations/20240903T205730722Z-add-template-lang.js.map +1 -1
- package/dist/db/migrations/20240904T205730722Z-add-subject-did-index.js.map +1 -1
- package/dist/db/migrations/20241001T205730722Z-subject-status-review-state-index.js.map +1 -1
- package/dist/db/migrations/20241008T205730722Z-sets.js.map +1 -1
- package/dist/db/migrations/20241018T205730722Z-setting.js.map +1 -1
- package/dist/db/migrations/20241026T205730722Z-add-hosting-status-to-subject-status.js.map +1 -1
- package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.js.map +1 -1
- package/dist/db/migrations/20250204T003647759Z-add-subject-priority-score.js.map +1 -1
- package/dist/db/migrations/20250211T003647759Z-add-reporter-stats-index.js.map +1 -1
- package/dist/db/migrations/20250211T132135150Z-moderation-event-message-partial-idx.js.map +1 -1
- package/dist/db/migrations/20250221T132135150Z-member-details.js.map +1 -1
- package/dist/db/migrations/20250404T201720309Z-subject-status-sort-idxs.js.map +1 -1
- package/dist/db/migrations/20250415T201720309Z-verification.js.map +1 -1
- package/dist/db/migrations/20250417T201720309Z-firehose-cursor.js.map +1 -1
- package/dist/db/migrations/20250609T110704000Z-safelink.js.map +1 -1
- package/dist/db/migrations/20250618T180246000Z-add-mod-tool-to-moderation-event.js.map +1 -1
- package/dist/db/migrations/20250701T000000000Z-add-age-assurance-state.js.map +1 -1
- package/dist/db/migrations/20250715T000000000Z-add-mod-event-external-id.js.map +1 -1
- package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.js.map +1 -1
- package/dist/db/migrations/20250813T000000000Z-mod-tool-batch-id-index.js.map +1 -1
- package/dist/db/migrations/20250923T000000000Z-scheduled-actions.d.ts +4 -0
- package/dist/db/migrations/20250923T000000000Z-scheduled-actions.d.ts.map +1 -0
- package/dist/db/migrations/20250923T000000000Z-scheduled-actions.js +53 -0
- package/dist/db/migrations/20250923T000000000Z-scheduled-actions.js.map +1 -0
- package/dist/db/migrations/index.d.ts +2 -0
- package/dist/db/migrations/index.d.ts.map +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/migrations/provider.js.map +1 -1
- package/dist/db/pagination.js.map +1 -1
- package/dist/db/schema/account_events_stats.js.map +1 -1
- package/dist/db/schema/account_record_events_stats.js.map +1 -1
- package/dist/db/schema/account_record_status_stats.js.map +1 -1
- package/dist/db/schema/blob_push_event.js.map +1 -1
- package/dist/db/schema/communication_template.js.map +1 -1
- package/dist/db/schema/firehose_cursor.js.map +1 -1
- package/dist/db/schema/index.d.ts +2 -1
- package/dist/db/schema/index.d.ts.map +1 -1
- package/dist/db/schema/index.js.map +1 -1
- package/dist/db/schema/label.js.map +1 -1
- package/dist/db/schema/member.js.map +1 -1
- package/dist/db/schema/moderation_event.js.map +1 -1
- package/dist/db/schema/moderation_subject_status.js.map +1 -1
- package/dist/db/schema/ozone_set.js.map +1 -1
- package/dist/db/schema/record_events_stats.js.map +1 -1
- package/dist/db/schema/record_push_event.js.map +1 -1
- package/dist/db/schema/repo_push_event.js.map +1 -1
- package/dist/db/schema/safelink.js.map +1 -1
- package/dist/db/schema/scheduled-action.d.ts +23 -0
- package/dist/db/schema/scheduled-action.d.ts.map +1 -0
- package/dist/db/schema/scheduled-action.js +5 -0
- package/dist/db/schema/scheduled-action.js.map +1 -0
- package/dist/db/schema/setting.js.map +1 -1
- package/dist/db/schema/signing_key.js.map +1 -1
- package/dist/db/schema/verification.js.map +1 -1
- package/dist/db/types.js.map +1 -1
- package/dist/error.js.map +1 -1
- package/dist/image-invalidator.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/jetstream/service.js.map +1 -1
- package/dist/lexicon/index.d.ts +15 -14
- package/dist/lexicon/index.d.ts.map +1 -1
- package/dist/lexicon/index.js +21 -14
- package/dist/lexicon/index.js.map +1 -1
- package/dist/lexicon/lexicons.d.ts +877 -125
- package/dist/lexicon/lexicons.d.ts.map +1 -1
- package/dist/lexicon/lexicons.js +444 -67
- package/dist/lexicon/lexicons.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/getPreferences.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/getProfile.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/getProfiles.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/getSuggestions.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/profile.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/putPreferences.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/searchActors.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/searchActorsTypeahead.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/status.js.map +1 -1
- package/dist/lexicon/types/app/bsky/bookmark/createBookmark.js.map +1 -1
- package/dist/lexicon/types/app/bsky/bookmark/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/bookmark/deleteBookmark.js.map +1 -1
- package/dist/lexicon/types/app/bsky/bookmark/getBookmarks.js.map +1 -1
- package/dist/lexicon/types/app/bsky/embed/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/embed/external.js.map +1 -1
- package/dist/lexicon/types/app/bsky/embed/images.js.map +1 -1
- package/dist/lexicon/types/app/bsky/embed/record.js.map +1 -1
- package/dist/lexicon/types/app/bsky/embed/recordWithMedia.js.map +1 -1
- package/dist/lexicon/types/app/bsky/embed/video.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/describeFeedGenerator.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/generator.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getActorFeeds.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getActorLikes.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getAuthorFeed.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getFeed.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getFeedGenerator.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getFeedGenerators.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getFeedSkeleton.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getLikes.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getListFeed.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getPostThread.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getPosts.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getQuotes.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getRepostedBy.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getSuggestedFeeds.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/getTimeline.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/like.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/post.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/postgate.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/repost.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/searchPosts.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/sendInteractions.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/threadgate.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/block.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/follow.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getBlocks.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getFollowers.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getFollows.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getKnownFollowers.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getList.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getListBlocks.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getListMutes.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getLists.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getListsWithMembership.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getMutes.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getRelationships.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getStarterPack.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getStarterPacks.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getStarterPacksWithMembership.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/list.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/listblock.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/listitem.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/muteActor.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/muteActorList.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/muteThread.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/searchStarterPacks.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/starterpack.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/unmuteActor.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/unmuteActorList.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/unmuteThread.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/verification.js.map +1 -1
- package/dist/lexicon/types/app/bsky/labeler/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/labeler/getServices.js.map +1 -1
- package/dist/lexicon/types/app/bsky/labeler/service.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/declaration.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/getPreferences.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/getUnreadCount.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/listActivitySubscriptions.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/listNotifications.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/putActivitySubscription.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/putPreferences.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/putPreferencesV2.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/registerPush.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/unregisterPush.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/updateSeen.js.map +1 -1
- package/dist/lexicon/types/app/bsky/richtext/facet.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getAgeAssuranceState.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getConfig.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getPostThreadOtherV2.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getPostThreadV2.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedFeeds.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getTrendingTopics.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getTrends.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/initAgeAssurance.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.js.map +1 -1
- package/dist/lexicon/types/app/bsky/video/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/video/getJobStatus.js.map +1 -1
- package/dist/lexicon/types/app/bsky/video/getUploadLimits.js.map +1 -1
- package/dist/lexicon/types/app/bsky/video/uploadVideo.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/actor/declaration.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/actor/defs.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/actor/deleteAccount.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/actor/exportAccountData.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/acceptConvo.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/addReaction.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getConvo.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getConvoAvailability.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getLog.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getMessages.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/leaveConvo.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/listConvos.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/muteConvo.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/removeReaction.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/sendMessage.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/updateAllRead.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/updateRead.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/defs.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/deleteAccount.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/disableAccountInvites.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/disableInviteCodes.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/enableAccountInvites.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/getAccountInfo.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/getAccountInfos.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/getInviteCodes.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/getSubjectStatus.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/searchAccounts.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/sendEmail.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/updateAccountEmail.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/updateAccountHandle.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/updateAccountPassword.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/updateAccountSigningKey.js.map +1 -1
- package/dist/lexicon/types/com/atproto/admin/updateSubjectStatus.js.map +1 -1
- package/dist/lexicon/types/com/atproto/identity/defs.js.map +1 -1
- package/dist/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.js.map +1 -1
- package/dist/lexicon/types/com/atproto/identity/refreshIdentity.js.map +1 -1
- package/dist/lexicon/types/com/atproto/identity/requestPlcOperationSignature.js.map +1 -1
- package/dist/lexicon/types/com/atproto/identity/resolveDid.js.map +1 -1
- package/dist/lexicon/types/com/atproto/identity/resolveHandle.js.map +1 -1
- package/dist/lexicon/types/com/atproto/identity/resolveIdentity.js.map +1 -1
- package/dist/lexicon/types/com/atproto/identity/signPlcOperation.js.map +1 -1
- package/dist/lexicon/types/com/atproto/identity/submitPlcOperation.js.map +1 -1
- package/dist/lexicon/types/com/atproto/identity/updateHandle.js.map +1 -1
- package/dist/lexicon/types/com/atproto/label/defs.js.map +1 -1
- package/dist/lexicon/types/com/atproto/label/queryLabels.js.map +1 -1
- package/dist/lexicon/types/com/atproto/label/subscribeLabels.js.map +1 -1
- package/dist/lexicon/types/com/atproto/lexicon/schema.js.map +1 -1
- package/dist/lexicon/types/com/atproto/moderation/createReport.js.map +1 -1
- package/dist/lexicon/types/com/atproto/moderation/defs.d.ts +2 -2
- package/dist/lexicon/types/com/atproto/moderation/defs.d.ts.map +1 -1
- package/dist/lexicon/types/com/atproto/moderation/defs.js +1 -1
- package/dist/lexicon/types/com/atproto/moderation/defs.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/applyWrites.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/createRecord.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/defs.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/deleteRecord.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/describeRepo.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/getRecord.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/importRepo.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/listMissingBlobs.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/listRecords.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/putRecord.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/strongRef.js.map +1 -1
- package/dist/lexicon/types/com/atproto/repo/uploadBlob.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/activateAccount.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/checkAccountStatus.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/confirmEmail.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/createAccount.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/createAppPassword.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/createInviteCode.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/createInviteCodes.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/createSession.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/deactivateAccount.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/defs.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/deleteAccount.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/deleteSession.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/describeServer.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/getAccountInviteCodes.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/getServiceAuth.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/getSession.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/listAppPasswords.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/refreshSession.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/requestAccountDelete.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/requestEmailConfirmation.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/requestEmailUpdate.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/requestPasswordReset.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/reserveSigningKey.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/resetPassword.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/revokeAppPassword.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/updateEmail.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/defs.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/getBlob.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/getBlocks.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/getCheckout.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/getHead.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/getHostStatus.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/getLatestCommit.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/getRecord.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/getRepo.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/getRepoStatus.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/listBlobs.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/listHosts.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/listRepos.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/listReposByCollection.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/notifyOfUpdate.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/requestCrawl.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/subscribeRepos.js.map +1 -1
- package/dist/lexicon/types/com/atproto/temp/addReservedHandle.js.map +1 -1
- package/dist/lexicon/types/com/atproto/temp/checkHandleAvailability.js.map +1 -1
- package/dist/lexicon/types/com/atproto/temp/checkSignupQueue.js.map +1 -1
- package/dist/lexicon/types/com/atproto/temp/dereferenceScope.js.map +1 -1
- package/dist/lexicon/types/com/atproto/temp/fetchLabels.js.map +1 -1
- package/dist/lexicon/types/com/atproto/temp/requestPhoneVerification.js.map +1 -1
- package/dist/lexicon/types/com/atproto/temp/revokeAccountCredentials.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/communication/createTemplate.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/communication/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/communication/deleteTemplate.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/communication/listTemplates.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/communication/updateTemplate.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.d.ts +46 -0
- package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.js +25 -0
- package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +57 -2
- package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/defs.js +27 -0
- package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/emitEvent.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.d.ts +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.d.ts.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/getEvent.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/getRecord.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/getRecords.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/getRepo.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/getReporterStats.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/getRepos.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/getSubjects.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.d.ts +38 -0
- package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.js +7 -0
- package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/moderation/queryEvents.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.d.ts +75 -0
- package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.js +43 -0
- package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/moderation/searchRepos.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/report/defs.d.ts +17 -27
- package/dist/lexicon/types/tools/ozone/report/defs.d.ts.map +1 -1
- package/dist/lexicon/types/tools/ozone/report/defs.js +17 -27
- package/dist/lexicon/types/tools/ozone/report/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/safelink/addRule.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/safelink/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/safelink/queryEvents.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/safelink/queryRules.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/safelink/removeRule.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/safelink/updateRule.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/server/getConfig.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/set/addValues.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/set/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/set/deleteSet.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/set/deleteValues.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/set/getValues.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/set/querySets.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/set/upsertSet.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/setting/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/setting/listOptions.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/setting/removeOptions.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/setting/upsertOption.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/signature/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/signature/findCorrelation.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/signature/findRelatedAccounts.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/signature/searchAccounts.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/team/addMember.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/team/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/team/deleteMember.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/team/listMembers.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/team/updateMember.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/verification/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/verification/grantVerifications.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/verification/listVerifications.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.js.map +1 -1
- package/dist/lexicon/util.js.map +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/mod-service/index.d.ts.map +1 -1
- package/dist/mod-service/index.js +11 -0
- package/dist/mod-service/index.js.map +1 -1
- package/dist/mod-service/profile.d.ts.map +1 -1
- package/dist/mod-service/profile.js +14 -26
- package/dist/mod-service/profile.js.map +1 -1
- package/dist/mod-service/status.d.ts +3 -0
- package/dist/mod-service/status.d.ts.map +1 -1
- package/dist/mod-service/status.js.map +1 -1
- package/dist/mod-service/subject.js.map +1 -1
- package/dist/mod-service/types.js.map +1 -1
- package/dist/mod-service/util.js.map +1 -1
- package/dist/mod-service/views.d.ts.map +1 -1
- package/dist/mod-service/views.js +5 -0
- package/dist/mod-service/views.js.map +1 -1
- package/dist/safelink/service.js.map +1 -1
- package/dist/scheduled-action/service.d.ts +39 -0
- package/dist/scheduled-action/service.d.ts.map +1 -0
- package/dist/scheduled-action/service.js +208 -0
- package/dist/scheduled-action/service.js.map +1 -0
- package/dist/scheduled-action/types.d.ts +14 -0
- package/dist/scheduled-action/types.d.ts.map +1 -0
- package/dist/scheduled-action/types.js +3 -0
- package/dist/scheduled-action/types.js.map +1 -0
- package/dist/sequencer/index.js.map +1 -1
- package/dist/sequencer/outbox.js.map +1 -1
- package/dist/sequencer/sequencer.js.map +1 -1
- package/dist/set/service.js.map +1 -1
- package/dist/setting/constants.js.map +1 -1
- package/dist/setting/service.js.map +1 -1
- package/dist/setting/types.js.map +1 -1
- package/dist/setting/validators.js.map +1 -1
- package/dist/tag-service/content-tagger.js.map +1 -1
- package/dist/tag-service/embed-tagger.js.map +1 -1
- package/dist/tag-service/index.js.map +1 -1
- package/dist/tag-service/language-data.js.map +1 -1
- package/dist/tag-service/language-tagger.js.map +1 -1
- package/dist/tag-service/util.js.map +1 -1
- package/dist/team/index.js.map +1 -1
- package/dist/util.js.map +1 -1
- package/dist/verification/issuer.js.map +1 -1
- package/dist/verification/service.js.map +1 -1
- package/dist/verification/util.js.map +1 -1
- package/package.json +3 -3
- package/src/api/index.ts +6 -0
- package/src/api/moderation/cancelScheduledActions.ts +72 -0
- package/src/api/moderation/emitEvent.ts +9 -84
- package/src/api/moderation/listScheduledActions.ts +45 -0
- package/src/api/moderation/scheduleAction.ts +129 -0
- package/src/api/moderation/util.ts +96 -0
- package/src/api/util.ts +33 -0
- package/src/context.ts +11 -0
- package/src/daemon/context.ts +21 -0
- package/src/daemon/index.ts +1 -0
- package/src/daemon/scheduled-action-processor.ts +243 -0
- package/src/db/migrations/20250923T000000000Z-scheduled-actions.ts +56 -0
- package/src/db/migrations/index.ts +2 -0
- package/src/db/schema/index.ts +3 -1
- package/src/db/schema/scheduled-action.ts +25 -0
- package/src/lexicon/index.ts +51 -25
- package/src/lexicon/lexicons.ts +467 -69
- package/src/lexicon/types/com/atproto/moderation/defs.ts +10 -15
- package/src/lexicon/types/tools/ozone/moderation/cancelScheduledActions.ts +79 -0
- package/src/lexicon/types/tools/ozone/moderation/defs.ts +88 -0
- package/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +2 -0
- package/src/lexicon/types/tools/ozone/moderation/getAccountTimeline.ts +2 -0
- package/src/lexicon/types/tools/ozone/moderation/listScheduledActions.ts +57 -0
- package/src/lexicon/types/tools/ozone/moderation/scheduleAction.ts +123 -0
- package/src/lexicon/types/tools/ozone/report/defs.ts +25 -40
- package/src/mod-service/index.ts +13 -0
- package/src/mod-service/profile.ts +22 -26
- package/src/mod-service/views.ts +7 -0
- package/src/scheduled-action/service.ts +279 -0
- package/src/scheduled-action/types.ts +17 -0
- package/tests/__snapshots__/scheduled-action.test.ts.snap +61 -0
- package/tests/scheduled-action-processor.test.ts +464 -0
- package/tests/scheduled-action.test.ts +334 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/tsconfig.tests.tsbuildinfo +1 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Selectable } from 'kysely';
|
|
2
|
+
import { ScheduledActionStatus, ScheduledActionType } from '../api/util';
|
|
3
|
+
import { Database } from '../db';
|
|
4
|
+
import { ScheduledAction } from '../db/schema/scheduled-action';
|
|
5
|
+
import { ScheduledActionView } from '../lexicon/types/tools/ozone/moderation/defs';
|
|
6
|
+
import { SchedulingParams } from './types';
|
|
7
|
+
export type ScheduledActionServiceCreator = (db: Database) => ScheduledActionService;
|
|
8
|
+
export declare class ScheduledActionService {
|
|
9
|
+
db: Database;
|
|
10
|
+
constructor(db: Database);
|
|
11
|
+
static creator(): (db: Database) => ScheduledActionService;
|
|
12
|
+
formatScheduledAction(action: Selectable<ScheduledAction>): ScheduledActionView;
|
|
13
|
+
scheduleAction(schedulingParams: SchedulingParams): Promise<Selectable<ScheduledAction>>;
|
|
14
|
+
getPendingActionForSubject(did: string, action: ScheduledActionType): Promise<Selectable<ScheduledAction> | null>;
|
|
15
|
+
listScheduledActions({ cursor, limit, startTime, endTime, subjects, statuses, direction, }: {
|
|
16
|
+
cursor?: string;
|
|
17
|
+
limit?: number;
|
|
18
|
+
startTime?: Date;
|
|
19
|
+
endTime?: Date;
|
|
20
|
+
subjects?: string[];
|
|
21
|
+
statuses: ScheduledActionStatus[];
|
|
22
|
+
direction?: 'asc' | 'desc';
|
|
23
|
+
}): Promise<{
|
|
24
|
+
actions: Selectable<ScheduledAction>[];
|
|
25
|
+
cursor?: string;
|
|
26
|
+
}>;
|
|
27
|
+
cancelScheduledActions(subjects: string[]): Promise<{
|
|
28
|
+
succeeded: string[];
|
|
29
|
+
failed: {
|
|
30
|
+
did: string;
|
|
31
|
+
error: string;
|
|
32
|
+
errorCode?: string;
|
|
33
|
+
}[];
|
|
34
|
+
}>;
|
|
35
|
+
getPendingActionsToExecute(now: Date): Promise<Selectable<ScheduledAction>[]>;
|
|
36
|
+
markActionAsExecuted(actionId: number, executionEventId: number): Promise<void>;
|
|
37
|
+
markActionAsFailed(actionId: number, failureReason: string): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/scheduled-action/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAA;AAElF,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE1C,MAAM,MAAM,6BAA6B,GAAG,CAC1C,EAAE,EAAE,QAAQ,KACT,sBAAsB,CAAA;AAE3B,qBAAa,sBAAsB;IACd,EAAE,EAAE,QAAQ;gBAAZ,EAAE,EAAE,QAAQ;IAE/B,MAAM,CAAC,OAAO,KACJ,IAAI,QAAQ;IAGtB,qBAAqB,CACnB,MAAM,EAAE,UAAU,CAAC,eAAe,CAAC,GAClC,mBAAmB;IA4BhB,cAAc,CAClB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAwDjC,0BAA0B,CAC9B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAYxC,oBAAoB,CAAC,EACzB,MAAM,EACN,KAAU,EACV,SAAS,EACT,OAAO,EACP,QAAQ,EACR,QAAa,EACb,SAAkB,GACnB,EAAE;QACD,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,SAAS,CAAC,EAAE,IAAI,CAAA;QAChB,OAAO,CAAC,EAAE,IAAI,CAAA;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;QACnB,QAAQ,EAAE,qBAAqB,EAAE,CAAA;QACjC,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;KAC3B,GAAG,OAAO,CAAC;QACV,OAAO,EAAE,UAAU,CAAC,eAAe,CAAC,EAAE,CAAA;QACtC,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAC;IA+CI,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACxD,SAAS,EAAE,MAAM,EAAE,CAAA;QACnB,MAAM,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAC7D,CAAC;IAsCI,0BAA0B,CAC9B,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;IAanC,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAcV,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;CAajB"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScheduledActionService = void 0;
|
|
4
|
+
const xrpc_server_1 = require("@atproto/xrpc-server");
|
|
5
|
+
const logger_1 = require("../logger");
|
|
6
|
+
class ScheduledActionService {
|
|
7
|
+
constructor(db) {
|
|
8
|
+
Object.defineProperty(this, "db", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
configurable: true,
|
|
11
|
+
writable: true,
|
|
12
|
+
value: db
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
static creator() {
|
|
16
|
+
return (db) => new ScheduledActionService(db);
|
|
17
|
+
}
|
|
18
|
+
formatScheduledAction(action) {
|
|
19
|
+
return {
|
|
20
|
+
id: action.id,
|
|
21
|
+
action: action.action,
|
|
22
|
+
eventData: action.eventData,
|
|
23
|
+
did: action.did,
|
|
24
|
+
executeAt: action.executeAt
|
|
25
|
+
? new Date(action.executeAt).toISOString()
|
|
26
|
+
: undefined,
|
|
27
|
+
executeAfter: action.executeAfter
|
|
28
|
+
? new Date(action.executeAfter).toISOString()
|
|
29
|
+
: undefined,
|
|
30
|
+
executeUntil: action.executeUntil
|
|
31
|
+
? new Date(action.executeUntil).toISOString()
|
|
32
|
+
: undefined,
|
|
33
|
+
randomizeExecution: action.randomizeExecution,
|
|
34
|
+
createdBy: action.createdBy,
|
|
35
|
+
createdAt: new Date(action.createdAt).toISOString(),
|
|
36
|
+
updatedAt: new Date(action.updatedAt).toISOString(),
|
|
37
|
+
status: action.status,
|
|
38
|
+
lastExecutedAt: action.lastExecutedAt
|
|
39
|
+
? new Date(action.lastExecutedAt).toISOString()
|
|
40
|
+
: undefined,
|
|
41
|
+
lastFailureReason: action.lastFailureReason || undefined,
|
|
42
|
+
executionEventId: action.executionEventId || undefined,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async scheduleAction(schedulingParams) {
|
|
46
|
+
const { action, eventData, did, createdBy } = schedulingParams;
|
|
47
|
+
// Only allow one pending action at a time for a given subject and action type
|
|
48
|
+
const existingAction = await this.getPendingActionForSubject(did, action);
|
|
49
|
+
if (existingAction) {
|
|
50
|
+
throw new xrpc_server_1.InvalidRequestError('A pending scheduled action already exists for this subject', 'ActionAlreadyExists');
|
|
51
|
+
}
|
|
52
|
+
// When a time-range for action is specified, ensure that the range is valid
|
|
53
|
+
if ('executeAfter' in schedulingParams &&
|
|
54
|
+
schedulingParams.executeAfter &&
|
|
55
|
+
schedulingParams.executeUntil &&
|
|
56
|
+
schedulingParams.executeAfter >= schedulingParams.executeUntil) {
|
|
57
|
+
throw new xrpc_server_1.InvalidRequestError('executeAfter must be before executeUntil', 'InvalidScheduling');
|
|
58
|
+
}
|
|
59
|
+
const now = new Date().toISOString();
|
|
60
|
+
const randomizeExecution = !('executeAt' in schedulingParams) && 'executeAfter' in schedulingParams;
|
|
61
|
+
const scheduledAction = await this.db.db
|
|
62
|
+
.insertInto('scheduled_action')
|
|
63
|
+
.values({
|
|
64
|
+
action,
|
|
65
|
+
eventData: JSON.stringify(eventData),
|
|
66
|
+
did,
|
|
67
|
+
executeAt: randomizeExecution
|
|
68
|
+
? null
|
|
69
|
+
: schedulingParams.executeAt?.toISOString(),
|
|
70
|
+
executeAfter: randomizeExecution
|
|
71
|
+
? schedulingParams.executeAfter?.toISOString()
|
|
72
|
+
: null,
|
|
73
|
+
executeUntil: randomizeExecution
|
|
74
|
+
? schedulingParams.executeUntil?.toISOString()
|
|
75
|
+
: null,
|
|
76
|
+
randomizeExecution,
|
|
77
|
+
createdBy,
|
|
78
|
+
createdAt: now,
|
|
79
|
+
updatedAt: now,
|
|
80
|
+
status: 'pending',
|
|
81
|
+
})
|
|
82
|
+
.returningAll()
|
|
83
|
+
.executeTakeFirstOrThrow();
|
|
84
|
+
return scheduledAction;
|
|
85
|
+
}
|
|
86
|
+
async getPendingActionForSubject(did, action) {
|
|
87
|
+
const scheduledAction = await this.db.db
|
|
88
|
+
.selectFrom('scheduled_action')
|
|
89
|
+
.selectAll()
|
|
90
|
+
.where('did', '=', did)
|
|
91
|
+
.where('action', '=', action)
|
|
92
|
+
.where('status', '=', 'pending')
|
|
93
|
+
.executeTakeFirst();
|
|
94
|
+
return scheduledAction || null;
|
|
95
|
+
}
|
|
96
|
+
async listScheduledActions({ cursor, limit = 50, startTime, endTime, subjects, statuses = [], direction = 'desc', }) {
|
|
97
|
+
let query = this.db.db
|
|
98
|
+
.selectFrom('scheduled_action')
|
|
99
|
+
.where('status', 'in', statuses)
|
|
100
|
+
.selectAll();
|
|
101
|
+
if (subjects && subjects.length > 0) {
|
|
102
|
+
query = query.where('did', 'in', subjects);
|
|
103
|
+
}
|
|
104
|
+
if (startTime) {
|
|
105
|
+
query = query.where((qb) => {
|
|
106
|
+
return qb
|
|
107
|
+
.orWhere('executeAt', '>=', startTime.toISOString())
|
|
108
|
+
.orWhere('executeAfter', '>=', startTime.toISOString());
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (endTime) {
|
|
112
|
+
query = query.where((qb) => {
|
|
113
|
+
return qb
|
|
114
|
+
.orWhere('executeAt', '<=', endTime.toISOString())
|
|
115
|
+
.orWhere('executeUntil', '<=', endTime.toISOString())
|
|
116
|
+
.orWhere((sqb) => {
|
|
117
|
+
return sqb
|
|
118
|
+
.where('executeUntil', 'is', null)
|
|
119
|
+
.where('executeAfter', '<=', endTime.toISOString());
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (cursor) {
|
|
124
|
+
query = query.where('id', direction === 'asc' ? '>' : '<', parseInt(cursor, 10));
|
|
125
|
+
}
|
|
126
|
+
const actions = await query.orderBy('id', direction).limit(limit).execute();
|
|
127
|
+
return {
|
|
128
|
+
actions,
|
|
129
|
+
cursor: actions.at(-1)?.id?.toString(),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async cancelScheduledActions(subjects) {
|
|
133
|
+
const succeeded = [];
|
|
134
|
+
const failed = [];
|
|
135
|
+
for (const did of subjects) {
|
|
136
|
+
try {
|
|
137
|
+
const result = await this.db.db
|
|
138
|
+
.updateTable('scheduled_action')
|
|
139
|
+
.set({
|
|
140
|
+
status: 'cancelled',
|
|
141
|
+
updatedAt: new Date().toISOString(),
|
|
142
|
+
})
|
|
143
|
+
.where('did', '=', did)
|
|
144
|
+
.where('status', '=', 'pending')
|
|
145
|
+
.executeTakeFirst();
|
|
146
|
+
if (result.numUpdatedRows && result.numUpdatedRows > 0) {
|
|
147
|
+
succeeded.push(did);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
failed.push({
|
|
151
|
+
did,
|
|
152
|
+
error: 'No pending scheduled actions found for subject',
|
|
153
|
+
errorCode: 'NoPendingActions',
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
logger_1.dbLogger.error({ err, subjects }, 'Error cancelling scheduled action');
|
|
159
|
+
failed.push({
|
|
160
|
+
did,
|
|
161
|
+
error: 'Unknown error',
|
|
162
|
+
errorCode: 'DatabaseError',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return { succeeded, failed };
|
|
167
|
+
}
|
|
168
|
+
async getPendingActionsToExecute(now) {
|
|
169
|
+
return await this.db.db
|
|
170
|
+
.selectFrom('scheduled_action')
|
|
171
|
+
.selectAll()
|
|
172
|
+
.where('status', '=', 'pending')
|
|
173
|
+
.where((qb) => {
|
|
174
|
+
return qb
|
|
175
|
+
.orWhere('executeAfter', '<=', now.toISOString())
|
|
176
|
+
.orWhere('executeAt', '<=', now.toISOString());
|
|
177
|
+
})
|
|
178
|
+
.execute();
|
|
179
|
+
}
|
|
180
|
+
async markActionAsExecuted(actionId, executionEventId) {
|
|
181
|
+
const now = new Date().toISOString();
|
|
182
|
+
await this.db.db
|
|
183
|
+
.updateTable('scheduled_action')
|
|
184
|
+
.set({
|
|
185
|
+
status: 'executed',
|
|
186
|
+
lastExecutedAt: now,
|
|
187
|
+
executionEventId,
|
|
188
|
+
updatedAt: now,
|
|
189
|
+
})
|
|
190
|
+
.where('id', '=', actionId)
|
|
191
|
+
.execute();
|
|
192
|
+
}
|
|
193
|
+
async markActionAsFailed(actionId, failureReason) {
|
|
194
|
+
const now = new Date().toISOString();
|
|
195
|
+
await this.db.db
|
|
196
|
+
.updateTable('scheduled_action')
|
|
197
|
+
.set({
|
|
198
|
+
status: 'failed',
|
|
199
|
+
lastExecutedAt: now,
|
|
200
|
+
lastFailureReason: failureReason,
|
|
201
|
+
updatedAt: now,
|
|
202
|
+
})
|
|
203
|
+
.where('id', '=', actionId)
|
|
204
|
+
.execute();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
exports.ScheduledActionService = ScheduledActionService;
|
|
208
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/scheduled-action/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { ScheduledActionStatus, ScheduledActionType } from '../api/util'\nimport { Database } from '../db'\nimport { ScheduledAction } from '../db/schema/scheduled-action'\nimport { ScheduledActionView } from '../lexicon/types/tools/ozone/moderation/defs'\nimport { dbLogger } from '../logger'\nimport { SchedulingParams } from './types'\n\nexport type ScheduledActionServiceCreator = (\n db: Database,\n) => ScheduledActionService\n\nexport class ScheduledActionService {\n constructor(public db: Database) {}\n\n static creator() {\n return (db: Database) => new ScheduledActionService(db)\n }\n\n formatScheduledAction(\n action: Selectable<ScheduledAction>,\n ): ScheduledActionView {\n return {\n id: action.id,\n action: action.action,\n eventData: action.eventData as { [x: string]: unknown } | undefined,\n did: action.did,\n executeAt: action.executeAt\n ? new Date(action.executeAt).toISOString()\n : undefined,\n executeAfter: action.executeAfter\n ? new Date(action.executeAfter).toISOString()\n : undefined,\n executeUntil: action.executeUntil\n ? new Date(action.executeUntil).toISOString()\n : undefined,\n randomizeExecution: action.randomizeExecution,\n createdBy: action.createdBy,\n createdAt: new Date(action.createdAt).toISOString(),\n updatedAt: new Date(action.updatedAt).toISOString(),\n status: action.status,\n lastExecutedAt: action.lastExecutedAt\n ? new Date(action.lastExecutedAt).toISOString()\n : undefined,\n lastFailureReason: action.lastFailureReason || undefined,\n executionEventId: action.executionEventId || undefined,\n }\n }\n\n async scheduleAction(\n schedulingParams: SchedulingParams,\n ): Promise<Selectable<ScheduledAction>> {\n const { action, eventData, did, createdBy } = schedulingParams\n\n // Only allow one pending action at a time for a given subject and action type\n const existingAction = await this.getPendingActionForSubject(did, action)\n if (existingAction) {\n throw new InvalidRequestError(\n 'A pending scheduled action already exists for this subject',\n 'ActionAlreadyExists',\n )\n }\n\n // When a time-range for action is specified, ensure that the range is valid\n if (\n 'executeAfter' in schedulingParams &&\n schedulingParams.executeAfter &&\n schedulingParams.executeUntil &&\n schedulingParams.executeAfter >= schedulingParams.executeUntil\n ) {\n throw new InvalidRequestError(\n 'executeAfter must be before executeUntil',\n 'InvalidScheduling',\n )\n }\n\n const now = new Date().toISOString()\n const randomizeExecution =\n !('executeAt' in schedulingParams) && 'executeAfter' in schedulingParams\n\n const scheduledAction = await this.db.db\n .insertInto('scheduled_action')\n .values({\n action,\n eventData: JSON.stringify(eventData),\n did,\n executeAt: randomizeExecution\n ? null\n : schedulingParams.executeAt?.toISOString(),\n executeAfter: randomizeExecution\n ? schedulingParams.executeAfter?.toISOString()\n : null,\n executeUntil: randomizeExecution\n ? schedulingParams.executeUntil?.toISOString()\n : null,\n randomizeExecution,\n createdBy,\n createdAt: now,\n updatedAt: now,\n status: 'pending',\n })\n .returningAll()\n .executeTakeFirstOrThrow()\n\n return scheduledAction\n }\n\n async getPendingActionForSubject(\n did: string,\n action: ScheduledActionType,\n ): Promise<Selectable<ScheduledAction> | null> {\n const scheduledAction = await this.db.db\n .selectFrom('scheduled_action')\n .selectAll()\n .where('did', '=', did)\n .where('action', '=', action)\n .where('status', '=', 'pending')\n .executeTakeFirst()\n\n return scheduledAction || null\n }\n\n async listScheduledActions({\n cursor,\n limit = 50,\n startTime,\n endTime,\n subjects,\n statuses = [],\n direction = 'desc',\n }: {\n cursor?: string\n limit?: number\n startTime?: Date\n endTime?: Date\n subjects?: string[]\n statuses: ScheduledActionStatus[]\n direction?: 'asc' | 'desc'\n }): Promise<{\n actions: Selectable<ScheduledAction>[]\n cursor?: string\n }> {\n let query = this.db.db\n .selectFrom('scheduled_action')\n .where('status', 'in', statuses)\n .selectAll()\n\n if (subjects && subjects.length > 0) {\n query = query.where('did', 'in', subjects)\n }\n\n if (startTime) {\n query = query.where((qb) => {\n return qb\n .orWhere('executeAt', '>=', startTime.toISOString())\n .orWhere('executeAfter', '>=', startTime.toISOString())\n })\n }\n\n if (endTime) {\n query = query.where((qb) => {\n return qb\n .orWhere('executeAt', '<=', endTime.toISOString())\n .orWhere('executeUntil', '<=', endTime.toISOString())\n .orWhere((sqb) => {\n return sqb\n .where('executeUntil', 'is', null)\n .where('executeAfter', '<=', endTime.toISOString())\n })\n })\n }\n\n if (cursor) {\n query = query.where(\n 'id',\n direction === 'asc' ? '>' : '<',\n parseInt(cursor, 10),\n )\n }\n\n const actions = await query.orderBy('id', direction).limit(limit).execute()\n\n return {\n actions,\n cursor: actions.at(-1)?.id?.toString(),\n }\n }\n\n async cancelScheduledActions(subjects: string[]): Promise<{\n succeeded: string[]\n failed: { did: string; error: string; errorCode?: string }[]\n }> {\n const succeeded: string[] = []\n const failed: { did: string; error: string; errorCode?: string }[] = []\n\n for (const did of subjects) {\n try {\n const result = await this.db.db\n .updateTable('scheduled_action')\n .set({\n status: 'cancelled',\n updatedAt: new Date().toISOString(),\n })\n .where('did', '=', did)\n .where('status', '=', 'pending')\n .executeTakeFirst()\n\n if (result.numUpdatedRows && result.numUpdatedRows > 0) {\n succeeded.push(did)\n } else {\n failed.push({\n did,\n error: 'No pending scheduled actions found for subject',\n errorCode: 'NoPendingActions',\n })\n }\n } catch (err) {\n dbLogger.error({ err, subjects }, 'Error cancelling scheduled action')\n failed.push({\n did,\n error: 'Unknown error',\n errorCode: 'DatabaseError',\n })\n }\n }\n\n return { succeeded, failed }\n }\n\n async getPendingActionsToExecute(\n now: Date,\n ): Promise<Selectable<ScheduledAction>[]> {\n return await this.db.db\n .selectFrom('scheduled_action')\n .selectAll()\n .where('status', '=', 'pending')\n .where((qb) => {\n return qb\n .orWhere('executeAfter', '<=', now.toISOString())\n .orWhere('executeAt', '<=', now.toISOString())\n })\n .execute()\n }\n\n async markActionAsExecuted(\n actionId: number,\n executionEventId: number,\n ): Promise<void> {\n const now = new Date().toISOString()\n await this.db.db\n .updateTable('scheduled_action')\n .set({\n status: 'executed',\n lastExecutedAt: now,\n executionEventId,\n updatedAt: now,\n })\n .where('id', '=', actionId)\n .execute()\n }\n\n async markActionAsFailed(\n actionId: number,\n failureReason: string,\n ): Promise<void> {\n const now = new Date().toISOString()\n await this.db.db\n .updateTable('scheduled_action')\n .set({\n status: 'failed',\n lastExecutedAt: now,\n lastFailureReason: failureReason,\n updatedAt: now,\n })\n .where('id', '=', actionId)\n .execute()\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ScheduledActionType } from '../api/util';
|
|
2
|
+
export type ExecutionSchedule = {
|
|
3
|
+
executeAt: Date;
|
|
4
|
+
} | {
|
|
5
|
+
executeAfter: Date;
|
|
6
|
+
executeUntil?: Date;
|
|
7
|
+
};
|
|
8
|
+
export type SchedulingParams = {
|
|
9
|
+
action: ScheduledActionType;
|
|
10
|
+
eventData: unknown;
|
|
11
|
+
did: string;
|
|
12
|
+
createdBy: string;
|
|
13
|
+
} & ExecutionSchedule;
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scheduled-action/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,MAAM,iBAAiB,GACzB;IACE,SAAS,EAAE,IAAI,CAAA;CAChB,GACD;IACE,YAAY,EAAE,IAAI,CAAA;IAClB,YAAY,CAAC,EAAE,IAAI,CAAA;CACpB,CAAA;AAEL,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,SAAS,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,iBAAiB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scheduled-action/types.ts"],"names":[],"mappings":"","sourcesContent":["import { ScheduledActionType } from '../api/util'\n\nexport type ExecutionSchedule =\n | {\n executeAt: Date\n }\n | {\n executeAfter: Date\n executeUntil?: Date\n }\n\nexport type SchedulingParams = {\n action: ScheduledActionType\n eventData: unknown\n did: string\n createdBy: string\n} & ExecutionSchedule\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sequencer/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,2CAAwB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sequencer/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,2CAAwB","sourcesContent":["export * from './sequencer'\nexport * from './outbox'\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../src/sequencer/outbox.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../src/sequencer/outbox.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncBuffer, AsyncBufferFullError } from '@atproto/common'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { LabelsEvt, Sequencer } from './sequencer'\n\nexport type OutboxOpts = {\n maxBufferSize: number\n}\n\nexport class Outbox {\n private caughtUp = false\n lastSeen = -1\n\n cutoverBuffer: LabelsEvt[]\n outBuffer: AsyncBuffer<LabelsEvt>\n\n constructor(\n public sequencer: Sequencer,\n opts: Partial<OutboxOpts> = {},\n ) {\n const { maxBufferSize = 500 } = opts\n this.cutoverBuffer = []\n this.outBuffer = new AsyncBuffer<LabelsEvt>(maxBufferSize)\n }\n\n // event stream occurs in 3 phases\n // 1. backfill events: events that have been added to the DB since the last time a connection was open.\n // The outbox is not yet listening for new events from the sequencer\n // 2. cutover: the outbox has caught up with where the sequencer purports to be,\n // but the sequencer might already be halfway through sending out a round of updates.\n // Therefore, we start accepting the sequencer's events in a buffer, while making our own request to the\n // database to ensure we're caught up. We then dedupe the query & the buffer & stream the events in order\n // 3. streaming: we're all caught up on historic state, so the sequencer outputs events and we\n // immediately yield them\n async *events(\n backfillCursor?: number,\n signal?: AbortSignal,\n ): AsyncGenerator<LabelsEvt> {\n // catch up as much as we can\n if (backfillCursor !== undefined) {\n for await (const evt of this.getBackfill(backfillCursor)) {\n if (signal?.aborted) return\n this.lastSeen = evt.seq\n yield evt\n }\n } else {\n // if not backfill, we don't need to cutover, just start streaming\n this.caughtUp = true\n }\n\n // streams updates from sequencer, but buffers them for cutover as it makes a last request\n\n const addToBuffer = (evts) => {\n if (this.caughtUp) {\n this.outBuffer.pushMany(evts)\n } else {\n this.cutoverBuffer = [...this.cutoverBuffer, ...evts]\n }\n }\n\n if (!signal?.aborted) {\n this.sequencer.on('events', addToBuffer)\n }\n signal?.addEventListener('abort', () =>\n this.sequencer.off('events', addToBuffer),\n )\n\n const cutover = async () => {\n // only need to perform cutover if we've been backfilling\n if (backfillCursor !== undefined) {\n const cutoverEvts = await this.sequencer.requestLabelRange({\n earliestId: this.lastSeen > -1 ? this.lastSeen : backfillCursor,\n })\n this.outBuffer.pushMany(cutoverEvts)\n // dont worry about dupes, we ensure order on yield\n this.outBuffer.pushMany(this.cutoverBuffer)\n this.caughtUp = true\n this.cutoverBuffer = []\n } else {\n this.caughtUp = true\n }\n }\n cutover()\n\n while (true) {\n try {\n for await (const evt of this.outBuffer.events()) {\n if (signal?.aborted) return\n if (evt.seq > this.lastSeen) {\n this.lastSeen = evt.seq\n yield evt\n }\n }\n } catch (err) {\n if (err instanceof AsyncBufferFullError) {\n throw new InvalidRequestError(\n 'Stream consumer too slow',\n 'ConsumerTooSlow',\n )\n } else {\n throw err\n }\n }\n }\n }\n\n // yields only historical events\n async *getBackfill(backfillCursor: number) {\n const PAGE_SIZE = 500\n while (true) {\n const evts = await this.sequencer.requestLabelRange({\n earliestId: this.lastSeen > -1 ? this.lastSeen : backfillCursor,\n limit: PAGE_SIZE,\n })\n for (const evt of evts) {\n yield evt\n }\n // if we're within half a pagesize of the sequencer, we call it good & switch to cutover\n const seqCursor = this.sequencer.lastSeen ?? -1\n if (seqCursor - this.lastSeen < PAGE_SIZE / 2) break\n if (evts.length < 1) break\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer.js","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sequencer.js","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAsC;AAKtC,8CAAsE;AAEtE,sCAA4C;AAM5C,MAAa,SAAU,SAAS,qBAA2C;IAOzE,YACS,OAA0B,EAC1B,WAAW,CAAC;QAEnB,KAAK,EAAE,CAAA;QAHP;;;;mBAAO,OAAO;WAAmB;QACjC;;;;mBAAO,QAAQ;WAAI;QARrB;;;;;WAAY;QACZ;;;;mBAAY,KAAK;WAAA;QACjB;;;;;WAAsC;QACtC;;;;mBAAS,KAAK;WAAA;QACd;;;;;WAA4B;QAO1B,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAA;QACpB,0EAA0E;QAC1E,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAA;QACzB,IAAI,CAAC,IAAI,EAAE,CAAA;QACX,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;QACxC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,oBAAY,EAAE,CAAC,CAAA,CAAC,mEAAmE;QAC7G,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE;YACrC,IAAI,KAAK,CAAC,OAAO,KAAK,oBAAY,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,EAAE,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;YACnB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAA;QACxB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACzB,UAAU,CAAC,OAAO,CAAC;aACnB,SAAS,EAAE;aACX,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,KAAK,CAAC,CAAC,CAAC;aACR,gBAAgB,EAAE,CAAA;QACrB,OAAO,GAAG,EAAE,EAAE,IAAI,IAAI,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACzB,UAAU,CAAC,OAAO,CAAC;aACnB,SAAS,EAAE;aACX,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC;aACxB,KAAK,CAAC,CAAC,CAAC;aACR,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,gBAAgB,EAAE,CAAA;QACrB,OAAO,GAAG,IAAI,IAAI,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAGvB;QACC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;QAElC,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC3E,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,CAAA;QAC5C,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC5B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;QAClC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,IAAI,GAAgB,MAAM,OAAO,CAAC,GAAG,CACzC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACrB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAA;YACvE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,CAAA;QAC7C,CAAC,CAAC,CACH,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,IAAI;QACV,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAC1B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YAClB,OAAM;QACR,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACxC,UAAU,EAAE,IAAI,CAAC,QAAQ;YACzB,KAAK,EAAE,GAAG;SACX,CAAC;aACC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAA;YACjD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YACpB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,kBAAG,CAAC,KAAK,CACP,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAChC,6BAA6B,CAC9B,CAAA;QACH,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;YAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,IAAI,EAAE,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;IACN,CAAC;CACF;AA5HD,8BA4HC","sourcesContent":["import EventEmitter from 'node:events'\nimport { Selectable } from 'kysely'\nimport { PoolClient } from 'pg'\nimport TypedEmitter from 'typed-emitter'\nimport { Database } from '../db'\nimport { Label as LabelTable, LabelChannel } from '../db/schema/label'\nimport { Labels as LabelsEvt } from '../lexicon/types/com/atproto/label/subscribeLabels'\nimport { seqLogger as log } from '../logger'\nimport { ModerationService } from '../mod-service'\n\nexport type { Labels as LabelsEvt } from '../lexicon/types/com/atproto/label/subscribeLabels'\ntype LabelRow = Selectable<LabelTable>\n\nexport class Sequencer extends (EventEmitter as new () => SequencerEmitter) {\n db: Database\n destroyed = false\n pollPromise: Promise<void> | undefined\n queued = false\n conn: PoolClient | undefined\n\n constructor(\n public modSrvc: ModerationService,\n public lastSeen = 0,\n ) {\n super()\n this.db = modSrvc.db\n // note: this does not err when surpassed, just prints a warning to stderr\n this.setMaxListeners(100)\n }\n\n async start() {\n const curr = await this.curr()\n this.lastSeen = curr ?? 0\n this.poll()\n this.conn = await this.db.pool.connect()\n this.conn.query(`listen ${LabelChannel}`) // if this errors, unhandled rejection should cause process to exit\n this.conn.on('notification', (notif) => {\n if (notif.channel === LabelChannel) {\n this.poll()\n }\n })\n }\n\n async destroy() {\n if (this.destroyed) return\n this.destroyed = true\n if (this.conn) {\n this.conn.release()\n this.conn = undefined\n }\n if (this.pollPromise) {\n await this.pollPromise\n }\n this.emit('close')\n }\n\n async curr(): Promise<number | null> {\n const got = await this.db.db\n .selectFrom('label')\n .selectAll()\n .orderBy('id', 'desc')\n .limit(1)\n .executeTakeFirst()\n return got?.id ?? null\n }\n\n async next(cursor: number): Promise<LabelRow | null> {\n const got = await this.db.db\n .selectFrom('label')\n .selectAll()\n .where('id', '>', cursor)\n .limit(1)\n .orderBy('id', 'asc')\n .executeTakeFirst()\n return got || null\n }\n\n async requestLabelRange(opts: {\n earliestId?: number\n limit?: number\n }): Promise<LabelsEvt[]> {\n const { earliestId, limit } = opts\n\n let seqQb = this.db.db.selectFrom('label').selectAll().orderBy('id', 'asc')\n if (earliestId !== undefined) {\n seqQb = seqQb.where('id', '>', earliestId)\n }\n if (limit !== undefined) {\n seqQb = seqQb.limit(limit)\n }\n\n const rows = await seqQb.execute()\n if (rows.length < 1) {\n return []\n }\n\n const evts: LabelsEvt[] = await Promise.all(\n rows.map(async (row) => {\n const formatted = await this.modSrvc.views.formatLabelAndEnsureSig(row)\n return { seq: row.id, labels: [formatted] }\n }),\n )\n\n return evts\n }\n\n private poll() {\n if (this.destroyed) return\n if (this.pollPromise) {\n this.queued = true\n return\n }\n this.queued = false\n this.pollPromise = this.requestLabelRange({\n earliestId: this.lastSeen,\n limit: 500,\n })\n .then((evts) => {\n this.emit('events', evts)\n this.lastSeen = evts.at(-1)?.seq ?? this.lastSeen\n if (evts.length > 0) {\n this.queued = true\n }\n })\n .catch((err) => {\n log.error(\n { err, lastSeen: this.lastSeen },\n 'sequencer failed to poll db',\n )\n })\n .finally(() => {\n this.pollPromise = undefined\n if (this.queued) {\n this.poll()\n }\n })\n }\n}\n\ntype SequencerEvents = {\n events: (evts: LabelsEvt[]) => void\n close: () => void\n}\n\nexport type SequencerEmitter = TypedEmitter<SequencerEvents>\n"]}
|
package/dist/set/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/set/service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/set/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable } from 'kysely'\nimport { Database } from '../db'\nimport { TimeIdKeyset, paginate } from '../db/pagination'\nimport { SetDetail } from '../db/schema/ozone_set'\nimport { SetView } from '../lexicon/types/tools/ozone/set/defs'\n\nexport type SetServiceCreator = (db: Database) => SetService\n\nexport class SetService {\n constructor(public db: Database) {}\n\n static creator() {\n return (db: Database) => new SetService(db)\n }\n\n buildQueryForSetWithSize() {\n return this.db.db.selectFrom('set_detail as s').select([\n 's.id',\n 's.name',\n 's.description',\n 's.createdAt',\n 's.updatedAt',\n (eb) =>\n eb\n .selectFrom('set_value')\n .select((e) => e.fn.count<number>('setId').as('count'))\n .whereRef('setId', '=', 's.id')\n .as('setSize'),\n ])\n }\n\n async query({\n limit,\n cursor,\n namePrefix,\n sortBy,\n sortDirection,\n }: {\n limit: number\n cursor?: string\n namePrefix?: string\n sortBy: 'name' | 'createdAt' | 'updatedAt'\n sortDirection: 'asc' | 'desc'\n }): Promise<{\n sets: Selectable<SetDetail & { setSize: number }>[]\n cursor?: string\n }> {\n let qb = this.buildQueryForSetWithSize().limit(limit)\n\n if (namePrefix) {\n qb = qb.where('s.name', 'like', `${namePrefix}%`)\n }\n\n if (cursor) {\n if (sortBy === 'name') {\n qb = qb.where('s.name', sortDirection === 'asc' ? '>' : '<', cursor)\n } else {\n qb = qb.where(\n `s.${sortBy}`,\n sortDirection === 'asc' ? '>' : '<',\n new Date(cursor),\n )\n }\n }\n\n qb = qb.orderBy(`s.${sortBy}`, sortDirection)\n\n const sets = await qb.execute()\n const lastItem = sets.at(-1)\n\n return {\n sets,\n cursor: lastItem\n ? sortBy === 'name'\n ? lastItem?.name\n : lastItem?.[sortBy].toISOString()\n : undefined,\n }\n }\n\n async getByName(name: string): Promise<Selectable<SetDetail> | undefined> {\n const query = this.db.db\n .selectFrom('set_detail')\n .selectAll()\n .where('name', '=', name)\n\n return await query.executeTakeFirst()\n }\n\n async getByNameWithSize(\n name: string,\n ): Promise<Selectable<SetDetail & { setSize: number }> | undefined> {\n return await this.buildQueryForSetWithSize()\n .where('s.name', '=', name)\n .executeTakeFirst()\n }\n\n async getSetWithValues({\n name,\n limit,\n cursor,\n }: {\n name: string\n limit: number\n cursor?: string\n }): Promise<\n | {\n set: Selectable<SetDetail & { setSize: number }>\n values: string[]\n cursor?: string\n }\n | undefined\n > {\n const set = await this.getByNameWithSize(name)\n if (!set) return undefined\n\n const { ref } = this.db.db.dynamic\n const qb = this.db.db\n .selectFrom('set_value')\n .selectAll()\n .where('setId', '=', set.id)\n\n const keyset = new TimeIdKeyset(ref(`createdAt`), ref('id'))\n const paginatedBuilder = paginate(qb, {\n limit,\n cursor,\n keyset,\n direction: 'asc',\n })\n\n const result = await paginatedBuilder.execute()\n\n return {\n set,\n values: result.map((v) => v.value),\n cursor: keyset.packFromResult(result),\n }\n }\n async upsert({\n name,\n description,\n }: Pick<SetDetail, 'name' | 'description'>): Promise<void> {\n await this.db.db\n .insertInto('set_detail')\n .values({\n name,\n description,\n updatedAt: new Date(),\n })\n .onConflict((oc) => {\n // if description is provided as a string, even an empty one, update it\n // otherwise, just update the updatedAt timestamp\n return oc.column('name').doUpdateSet(\n typeof description === 'string'\n ? {\n description,\n updatedAt: new Date(),\n }\n : { updatedAt: new Date() },\n )\n })\n .execute()\n }\n\n async addValues(setId: number, values: string[]): Promise<void> {\n await this.db.transaction(async (txn) => {\n const now = new Date()\n const query = txn.db\n .insertInto('set_value')\n .values(\n values.map((value) => ({\n setId,\n value,\n createdAt: now,\n })),\n )\n .onConflict((oc) => oc.columns(['setId', 'value']).doNothing())\n\n await query.execute()\n\n // Update the set's updatedAt timestamp\n await txn.db\n .updateTable('set_detail')\n .set({ updatedAt: now })\n .where('id', '=', setId)\n .execute()\n })\n }\n\n async removeValues(setId: number, values: string[]): Promise<void> {\n if (values.length < 1) {\n return\n }\n await this.db.transaction(async (txn) => {\n const query = txn.db\n .deleteFrom('set_value')\n .where('setId', '=', setId)\n .where('value', 'in', values)\n\n await query.execute()\n\n // Update the set's updatedAt timestamp\n await txn.db\n .updateTable('set_detail')\n .set({ updatedAt: new Date() })\n .where('id', '=', setId)\n .execute()\n })\n }\n\n async removeSet(setId: number): Promise<void> {\n await this.db.transaction(async (txn) => {\n await txn.db.deleteFrom('set_value').where('setId', '=', setId).execute()\n await txn.db.deleteFrom('set_detail').where('id', '=', setId).execute()\n })\n }\n\n view(set: Selectable<SetDetail> & { setSize: number }): SetView {\n return {\n name: set.name,\n description: set.description || undefined,\n setSize: set.setSize,\n createdAt: set.createdAt.toISOString(),\n updatedAt: set.updatedAt.toISOString(),\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/setting/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,mCAAmC,CAAA;AAC5D,QAAA,oBAAoB,GAAG,gCAAgC,CAAA"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/setting/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,mCAAmC,CAAA;AAC5D,QAAA,oBAAoB,GAAG,gCAAgC,CAAA","sourcesContent":["export const ProtectedTagSettingKey = 'tools.ozone.setting.protectedTags'\nexport const PolicyListSettingKey = 'tools.ozone.setting.policyList'\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/setting/service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/setting/service.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { Selectable } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { Database } from '../db'\nimport { Member } from '../db/schema/member'\nimport { Setting, SettingScope } from '../db/schema/setting'\nimport { Option } from '../lexicon/types/tools/ozone/setting/defs'\n\nexport type SettingServiceCreator = (db: Database) => SettingService\n\nexport class SettingService {\n constructor(public db: Database) {}\n\n static creator() {\n return (db: Database) => new SettingService(db)\n }\n\n async query({\n limit = 100,\n scope,\n did,\n cursor,\n prefix,\n keys,\n }: {\n limit: number\n scope?: 'personal' | 'instance'\n did?: string\n cursor?: string\n prefix?: string\n keys?: string[]\n }): Promise<{\n options: Selectable<Setting>[]\n cursor?: string\n }> {\n let builder = this.db.db.selectFrom('setting').selectAll()\n\n if (prefix) {\n builder = builder.where('key', 'like', `${prefix}%`)\n } else if (keys?.length) {\n builder = builder.where('key', 'in', keys)\n }\n\n if (scope) {\n builder = builder.where('scope', '=', scope)\n }\n\n if (did) {\n builder = builder.where('did', '=', did)\n }\n\n if (cursor) {\n const cursorId = parseInt(cursor, 10)\n if (isNaN(cursorId)) {\n throw new InvalidRequestError('invalid cursor')\n }\n builder = builder.where('id', '<', cursorId)\n }\n\n const options = await builder.orderBy('id', 'desc').limit(limit).execute()\n\n return {\n options,\n cursor: options[options.length - 1]?.id.toString(),\n }\n }\n\n async upsert(\n option: Omit<Setting, 'id' | 'createdAt' | 'updatedAt'> & {\n createdAt: Date\n updatedAt: Date\n },\n ): Promise<void> {\n await this.db.db\n .insertInto('setting')\n .values(option)\n .onConflict((oc) => {\n return oc.columns(['key', 'scope', 'did']).doUpdateSet({\n value: option.value,\n updatedAt: option.updatedAt,\n description: option.description,\n managerRole: option.managerRole,\n lastUpdatedBy: option.lastUpdatedBy,\n })\n })\n .execute()\n }\n\n async removeOptions(\n keys: string[],\n filters: {\n did?: string\n scope: SettingScope\n managerRole: Member['role'][]\n },\n ): Promise<void> {\n if (!keys.length) return\n\n if (filters.scope === 'personal') {\n assert(filters.did, 'did is required for personal scope')\n }\n\n let qb = this.db.db\n .deleteFrom('setting')\n .where('key', 'in', keys)\n .where('scope', '=', filters.scope)\n\n if (filters.managerRole.length) {\n qb = qb.where('managerRole', 'in', filters.managerRole)\n } else {\n qb = qb.where('managerRole', 'is', null)\n }\n\n if (filters.did) {\n qb = qb.where('did', '=', filters.did)\n }\n\n await qb.execute()\n }\n\n view(setting: Selectable<Setting>): Option {\n const {\n key,\n value,\n did,\n description,\n createdAt,\n createdBy,\n updatedAt,\n lastUpdatedBy,\n managerRole,\n scope,\n } = setting\n\n return {\n key,\n value,\n did,\n scope,\n createdBy,\n lastUpdatedBy,\n managerRole: managerRole || undefined,\n description: description || undefined,\n createdAt: createdAt.toISOString(),\n updatedAt: updatedAt.toISOString(),\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/setting/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/setting/types.ts"],"names":[],"mappings":"","sourcesContent":["export type ProtectedTagSetting = {\n [key: string]: { roles?: string[]; moderators?: string[] }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/setting/validators.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/setting/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { Setting } from '../db/schema/setting'\nimport { PolicyListSettingKey, ProtectedTagSettingKey } from './constants'\n\nexport const settingValidators = new Map<\n string,\n (setting: Partial<Selectable<Setting>>) => Promise<void>\n>([\n [\n ProtectedTagSettingKey,\n async (setting: Partial<Selectable<Setting>>) => {\n if (setting.managerRole !== 'tools.ozone.team.defs#roleAdmin') {\n throw new InvalidRequestError(\n 'Only admins should be able to configure protected tags',\n )\n }\n\n if (typeof setting.value !== 'object') {\n throw new InvalidRequestError('Invalid value')\n }\n for (const [key, val] of Object.entries(setting.value)) {\n if (!val || typeof val !== 'object') {\n throw new InvalidRequestError(`Invalid configuration for tag ${key}`)\n }\n\n if (!val['roles'] && !val['moderators']) {\n throw new InvalidRequestError(\n `Must define who a list of moderators or a role who can action subjects with ${key} tag`,\n )\n }\n\n if (val['roles']) {\n if (!Array.isArray(val['roles'])) {\n throw new InvalidRequestError(\n `Roles must be an array of moderator roles for tag ${key}`,\n )\n }\n if (!val['roles']?.length) {\n throw new InvalidRequestError(\n `Must define at least one role for tag ${key}`,\n )\n }\n }\n\n if (val['moderators']) {\n if (!Array.isArray(val['moderators'])) {\n throw new InvalidRequestError(\n `Moderators must be an array of moderator DIDs for tag ${key}`,\n )\n }\n if (!val['moderators']?.length) {\n throw new InvalidRequestError(\n `Must define at least one moderator DID for tag ${key}`,\n )\n }\n }\n }\n },\n ],\n [\n PolicyListSettingKey,\n async (setting: Partial<Selectable<Setting>>) => {\n if (setting.managerRole !== 'tools.ozone.team.defs#roleAdmin') {\n throw new InvalidRequestError(\n 'Only admins should be able to manage policy list',\n )\n }\n\n if (typeof setting.value !== 'object') {\n throw new InvalidRequestError('Invalid value')\n }\n for (const [key, val] of Object.entries(setting.value)) {\n if (!val || typeof val !== 'object') {\n throw new InvalidRequestError(\n `Invalid configuration for policy ${key}`,\n )\n }\n\n if (!val['name'] || !val['description']) {\n throw new InvalidRequestError(\n `Must define a name and description for policy ${key}`,\n )\n }\n }\n },\n ],\n])\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-tagger.js","sourceRoot":"","sources":["../../src/tag-service/content-tagger.ts"],"names":[],"mappings":";;;AAIA,MAAsB,aAAa;IACjC,YACY,OAAmB,EACnB,aAAgD,EAChD,iBAAoC;QAF9C;;;;mBAAU,OAAO;WAAY;QAC7B;;;;mBAAU,aAAa;WAAmC;QAC1D;;;;mBAAU,iBAAiB;WAAmB;IAC7C,CAAC;IAOJ,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,EAAE,CAAA;IACzB,CAAC;IAES,gBAAgB;QACxB,OAAO,OAAO,CACZ,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CACxE,CAAA;IACH,CAAC;CACF;AAzBD,sCAyBC"}
|
|
1
|
+
{"version":3,"file":"content-tagger.js","sourceRoot":"","sources":["../../src/tag-service/content-tagger.ts"],"names":[],"mappings":";;;AAIA,MAAsB,aAAa;IACjC,YACY,OAAmB,EACnB,aAAgD,EAChD,iBAAoC;QAF9C;;;;mBAAU,OAAO;WAAY;QAC7B;;;;mBAAU,aAAa;WAAmC;QAC1D;;;;mBAAU,iBAAiB;WAAmB;IAC7C,CAAC;IAOJ,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,EAAE,CAAA;IACzB,CAAC;IAES,gBAAgB;QACxB,OAAO,OAAO,CACZ,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CACxE,CAAA;IACH,CAAC;CACF;AAzBD,sCAyBC","sourcesContent":["import { ModerationService } from '../mod-service'\nimport { ModSubject } from '../mod-service/subject'\nimport { ModerationSubjectStatusRow } from '../mod-service/types'\n\nexport abstract class ContentTagger {\n constructor(\n protected subject: ModSubject,\n protected subjectStatus: ModerationSubjectStatusRow | null,\n protected moderationService: ModerationService,\n ) {}\n\n protected abstract tagPrefix: string\n\n protected abstract isApplicable(): boolean\n protected abstract buildTags(): Promise<string[]>\n\n async getTags(): Promise<string[]> {\n if (!this.isApplicable()) {\n return []\n }\n\n return this.buildTags()\n }\n\n protected tagAlreadyExists(): boolean {\n return Boolean(\n this.subjectStatus?.tags?.some((tag) => tag.startsWith(this.tagPrefix)),\n )\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embed-tagger.js","sourceRoot":"","sources":["../../src/tag-service/embed-tagger.ts"],"names":[],"mappings":";;;AAAA,sCAMqB;AACrB,kDAAyC;AACzC,sCAA6C;AAC7C,qDAAgD;AAEhD,MAAa,WAAY,SAAQ,8BAAa;IAA9C;;QACE;;;;mBAAY,QAAQ;WAAA;IAyDtB,CAAC;IAvDC,YAAY;QACV,OAAO,CACL,CAAC,CAAC,IAAI,CAAC,aAAa;YACpB,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACxB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,KAAK,cAAG,CAAC,eAAe,CAC1D,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;YAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAA;YACX,CAAC;YACD,MAAM,IAAI,GAAa,EAAE,CAAA;YACzB,MAAM,MAAM,GAAG,qBAAe,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;YAE1D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,YAAY,GAAG,iCAA2B,CAAC,MAAM,CACrD,MAAM,CAAC,KAAK,CAAC,KAAK,CACnB;oBACC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK;oBAC1B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA;gBAEtB,IAAI,wBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,OAAO,CAAC,CAAA;gBACrC,CAAC;gBAED,IAAI,uBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,OAAO,CAAC,CAAA;gBACrC,CAAC;gBAED,IAAI,0BAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,UAAU,CAAC,CAAA;gBACxC,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mBAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,4BAA4B,CAAC,CAAA;YACvE,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC;YAClE,IAAI,CAAC,OAAO;SACb,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChD,OAAO,MAAM,EAAE,KAAK,CAAA;IACtB,CAAC;CACF;AA1DD,kCA0DC"}
|
|
1
|
+
{"version":3,"file":"embed-tagger.js","sourceRoot":"","sources":["../../src/tag-service/embed-tagger.ts"],"names":[],"mappings":";;;AAAA,sCAMqB;AACrB,kDAAyC;AACzC,sCAA6C;AAC7C,qDAAgD;AAEhD,MAAa,WAAY,SAAQ,8BAAa;IAA9C;;QACE;;;;mBAAY,QAAQ;WAAA;IAyDtB,CAAC;IAvDC,YAAY;QACV,OAAO,CACL,CAAC,CAAC,IAAI,CAAC,aAAa;YACpB,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACxB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,KAAK,cAAG,CAAC,eAAe,CAC1D,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;YAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAA;YACX,CAAC;YACD,MAAM,IAAI,GAAa,EAAE,CAAA;YACzB,MAAM,MAAM,GAAG,qBAAe,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;YAE1D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,YAAY,GAAG,iCAA2B,CAAC,MAAM,CACrD,MAAM,CAAC,KAAK,CAAC,KAAK,CACnB;oBACC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK;oBAC1B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA;gBAEtB,IAAI,wBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,OAAO,CAAC,CAAA;gBACrC,CAAC;gBAED,IAAI,uBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,OAAO,CAAC,CAAA;gBACrC,CAAC;gBAED,IAAI,0BAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,UAAU,CAAC,CAAA;gBACxC,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mBAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,4BAA4B,CAAC,CAAA;YACvE,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC;YAClE,IAAI,CAAC,OAAO;SACb,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChD,OAAO,MAAM,EAAE,KAAK,CAAA;IACtB,CAAC;CACF;AA1DD,kCA0DC","sourcesContent":["import {\n AppBskyEmbedExternal,\n AppBskyEmbedImages,\n AppBskyEmbedRecordWithMedia,\n AppBskyEmbedVideo,\n AppBskyFeedPost,\n} from '@atproto/api'\nimport { ids } from '../lexicon/lexicons'\nimport { langLogger as log } from '../logger'\nimport { ContentTagger } from './content-tagger'\n\nexport class EmbedTagger extends ContentTagger {\n tagPrefix = 'embed:'\n\n isApplicable(): boolean {\n return (\n !!this.subjectStatus &&\n !this.tagAlreadyExists() &&\n this.subject.isRecord() &&\n this.subject.parsedUri.collection === ids.AppBskyFeedPost\n )\n }\n\n async buildTags(): Promise<string[]> {\n try {\n const recordValue = await this.getRecordValue()\n if (!recordValue) {\n return []\n }\n const tags: string[] = []\n const result = AppBskyFeedPost.validateRecord(recordValue)\n\n if (result.success) {\n const embedContent = AppBskyEmbedRecordWithMedia.isMain(\n result.value.embed,\n )\n ? result.value.embed.media\n : result.value.embed\n\n if (AppBskyEmbedImages.isMain(embedContent)) {\n tags.push(`${this.tagPrefix}image`)\n }\n\n if (AppBskyEmbedVideo.isMain(embedContent)) {\n tags.push(`${this.tagPrefix}video`)\n }\n\n if (AppBskyEmbedExternal.isMain(embedContent)) {\n tags.push(`${this.tagPrefix}external`)\n }\n }\n return tags\n } catch (err) {\n log.error({ subject: this.subject, err }, 'Error getting record langs')\n return []\n }\n }\n\n async getRecordValue(): Promise<Record<string, unknown> | undefined> {\n if (!this.subject.isRecord()) {\n return undefined\n }\n const recordByUri = await this.moderationService.views.fetchRecords([\n this.subject,\n ])\n\n const record = recordByUri.get(this.subject.uri)\n return record?.value\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tag-service/index.ts"],"names":[],"mappings":";;;AAAA,sCAA6C;AAK7C,iDAA4C;AAC5C,uDAAkD;AAElD,MAAa,UAAU;IAGrB,YACU,OAAmB,EACjB,aAAgD,EAClD,SAAiB,EACjB,iBAAoC;QAH5C;;;;mBAAQ,OAAO;WAAY;QAC3B;;;;mBAAU,aAAa;WAAmC;QAC1D;;;;mBAAQ,SAAS;WAAQ;QACzB;;;;mBAAQ,iBAAiB;WAAmB;QANtC;;;;;WAAwB;QAQ9B,IAAI,CAAC,OAAO,GAAG;YACb,IAAI,gCAAc,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,CAAC;YAC7D,IAAI,0BAAW,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,CAAC;YAC1D,6BAA6B;SAC9B,CAAA;IACH,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,kBAAkB,CAAC,WAA8B;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;YAEjC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;oBACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;oBAClB,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,wDAAwD;oBACxD,mBAAG,CAAC,KAAK,CACP,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EACjC,uBAAuB,CACxB,CAAA;gBACH,CAAC;YACH,CAAC,CAAC,CACH,CAAA;YAED,qEAAqE;YACrE,wEAAwE;YACxE,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;oBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAClB,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;oBACpC,KAAK,EAAE;wBACL,KAAK,EAAE,yCAAyC;wBAChD,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;wBACd,MAAM,EAAE,EAAE;qBACX;oBACD,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mBAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;CACF;AA7DD,gCA6DC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tag-service/index.ts"],"names":[],"mappings":";;;AAAA,sCAA6C;AAK7C,iDAA4C;AAC5C,uDAAkD;AAElD,MAAa,UAAU;IAGrB,YACU,OAAmB,EACjB,aAAgD,EAClD,SAAiB,EACjB,iBAAoC;QAH5C;;;;mBAAQ,OAAO;WAAY;QAC3B;;;;mBAAU,aAAa;WAAmC;QAC1D;;;;mBAAQ,SAAS;WAAQ;QACzB;;;;mBAAQ,iBAAiB;WAAmB;QANtC;;;;;WAAwB;QAQ9B,IAAI,CAAC,OAAO,GAAG;YACb,IAAI,gCAAc,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,CAAC;YAC7D,IAAI,0BAAW,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,CAAC;YAC1D,6BAA6B;SAC9B,CAAA;IACH,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,kBAAkB,CAAC,WAA8B;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;YAEjC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;oBACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;oBAClB,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,wDAAwD;oBACxD,mBAAG,CAAC,KAAK,CACP,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EACjC,uBAAuB,CACxB,CAAA;gBACH,CAAC;YACH,CAAC,CAAC,CACH,CAAA;YAED,qEAAqE;YACrE,wEAAwE;YACxE,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;oBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAClB,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;oBACpC,KAAK,EAAE;wBACL,KAAK,EAAE,yCAAyC;wBAChD,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;wBACd,MAAM,EAAE,EAAE;qBACX;oBACD,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mBAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;CACF;AA7DD,gCA6DC","sourcesContent":["import { langLogger as log } from '../logger'\nimport { ModerationService } from '../mod-service'\nimport { ModSubject } from '../mod-service/subject'\nimport { ModerationSubjectStatusRow } from '../mod-service/types'\nimport { ContentTagger } from './content-tagger'\nimport { EmbedTagger } from './embed-tagger'\nimport { LanguageTagger } from './language-tagger'\n\nexport class TagService {\n private taggers: ContentTagger[]\n\n constructor(\n private subject: ModSubject,\n protected subjectStatus: ModerationSubjectStatusRow | null,\n private taggerDid: string,\n private moderationService: ModerationService,\n ) {\n this.taggers = [\n new LanguageTagger(subject, subjectStatus, moderationService),\n new EmbedTagger(subject, subjectStatus, moderationService),\n // Add more taggers as needed\n ]\n }\n\n // Allow the caller to seed the initial tags\n async evaluateForSubject(initialTags?: Iterable<string>) {\n try {\n const tags = new Set(initialTags)\n\n await Promise.all(\n this.taggers.map(async (tagger) => {\n try {\n const newTags = await tagger.getTags()\n for (const newTag of newTags) {\n tags.add(newTag)\n }\n } catch (e) {\n // Don't let one tagger error stop the rest from running\n log.error(\n { subject: this.subject, err: e },\n 'Error applying tagger',\n )\n }\n }),\n )\n\n // Ensure that before inserting new tags, we discard any tag that may\n // have been evaluated to be added but is already present in the subject\n if (this.subjectStatus?.tags?.length) {\n for (const tag of this.subjectStatus.tags) {\n tags.delete(tag)\n }\n }\n\n if (tags.size) {\n await this.moderationService.logEvent({\n event: {\n $type: 'tools.ozone.moderation.defs#modEventTag',\n add: [...tags],\n remove: [],\n },\n subject: this.subject,\n createdBy: this.taggerDid,\n })\n }\n } catch (err) {\n log.error({ subject: this.subject, err }, 'Error tagging subject')\n }\n }\n}\n"]}
|