From 07f11d3e0c46739bea93415fcd1439be35a6a266 Mon Sep 17 00:00:00 2001 From: bnewbold Date: Tue, 14 Jan 2025 22:21:09 -0800 Subject: [PATCH 001/101] lexicon schema for lexicon schema records (meta) (#3286) * lexicon schema for lexicon schema records (meta) * defs are object/unknown, not array * simplify just to 'lexicon' field * codegen lexicon schema --- lexicons/com/atproto/lexicon/schema.json | 21 +++++ packages/api/src/client/index.ts | 79 +++++++++++++++++++ packages/api/src/client/lexicons.ts | 24 ++++++ .../types/com/atproto/lexicon/schema.ts | 26 ++++++ packages/bsky/src/lexicon/index.ts | 10 +++ packages/bsky/src/lexicon/lexicons.ts | 24 ++++++ .../types/com/atproto/lexicon/schema.ts | 26 ++++++ packages/ozone/src/lexicon/index.ts | 10 +++ packages/ozone/src/lexicon/lexicons.ts | 24 ++++++ .../types/com/atproto/lexicon/schema.ts | 26 ++++++ packages/pds/src/lexicon/index.ts | 10 +++ packages/pds/src/lexicon/lexicons.ts | 24 ++++++ .../types/com/atproto/lexicon/schema.ts | 26 ++++++ 13 files changed, 330 insertions(+) create mode 100644 lexicons/com/atproto/lexicon/schema.json create mode 100644 packages/api/src/client/types/com/atproto/lexicon/schema.ts create mode 100644 packages/bsky/src/lexicon/types/com/atproto/lexicon/schema.ts create mode 100644 packages/ozone/src/lexicon/types/com/atproto/lexicon/schema.ts create mode 100644 packages/pds/src/lexicon/types/com/atproto/lexicon/schema.ts diff --git a/lexicons/com/atproto/lexicon/schema.json b/lexicons/com/atproto/lexicon/schema.json new file mode 100644 index 00000000000..e79337ba6dc --- /dev/null +++ b/lexicons/com/atproto/lexicon/schema.json @@ -0,0 +1,21 @@ +{ + "lexicon": 1, + "id": "com.atproto.lexicon.schema", + "defs": { + "main": { + "type": "record", + "description": "Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc).", + "key": "nsid", + "record": { + "type": "object", + "required": ["lexicon"], + "properties": { + "lexicon": { + "type": "integer", + "description": "Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system." + } + } + } + } + } +} diff --git a/packages/api/src/client/index.ts b/packages/api/src/client/index.ts index f9cd36fafae..fcced108ca1 100644 --- a/packages/api/src/client/index.ts +++ b/packages/api/src/client/index.ts @@ -28,6 +28,7 @@ import * as ComAtprotoIdentityUpdateHandle from './types/com/atproto/identity/up import * as ComAtprotoLabelDefs from './types/com/atproto/label/defs' import * as ComAtprotoLabelQueryLabels from './types/com/atproto/label/queryLabels' import * as ComAtprotoLabelSubscribeLabels from './types/com/atproto/label/subscribeLabels' +import * as ComAtprotoLexiconSchema from './types/com/atproto/lexicon/schema' import * as ComAtprotoModerationCreateReport from './types/com/atproto/moderation/createReport' import * as ComAtprotoModerationDefs from './types/com/atproto/moderation/defs' import * as ComAtprotoRepoApplyWrites from './types/com/atproto/repo/applyWrites' @@ -256,6 +257,7 @@ export * as ComAtprotoIdentityUpdateHandle from './types/com/atproto/identity/up export * as ComAtprotoLabelDefs from './types/com/atproto/label/defs' export * as ComAtprotoLabelQueryLabels from './types/com/atproto/label/queryLabels' export * as ComAtprotoLabelSubscribeLabels from './types/com/atproto/label/subscribeLabels' +export * as ComAtprotoLexiconSchema from './types/com/atproto/lexicon/schema' export * as ComAtprotoModerationCreateReport from './types/com/atproto/moderation/createReport' export * as ComAtprotoModerationDefs from './types/com/atproto/moderation/defs' export * as ComAtprotoRepoApplyWrites from './types/com/atproto/repo/applyWrites' @@ -535,6 +537,7 @@ export class ComAtprotoNS { admin: ComAtprotoAdminNS identity: ComAtprotoIdentityNS label: ComAtprotoLabelNS + lexicon: ComAtprotoLexiconNS moderation: ComAtprotoModerationNS repo: ComAtprotoRepoNS server: ComAtprotoServerNS @@ -546,6 +549,7 @@ export class ComAtprotoNS { this.admin = new ComAtprotoAdminNS(client) this.identity = new ComAtprotoIdentityNS(client) this.label = new ComAtprotoLabelNS(client) + this.lexicon = new ComAtprotoLexiconNS(client) this.moderation = new ComAtprotoModerationNS(client) this.repo = new ComAtprotoRepoNS(client) this.server = new ComAtprotoServerNS(client) @@ -830,6 +834,81 @@ export class ComAtprotoLabelNS { } } +export class ComAtprotoLexiconNS { + _client: XrpcClient + schema: SchemaRecord + + constructor(client: XrpcClient) { + this._client = client + this.schema = new SchemaRecord(client) + } +} + +export class SchemaRecord { + _client: XrpcClient + + constructor(client: XrpcClient) { + this._client = client + } + + async list( + params: Omit, + ): Promise<{ + cursor?: string + records: { uri: string; value: ComAtprotoLexiconSchema.Record }[] + }> { + const res = await this._client.call('com.atproto.repo.listRecords', { + collection: 'com.atproto.lexicon.schema', + ...params, + }) + return res.data + } + + async get( + params: Omit, + ): Promise<{ + uri: string + cid: string + value: ComAtprotoLexiconSchema.Record + }> { + const res = await this._client.call('com.atproto.repo.getRecord', { + collection: 'com.atproto.lexicon.schema', + ...params, + }) + return res.data + } + + async create( + params: Omit< + ComAtprotoRepoCreateRecord.InputSchema, + 'collection' | 'record' + >, + record: ComAtprotoLexiconSchema.Record, + headers?: Record, + ): Promise<{ uri: string; cid: string }> { + record.$type = 'com.atproto.lexicon.schema' + const res = await this._client.call( + 'com.atproto.repo.createRecord', + undefined, + { collection: 'com.atproto.lexicon.schema', ...params, record }, + { encoding: 'application/json', headers }, + ) + return res.data + } + + async delete( + params: Omit, + headers?: Record, + ): Promise { + await this._client.call( + 'com.atproto.repo.deleteRecord', + undefined, + { collection: 'com.atproto.lexicon.schema', ...params }, + { headers }, + ) + } +} + export class ComAtprotoModerationNS { _client: XrpcClient diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index ececcfe4481..260fce3a522 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -1122,6 +1122,29 @@ export const schemaDict = { }, }, }, + ComAtprotoLexiconSchema: { + lexicon: 1, + id: 'com.atproto.lexicon.schema', + defs: { + main: { + type: 'record', + description: + "Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc).", + key: 'nsid', + record: { + type: 'object', + required: ['lexicon'], + properties: { + lexicon: { + type: 'integer', + description: + "Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system.", + }, + }, + }, + }, + }, + }, ComAtprotoModerationCreateReport: { lexicon: 1, id: 'com.atproto.moderation.createReport', @@ -13644,6 +13667,7 @@ export const ids = { ComAtprotoLabelDefs: 'com.atproto.label.defs', ComAtprotoLabelQueryLabels: 'com.atproto.label.queryLabels', ComAtprotoLabelSubscribeLabels: 'com.atproto.label.subscribeLabels', + ComAtprotoLexiconSchema: 'com.atproto.lexicon.schema', ComAtprotoModerationCreateReport: 'com.atproto.moderation.createReport', ComAtprotoModerationDefs: 'com.atproto.moderation.defs', ComAtprotoRepoApplyWrites: 'com.atproto.repo.applyWrites', diff --git a/packages/api/src/client/types/com/atproto/lexicon/schema.ts b/packages/api/src/client/types/com/atproto/lexicon/schema.ts new file mode 100644 index 00000000000..f2755960224 --- /dev/null +++ b/packages/api/src/client/types/com/atproto/lexicon/schema.ts @@ -0,0 +1,26 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { isObj, hasProp } from '../../../../util' +import { lexicons } from '../../../../lexicons' +import { CID } from 'multiformats/cid' + +export interface Record { + /** Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system. */ + lexicon: number + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'com.atproto.lexicon.schema#main' || + v.$type === 'com.atproto.lexicon.schema') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('com.atproto.lexicon.schema#main', v) +} diff --git a/packages/bsky/src/lexicon/index.ts b/packages/bsky/src/lexicon/index.ts index 63c34ee6e8c..89ee5f3b2fa 100644 --- a/packages/bsky/src/lexicon/index.ts +++ b/packages/bsky/src/lexicon/index.ts @@ -227,6 +227,7 @@ export class ComAtprotoNS { admin: ComAtprotoAdminNS identity: ComAtprotoIdentityNS label: ComAtprotoLabelNS + lexicon: ComAtprotoLexiconNS moderation: ComAtprotoModerationNS repo: ComAtprotoRepoNS server: ComAtprotoServerNS @@ -238,6 +239,7 @@ export class ComAtprotoNS { this.admin = new ComAtprotoAdminNS(server) this.identity = new ComAtprotoIdentityNS(server) this.label = new ComAtprotoLabelNS(server) + this.lexicon = new ComAtprotoLexiconNS(server) this.moderation = new ComAtprotoModerationNS(server) this.repo = new ComAtprotoRepoNS(server) this.server = new ComAtprotoServerNS(server) @@ -516,6 +518,14 @@ export class ComAtprotoLabelNS { } } +export class ComAtprotoLexiconNS { + _server: Server + + constructor(server: Server) { + this._server = server + } +} + export class ComAtprotoModerationNS { _server: Server diff --git a/packages/bsky/src/lexicon/lexicons.ts b/packages/bsky/src/lexicon/lexicons.ts index 28191074e8c..66b737dc760 100644 --- a/packages/bsky/src/lexicon/lexicons.ts +++ b/packages/bsky/src/lexicon/lexicons.ts @@ -1122,6 +1122,29 @@ export const schemaDict = { }, }, }, + ComAtprotoLexiconSchema: { + lexicon: 1, + id: 'com.atproto.lexicon.schema', + defs: { + main: { + type: 'record', + description: + "Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc).", + key: 'nsid', + record: { + type: 'object', + required: ['lexicon'], + properties: { + lexicon: { + type: 'integer', + description: + "Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system.", + }, + }, + }, + }, + }, + }, ComAtprotoModerationCreateReport: { lexicon: 1, id: 'com.atproto.moderation.createReport', @@ -10844,6 +10867,7 @@ export const ids = { ComAtprotoLabelDefs: 'com.atproto.label.defs', ComAtprotoLabelQueryLabels: 'com.atproto.label.queryLabels', ComAtprotoLabelSubscribeLabels: 'com.atproto.label.subscribeLabels', + ComAtprotoLexiconSchema: 'com.atproto.lexicon.schema', ComAtprotoModerationCreateReport: 'com.atproto.moderation.createReport', ComAtprotoModerationDefs: 'com.atproto.moderation.defs', ComAtprotoRepoApplyWrites: 'com.atproto.repo.applyWrites', diff --git a/packages/bsky/src/lexicon/types/com/atproto/lexicon/schema.ts b/packages/bsky/src/lexicon/types/com/atproto/lexicon/schema.ts new file mode 100644 index 00000000000..fbb12809710 --- /dev/null +++ b/packages/bsky/src/lexicon/types/com/atproto/lexicon/schema.ts @@ -0,0 +1,26 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface Record { + /** Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system. */ + lexicon: number + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'com.atproto.lexicon.schema#main' || + v.$type === 'com.atproto.lexicon.schema') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('com.atproto.lexicon.schema#main', v) +} diff --git a/packages/ozone/src/lexicon/index.ts b/packages/ozone/src/lexicon/index.ts index 951724c0fe9..e5015348f6c 100644 --- a/packages/ozone/src/lexicon/index.ts +++ b/packages/ozone/src/lexicon/index.ts @@ -270,6 +270,7 @@ export class ComAtprotoNS { admin: ComAtprotoAdminNS identity: ComAtprotoIdentityNS label: ComAtprotoLabelNS + lexicon: ComAtprotoLexiconNS moderation: ComAtprotoModerationNS repo: ComAtprotoRepoNS server: ComAtprotoServerNS @@ -281,6 +282,7 @@ export class ComAtprotoNS { this.admin = new ComAtprotoAdminNS(server) this.identity = new ComAtprotoIdentityNS(server) this.label = new ComAtprotoLabelNS(server) + this.lexicon = new ComAtprotoLexiconNS(server) this.moderation = new ComAtprotoModerationNS(server) this.repo = new ComAtprotoRepoNS(server) this.server = new ComAtprotoServerNS(server) @@ -559,6 +561,14 @@ export class ComAtprotoLabelNS { } } +export class ComAtprotoLexiconNS { + _server: Server + + constructor(server: Server) { + this._server = server + } +} + export class ComAtprotoModerationNS { _server: Server diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index ececcfe4481..260fce3a522 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -1122,6 +1122,29 @@ export const schemaDict = { }, }, }, + ComAtprotoLexiconSchema: { + lexicon: 1, + id: 'com.atproto.lexicon.schema', + defs: { + main: { + type: 'record', + description: + "Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc).", + key: 'nsid', + record: { + type: 'object', + required: ['lexicon'], + properties: { + lexicon: { + type: 'integer', + description: + "Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system.", + }, + }, + }, + }, + }, + }, ComAtprotoModerationCreateReport: { lexicon: 1, id: 'com.atproto.moderation.createReport', @@ -13644,6 +13667,7 @@ export const ids = { ComAtprotoLabelDefs: 'com.atproto.label.defs', ComAtprotoLabelQueryLabels: 'com.atproto.label.queryLabels', ComAtprotoLabelSubscribeLabels: 'com.atproto.label.subscribeLabels', + ComAtprotoLexiconSchema: 'com.atproto.lexicon.schema', ComAtprotoModerationCreateReport: 'com.atproto.moderation.createReport', ComAtprotoModerationDefs: 'com.atproto.moderation.defs', ComAtprotoRepoApplyWrites: 'com.atproto.repo.applyWrites', diff --git a/packages/ozone/src/lexicon/types/com/atproto/lexicon/schema.ts b/packages/ozone/src/lexicon/types/com/atproto/lexicon/schema.ts new file mode 100644 index 00000000000..fbb12809710 --- /dev/null +++ b/packages/ozone/src/lexicon/types/com/atproto/lexicon/schema.ts @@ -0,0 +1,26 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface Record { + /** Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system. */ + lexicon: number + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'com.atproto.lexicon.schema#main' || + v.$type === 'com.atproto.lexicon.schema') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('com.atproto.lexicon.schema#main', v) +} diff --git a/packages/pds/src/lexicon/index.ts b/packages/pds/src/lexicon/index.ts index 951724c0fe9..e5015348f6c 100644 --- a/packages/pds/src/lexicon/index.ts +++ b/packages/pds/src/lexicon/index.ts @@ -270,6 +270,7 @@ export class ComAtprotoNS { admin: ComAtprotoAdminNS identity: ComAtprotoIdentityNS label: ComAtprotoLabelNS + lexicon: ComAtprotoLexiconNS moderation: ComAtprotoModerationNS repo: ComAtprotoRepoNS server: ComAtprotoServerNS @@ -281,6 +282,7 @@ export class ComAtprotoNS { this.admin = new ComAtprotoAdminNS(server) this.identity = new ComAtprotoIdentityNS(server) this.label = new ComAtprotoLabelNS(server) + this.lexicon = new ComAtprotoLexiconNS(server) this.moderation = new ComAtprotoModerationNS(server) this.repo = new ComAtprotoRepoNS(server) this.server = new ComAtprotoServerNS(server) @@ -559,6 +561,14 @@ export class ComAtprotoLabelNS { } } +export class ComAtprotoLexiconNS { + _server: Server + + constructor(server: Server) { + this._server = server + } +} + export class ComAtprotoModerationNS { _server: Server diff --git a/packages/pds/src/lexicon/lexicons.ts b/packages/pds/src/lexicon/lexicons.ts index ececcfe4481..260fce3a522 100644 --- a/packages/pds/src/lexicon/lexicons.ts +++ b/packages/pds/src/lexicon/lexicons.ts @@ -1122,6 +1122,29 @@ export const schemaDict = { }, }, }, + ComAtprotoLexiconSchema: { + lexicon: 1, + id: 'com.atproto.lexicon.schema', + defs: { + main: { + type: 'record', + description: + "Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc).", + key: 'nsid', + record: { + type: 'object', + required: ['lexicon'], + properties: { + lexicon: { + type: 'integer', + description: + "Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system.", + }, + }, + }, + }, + }, + }, ComAtprotoModerationCreateReport: { lexicon: 1, id: 'com.atproto.moderation.createReport', @@ -13644,6 +13667,7 @@ export const ids = { ComAtprotoLabelDefs: 'com.atproto.label.defs', ComAtprotoLabelQueryLabels: 'com.atproto.label.queryLabels', ComAtprotoLabelSubscribeLabels: 'com.atproto.label.subscribeLabels', + ComAtprotoLexiconSchema: 'com.atproto.lexicon.schema', ComAtprotoModerationCreateReport: 'com.atproto.moderation.createReport', ComAtprotoModerationDefs: 'com.atproto.moderation.defs', ComAtprotoRepoApplyWrites: 'com.atproto.repo.applyWrites', diff --git a/packages/pds/src/lexicon/types/com/atproto/lexicon/schema.ts b/packages/pds/src/lexicon/types/com/atproto/lexicon/schema.ts new file mode 100644 index 00000000000..fbb12809710 --- /dev/null +++ b/packages/pds/src/lexicon/types/com/atproto/lexicon/schema.ts @@ -0,0 +1,26 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { ValidationResult, BlobRef } from '@atproto/lexicon' +import { lexicons } from '../../../../lexicons' +import { isObj, hasProp } from '../../../../util' +import { CID } from 'multiformats/cid' + +export interface Record { + /** Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system. */ + lexicon: number + [k: string]: unknown +} + +export function isRecord(v: unknown): v is Record { + return ( + isObj(v) && + hasProp(v, '$type') && + (v.$type === 'com.atproto.lexicon.schema#main' || + v.$type === 'com.atproto.lexicon.schema') + ) +} + +export function validateRecord(v: unknown): ValidationResult { + return lexicons.validate('com.atproto.lexicon.schema#main', v) +} From c6c8686de4e63d331a2b6cf19dcf22b157daaa89 Mon Sep 17 00:00:00 2001 From: devin ivy Date: Wed, 15 Jan 2025 11:04:42 -0500 Subject: [PATCH 002/101] Appview: permit redirects during blob resolution (#3370) appview: permit redirects during blob resolution --- packages/bsky/src/api/blob-resolver.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/bsky/src/api/blob-resolver.ts b/packages/bsky/src/api/blob-resolver.ts index 89e4a3e716c..95dc8f7ba1b 100644 --- a/packages/bsky/src/api/blob-resolver.ts +++ b/packages/bsky/src/api/blob-resolver.ts @@ -193,6 +193,7 @@ export async function streamBlob( path: url.pathname + url.search, headers, signal: options.signal, + maxRedirections: 10, }, (upstream) => { headersReceived = true From 0832a377d269584a906d5062ebb5e2e6307f9c61 Mon Sep 17 00:00:00 2001 From: rafael Date: Wed, 15 Jan 2025 13:43:16 -0300 Subject: [PATCH 003/101] Allow resetting a route's rate limits (#3348) --- .changeset/early-keys-fetch.md | 5 ++ packages/xrpc-server/src/rate-limiter.ts | 25 +++++++ packages/xrpc-server/src/server.ts | 70 ++++++++++++------- packages/xrpc-server/src/types.ts | 7 ++ .../xrpc-server/tests/rate-limiter.test.ts | 50 +++++++++++++ 5 files changed, 133 insertions(+), 24 deletions(-) create mode 100644 .changeset/early-keys-fetch.md diff --git a/.changeset/early-keys-fetch.md b/.changeset/early-keys-fetch.md new file mode 100644 index 00000000000..62e65092232 --- /dev/null +++ b/.changeset/early-keys-fetch.md @@ -0,0 +1,5 @@ +--- +"@atproto/xrpc-server": patch +--- + +Add resetRouteRateLimits to req context diff --git a/packages/xrpc-server/src/rate-limiter.ts b/packages/xrpc-server/src/rate-limiter.ts index fa7fd8b0987..d63458c92ad 100644 --- a/packages/xrpc-server/src/rate-limiter.ts +++ b/packages/xrpc-server/src/rate-limiter.ts @@ -10,6 +10,7 @@ import { CalcPointsFn, RateLimitExceededError, RateLimiterConsume, + RateLimiterReset, RateLimiterI, RateLimiterStatus, XRPCReqContext, @@ -109,6 +110,22 @@ export class RateLimiter implements RateLimiterI { } } } + + async reset( + ctx: XRPCReqContext, + opts?: { calcKey?: CalcKeyFn }, + ): Promise { + const key = opts?.calcKey ? opts.calcKey(ctx) : this.calcKey(ctx) + if (key === null) { + return + } + + try { + await this.limiter.delete(key) + } catch (err) { + throw new Error(`rate limiter failed to reset key: ${key}`) + } + } } export const formatLimiterStatus = ( @@ -143,6 +160,14 @@ export const consumeMany = async ( } } +export const resetMany = async ( + ctx: XRPCReqContext, + fns: RateLimiterReset[], +): Promise => { + if (fns.length === 0) return + await Promise.all(fns.map((fn) => fn(ctx))) +} + export const setResHeaders = ( ctx: XRPCReqContext, status: RateLimiterStatus, diff --git a/packages/xrpc-server/src/server.ts b/packages/xrpc-server/src/server.ts index d3ca5d7ae19..0ccb8d9db3b 100644 --- a/packages/xrpc-server/src/server.ts +++ b/packages/xrpc-server/src/server.ts @@ -21,7 +21,7 @@ import { Readable } from 'node:stream' import { pipeline } from 'node:stream/promises' import log from './logger' -import { consumeMany } from './rate-limiter' +import { consumeMany, resetMany } from './rate-limiter' import { ErrorFrame, Frame, MessageFrame, XrpcStreamServer } from './stream' import { AuthVerifier, @@ -37,7 +37,6 @@ import { MethodNotImplementedError, Options, Params, - RateLimiterConsume, RateLimiterI, RateLimitExceededError, XRPCError, @@ -67,7 +66,7 @@ export class Server { middleware: Record<'json' | 'text', RequestHandler> globalRateLimiters: RateLimiterI[] sharedRateLimiters: Record - routeRateLimiterFns: Record + routeRateLimiters: Record constructor(lexicons?: LexiconDoc[], opts?: Options) { if (lexicons) { @@ -86,7 +85,7 @@ export class Server { } this.globalRateLimiters = [] this.sharedRateLimiters = {} - this.routeRateLimiterFns = {} + this.routeRateLimiters = {} if (opts?.rateLimits?.global) { for (const limit of opts.rateLimits.global) { const rateLimiter = opts.rateLimits.creator({ @@ -195,6 +194,7 @@ export class Server { auth: undefined, params: {}, input: undefined, + async resetRouteRateLimits() {}, }, this.globalRateLimiters.map( (rl) => (ctx: XRPCReqContext) => rl.consume(ctx), @@ -250,9 +250,18 @@ export class Server { validateOutput(nsid, def, output, this.lex) const assertValidXrpcParams = (params: unknown) => this.lex.assertValidXrpcParams(nsid, params) - const rlFns = this.routeRateLimiterFns[nsid] ?? [] + const rls = this.routeRateLimiters[nsid] ?? [] const consumeRateLimit = (reqCtx: XRPCReqContext) => - consumeMany(reqCtx, rlFns) + consumeMany( + reqCtx, + rls.map((rl) => (ctx: XRPCReqContext) => rl.consume(ctx)), + ) + + const resetRateLimit = (reqCtx: XRPCReqContext) => + resetMany( + reqCtx, + rls.map((rl) => (ctx: XRPCReqContext) => rl.reset(ctx)), + ) return async function (req, res, next) { try { @@ -273,6 +282,9 @@ export class Server { auth: locals.auth, req, res, + async resetRouteRateLimits() { + return resetRateLimit(this) + }, } // handle rate limits @@ -422,31 +434,36 @@ export class Server { } private setupRouteRateLimits(nsid: string, config: XRPCHandlerConfig) { - this.routeRateLimiterFns[nsid] = [] + this.routeRateLimiters[nsid] = [] for (const limit of this.globalRateLimiters) { - const consumeFn = async (ctx: XRPCReqContext) => { - return limit.consume(ctx) - } - this.routeRateLimiterFns[nsid].push(consumeFn) + this.routeRateLimiters[nsid].push({ + consume: (ctx: XRPCReqContext) => limit.consume(ctx), + reset: (ctx: XRPCReqContext) => limit.reset(ctx), + }) } if (config.rateLimit) { const limits = Array.isArray(config.rateLimit) ? config.rateLimit : [config.rateLimit] - this.routeRateLimiterFns[nsid] = [] + this.routeRateLimiters[nsid] = [] for (let i = 0; i < limits.length; i++) { const limit = limits[i] const { calcKey, calcPoints } = limit if (isShared(limit)) { const rateLimiter = this.sharedRateLimiters[limit.name] if (rateLimiter) { - const consumeFn = (ctx: XRPCReqContext) => - rateLimiter.consume(ctx, { - calcKey, - calcPoints, - }) - this.routeRateLimiterFns[nsid].push(consumeFn) + this.routeRateLimiters[nsid].push({ + consume: (ctx: XRPCReqContext) => + rateLimiter.consume(ctx, { + calcKey, + calcPoints, + }), + reset: (ctx: XRPCReqContext) => + rateLimiter.reset(ctx, { + calcKey, + }), + }) } } else { const { durationMs, points } = limit @@ -459,12 +476,17 @@ export class Server { }) if (rateLimiter) { this.sharedRateLimiters[nsid] = rateLimiter - const consumeFn = (ctx: XRPCReqContext) => - rateLimiter.consume(ctx, { - calcKey, - calcPoints, - }) - this.routeRateLimiterFns[nsid].push(consumeFn) + this.routeRateLimiters[nsid].push({ + consume: (ctx: XRPCReqContext) => + rateLimiter.consume(ctx, { + calcKey, + calcPoints, + }), + reset: (ctx: XRPCReqContext) => + rateLimiter.reset(ctx, { + calcKey, + }), + }) } } } diff --git a/packages/xrpc-server/src/types.ts b/packages/xrpc-server/src/types.ts index be56c392be9..afc68150328 100644 --- a/packages/xrpc-server/src/types.ts +++ b/packages/xrpc-server/src/types.ts @@ -99,6 +99,7 @@ export type XRPCReqContext = { input: HandlerInput | undefined req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type XRPCHandler = ( @@ -136,6 +137,7 @@ export type CalcPointsFn = (ctx: XRPCReqContext) => number export interface RateLimiterI { consume: RateLimiterConsume + reset: RateLimiterReset } export type RateLimiterConsume = ( @@ -143,6 +145,11 @@ export type RateLimiterConsume = ( opts?: { calcKey?: CalcKeyFn; calcPoints?: CalcPointsFn }, ) => Promise +export type RateLimiterReset = ( + ctx: XRPCReqContext, + opts?: { calcKey?: CalcKeyFn }, +) => Promise + export type RateLimiterCreator = (opts: { keyPrefix: string durationMs: number diff --git a/packages/xrpc-server/tests/rate-limiter.test.ts b/packages/xrpc-server/tests/rate-limiter.test.ts index 08a59d85169..e2f9dc51d10 100644 --- a/packages/xrpc-server/tests/rate-limiter.test.ts +++ b/packages/xrpc-server/tests/rate-limiter.test.ts @@ -27,6 +27,25 @@ const LEXICONS: LexiconDoc[] = [ }, }, }, + { + lexicon: 1, + id: 'io.example.routeLimitReset', + defs: { + main: { + type: 'query', + parameters: { + type: 'params', + required: ['count'], + properties: { + count: { type: 'integer' }, + }, + }, + output: { + encoding: 'application/json', + }, + }, + }, + }, { lexicon: 1, id: 'io.example.sharedLimitOne', @@ -145,7 +164,22 @@ describe('Parameters', () => { body: ctx.params, }), }) + server.method('io.example.routeLimitReset', { + rateLimit: { + durationMs: 5 * MINUTE, + points: 2, + }, + handler: (ctx: xrpcServer.XRPCReqContext) => { + if (ctx.params.count === 1) { + ctx.resetRouteRateLimits() + } + return { + encoding: 'json', + body: {}, + } + }, + }) server.method('io.example.sharedLimitOne', { rateLimit: { name: 'shared-limit', @@ -208,6 +242,22 @@ describe('Parameters', () => { await expect(makeCall).rejects.toThrow('Rate Limit Exceeded') }) + it('can reset route rate limits', async () => { + // Limit is 2. + // Call 0 is OK (1/2). + // Call 1 is OK (2/2), and resets the limit. + // Call 2 is OK (1/2). + // Call 3 is OK (2/2). + for (let i = 0; i < 4; i++) { + await client.call('io.example.routeLimitReset', { count: i }) + } + + // Call 4 exceeds the limit (3/2). + await expect( + client.call('io.example.routeLimitReset', { count: 4 }), + ).rejects.toThrow('Rate Limit Exceeded') + }) + it('rate limits on a shared route', async () => { await client.call('io.example.sharedLimitOne', { points: 1 }) await client.call('io.example.sharedLimitTwo', { points: 1 }) From fa96a997ecc5f2f515c2b8f5ac57a4bcf68efbfb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 13:58:19 -0300 Subject: [PATCH 004/101] Version packages (#3372) Co-authored-by: github-actions[bot] --- .changeset/early-keys-fetch.md | 5 ----- packages/bsky/CHANGELOG.md | 9 +++++++++ packages/bsky/package.json | 2 +- packages/dev-env/CHANGELOG.md | 11 +++++++++++ packages/dev-env/package.json | 2 +- packages/internal/xrpc-utils/CHANGELOG.md | 7 +++++++ packages/internal/xrpc-utils/package.json | 2 +- packages/ozone/CHANGELOG.md | 7 +++++++ packages/ozone/package.json | 2 +- packages/pds/CHANGELOG.md | 8 ++++++++ packages/pds/package.json | 2 +- packages/sync/CHANGELOG.md | 7 +++++++ packages/sync/package.json | 2 +- packages/xrpc-server/CHANGELOG.md | 6 ++++++ packages/xrpc-server/package.json | 2 +- 15 files changed, 62 insertions(+), 12 deletions(-) delete mode 100644 .changeset/early-keys-fetch.md diff --git a/.changeset/early-keys-fetch.md b/.changeset/early-keys-fetch.md deleted file mode 100644 index 62e65092232..00000000000 --- a/.changeset/early-keys-fetch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/xrpc-server": patch ---- - -Add resetRouteRateLimits to req context diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index b30bbb22e6a..094443d3850 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/bsky +## 0.0.107 + +### Patch Changes + +- Updated dependencies [[`0832a377d`](https://github.com/bluesky-social/atproto/commit/0832a377d269584a906d5062ebb5e2e6307f9c61)]: + - @atproto/xrpc-server@0.7.7 + - @atproto-labs/xrpc-utils@0.0.3 + - @atproto/sync@0.1.10 + ## 0.0.106 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 0f3e2032cb1..8975c6ead18 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.106", + "version": "0.0.107", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index a78e851c665..4da48580c6e 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,16 @@ # @atproto/dev-env +## 0.3.77 + +### Patch Changes + +- Updated dependencies [[`0832a377d`](https://github.com/bluesky-social/atproto/commit/0832a377d269584a906d5062ebb5e2e6307f9c61)]: + - @atproto/xrpc-server@0.7.7 + - @atproto/bsky@0.0.107 + - @atproto/ozone@0.1.68 + - @atproto/pds@0.4.85 + - @atproto/sync@0.1.10 + ## 0.3.76 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index dbefc78fa25..02ac33ad3d0 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.3.76", + "version": "0.3.77", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/internal/xrpc-utils/CHANGELOG.md b/packages/internal/xrpc-utils/CHANGELOG.md index 01d8db20a22..96636b07e52 100644 --- a/packages/internal/xrpc-utils/CHANGELOG.md +++ b/packages/internal/xrpc-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto-labs/xrpc-utils +## 0.0.3 + +### Patch Changes + +- Updated dependencies [[`0832a377d`](https://github.com/bluesky-social/atproto/commit/0832a377d269584a906d5062ebb5e2e6307f9c61)]: + - @atproto/xrpc-server@0.7.7 + ## 0.0.2 ### Patch Changes diff --git a/packages/internal/xrpc-utils/package.json b/packages/internal/xrpc-utils/package.json index 8608c6d0bb2..a4d17fa6700 100644 --- a/packages/internal/xrpc-utils/package.json +++ b/packages/internal/xrpc-utils/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/xrpc-utils", - "version": "0.0.2", + "version": "0.0.3", "license": "MIT", "description": "XRPC server utilities for Node.JS", "keywords": [ diff --git a/packages/ozone/CHANGELOG.md b/packages/ozone/CHANGELOG.md index 8d3a3f17cc5..8cc0d1d310c 100644 --- a/packages/ozone/CHANGELOG.md +++ b/packages/ozone/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/ozone +## 0.1.68 + +### Patch Changes + +- Updated dependencies [[`0832a377d`](https://github.com/bluesky-social/atproto/commit/0832a377d269584a906d5062ebb5e2e6307f9c61)]: + - @atproto/xrpc-server@0.7.7 + ## 0.1.67 ### Patch Changes diff --git a/packages/ozone/package.json b/packages/ozone/package.json index 7d45930b37d..56dc02b0be3 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ozone", - "version": "0.1.67", + "version": "0.1.68", "license": "MIT", "description": "Backend service for moderating the Bluesky network.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index fa7455c5050..f042ffa12cc 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/pds +## 0.4.85 + +### Patch Changes + +- Updated dependencies [[`0832a377d`](https://github.com/bluesky-social/atproto/commit/0832a377d269584a906d5062ebb5e2e6307f9c61)]: + - @atproto/xrpc-server@0.7.7 + - @atproto-labs/xrpc-utils@0.0.3 + ## 0.4.84 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index ab8d863b89c..67c5c987eeb 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.84", + "version": "0.4.85", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ diff --git a/packages/sync/CHANGELOG.md b/packages/sync/CHANGELOG.md index da16c3d9a8c..ded9e3892b9 100644 --- a/packages/sync/CHANGELOG.md +++ b/packages/sync/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/sync +## 0.1.10 + +### Patch Changes + +- Updated dependencies [[`0832a377d`](https://github.com/bluesky-social/atproto/commit/0832a377d269584a906d5062ebb5e2e6307f9c61)]: + - @atproto/xrpc-server@0.7.7 + ## 0.1.9 ### Patch Changes diff --git a/packages/sync/package.json b/packages/sync/package.json index a679b65cad9..eb83470c661 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/sync", - "version": "0.1.9", + "version": "0.1.10", "license": "MIT", "description": "atproto sync library", "keywords": [ diff --git a/packages/xrpc-server/CHANGELOG.md b/packages/xrpc-server/CHANGELOG.md index cc0a4c0a038..d99b9b5cfb9 100644 --- a/packages/xrpc-server/CHANGELOG.md +++ b/packages/xrpc-server/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/xrpc-server +## 0.7.7 + +### Patch Changes + +- [#3348](https://github.com/bluesky-social/atproto/pull/3348) [`0832a377d`](https://github.com/bluesky-social/atproto/commit/0832a377d269584a906d5062ebb5e2e6307f9c61) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add resetRouteRateLimits to req context + ## 0.7.6 ### Patch Changes diff --git a/packages/xrpc-server/package.json b/packages/xrpc-server/package.json index 475f1357e7d..8417823aff1 100644 --- a/packages/xrpc-server/package.json +++ b/packages/xrpc-server/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/xrpc-server", - "version": "0.7.6", + "version": "0.7.7", "license": "MIT", "description": "atproto HTTP API (XRPC) server library", "keywords": [ From 688ff00dded00e52e53806942de7c9088fb44dec Mon Sep 17 00:00:00 2001 From: rafael Date: Wed, 15 Jan 2025 19:34:42 -0300 Subject: [PATCH 005/101] codegen un-codegen-ed stuff on main (#3374) --- packages/api/src/client/lexicons.ts | 15 +++++++++++++++ packages/bsky/src/lexicon/lexicons.ts | 15 +++++++++++++++ packages/ozone/src/lexicon/lexicons.ts | 15 +++++++++++++++ packages/pds/src/lexicon/lexicons.ts | 15 +++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 260fce3a522..963fbee538b 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -4851,6 +4851,11 @@ export const schemaDict = { ref: 'lex:app.bsky.actor.defs#profileView', }, }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, @@ -8358,6 +8363,11 @@ export const schemaDict = { 'If true, response has fallen-back to generic results, and is not scoped using relativeToDid', default: false, }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, @@ -9429,6 +9439,11 @@ export const schemaDict = { description: 'DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer.', }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, diff --git a/packages/bsky/src/lexicon/lexicons.ts b/packages/bsky/src/lexicon/lexicons.ts index 66b737dc760..d16b479f5ef 100644 --- a/packages/bsky/src/lexicon/lexicons.ts +++ b/packages/bsky/src/lexicon/lexicons.ts @@ -4851,6 +4851,11 @@ export const schemaDict = { ref: 'lex:app.bsky.actor.defs#profileView', }, }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, @@ -8358,6 +8363,11 @@ export const schemaDict = { 'If true, response has fallen-back to generic results, and is not scoped using relativeToDid', default: false, }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, @@ -9429,6 +9439,11 @@ export const schemaDict = { description: 'DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer.', }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 260fce3a522..963fbee538b 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -4851,6 +4851,11 @@ export const schemaDict = { ref: 'lex:app.bsky.actor.defs#profileView', }, }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, @@ -8358,6 +8363,11 @@ export const schemaDict = { 'If true, response has fallen-back to generic results, and is not scoped using relativeToDid', default: false, }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, @@ -9429,6 +9439,11 @@ export const schemaDict = { description: 'DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer.', }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, diff --git a/packages/pds/src/lexicon/lexicons.ts b/packages/pds/src/lexicon/lexicons.ts index 260fce3a522..963fbee538b 100644 --- a/packages/pds/src/lexicon/lexicons.ts +++ b/packages/pds/src/lexicon/lexicons.ts @@ -4851,6 +4851,11 @@ export const schemaDict = { ref: 'lex:app.bsky.actor.defs#profileView', }, }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, @@ -8358,6 +8363,11 @@ export const schemaDict = { 'If true, response has fallen-back to generic results, and is not scoped using relativeToDid', default: false, }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, @@ -9429,6 +9439,11 @@ export const schemaDict = { description: 'DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer.', }, + recId: { + type: 'integer', + description: + 'Snowflake for this recommendation, use when submitting recommendation events.', + }, }, }, }, From 4e43cc0de14d272633fcf28b74fe856d5b44e032 Mon Sep 17 00:00:00 2001 From: rafael Date: Thu, 16 Jan 2025 15:46:37 -0300 Subject: [PATCH 006/101] use ubuntu 22.04 on github actions (#3377) --- .github/workflows/build-and-push-bsky-aws.yaml | 2 +- .github/workflows/build-and-push-bsky-ghcr.yaml | 2 +- .github/workflows/build-and-push-bsync-aws.yaml | 2 +- .github/workflows/build-and-push-bsync-ghcr.yaml | 2 +- .github/workflows/build-and-push-ozone-aws.yaml | 2 +- .github/workflows/build-and-push-ozone-ghcr.yaml | 2 +- .github/workflows/build-and-push-pds-aws.yaml | 2 +- .github/workflows/build-and-push-pds-ghcr.yaml | 2 +- .github/workflows/publish.yaml | 2 +- .github/workflows/repo.yaml | 6 +++--- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-and-push-bsky-aws.yaml b/.github/workflows/build-and-push-bsky-aws.yaml index 36b1aa23cb3..e0526ac2241 100644 --- a/.github/workflows/build-and-push-bsky-aws.yaml +++ b/.github/workflows/build-and-push-bsky-aws.yaml @@ -12,7 +12,7 @@ env: jobs: bsky-container-aws: if: github.repository == 'bluesky-social/atproto' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: contents: read packages: write diff --git a/.github/workflows/build-and-push-bsky-ghcr.yaml b/.github/workflows/build-and-push-bsky-ghcr.yaml index 5d22cd9a389..facdd3a8d24 100644 --- a/.github/workflows/build-and-push-bsky-ghcr.yaml +++ b/.github/workflows/build-and-push-bsky-ghcr.yaml @@ -14,7 +14,7 @@ env: jobs: bsky-container-ghcr: if: github.repository == 'bluesky-social/atproto' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: contents: read packages: write diff --git a/.github/workflows/build-and-push-bsync-aws.yaml b/.github/workflows/build-and-push-bsync-aws.yaml index 7976e537325..cfd0970f573 100644 --- a/.github/workflows/build-and-push-bsync-aws.yaml +++ b/.github/workflows/build-and-push-bsync-aws.yaml @@ -12,7 +12,7 @@ env: jobs: bsync-container-aws: if: github.repository == 'bluesky-social/atproto' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: contents: read packages: write diff --git a/.github/workflows/build-and-push-bsync-ghcr.yaml b/.github/workflows/build-and-push-bsync-ghcr.yaml index dec359e020b..a22718cd00d 100644 --- a/.github/workflows/build-and-push-bsync-ghcr.yaml +++ b/.github/workflows/build-and-push-bsync-ghcr.yaml @@ -14,7 +14,7 @@ env: jobs: bsync-container-ghcr: if: github.repository == 'bluesky-social/atproto' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: contents: read packages: write diff --git a/.github/workflows/build-and-push-ozone-aws.yaml b/.github/workflows/build-and-push-ozone-aws.yaml index 4cce9a36c2d..84d42407794 100644 --- a/.github/workflows/build-and-push-ozone-aws.yaml +++ b/.github/workflows/build-and-push-ozone-aws.yaml @@ -13,7 +13,7 @@ env: jobs: ozone-container-aws: if: github.repository == 'bluesky-social/atproto' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: contents: read packages: write diff --git a/.github/workflows/build-and-push-ozone-ghcr.yaml b/.github/workflows/build-and-push-ozone-ghcr.yaml index ab37093963d..982f7af73d3 100644 --- a/.github/workflows/build-and-push-ozone-ghcr.yaml +++ b/.github/workflows/build-and-push-ozone-ghcr.yaml @@ -14,7 +14,7 @@ env: jobs: ozone-container-ghcr: if: github.repository == 'bluesky-social/atproto' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: contents: read packages: write diff --git a/.github/workflows/build-and-push-pds-aws.yaml b/.github/workflows/build-and-push-pds-aws.yaml index 097f782d88e..803a431cd92 100644 --- a/.github/workflows/build-and-push-pds-aws.yaml +++ b/.github/workflows/build-and-push-pds-aws.yaml @@ -12,7 +12,7 @@ env: jobs: pds-container-aws: if: github.repository == 'bluesky-social/atproto' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: contents: read packages: write diff --git a/.github/workflows/build-and-push-pds-ghcr.yaml b/.github/workflows/build-and-push-pds-ghcr.yaml index b11230ab531..b6bd6c38ad8 100644 --- a/.github/workflows/build-and-push-pds-ghcr.yaml +++ b/.github/workflows/build-and-push-pds-ghcr.yaml @@ -14,7 +14,7 @@ env: jobs: pds-container-ghcr: if: github.repository == 'bluesky-social/atproto' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: contents: read packages: write diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 34d817a652e..4a296476926 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -13,7 +13,7 @@ jobs: build: name: Build & Publish if: github.repository == 'bluesky-social/atproto' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: contents: write pull-requests: write diff --git a/.github/workflows/repo.yaml b/.github/workflows/repo.yaml index 85fb369462a..e8db4b20b8d 100644 --- a/.github/workflows/repo.yaml +++ b/.github/workflows/repo.yaml @@ -12,7 +12,7 @@ concurrency: jobs: build: name: Build - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - run: corepack enable && corepack prepare --activate @@ -42,7 +42,7 @@ jobs: strategy: matrix: shard: [1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8, 8/8] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - run: corepack enable && corepack prepare --activate @@ -66,7 +66,7 @@ jobs: verify: name: Verify needs: build - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - run: corepack enable && corepack prepare --activate From 4ab7075fdea282daaa27ebbd2c7a677f886188ce Mon Sep 17 00:00:00 2001 From: rafael Date: Thu, 16 Jan 2025 16:38:28 -0300 Subject: [PATCH 007/101] small rate-limit improvements (#3376) --- packages/xrpc-server/src/rate-limiter.ts | 4 ++-- packages/xrpc-server/src/server.ts | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/xrpc-server/src/rate-limiter.ts b/packages/xrpc-server/src/rate-limiter.ts index d63458c92ad..01b487f9c76 100644 --- a/packages/xrpc-server/src/rate-limiter.ts +++ b/packages/xrpc-server/src/rate-limiter.ts @@ -122,8 +122,8 @@ export class RateLimiter implements RateLimiterI { try { await this.limiter.delete(key) - } catch (err) { - throw new Error(`rate limiter failed to reset key: ${key}`) + } catch (cause) { + throw new Error(`rate limiter failed to reset key: ${key}`, { cause }) } } } diff --git a/packages/xrpc-server/src/server.ts b/packages/xrpc-server/src/server.ts index 0ccb8d9db3b..ae0a5563c04 100644 --- a/packages/xrpc-server/src/server.ts +++ b/packages/xrpc-server/src/server.ts @@ -282,9 +282,7 @@ export class Server { auth: locals.auth, req, res, - async resetRouteRateLimits() { - return resetRateLimit(this) - }, + resetRouteRateLimits: async () => resetRateLimit(reqCtx), } // handle rate limits From 9c01281931a371304bcfa465005d7363c003bc5f Mon Sep 17 00:00:00 2001 From: devin ivy Date: Thu, 16 Jan 2025 18:43:27 -0500 Subject: [PATCH 008/101] fetch-node: ensure unicast checks allow psl domains (#3379) --- .changeset/silver-birds-run.md | 5 +++++ packages/internal/fetch-node/src/unicast.ts | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .changeset/silver-birds-run.md diff --git a/.changeset/silver-birds-run.md b/.changeset/silver-birds-run.md new file mode 100644 index 00000000000..2521fe33e1a --- /dev/null +++ b/.changeset/silver-birds-run.md @@ -0,0 +1,5 @@ +--- +"@atproto-labs/fetch-node": patch +--- + +Unicast checks should permit PSL domains. diff --git a/packages/internal/fetch-node/src/unicast.ts b/packages/internal/fetch-node/src/unicast.ts index 92ca7416938..aae1f9ae33b 100644 --- a/packages/internal/fetch-node/src/unicast.ts +++ b/packages/internal/fetch-node/src/unicast.ts @@ -9,7 +9,7 @@ import { FetchRequestError, } from '@atproto-labs/fetch' import ipaddr from 'ipaddr.js' -import { isValid as isValidDomain } from 'psl' +import { parse as pslParse } from 'psl' import { Agent, Client } from 'undici' import { isUnicastIp } from './util.js' @@ -185,6 +185,14 @@ export function unicastLookup( }) } +// see lupomontero/psl#258 for context on psl usage. +// in short, this ensures a structurally valid domain +// plus a "listed" tld. +function isValidDomain(domain: string) { + const parsed = pslParse(domain) + return !parsed.error && parsed.listed +} + function isNotUnicast(ip: ipaddr.IPv4 | ipaddr.IPv6): boolean { return ip.range() !== 'unicast' } From cbf17066f314fbc7f2e943127ee4a9f589f8bec2 Mon Sep 17 00:00:00 2001 From: rafael Date: Fri, 17 Jan 2025 20:26:29 -0300 Subject: [PATCH 009/101] feed generator content mode (#3389) --- .changeset/dull-zebras-prove.md | 6 + lexicons/app/bsky/feed/defs.json | 15 +++ lexicons/app/bsky/feed/generator.json | 7 ++ packages/api/src/client/index.ts | 2 + packages/api/src/client/lexicons.ts | 23 ++++ .../src/client/types/app/bsky/feed/defs.ts | 9 ++ .../client/types/app/bsky/feed/generator.ts | 4 + packages/bsky/src/lexicon/index.ts | 2 + packages/bsky/src/lexicon/lexicons.ts | 23 ++++ .../src/lexicon/types/app/bsky/feed/defs.ts | 9 ++ .../lexicon/types/app/bsky/feed/generator.ts | 4 + packages/bsky/src/views/index.ts | 1 + .../feed-generation.test.ts.snap | 113 ++++++++++++++++-- packages/bsky/tests/feed-generation.test.ts | 42 ++++++- packages/ozone/src/lexicon/index.ts | 2 + packages/ozone/src/lexicon/lexicons.ts | 23 ++++ .../src/lexicon/types/app/bsky/feed/defs.ts | 9 ++ .../lexicon/types/app/bsky/feed/generator.ts | 4 + packages/pds/src/lexicon/index.ts | 2 + packages/pds/src/lexicon/lexicons.ts | 23 ++++ .../src/lexicon/types/app/bsky/feed/defs.ts | 9 ++ .../lexicon/types/app/bsky/feed/generator.ts | 4 + 22 files changed, 320 insertions(+), 16 deletions(-) create mode 100644 .changeset/dull-zebras-prove.md diff --git a/.changeset/dull-zebras-prove.md b/.changeset/dull-zebras-prove.md new file mode 100644 index 00000000000..ba8bc98a662 --- /dev/null +++ b/.changeset/dull-zebras-prove.md @@ -0,0 +1,6 @@ +--- +"@atproto/bsky": patch +"@atproto/api": patch +--- + +add feedgen content mode lexicon spec diff --git a/lexicons/app/bsky/feed/defs.json b/lexicons/app/bsky/feed/defs.json index 341f7fbd02b..8aca402f830 100644 --- a/lexicons/app/bsky/feed/defs.json +++ b/lexicons/app/bsky/feed/defs.json @@ -162,6 +162,13 @@ "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } }, "viewer": { "type": "ref", "ref": "#generatorViewerState" }, + "contentMode": { + "type": "string", + "knownValues": [ + "app.bsky.feed.defs#contentModeUnspecified", + "app.bsky.feed.defs#contentModeVideo" + ] + }, "indexedAt": { "type": "string", "format": "datetime" } } }, @@ -262,6 +269,14 @@ "type": "token", "description": "User clicked through to the embedded content of the feed item" }, + "contentModeUnspecified": { + "type": "token", + "description": "Declares the feed generator returns any types of posts." + }, + "contentModeVideo": { + "type": "token", + "description": "Declares the feed generator returns posts containing app.bsky.embed.video embeds." + }, "interactionSeen": { "type": "token", "description": "Feed item was seen by user" diff --git a/lexicons/app/bsky/feed/generator.json b/lexicons/app/bsky/feed/generator.json index 1406d542fd1..fec0c0fafe7 100644 --- a/lexicons/app/bsky/feed/generator.json +++ b/lexicons/app/bsky/feed/generator.json @@ -39,6 +39,13 @@ "description": "Self-label values", "refs": ["com.atproto.label.defs#selfLabels"] }, + "contentMode": { + "type": "string", + "knownValues": [ + "app.bsky.feed.defs#contentModeUnspecified", + "app.bsky.feed.defs#contentModeVideo" + ] + }, "createdAt": { "type": "string", "format": "datetime" } } } diff --git a/packages/api/src/client/index.ts b/packages/api/src/client/index.ts index fcced108ca1..5f46b6b277c 100644 --- a/packages/api/src/client/index.ts +++ b/packages/api/src/client/index.ts @@ -478,6 +478,8 @@ export const APP_BSKY_FEED = { DefsClickthroughAuthor: 'app.bsky.feed.defs#clickthroughAuthor', DefsClickthroughReposter: 'app.bsky.feed.defs#clickthroughReposter', DefsClickthroughEmbed: 'app.bsky.feed.defs#clickthroughEmbed', + DefsContentModeUnspecified: 'app.bsky.feed.defs#contentModeUnspecified', + DefsContentModeVideo: 'app.bsky.feed.defs#contentModeVideo', DefsInteractionSeen: 'app.bsky.feed.defs#interactionSeen', DefsInteractionLike: 'app.bsky.feed.defs#interactionLike', DefsInteractionRepost: 'app.bsky.feed.defs#interactionRepost', diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 963fbee538b..154f03f9aa1 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -5778,6 +5778,13 @@ export const schemaDict = { type: 'ref', ref: 'lex:app.bsky.feed.defs#generatorViewerState', }, + contentMode: { + type: 'string', + knownValues: [ + 'app.bsky.feed.defs#contentModeUnspecified', + 'app.bsky.feed.defs#contentModeVideo', + ], + }, indexedAt: { type: 'string', format: 'datetime', @@ -5912,6 +5919,15 @@ export const schemaDict = { description: 'User clicked through to the embedded content of the feed item', }, + contentModeUnspecified: { + type: 'token', + description: 'Declares the feed generator returns any types of posts.', + }, + contentModeVideo: { + type: 'token', + description: + 'Declares the feed generator returns posts containing app.bsky.embed.video embeds.', + }, interactionSeen: { type: 'token', description: 'Feed item was seen by user', @@ -6043,6 +6059,13 @@ export const schemaDict = { description: 'Self-label values', refs: ['lex:com.atproto.label.defs#selfLabels'], }, + contentMode: { + type: 'string', + knownValues: [ + 'app.bsky.feed.defs#contentModeUnspecified', + 'app.bsky.feed.defs#contentModeVideo', + ], + }, createdAt: { type: 'string', format: 'datetime', diff --git a/packages/api/src/client/types/app/bsky/feed/defs.ts b/packages/api/src/client/types/app/bsky/feed/defs.ts index bc50067c1da..64c3f7247d8 100644 --- a/packages/api/src/client/types/app/bsky/feed/defs.ts +++ b/packages/api/src/client/types/app/bsky/feed/defs.ts @@ -247,6 +247,10 @@ export interface GeneratorView { acceptsInteractions?: boolean labels?: ComAtprotoLabelDefs.Label[] viewer?: GeneratorViewerState + contentMode?: + | 'app.bsky.feed.defs#contentModeUnspecified' + | 'app.bsky.feed.defs#contentModeVideo' + | (string & {}) indexedAt: string [k: string]: unknown } @@ -401,6 +405,11 @@ export const CLICKTHROUGHAUTHOR = 'app.bsky.feed.defs#clickthroughAuthor' export const CLICKTHROUGHREPOSTER = 'app.bsky.feed.defs#clickthroughReposter' /** User clicked through to the embedded content of the feed item */ export const CLICKTHROUGHEMBED = 'app.bsky.feed.defs#clickthroughEmbed' +/** Declares the feed generator returns any types of posts. */ +export const CONTENTMODEUNSPECIFIED = + 'app.bsky.feed.defs#contentModeUnspecified' +/** Declares the feed generator returns posts containing app.bsky.embed.video embeds. */ +export const CONTENTMODEVIDEO = 'app.bsky.feed.defs#contentModeVideo' /** Feed item was seen by user */ export const INTERACTIONSEEN = 'app.bsky.feed.defs#interactionSeen' /** User liked the feed item */ diff --git a/packages/api/src/client/types/app/bsky/feed/generator.ts b/packages/api/src/client/types/app/bsky/feed/generator.ts index b36796dd353..8e1dd9e9c80 100644 --- a/packages/api/src/client/types/app/bsky/feed/generator.ts +++ b/packages/api/src/client/types/app/bsky/feed/generator.ts @@ -19,6 +19,10 @@ export interface Record { labels?: | ComAtprotoLabelDefs.SelfLabels | { $type: string; [k: string]: unknown } + contentMode?: + | 'app.bsky.feed.defs#contentModeUnspecified' + | 'app.bsky.feed.defs#contentModeVideo' + | (string & {}) createdAt: string [k: string]: unknown } diff --git a/packages/bsky/src/lexicon/index.ts b/packages/bsky/src/lexicon/index.ts index 89ee5f3b2fa..27ddc898f4d 100644 --- a/packages/bsky/src/lexicon/index.ts +++ b/packages/bsky/src/lexicon/index.ts @@ -181,6 +181,8 @@ export const APP_BSKY_FEED = { DefsClickthroughAuthor: 'app.bsky.feed.defs#clickthroughAuthor', DefsClickthroughReposter: 'app.bsky.feed.defs#clickthroughReposter', DefsClickthroughEmbed: 'app.bsky.feed.defs#clickthroughEmbed', + DefsContentModeUnspecified: 'app.bsky.feed.defs#contentModeUnspecified', + DefsContentModeVideo: 'app.bsky.feed.defs#contentModeVideo', DefsInteractionSeen: 'app.bsky.feed.defs#interactionSeen', DefsInteractionLike: 'app.bsky.feed.defs#interactionLike', DefsInteractionRepost: 'app.bsky.feed.defs#interactionRepost', diff --git a/packages/bsky/src/lexicon/lexicons.ts b/packages/bsky/src/lexicon/lexicons.ts index d16b479f5ef..397370e3bc3 100644 --- a/packages/bsky/src/lexicon/lexicons.ts +++ b/packages/bsky/src/lexicon/lexicons.ts @@ -5778,6 +5778,13 @@ export const schemaDict = { type: 'ref', ref: 'lex:app.bsky.feed.defs#generatorViewerState', }, + contentMode: { + type: 'string', + knownValues: [ + 'app.bsky.feed.defs#contentModeUnspecified', + 'app.bsky.feed.defs#contentModeVideo', + ], + }, indexedAt: { type: 'string', format: 'datetime', @@ -5912,6 +5919,15 @@ export const schemaDict = { description: 'User clicked through to the embedded content of the feed item', }, + contentModeUnspecified: { + type: 'token', + description: 'Declares the feed generator returns any types of posts.', + }, + contentModeVideo: { + type: 'token', + description: + 'Declares the feed generator returns posts containing app.bsky.embed.video embeds.', + }, interactionSeen: { type: 'token', description: 'Feed item was seen by user', @@ -6043,6 +6059,13 @@ export const schemaDict = { description: 'Self-label values', refs: ['lex:com.atproto.label.defs#selfLabels'], }, + contentMode: { + type: 'string', + knownValues: [ + 'app.bsky.feed.defs#contentModeUnspecified', + 'app.bsky.feed.defs#contentModeVideo', + ], + }, createdAt: { type: 'string', format: 'datetime', diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/defs.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/defs.ts index 1c6f6ce78f6..4472369375e 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/defs.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/defs.ts @@ -247,6 +247,10 @@ export interface GeneratorView { acceptsInteractions?: boolean labels?: ComAtprotoLabelDefs.Label[] viewer?: GeneratorViewerState + contentMode?: + | 'app.bsky.feed.defs#contentModeUnspecified' + | 'app.bsky.feed.defs#contentModeVideo' + | (string & {}) indexedAt: string [k: string]: unknown } @@ -401,6 +405,11 @@ export const CLICKTHROUGHAUTHOR = 'app.bsky.feed.defs#clickthroughAuthor' export const CLICKTHROUGHREPOSTER = 'app.bsky.feed.defs#clickthroughReposter' /** User clicked through to the embedded content of the feed item */ export const CLICKTHROUGHEMBED = 'app.bsky.feed.defs#clickthroughEmbed' +/** Declares the feed generator returns any types of posts. */ +export const CONTENTMODEUNSPECIFIED = + 'app.bsky.feed.defs#contentModeUnspecified' +/** Declares the feed generator returns posts containing app.bsky.embed.video embeds. */ +export const CONTENTMODEVIDEO = 'app.bsky.feed.defs#contentModeVideo' /** Feed item was seen by user */ export const INTERACTIONSEEN = 'app.bsky.feed.defs#interactionSeen' /** User liked the feed item */ diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/generator.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/generator.ts index eb8e8d0f633..482c7a7444e 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/generator.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/generator.ts @@ -19,6 +19,10 @@ export interface Record { labels?: | ComAtprotoLabelDefs.SelfLabels | { $type: string; [k: string]: unknown } + contentMode?: + | 'app.bsky.feed.defs#contentModeUnspecified' + | 'app.bsky.feed.defs#contentModeVideo' + | (string & {}) createdAt: string [k: string]: unknown } diff --git a/packages/bsky/src/views/index.ts b/packages/bsky/src/views/index.ts index 7f61ec92a6b..ee511b3a9a4 100644 --- a/packages/bsky/src/views/index.ts +++ b/packages/bsky/src/views/index.ts @@ -572,6 +572,7 @@ export class Views { like: viewer.like, } : undefined, + contentMode: feedgen.record.contentMode, indexedAt: this.indexedAt(feedgen).toISOString(), } } diff --git a/packages/bsky/tests/__snapshots__/feed-generation.test.ts.snap b/packages/bsky/tests/__snapshots__/feed-generation.test.ts.snap index b69224bd3ce..da7a8fe5041 100644 --- a/packages/bsky/tests/__snapshots__/feed-generation.test.ts.snap +++ b/packages/bsky/tests/__snapshots__/feed-generation.test.ts.snap @@ -324,6 +324,7 @@ Array [ }, Object { "cid": "cids(3)", + "contentMode": "app.bsky.feed.defs#contentModeVideo", "creator": Object { "avatar": "https://bsky.public.url/img/avatar/plain/user(2)/cids(1)@jpeg", "createdAt": "1970-01-01T00:00:00.000Z", @@ -355,9 +356,9 @@ Array [ "muted": false, }, }, - "description": "Provides all feed candidates when authed", + "description": "Has a contentMode specified", "did": "user(0)", - "displayName": "Needs Auth", + "displayName": "Content mode video", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], "likeCount": 0, @@ -397,9 +398,9 @@ Array [ "muted": false, }, }, - "description": "Echoes back the same cursor it received", + "description": "Provides all feed candidates when authed", "did": "user(0)", - "displayName": "Bad Pagination Cursor", + "displayName": "Needs Auth", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], "likeCount": 0, @@ -439,9 +440,9 @@ Array [ "muted": false, }, }, - "description": "Provides all feed candidates, blindly ignoring pagination limit", + "description": "Echoes back the same cursor it received", "did": "user(0)", - "displayName": "Bad Pagination Limit", + "displayName": "Bad Pagination Cursor", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], "likeCount": 0, @@ -481,9 +482,9 @@ Array [ "muted": false, }, }, - "description": "Provides even-indexed feed candidates", + "description": "Provides all feed candidates, blindly ignoring pagination limit", "did": "user(0)", - "displayName": "Even", + "displayName": "Bad Pagination Limit", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], "likeCount": 0, @@ -523,15 +524,57 @@ Array [ "muted": false, }, }, + "description": "Provides even-indexed feed candidates", + "did": "user(0)", + "displayName": "Even", + "indexedAt": "1970-01-01T00:00:00.000Z", + "labels": Array [], + "likeCount": 0, + "uri": "record(8)", + "viewer": Object {}, + }, + Object { + "cid": "cids(8)", + "creator": Object { + "avatar": "https://bsky.public.url/img/avatar/plain/user(2)/cids(1)@jpeg", + "createdAt": "1970-01-01T00:00:00.000Z", + "description": "its me!", + "did": "user(1)", + "displayName": "ali", + "handle": "alice.test", + "indexedAt": "1970-01-01T00:00:00.000Z", + "labels": Array [ + Object { + "cid": "cids(2)", + "cts": "1970-01-01T00:00:00.000Z", + "src": "user(1)", + "uri": "record(3)", + "val": "self-label-a", + }, + Object { + "cid": "cids(2)", + "cts": "1970-01-01T00:00:00.000Z", + "src": "user(1)", + "uri": "record(3)", + "val": "self-label-b", + }, + ], + "viewer": Object { + "blockedBy": false, + "followedBy": "record(2)", + "following": "record(1)", + "muted": false, + }, + }, "description": "Provides all feed candidates", "did": "user(0)", "displayName": "All", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], "likeCount": 2, - "uri": "record(8)", + "uri": "record(9)", "viewer": Object { - "like": "record(9)", + "like": "record(10)", }, }, ] @@ -1723,6 +1766,56 @@ Array [ ] `; +exports[`feed generation getFeedGenerator describes a feed gen & returns content mode 1`] = ` +Object { + "isOnline": true, + "isValid": true, + "view": Object { + "cid": "cids(0)", + "contentMode": "app.bsky.feed.defs#contentModeVideo", + "creator": Object { + "avatar": "https://bsky.public.url/img/avatar/plain/user(2)/cids(1)@jpeg", + "createdAt": "1970-01-01T00:00:00.000Z", + "description": "its me!", + "did": "user(1)", + "displayName": "ali", + "handle": "alice.test", + "indexedAt": "1970-01-01T00:00:00.000Z", + "labels": Array [ + Object { + "cid": "cids(2)", + "cts": "1970-01-01T00:00:00.000Z", + "src": "user(1)", + "uri": "record(3)", + "val": "self-label-a", + }, + Object { + "cid": "cids(2)", + "cts": "1970-01-01T00:00:00.000Z", + "src": "user(1)", + "uri": "record(3)", + "val": "self-label-b", + }, + ], + "viewer": Object { + "blockedBy": false, + "followedBy": "record(2)", + "following": "record(1)", + "muted": false, + }, + }, + "description": "Has a contentMode specified", + "did": "user(0)", + "displayName": "Content mode video", + "indexedAt": "1970-01-01T00:00:00.000Z", + "labels": Array [], + "likeCount": 0, + "uri": "record(0)", + "viewer": Object {}, + }, +} +`; + exports[`feed generation getFeedGenerator describes a feed gen & returns online status 1`] = ` Object { "isOnline": true, diff --git a/packages/bsky/tests/feed-generation.test.ts b/packages/bsky/tests/feed-generation.test.ts index 105e11c19d9..47d144ea1b5 100644 --- a/packages/bsky/tests/feed-generation.test.ts +++ b/packages/bsky/tests/feed-generation.test.ts @@ -35,6 +35,7 @@ describe('feed generation', () => { let feedUriPrime: string // Taken-down let feedUriPrimeRef: RecordRef let feedUriNeedsAuth: string + let feedUriContentModeVideo: string let starterPackRef: { uri: string; cid: string } beforeAll(async () => { @@ -173,6 +174,17 @@ describe('feed generation', () => { }, sc.getHeaders(alice), ) + const contentModeVideo = await pdsAgent.api.app.bsky.feed.generator.create( + { repo: alice, rkey: 'content-mode-video' }, + { + did: gen.did, + displayName: 'Content mode video', + description: 'Has a contentMode specified', + createdAt: new Date().toISOString(), + contentMode: 'app.bsky.feed.defs#contentModeVideo', + }, + sc.getHeaders(alice), + ) await network.processAll() await network.bsky.ctx.dataplane.takedownRecord({ recordUri: prime.uri, @@ -187,6 +199,7 @@ describe('feed generation', () => { feedUriPrime = prime.uri feedUriPrimeRef = new RecordRef(prime.uri, prime.cid) feedUriNeedsAuth = needsAuth.uri + feedUriContentModeVideo = contentModeVideo.uri }) it('feed gen records can be updated', async () => { @@ -229,13 +242,14 @@ describe('feed generation', () => { const paginatedAll = results(await paginateAll(paginator)) - expect(paginatedAll.length).toEqual(6) + expect(paginatedAll.length).toEqual(7) expect(paginatedAll[0].uri).toEqual(feedUriOdd) - expect(paginatedAll[1].uri).toEqual(feedUriNeedsAuth) - expect(paginatedAll[2].uri).toEqual(feedUriBadPaginationCursor) - expect(paginatedAll[3].uri).toEqual(feedUriBadPaginationLimit) - expect(paginatedAll[4].uri).toEqual(feedUriEven) - expect(paginatedAll[5].uri).toEqual(feedUriAll) + expect(paginatedAll[1].uri).toEqual(feedUriContentModeVideo) + expect(paginatedAll[2].uri).toEqual(feedUriNeedsAuth) + expect(paginatedAll[3].uri).toEqual(feedUriBadPaginationCursor) + expect(paginatedAll[4].uri).toEqual(feedUriBadPaginationLimit) + expect(paginatedAll[5].uri).toEqual(feedUriEven) + expect(paginatedAll[6].uri).toEqual(feedUriAll) expect(paginatedAll.map((fg) => fg.uri)).not.toContain(feedUriPrime) // taken-down expect(forSnapshot(paginatedAll)).toMatchSnapshot() }) @@ -399,6 +413,22 @@ describe('feed generation', () => { expect(resEven.data.isValid).toBe(true) }) + it('describes a feed gen & returns content mode', async () => { + const resEven = await agent.api.app.bsky.feed.getFeedGenerator( + { feed: feedUriContentModeVideo }, + { + headers: await network.serviceHeaders( + sc.dids.bob, + ids.AppBskyFeedGetFeedGenerator, + ), + }, + ) + expect(forSnapshot(resEven.data)).toMatchSnapshot() + expect(resEven.data.view.contentMode).toBe( + 'app.bsky.feed.defs#contentModeVideo', + ) + }) + it('does not describe taken-down feed', async () => { const tryGetFeed = agent.api.app.bsky.feed.getFeedGenerator( { feed: feedUriPrime }, diff --git a/packages/ozone/src/lexicon/index.ts b/packages/ozone/src/lexicon/index.ts index e5015348f6c..dc68082677f 100644 --- a/packages/ozone/src/lexicon/index.ts +++ b/packages/ozone/src/lexicon/index.ts @@ -211,6 +211,8 @@ export const APP_BSKY_FEED = { DefsClickthroughAuthor: 'app.bsky.feed.defs#clickthroughAuthor', DefsClickthroughReposter: 'app.bsky.feed.defs#clickthroughReposter', DefsClickthroughEmbed: 'app.bsky.feed.defs#clickthroughEmbed', + DefsContentModeUnspecified: 'app.bsky.feed.defs#contentModeUnspecified', + DefsContentModeVideo: 'app.bsky.feed.defs#contentModeVideo', DefsInteractionSeen: 'app.bsky.feed.defs#interactionSeen', DefsInteractionLike: 'app.bsky.feed.defs#interactionLike', DefsInteractionRepost: 'app.bsky.feed.defs#interactionRepost', diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 963fbee538b..154f03f9aa1 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -5778,6 +5778,13 @@ export const schemaDict = { type: 'ref', ref: 'lex:app.bsky.feed.defs#generatorViewerState', }, + contentMode: { + type: 'string', + knownValues: [ + 'app.bsky.feed.defs#contentModeUnspecified', + 'app.bsky.feed.defs#contentModeVideo', + ], + }, indexedAt: { type: 'string', format: 'datetime', @@ -5912,6 +5919,15 @@ export const schemaDict = { description: 'User clicked through to the embedded content of the feed item', }, + contentModeUnspecified: { + type: 'token', + description: 'Declares the feed generator returns any types of posts.', + }, + contentModeVideo: { + type: 'token', + description: + 'Declares the feed generator returns posts containing app.bsky.embed.video embeds.', + }, interactionSeen: { type: 'token', description: 'Feed item was seen by user', @@ -6043,6 +6059,13 @@ export const schemaDict = { description: 'Self-label values', refs: ['lex:com.atproto.label.defs#selfLabels'], }, + contentMode: { + type: 'string', + knownValues: [ + 'app.bsky.feed.defs#contentModeUnspecified', + 'app.bsky.feed.defs#contentModeVideo', + ], + }, createdAt: { type: 'string', format: 'datetime', diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/defs.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/defs.ts index 1c6f6ce78f6..4472369375e 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/defs.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/defs.ts @@ -247,6 +247,10 @@ export interface GeneratorView { acceptsInteractions?: boolean labels?: ComAtprotoLabelDefs.Label[] viewer?: GeneratorViewerState + contentMode?: + | 'app.bsky.feed.defs#contentModeUnspecified' + | 'app.bsky.feed.defs#contentModeVideo' + | (string & {}) indexedAt: string [k: string]: unknown } @@ -401,6 +405,11 @@ export const CLICKTHROUGHAUTHOR = 'app.bsky.feed.defs#clickthroughAuthor' export const CLICKTHROUGHREPOSTER = 'app.bsky.feed.defs#clickthroughReposter' /** User clicked through to the embedded content of the feed item */ export const CLICKTHROUGHEMBED = 'app.bsky.feed.defs#clickthroughEmbed' +/** Declares the feed generator returns any types of posts. */ +export const CONTENTMODEUNSPECIFIED = + 'app.bsky.feed.defs#contentModeUnspecified' +/** Declares the feed generator returns posts containing app.bsky.embed.video embeds. */ +export const CONTENTMODEVIDEO = 'app.bsky.feed.defs#contentModeVideo' /** Feed item was seen by user */ export const INTERACTIONSEEN = 'app.bsky.feed.defs#interactionSeen' /** User liked the feed item */ diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/generator.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/generator.ts index eb8e8d0f633..482c7a7444e 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/generator.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/generator.ts @@ -19,6 +19,10 @@ export interface Record { labels?: | ComAtprotoLabelDefs.SelfLabels | { $type: string; [k: string]: unknown } + contentMode?: + | 'app.bsky.feed.defs#contentModeUnspecified' + | 'app.bsky.feed.defs#contentModeVideo' + | (string & {}) createdAt: string [k: string]: unknown } diff --git a/packages/pds/src/lexicon/index.ts b/packages/pds/src/lexicon/index.ts index e5015348f6c..dc68082677f 100644 --- a/packages/pds/src/lexicon/index.ts +++ b/packages/pds/src/lexicon/index.ts @@ -211,6 +211,8 @@ export const APP_BSKY_FEED = { DefsClickthroughAuthor: 'app.bsky.feed.defs#clickthroughAuthor', DefsClickthroughReposter: 'app.bsky.feed.defs#clickthroughReposter', DefsClickthroughEmbed: 'app.bsky.feed.defs#clickthroughEmbed', + DefsContentModeUnspecified: 'app.bsky.feed.defs#contentModeUnspecified', + DefsContentModeVideo: 'app.bsky.feed.defs#contentModeVideo', DefsInteractionSeen: 'app.bsky.feed.defs#interactionSeen', DefsInteractionLike: 'app.bsky.feed.defs#interactionLike', DefsInteractionRepost: 'app.bsky.feed.defs#interactionRepost', diff --git a/packages/pds/src/lexicon/lexicons.ts b/packages/pds/src/lexicon/lexicons.ts index 963fbee538b..154f03f9aa1 100644 --- a/packages/pds/src/lexicon/lexicons.ts +++ b/packages/pds/src/lexicon/lexicons.ts @@ -5778,6 +5778,13 @@ export const schemaDict = { type: 'ref', ref: 'lex:app.bsky.feed.defs#generatorViewerState', }, + contentMode: { + type: 'string', + knownValues: [ + 'app.bsky.feed.defs#contentModeUnspecified', + 'app.bsky.feed.defs#contentModeVideo', + ], + }, indexedAt: { type: 'string', format: 'datetime', @@ -5912,6 +5919,15 @@ export const schemaDict = { description: 'User clicked through to the embedded content of the feed item', }, + contentModeUnspecified: { + type: 'token', + description: 'Declares the feed generator returns any types of posts.', + }, + contentModeVideo: { + type: 'token', + description: + 'Declares the feed generator returns posts containing app.bsky.embed.video embeds.', + }, interactionSeen: { type: 'token', description: 'Feed item was seen by user', @@ -6043,6 +6059,13 @@ export const schemaDict = { description: 'Self-label values', refs: ['lex:com.atproto.label.defs#selfLabels'], }, + contentMode: { + type: 'string', + knownValues: [ + 'app.bsky.feed.defs#contentModeUnspecified', + 'app.bsky.feed.defs#contentModeVideo', + ], + }, createdAt: { type: 'string', format: 'datetime', diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/defs.ts b/packages/pds/src/lexicon/types/app/bsky/feed/defs.ts index 1c6f6ce78f6..4472369375e 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/defs.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/defs.ts @@ -247,6 +247,10 @@ export interface GeneratorView { acceptsInteractions?: boolean labels?: ComAtprotoLabelDefs.Label[] viewer?: GeneratorViewerState + contentMode?: + | 'app.bsky.feed.defs#contentModeUnspecified' + | 'app.bsky.feed.defs#contentModeVideo' + | (string & {}) indexedAt: string [k: string]: unknown } @@ -401,6 +405,11 @@ export const CLICKTHROUGHAUTHOR = 'app.bsky.feed.defs#clickthroughAuthor' export const CLICKTHROUGHREPOSTER = 'app.bsky.feed.defs#clickthroughReposter' /** User clicked through to the embedded content of the feed item */ export const CLICKTHROUGHEMBED = 'app.bsky.feed.defs#clickthroughEmbed' +/** Declares the feed generator returns any types of posts. */ +export const CONTENTMODEUNSPECIFIED = + 'app.bsky.feed.defs#contentModeUnspecified' +/** Declares the feed generator returns posts containing app.bsky.embed.video embeds. */ +export const CONTENTMODEVIDEO = 'app.bsky.feed.defs#contentModeVideo' /** Feed item was seen by user */ export const INTERACTIONSEEN = 'app.bsky.feed.defs#interactionSeen' /** User liked the feed item */ diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/generator.ts b/packages/pds/src/lexicon/types/app/bsky/feed/generator.ts index eb8e8d0f633..482c7a7444e 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/generator.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/generator.ts @@ -19,6 +19,10 @@ export interface Record { labels?: | ComAtprotoLabelDefs.SelfLabels | { $type: string; [k: string]: unknown } + contentMode?: + | 'app.bsky.feed.defs#contentModeUnspecified' + | 'app.bsky.feed.defs#contentModeVideo' + | (string & {}) createdAt: string [k: string]: unknown } From 5417476622ff5a97daaa00e2f57bae90dea2a22e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Jan 2025 20:32:20 -0300 Subject: [PATCH 010/101] Version packages (#3380) Co-authored-by: github-actions[bot] --- .changeset/dull-zebras-prove.md | 6 ------ .changeset/silver-birds-run.md | 5 ----- packages/api/CHANGELOG.md | 6 ++++++ packages/api/package.json | 2 +- packages/bsky/CHANGELOG.md | 10 ++++++++++ packages/bsky/package.json | 2 +- packages/dev-env/CHANGELOG.md | 10 ++++++++++ packages/dev-env/package.json | 2 +- packages/internal/fetch-node/CHANGELOG.md | 6 ++++++ packages/internal/fetch-node/package.json | 2 +- packages/internal/handle-resolver-node/CHANGELOG.md | 7 +++++++ packages/internal/handle-resolver-node/package.json | 2 +- packages/oauth/oauth-client-node/CHANGELOG.md | 7 +++++++ packages/oauth/oauth-client-node/package.json | 2 +- packages/oauth/oauth-provider/CHANGELOG.md | 7 +++++++ packages/oauth/oauth-provider/package.json | 2 +- packages/ozone/CHANGELOG.md | 7 +++++++ packages/ozone/package.json | 2 +- packages/pds/CHANGELOG.md | 9 +++++++++ packages/pds/package.json | 2 +- 20 files changed, 78 insertions(+), 20 deletions(-) delete mode 100644 .changeset/dull-zebras-prove.md delete mode 100644 .changeset/silver-birds-run.md diff --git a/.changeset/dull-zebras-prove.md b/.changeset/dull-zebras-prove.md deleted file mode 100644 index ba8bc98a662..00000000000 --- a/.changeset/dull-zebras-prove.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@atproto/bsky": patch -"@atproto/api": patch ---- - -add feedgen content mode lexicon spec diff --git a/.changeset/silver-birds-run.md b/.changeset/silver-birds-run.md deleted file mode 100644 index 2521fe33e1a..00000000000 --- a/.changeset/silver-birds-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto-labs/fetch-node": patch ---- - -Unicast checks should permit PSL domains. diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 10b4099374f..5de7eea7b3f 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/api +## 0.13.28 + +### Patch Changes + +- [#3389](https://github.com/bluesky-social/atproto/pull/3389) [`cbf17066f`](https://github.com/bluesky-social/atproto/commit/cbf17066f314fbc7f2e943127ee4a9f589f8bec2) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - add feedgen content mode lexicon spec + ## 0.13.27 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index a59b20f9802..a3591f1a6d4 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.13.27", + "version": "0.13.28", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index 094443d3850..5daef0e68fa 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/bsky +## 0.0.108 + +### Patch Changes + +- [#3389](https://github.com/bluesky-social/atproto/pull/3389) [`cbf17066f`](https://github.com/bluesky-social/atproto/commit/cbf17066f314fbc7f2e943127ee4a9f589f8bec2) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - add feedgen content mode lexicon spec + +- Updated dependencies [[`cbf17066f`](https://github.com/bluesky-social/atproto/commit/cbf17066f314fbc7f2e943127ee4a9f589f8bec2), [`9c0128193`](https://github.com/bluesky-social/atproto/commit/9c01281931a371304bcfa465005d7363c003bc5f)]: + - @atproto/api@0.13.28 + - @atproto-labs/fetch-node@0.1.6 + ## 0.0.107 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 8975c6ead18..3fa14aa087e 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.107", + "version": "0.0.108", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index 4da48580c6e..6301d867f1f 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/dev-env +## 0.3.78 + +### Patch Changes + +- Updated dependencies [[`cbf17066f`](https://github.com/bluesky-social/atproto/commit/cbf17066f314fbc7f2e943127ee4a9f589f8bec2)]: + - @atproto/bsky@0.0.108 + - @atproto/api@0.13.28 + - @atproto/pds@0.4.86 + - @atproto/ozone@0.1.69 + ## 0.3.77 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index 02ac33ad3d0..bacd2e20d7b 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.3.77", + "version": "0.3.78", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/internal/fetch-node/CHANGELOG.md b/packages/internal/fetch-node/CHANGELOG.md index 99cfaf36e7c..86840a86316 100644 --- a/packages/internal/fetch-node/CHANGELOG.md +++ b/packages/internal/fetch-node/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto-labs/fetch-node +## 0.1.6 + +### Patch Changes + +- [#3379](https://github.com/bluesky-social/atproto/pull/3379) [`9c0128193`](https://github.com/bluesky-social/atproto/commit/9c01281931a371304bcfa465005d7363c003bc5f) Thanks [@devinivy](https://github.com/devinivy)! - Unicast checks should permit PSL domains. + ## 0.1.5 ### Patch Changes diff --git a/packages/internal/fetch-node/package.json b/packages/internal/fetch-node/package.json index 8c40d202053..b24a7aa8b86 100644 --- a/packages/internal/fetch-node/package.json +++ b/packages/internal/fetch-node/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/fetch-node", - "version": "0.1.5", + "version": "0.1.6", "license": "MIT", "description": "SSRF protection for fetch() in Node.js", "keywords": [ diff --git a/packages/internal/handle-resolver-node/CHANGELOG.md b/packages/internal/handle-resolver-node/CHANGELOG.md index a92ff9b329f..7167efbf0d3 100644 --- a/packages/internal/handle-resolver-node/CHANGELOG.md +++ b/packages/internal/handle-resolver-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto-labs/handle-resolver-node +## 0.1.11 + +### Patch Changes + +- Updated dependencies [[`9c0128193`](https://github.com/bluesky-social/atproto/commit/9c01281931a371304bcfa465005d7363c003bc5f)]: + - @atproto-labs/fetch-node@0.1.6 + ## 0.1.10 ### Patch Changes diff --git a/packages/internal/handle-resolver-node/package.json b/packages/internal/handle-resolver-node/package.json index 4875d73aa12..b32221d7ce3 100644 --- a/packages/internal/handle-resolver-node/package.json +++ b/packages/internal/handle-resolver-node/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/handle-resolver-node", - "version": "0.1.10", + "version": "0.1.11", "license": "MIT", "description": "Node specific ATProto handle to DID resolver", "keywords": [ diff --git a/packages/oauth/oauth-client-node/CHANGELOG.md b/packages/oauth/oauth-client-node/CHANGELOG.md index b1c070b1183..63db2e9e6ad 100644 --- a/packages/oauth/oauth-client-node/CHANGELOG.md +++ b/packages/oauth/oauth-client-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/oauth-client-node +## 0.2.8 + +### Patch Changes + +- Updated dependencies []: + - @atproto-labs/handle-resolver-node@0.1.11 + ## 0.2.7 ### Patch Changes diff --git a/packages/oauth/oauth-client-node/package.json b/packages/oauth/oauth-client-node/package.json index 82e50c7a535..abd1f6efafb 100644 --- a/packages/oauth/oauth-client-node/package.json +++ b/packages/oauth/oauth-client-node/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client-node", - "version": "0.2.7", + "version": "0.2.8", "license": "MIT", "description": "ATPROTO OAuth client for the NodeJS", "keywords": [ diff --git a/packages/oauth/oauth-provider/CHANGELOG.md b/packages/oauth/oauth-provider/CHANGELOG.md index 4820f7f3064..88a84cf6375 100644 --- a/packages/oauth/oauth-provider/CHANGELOG.md +++ b/packages/oauth/oauth-provider/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/oauth-provider +## 0.2.13 + +### Patch Changes + +- Updated dependencies [[`9c0128193`](https://github.com/bluesky-social/atproto/commit/9c01281931a371304bcfa465005d7363c003bc5f)]: + - @atproto-labs/fetch-node@0.1.6 + ## 0.2.12 ### Patch Changes diff --git a/packages/oauth/oauth-provider/package.json b/packages/oauth/oauth-provider/package.json index bec58305f2b..2e6d0be16a4 100644 --- a/packages/oauth/oauth-provider/package.json +++ b/packages/oauth/oauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider", - "version": "0.2.12", + "version": "0.2.13", "license": "MIT", "description": "Generic OAuth2 and OpenID Connect provider for Node.js. Currently only supports features needed for Atproto.", "keywords": [ diff --git a/packages/ozone/CHANGELOG.md b/packages/ozone/CHANGELOG.md index 8cc0d1d310c..ad89cff2d77 100644 --- a/packages/ozone/CHANGELOG.md +++ b/packages/ozone/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/ozone +## 0.1.69 + +### Patch Changes + +- Updated dependencies [[`cbf17066f`](https://github.com/bluesky-social/atproto/commit/cbf17066f314fbc7f2e943127ee4a9f589f8bec2)]: + - @atproto/api@0.13.28 + ## 0.1.68 ### Patch Changes diff --git a/packages/ozone/package.json b/packages/ozone/package.json index 56dc02b0be3..4a5842a4e96 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ozone", - "version": "0.1.68", + "version": "0.1.69", "license": "MIT", "description": "Backend service for moderating the Bluesky network.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index f042ffa12cc..b9700a226a7 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/pds +## 0.4.86 + +### Patch Changes + +- Updated dependencies [[`cbf17066f`](https://github.com/bluesky-social/atproto/commit/cbf17066f314fbc7f2e943127ee4a9f589f8bec2), [`9c0128193`](https://github.com/bluesky-social/atproto/commit/9c01281931a371304bcfa465005d7363c003bc5f)]: + - @atproto/api@0.13.28 + - @atproto-labs/fetch-node@0.1.6 + - @atproto/oauth-provider@0.2.13 + ## 0.4.85 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index 67c5c987eeb..6adaed06e1d 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.85", + "version": "0.4.86", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ From ee9779d07405d991b6be1b1780dae7828ff9d619 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Mon, 20 Jan 2025 15:36:02 +0100 Subject: [PATCH 011/101] Add account details to queryStatuses (#3236) * Moderation subjectStatusView with statistics * add account stats to queue entries * fix * adapt * review changes * style * review comments * wip * add indexes * refresh materialized view * use the background queue to refresh materialized views * tidy * fix verrify * tidy * Add filtering based on "minAccountSuspendCount" * fix tests * Update test snapshots * update materialized views when running `processAll` * tidy * processAll sequentially * tidy * tidy * fix dead lock --- lexicons/tools/ozone/moderation/defs.json | 74 +++++ .../tools/ozone/moderation/queryStatuses.json | 19 +- packages/api/src/client/lexicons.ts | 101 +++++- .../types/tools/ozone/moderation/defs.ts | 62 ++++ .../tools/ozone/moderation/queryStatuses.ts | 12 +- packages/dev-env/src/bin.ts | 1 + .../ozone/src/api/moderation/queryStatuses.ts | 64 +--- packages/ozone/src/background.ts | 154 ++++++++- packages/ozone/src/config/config.ts | 2 + packages/ozone/src/config/env.ts | 4 + packages/ozone/src/daemon/context.ts | 48 ++- packages/ozone/src/daemon/index.ts | 9 +- .../src/daemon/materialized-view-refresher.ts | 27 ++ ...220T144630860Z-stats-materialized-views.ts | 218 +++++++++++++ packages/ozone/src/db/migrations/index.ts | 1 + .../src/db/schema/account_events_stats.ts | 16 + .../db/schema/account_record_events_stats.ts | 15 + .../db/schema/account_record_status_stats.ts | 15 + packages/ozone/src/db/schema/index.ts | 11 +- .../src/db/schema/record_events_stats.ts | 15 + packages/ozone/src/index.ts | 8 +- packages/ozone/src/lexicon/lexicons.ts | 101 +++++- .../types/tools/ozone/moderation/defs.ts | 62 ++++ .../tools/ozone/moderation/queryStatuses.ts | 12 +- packages/ozone/src/mod-service/index.ts | 299 +++++++++++------- packages/ozone/src/mod-service/status.ts | 83 +++-- packages/ozone/src/mod-service/types.ts | 23 +- packages/ozone/src/mod-service/views.ts | 114 ++++--- packages/ozone/src/util.ts | 145 +++++++++ .../__snapshots__/get-record.test.ts.snap | 28 ++ .../__snapshots__/get-records.test.ts.snap | 14 + .../tests/__snapshots__/get-repo.test.ts.snap | 11 + .../__snapshots__/get-repos.test.ts.snap | 11 + .../moderation-events.test.ts.snap | 19 ++ .../moderation-statuses.test.ts.snap | 114 +++++++ packages/ozone/tests/get-record.test.ts | 4 + packages/ozone/tests/get-records.test.ts | 4 + packages/ozone/tests/get-repo.test.ts | 4 + packages/ozone/tests/get-repos.test.ts | 4 + .../ozone/tests/moderation-events.test.ts | 4 + .../ozone/tests/moderation-statuses.test.ts | 4 + packages/ozone/tests/query-labels.test.ts | 1 + packages/pds/src/lexicon/lexicons.ts | 101 +++++- .../types/tools/ozone/moderation/defs.ts | 62 ++++ .../tools/ozone/moderation/queryStatuses.ts | 12 +- .../takedown-appeal.test.ts.snap | 6 + .../proxied/__snapshots__/admin.test.ts.snap | 57 ++++ packages/pds/tests/proxied/admin.test.ts | 3 + 48 files changed, 1878 insertions(+), 300 deletions(-) create mode 100644 packages/ozone/src/daemon/materialized-view-refresher.ts create mode 100644 packages/ozone/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts create mode 100644 packages/ozone/src/db/schema/account_events_stats.ts create mode 100644 packages/ozone/src/db/schema/account_record_events_stats.ts create mode 100644 packages/ozone/src/db/schema/account_record_status_stats.ts create mode 100644 packages/ozone/src/db/schema/record_events_stats.ts diff --git a/lexicons/tools/ozone/moderation/defs.json b/lexicons/tools/ozone/moderation/defs.json index 7c590cddb3a..23bba198f24 100644 --- a/lexicons/tools/ozone/moderation/defs.json +++ b/lexicons/tools/ozone/moderation/defs.json @@ -182,6 +182,80 @@ "tags": { "type": "array", "items": { "type": "string" } + }, + "accountStats": { + "description": "Statistics related to the account subject", + "type": "ref", + "ref": "#accountStats" + }, + "recordsStats": { + "description": "Statistics related to the record subjects authored by the subject's account", + "type": "ref", + "ref": "#recordsStats" + } + } + }, + "accountStats": { + "description": "Statistics about a particular account subject", + "type": "object", + "properties": { + "reportCount": { + "description": "Total number of reports on the account", + "type": "integer" + }, + "appealCount": { + "description": "Total number of appeals against a moderation action on the account", + "type": "integer" + }, + "suspendCount": { + "description": "Number of times the account was suspended", + "type": "integer" + }, + "escalateCount": { + "description": "Number of times the account was escalated", + "type": "integer" + }, + "takedownCount": { + "description": "Number of times the account was taken down", + "type": "integer" + } + } + }, + "recordsStats": { + "description": "Statistics about a set of record subject items", + "type": "object", + "properties": { + "totalReports": { + "description": "Cumulative sum of the number of reports on the items in the set", + "type": "integer" + }, + "reportedCount": { + "description": "Number of items that were reported at least once", + "type": "integer" + }, + "escalatedCount": { + "description": "Number of items that were escalated at least once", + "type": "integer" + }, + "appealedCount": { + "description": "Number of items that were appealed at least once", + "type": "integer" + }, + "subjectCount": { + "description": "Total number of item in the set", + "type": "integer" + }, + "pendingCount": { + "description": "Number of item currently in \"reviewOpen\" or \"reviewEscalated\" state", + "type": "integer" + }, + "processedCount": { + "description": "Number of item currently in \"reviewNone\" or \"reviewClosed\" state", + "type": "integer" + }, + "takendownCount": { + "description": "Number of item currently taken down", + "type": "integer" } } }, diff --git a/lexicons/tools/ozone/moderation/queryStatuses.json b/lexicons/tools/ozone/moderation/queryStatuses.json index a8ff110db84..c280b2ed61e 100644 --- a/lexicons/tools/ozone/moderation/queryStatuses.json +++ b/lexicons/tools/ozone/moderation/queryStatuses.json @@ -107,7 +107,12 @@ "sortField": { "type": "string", "default": "lastReportedAt", - "enum": ["lastReviewedAt", "lastReportedAt"] + "enum": [ + "lastReviewedAt", + "lastReportedAt", + "reportedRecordsCount", + "takendownRecordsCount" + ] }, "sortDirection": { "type": "string", @@ -158,6 +163,18 @@ "type": "string", "description": "If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", "knownValues": ["account", "record"] + }, + "minAccountSuspendCount": { + "type": "integer", + "description": "If specified, only subjects that belong to an account that has at least this many suspensions will be returned." + }, + "minReportedRecordsCount": { + "type": "integer", + "description": "If specified, only subjects that belong to an account that has at least this many reported records will be returned." + }, + "minTakendownRecordsCount": { + "type": "integer", + "description": "If specified, only subjects that belong to an account that has at least this many taken down records will be returned." } } }, diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 154f03f9aa1..40bfab70933 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -11322,6 +11322,85 @@ export const schemaDict = { type: 'string', }, }, + accountStats: { + description: 'Statistics related to the account subject', + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#accountStats', + }, + recordsStats: { + description: + "Statistics related to the record subjects authored by the subject's account", + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#recordsStats', + }, + }, + }, + accountStats: { + description: 'Statistics about a particular account subject', + type: 'object', + properties: { + reportCount: { + description: 'Total number of reports on the account', + type: 'integer', + }, + appealCount: { + description: + 'Total number of appeals against a moderation action on the account', + type: 'integer', + }, + suspendCount: { + description: 'Number of times the account was suspended', + type: 'integer', + }, + escalateCount: { + description: 'Number of times the account was escalated', + type: 'integer', + }, + takedownCount: { + description: 'Number of times the account was taken down', + type: 'integer', + }, + }, + }, + recordsStats: { + description: 'Statistics about a set of record subject items', + type: 'object', + properties: { + totalReports: { + description: + 'Cumulative sum of the number of reports on the items in the set', + type: 'integer', + }, + reportedCount: { + description: 'Number of items that were reported at least once', + type: 'integer', + }, + escalatedCount: { + description: 'Number of items that were escalated at least once', + type: 'integer', + }, + appealedCount: { + description: 'Number of items that were appealed at least once', + type: 'integer', + }, + subjectCount: { + description: 'Total number of item in the set', + type: 'integer', + }, + pendingCount: { + description: + 'Number of item currently in "reviewOpen" or "reviewEscalated" state', + type: 'integer', + }, + processedCount: { + description: + 'Number of item currently in "reviewNone" or "reviewClosed" state', + type: 'integer', + }, + takendownCount: { + description: 'Number of item currently taken down', + type: 'integer', + }, }, }, subjectReviewState: { @@ -12570,7 +12649,12 @@ export const schemaDict = { sortField: { type: 'string', default: 'lastReportedAt', - enum: ['lastReviewedAt', 'lastReportedAt'], + enum: [ + 'lastReviewedAt', + 'lastReportedAt', + 'reportedRecordsCount', + 'takendownRecordsCount', + ], }, sortDirection: { type: 'string', @@ -12625,6 +12709,21 @@ export const schemaDict = { "If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", knownValues: ['account', 'record'], }, + minAccountSuspendCount: { + type: 'integer', + description: + 'If specified, only subjects that belong to an account that has at least this many suspensions will be returned.', + }, + minReportedRecordsCount: { + type: 'integer', + description: + 'If specified, only subjects that belong to an account that has at least this many reported records will be returned.', + }, + minTakendownRecordsCount: { + type: 'integer', + description: + 'If specified, only subjects that belong to an account that has at least this many taken down records will be returned.', + }, }, }, output: { diff --git a/packages/api/src/client/types/tools/ozone/moderation/defs.ts b/packages/api/src/client/types/tools/ozone/moderation/defs.ts index fd58278374b..df753c9cfc4 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/defs.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/defs.ts @@ -136,6 +136,8 @@ export interface SubjectStatusView { appealed?: boolean suspendUntil?: string tags?: string[] + accountStats?: AccountStats + recordsStats?: RecordsStats [k: string]: unknown } @@ -151,6 +153,66 @@ export function validateSubjectStatusView(v: unknown): ValidationResult { return lexicons.validate('tools.ozone.moderation.defs#subjectStatusView', v) } +/** Statistics about a particular account subject */ +export interface AccountStats { + /** Total number of reports on the account */ + reportCount?: number + /** Total number of appeals against a moderation action on the account */ + appealCount?: number + /** Number of times the account was suspended */ + suspendCount?: number + /** Number of times the account was escalated */ + escalateCount?: number + /** Number of times the account was taken down */ + takedownCount?: number + [k: string]: unknown +} + +export function isAccountStats(v: unknown): v is AccountStats { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'tools.ozone.moderation.defs#accountStats' + ) +} + +export function validateAccountStats(v: unknown): ValidationResult { + return lexicons.validate('tools.ozone.moderation.defs#accountStats', v) +} + +/** Statistics about a set of record subject items */ +export interface RecordsStats { + /** Cumulative sum of the number of reports on the items in the set */ + totalReports?: number + /** Number of items that were reported at least once */ + reportedCount?: number + /** Number of items that were escalated at least once */ + escalatedCount?: number + /** Number of items that were appealed at least once */ + appealedCount?: number + /** Total number of item in the set */ + subjectCount?: number + /** Number of item currently in "reviewOpen" or "reviewEscalated" state */ + pendingCount?: number + /** Number of item currently in "reviewNone" or "reviewClosed" state */ + processedCount?: number + /** Number of item currently taken down */ + takendownCount?: number + [k: string]: unknown +} + +export function isRecordsStats(v: unknown): v is RecordsStats { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'tools.ozone.moderation.defs#recordsStats' + ) +} + +export function validateRecordsStats(v: unknown): ValidationResult { + return lexicons.validate('tools.ozone.moderation.defs#recordsStats', v) +} + export type SubjectReviewState = | 'lex:tools.ozone.moderation.defs#reviewOpen' | 'lex:tools.ozone.moderation.defs#reviewEscalated' diff --git a/packages/api/src/client/types/tools/ozone/moderation/queryStatuses.ts b/packages/api/src/client/types/tools/ozone/moderation/queryStatuses.ts index 2af6808ed19..97e22ff240c 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/queryStatuses.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/queryStatuses.ts @@ -48,7 +48,11 @@ export interface QueryParams { ignoreSubjects?: string[] /** Get all subject statuses that were reviewed by a specific moderator */ lastReviewedBy?: string - sortField?: 'lastReviewedAt' | 'lastReportedAt' + sortField?: + | 'lastReviewedAt' + | 'lastReportedAt' + | 'reportedRecordsCount' + | 'takendownRecordsCount' sortDirection?: 'asc' | 'desc' /** Get subjects that were taken down */ takendown?: boolean @@ -62,6 +66,12 @@ export interface QueryParams { collections?: string[] /** If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored. */ subjectType?: 'account' | 'record' | (string & {}) + /** If specified, only subjects that belong to an account that has at least this many suspensions will be returned. */ + minAccountSuspendCount?: number + /** If specified, only subjects that belong to an account that has at least this many reported records will be returned. */ + minReportedRecordsCount?: number + /** If specified, only subjects that belong to an account that has at least this many taken down records will be returned. */ + minTakendownRecordsCount?: number } export type InputSchema = undefined diff --git a/packages/dev-env/src/bin.ts b/packages/dev-env/src/bin.ts index c0b8c5c7e2c..8f367b2cf8f 100644 --- a/packages/dev-env/src/bin.ts +++ b/packages/dev-env/src/bin.ts @@ -30,6 +30,7 @@ const run = async () => { port: 2587, chatUrl: 'http://localhost:2590', // must run separate chat service chatDid: 'did:example:chat', + dbMaterializedViewRefreshIntervalMs: 30_000, }, introspect: { port: 2581 }, }) diff --git a/packages/ozone/src/api/moderation/queryStatuses.ts b/packages/ozone/src/api/moderation/queryStatuses.ts index c82fdee7091..a2f77560436 100644 --- a/packages/ozone/src/api/moderation/queryStatuses.ts +++ b/packages/ozone/src/api/moderation/queryStatuses.ts @@ -1,75 +1,13 @@ import { Server } from '../../lexicon' import AppContext from '../../context' -import { getReviewState } from '../util' export default function (server: Server, ctx: AppContext) { server.tools.ozone.moderation.queryStatuses({ auth: ctx.authVerifier.modOrAdminToken, handler: async ({ params }) => { - const { - includeAllUserRecords, - subject, - takendown, - appealed, - reviewState, - reviewedAfter, - reviewedBefore, - reportedAfter, - reportedBefore, - ignoreSubjects, - lastReviewedBy, - hostingDeletedBefore, - hostingDeletedAfter, - hostingUpdatedBefore, - hostingUpdatedAfter, - hostingStatuses, - sortDirection = 'desc', - sortField = 'lastReportedAt', - includeMuted = false, - onlyMuted = false, - limit = 50, - cursor, - tags = [], - excludeTags = [], - collections = [], - subjectType, - queueCount, - queueIndex, - queueSeed, - } = params const db = ctx.db const modService = ctx.modService(db) - const results = await modService.getSubjectStatuses({ - reviewState: getReviewState(reviewState), - includeAllUserRecords, - subject, - takendown, - appealed, - reviewedAfter, - reviewedBefore, - reportedAfter, - reportedBefore, - includeMuted, - hostingDeletedBefore, - hostingDeletedAfter, - hostingUpdatedBefore, - hostingUpdatedAfter, - hostingStatuses, - onlyMuted, - ignoreSubjects, - sortDirection, - lastReviewedBy, - sortField, - limit, - cursor, - tags, - excludeTags, - collections, - subjectType, - queueCount, - queueIndex, - queueSeed, - }) + const results = await modService.getSubjectStatuses(params) const subjectStatuses = results.statuses.map((status) => modService.views.formatSubjectStatus(status), ) diff --git a/packages/ozone/src/background.ts b/packages/ozone/src/background.ts index 78cd790e779..5730dd3963c 100644 --- a/packages/ozone/src/background.ts +++ b/packages/ozone/src/background.ts @@ -1,35 +1,161 @@ import PQueue from 'p-queue' import { Database } from './db' import { dbLogger } from './logger' +import { boundAbortController, isCausedBySignal, startInterval } from './util' -// A simple queue for in-process, out-of-band/backgrounded work +type Task = (db: Database, signal: AbortSignal) => Promise +/** + * A simple queue for in-process, out-of-band/backgrounded work + */ export class BackgroundQueue { - queue = new PQueue({ concurrency: 20 }) - destroyed = false - constructor(public db: Database) {} + private abortController = new AbortController() + private queue = new PQueue({ concurrency: 20 }) - add(task: Task) { + public get signal() { + return this.abortController.signal + } + + public get destroyed() { + return this.signal.aborted + } + + constructor(protected db: Database) {} + + getStats() { + return { + runningCount: this.queue.pending, + waitingCount: this.queue.size, + } + } + + /** + * Add a task that will be executed at some point in the future. + * + * The task will be executed even if the backgroundQueue is destroyed, unless + * the provided `signal` is aborted. + * + * The `signal` provided to the task will be aborted whenever either the + * backgroundQueue is destroyed or the provided `signal` is aborted. + */ + async add(task: Task, signal?: AbortSignal): Promise { if (this.destroyed) { return } - this.queue - .add(() => task(this.db)) - .catch((err) => { - dbLogger.error(err, 'background queue task failed') - }) + + const abortController = boundAbortController(this.signal, signal) + + return this.queue.add(async () => { + try { + // Do not run the task if the signal provided to the task has become + // aborted. Do not use `abortController.signal` here since we do not + // want to abort the task if the backgroundQueue is being destroyed. + if (signal?.aborted) return + + // The task will receive a "combined signal" allowing it to abort if + // either the backgroundQueue is destroyed or the provided signal is + // aborted. + await task(this.db, abortController.signal) + } catch (err) { + if (!isCausedBySignal(err, abortController.signal)) { + dbLogger.error(err, 'background queue task failed') + } + } finally { + abortController.abort() + } + }) } async processAll() { await this.queue.onIdle() } - // On destroy we stop accepting new tasks, but complete all pending/in-progress tasks. - // The application calls this only once http connections have drained (tasks no longer being added). + /** + * On destroy we stop accepting new tasks, but complete all + * pending/in-progress tasks. Tasks can decide to abort their current + * operation based on the signal they received. The application calls this + * only once http connections have drained (tasks no longer being added). + */ async destroy() { - this.destroyed = true + this.abortController.abort() await this.queue.onIdle() } } -type Task = (db: Database) => Promise +/** + * A simple periodic background task runner. This class will schedule a task to + * run through a provided {@link BackgroundQueue} at a fixed interval. The task + * will never run more than once concurrently, and will wait at least `interval` + * milliseconds between the end of one run and the start of the next. + */ +export class PeriodicBackgroundTask { + private abortController: AbortController + + private intervalPromise?: Promise + private runningPromise?: Promise + + public get signal() { + return this.abortController.signal + } + + public get destroyed() { + return this.signal.aborted + } + + constructor( + protected backgroundQueue: BackgroundQueue, + protected interval: number, + protected task: Task, + ) { + if (!Number.isFinite(interval) || interval <= 0) { + throw new TypeError('interval must be a positive number') + } + + // Bind this class's signal to the backgroundQueue's signal (destroying this + // instance if the backgroundQueue is destroyed) + this.abortController = boundAbortController(backgroundQueue.signal) + } + + public run(signal?: AbortSignal): Promise { + // `startInterval` already ensures that only one run is in progress at a + // time. However, we want to be able to expose a `run()` method that can be + // used to force a run, which could cause concurrent executions. We prevent + // this using the `runningPromise` property. + + if (this.runningPromise) return this.runningPromise + + // Combine the `this.signal` with the provided `signal`, if any. + const abortController = boundAbortController(this.signal, signal) + + const promise = this.backgroundQueue.add(this.task, abortController.signal) + + return (this.runningPromise = promise).finally(() => { + if (this.runningPromise === promise) this.runningPromise = undefined + + // Cleanup the listeners added by `boundAbortController` + abortController.abort() + }) + } + + public start() { + // Noop if already started. Throws if this.signal is aborted (instance is + // destroyed). + this.intervalPromise ||= startInterval( + async (signal) => this.run(signal), + this.interval, + this.signal, + ) + } + + public async destroy() { + // @NOTE This instance does not "own" the backgroundQueue, so we do not + // destroy it here. + + this.abortController.abort() + console.error('ABOOOORT') + + await this.intervalPromise + this.intervalPromise = undefined + console.error('DONE -_-') + } +} diff --git a/packages/ozone/src/config/config.ts b/packages/ozone/src/config/config.ts index a5eea6c5c1f..808163c15f1 100644 --- a/packages/ozone/src/config/config.ts +++ b/packages/ozone/src/config/config.ts @@ -24,6 +24,7 @@ export const envToCfg = (env: OzoneEnvironment): OzoneConfig => { poolSize: env.dbPoolSize, poolMaxUses: env.dbPoolMaxUses, poolIdleTimeoutMs: env.dbPoolIdleTimeoutMs, + materializedViewRefreshIntervalMs: env.dbMaterializedViewRefreshIntervalMs, } assert(env.appviewUrl, 'appviewUrl is required') @@ -122,6 +123,7 @@ export type DatabaseConfig = { poolSize?: number poolMaxUses?: number poolIdleTimeoutMs?: number + materializedViewRefreshIntervalMs?: number } export type AppviewConfig = { diff --git a/packages/ozone/src/config/env.ts b/packages/ozone/src/config/env.ts index 173b874e78e..6d930c4e59c 100644 --- a/packages/ozone/src/config/env.ts +++ b/packages/ozone/src/config/env.ts @@ -20,6 +20,9 @@ export const readEnv = (): OzoneEnvironment => { dbPoolSize: envInt('OZONE_DB_POOL_SIZE'), dbPoolMaxUses: envInt('OZONE_DB_POOL_MAX_USES'), dbPoolIdleTimeoutMs: envInt('OZONE_DB_POOL_IDLE_TIMEOUT_MS'), + dbMaterializedViewRefreshIntervalMs: envInt( + 'OZONE_DB_MATERIALIZED_VIEW_REFRESH_INTERVAL_MS', + ), didPlcUrl: envStr('OZONE_DID_PLC_URL'), didCacheStaleTTL: envInt('OZONE_DID_CACHE_STALE_TTL'), didCacheMaxTTL: envInt('OZONE_DID_CACHE_MAX_TTL'), @@ -53,6 +56,7 @@ export type OzoneEnvironment = { dbPoolSize?: number dbPoolMaxUses?: number dbPoolIdleTimeoutMs?: number + dbMaterializedViewRefreshIntervalMs?: number didPlcUrl?: string didCacheStaleTTL?: number didCacheMaxTTL?: number diff --git a/packages/ozone/src/daemon/context.ts b/packages/ozone/src/daemon/context.ts index d81f3f4d78b..722ffa4655e 100644 --- a/packages/ozone/src/daemon/context.ts +++ b/packages/ozone/src/daemon/context.ts @@ -6,17 +6,20 @@ import { OzoneConfig, OzoneSecrets } from '../config' import { Database } from '../db' import { EventPusher } from './event-pusher' import { EventReverser } from './event-reverser' -import { ModerationService, ModerationServiceCreator } from '../mod-service' +import { ModerationService } from '../mod-service' import { BackgroundQueue } from '../background' import { getSigningKeyId } from '../util' +import { MaterializedViewRefresher } from './materialized-view-refresher' +import { allFulfilled } from '@atproto/common' export type DaemonContextOptions = { db: Database cfg: OzoneConfig - modService: ModerationServiceCreator + backgroundQueue: BackgroundQueue signingKey: Keypair eventPusher: EventPusher eventReverser: EventReverser + materializedViewRefresher: MaterializedViewRefresher } export class DaemonContext { @@ -67,13 +70,19 @@ export class DaemonContext { const eventReverser = new EventReverser(db, modService) + const materializedViewRefresher = new MaterializedViewRefresher( + backgroundQueue, + cfg.db.materializedViewRefreshIntervalMs, + ) + return new DaemonContext({ db, cfg, - modService, + backgroundQueue, signingKey, eventPusher, eventReverser, + materializedViewRefresher, ...(overrides ?? {}), }) } @@ -86,8 +95,8 @@ export class DaemonContext { return this.opts.cfg } - get modService(): ModerationServiceCreator { - return this.opts.modService + get backgroundQueue(): BackgroundQueue { + return this.opts.backgroundQueue } get eventPusher(): EventPusher { @@ -97,6 +106,35 @@ export class DaemonContext { get eventReverser(): EventReverser { return this.opts.eventReverser } + + get materializedViewRefresher(): MaterializedViewRefresher { + return this.opts.materializedViewRefresher + } + + async start() { + this.eventPusher.start() + this.eventReverser.start() + this.materializedViewRefresher.start() + } + + async processAll() { + // Sequential because the materialized view values depend on the events. + await this.eventPusher.processAll() + await this.materializedViewRefresher.run() + } + + async destroy() { + try { + await allFulfilled([ + this.eventReverser.destroy(), + this.eventPusher.destroy(), + this.materializedViewRefresher.destroy(), + ]) + } finally { + await this.backgroundQueue.destroy() + await this.db.close() + } + } } export default DaemonContext diff --git a/packages/ozone/src/daemon/index.ts b/packages/ozone/src/daemon/index.ts index 501b8caad5c..e29305ba91f 100644 --- a/packages/ozone/src/daemon/index.ts +++ b/packages/ozone/src/daemon/index.ts @@ -18,17 +18,14 @@ export class OzoneDaemon { } async start() { - this.ctx.eventPusher.start() - this.ctx.eventReverser.start() + await this.ctx.start() } async processAll() { - await this.ctx.eventPusher.processAll() + await this.ctx.processAll() } async destroy() { - await this.ctx.eventReverser.destroy() - await this.ctx.eventPusher.destroy() - await this.ctx.db.close() + await this.ctx.destroy() } } diff --git a/packages/ozone/src/daemon/materialized-view-refresher.ts b/packages/ozone/src/daemon/materialized-view-refresher.ts new file mode 100644 index 00000000000..22c84cd8b53 --- /dev/null +++ b/packages/ozone/src/daemon/materialized-view-refresher.ts @@ -0,0 +1,27 @@ +import { MINUTE } from '@atproto/common' +import { sql } from 'kysely' +import { BackgroundQueue, PeriodicBackgroundTask } from '../background' + +export class MaterializedViewRefresher extends PeriodicBackgroundTask { + constructor(backgroundQueue: BackgroundQueue, interval = 30 * MINUTE) { + super(backgroundQueue, interval, async ({ db }, signal) => { + for (const view of [ + 'account_events_stats', + 'record_events_stats', + 'account_record_events_stats', + 'account_record_status_stats', + ]) { + if (signal.aborted) break + + // Kysely does not provide a way to cancel a running query. Because of + // this, killing the process during a refresh will cause the process to + // wait for the current refresh to finish before exiting. This is not + // ideal, but it is the best we can do until Kysely provides a way to + // cancel a query. + await sql`REFRESH MATERIALIZED VIEW CONCURRENTLY ${sql.id(view)}`.execute( + db, + ) + } + }) + } +} diff --git a/packages/ozone/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts b/packages/ozone/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts new file mode 100644 index 00000000000..b961e61a7d0 --- /dev/null +++ b/packages/ozone/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts @@ -0,0 +1,218 @@ +import { Kysely, sql } from 'kysely' + +import { REASONAPPEAL } from '../../lexicon/types/com/atproto/moderation/defs' +import { DatabaseSchemaType } from '../schema' + +import { + REVIEWESCALATED, + REVIEWOPEN, +} from '../../lexicon/types/tools/ozone/moderation/defs' +import * as modEvent from '../schema/moderation_event' +import * as modStatus from '../schema/moderation_subject_status' +import * as recordEventsStats from '../schema/record_events_stats' + +export async function up(db: Kysely): Promise { + // Used by "tools.ozone.moderation.queryStatuses". Reduces query cost by two + // order of magnitudes when sorting using "reportedRecordsCount" or + // "takendownRecordsCount" and filtering by "reviewState". + await db.schema + .createIndex('moderation_subject_status_did_id_review_state_idx') + .on('moderation_subject_status') + .column('did') + .expression(sql`"id" ASC NULLS FIRST`) + .column('reviewState') + .execute() + + // ~6sec for 16M events + await db.schema + .createView('account_events_stats') + .materialized() + .ifNotExists() + .as( + (db as Kysely) + .selectFrom('moderation_event') + .where('subjectType', '=', 'com.atproto.admin.defs#repoRef') + .where('subjectUri', 'is', null) + .select('subjectDid') + .select([ + (eb) => + sql`COUNT(*) FILTER( + WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown' + AND ${eb.ref('durationInHours')} IS NULL + )`.as('takedownCount'), + (eb) => + sql`COUNT(*) FILTER( + WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown' + AND ${eb.ref('durationInHours')} IS NOT NULL + )`.as('suspendCount'), + (eb) => + sql`COUNT(*) FILTER( + WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate' + )`.as('escalateCount'), + (eb) => + sql`COUNT(*) FILTER( + WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' + AND ${eb.ref('meta')} ->> 'reportType' != ${REASONAPPEAL} + )`.as('reportCount'), + (eb) => + sql`COUNT(*) FILTER( + WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' + AND ${eb.ref('meta')} ->> 'reportType' = ${REASONAPPEAL} + )`.as('appealCount'), + ]) + .groupBy('subjectDid'), + ) + .execute() + + await db.schema + .createIndex('account_events_stats_did_idx') + .unique() + .on('account_events_stats') + .column('subjectDid') + .execute() + + await db.schema + .createIndex('account_events_stats_suspend_count_idx') + .on('account_events_stats') + .expression(sql`"suspendCount" ASC NULLS FIRST`) + .column('subjectDid') + .execute() + + // ~50sec for 16M events + await db.schema + .createView('record_events_stats') + .materialized() + .ifNotExists() + .as( + (db as Kysely) + .selectFrom('moderation_event') + .select([ + 'subjectDid', + 'subjectUri', + (eb) => + sql`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate')`.as( + 'escalateCount', + ), + (eb) => + sql`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' != 'com.atproto.moderation.defs#reasonAppeal')`.as( + 'reportCount', + ), + (eb) => + sql`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' = 'com.atproto.moderation.defs#reasonAppeal')`.as( + 'appealCount', + ), + ]) + .where('subjectType', '=', 'com.atproto.repo.strongRef') + .where('subjectUri', 'is not', null) + .groupBy(['subjectDid', 'subjectUri']), + ) + .execute() + + await db.schema + .createIndex('record_events_stats_uri_idx') + .unique() + .on('record_events_stats') + .column('subjectUri') + .execute() + + await db.schema + .createIndex('record_events_stats_did_idx') + .on('record_events_stats') + .column('subjectDid') + .execute() + + await db.schema + .createView('account_record_events_stats') + .materialized() + .ifNotExists() + .as( + (db as Kysely) + .selectFrom('record_events_stats') + .select([ + 'subjectDid', + (eb) => + // Casting to "bigint" because "numeric" gets casted to a string + // by default by postgres-node. + sql`SUM(${eb.ref('reportCount')})::bigint`.as( + 'totalReports', + ), + (eb) => + sql`COUNT(*) FILTER (WHERE ${eb.ref('reportCount')} > 0)`.as( + 'reportedCount', + ), + (eb) => + sql`COUNT(*) FILTER (WHERE ${eb.ref('escalateCount')} > 0)`.as( + 'escalatedCount', + ), + (eb) => + sql`COUNT(*) FILTER (WHERE ${eb.ref('appealCount')} > 0)`.as( + 'appealedCount', + ), + ]) + .groupBy('subjectDid'), + ) + .execute() + + await db.schema + .createIndex('account_record_events_stats_did_idx') + .unique() + .on('account_record_events_stats') + .column('subjectDid') + .execute() + + await db.schema + .createIndex('account_record_events_stats_reported_count_idx') + .on('account_record_events_stats') + .expression(sql`"reportedCount" ASC NULLS FIRST`) + .column('subjectDid') + .execute() + + await db.schema + .createView('account_record_status_stats') + .materialized() + .ifNotExists() + .as( + (db as Kysely) + .selectFrom('moderation_subject_status') + .select('did') + .select([ + sql`COUNT(*)`.as('subjectCount'), + (eb) => + sql`COUNT(*) FILTER (WHERE ${eb.ref('reviewState')} IN (${REVIEWOPEN}, ${REVIEWESCALATED}))`.as( + 'pendingCount', + ), + (eb) => + sql`COUNT(*) FILTER (WHERE ${eb.ref('reviewState')} NOT IN (${REVIEWOPEN}, ${REVIEWESCALATED}))`.as( + 'processedCount', + ), + (eb) => + sql`COUNT(*) FILTER (WHERE ${eb.ref('takendown')})`.as( + 'takendownCount', + ), + ]) + .where('recordPath', '!=', '') + .groupBy('did'), + ) + .execute() + + await db.schema + .createIndex('account_record_status_stats_did_idx') + .unique() + .on('account_record_status_stats') + .column('did') + .execute() + + await db.schema + .createIndex('account_record_status_stats_takendown_count_idx') + .on('account_record_status_stats') + .expression(sql`"takendownCount" ASC NULLS FIRST`) + .column('did') + .execute() +} + +export async function down(db: Kysely): Promise { + db.schema.dropView('account_record_status_stats').materialized().execute() + db.schema.dropView('account_record_events_stats').materialized().execute() + db.schema.dropView('record_events_stats').materialized().execute() + db.schema.dropView('account_events_stats').materialized().execute() +} diff --git a/packages/ozone/src/db/migrations/index.ts b/packages/ozone/src/db/migrations/index.ts index be299b76edb..08103249701 100644 --- a/packages/ozone/src/db/migrations/index.ts +++ b/packages/ozone/src/db/migrations/index.ts @@ -17,3 +17,4 @@ export * as _20241001T205730722Z from './20241001T205730722Z-subject-status-revi export * as _20241008T205730722Z from './20241008T205730722Z-sets' export * as _20241018T205730722Z from './20241018T205730722Z-setting' export * as _20241026T205730722Z from './20241026T205730722Z-add-hosting-status-to-subject-status' +export * as _20241220T144630860Z from './20241220T144630860Z-stats-materialized-views' diff --git a/packages/ozone/src/db/schema/account_events_stats.ts b/packages/ozone/src/db/schema/account_events_stats.ts new file mode 100644 index 00000000000..e0848c29a9f --- /dev/null +++ b/packages/ozone/src/db/schema/account_events_stats.ts @@ -0,0 +1,16 @@ +import { GeneratedAlways, Selectable } from 'kysely' + +export const tableName = 'account_events_stats' + +export type AccountEventsStats = { + subjectDid: GeneratedAlways + takedownCount: GeneratedAlways + suspendCount: GeneratedAlways + escalateCount: GeneratedAlways + reportCount: GeneratedAlways + appealCount: GeneratedAlways +} + +export type AccountEventsStatsRow = Selectable + +export type PartialDB = { [tableName]: AccountEventsStats } diff --git a/packages/ozone/src/db/schema/account_record_events_stats.ts b/packages/ozone/src/db/schema/account_record_events_stats.ts new file mode 100644 index 00000000000..0af4d5b2aaa --- /dev/null +++ b/packages/ozone/src/db/schema/account_record_events_stats.ts @@ -0,0 +1,15 @@ +import { GeneratedAlways, Selectable } from 'kysely' + +export const tableName = 'account_record_events_stats' + +type AccountRecordEventsStats = { + subjectDid: GeneratedAlways + totalReports: GeneratedAlways + reportedCount: GeneratedAlways + escalatedCount: GeneratedAlways + appealedCount: GeneratedAlways +} + +export type AccountRecordEventsStatsRow = Selectable + +export type PartialDB = { [tableName]: AccountRecordEventsStats } diff --git a/packages/ozone/src/db/schema/account_record_status_stats.ts b/packages/ozone/src/db/schema/account_record_status_stats.ts new file mode 100644 index 00000000000..7c333209007 --- /dev/null +++ b/packages/ozone/src/db/schema/account_record_status_stats.ts @@ -0,0 +1,15 @@ +import { GeneratedAlways, Selectable } from 'kysely' + +export const tableName = 'account_record_status_stats' + +type AccountRecordStatusStats = { + did: GeneratedAlways + subjectCount: GeneratedAlways + pendingCount: GeneratedAlways + processedCount: GeneratedAlways + takendownCount: GeneratedAlways +} + +export type AccountRecordStatusStatsRow = Selectable + +export type PartialDB = { [tableName]: AccountRecordStatusStats } diff --git a/packages/ozone/src/db/schema/index.ts b/packages/ozone/src/db/schema/index.ts index ba403c802b8..36a1b3ae376 100644 --- a/packages/ozone/src/db/schema/index.ts +++ b/packages/ozone/src/db/schema/index.ts @@ -11,6 +11,11 @@ import * as set from './ozone_set' import * as member from './member' import * as setting from './setting' +import * as recordEventsStats from './record_events_stats' +import * as accountEventsStats from './account_events_stats' +import * as accountRecordEventsStats from './account_record_events_stats' +import * as accountRecordStatusStats from './account_record_status_stats' + export type DatabaseSchemaType = modEvent.PartialDB & modSubjectStatus.PartialDB & label.PartialDB & @@ -21,7 +26,11 @@ export type DatabaseSchemaType = modEvent.PartialDB & communicationTemplate.PartialDB & set.PartialDB & member.PartialDB & - setting.PartialDB + setting.PartialDB & + accountEventsStats.PartialDB & + recordEventsStats.PartialDB & + accountRecordEventsStats.PartialDB & + accountRecordStatusStats.PartialDB export type DatabaseSchema = Kysely diff --git a/packages/ozone/src/db/schema/record_events_stats.ts b/packages/ozone/src/db/schema/record_events_stats.ts new file mode 100644 index 00000000000..951b7773500 --- /dev/null +++ b/packages/ozone/src/db/schema/record_events_stats.ts @@ -0,0 +1,15 @@ +import { GeneratedAlways, Selectable } from 'kysely' + +export const tableName = 'record_events_stats' + +export type RecordEventsStats = { + subjectDid: GeneratedAlways + subjectUri: GeneratedAlways + escalateCount: GeneratedAlways + reportCount: GeneratedAlways + appealCount: GeneratedAlways +} + +export type RecordEventsStatsRow = Selectable + +export type PartialDB = { [tableName]: RecordEventsStats } diff --git a/packages/ozone/src/index.ts b/packages/ozone/src/index.ts index eb31f58b973..743f181bdee 100644 --- a/packages/ozone/src/index.ts +++ b/packages/ozone/src/index.ts @@ -114,13 +114,7 @@ export class OzoneService { }, 'db pool stats', ) - dbLogger.info( - { - runningCount: backgroundQueue.queue.pending, - waitingCount: backgroundQueue.queue.size, - }, - 'background queue stats', - ) + dbLogger.info(backgroundQueue.getStats(), 'background queue stats') }, 10000) await this.ctx.sequencer.start() const server = this.app.listen(this.ctx.cfg.service.port) diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 154f03f9aa1..40bfab70933 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -11322,6 +11322,85 @@ export const schemaDict = { type: 'string', }, }, + accountStats: { + description: 'Statistics related to the account subject', + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#accountStats', + }, + recordsStats: { + description: + "Statistics related to the record subjects authored by the subject's account", + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#recordsStats', + }, + }, + }, + accountStats: { + description: 'Statistics about a particular account subject', + type: 'object', + properties: { + reportCount: { + description: 'Total number of reports on the account', + type: 'integer', + }, + appealCount: { + description: + 'Total number of appeals against a moderation action on the account', + type: 'integer', + }, + suspendCount: { + description: 'Number of times the account was suspended', + type: 'integer', + }, + escalateCount: { + description: 'Number of times the account was escalated', + type: 'integer', + }, + takedownCount: { + description: 'Number of times the account was taken down', + type: 'integer', + }, + }, + }, + recordsStats: { + description: 'Statistics about a set of record subject items', + type: 'object', + properties: { + totalReports: { + description: + 'Cumulative sum of the number of reports on the items in the set', + type: 'integer', + }, + reportedCount: { + description: 'Number of items that were reported at least once', + type: 'integer', + }, + escalatedCount: { + description: 'Number of items that were escalated at least once', + type: 'integer', + }, + appealedCount: { + description: 'Number of items that were appealed at least once', + type: 'integer', + }, + subjectCount: { + description: 'Total number of item in the set', + type: 'integer', + }, + pendingCount: { + description: + 'Number of item currently in "reviewOpen" or "reviewEscalated" state', + type: 'integer', + }, + processedCount: { + description: + 'Number of item currently in "reviewNone" or "reviewClosed" state', + type: 'integer', + }, + takendownCount: { + description: 'Number of item currently taken down', + type: 'integer', + }, }, }, subjectReviewState: { @@ -12570,7 +12649,12 @@ export const schemaDict = { sortField: { type: 'string', default: 'lastReportedAt', - enum: ['lastReviewedAt', 'lastReportedAt'], + enum: [ + 'lastReviewedAt', + 'lastReportedAt', + 'reportedRecordsCount', + 'takendownRecordsCount', + ], }, sortDirection: { type: 'string', @@ -12625,6 +12709,21 @@ export const schemaDict = { "If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", knownValues: ['account', 'record'], }, + minAccountSuspendCount: { + type: 'integer', + description: + 'If specified, only subjects that belong to an account that has at least this many suspensions will be returned.', + }, + minReportedRecordsCount: { + type: 'integer', + description: + 'If specified, only subjects that belong to an account that has at least this many reported records will be returned.', + }, + minTakendownRecordsCount: { + type: 'integer', + description: + 'If specified, only subjects that belong to an account that has at least this many taken down records will be returned.', + }, }, }, output: { diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts index 7397fafc19d..572d323a298 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts @@ -136,6 +136,8 @@ export interface SubjectStatusView { appealed?: boolean suspendUntil?: string tags?: string[] + accountStats?: AccountStats + recordsStats?: RecordsStats [k: string]: unknown } @@ -151,6 +153,66 @@ export function validateSubjectStatusView(v: unknown): ValidationResult { return lexicons.validate('tools.ozone.moderation.defs#subjectStatusView', v) } +/** Statistics about a particular account subject */ +export interface AccountStats { + /** Total number of reports on the account */ + reportCount?: number + /** Total number of appeals against a moderation action on the account */ + appealCount?: number + /** Number of times the account was suspended */ + suspendCount?: number + /** Number of times the account was escalated */ + escalateCount?: number + /** Number of times the account was taken down */ + takedownCount?: number + [k: string]: unknown +} + +export function isAccountStats(v: unknown): v is AccountStats { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'tools.ozone.moderation.defs#accountStats' + ) +} + +export function validateAccountStats(v: unknown): ValidationResult { + return lexicons.validate('tools.ozone.moderation.defs#accountStats', v) +} + +/** Statistics about a set of record subject items */ +export interface RecordsStats { + /** Cumulative sum of the number of reports on the items in the set */ + totalReports?: number + /** Number of items that were reported at least once */ + reportedCount?: number + /** Number of items that were escalated at least once */ + escalatedCount?: number + /** Number of items that were appealed at least once */ + appealedCount?: number + /** Total number of item in the set */ + subjectCount?: number + /** Number of item currently in "reviewOpen" or "reviewEscalated" state */ + pendingCount?: number + /** Number of item currently in "reviewNone" or "reviewClosed" state */ + processedCount?: number + /** Number of item currently taken down */ + takendownCount?: number + [k: string]: unknown +} + +export function isRecordsStats(v: unknown): v is RecordsStats { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'tools.ozone.moderation.defs#recordsStats' + ) +} + +export function validateRecordsStats(v: unknown): ValidationResult { + return lexicons.validate('tools.ozone.moderation.defs#recordsStats', v) +} + export type SubjectReviewState = | 'lex:tools.ozone.moderation.defs#reviewOpen' | 'lex:tools.ozone.moderation.defs#reviewEscalated' diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts index 0ccd1030c0b..28270425304 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts @@ -49,7 +49,11 @@ export interface QueryParams { ignoreSubjects?: string[] /** Get all subject statuses that were reviewed by a specific moderator */ lastReviewedBy?: string - sortField: 'lastReviewedAt' | 'lastReportedAt' + sortField: + | 'lastReviewedAt' + | 'lastReportedAt' + | 'reportedRecordsCount' + | 'takendownRecordsCount' sortDirection: 'asc' | 'desc' /** Get subjects that were taken down */ takendown?: boolean @@ -63,6 +67,12 @@ export interface QueryParams { collections?: string[] /** If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored. */ subjectType?: 'account' | 'record' | (string & {}) + /** If specified, only subjects that belong to an account that has at least this many suspensions will be returned. */ + minAccountSuspendCount?: number + /** If specified, only subjects that belong to an account that has at least this many reported records will be returned. */ + minReportedRecordsCount?: number + /** If specified, only subjects that belong to an account that has at least this many taken down records will be returned. */ + minTakendownRecordsCount?: number } export type InputSchema = undefined diff --git a/packages/ozone/src/mod-service/index.ts b/packages/ozone/src/mod-service/index.ts index cfc4bf76fa9..a1fd403fa2f 100644 --- a/packages/ozone/src/mod-service/index.ts +++ b/packages/ozone/src/mod-service/index.ts @@ -1,5 +1,5 @@ import net from 'node:net' -import { Insertable, SelectQueryBuilder, sql } from 'kysely' +import { Insertable, sql } from 'kysely' import { CID } from 'multiformats/cid' import { AtUri, INVALID_HANDLE } from '@atproto/syntax' import { InvalidRequestError } from '@atproto/xrpc-server' @@ -29,16 +29,19 @@ import { RepoRef, RepoBlobRef } from '../lexicon/types/com/atproto/admin/defs' import { adjustModerationSubjectStatus, getStatusIdentifierFromSubject, + moderationSubjectStatusQueryBuilder, } from './status' import { ModEventType, ModerationEventRow, ModerationSubjectStatusRow, + ModerationSubjectStatusRowWithHandle, ReversibleModerationEvent, } from './types' import { ModerationEvent } from '../db/schema/moderation_event' import { StatusKeyset, TimeIdKeyset, paginate } from '../db/pagination' import { Label } from '../lexicon/types/com/atproto/label/defs' +import { QueryParams as QueryStatusParams } from '../lexicon/types/tools/ozone/moderation/queryStatuses' import { ModSubject, RecordSubject, @@ -56,6 +59,7 @@ import { httpLogger as log } from '../logger' import { OzoneConfig } from '../config' import { LABELER_HEADER_NAME, ParsedLabelers } from '../util' import { ids } from '../lexicon/lexicons' +import { getReviewState } from '../api/util' export type ModerationServiceCreator = (db: Database) => ModerationService @@ -805,45 +809,6 @@ export class ModerationService { return result } - applyTagFilter = ( - builder: SelectQueryBuilder, - tags: string[], - ) => { - const { ref } = this.db.db.dynamic - // Build an array of conditions - const conditions = tags - .map((tag) => { - if (tag.includes('&&')) { - // Split by '&&' for AND logic - const subTags = tag - .split('&&') - // Make sure spaces on either sides of '&&' are trimmed - .map((subTag) => subTag.trim()) - // Remove empty strings after trimming is applied - .filter(Boolean) - - if (!subTags.length) return null - - return sql`(${sql.join( - subTags.map( - (subTag) => - sql`${ref('moderation_subject_status.tags')} ? ${subTag}`, - ), - sql` AND `, - )})` - } else { - // Single tag condition - return sql`${ref('moderation_subject_status.tags')} ? ${tag}` - } - }) - .filter(Boolean) - - if (!conditions.length) return builder - - // Combine all conditions with OR - return builder.where(sql`(${sql.join(conditions, sql` OR `)})`) - } - async getSubjectStatuses({ queueCount, queueIndex, @@ -858,54 +823,31 @@ export class ModerationService { reviewedBefore, reportedAfter, reportedBefore, - includeMuted, + includeMuted = false, hostingDeletedBefore, hostingDeletedAfter, hostingUpdatedBefore, hostingUpdatedAfter, hostingStatuses, - onlyMuted, + onlyMuted = false, ignoreSubjects, - sortDirection, + sortDirection = 'desc', lastReviewedBy, - sortField, + sortField = 'lastReportedAt', subject, tags, excludeTags, collections, subjectType, - }: { - queueCount?: number - queueIndex?: number - queueSeed?: string - includeAllUserRecords?: boolean + minAccountSuspendCount, + minReportedRecordsCount, + minTakendownRecordsCount, + }: QueryStatusParams): Promise<{ + statuses: ModerationSubjectStatusRowWithHandle[] cursor?: string - limit?: number - takendown?: boolean - appealed?: boolean - reviewedBefore?: string - reviewState?: ModerationSubjectStatusRow['reviewState'] - reviewedAfter?: string - reportedAfter?: string - reportedBefore?: string - includeMuted?: boolean - hostingDeletedBefore?: string - hostingDeletedAfter?: string - hostingUpdatedBefore?: string - hostingUpdatedAfter?: string - hostingStatuses?: string[] - onlyMuted?: boolean - subject?: string - ignoreSubjects?: string[] - sortDirection: 'asc' | 'desc' - lastReviewedBy?: string - sortField: 'lastReviewedAt' | 'lastReportedAt' - tags: string[] - excludeTags: string[] - collections: string[] - subjectType?: string - }) { - let builder = this.db.db.selectFrom('moderation_subject_status').selectAll() + }> { + let builder = moderationSubjectStatusQueryBuilder(this.db.db) + const { ref } = this.db.db.dynamic if (subject) { @@ -919,14 +861,18 @@ export class ModerationService { if (!includeAllUserRecords) { builder = builder.where((qb) => subjectInfo.recordPath - ? qb.where('recordPath', '=', subjectInfo.recordPath) - : qb.where('recordPath', '=', ''), + ? qb.where( + 'moderation_subject_status.recordPath', + '=', + subjectInfo.recordPath, + ) + : qb.where('moderation_subject_status.recordPath', '=', ''), ) } } else if (subjectType === 'account') { - builder = builder.where('recordPath', '=', '') + builder = builder.where('moderation_subject_status.recordPath', '=', '') } else if (subjectType === 'record') { - builder = builder.where('recordPath', '!=', '') + builder = builder.where('moderation_subject_status.recordPath', '!=', '') } // Only fetch items that belongs to the specified queue when specified @@ -948,110 +894,216 @@ export class ModerationService { } // If subjectType is set to 'account' let that take priority and ignore collections filter - if (collections.length && subjectType !== 'account') { - builder = builder.where('recordPath', '!=', '').where((qb) => { - collections.forEach((collection) => { - qb = qb.orWhere('recordPath', 'like', `${collection}/%`) + if (subjectType !== 'account' && collections?.length) { + builder = builder + .where('moderation_subject_status.recordPath', '!=', '') + .where((qb) => { + for (const collection of collections) { + qb = qb.orWhere( + 'moderation_subject_status.recordPath', + 'like', + `${collection}/%`, + ) + } + return qb }) - return qb - }) } if (ignoreSubjects?.length) { builder = builder - .where('did', 'not in', ignoreSubjects) - .where('recordPath', 'not in', ignoreSubjects) + .where('moderation_subject_status.did', 'not in', ignoreSubjects) + .where('moderation_subject_status.recordPath', 'not in', ignoreSubjects) } - if (reviewState) { - builder = builder.where('reviewState', '=', reviewState) + const reviewStateNormalized = getReviewState(reviewState) + if (reviewStateNormalized) { + builder = builder.where( + 'moderation_subject_status.reviewState', + '=', + reviewStateNormalized, + ) } if (lastReviewedBy) { - builder = builder.where('lastReviewedBy', '=', lastReviewedBy) + builder = builder.where( + 'moderation_subject_status.lastReviewedBy', + '=', + lastReviewedBy, + ) } if (reviewedAfter) { - builder = builder.where('lastReviewedAt', '>', reviewedAfter) + builder = builder.where( + 'moderation_subject_status.lastReviewedAt', + '>', + reviewedAfter, + ) } if (reviewedBefore) { - builder = builder.where('lastReviewedAt', '<', reviewedBefore) + builder = builder.where( + 'moderation_subject_status.lastReviewedAt', + '<', + reviewedBefore, + ) } if (hostingUpdatedAfter) { - builder = builder.where('hostingUpdatedAt', '>', hostingUpdatedAfter) + builder = builder.where( + 'moderation_subject_status.hostingUpdatedAt', + '>', + hostingUpdatedAfter, + ) } if (hostingUpdatedBefore) { - builder = builder.where('hostingUpdatedAt', '<', hostingUpdatedBefore) + builder = builder.where( + 'moderation_subject_status.hostingUpdatedAt', + '<', + hostingUpdatedBefore, + ) } if (hostingDeletedAfter) { - builder = builder.where('hostingDeletedAt', '>', hostingDeletedAfter) + builder = builder.where( + 'moderation_subject_status.hostingDeletedAt', + '>', + hostingDeletedAfter, + ) } if (hostingDeletedBefore) { - builder = builder.where('hostingDeletedAt', '<', hostingDeletedBefore) + builder = builder.where( + 'moderation_subject_status.hostingDeletedAt', + '<', + hostingDeletedBefore, + ) } if (hostingStatuses?.length) { - builder = builder.where('hostingStatus', 'in', hostingStatuses) + builder = builder.where( + 'moderation_subject_status.hostingStatus', + 'in', + hostingStatuses, + ) } if (reportedAfter) { - builder = builder.where('lastReviewedAt', '>', reportedAfter) + builder = builder.where( + 'moderation_subject_status.lastReviewedAt', + '>', + reportedAfter, + ) } if (reportedBefore) { - builder = builder.where('lastReportedAt', '<', reportedBefore) + builder = builder.where( + 'moderation_subject_status.lastReportedAt', + '<', + reportedBefore, + ) } if (takendown) { - builder = builder.where('takendown', '=', true) + builder = builder.where('moderation_subject_status.takendown', '=', true) } if (appealed !== undefined) { builder = appealed === false - ? builder.where('appealed', 'is', null) - : builder.where('appealed', '=', appealed) + ? builder.where('moderation_subject_status.appealed', 'is', null) + : builder.where('moderation_subject_status.appealed', '=', appealed) } if (!includeMuted) { builder = builder.where((qb) => qb - .where('muteUntil', '<', new Date().toISOString()) - .orWhere('muteUntil', 'is', null), + .where( + 'moderation_subject_status.muteUntil', + '<', + new Date().toISOString(), + ) + .orWhere('moderation_subject_status.muteUntil', 'is', null), ) } if (onlyMuted) { builder = builder.where((qb) => qb - .where('muteUntil', '>', new Date().toISOString()) - .orWhere('muteReportingUntil', '>', new Date().toISOString()), + .where( + 'moderation_subject_status.muteUntil', + '>', + new Date().toISOString(), + ) + .orWhere( + 'moderation_subject_status.muteReportingUntil', + '>', + new Date().toISOString(), + ), ) } - if (tags.length) { - builder = this.applyTagFilter(builder, tags) + // ["tag1", "tag2 && tag3", "tag4"] => [["tag1"], ["tag2", "tag3"], ["tag4"]] + const conditions = parseTags(tags) + if (conditions?.length) { + // [["tag1"], ["tag2", "tag3"], ["tag4"]] => (tags ? 'tag1') OR (tags ? 'tag2' AND tags ? 'tag3') OR (tags ? 'tag4') + builder = builder.where((qb) => { + for (const subTags of conditions) { + // OR between every conditions items (subTags) + qb = qb.orWhere((qb) => { + // AND between every subTags items (subTag) + for (const subTag of subTags) { + qb = qb.where( + sql`${ref('moderation_subject_status.tags')} ? ${subTag}`, + ) + } + return qb + }) + } + return qb + }) } - if (excludeTags.length) { + if (excludeTags?.length) { builder = builder.where((qb) => qb .where( - sql`NOT(${ref( - 'moderation_subject_status.tags', - )} ?| array[${sql.join(excludeTags)}]::TEXT[])`, + sql`NOT(${ref('moderation_subject_status.tags')} ?| array[${sql.join(excludeTags)}]::TEXT[])`, ) .orWhere('tags', 'is', null), ) } + if (minAccountSuspendCount != null && minAccountSuspendCount > 0) { + builder = builder.where( + 'account_events_stats.suspendCount', + '>=', + minAccountSuspendCount, + ) + } + + if (minTakendownRecordsCount != null && minTakendownRecordsCount > 0) { + builder = builder.where( + 'account_record_status_stats.takendownCount', + '>=', + minTakendownRecordsCount, + ) + } + + if (minReportedRecordsCount != null && minReportedRecordsCount > 0) { + builder = builder.where( + 'account_record_events_stats.reportedCount', + '>=', + minReportedRecordsCount, + ) + } + const keyset = new StatusKeyset( - ref(`moderation_subject_status.${sortField}`), + sortField === 'reportedRecordsCount' + ? ref(`account_record_events_stats.reportedCount`) + : sortField === 'takendownRecordsCount' + ? ref(`account_record_status_stats.takendownCount`) + : ref(`moderation_subject_status.${sortField}`), ref('moderation_subject_status.id'), ) const paginatedBuilder = paginate(builder, { @@ -1067,13 +1119,12 @@ export class ModerationService { const infos = await this.views.getAccoutInfosByDid( results.map((r) => r.did), ) - const resultsWithHandles = results.map((r) => ({ - ...r, - handle: infos.get(r.did)?.handle ?? INVALID_HANDLE, - })) return { - statuses: resultsWithHandles, + statuses: results.map((r) => ({ + ...r, + handle: infos.get(r.did)?.handle ?? INVALID_HANDLE, + })), cursor: keyset.packFromResult(results), } } @@ -1195,6 +1246,18 @@ export class ModerationService { } } +const parseTags = (tags?: string[]) => + tags + ?.map((tag) => + tag + .split(/\s*&&\s*/g) + .map((subTag) => subTag.trim()) + // Ignore invalid syntax ("", "tag1 &&", "&& tag2", "tag1 && && tag2", etc.) + .filter(Boolean), + ) + // Ignore invalid items + .filter((subTags): subTags is [string, ...string[]] => subTags.length > 0) + const isSafeUrl = (url: URL) => { if (url.protocol !== 'https:') return false if (!url.hostname || url.hostname === 'localhost') return false diff --git a/packages/ozone/src/mod-service/status.ts b/packages/ozone/src/mod-service/status.ts index cc3539e7728..67fb3b4a20c 100644 --- a/packages/ozone/src/mod-service/status.ts +++ b/packages/ozone/src/mod-service/status.ts @@ -1,18 +1,18 @@ // This may require better organization but for now, just dumping functions here containing DB queries for moderation status +import { HOUR } from '@atproto/common' import { AtUri } from '@atproto/syntax' import { Database } from '../db' -import { ModerationSubjectStatus } from '../db/schema/moderation_subject_status' +import DatabaseSchema from '../db/schema' +import { jsonb } from '../db/types' +import { REASONAPPEAL } from '../lexicon/types/com/atproto/moderation/defs' import { - REVIEWOPEN, REVIEWCLOSED, REVIEWESCALATED, REVIEWNONE, + REVIEWOPEN, } from '../lexicon/types/tools/ozone/moderation/defs' import { ModerationEventRow, ModerationSubjectStatusRow } from './types' -import { HOUR } from '@atproto/common' -import { REASONAPPEAL } from '../lexicon/types/com/atproto/moderation/defs' -import { jsonb } from '../db/types' const getSubjectStatusForModerationEvent = ({ currentStatus, @@ -203,6 +203,56 @@ const getSubjectStatusForRecordEvent = ({ return {} } +export const moderationSubjectStatusQueryBuilder = (db: DatabaseSchema) => { + // @NOTE: Using select() instead of selectAll() below because the materialized + // views might be incomplete, and we don't want the null `did` columns to + // interfere with the (never null) `did` column from the + // `moderation_subject_status` table in the results + return db + .selectFrom('moderation_subject_status') + .selectAll('moderation_subject_status') + .leftJoin('account_events_stats', (join) => + join.onRef( + 'moderation_subject_status.did', + '=', + 'account_events_stats.subjectDid', + ), + ) + .select([ + 'account_events_stats.takedownCount', + 'account_events_stats.suspendCount', + 'account_events_stats.escalateCount', + 'account_events_stats.reportCount', + 'account_events_stats.appealCount', + ]) + .leftJoin('account_record_events_stats', (join) => + join.onRef( + 'moderation_subject_status.did', + '=', + 'account_record_events_stats.subjectDid', + ), + ) + .select([ + 'account_record_events_stats.totalReports', + 'account_record_events_stats.reportedCount', + 'account_record_events_stats.escalatedCount', + 'account_record_events_stats.appealedCount', + ]) + .leftJoin('account_record_status_stats', (join) => + join.onRef( + 'moderation_subject_status.did', + '=', + 'account_record_status_stats.did', + ), + ) + .select([ + 'account_record_status_stats.subjectCount', + 'account_record_status_stats.pendingCount', + 'account_record_status_stats.processedCount', + 'account_record_status_stats.takendownCount', + ]) +} + // Based on a given moderation action event, this function will update the moderation status of the subject // If there's no existing status, it will create one // If the action event does not affect the status, it will do nothing @@ -393,29 +443,6 @@ export const adjustModerationSubjectStatus = async ( return status || null } -type ModerationSubjectStatusFilter = - | Pick - | Pick - | Pick -export const getModerationSubjectStatus = async ( - db: Database, - filters: ModerationSubjectStatusFilter, -) => { - let builder = db.db - .selectFrom('moderation_subject_status') - // DID will always be passed at the very least - .where('did', '=', filters.did) - .where('recordPath', '=', 'recordPath' in filters ? filters.recordPath : '') - - if ('recordCid' in filters) { - builder = builder.where('recordCid', '=', filters.recordCid) - } else { - builder = builder.where('recordCid', 'is', null) - } - - return builder.executeTakeFirst() -} - export const getStatusIdentifierFromSubject = ( subject: string | AtUri, ): { did: string; recordPath: string } => { diff --git a/packages/ozone/src/mod-service/types.ts b/packages/ozone/src/mod-service/types.ts index 29a63d3e019..42d6c7115f3 100644 --- a/packages/ozone/src/mod-service/types.ts +++ b/packages/ozone/src/mod-service/types.ts @@ -18,8 +18,29 @@ export type ModerationEventRowWithHandle = ModerationEventRow & { creatorHandle?: string | null } export type ModerationSubjectStatusRow = Selectable +export type ModerationSubjectStatusRowWithStats = ModerationSubjectStatusRow & { + // account_events_stats + takedownCount: number | null + suspendCount: number | null + escalateCount: number | null + reportCount: number | null + appealCount: number | null + + // account_record_events_stats + totalReports: number | null + reportedCount: number | null + escalatedCount: number | null + appealedCount: number | null + + // account_record_status_stats + subjectCount: number | null + pendingCount: number | null + processedCount: number | null + takendownCount: number | null +} + export type ModerationSubjectStatusRowWithHandle = - ModerationSubjectStatusRow & { handle: string | null } + ModerationSubjectStatusRowWithStats & { handle: string | null } export type ModEventType = | ToolsOzoneModerationDefs.ModEventTakedown diff --git a/packages/ozone/src/mod-service/views.ts b/packages/ozone/src/mod-service/views.ts index 7fde08ca470..12a3d9f018c 100644 --- a/packages/ozone/src/mod-service/views.ts +++ b/packages/ozone/src/mod-service/views.ts @@ -1,10 +1,6 @@ import { sql } from 'kysely' import { AtUri, INVALID_HANDLE, normalizeDatetimeAlways } from '@atproto/syntax' -import { - AtpAgent, - AppBskyFeedDefs, - ToolsOzoneModerationDefs, -} from '@atproto/api' +import { AtpAgent, AppBskyFeedDefs } from '@atproto/api' import { dedupeStrs } from '@atproto/common' import { BlobRef } from '@atproto/lexicon' import { Keypair } from '@atproto/crypto' @@ -12,7 +8,6 @@ import { Database } from '../db' import { ModEventView, RepoView, - RepoViewDetail, RecordView, RecordViewDetail, BlobView, @@ -34,6 +29,7 @@ import { dbLogger } from '../logger' import { httpLogger } from '../logger' import { ParsedLabelers } from '../util' import { ids } from '../lexicon/lexicons' +import { moderationSubjectStatusQueryBuilder } from './status' export type AuthHeaders = { headers: { @@ -481,8 +477,9 @@ export class ModerationViews { async blob(blobs: BlobRef[]): Promise { if (!blobs.length) return [] const { ref } = this.db.db.dynamic - const modStatusResults = await this.db.db - .selectFrom('moderation_subject_status') + const modStatusResults = await moderationSubjectStatusQueryBuilder( + this.db.db, + ) .where( sql`${ref( 'moderation_subject_status.blobCids', @@ -529,10 +526,10 @@ export class ModerationViews { await Promise.all( res.map(async (labelRow) => { const signedLabel = await this.formatLabelAndEnsureSig(labelRow) - if (!labels.has(labelRow.uri)) { - labels.set(labelRow.uri, []) - } - labels.get(labelRow.uri)?.push(signedLabel) + + const current = labels.get(labelRow.uri) + if (current) current.push(signedLabel) + else labels.set(labelRow.uri, [signedLabel]) }), ) return labels @@ -559,51 +556,39 @@ export class ModerationViews { async getSubjectStatus( subjects: string[], ): Promise> { - const parsedSubjects = subjects.map((subject) => parseSubjectId(subject)) - const filterForSubject = (did: string, recordPath?: string) => { - return (clause: any) => { - clause = clause - .where('moderation_subject_status.did', '=', did) - .where('moderation_subject_status.recordPath', '=', recordPath || '') - return clause - } - // TODO: Fix the typing here? - } - - const builder = this.db.db - .selectFrom('moderation_subject_status') - .where((clause) => { - parsedSubjects.forEach((subject, i) => { - const applySubjectFilter = filterForSubject( - subject.did, - subject.recordPath, + if (!subjects.length) return new Map() + + const parsedSubjects = subjects.map(parseSubjectId) + + const builder = moderationSubjectStatusQueryBuilder(this.db.db) + // + .where((qb) => { + for (const sub of parsedSubjects) { + qb = qb.orWhere((qb) => + qb + .where('moderation_subject_status.did', '=', sub.did) + .where( + 'moderation_subject_status.recordPath', + '=', + sub.recordPath ?? '', + ), ) - if (i === 0) { - clause = clause.where(applySubjectFilter) - } else { - clause = clause.orWhere(applySubjectFilter) - } - }) - - return clause + } + return qb }) - .selectAll() const [statusRes, accountsByDid] = await Promise.all([ builder.execute(), this.getAccoutInfosByDid(parsedSubjects.map((s) => s.did)), ]) - return statusRes.reduce((acc, cur) => { - const subject = cur.recordPath - ? formatSubjectId(cur.did, cur.recordPath) - : cur.did - const handle = accountsByDid.get(cur.did)?.handle - return acc.set(subject, { - ...cur, - handle: handle ?? INVALID_HANDLE, - }) - }, new Map()) + return new Map( + statusRes.map((row): [string, ModerationSubjectStatusRowWithHandle] => { + const subjectId = formatSubjectId(row.did, row.recordPath) + const handle = accountsByDid.get(row.did)?.handle ?? INVALID_HANDLE + return [subjectId, { ...row, handle }] + }), + ) } formatSubjectStatus( @@ -628,6 +613,35 @@ export class ModerationViews { subjectBlobCids: status.blobCids || [], tags: status.tags || [], subject: subjectFromStatusRow(status).lex(), + + accountStats: { + // Explicitly typing to allow for easy manipulation (e.g. to strip from tests snapshots) + $type: 'tools.ozone.moderation.defs#accountStats', + + // account_events_stats + reportCount: status.reportCount ?? undefined, + appealCount: status.appealCount ?? undefined, + suspendCount: status.suspendCount ?? undefined, + takedownCount: status.takedownCount ?? undefined, + escalateCount: status.escalateCount ?? undefined, + }, + + recordsStats: { + // Explicitly typing to allow for easy manipulation (e.g. to strip from tests snapshots) + $type: 'tools.ozone.moderation.defs#recordStats', + + // account_record_events_stats + totalReports: status.totalReports ?? undefined, + reportedCount: status.reportedCount ?? undefined, + escalatedCount: status.escalatedCount ?? undefined, + appealedCount: status.appealedCount ?? undefined, + + // account_record_status_stats + subjectCount: status.subjectCount ?? undefined, + pendingCount: status.pendingCount ?? undefined, + processedCount: status.processedCount ?? undefined, + takendownCount: status.takendownCount ?? undefined, + }, } if (status.recordPath !== '') { @@ -677,7 +691,7 @@ type RecordInfo = { indexedAt: string } -function parseSubjectId(subject: string) { +function parseSubjectId(subject: string): { did: string; recordPath?: string } { if (subject.startsWith('did:')) { return { did: subject } } diff --git a/packages/ozone/src/util.ts b/packages/ozone/src/util.ts index 717316f5c96..3a87eaa934f 100644 --- a/packages/ozone/src/util.ts +++ b/packages/ozone/src/util.ts @@ -1,3 +1,4 @@ +import assert from 'node:assert' import { createRetryable } from '@atproto/common' import { ResponseType, XRPCError } from '@atproto/xrpc' import { parseList } from 'structured-headers' @@ -83,3 +84,147 @@ export const formatLabelerHeader = (parsed: ParsedLabelers): string => { ) return parts.join(',') } + +/** + * Utility function similar to `setInterval()`. The main difference is that the + * execution is controlled through a signal and that the function will wait for + * `interval` milliseconds *between* the end of the previous execution and the + * start of the next one (instead of starting the execution every `interval` + * milliseconds), ensuring that the function is not running concurrently. + * + * @param fn The function to execute. That function must not throw any error + * other than {@link signal}'s {@link AbortSignal.reason} or an {@link Error} + * that has the {@link signal}'s {@link AbortSignal.reason} as its + * {@link Error.cause}. + * + * @returns A promise that resolves when the signal is aborted, and the last + * execution is done. + * + * @throws {AbortSignal['reason']} if the {@link signal} is already aborted. + * @throws {TypeError} if {@link fn} throws an unexpected error (with the + * unexpected error as the {@link Error.cause}). + */ +export async function startInterval( + fn: (signal: AbortSignal) => void | Promise, + interval: number, + signal: AbortSignal, + runImmediately = false, +) { + signal.throwIfAborted() + + // Renaming for clarity + const inputSignal = signal + + const intervalController = new AbortController() + const intervalSignal = intervalController.signal + + return new Promise((resolve, reject) => { + let timer: NodeJS.Timeout | undefined + + const run = async () => { + // Cloning the signal for this particular run to prevent memory leaks + const runController = boundAbortController(intervalSignal) + const runSignal = runController.signal + + try { + await fn(runSignal) + } catch (err) { + if (err != null && isCausedBySignal(err, runSignal)) { + // Silently ignore the error if it is caused by the signal. At this + // point, the interval controller was aborted, which will cause the + // promise to resolve in the "finally" block bellow. + } else { + // Invalid behavior: stop the interval and reject the promise. + const error = new TypeError('Unexpected error', { cause: err }) + + // Rejecting here will make `resolve()` in the "finally" block to be a + // no-op. Rejecting before aborting the controller to ensure the + // promise does not get resolved by the `abort` event listeners. + reject(error) + + // Using `error` as abort reason to avoid creating an AbortError. + intervalController.abort(error) + } + } finally { + // Cleanup the listeners added by `boundAbortController` + runController.abort() + + if (intervalSignal.aborted) resolve() + else schedule() + } + } + + const schedule = () => { + assert(timer === undefined, 'unexpected state') + timer = setTimeout(() => { + timer = undefined // "running" state + void run() + }, interval) + } + + inputSignal.addEventListener( + 'abort', + // This function will only be called if the `inputSignal` is aborted + // before the interval controller is aborted. + () => { + // Stop the interval, using the input signal's reason + intervalController.abort(inputSignal.reason) + + if (timer === undefined) { + // `fn` is currently running; `run`'s finally block will resolve the + // promise. + } else { + // The execution was scheduled but not started yet. Clear the timer + // and resolve the promise. + clearTimeout(timer) + resolve() + } + }, + // Remove the listener whenever the interval is aborted. + { signal: intervalSignal }, + ) + + if (runImmediately) void run() + else schedule() + }) +} + +/** + * Determines whether the cause of an error is a signal's reason + */ +export function isCausedBySignal(err: unknown, signal: AbortSignal) { + if (!signal.aborted) return false + if (signal.reason == null) return false // Ignore nullish reasons + return ( + err === signal.reason || + (err instanceof Error && err.cause === signal.reason) + ) +} + +/** + * Creates an AbortController that will be aborted when any of the given signals + * is aborted. + * + * @note Make sure to call `abortController.abort()` when you are done with + * the controller to avoid memory leaks. + * + * @throws if any of the input signals is already aborted. + */ +export function boundAbortController( + ...signals: readonly (AbortSignal | undefined | null)[] +): AbortController { + for (const signal of signals) { + signal?.throwIfAborted() + } + + const abortController = new AbortController() + const abort = function (event: Event) { + abortController.abort((event.target as AbortSignal)?.reason) + } + + for (const signal of signals) { + signal?.addEventListener('abort', abort, { signal: abortController.signal }) + } + + return abortController +} diff --git a/packages/ozone/tests/__snapshots__/get-record.test.ts.snap b/packages/ozone/tests/__snapshots__/get-record.test.ts.snap index d24b9d76106..bed827aced6 100644 --- a/packages/ozone/tests/__snapshots__/get-record.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/get-record.test.ts.snap @@ -28,6 +28,9 @@ Object { ], "moderation": Object { "subjectStatus": Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#recordHosting", @@ -37,6 +40,17 @@ Object { "lastReportedAt": "1970-01-01T00:00:00.000Z", "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 0, + "processedCount": 1, + "reportedCount": 1, + "subjectCount": 1, + "takendownCount": 1, + "totalReports": 2, + }, "reviewState": "tools.ozone.moderation.defs#reviewClosed", "subject": Object { "$type": "com.atproto.repo.strongRef", @@ -134,6 +148,9 @@ Object { ], "moderation": Object { "subjectStatus": Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#recordHosting", @@ -143,6 +160,17 @@ Object { "lastReportedAt": "1970-01-01T00:00:00.000Z", "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 0, + "processedCount": 1, + "reportedCount": 1, + "subjectCount": 1, + "takendownCount": 1, + "totalReports": 2, + }, "reviewState": "tools.ozone.moderation.defs#reviewClosed", "subject": Object { "$type": "com.atproto.repo.strongRef", diff --git a/packages/ozone/tests/__snapshots__/get-records.test.ts.snap b/packages/ozone/tests/__snapshots__/get-records.test.ts.snap index 38d0efdebca..05f6f6f3273 100644 --- a/packages/ozone/tests/__snapshots__/get-records.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/get-records.test.ts.snap @@ -31,6 +31,9 @@ Object { ], "moderation": Object { "subjectStatus": Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#recordHosting", @@ -40,6 +43,17 @@ Object { "lastReportedAt": "1970-01-01T00:00:00.000Z", "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 0, + "processedCount": 1, + "reportedCount": 1, + "subjectCount": 1, + "takendownCount": 1, + "totalReports": 2, + }, "reviewState": "tools.ozone.moderation.defs#reviewClosed", "subject": Object { "$type": "com.atproto.repo.strongRef", diff --git a/packages/ozone/tests/__snapshots__/get-repo.test.ts.snap b/packages/ozone/tests/__snapshots__/get-repo.test.ts.snap index 397a817ec0b..d548cd9d844 100644 --- a/packages/ozone/tests/__snapshots__/get-repo.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/get-repo.test.ts.snap @@ -22,6 +22,14 @@ Object { ], "moderation": Object { "subjectStatus": Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 1, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#accountHosting", @@ -31,6 +39,9 @@ Object { "lastReportedAt": "1970-01-01T00:00:00.000Z", "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + }, "reviewState": "tools.ozone.moderation.defs#reviewClosed", "subject": Object { "$type": "com.atproto.admin.defs#repoRef", diff --git a/packages/ozone/tests/__snapshots__/get-repos.test.ts.snap b/packages/ozone/tests/__snapshots__/get-repos.test.ts.snap index d0db4fcf9de..1da0c8ab0fb 100644 --- a/packages/ozone/tests/__snapshots__/get-repos.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/get-repos.test.ts.snap @@ -25,6 +25,14 @@ Object { ], "moderation": Object { "subjectStatus": Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 1, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#accountHosting", @@ -34,6 +42,9 @@ Object { "lastReportedAt": "1970-01-01T00:00:00.000Z", "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + }, "reviewState": "tools.ozone.moderation.defs#reviewClosed", "subject": Object { "$type": "com.atproto.admin.defs#repoRef", diff --git a/packages/ozone/tests/__snapshots__/moderation-events.test.ts.snap b/packages/ozone/tests/__snapshots__/moderation-events.test.ts.snap index 8e4b5a62c84..3aaf889373b 100644 --- a/packages/ozone/tests/__snapshots__/moderation-events.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/moderation-events.test.ts.snap @@ -18,6 +18,14 @@ Object { "indexedAt": "1970-01-01T00:00:00.000Z", "moderation": Object { "subjectStatus": Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 1, + "reportCount": 4, + "suspendCount": 0, + "takedownCount": 0, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#accountHosting", @@ -27,6 +35,17 @@ Object { "lastReportedAt": "1970-01-01T00:00:00.000Z", "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 2, + "processedCount": 0, + "reportedCount": 2, + "subjectCount": 2, + "takendownCount": 0, + "totalReports": 3, + }, "reviewState": "tools.ozone.moderation.defs#reviewEscalated", "subject": Object { "$type": "com.atproto.admin.defs#repoRef", diff --git a/packages/ozone/tests/__snapshots__/moderation-statuses.test.ts.snap b/packages/ozone/tests/__snapshots__/moderation-statuses.test.ts.snap index 92b4646c120..9e1258212db 100644 --- a/packages/ozone/tests/__snapshots__/moderation-statuses.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/moderation-statuses.test.ts.snap @@ -3,6 +3,14 @@ exports[`moderation-statuses query statuses returns statuses filtered by subject language 1`] = ` Array [ Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 0, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#recordHosting", @@ -10,6 +18,17 @@ Array [ }, "id": 7, "lastReportedAt": "1970-01-01T00:00:00.000Z", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 1, + "processedCount": 0, + "reportedCount": 1, + "subjectCount": 1, + "takendownCount": 0, + "totalReports": 2, + }, "reviewState": "tools.ozone.moderation.defs#reviewOpen", "subject": Object { "$type": "com.atproto.repo.strongRef", @@ -27,6 +46,14 @@ Array [ "updatedAt": "1970-01-01T00:00:00.000Z", }, Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 0, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#accountHosting", @@ -34,6 +61,17 @@ Array [ }, "id": 5, "lastReportedAt": "1970-01-01T00:00:00.000Z", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 1, + "processedCount": 0, + "reportedCount": 1, + "subjectCount": 1, + "takendownCount": 0, + "totalReports": 2, + }, "reviewState": "tools.ozone.moderation.defs#reviewOpen", "subject": Object { "$type": "com.atproto.admin.defs#repoRef", @@ -55,6 +93,14 @@ Array [ exports[`moderation-statuses query statuses returns statuses for subjects that received moderation events 1`] = ` Array [ Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 0, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#recordHosting", @@ -62,6 +108,17 @@ Array [ }, "id": 7, "lastReportedAt": "1970-01-01T00:00:00.000Z", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 1, + "processedCount": 0, + "reportedCount": 1, + "subjectCount": 1, + "takendownCount": 0, + "totalReports": 2, + }, "reviewState": "tools.ozone.moderation.defs#reviewOpen", "subject": Object { "$type": "com.atproto.repo.strongRef", @@ -79,6 +136,14 @@ Array [ "updatedAt": "1970-01-01T00:00:00.000Z", }, Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 0, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#accountHosting", @@ -86,6 +151,17 @@ Array [ }, "id": 5, "lastReportedAt": "1970-01-01T00:00:00.000Z", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 1, + "processedCount": 0, + "reportedCount": 1, + "subjectCount": 1, + "takendownCount": 0, + "totalReports": 2, + }, "reviewState": "tools.ozone.moderation.defs#reviewOpen", "subject": Object { "$type": "com.atproto.admin.defs#repoRef", @@ -102,6 +178,14 @@ Array [ "updatedAt": "1970-01-01T00:00:00.000Z", }, Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 0, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#recordHosting", @@ -109,6 +193,17 @@ Array [ }, "id": 3, "lastReportedAt": "1970-01-01T00:00:00.000Z", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 1, + "processedCount": 0, + "reportedCount": 1, + "subjectCount": 1, + "takendownCount": 0, + "totalReports": 2, + }, "reviewState": "tools.ozone.moderation.defs#reviewOpen", "subject": Object { "$type": "com.atproto.repo.strongRef", @@ -125,6 +220,14 @@ Array [ "updatedAt": "1970-01-01T00:00:00.000Z", }, Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 0, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#accountHosting", @@ -132,6 +235,17 @@ Array [ }, "id": 1, "lastReportedAt": "1970-01-01T00:00:00.000Z", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 1, + "processedCount": 0, + "reportedCount": 1, + "subjectCount": 1, + "takendownCount": 0, + "totalReports": 2, + }, "reviewState": "tools.ozone.moderation.defs#reviewOpen", "subject": Object { "$type": "com.atproto.admin.defs#repoRef", diff --git a/packages/ozone/tests/get-record.test.ts b/packages/ozone/tests/get-record.test.ts index 8d4dbbb2527..0e289b550fb 100644 --- a/packages/ozone/tests/get-record.test.ts +++ b/packages/ozone/tests/get-record.test.ts @@ -33,6 +33,10 @@ describe('admin get record view', () => { await network.processAll() }) + beforeEach(async () => { + await network.processAll() + }) + afterAll(async () => { await network.close() }) diff --git a/packages/ozone/tests/get-records.test.ts b/packages/ozone/tests/get-records.test.ts index 7098ae6510d..3b3e63e1bd2 100644 --- a/packages/ozone/tests/get-records.test.ts +++ b/packages/ozone/tests/get-records.test.ts @@ -32,6 +32,10 @@ describe('admin get records view', () => { await network.processAll() }) + beforeEach(async () => { + await network.processAll() + }) + afterAll(async () => { await network.close() }) diff --git a/packages/ozone/tests/get-repo.test.ts b/packages/ozone/tests/get-repo.test.ts index c122dc3a001..6ededcbe00e 100644 --- a/packages/ozone/tests/get-repo.test.ts +++ b/packages/ozone/tests/get-repo.test.ts @@ -38,6 +38,10 @@ describe('admin get repo view', () => { await network.processAll() }) + beforeEach(async () => { + await network.processAll() + }) + afterAll(async () => { await network.close() }) diff --git a/packages/ozone/tests/get-repos.test.ts b/packages/ozone/tests/get-repos.test.ts index 52028d9230d..a56c7b54426 100644 --- a/packages/ozone/tests/get-repos.test.ts +++ b/packages/ozone/tests/get-repos.test.ts @@ -38,6 +38,10 @@ describe('admin get multiple repos', () => { await network.processAll() }) + beforeEach(async () => { + await network.processAll() + }) + afterAll(async () => { await network.close() }) diff --git a/packages/ozone/tests/moderation-events.test.ts b/packages/ozone/tests/moderation-events.test.ts index 181f7e9f3f4..9758f7c0759 100644 --- a/packages/ozone/tests/moderation-events.test.ts +++ b/packages/ozone/tests/moderation-events.test.ts @@ -68,6 +68,10 @@ describe('moderation-events', () => { await seedEvents() }) + beforeEach(async () => { + await network.processAll() + }) + afterAll(async () => { await network.close() }) diff --git a/packages/ozone/tests/moderation-statuses.test.ts b/packages/ozone/tests/moderation-statuses.test.ts index a8b4de52d00..dfe3cd9add3 100644 --- a/packages/ozone/tests/moderation-statuses.test.ts +++ b/packages/ozone/tests/moderation-statuses.test.ts @@ -73,6 +73,10 @@ describe('moderation-statuses', () => { await seedEvents() }) + beforeEach(async () => { + await network.processAll() + }) + afterAll(async () => { await network.close() }) diff --git a/packages/ozone/tests/query-labels.test.ts b/packages/ozone/tests/query-labels.test.ts index f1e47c48fd7..66157fb9ba7 100644 --- a/packages/ozone/tests/query-labels.test.ts +++ b/packages/ozone/tests/query-labels.test.ts @@ -156,6 +156,7 @@ describe('ozone query labels', () => { newSigningKey, newSigningKeyId, ctx.cfg, + // @ts-ignore modSrvc.backgroundQueue, ctx.idResolver, // @ts-ignore diff --git a/packages/pds/src/lexicon/lexicons.ts b/packages/pds/src/lexicon/lexicons.ts index 154f03f9aa1..40bfab70933 100644 --- a/packages/pds/src/lexicon/lexicons.ts +++ b/packages/pds/src/lexicon/lexicons.ts @@ -11322,6 +11322,85 @@ export const schemaDict = { type: 'string', }, }, + accountStats: { + description: 'Statistics related to the account subject', + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#accountStats', + }, + recordsStats: { + description: + "Statistics related to the record subjects authored by the subject's account", + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#recordsStats', + }, + }, + }, + accountStats: { + description: 'Statistics about a particular account subject', + type: 'object', + properties: { + reportCount: { + description: 'Total number of reports on the account', + type: 'integer', + }, + appealCount: { + description: + 'Total number of appeals against a moderation action on the account', + type: 'integer', + }, + suspendCount: { + description: 'Number of times the account was suspended', + type: 'integer', + }, + escalateCount: { + description: 'Number of times the account was escalated', + type: 'integer', + }, + takedownCount: { + description: 'Number of times the account was taken down', + type: 'integer', + }, + }, + }, + recordsStats: { + description: 'Statistics about a set of record subject items', + type: 'object', + properties: { + totalReports: { + description: + 'Cumulative sum of the number of reports on the items in the set', + type: 'integer', + }, + reportedCount: { + description: 'Number of items that were reported at least once', + type: 'integer', + }, + escalatedCount: { + description: 'Number of items that were escalated at least once', + type: 'integer', + }, + appealedCount: { + description: 'Number of items that were appealed at least once', + type: 'integer', + }, + subjectCount: { + description: 'Total number of item in the set', + type: 'integer', + }, + pendingCount: { + description: + 'Number of item currently in "reviewOpen" or "reviewEscalated" state', + type: 'integer', + }, + processedCount: { + description: + 'Number of item currently in "reviewNone" or "reviewClosed" state', + type: 'integer', + }, + takendownCount: { + description: 'Number of item currently taken down', + type: 'integer', + }, }, }, subjectReviewState: { @@ -12570,7 +12649,12 @@ export const schemaDict = { sortField: { type: 'string', default: 'lastReportedAt', - enum: ['lastReviewedAt', 'lastReportedAt'], + enum: [ + 'lastReviewedAt', + 'lastReportedAt', + 'reportedRecordsCount', + 'takendownRecordsCount', + ], }, sortDirection: { type: 'string', @@ -12625,6 +12709,21 @@ export const schemaDict = { "If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", knownValues: ['account', 'record'], }, + minAccountSuspendCount: { + type: 'integer', + description: + 'If specified, only subjects that belong to an account that has at least this many suspensions will be returned.', + }, + minReportedRecordsCount: { + type: 'integer', + description: + 'If specified, only subjects that belong to an account that has at least this many reported records will be returned.', + }, + minTakendownRecordsCount: { + type: 'integer', + description: + 'If specified, only subjects that belong to an account that has at least this many taken down records will be returned.', + }, }, }, output: { diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/defs.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/defs.ts index 7397fafc19d..572d323a298 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/defs.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/defs.ts @@ -136,6 +136,8 @@ export interface SubjectStatusView { appealed?: boolean suspendUntil?: string tags?: string[] + accountStats?: AccountStats + recordsStats?: RecordsStats [k: string]: unknown } @@ -151,6 +153,66 @@ export function validateSubjectStatusView(v: unknown): ValidationResult { return lexicons.validate('tools.ozone.moderation.defs#subjectStatusView', v) } +/** Statistics about a particular account subject */ +export interface AccountStats { + /** Total number of reports on the account */ + reportCount?: number + /** Total number of appeals against a moderation action on the account */ + appealCount?: number + /** Number of times the account was suspended */ + suspendCount?: number + /** Number of times the account was escalated */ + escalateCount?: number + /** Number of times the account was taken down */ + takedownCount?: number + [k: string]: unknown +} + +export function isAccountStats(v: unknown): v is AccountStats { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'tools.ozone.moderation.defs#accountStats' + ) +} + +export function validateAccountStats(v: unknown): ValidationResult { + return lexicons.validate('tools.ozone.moderation.defs#accountStats', v) +} + +/** Statistics about a set of record subject items */ +export interface RecordsStats { + /** Cumulative sum of the number of reports on the items in the set */ + totalReports?: number + /** Number of items that were reported at least once */ + reportedCount?: number + /** Number of items that were escalated at least once */ + escalatedCount?: number + /** Number of items that were appealed at least once */ + appealedCount?: number + /** Total number of item in the set */ + subjectCount?: number + /** Number of item currently in "reviewOpen" or "reviewEscalated" state */ + pendingCount?: number + /** Number of item currently in "reviewNone" or "reviewClosed" state */ + processedCount?: number + /** Number of item currently taken down */ + takendownCount?: number + [k: string]: unknown +} + +export function isRecordsStats(v: unknown): v is RecordsStats { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'tools.ozone.moderation.defs#recordsStats' + ) +} + +export function validateRecordsStats(v: unknown): ValidationResult { + return lexicons.validate('tools.ozone.moderation.defs#recordsStats', v) +} + export type SubjectReviewState = | 'lex:tools.ozone.moderation.defs#reviewOpen' | 'lex:tools.ozone.moderation.defs#reviewEscalated' diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts index 0ccd1030c0b..28270425304 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts @@ -49,7 +49,11 @@ export interface QueryParams { ignoreSubjects?: string[] /** Get all subject statuses that were reviewed by a specific moderator */ lastReviewedBy?: string - sortField: 'lastReviewedAt' | 'lastReportedAt' + sortField: + | 'lastReviewedAt' + | 'lastReportedAt' + | 'reportedRecordsCount' + | 'takendownRecordsCount' sortDirection: 'asc' | 'desc' /** Get subjects that were taken down */ takendown?: boolean @@ -63,6 +67,12 @@ export interface QueryParams { collections?: string[] /** If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored. */ subjectType?: 'account' | 'record' | (string & {}) + /** If specified, only subjects that belong to an account that has at least this many suspensions will be returned. */ + minAccountSuspendCount?: number + /** If specified, only subjects that belong to an account that has at least this many reported records will be returned. */ + minReportedRecordsCount?: number + /** If specified, only subjects that belong to an account that has at least this many taken down records will be returned. */ + minTakendownRecordsCount?: number } export type InputSchema = undefined diff --git a/packages/pds/tests/__snapshots__/takedown-appeal.test.ts.snap b/packages/pds/tests/__snapshots__/takedown-appeal.test.ts.snap index a4dfd5d505c..1e7e1c31845 100644 --- a/packages/pds/tests/__snapshots__/takedown-appeal.test.ts.snap +++ b/packages/pds/tests/__snapshots__/takedown-appeal.test.ts.snap @@ -2,6 +2,9 @@ exports[`appeal account takedown actor takedown allows appeal request. 1`] = ` Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + }, "appealed": true, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { @@ -13,6 +16,9 @@ Object { "lastReportedAt": "1970-01-01T00:00:00.000Z", "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(0)", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + }, "reviewState": "tools.ozone.moderation.defs#reviewEscalated", "subject": Object { "$type": "com.atproto.admin.defs#repoRef", diff --git a/packages/pds/tests/proxied/__snapshots__/admin.test.ts.snap b/packages/pds/tests/proxied/__snapshots__/admin.test.ts.snap index 45f8c6daa02..32f98e2ae62 100644 --- a/packages/pds/tests/proxied/__snapshots__/admin.test.ts.snap +++ b/packages/pds/tests/proxied/__snapshots__/admin.test.ts.snap @@ -142,6 +142,14 @@ Object { "indexedAt": "1970-01-01T00:00:00.000Z", "moderation": Object { "subjectStatus": Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 0, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#accountHosting", @@ -151,6 +159,17 @@ Object { "lastReportedAt": "1970-01-01T00:00:00.000Z", "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 0, + "processedCount": 1, + "reportedCount": 0, + "subjectCount": 1, + "takendownCount": 0, + "totalReports": 0, + }, "reviewState": "tools.ozone.moderation.defs#reviewClosed", "subject": Object { "$type": "com.atproto.admin.defs#repoRef", @@ -240,6 +259,14 @@ Object { "labels": Array [], "moderation": Object { "subjectStatus": Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 0, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#recordHosting", @@ -248,6 +275,17 @@ Object { "id": 5, "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 0, + "processedCount": 1, + "reportedCount": 0, + "subjectCount": 1, + "takendownCount": 0, + "totalReports": 0, + }, "reviewState": "tools.ozone.moderation.defs#reviewClosed", "subject": Object { "$type": "com.atproto.repo.strongRef", @@ -301,6 +339,14 @@ Object { "invitesDisabled": true, "moderation": Object { "subjectStatus": Object { + "accountStats": Object { + "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 2, + "suspendCount": 0, + "takedownCount": 0, + }, "createdAt": "1970-01-01T00:00:00.000Z", "hosting": Object { "$type": "tools.ozone.moderation.defs#accountHosting", @@ -310,6 +356,17 @@ Object { "lastReportedAt": "1970-01-01T00:00:00.000Z", "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", + "recordsStats": Object { + "$type": "tools.ozone.moderation.defs#recordStats", + "appealedCount": 0, + "escalatedCount": 0, + "pendingCount": 0, + "processedCount": 1, + "reportedCount": 0, + "subjectCount": 1, + "takendownCount": 0, + "totalReports": 0, + }, "reviewState": "tools.ozone.moderation.defs#reviewClosed", "subject": Object { "$type": "com.atproto.admin.defs#repoRef", diff --git a/packages/pds/tests/proxied/admin.test.ts b/packages/pds/tests/proxied/admin.test.ts index 1f51d2df9f5..d9871ea73a3 100644 --- a/packages/pds/tests/proxied/admin.test.ts +++ b/packages/pds/tests/proxied/admin.test.ts @@ -62,6 +62,9 @@ describe('proxies admin requests', () => { password: 'password', inviteCode: invite.code, }) + }) + + beforeEach(async () => { await network.processAll() }) From 50603b4f2ef08bd618730107ec164a57f27dcca6 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Mon, 20 Jan 2025 16:17:42 +0100 Subject: [PATCH 012/101] =?UTF-8?q?Add=20account=20and=20record=20level=20?= =?UTF-8?q?statistics=20when=20querring=20`tools.ozone.mo=E2=80=A6=20(#341?= =?UTF-8?q?6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add account and record level statistics when querring `tools.ozone.moderation.queryStatuses`. * Update `tools.ozone.moderation.queryStatuses` lexicon --- .changeset/clever-countries-attend.md | 5 +++++ .changeset/serious-comics-joke.md | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 .changeset/clever-countries-attend.md create mode 100644 .changeset/serious-comics-joke.md diff --git a/.changeset/clever-countries-attend.md b/.changeset/clever-countries-attend.md new file mode 100644 index 00000000000..933922f1176 --- /dev/null +++ b/.changeset/clever-countries-attend.md @@ -0,0 +1,5 @@ +--- +"@atproto/ozone": patch +--- + +Add account and record level statistics when querring `tools.ozone.moderation.queryStatuses`. diff --git a/.changeset/serious-comics-joke.md b/.changeset/serious-comics-joke.md new file mode 100644 index 00000000000..fe543f70204 --- /dev/null +++ b/.changeset/serious-comics-joke.md @@ -0,0 +1,6 @@ +--- +"@atproto/api": patch +"@atproto/pds": patch +--- + +Update `tools.ozone.moderation.queryStatuses` lexicon From d80380cb5686f30aa9d23b67f5db69ec161b265a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 15:28:55 +0000 Subject: [PATCH 013/101] Version packages (#3417) Co-authored-by: github-actions[bot] --- .changeset/clever-countries-attend.md | 5 ----- .changeset/serious-comics-joke.md | 6 ------ packages/api/CHANGELOG.md | 6 ++++++ packages/api/package.json | 2 +- packages/bsky/CHANGELOG.md | 7 +++++++ packages/bsky/package.json | 2 +- packages/dev-env/CHANGELOG.md | 10 ++++++++++ packages/dev-env/package.json | 2 +- packages/ozone/CHANGELOG.md | 9 +++++++++ packages/ozone/package.json | 2 +- packages/pds/CHANGELOG.md | 9 +++++++++ packages/pds/package.json | 2 +- 12 files changed, 46 insertions(+), 16 deletions(-) delete mode 100644 .changeset/clever-countries-attend.md delete mode 100644 .changeset/serious-comics-joke.md diff --git a/.changeset/clever-countries-attend.md b/.changeset/clever-countries-attend.md deleted file mode 100644 index 933922f1176..00000000000 --- a/.changeset/clever-countries-attend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/ozone": patch ---- - -Add account and record level statistics when querring `tools.ozone.moderation.queryStatuses`. diff --git a/.changeset/serious-comics-joke.md b/.changeset/serious-comics-joke.md deleted file mode 100644 index fe543f70204..00000000000 --- a/.changeset/serious-comics-joke.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@atproto/api": patch -"@atproto/pds": patch ---- - -Update `tools.ozone.moderation.queryStatuses` lexicon diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 5de7eea7b3f..40c0a9955e5 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/api +## 0.13.29 + +### Patch Changes + +- [#3416](https://github.com/bluesky-social/atproto/pull/3416) [`50603b4f2`](https://github.com/bluesky-social/atproto/commit/50603b4f2ef08bd618730107ec164a57f27dcca6) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Update `tools.ozone.moderation.queryStatuses` lexicon + ## 0.13.28 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index a3591f1a6d4..b7bfff0df8f 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.13.28", + "version": "0.13.29", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index 5daef0e68fa..fad86b7131b 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/bsky +## 0.0.109 + +### Patch Changes + +- Updated dependencies [[`50603b4f2`](https://github.com/bluesky-social/atproto/commit/50603b4f2ef08bd618730107ec164a57f27dcca6)]: + - @atproto/api@0.13.29 + ## 0.0.108 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 3fa14aa087e..7c782e66962 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.108", + "version": "0.0.109", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index 6301d867f1f..3e121f398b0 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/dev-env +## 0.3.79 + +### Patch Changes + +- Updated dependencies [[`50603b4f2`](https://github.com/bluesky-social/atproto/commit/50603b4f2ef08bd618730107ec164a57f27dcca6), [`50603b4f2`](https://github.com/bluesky-social/atproto/commit/50603b4f2ef08bd618730107ec164a57f27dcca6)]: + - @atproto/ozone@0.1.70 + - @atproto/api@0.13.29 + - @atproto/pds@0.4.87 + - @atproto/bsky@0.0.109 + ## 0.3.78 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index bacd2e20d7b..92bc4fff103 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.3.78", + "version": "0.3.79", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/ozone/CHANGELOG.md b/packages/ozone/CHANGELOG.md index ad89cff2d77..486961dafa6 100644 --- a/packages/ozone/CHANGELOG.md +++ b/packages/ozone/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/ozone +## 0.1.70 + +### Patch Changes + +- [#3416](https://github.com/bluesky-social/atproto/pull/3416) [`50603b4f2`](https://github.com/bluesky-social/atproto/commit/50603b4f2ef08bd618730107ec164a57f27dcca6) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add account and record level statistics when querring `tools.ozone.moderation.queryStatuses`. + +- Updated dependencies [[`50603b4f2`](https://github.com/bluesky-social/atproto/commit/50603b4f2ef08bd618730107ec164a57f27dcca6)]: + - @atproto/api@0.13.29 + ## 0.1.69 ### Patch Changes diff --git a/packages/ozone/package.json b/packages/ozone/package.json index 4a5842a4e96..6dd0da90d45 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ozone", - "version": "0.1.69", + "version": "0.1.70", "license": "MIT", "description": "Backend service for moderating the Bluesky network.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index b9700a226a7..070db64f748 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/pds +## 0.4.87 + +### Patch Changes + +- [#3416](https://github.com/bluesky-social/atproto/pull/3416) [`50603b4f2`](https://github.com/bluesky-social/atproto/commit/50603b4f2ef08bd618730107ec164a57f27dcca6) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Update `tools.ozone.moderation.queryStatuses` lexicon + +- Updated dependencies [[`50603b4f2`](https://github.com/bluesky-social/atproto/commit/50603b4f2ef08bd618730107ec164a57f27dcca6)]: + - @atproto/api@0.13.29 + ## 0.4.86 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index 6adaed06e1d..cc241c9aead 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.86", + "version": "0.4.87", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ From 6241f6b00b8728cd5f5e879591b0ca98308edab0 Mon Sep 17 00:00:00 2001 From: rafael Date: Mon, 20 Jan 2025 21:56:11 -0300 Subject: [PATCH 014/101] expose resetRouteRateLimits to the req handler (#3420) --- .changeset/large-plums-check.md | 5 +++++ packages/lex-cli/src/codegen/server.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/large-plums-check.md diff --git a/.changeset/large-plums-check.md b/.changeset/large-plums-check.md new file mode 100644 index 00000000000..93454901540 --- /dev/null +++ b/.changeset/large-plums-check.md @@ -0,0 +1,5 @@ +--- +"@atproto/lex-cli": patch +--- + +Expose resetRouteRateLimits to the handler context diff --git a/packages/lex-cli/src/codegen/server.ts b/packages/lex-cli/src/codegen/server.ts index ec03c7a037b..6b741b94d81 100644 --- a/packages/lex-cli/src/codegen/server.ts +++ b/packages/lex-cli/src/codegen/server.ts @@ -520,6 +520,7 @@ function genServerXrpcMethod( input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise }`, }) From d3432f0a79a2148d0dc90c93f4e7664e83d5ffff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 22:00:43 -0300 Subject: [PATCH 015/101] Version packages (#3421) Co-authored-by: github-actions[bot] --- .changeset/large-plums-check.md | 5 ----- packages/lex-cli/CHANGELOG.md | 6 ++++++ packages/lex-cli/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/large-plums-check.md diff --git a/.changeset/large-plums-check.md b/.changeset/large-plums-check.md deleted file mode 100644 index 93454901540..00000000000 --- a/.changeset/large-plums-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/lex-cli": patch ---- - -Expose resetRouteRateLimits to the handler context diff --git a/packages/lex-cli/CHANGELOG.md b/packages/lex-cli/CHANGELOG.md index 376f507aaa7..b156f3c6b68 100644 --- a/packages/lex-cli/CHANGELOG.md +++ b/packages/lex-cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/lex-cli +## 0.5.6 + +### Patch Changes + +- [#3420](https://github.com/bluesky-social/atproto/pull/3420) [`6241f6b00`](https://github.com/bluesky-social/atproto/commit/6241f6b00b8728cd5f5e879591b0ca98308edab0) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Expose resetRouteRateLimits to the handler context + ## 0.5.5 ### Patch Changes diff --git a/packages/lex-cli/package.json b/packages/lex-cli/package.json index c502afc3cbf..1e291106425 100644 --- a/packages/lex-cli/package.json +++ b/packages/lex-cli/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-cli", - "version": "0.5.5", + "version": "0.5.6", "license": "MIT", "description": "TypeScript codegen tool for atproto Lexicon schemas", "keywords": [ From 1015d96925898149cc60b434561e19730a1bea12 Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 21 Jan 2025 10:33:28 -0300 Subject: [PATCH 016/101] changeset (#3422) --- .changeset/giant-badgers-confess.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/giant-badgers-confess.md diff --git a/.changeset/giant-badgers-confess.md b/.changeset/giant-badgers-confess.md new file mode 100644 index 00000000000..857f6797e21 --- /dev/null +++ b/.changeset/giant-badgers-confess.md @@ -0,0 +1,5 @@ +--- +"@atproto/xrpc-server": patch +--- + +Fix rate limit reset binding From 74ee10826296db49d2c1e48f83bab8f28fee1e6c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 10:55:50 -0300 Subject: [PATCH 017/101] Version packages (#3425) Co-authored-by: github-actions[bot] --- .changeset/giant-badgers-confess.md | 5 ----- packages/bsky/CHANGELOG.md | 9 +++++++++ packages/bsky/package.json | 2 +- packages/dev-env/CHANGELOG.md | 11 +++++++++++ packages/dev-env/package.json | 2 +- packages/internal/xrpc-utils/CHANGELOG.md | 7 +++++++ packages/internal/xrpc-utils/package.json | 2 +- packages/ozone/CHANGELOG.md | 7 +++++++ packages/ozone/package.json | 2 +- packages/pds/CHANGELOG.md | 8 ++++++++ packages/pds/package.json | 2 +- packages/sync/CHANGELOG.md | 7 +++++++ packages/sync/package.json | 2 +- packages/xrpc-server/CHANGELOG.md | 6 ++++++ packages/xrpc-server/package.json | 2 +- 15 files changed, 62 insertions(+), 12 deletions(-) delete mode 100644 .changeset/giant-badgers-confess.md diff --git a/.changeset/giant-badgers-confess.md b/.changeset/giant-badgers-confess.md deleted file mode 100644 index 857f6797e21..00000000000 --- a/.changeset/giant-badgers-confess.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/xrpc-server": patch ---- - -Fix rate limit reset binding diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index fad86b7131b..c566e2f8f04 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/bsky +## 0.0.110 + +### Patch Changes + +- Updated dependencies [[`1015d9692`](https://github.com/bluesky-social/atproto/commit/1015d96925898149cc60b434561e19730a1bea12)]: + - @atproto/xrpc-server@0.7.8 + - @atproto-labs/xrpc-utils@0.0.4 + - @atproto/sync@0.1.11 + ## 0.0.109 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 7c782e66962..50ead1b3514 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.109", + "version": "0.0.110", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index 3e121f398b0..e933d3808ae 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,16 @@ # @atproto/dev-env +## 0.3.80 + +### Patch Changes + +- Updated dependencies [[`1015d9692`](https://github.com/bluesky-social/atproto/commit/1015d96925898149cc60b434561e19730a1bea12)]: + - @atproto/xrpc-server@0.7.8 + - @atproto/bsky@0.0.110 + - @atproto/ozone@0.1.71 + - @atproto/pds@0.4.88 + - @atproto/sync@0.1.11 + ## 0.3.79 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index 92bc4fff103..33293b942a1 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.3.79", + "version": "0.3.80", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/internal/xrpc-utils/CHANGELOG.md b/packages/internal/xrpc-utils/CHANGELOG.md index 96636b07e52..79220dbb390 100644 --- a/packages/internal/xrpc-utils/CHANGELOG.md +++ b/packages/internal/xrpc-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto-labs/xrpc-utils +## 0.0.4 + +### Patch Changes + +- Updated dependencies [[`1015d9692`](https://github.com/bluesky-social/atproto/commit/1015d96925898149cc60b434561e19730a1bea12)]: + - @atproto/xrpc-server@0.7.8 + ## 0.0.3 ### Patch Changes diff --git a/packages/internal/xrpc-utils/package.json b/packages/internal/xrpc-utils/package.json index a4d17fa6700..935cc8a9e62 100644 --- a/packages/internal/xrpc-utils/package.json +++ b/packages/internal/xrpc-utils/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/xrpc-utils", - "version": "0.0.3", + "version": "0.0.4", "license": "MIT", "description": "XRPC server utilities for Node.JS", "keywords": [ diff --git a/packages/ozone/CHANGELOG.md b/packages/ozone/CHANGELOG.md index 486961dafa6..eb0a95d23d5 100644 --- a/packages/ozone/CHANGELOG.md +++ b/packages/ozone/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/ozone +## 0.1.71 + +### Patch Changes + +- Updated dependencies [[`1015d9692`](https://github.com/bluesky-social/atproto/commit/1015d96925898149cc60b434561e19730a1bea12)]: + - @atproto/xrpc-server@0.7.8 + ## 0.1.70 ### Patch Changes diff --git a/packages/ozone/package.json b/packages/ozone/package.json index 6dd0da90d45..ade4f19d7df 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ozone", - "version": "0.1.70", + "version": "0.1.71", "license": "MIT", "description": "Backend service for moderating the Bluesky network.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index 070db64f748..dd2a563ab7b 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/pds +## 0.4.88 + +### Patch Changes + +- Updated dependencies [[`1015d9692`](https://github.com/bluesky-social/atproto/commit/1015d96925898149cc60b434561e19730a1bea12)]: + - @atproto/xrpc-server@0.7.8 + - @atproto-labs/xrpc-utils@0.0.4 + ## 0.4.87 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index cc241c9aead..f731ff305ba 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.87", + "version": "0.4.88", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ diff --git a/packages/sync/CHANGELOG.md b/packages/sync/CHANGELOG.md index ded9e3892b9..49ff04e5723 100644 --- a/packages/sync/CHANGELOG.md +++ b/packages/sync/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/sync +## 0.1.11 + +### Patch Changes + +- Updated dependencies [[`1015d9692`](https://github.com/bluesky-social/atproto/commit/1015d96925898149cc60b434561e19730a1bea12)]: + - @atproto/xrpc-server@0.7.8 + ## 0.1.10 ### Patch Changes diff --git a/packages/sync/package.json b/packages/sync/package.json index eb83470c661..306e7b535c5 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/sync", - "version": "0.1.10", + "version": "0.1.11", "license": "MIT", "description": "atproto sync library", "keywords": [ diff --git a/packages/xrpc-server/CHANGELOG.md b/packages/xrpc-server/CHANGELOG.md index d99b9b5cfb9..38786a39bff 100644 --- a/packages/xrpc-server/CHANGELOG.md +++ b/packages/xrpc-server/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/xrpc-server +## 0.7.8 + +### Patch Changes + +- [#3422](https://github.com/bluesky-social/atproto/pull/3422) [`1015d9692`](https://github.com/bluesky-social/atproto/commit/1015d96925898149cc60b434561e19730a1bea12) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Fix rate limit reset binding + ## 0.7.7 ### Patch Changes diff --git a/packages/xrpc-server/package.json b/packages/xrpc-server/package.json index 8417823aff1..4c5037995ac 100644 --- a/packages/xrpc-server/package.json +++ b/packages/xrpc-server/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/xrpc-server", - "version": "0.7.7", + "version": "0.7.8", "license": "MIT", "description": "atproto HTTP API (XRPC) server library", "keywords": [ From 1ada2d093427e45b6d59a16cf146bf5282560c7b Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Tue, 21 Jan 2025 17:12:02 +0100 Subject: [PATCH 018/101] Fix getSubjectStatuses SQL (#3426) --- .changeset/heavy-badgers-share.md | 5 +++++ packages/ozone/src/mod-service/index.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/heavy-badgers-share.md diff --git a/.changeset/heavy-badgers-share.md b/.changeset/heavy-badgers-share.md new file mode 100644 index 00000000000..be2d2bc97e6 --- /dev/null +++ b/.changeset/heavy-badgers-share.md @@ -0,0 +1,5 @@ +--- +"@atproto/ozone": patch +--- + +Fix getSubjectStatuses query diff --git a/packages/ozone/src/mod-service/index.ts b/packages/ozone/src/mod-service/index.ts index a1fd403fa2f..ff3891ed225 100644 --- a/packages/ozone/src/mod-service/index.ts +++ b/packages/ozone/src/mod-service/index.ts @@ -886,8 +886,8 @@ export class ModerationService { ) { builder = builder.where( queueSeed - ? sql`ABS(HASHTEXT(${queueSeed} || did)) % ${queueCount}` - : sql`ABS(HASHTEXT(did)) % ${queueCount}`, + ? sql`ABS(HASHTEXT(${queueSeed} || moderation_subject_status.did)) % ${queueCount}` + : sql`ABS(HASHTEXT(moderation_subject_status.did)) % ${queueCount}`, '=', queueIndex, ) From b1dd0504ccc9fa9273352e27ddd9f11660e6fba3 Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 21 Jan 2025 14:36:50 -0300 Subject: [PATCH 019/101] [threadContext 1] Add threadContext to threadViewPost - lex (#3318) --- lexicons/app/bsky/feed/defs.json | 10 +++++++++- packages/api/src/client/lexicons.ts | 15 +++++++++++++++ .../src/client/types/app/bsky/feed/defs.ts | 19 +++++++++++++++++++ packages/bsky/src/lexicon/lexicons.ts | 15 +++++++++++++++ .../src/lexicon/types/app/bsky/feed/defs.ts | 19 +++++++++++++++++++ packages/ozone/src/lexicon/lexicons.ts | 15 +++++++++++++++ .../src/lexicon/types/app/bsky/feed/defs.ts | 19 +++++++++++++++++++ packages/pds/src/lexicon/lexicons.ts | 15 +++++++++++++++ .../src/lexicon/types/app/bsky/feed/defs.ts | 19 +++++++++++++++++++ 9 files changed, 145 insertions(+), 1 deletion(-) diff --git a/lexicons/app/bsky/feed/defs.json b/lexicons/app/bsky/feed/defs.json index 8aca402f830..4f92c401927 100644 --- a/lexicons/app/bsky/feed/defs.json +++ b/lexicons/app/bsky/feed/defs.json @@ -48,6 +48,13 @@ "pinned": { "type": "boolean" } } }, + "threadContext": { + "type": "object", + "description": "Metadata about this post within the context of the thread it is in.", + "properties": { + "rootAuthorLike": { "type": "string", "format": "at-uri" } + } + }, "feedViewPost": { "type": "object", "required": ["post"], @@ -108,7 +115,8 @@ "type": "union", "refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"] } - } + }, + "threadContext": { "type": "ref", "ref": "#threadContext" } } }, "notFoundPost": { diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 40bfab70933..1eb438b9200 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -5573,6 +5573,17 @@ export const schemaDict = { }, }, }, + threadContext: { + type: 'object', + description: + 'Metadata about this post within the context of the thread it is in.', + properties: { + rootAuthorLike: { + type: 'string', + format: 'at-uri', + }, + }, + }, feedViewPost: { type: 'object', required: ['post'], @@ -5673,6 +5684,10 @@ export const schemaDict = { ], }, }, + threadContext: { + type: 'ref', + ref: 'lex:app.bsky.feed.defs#threadContext', + }, }, }, notFoundPost: { diff --git a/packages/api/src/client/types/app/bsky/feed/defs.ts b/packages/api/src/client/types/app/bsky/feed/defs.ts index 64c3f7247d8..760c634d35f 100644 --- a/packages/api/src/client/types/app/bsky/feed/defs.ts +++ b/packages/api/src/client/types/app/bsky/feed/defs.ts @@ -71,6 +71,24 @@ export function validateViewerState(v: unknown): ValidationResult { return lexicons.validate('app.bsky.feed.defs#viewerState', v) } +/** Metadata about this post within the context of the thread it is in. */ +export interface ThreadContext { + rootAuthorLike?: string + [k: string]: unknown +} + +export function isThreadContext(v: unknown): v is ThreadContext { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.bsky.feed.defs#threadContext' + ) +} + +export function validateThreadContext(v: unknown): ValidationResult { + return lexicons.validate('app.bsky.feed.defs#threadContext', v) +} + export interface FeedViewPost { post: PostView reply?: ReplyRef @@ -164,6 +182,7 @@ export interface ThreadViewPost { | BlockedPost | { $type: string; [k: string]: unknown } )[] + threadContext?: ThreadContext [k: string]: unknown } diff --git a/packages/bsky/src/lexicon/lexicons.ts b/packages/bsky/src/lexicon/lexicons.ts index 397370e3bc3..aecaa923597 100644 --- a/packages/bsky/src/lexicon/lexicons.ts +++ b/packages/bsky/src/lexicon/lexicons.ts @@ -5573,6 +5573,17 @@ export const schemaDict = { }, }, }, + threadContext: { + type: 'object', + description: + 'Metadata about this post within the context of the thread it is in.', + properties: { + rootAuthorLike: { + type: 'string', + format: 'at-uri', + }, + }, + }, feedViewPost: { type: 'object', required: ['post'], @@ -5673,6 +5684,10 @@ export const schemaDict = { ], }, }, + threadContext: { + type: 'ref', + ref: 'lex:app.bsky.feed.defs#threadContext', + }, }, }, notFoundPost: { diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/defs.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/defs.ts index 4472369375e..fdf7e58c8a3 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/defs.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/defs.ts @@ -71,6 +71,24 @@ export function validateViewerState(v: unknown): ValidationResult { return lexicons.validate('app.bsky.feed.defs#viewerState', v) } +/** Metadata about this post within the context of the thread it is in. */ +export interface ThreadContext { + rootAuthorLike?: string + [k: string]: unknown +} + +export function isThreadContext(v: unknown): v is ThreadContext { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.bsky.feed.defs#threadContext' + ) +} + +export function validateThreadContext(v: unknown): ValidationResult { + return lexicons.validate('app.bsky.feed.defs#threadContext', v) +} + export interface FeedViewPost { post: PostView reply?: ReplyRef @@ -164,6 +182,7 @@ export interface ThreadViewPost { | BlockedPost | { $type: string; [k: string]: unknown } )[] + threadContext?: ThreadContext [k: string]: unknown } diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 40bfab70933..1eb438b9200 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -5573,6 +5573,17 @@ export const schemaDict = { }, }, }, + threadContext: { + type: 'object', + description: + 'Metadata about this post within the context of the thread it is in.', + properties: { + rootAuthorLike: { + type: 'string', + format: 'at-uri', + }, + }, + }, feedViewPost: { type: 'object', required: ['post'], @@ -5673,6 +5684,10 @@ export const schemaDict = { ], }, }, + threadContext: { + type: 'ref', + ref: 'lex:app.bsky.feed.defs#threadContext', + }, }, }, notFoundPost: { diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/defs.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/defs.ts index 4472369375e..fdf7e58c8a3 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/defs.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/defs.ts @@ -71,6 +71,24 @@ export function validateViewerState(v: unknown): ValidationResult { return lexicons.validate('app.bsky.feed.defs#viewerState', v) } +/** Metadata about this post within the context of the thread it is in. */ +export interface ThreadContext { + rootAuthorLike?: string + [k: string]: unknown +} + +export function isThreadContext(v: unknown): v is ThreadContext { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.bsky.feed.defs#threadContext' + ) +} + +export function validateThreadContext(v: unknown): ValidationResult { + return lexicons.validate('app.bsky.feed.defs#threadContext', v) +} + export interface FeedViewPost { post: PostView reply?: ReplyRef @@ -164,6 +182,7 @@ export interface ThreadViewPost { | BlockedPost | { $type: string; [k: string]: unknown } )[] + threadContext?: ThreadContext [k: string]: unknown } diff --git a/packages/pds/src/lexicon/lexicons.ts b/packages/pds/src/lexicon/lexicons.ts index 40bfab70933..1eb438b9200 100644 --- a/packages/pds/src/lexicon/lexicons.ts +++ b/packages/pds/src/lexicon/lexicons.ts @@ -5573,6 +5573,17 @@ export const schemaDict = { }, }, }, + threadContext: { + type: 'object', + description: + 'Metadata about this post within the context of the thread it is in.', + properties: { + rootAuthorLike: { + type: 'string', + format: 'at-uri', + }, + }, + }, feedViewPost: { type: 'object', required: ['post'], @@ -5673,6 +5684,10 @@ export const schemaDict = { ], }, }, + threadContext: { + type: 'ref', + ref: 'lex:app.bsky.feed.defs#threadContext', + }, }, }, notFoundPost: { diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/defs.ts b/packages/pds/src/lexicon/types/app/bsky/feed/defs.ts index 4472369375e..fdf7e58c8a3 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/defs.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/defs.ts @@ -71,6 +71,24 @@ export function validateViewerState(v: unknown): ValidationResult { return lexicons.validate('app.bsky.feed.defs#viewerState', v) } +/** Metadata about this post within the context of the thread it is in. */ +export interface ThreadContext { + rootAuthorLike?: string + [k: string]: unknown +} + +export function isThreadContext(v: unknown): v is ThreadContext { + return ( + isObj(v) && + hasProp(v, '$type') && + v.$type === 'app.bsky.feed.defs#threadContext' + ) +} + +export function validateThreadContext(v: unknown): ValidationResult { + return lexicons.validate('app.bsky.feed.defs#threadContext', v) +} + export interface FeedViewPost { post: PostView reply?: ReplyRef @@ -164,6 +182,7 @@ export interface ThreadViewPost { | BlockedPost | { $type: string; [k: string]: unknown } )[] + threadContext?: ThreadContext [k: string]: unknown } From 6b8a51e881e37ce4878a25ca67550a48be7b3d15 Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 21 Jan 2025 15:35:16 -0300 Subject: [PATCH 020/101] [threadContext 2] Add threadContext to threadViewPost - backend (#3313) --- packages/bsky/src/hydration/feed.ts | 51 ++++++++- packages/bsky/src/hydration/hydrator.ts | 87 +++++++++++---- packages/bsky/src/views/index.ts | 9 ++ .../__snapshots__/indexing.test.ts.snap | 2 + .../__snapshots__/block-lists.test.ts.snap | 3 + .../views/__snapshots__/blocks.test.ts.snap | 5 + .../__snapshots__/mute-lists.test.ts.snap | 3 + .../views/__snapshots__/mutes.test.ts.snap | 3 + .../views/__snapshots__/thread.test.ts.snap | 105 +++++++++++++----- packages/bsky/tests/views/thread.test.ts | 4 + 10 files changed, 226 insertions(+), 46 deletions(-) diff --git a/packages/bsky/src/hydration/feed.ts b/packages/bsky/src/hydration/feed.ts index 61623ad4173..1db35e4f28a 100644 --- a/packages/bsky/src/hydration/feed.ts +++ b/packages/bsky/src/hydration/feed.ts @@ -14,7 +14,11 @@ import { split, } from './util' import { dedupeStrs } from '@atproto/common' -import { postUriToThreadgateUri, postUriToPostgateUri } from '../util/uris' +import { + postUriToThreadgateUri, + postUriToPostgateUri, + uriToDid as didFromUri, +} from '../util/uris' export type Post = RecordInfo & { violatesThreadGate: boolean @@ -32,6 +36,12 @@ export type PostViewerState = { export type PostViewerStates = HydrationMap +export type ThreadContext = { + like?: string +} + +export type ThreadContexts = HydrationMap + export type PostAgg = { likes: number replies: number @@ -157,6 +167,45 @@ export class FeedHydrator { }, new Map()) } + async getThreadContexts(refs: ThreadRef[]): Promise { + if (!refs.length) return new HydrationMap() + + const refsByRootAuthor = refs.reduce((acc, ref) => { + const { threadRoot } = ref + const rootAuthor = didFromUri(threadRoot) + const existingValue = acc.get(rootAuthor) ?? [] + return acc.set(rootAuthor, [...existingValue, ref]) + }, new Map()) + const refsByRootAuthorEntries = Array.from(refsByRootAuthor.entries()) + + const likesPromises = refsByRootAuthorEntries.map( + ([rootAuthor, refsForAuthor]) => + this.dataplane.getLikesByActorAndSubjects({ + actorDid: rootAuthor, + refs: refsForAuthor.map(({ uri, cid }) => ({ uri, cid })), + }), + ) + + const rootAuthorsLikes = await Promise.all(likesPromises) + + const likesByUri = refsByRootAuthorEntries.reduce( + (acc, [_rootAuthor, refsForAuthor], i) => { + const likesForRootAuthor = rootAuthorsLikes[i] + refsForAuthor.forEach(({ uri }, j) => { + acc.set(uri, likesForRootAuthor.uris[j]) + }) + return acc + }, + new Map(), + ) + + return refs.reduce((acc, { uri }) => { + return acc.set(uri, { + like: parseString(likesByUri.get(uri)), + }) + }, new HydrationMap()) + } + async getPostAggregates(refs: ItemRef[]): Promise { if (!refs.length) return new HydrationMap() const counts = await this.dataplane.getInteractionCounts({ refs }) diff --git a/packages/bsky/src/hydration/hydrator.ts b/packages/bsky/src/hydration/hydrator.ts index 562bc9cf1e8..fb19a5cbf3a 100644 --- a/packages/bsky/src/hydration/hydrator.ts +++ b/packages/bsky/src/hydration/hydrator.ts @@ -58,6 +58,8 @@ import { Threadgates, Postgates, FeedItem, + ThreadContexts, + ThreadRef, } from './feed' import { ParsedLabelers } from '../util' @@ -89,6 +91,7 @@ export type HydrationState = { posts?: Posts postAggs?: PostAggs postViewers?: PostViewerStates + threadContexts?: ThreadContexts postBlocks?: PostBlocks reposts?: Reposts follows?: Follows @@ -341,29 +344,24 @@ export class Hydrator { state: HydrationState = {}, ): Promise { const uris = refs.map((ref) => ref.uri) + + state.posts ??= new HydrationMap() + const addPostsToHydrationState = (posts: Posts) => { + posts.forEach((post, uri) => { + state.posts ??= new HydrationMap() + state.posts.set(uri, post) + }) + } + + // layer 0: the posts in the thread const postsLayer0 = await this.feed.getPosts( uris, ctx.includeTakedowns, state.posts, ) - // first level embeds plus thread roots we haven't fetched yet - const urisLayer1 = nestedRecordUrisFromPosts(postsLayer0) + addPostsToHydrationState(postsLayer0) + const additionalRootUris = rootUrisFromPosts(postsLayer0) // supports computing threadgates - const urisLayer1ByCollection = urisByCollection(urisLayer1) - const embedPostUrisLayer1 = - urisLayer1ByCollection.get(ids.AppBskyFeedPost) ?? [] - const postsLayer1 = await this.feed.getPosts( - [...embedPostUrisLayer1, ...additionalRootUris], - ctx.includeTakedowns, - ) - // second level embeds, ignoring any additional root uris we mixed-in to the previous layer - const urisLayer2 = nestedRecordUrisFromPosts( - postsLayer1, - embedPostUrisLayer1, - ) - const urisLayer2ByCollection = urisByCollection(urisLayer2) - const embedPostUrisLayer2 = - urisLayer2ByCollection.get(ids.AppBskyFeedPost) ?? [] const threadRootUris = new Set() for (const [uri, post] of postsLayer0) { if (post) { @@ -385,10 +383,38 @@ export class Hydrator { postUrisWithThreadgates.add(uri) } } + + // layer 1: first level embeds plus thread roots we haven't fetched yet + const urisLayer1 = nestedRecordUrisFromPosts(postsLayer0) + const urisLayer1ByCollection = urisByCollection(urisLayer1) + const embedPostUrisLayer1 = + urisLayer1ByCollection.get(ids.AppBskyFeedPost) ?? [] + const postsLayer1 = await this.feed.getPosts( + [...embedPostUrisLayer1, ...additionalRootUris], + ctx.includeTakedowns, + state.posts, + ) + addPostsToHydrationState(postsLayer1) + + // layer 2: second level embeds, ignoring any additional root uris we mixed-in to the previous layer + const urisLayer2 = nestedRecordUrisFromPosts( + postsLayer1, + embedPostUrisLayer1, + ) + const urisLayer2ByCollection = urisByCollection(urisLayer2) + const embedPostUrisLayer2 = + urisLayer2ByCollection.get(ids.AppBskyFeedPost) ?? [] + const [postsLayer2, threadgates] = await Promise.all([ - this.feed.getPosts(embedPostUrisLayer2, ctx.includeTakedowns), + this.feed.getPosts( + embedPostUrisLayer2, + ctx.includeTakedowns, + state.posts, + ), this.feed.getThreadgatesForPosts([...postUrisWithThreadgates.values()]), ]) + addPostsToHydrationState(postsLayer2) + // collect list/feedgen embeds, lists in threadgates, post record hydration const threadgateListUris = getListUrisFromThreadgates(threadgates) const nestedListUris = [ @@ -597,7 +623,29 @@ export class Hydrator { refs: ItemRef[], ctx: HydrateCtx, ): Promise { - return this.hydratePosts(refs, ctx) + const postsState = await this.hydratePosts(refs, ctx) + + const { posts } = postsState + const postsList = posts ? Array.from(posts.entries()) : [] + + const isDefined = ( + entry: [string, Post | null], + ): entry is [string, Post] => { + const [, post] = entry + return !!post + } + + const threadRefs: ThreadRef[] = postsList + .filter(isDefined) + .map(([uri, post]) => ({ + uri, + cid: post.cid, + threadRoot: post.record.reply?.root.uri ?? uri, + })) + + const threadContexts = await this.feed.getThreadContexts(threadRefs) + + return mergeStates(postsState, { threadContexts }) } // app.bsky.feed.defs#generatorView @@ -1168,6 +1216,7 @@ export const mergeStates = ( posts: mergeMaps(stateA.posts, stateB.posts), postAggs: mergeMaps(stateA.postAggs, stateB.postAggs), postViewers: mergeMaps(stateA.postViewers, stateB.postViewers), + threadContexts: mergeMaps(stateA.threadContexts, stateB.threadContexts), postBlocks: mergeMaps(stateA.postBlocks, stateB.postBlocks), reposts: mergeMaps(stateA.reposts, stateB.reposts), follows: mergeMaps(stateA.follows, stateB.follows), diff --git a/packages/bsky/src/views/index.ts b/packages/bsky/src/views/index.ts index ee511b3a9a4..0d3d2ec576b 100644 --- a/packages/bsky/src/views/index.ts +++ b/packages/bsky/src/views/index.ts @@ -800,6 +800,9 @@ export class Views { opts.depth, ) : undefined, + threadContext: { + rootAuthorLike: state.threadContexts?.get(post.uri)?.like, + }, } } @@ -829,6 +832,9 @@ export class Views { $type: 'app.bsky.feed.defs#threadViewPost', post, parent: this.threadParent(parentUri, rootUri, state, height - 1), + threadContext: { + rootAuthorLike: state.threadContexts?.get(post.uri)?.like, + }, } } @@ -873,6 +879,9 @@ export class Views { state, depth - 1, ), + threadContext: { + rootAuthorLike: state.threadContexts?.get(post.uri)?.like, + }, } }) } diff --git a/packages/bsky/tests/data-plane/__snapshots__/indexing.test.ts.snap b/packages/bsky/tests/data-plane/__snapshots__/indexing.test.ts.snap index 8c8ec964444..0ef5bb537d6 100644 --- a/packages/bsky/tests/data-plane/__snapshots__/indexing.test.ts.snap +++ b/packages/bsky/tests/data-plane/__snapshots__/indexing.test.ts.snap @@ -599,6 +599,7 @@ Object { }, }, "replies": Array [], + "threadContext": Object {}, }, } `; @@ -668,6 +669,7 @@ Object { }, }, "replies": Array [], + "threadContext": Object {}, }, } `; diff --git a/packages/bsky/tests/views/__snapshots__/block-lists.test.ts.snap b/packages/bsky/tests/views/__snapshots__/block-lists.test.ts.snap index 5270c1cb612..7f843d36d26 100644 --- a/packages/bsky/tests/views/__snapshots__/block-lists.test.ts.snap +++ b/packages/bsky/tests/views/__snapshots__/block-lists.test.ts.snap @@ -137,6 +137,7 @@ Object { "threadMuted": false, }, }, + "threadContext": Object {}, }, } `; @@ -215,6 +216,7 @@ Object { }, }, "replies": Array [], + "threadContext": Object {}, }, } `; @@ -298,6 +300,7 @@ Object { "uri": "record(7)", }, ], + "threadContext": Object {}, }, } `; diff --git a/packages/bsky/tests/views/__snapshots__/blocks.test.ts.snap b/packages/bsky/tests/views/__snapshots__/blocks.test.ts.snap index 9d5dcf2908e..dcf56b98537 100644 --- a/packages/bsky/tests/views/__snapshots__/blocks.test.ts.snap +++ b/packages/bsky/tests/views/__snapshots__/blocks.test.ts.snap @@ -137,6 +137,7 @@ Object { "threadMuted": false, }, }, + "threadContext": Object {}, }, } `; @@ -255,8 +256,10 @@ Object { "threadMuted": false, }, }, + "threadContext": Object {}, }, ], + "threadContext": Object {}, }, } `; @@ -412,8 +415,10 @@ Object { "threadMuted": false, }, }, + "threadContext": Object {}, }, ], + "threadContext": Object {}, }, } `; diff --git a/packages/bsky/tests/views/__snapshots__/mute-lists.test.ts.snap b/packages/bsky/tests/views/__snapshots__/mute-lists.test.ts.snap index 91b9ca6f01e..566cca2c117 100644 --- a/packages/bsky/tests/views/__snapshots__/mute-lists.test.ts.snap +++ b/packages/bsky/tests/views/__snapshots__/mute-lists.test.ts.snap @@ -210,6 +210,7 @@ Object { "threadMuted": false, }, }, + "threadContext": Object {}, }, Object { "$type": "app.bsky.feed.defs#threadViewPost", @@ -309,8 +310,10 @@ Object { "threadMuted": false, }, }, + "threadContext": Object {}, }, ], + "threadContext": Object {}, } `; diff --git a/packages/bsky/tests/views/__snapshots__/mutes.test.ts.snap b/packages/bsky/tests/views/__snapshots__/mutes.test.ts.snap index 2a8fedfbeec..fdd945c589e 100644 --- a/packages/bsky/tests/views/__snapshots__/mutes.test.ts.snap +++ b/packages/bsky/tests/views/__snapshots__/mutes.test.ts.snap @@ -196,6 +196,7 @@ Object { "threadMuted": false, }, }, + "threadContext": Object {}, }, Object { "$type": "app.bsky.feed.defs#threadViewPost", @@ -283,7 +284,9 @@ Object { "threadMuted": false, }, }, + "threadContext": Object {}, }, ], + "threadContext": Object {}, } `; diff --git a/packages/bsky/tests/views/__snapshots__/thread.test.ts.snap b/packages/bsky/tests/views/__snapshots__/thread.test.ts.snap index 4a97788f6e9..e7ac4eed23b 100644 --- a/packages/bsky/tests/views/__snapshots__/thread.test.ts.snap +++ b/packages/bsky/tests/views/__snapshots__/thread.test.ts.snap @@ -56,6 +56,7 @@ Object { "threadMuted": false, }, }, + "threadContext": Object {}, }, "post": Object { "author": Object { @@ -98,7 +99,7 @@ Object { "val": "test-label-2", }, ], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -139,6 +140,9 @@ Object { "threadMuted": false, }, }, + "threadContext": Object { + "rootAuthorLike": "record(8)", + }, }, "post": Object { "author": Object { @@ -173,7 +177,7 @@ Object { "cid": "cids(0)", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -200,6 +204,9 @@ Object { }, }, "replies": Array [], + "threadContext": Object { + "rootAuthorLike": "record(9)", + }, } `; @@ -272,7 +279,7 @@ Object { "cid": "cids(3)", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -298,6 +305,9 @@ Object { }, }, "replies": Array [], + "threadContext": Object { + "rootAuthorLike": "record(7)", + }, }, Object { "$type": "app.bsky.feed.defs#threadViewPost", @@ -331,18 +341,18 @@ Object { "cid": "cids(4)", "cts": "1970-01-01T00:00:00.000Z", "src": "did:example:labeler", - "uri": "record(7)", + "uri": "record(8)", "val": "test-label", }, Object { "cid": "cids(4)", "cts": "1970-01-01T00:00:00.000Z", "src": "did:example:labeler", - "uri": "record(7)", + "uri": "record(8)", "val": "test-label-2", }, ], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -377,7 +387,7 @@ Object { }, "replyCount": 1, "repostCount": 0, - "uri": "record(7)", + "uri": "record(8)", "viewer": Object { "embeddingDisabled": false, "threadMuted": false, @@ -419,7 +429,7 @@ Object { "cid": "cids(6)", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -427,7 +437,7 @@ Object { "reply": Object { "parent": Object { "cid": "cids(4)", - "uri": "record(7)", + "uri": "record(8)", }, "root": Object { "cid": "cids(0)", @@ -438,18 +448,25 @@ Object { }, "replyCount": 0, "repostCount": 2, - "uri": "record(8)", + "uri": "record(9)", "viewer": Object { "embeddingDisabled": false, - "repost": "record(9)", + "repost": "record(10)", "threadMuted": false, }, }, "replies": Array [], + "threadContext": Object { + "rootAuthorLike": "record(11)", + }, }, ], + "threadContext": Object { + "rootAuthorLike": "record(12)", + }, }, ], + "threadContext": Object {}, } `; @@ -522,7 +539,7 @@ Object { "cid": "cids(3)", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -547,6 +564,9 @@ Object { "threadMuted": false, }, }, + "threadContext": Object { + "rootAuthorLike": "record(7)", + }, }, Object { "$type": "app.bsky.feed.defs#threadViewPost", @@ -580,18 +600,18 @@ Object { "cid": "cids(4)", "cts": "1970-01-01T00:00:00.000Z", "src": "did:example:labeler", - "uri": "record(7)", + "uri": "record(8)", "val": "test-label", }, Object { "cid": "cids(4)", "cts": "1970-01-01T00:00:00.000Z", "src": "did:example:labeler", - "uri": "record(7)", + "uri": "record(8)", "val": "test-label-2", }, ], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -626,14 +646,18 @@ Object { }, "replyCount": 1, "repostCount": 0, - "uri": "record(7)", + "uri": "record(8)", "viewer": Object { "embeddingDisabled": false, "threadMuted": false, }, }, + "threadContext": Object { + "rootAuthorLike": "record(9)", + }, }, ], + "threadContext": Object {}, } `; @@ -706,7 +730,7 @@ Object { "cid": "cids(3)", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -731,6 +755,9 @@ Object { "threadMuted": false, }, }, + "threadContext": Object { + "rootAuthorLike": "record(7)", + }, }, Object { "$type": "app.bsky.feed.defs#threadViewPost", @@ -764,18 +791,18 @@ Object { "cid": "cids(4)", "cts": "1970-01-01T00:00:00.000Z", "src": "did:example:labeler", - "uri": "record(7)", + "uri": "record(8)", "val": "test-label", }, Object { "cid": "cids(4)", "cts": "1970-01-01T00:00:00.000Z", "src": "did:example:labeler", - "uri": "record(7)", + "uri": "record(8)", "val": "test-label-2", }, ], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -810,14 +837,18 @@ Object { }, "replyCount": 1, "repostCount": 0, - "uri": "record(7)", + "uri": "record(8)", "viewer": Object { "embeddingDisabled": false, "threadMuted": false, }, }, + "threadContext": Object { + "rootAuthorLike": "record(9)", + }, }, ], + "threadContext": Object {}, } `; @@ -978,10 +1009,13 @@ Object { }, }, "replies": Array [], + "threadContext": Object {}, }, ], + "threadContext": Object {}, }, ], + "threadContext": Object {}, } `; @@ -1037,6 +1071,7 @@ Object { }, }, "replies": Array [], + "threadContext": Object {}, } `; @@ -1107,6 +1142,7 @@ Object { }, }, "replies": Array [], + "threadContext": Object {}, } `; @@ -1151,7 +1187,7 @@ Object { "cid": "cids(0)", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -1178,6 +1214,9 @@ Object { }, }, "replies": Array [], + "threadContext": Object { + "rootAuthorLike": "record(7)", + }, } `; @@ -1222,7 +1261,7 @@ Object { "cid": "cids(0)", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -1249,6 +1288,9 @@ Object { }, }, "replies": Array [], + "threadContext": Object { + "rootAuthorLike": "record(7)", + }, } `; @@ -1348,7 +1390,7 @@ Object { "val": "test-label-2", }, ], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -1425,7 +1467,7 @@ Object { "cid": "cids(5)", "indexedAt": "1970-01-01T00:00:00.000Z", "labels": Array [], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -1452,10 +1494,17 @@ Object { }, }, "replies": Array [], + "threadContext": Object { + "rootAuthorLike": "record(8)", + }, }, ], + "threadContext": Object { + "rootAuthorLike": "record(9)", + }, }, ], + "threadContext": Object {}, } `; @@ -1555,7 +1604,7 @@ Object { "val": "test-label-2", }, ], - "likeCount": 0, + "likeCount": 1, "quoteCount": 0, "record": Object { "$type": "app.bsky.feed.post", @@ -1597,7 +1646,11 @@ Object { }, }, "replies": Array [], + "threadContext": Object { + "rootAuthorLike": "record(6)", + }, }, ], + "threadContext": Object {}, } `; diff --git a/packages/bsky/tests/views/thread.test.ts b/packages/bsky/tests/views/thread.test.ts index 6cf095d795d..67c9f66dd0b 100644 --- a/packages/bsky/tests/views/thread.test.ts +++ b/packages/bsky/tests/views/thread.test.ts @@ -27,6 +27,10 @@ describe('pds thread views', () => { alice = sc.dids.alice bob = sc.dids.bob carol = sc.dids.carol + + await sc.like(alice, sc.replies[alice][0].ref) + await sc.like(alice, sc.replies[bob][0].ref) + await sc.like(alice, sc.replies[carol][0].ref) }) beforeAll(async () => { From c0a75d310aa92c067799a97d1acc5bd0543114c5 Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 21 Jan 2025 15:49:02 -0300 Subject: [PATCH 021/101] posts_with_video filter (#3390) --- .changeset/real-kids-type.md | 6 ++ lexicons/app/bsky/feed/getAuthorFeed.json | 3 +- packages/api/src/client/lexicons.ts | 1 + .../types/app/bsky/feed/getAuthorFeed.ts | 1 + packages/bsky/proto/bsky.proto | 3 + .../src/api/app/bsky/feed/getAuthorFeed.ts | 1 + .../20250116T222618297Z-post-embed-video.ts | 17 +++++ .../data-plane/server/db/migrations/index.ts | 1 + .../data-plane/server/db/tables/post-embed.ts | 8 +++ .../server/indexing/plugins/post.ts | 27 +++++++- .../src/data-plane/server/routes/feeds.ts | 11 ++++ packages/bsky/src/lexicon/lexicons.ts | 1 + .../types/app/bsky/feed/getAuthorFeed.ts | 1 + packages/bsky/src/proto/bsky_pb.ts | 23 +++++++ packages/bsky/tests/views/author-feed.test.ts | 64 +++++++++++++++++++ packages/ozone/src/lexicon/lexicons.ts | 1 + .../types/app/bsky/feed/getAuthorFeed.ts | 1 + packages/pds/src/lexicon/lexicons.ts | 1 + .../types/app/bsky/feed/getAuthorFeed.ts | 1 + 19 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 .changeset/real-kids-type.md create mode 100644 packages/bsky/src/data-plane/server/db/migrations/20250116T222618297Z-post-embed-video.ts diff --git a/.changeset/real-kids-type.md b/.changeset/real-kids-type.md new file mode 100644 index 00000000000..fb0dc454bfb --- /dev/null +++ b/.changeset/real-kids-type.md @@ -0,0 +1,6 @@ +--- +"@atproto/bsky": patch +"@atproto/api": patch +--- + +posts_with_video filter in getAuthorFeed diff --git a/lexicons/app/bsky/feed/getAuthorFeed.json b/lexicons/app/bsky/feed/getAuthorFeed.json index 19e99b174ac..c9ef8c5077d 100644 --- a/lexicons/app/bsky/feed/getAuthorFeed.json +++ b/lexicons/app/bsky/feed/getAuthorFeed.json @@ -24,7 +24,8 @@ "posts_with_replies", "posts_no_replies", "posts_with_media", - "posts_and_author_threads" + "posts_and_author_threads", + "posts_with_video" ], "default": "posts_with_replies" }, diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 1eb438b9200..36604fa13ae 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -6230,6 +6230,7 @@ export const schemaDict = { 'posts_no_replies', 'posts_with_media', 'posts_and_author_threads', + 'posts_with_video', ], default: 'posts_with_replies', }, diff --git a/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts b/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts index 77319f28d40..8fc58a4e46c 100644 --- a/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts +++ b/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts @@ -18,6 +18,7 @@ export interface QueryParams { | 'posts_no_replies' | 'posts_with_media' | 'posts_and_author_threads' + | 'posts_with_video' | (string & {}) includePins?: boolean } diff --git a/packages/bsky/proto/bsky.proto b/packages/bsky/proto/bsky.proto index 699b9fe673f..b2fe8840a0e 100644 --- a/packages/bsky/proto/bsky.proto +++ b/packages/bsky/proto/bsky.proto @@ -82,6 +82,7 @@ message PostRecordMeta { bool violates_embedding_rules = 4; bool has_post_gate = 5; bool has_thread_gate = 6; + bool has_video = 7; } message GetPostRecordsRequest { @@ -788,6 +789,7 @@ enum FeedType { FEED_TYPE_POSTS_AND_AUTHOR_THREADS = 1; FEED_TYPE_POSTS_NO_REPLIES = 2; FEED_TYPE_POSTS_WITH_MEDIA = 3; + FEED_TYPE_POSTS_WITH_VIDEO = 4; } // - Returns recent posts authored by a given DID, paginated @@ -811,6 +813,7 @@ message AuthorFeedItem { bool is_reply = 8; bool is_repost = 9; bool is_quote_post = 10; + bool posts_with_video = 11; } message GetAuthorFeedResponse { diff --git a/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts b/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts index d58500c07c4..1aeaf65f291 100644 --- a/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts +++ b/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts @@ -58,6 +58,7 @@ const FILTER_TO_FEED_TYPE = { posts_no_replies: FeedType.POSTS_NO_REPLIES, posts_with_media: FeedType.POSTS_WITH_MEDIA, posts_and_author_threads: FeedType.POSTS_AND_AUTHOR_THREADS, + posts_with_video: FeedType.POSTS_WITH_VIDEO, } export const skeleton = async (inputs: { diff --git a/packages/bsky/src/data-plane/server/db/migrations/20250116T222618297Z-post-embed-video.ts b/packages/bsky/src/data-plane/server/db/migrations/20250116T222618297Z-post-embed-video.ts new file mode 100644 index 00000000000..87c7e1b75f5 --- /dev/null +++ b/packages/bsky/src/data-plane/server/db/migrations/20250116T222618297Z-post-embed-video.ts @@ -0,0 +1,17 @@ +import { Kysely } from 'kysely' + +export async function up(db: Kysely): Promise { + // postEmbedVideo + await db.schema + .createTable('post_embed_video') + .addColumn('postUri', 'varchar', (col) => col.notNull()) + .addColumn('videoCid', 'varchar', (col) => col.notNull()) + .addColumn('alt', 'varchar') + .addPrimaryKeyConstraint('post_embed_video_pkey', ['postUri']) + .execute() +} + +export async function down(db: Kysely): Promise { + // postEmbedVideo + await db.schema.dropTable('post_embed_video').execute() +} diff --git a/packages/bsky/src/data-plane/server/db/migrations/index.ts b/packages/bsky/src/data-plane/server/db/migrations/index.ts index 5b8684a2a78..90356eca865 100644 --- a/packages/bsky/src/data-plane/server/db/migrations/index.ts +++ b/packages/bsky/src/data-plane/server/db/migrations/index.ts @@ -45,3 +45,4 @@ export * as _20240808T224251220Z from './20240808T224251220Z-post-gate-flags' export * as _20240829T211238293Z from './20240829T211238293Z-simplify-actor-sync' export * as _20240831T134810923Z from './20240831T134810923Z-pinned-posts' export * as _20241114T153108102Z from './20241114T153108102Z-add-starter-packs-name' +export * as _20250116T222618297Z from './20250116T222618297Z-post-embed-video' diff --git a/packages/bsky/src/data-plane/server/db/tables/post-embed.ts b/packages/bsky/src/data-plane/server/db/tables/post-embed.ts index 69c44efe718..dfcc1564857 100644 --- a/packages/bsky/src/data-plane/server/db/tables/post-embed.ts +++ b/packages/bsky/src/data-plane/server/db/tables/post-embed.ts @@ -1,6 +1,7 @@ export const imageTableName = 'post_embed_image' export const externalTableName = 'post_embed_external' export const recordTableName = 'post_embed_record' +export const videoTableName = 'post_embed_video' export interface PostEmbedImage { postUri: string @@ -23,8 +24,15 @@ export interface PostEmbedRecord { embedCid: string } +export interface PostEmbedVideo { + postUri: string + videoCid: string + alt: string | null +} + export type PartialDB = { [imageTableName]: PostEmbedImage [externalTableName]: PostEmbedExternal [recordTableName]: PostEmbedRecord + [videoTableName]: PostEmbedVideo } diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/post.ts b/packages/bsky/src/data-plane/server/indexing/plugins/post.ts index eb495fcb13f..606d2aff3f8 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/post.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/post.ts @@ -12,6 +12,7 @@ import { isMain as isEmbedImage } from '../../../../lexicon/types/app/bsky/embed import { isMain as isEmbedExternal } from '../../../../lexicon/types/app/bsky/embed/external' import { isMain as isEmbedRecord } from '../../../../lexicon/types/app/bsky/embed/record' import { isMain as isEmbedRecordWithMedia } from '../../../../lexicon/types/app/bsky/embed/recordWithMedia' +import { isMain as isEmbedVideo } from '../../../../lexicon/types/app/bsky/embed/video' import { isMention, isLink, @@ -41,6 +42,7 @@ type Post = Selectable type PostEmbedImage = DatabaseSchemaType['post_embed_image'] type PostEmbedExternal = DatabaseSchemaType['post_embed_external'] type PostEmbedRecord = DatabaseSchemaType['post_embed_record'] +type PostEmbedVideo = DatabaseSchemaType['post_embed_video'] type PostAncestor = { uri: string height: number @@ -55,7 +57,12 @@ type PostDescendent = { type IndexedPost = { post: Post facets?: { type: 'mention' | 'link'; value: string }[] - embeds?: (PostEmbedImage[] | PostEmbedExternal | PostEmbedRecord)[] + embeds?: ( + | PostEmbedImage[] + | PostEmbedExternal + | PostEmbedRecord + | PostEmbedVideo + )[] ancestors?: PostAncestor[] descendents?: PostDescendent[] threadgate?: GateRecord @@ -149,7 +156,12 @@ const insertFn = async ( return [] }) // Embed indices - const embeds: (PostEmbedImage[] | PostEmbedExternal | PostEmbedRecord)[] = [] + const embeds: ( + | PostEmbedImage[] + | PostEmbedExternal + | PostEmbedRecord + | PostEmbedVideo + )[] = [] const postEmbeds = separateEmbeds(obj.embed) for (const postEmbed of postEmbeds) { if (isEmbedImage(postEmbed)) { @@ -232,6 +244,17 @@ const insertFn = async ( .executeTakeFirst() } } + } else if (isEmbedVideo(postEmbed)) { + const { video } = postEmbed + const videoEmbed = { + postUri: uri.toString(), + videoCid: video.ref.toString(), + // @NOTE: alt is required for image but not for video on the lexicon. + alt: postEmbed.alt ?? null, + } + embeds.push(videoEmbed) + + await db.insertInto('post_embed_video').values(videoEmbed).execute() } } diff --git a/packages/bsky/src/data-plane/server/routes/feeds.ts b/packages/bsky/src/data-plane/server/routes/feeds.ts index 3cb56d57e3f..60b737a889a 100644 --- a/packages/bsky/src/data-plane/server/routes/feeds.ts +++ b/packages/bsky/src/data-plane/server/routes/feeds.ts @@ -27,6 +27,17 @@ export default (db: Database): Partial> => ({ .select('post_embed_image.postUri') .whereRef('post_embed_image.postUri', '=', 'feed_item.postUri'), ) + } else if (feedType === FeedType.POSTS_WITH_VIDEO) { + builder = builder + // only your own posts + .where('type', '=', 'post') + // only posts with video + .whereExists((qb) => + qb + .selectFrom('post_embed_video') + .select('post_embed_video.postUri') + .whereRef('post_embed_video.postUri', '=', 'feed_item.postUri'), + ) } else if (feedType === FeedType.POSTS_NO_REPLIES) { builder = builder.where((qb) => qb.where('post.replyParent', 'is', null).orWhere('type', '=', 'repost'), diff --git a/packages/bsky/src/lexicon/lexicons.ts b/packages/bsky/src/lexicon/lexicons.ts index aecaa923597..793a68326ba 100644 --- a/packages/bsky/src/lexicon/lexicons.ts +++ b/packages/bsky/src/lexicon/lexicons.ts @@ -6230,6 +6230,7 @@ export const schemaDict = { 'posts_no_replies', 'posts_with_media', 'posts_and_author_threads', + 'posts_with_video', ], default: 'posts_with_replies', }, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts index 60fa2f74f92..70c2c439d2a 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts @@ -19,6 +19,7 @@ export interface QueryParams { | 'posts_no_replies' | 'posts_with_media' | 'posts_and_author_threads' + | 'posts_with_video' | (string & {}) includePins: boolean } diff --git a/packages/bsky/src/proto/bsky_pb.ts b/packages/bsky/src/proto/bsky_pb.ts index 74f0f04a604..d5db7b82ecf 100644 --- a/packages/bsky/src/proto/bsky_pb.ts +++ b/packages/bsky/src/proto/bsky_pb.ts @@ -36,6 +36,11 @@ export enum FeedType { * @generated from enum value: FEED_TYPE_POSTS_WITH_MEDIA = 3; */ POSTS_WITH_MEDIA = 3, + + /** + * @generated from enum value: FEED_TYPE_POSTS_WITH_VIDEO = 4; + */ + POSTS_WITH_VIDEO = 4, } // Retrieve enum metadata with: proto3.getEnumType(FeedType) proto3.util.setEnumType(FeedType, 'bsky.FeedType', [ @@ -43,6 +48,7 @@ proto3.util.setEnumType(FeedType, 'bsky.FeedType', [ { no: 1, name: 'FEED_TYPE_POSTS_AND_AUTHOR_THREADS' }, { no: 2, name: 'FEED_TYPE_POSTS_NO_REPLIES' }, { no: 3, name: 'FEED_TYPE_POSTS_WITH_MEDIA' }, + { no: 4, name: 'FEED_TYPE_POSTS_WITH_VIDEO' }, ]) /** @@ -975,6 +981,11 @@ export class PostRecordMeta extends Message { */ hasThreadGate = false + /** + * @generated from field: bool has_video = 7; + */ + hasVideo = false + constructor(data?: PartialMessage) { super() proto3.util.initPartial(data, this) @@ -1009,6 +1020,7 @@ export class PostRecordMeta extends Message { kind: 'scalar', T: 8 /* ScalarType.BOOL */, }, + { no: 7, name: 'has_video', kind: 'scalar', T: 8 /* ScalarType.BOOL */ }, ]) static fromBinary( @@ -8540,6 +8552,11 @@ export class AuthorFeedItem extends Message { */ isQuotePost = false + /** + * @generated from field: bool posts_with_video = 11; + */ + postsWithVideo = false + constructor(data?: PartialMessage) { super() proto3.util.initPartial(data, this) @@ -8578,6 +8595,12 @@ export class AuthorFeedItem extends Message { kind: 'scalar', T: 8 /* ScalarType.BOOL */, }, + { + no: 11, + name: 'posts_with_video', + kind: 'scalar', + T: 8 /* ScalarType.BOOL */, + }, ]) static fromBinary( diff --git a/packages/bsky/tests/views/author-feed.test.ts b/packages/bsky/tests/views/author-feed.test.ts index 23f4f0072fe..50c105d2342 100644 --- a/packages/bsky/tests/views/author-feed.test.ts +++ b/packages/bsky/tests/views/author-feed.test.ts @@ -9,9 +9,11 @@ import { import { ReplyRef, isRecord } from '../../src/lexicon/types/app/bsky/feed/post' import { isView as isEmbedRecordWithMedia } from '../../src/lexicon/types/app/bsky/embed/recordWithMedia' import { isView as isImageEmbed } from '../../src/lexicon/types/app/bsky/embed/images' +import { isView as isVideoEmbed } from '../../src/lexicon/types/app/bsky/embed/video' import { isPostView } from '../../src/lexicon/types/app/bsky/feed/defs' import { uriToDid } from '../../src/util/uris' import { ids } from '../../src/lexicon/lexicons' +import { VideoEmbed } from '../../src/views/types' describe('pds author feed views', () => { let network: TestNetwork @@ -319,6 +321,68 @@ describe('pds author feed views', () => { expect(danFeed.feed.length).toEqual(0) }) + it('can filter by posts_with_video', async () => { + const { data: carolFeedBefore } = + await agent.api.app.bsky.feed.getAuthorFeed({ + actor: carol, + filter: 'posts_with_video', + }) + expect(carolFeedBefore.feed).toHaveLength(0) + + const { data: video } = await pdsAgent.api.com.atproto.repo.uploadBlob( + Buffer.from('notarealvideo'), + { + headers: sc.getHeaders(sc.dids.carol), + encoding: 'image/mp4', + }, + ) + + await sc.post(carol, 'video post', undefined, undefined, undefined, { + embed: { + $type: 'app.bsky.embed.video', + video: video.blob, + alt: 'alt text', + aspectRatio: { height: 3, width: 4 }, + } satisfies VideoEmbed, + }) + await network.processAll() + + const { data: carolFeed } = await agent.api.app.bsky.feed.getAuthorFeed({ + actor: carol, + filter: 'posts_with_video', + }) + + expect(carolFeed.feed).toHaveLength(1) + expect( + carolFeed.feed.every(({ post }) => { + const isRecordWithActorMedia = + isEmbedRecordWithMedia(post.embed) && isVideoEmbed(post.embed?.media) + const isActorMedia = isVideoEmbed(post.embed) + const isFromActor = post.author.did === carol + + return (isRecordWithActorMedia || isActorMedia) && isFromActor + }), + ).toBeTruthy() + + const { data: bobFeed } = await agent.api.app.bsky.feed.getAuthorFeed({ + actor: bob, + filter: 'posts_with_video', + }) + + expect( + bobFeed.feed.every(({ post }) => { + return isVideoEmbed(post.embed) && post.author.did === bob + }), + ).toBeTruthy() + + const { data: danFeed } = await agent.api.app.bsky.feed.getAuthorFeed({ + actor: dan, + filter: 'posts_with_video', + }) + + expect(danFeed.feed.length).toEqual(0) + }) + it('filters by posts_no_replies', async () => { const { data: carolFeed } = await agent.api.app.bsky.feed.getAuthorFeed({ actor: carol, diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 1eb438b9200..36604fa13ae 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -6230,6 +6230,7 @@ export const schemaDict = { 'posts_no_replies', 'posts_with_media', 'posts_and_author_threads', + 'posts_with_video', ], default: 'posts_with_replies', }, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts index 60fa2f74f92..70c2c439d2a 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts @@ -19,6 +19,7 @@ export interface QueryParams { | 'posts_no_replies' | 'posts_with_media' | 'posts_and_author_threads' + | 'posts_with_video' | (string & {}) includePins: boolean } diff --git a/packages/pds/src/lexicon/lexicons.ts b/packages/pds/src/lexicon/lexicons.ts index 1eb438b9200..36604fa13ae 100644 --- a/packages/pds/src/lexicon/lexicons.ts +++ b/packages/pds/src/lexicon/lexicons.ts @@ -6230,6 +6230,7 @@ export const schemaDict = { 'posts_no_replies', 'posts_with_media', 'posts_and_author_threads', + 'posts_with_video', ], default: 'posts_with_replies', }, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts index 60fa2f74f92..70c2c439d2a 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts @@ -19,6 +19,7 @@ export interface QueryParams { | 'posts_no_replies' | 'posts_with_media' | 'posts_and_author_threads' + | 'posts_with_video' | (string & {}) includePins: boolean } From e6e6aea3814e3d0bb42a537f80d77947e85fa73f Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 21 Jan 2025 22:06:08 -0300 Subject: [PATCH 022/101] version api (#3429) --- .changeset/perfect-dogs-complain.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/perfect-dogs-complain.md diff --git a/.changeset/perfect-dogs-complain.md b/.changeset/perfect-dogs-complain.md new file mode 100644 index 00000000000..d5e41d5b8f4 --- /dev/null +++ b/.changeset/perfect-dogs-complain.md @@ -0,0 +1,5 @@ +--- +"@atproto/api": patch +--- + +add feedViewPost.threadContext defs From c5a4cdb0a52f4583ffe783a0b259e80263f24a8c Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 22 Jan 2025 11:17:20 +0100 Subject: [PATCH 023/101] Improve error description in case invalid DPoP nonce is used (#3415) --- .changeset/young-balloons-check.md | 5 +++++ packages/oauth/oauth-provider/src/dpop/dpop-manager.ts | 8 ++++++-- packages/oauth/oauth-provider/src/lib/http/router.ts | 8 ++++---- 3 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 .changeset/young-balloons-check.md diff --git a/.changeset/young-balloons-check.md b/.changeset/young-balloons-check.md new file mode 100644 index 00000000000..ea89b9201b8 --- /dev/null +++ b/.changeset/young-balloons-check.md @@ -0,0 +1,5 @@ +--- +"@atproto/oauth-provider": patch +--- + +Improve error description in case invalid DPoP nonce is used diff --git a/packages/oauth/oauth-provider/src/dpop/dpop-manager.ts b/packages/oauth/oauth-provider/src/dpop/dpop-manager.ts index 7ff55719f37..d41813d741f 100644 --- a/packages/oauth/oauth-provider/src/dpop/dpop-manager.ts +++ b/packages/oauth/oauth-provider/src/dpop/dpop-manager.ts @@ -87,11 +87,15 @@ export class DpopManager { } if (payload['nonce'] && !this.dpopNonce?.check(payload['nonce'])) { - throw new UseDpopNonceError() + throw new UseDpopNonceError('DPoP nonce mismatch') } const htuNorm = normalizeHtu(htu) - if (!htuNorm || htuNorm !== normalizeHtu(payload['htu'])) { + if (!htuNorm) { + throw new TypeError('Invalid "htu" argument') + } + + if (htuNorm !== normalizeHtu(payload['htu'])) { throw new InvalidDpopProofError('DPoP htu mismatch') } diff --git a/packages/oauth/oauth-provider/src/lib/http/router.ts b/packages/oauth/oauth-provider/src/lib/http/router.ts index efbfd0ccf5f..a767867ae49 100644 --- a/packages/oauth/oauth-provider/src/lib/http/router.ts +++ b/packages/oauth/oauth-provider/src/lib/http/router.ts @@ -104,10 +104,10 @@ export class Router< const host = req.headers.host || routerUrl?.host || 'localhost' const pathname = req.url || '/' url = new URL(pathname, `${protocol}//${host}`) - } catch (err) { - return next( - Object.assign(err as Error, { status: 400, statusCode: 400 }), - ) + } catch (cause) { + const error = + cause instanceof Error ? cause : new Error('Invalid URL', { cause }) + return next(Object.assign(error, { status: 400, statusCode: 400 })) } } From e6bd2ad8d1a314c80540616095ef3d5926213682 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:52:42 -0300 Subject: [PATCH 024/101] Version packages (#3427) Co-authored-by: github-actions[bot] --- .changeset/heavy-badgers-share.md | 5 ----- .changeset/perfect-dogs-complain.md | 5 ----- .changeset/real-kids-type.md | 6 ------ .changeset/young-balloons-check.md | 5 ----- packages/api/CHANGELOG.md | 8 ++++++++ packages/api/package.json | 2 +- packages/bsky/CHANGELOG.md | 9 +++++++++ packages/bsky/package.json | 2 +- packages/dev-env/CHANGELOG.md | 10 ++++++++++ packages/dev-env/package.json | 2 +- packages/oauth/oauth-provider/CHANGELOG.md | 6 ++++++ packages/oauth/oauth-provider/package.json | 2 +- packages/ozone/CHANGELOG.md | 9 +++++++++ packages/ozone/package.json | 2 +- packages/pds/CHANGELOG.md | 8 ++++++++ packages/pds/package.json | 2 +- 16 files changed, 56 insertions(+), 27 deletions(-) delete mode 100644 .changeset/heavy-badgers-share.md delete mode 100644 .changeset/perfect-dogs-complain.md delete mode 100644 .changeset/real-kids-type.md delete mode 100644 .changeset/young-balloons-check.md diff --git a/.changeset/heavy-badgers-share.md b/.changeset/heavy-badgers-share.md deleted file mode 100644 index be2d2bc97e6..00000000000 --- a/.changeset/heavy-badgers-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/ozone": patch ---- - -Fix getSubjectStatuses query diff --git a/.changeset/perfect-dogs-complain.md b/.changeset/perfect-dogs-complain.md deleted file mode 100644 index d5e41d5b8f4..00000000000 --- a/.changeset/perfect-dogs-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/api": patch ---- - -add feedViewPost.threadContext defs diff --git a/.changeset/real-kids-type.md b/.changeset/real-kids-type.md deleted file mode 100644 index fb0dc454bfb..00000000000 --- a/.changeset/real-kids-type.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@atproto/bsky": patch -"@atproto/api": patch ---- - -posts_with_video filter in getAuthorFeed diff --git a/.changeset/young-balloons-check.md b/.changeset/young-balloons-check.md deleted file mode 100644 index ea89b9201b8..00000000000 --- a/.changeset/young-balloons-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/oauth-provider": patch ---- - -Improve error description in case invalid DPoP nonce is used diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 40c0a9955e5..f3a524ae1e8 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/api +## 0.13.30 + +### Patch Changes + +- [#3429](https://github.com/bluesky-social/atproto/pull/3429) [`e6e6aea38`](https://github.com/bluesky-social/atproto/commit/e6e6aea3814e3d0bb42a537f80d77947e85fa73f) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - add feedViewPost.threadContext defs + +- [#3390](https://github.com/bluesky-social/atproto/pull/3390) [`c0a75d310`](https://github.com/bluesky-social/atproto/commit/c0a75d310aa92c067799a97d1acc5bd0543114c5) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - posts_with_video filter in getAuthorFeed + ## 0.13.29 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index b7bfff0df8f..222027b7870 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.13.29", + "version": "0.13.30", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index c566e2f8f04..1eecb2411b8 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/bsky +## 0.0.111 + +### Patch Changes + +- [#3390](https://github.com/bluesky-social/atproto/pull/3390) [`c0a75d310`](https://github.com/bluesky-social/atproto/commit/c0a75d310aa92c067799a97d1acc5bd0543114c5) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - posts_with_video filter in getAuthorFeed + +- Updated dependencies [[`e6e6aea38`](https://github.com/bluesky-social/atproto/commit/e6e6aea3814e3d0bb42a537f80d77947e85fa73f), [`c0a75d310`](https://github.com/bluesky-social/atproto/commit/c0a75d310aa92c067799a97d1acc5bd0543114c5)]: + - @atproto/api@0.13.30 + ## 0.0.110 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 50ead1b3514..58b6848f593 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.110", + "version": "0.0.111", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index e933d3808ae..ff18c62f0ad 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/dev-env +## 0.3.81 + +### Patch Changes + +- Updated dependencies [[`1ada2d093`](https://github.com/bluesky-social/atproto/commit/1ada2d093427e45b6d59a16cf146bf5282560c7b), [`e6e6aea38`](https://github.com/bluesky-social/atproto/commit/e6e6aea3814e3d0bb42a537f80d77947e85fa73f), [`c0a75d310`](https://github.com/bluesky-social/atproto/commit/c0a75d310aa92c067799a97d1acc5bd0543114c5)]: + - @atproto/ozone@0.1.72 + - @atproto/api@0.13.30 + - @atproto/bsky@0.0.111 + - @atproto/pds@0.4.89 + ## 0.3.80 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index 33293b942a1..ccc026bc702 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.3.80", + "version": "0.3.81", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/oauth/oauth-provider/CHANGELOG.md b/packages/oauth/oauth-provider/CHANGELOG.md index 88a84cf6375..5ae5f34792b 100644 --- a/packages/oauth/oauth-provider/CHANGELOG.md +++ b/packages/oauth/oauth-provider/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/oauth-provider +## 0.2.14 + +### Patch Changes + +- [#3415](https://github.com/bluesky-social/atproto/pull/3415) [`c5a4cdb0a`](https://github.com/bluesky-social/atproto/commit/c5a4cdb0a52f4583ffe783a0b259e80263f24a8c) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Improve error description in case invalid DPoP nonce is used + ## 0.2.13 ### Patch Changes diff --git a/packages/oauth/oauth-provider/package.json b/packages/oauth/oauth-provider/package.json index 2e6d0be16a4..9b87ac0852d 100644 --- a/packages/oauth/oauth-provider/package.json +++ b/packages/oauth/oauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider", - "version": "0.2.13", + "version": "0.2.14", "license": "MIT", "description": "Generic OAuth2 and OpenID Connect provider for Node.js. Currently only supports features needed for Atproto.", "keywords": [ diff --git a/packages/ozone/CHANGELOG.md b/packages/ozone/CHANGELOG.md index eb0a95d23d5..5a45d5e7ab0 100644 --- a/packages/ozone/CHANGELOG.md +++ b/packages/ozone/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/ozone +## 0.1.72 + +### Patch Changes + +- [#3426](https://github.com/bluesky-social/atproto/pull/3426) [`1ada2d093`](https://github.com/bluesky-social/atproto/commit/1ada2d093427e45b6d59a16cf146bf5282560c7b) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fix getSubjectStatuses query + +- Updated dependencies [[`e6e6aea38`](https://github.com/bluesky-social/atproto/commit/e6e6aea3814e3d0bb42a537f80d77947e85fa73f), [`c0a75d310`](https://github.com/bluesky-social/atproto/commit/c0a75d310aa92c067799a97d1acc5bd0543114c5)]: + - @atproto/api@0.13.30 + ## 0.1.71 ### Patch Changes diff --git a/packages/ozone/package.json b/packages/ozone/package.json index ade4f19d7df..781798bd26d 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ozone", - "version": "0.1.71", + "version": "0.1.72", "license": "MIT", "description": "Backend service for moderating the Bluesky network.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index dd2a563ab7b..64ee066e01d 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/pds +## 0.4.89 + +### Patch Changes + +- Updated dependencies [[`e6e6aea38`](https://github.com/bluesky-social/atproto/commit/e6e6aea3814e3d0bb42a537f80d77947e85fa73f), [`c0a75d310`](https://github.com/bluesky-social/atproto/commit/c0a75d310aa92c067799a97d1acc5bd0543114c5), [`c5a4cdb0a`](https://github.com/bluesky-social/atproto/commit/c5a4cdb0a52f4583ffe783a0b259e80263f24a8c)]: + - @atproto/api@0.13.30 + - @atproto/oauth-provider@0.2.14 + ## 0.4.88 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index f731ff305ba..34858139bfc 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.88", + "version": "0.4.89", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ From 08a48c16a0c09838df8fda79fd00af6b94c26bf3 Mon Sep 17 00:00:00 2001 From: Daniel Holmgren Date: Wed, 22 Jan 2025 17:55:34 -0600 Subject: [PATCH 025/101] Reset rate limit codegen (#3435) reset rate limit codegen --- packages/bsky/src/lexicon/types/app/bsky/actor/getPreferences.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/actor/getProfile.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/actor/getProfiles.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/actor/getSuggestions.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/actor/putPreferences.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/actor/searchActors.ts | 1 + .../src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts | 1 + .../src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getActorFeeds.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getActorLikes.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getFeed.ts | 1 + .../bsky/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts | 1 + .../bsky/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getLikes.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getListFeed.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getPostThread.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getPosts.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getQuotes.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getRepostedBy.ts | 1 + .../bsky/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/getTimeline.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/feed/searchPosts.ts | 1 + .../bsky/src/lexicon/types/app/bsky/feed/sendInteractions.ts | 1 + .../src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/getBlocks.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/getFollowers.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/getFollows.ts | 1 + .../bsky/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/getList.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/getListBlocks.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/getListMutes.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/getLists.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/getMutes.ts | 1 + .../bsky/src/lexicon/types/app/bsky/graph/getRelationships.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/getStarterPack.ts | 1 + .../bsky/src/lexicon/types/app/bsky/graph/getStarterPacks.ts | 1 + .../lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/muteActor.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/muteActorList.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/muteThread.ts | 1 + .../bsky/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/unmuteActor.ts | 1 + .../bsky/src/lexicon/types/app/bsky/graph/unmuteActorList.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/graph/unmuteThread.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/labeler/getServices.ts | 1 + .../src/lexicon/types/app/bsky/notification/getUnreadCount.ts | 1 + .../src/lexicon/types/app/bsky/notification/listNotifications.ts | 1 + .../src/lexicon/types/app/bsky/notification/putPreferences.ts | 1 + .../bsky/src/lexicon/types/app/bsky/notification/registerPush.ts | 1 + .../bsky/src/lexicon/types/app/bsky/notification/updateSeen.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/unspecced/getConfig.ts | 1 + .../lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts | 1 + .../lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts | 1 + .../types/app/bsky/unspecced/searchStarterPacksSkeleton.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/video/getJobStatus.ts | 1 + .../bsky/src/lexicon/types/app/bsky/video/getUploadLimits.ts | 1 + packages/bsky/src/lexicon/types/app/bsky/video/uploadVideo.ts | 1 + packages/bsky/src/lexicon/types/chat/bsky/actor/deleteAccount.ts | 1 + .../bsky/src/lexicon/types/chat/bsky/actor/exportAccountData.ts | 1 + .../src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts | 1 + packages/bsky/src/lexicon/types/chat/bsky/convo/getConvo.ts | 1 + .../bsky/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts | 1 + packages/bsky/src/lexicon/types/chat/bsky/convo/getLog.ts | 1 + packages/bsky/src/lexicon/types/chat/bsky/convo/getMessages.ts | 1 + packages/bsky/src/lexicon/types/chat/bsky/convo/leaveConvo.ts | 1 + packages/bsky/src/lexicon/types/chat/bsky/convo/listConvos.ts | 1 + packages/bsky/src/lexicon/types/chat/bsky/convo/muteConvo.ts | 1 + packages/bsky/src/lexicon/types/chat/bsky/convo/sendMessage.ts | 1 + .../bsky/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts | 1 + packages/bsky/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts | 1 + packages/bsky/src/lexicon/types/chat/bsky/convo/updateRead.ts | 1 + .../src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts | 1 + .../src/lexicon/types/chat/bsky/moderation/getMessageContext.ts | 1 + .../src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts | 1 + .../bsky/src/lexicon/types/com/atproto/admin/deleteAccount.ts | 1 + .../src/lexicon/types/com/atproto/admin/disableAccountInvites.ts | 1 + .../src/lexicon/types/com/atproto/admin/disableInviteCodes.ts | 1 + .../src/lexicon/types/com/atproto/admin/enableAccountInvites.ts | 1 + .../bsky/src/lexicon/types/com/atproto/admin/getAccountInfo.ts | 1 + .../bsky/src/lexicon/types/com/atproto/admin/getAccountInfos.ts | 1 + .../bsky/src/lexicon/types/com/atproto/admin/getInviteCodes.ts | 1 + .../bsky/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts | 1 + .../bsky/src/lexicon/types/com/atproto/admin/searchAccounts.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/admin/sendEmail.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateAccountEmail.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateAccountHandle.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateAccountPassword.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts | 1 + .../types/com/atproto/identity/getRecommendedDidCredentials.ts | 1 + .../types/com/atproto/identity/requestPlcOperationSignature.ts | 1 + .../bsky/src/lexicon/types/com/atproto/identity/resolveHandle.ts | 1 + .../src/lexicon/types/com/atproto/identity/signPlcOperation.ts | 1 + .../src/lexicon/types/com/atproto/identity/submitPlcOperation.ts | 1 + .../bsky/src/lexicon/types/com/atproto/identity/updateHandle.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/label/queryLabels.ts | 1 + .../src/lexicon/types/com/atproto/moderation/createReport.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/repo/applyWrites.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/repo/createRecord.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/repo/deleteRecord.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/repo/describeRepo.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/repo/getRecord.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/repo/importRepo.ts | 1 + .../bsky/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/repo/listRecords.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/repo/putRecord.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/repo/uploadBlob.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/activateAccount.ts | 1 + .../src/lexicon/types/com/atproto/server/checkAccountStatus.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/confirmEmail.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/createAccount.ts | 1 + .../src/lexicon/types/com/atproto/server/createAppPassword.ts | 1 + .../src/lexicon/types/com/atproto/server/createInviteCode.ts | 1 + .../src/lexicon/types/com/atproto/server/createInviteCodes.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/createSession.ts | 1 + .../src/lexicon/types/com/atproto/server/deactivateAccount.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/deleteAccount.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/deleteSession.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/describeServer.ts | 1 + .../lexicon/types/com/atproto/server/getAccountInviteCodes.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/getServiceAuth.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/server/getSession.ts | 1 + .../src/lexicon/types/com/atproto/server/listAppPasswords.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/refreshSession.ts | 1 + .../src/lexicon/types/com/atproto/server/requestAccountDelete.ts | 1 + .../lexicon/types/com/atproto/server/requestEmailConfirmation.ts | 1 + .../src/lexicon/types/com/atproto/server/requestEmailUpdate.ts | 1 + .../src/lexicon/types/com/atproto/server/requestPasswordReset.ts | 1 + .../src/lexicon/types/com/atproto/server/reserveSigningKey.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/resetPassword.ts | 1 + .../src/lexicon/types/com/atproto/server/revokeAppPassword.ts | 1 + .../bsky/src/lexicon/types/com/atproto/server/updateEmail.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/sync/getBlob.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/sync/getBlocks.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/sync/getCheckout.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/sync/getHead.ts | 1 + .../bsky/src/lexicon/types/com/atproto/sync/getLatestCommit.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/sync/getRecord.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/sync/getRepo.ts | 1 + .../bsky/src/lexicon/types/com/atproto/sync/getRepoStatus.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/sync/listBlobs.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/sync/listRepos.ts | 1 + .../bsky/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/sync/requestCrawl.ts | 1 + .../bsky/src/lexicon/types/com/atproto/temp/addReservedHandle.ts | 1 + .../bsky/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts | 1 + packages/bsky/src/lexicon/types/com/atproto/temp/fetchLabels.ts | 1 + .../lexicon/types/com/atproto/temp/requestPhoneVerification.ts | 1 + .../ozone/src/lexicon/types/app/bsky/actor/getPreferences.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/actor/getProfile.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/actor/getProfiles.ts | 1 + .../ozone/src/lexicon/types/app/bsky/actor/getSuggestions.ts | 1 + .../ozone/src/lexicon/types/app/bsky/actor/putPreferences.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/actor/searchActors.ts | 1 + .../src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts | 1 + .../src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getActorFeeds.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getActorLikes.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getFeed.ts | 1 + .../ozone/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts | 1 + .../ozone/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts | 1 + .../ozone/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getLikes.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getListFeed.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getPostThread.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getPosts.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getQuotes.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getRepostedBy.ts | 1 + .../ozone/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/getTimeline.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/feed/searchPosts.ts | 1 + .../ozone/src/lexicon/types/app/bsky/feed/sendInteractions.ts | 1 + .../src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/getBlocks.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/getFollowers.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/getFollows.ts | 1 + .../ozone/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/getList.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/getListBlocks.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/getListMutes.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/getLists.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/getMutes.ts | 1 + .../ozone/src/lexicon/types/app/bsky/graph/getRelationships.ts | 1 + .../ozone/src/lexicon/types/app/bsky/graph/getStarterPack.ts | 1 + .../ozone/src/lexicon/types/app/bsky/graph/getStarterPacks.ts | 1 + .../lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/muteActor.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/muteActorList.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/muteThread.ts | 1 + .../ozone/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActor.ts | 1 + .../ozone/src/lexicon/types/app/bsky/graph/unmuteActorList.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/graph/unmuteThread.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/labeler/getServices.ts | 1 + .../src/lexicon/types/app/bsky/notification/getUnreadCount.ts | 1 + .../src/lexicon/types/app/bsky/notification/listNotifications.ts | 1 + .../src/lexicon/types/app/bsky/notification/putPreferences.ts | 1 + .../src/lexicon/types/app/bsky/notification/registerPush.ts | 1 + .../ozone/src/lexicon/types/app/bsky/notification/updateSeen.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/unspecced/getConfig.ts | 1 + .../lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts | 1 + .../lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts | 1 + .../types/app/bsky/unspecced/searchStarterPacksSkeleton.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/video/getJobStatus.ts | 1 + .../ozone/src/lexicon/types/app/bsky/video/getUploadLimits.ts | 1 + packages/ozone/src/lexicon/types/app/bsky/video/uploadVideo.ts | 1 + .../ozone/src/lexicon/types/chat/bsky/actor/deleteAccount.ts | 1 + .../ozone/src/lexicon/types/chat/bsky/actor/exportAccountData.ts | 1 + .../src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts | 1 + packages/ozone/src/lexicon/types/chat/bsky/convo/getConvo.ts | 1 + .../src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts | 1 + packages/ozone/src/lexicon/types/chat/bsky/convo/getLog.ts | 1 + packages/ozone/src/lexicon/types/chat/bsky/convo/getMessages.ts | 1 + packages/ozone/src/lexicon/types/chat/bsky/convo/leaveConvo.ts | 1 + packages/ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts | 1 + packages/ozone/src/lexicon/types/chat/bsky/convo/muteConvo.ts | 1 + packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessage.ts | 1 + .../ozone/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts | 1 + packages/ozone/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts | 1 + packages/ozone/src/lexicon/types/chat/bsky/convo/updateRead.ts | 1 + .../src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts | 1 + .../src/lexicon/types/chat/bsky/moderation/getMessageContext.ts | 1 + .../src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts | 1 + .../ozone/src/lexicon/types/com/atproto/admin/deleteAccount.ts | 1 + .../src/lexicon/types/com/atproto/admin/disableAccountInvites.ts | 1 + .../src/lexicon/types/com/atproto/admin/disableInviteCodes.ts | 1 + .../src/lexicon/types/com/atproto/admin/enableAccountInvites.ts | 1 + .../ozone/src/lexicon/types/com/atproto/admin/getAccountInfo.ts | 1 + .../ozone/src/lexicon/types/com/atproto/admin/getAccountInfos.ts | 1 + .../ozone/src/lexicon/types/com/atproto/admin/getInviteCodes.ts | 1 + .../src/lexicon/types/com/atproto/admin/getSubjectStatus.ts | 1 + .../ozone/src/lexicon/types/com/atproto/admin/searchAccounts.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/admin/sendEmail.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateAccountEmail.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateAccountHandle.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateAccountPassword.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts | 1 + .../types/com/atproto/identity/getRecommendedDidCredentials.ts | 1 + .../types/com/atproto/identity/requestPlcOperationSignature.ts | 1 + .../src/lexicon/types/com/atproto/identity/resolveHandle.ts | 1 + .../src/lexicon/types/com/atproto/identity/signPlcOperation.ts | 1 + .../src/lexicon/types/com/atproto/identity/submitPlcOperation.ts | 1 + .../ozone/src/lexicon/types/com/atproto/identity/updateHandle.ts | 1 + .../ozone/src/lexicon/types/com/atproto/label/queryLabels.ts | 1 + .../src/lexicon/types/com/atproto/moderation/createReport.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/repo/applyWrites.ts | 1 + .../ozone/src/lexicon/types/com/atproto/repo/createRecord.ts | 1 + .../ozone/src/lexicon/types/com/atproto/repo/deleteRecord.ts | 1 + .../ozone/src/lexicon/types/com/atproto/repo/describeRepo.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/repo/getRecord.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/repo/importRepo.ts | 1 + .../ozone/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/repo/listRecords.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/repo/putRecord.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/repo/uploadBlob.ts | 1 + .../src/lexicon/types/com/atproto/server/activateAccount.ts | 1 + .../src/lexicon/types/com/atproto/server/checkAccountStatus.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/confirmEmail.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/createAccount.ts | 1 + .../src/lexicon/types/com/atproto/server/createAppPassword.ts | 1 + .../src/lexicon/types/com/atproto/server/createInviteCode.ts | 1 + .../src/lexicon/types/com/atproto/server/createInviteCodes.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/createSession.ts | 1 + .../src/lexicon/types/com/atproto/server/deactivateAccount.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/deleteAccount.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/deleteSession.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/describeServer.ts | 1 + .../lexicon/types/com/atproto/server/getAccountInviteCodes.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/getServiceAuth.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/getSession.ts | 1 + .../src/lexicon/types/com/atproto/server/listAppPasswords.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/refreshSession.ts | 1 + .../src/lexicon/types/com/atproto/server/requestAccountDelete.ts | 1 + .../lexicon/types/com/atproto/server/requestEmailConfirmation.ts | 1 + .../src/lexicon/types/com/atproto/server/requestEmailUpdate.ts | 1 + .../src/lexicon/types/com/atproto/server/requestPasswordReset.ts | 1 + .../src/lexicon/types/com/atproto/server/reserveSigningKey.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/resetPassword.ts | 1 + .../src/lexicon/types/com/atproto/server/revokeAppPassword.ts | 1 + .../ozone/src/lexicon/types/com/atproto/server/updateEmail.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/sync/getBlob.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/sync/getBlocks.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/sync/getCheckout.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/sync/getHead.ts | 1 + .../ozone/src/lexicon/types/com/atproto/sync/getLatestCommit.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/sync/getRecord.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/sync/getRepo.ts | 1 + .../ozone/src/lexicon/types/com/atproto/sync/getRepoStatus.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/sync/listBlobs.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/sync/listRepos.ts | 1 + .../ozone/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts | 1 + .../ozone/src/lexicon/types/com/atproto/sync/requestCrawl.ts | 1 + .../src/lexicon/types/com/atproto/temp/addReservedHandle.ts | 1 + .../ozone/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts | 1 + packages/ozone/src/lexicon/types/com/atproto/temp/fetchLabels.ts | 1 + .../lexicon/types/com/atproto/temp/requestPhoneVerification.ts | 1 + .../lexicon/types/tools/ozone/communication/createTemplate.ts | 1 + .../lexicon/types/tools/ozone/communication/deleteTemplate.ts | 1 + .../src/lexicon/types/tools/ozone/communication/listTemplates.ts | 1 + .../lexicon/types/tools/ozone/communication/updateTemplate.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/moderation/getEvent.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/moderation/getRecord.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/moderation/getRecords.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/moderation/getRepo.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/moderation/getRepos.ts | 1 + .../src/lexicon/types/tools/ozone/moderation/queryEvents.ts | 1 + .../src/lexicon/types/tools/ozone/moderation/queryStatuses.ts | 1 + .../src/lexicon/types/tools/ozone/moderation/searchRepos.ts | 1 + packages/ozone/src/lexicon/types/tools/ozone/server/getConfig.ts | 1 + packages/ozone/src/lexicon/types/tools/ozone/set/addValues.ts | 1 + packages/ozone/src/lexicon/types/tools/ozone/set/deleteSet.ts | 1 + packages/ozone/src/lexicon/types/tools/ozone/set/deleteValues.ts | 1 + packages/ozone/src/lexicon/types/tools/ozone/set/getValues.ts | 1 + packages/ozone/src/lexicon/types/tools/ozone/set/querySets.ts | 1 + packages/ozone/src/lexicon/types/tools/ozone/set/upsertSet.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/setting/listOptions.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/setting/removeOptions.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/setting/upsertOption.ts | 1 + .../src/lexicon/types/tools/ozone/signature/findCorrelation.ts | 1 + .../lexicon/types/tools/ozone/signature/findRelatedAccounts.ts | 1 + .../src/lexicon/types/tools/ozone/signature/searchAccounts.ts | 1 + packages/ozone/src/lexicon/types/tools/ozone/team/addMember.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/team/deleteMember.ts | 1 + packages/ozone/src/lexicon/types/tools/ozone/team/listMembers.ts | 1 + .../ozone/src/lexicon/types/tools/ozone/team/updateMember.ts | 1 + packages/pds/src/lexicon/types/app/bsky/actor/getPreferences.ts | 1 + packages/pds/src/lexicon/types/app/bsky/actor/getProfile.ts | 1 + packages/pds/src/lexicon/types/app/bsky/actor/getProfiles.ts | 1 + packages/pds/src/lexicon/types/app/bsky/actor/getSuggestions.ts | 1 + packages/pds/src/lexicon/types/app/bsky/actor/putPreferences.ts | 1 + packages/pds/src/lexicon/types/app/bsky/actor/searchActors.ts | 1 + .../src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts | 1 + .../pds/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getActorFeeds.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getActorLikes.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getFeed.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts | 1 + .../pds/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getLikes.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getListFeed.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getPostThread.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getPosts.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getQuotes.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getRepostedBy.ts | 1 + .../pds/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/getTimeline.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/searchPosts.ts | 1 + packages/pds/src/lexicon/types/app/bsky/feed/sendInteractions.ts | 1 + .../pds/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/getBlocks.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/getFollowers.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/getFollows.ts | 1 + .../pds/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/getList.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/getListBlocks.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/getListMutes.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/getLists.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/getMutes.ts | 1 + .../pds/src/lexicon/types/app/bsky/graph/getRelationships.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/getStarterPack.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/getStarterPacks.ts | 1 + .../lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/muteActor.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/muteActorList.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/muteThread.ts | 1 + .../pds/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/unmuteActor.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/unmuteActorList.ts | 1 + packages/pds/src/lexicon/types/app/bsky/graph/unmuteThread.ts | 1 + packages/pds/src/lexicon/types/app/bsky/labeler/getServices.ts | 1 + .../src/lexicon/types/app/bsky/notification/getUnreadCount.ts | 1 + .../src/lexicon/types/app/bsky/notification/listNotifications.ts | 1 + .../src/lexicon/types/app/bsky/notification/putPreferences.ts | 1 + .../pds/src/lexicon/types/app/bsky/notification/registerPush.ts | 1 + .../pds/src/lexicon/types/app/bsky/notification/updateSeen.ts | 1 + packages/pds/src/lexicon/types/app/bsky/unspecced/getConfig.ts | 1 + .../lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts | 1 + .../lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts | 1 + .../src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts | 1 + .../types/app/bsky/unspecced/searchStarterPacksSkeleton.ts | 1 + packages/pds/src/lexicon/types/app/bsky/video/getJobStatus.ts | 1 + packages/pds/src/lexicon/types/app/bsky/video/getUploadLimits.ts | 1 + packages/pds/src/lexicon/types/app/bsky/video/uploadVideo.ts | 1 + packages/pds/src/lexicon/types/chat/bsky/actor/deleteAccount.ts | 1 + .../pds/src/lexicon/types/chat/bsky/actor/exportAccountData.ts | 1 + .../src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts | 1 + packages/pds/src/lexicon/types/chat/bsky/convo/getConvo.ts | 1 + .../pds/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts | 1 + packages/pds/src/lexicon/types/chat/bsky/convo/getLog.ts | 1 + packages/pds/src/lexicon/types/chat/bsky/convo/getMessages.ts | 1 + packages/pds/src/lexicon/types/chat/bsky/convo/leaveConvo.ts | 1 + packages/pds/src/lexicon/types/chat/bsky/convo/listConvos.ts | 1 + packages/pds/src/lexicon/types/chat/bsky/convo/muteConvo.ts | 1 + packages/pds/src/lexicon/types/chat/bsky/convo/sendMessage.ts | 1 + .../pds/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts | 1 + packages/pds/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts | 1 + packages/pds/src/lexicon/types/chat/bsky/convo/updateRead.ts | 1 + .../src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts | 1 + .../src/lexicon/types/chat/bsky/moderation/getMessageContext.ts | 1 + .../src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts | 1 + .../pds/src/lexicon/types/com/atproto/admin/deleteAccount.ts | 1 + .../src/lexicon/types/com/atproto/admin/disableAccountInvites.ts | 1 + .../src/lexicon/types/com/atproto/admin/disableInviteCodes.ts | 1 + .../src/lexicon/types/com/atproto/admin/enableAccountInvites.ts | 1 + .../pds/src/lexicon/types/com/atproto/admin/getAccountInfo.ts | 1 + .../pds/src/lexicon/types/com/atproto/admin/getAccountInfos.ts | 1 + .../pds/src/lexicon/types/com/atproto/admin/getInviteCodes.ts | 1 + .../pds/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts | 1 + .../pds/src/lexicon/types/com/atproto/admin/searchAccounts.ts | 1 + packages/pds/src/lexicon/types/com/atproto/admin/sendEmail.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateAccountEmail.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateAccountHandle.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateAccountPassword.ts | 1 + .../src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts | 1 + .../types/com/atproto/identity/getRecommendedDidCredentials.ts | 1 + .../types/com/atproto/identity/requestPlcOperationSignature.ts | 1 + .../pds/src/lexicon/types/com/atproto/identity/resolveHandle.ts | 1 + .../src/lexicon/types/com/atproto/identity/signPlcOperation.ts | 1 + .../src/lexicon/types/com/atproto/identity/submitPlcOperation.ts | 1 + .../pds/src/lexicon/types/com/atproto/identity/updateHandle.ts | 1 + packages/pds/src/lexicon/types/com/atproto/label/queryLabels.ts | 1 + .../pds/src/lexicon/types/com/atproto/moderation/createReport.ts | 1 + packages/pds/src/lexicon/types/com/atproto/repo/applyWrites.ts | 1 + packages/pds/src/lexicon/types/com/atproto/repo/createRecord.ts | 1 + packages/pds/src/lexicon/types/com/atproto/repo/deleteRecord.ts | 1 + packages/pds/src/lexicon/types/com/atproto/repo/describeRepo.ts | 1 + packages/pds/src/lexicon/types/com/atproto/repo/getRecord.ts | 1 + packages/pds/src/lexicon/types/com/atproto/repo/importRepo.ts | 1 + .../pds/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts | 1 + packages/pds/src/lexicon/types/com/atproto/repo/listRecords.ts | 1 + packages/pds/src/lexicon/types/com/atproto/repo/putRecord.ts | 1 + packages/pds/src/lexicon/types/com/atproto/repo/uploadBlob.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/activateAccount.ts | 1 + .../src/lexicon/types/com/atproto/server/checkAccountStatus.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/confirmEmail.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/createAccount.ts | 1 + .../src/lexicon/types/com/atproto/server/createAppPassword.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/createInviteCode.ts | 1 + .../src/lexicon/types/com/atproto/server/createInviteCodes.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/createSession.ts | 1 + .../src/lexicon/types/com/atproto/server/deactivateAccount.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/deleteAccount.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/deleteSession.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/describeServer.ts | 1 + .../lexicon/types/com/atproto/server/getAccountInviteCodes.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/getServiceAuth.ts | 1 + packages/pds/src/lexicon/types/com/atproto/server/getSession.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/listAppPasswords.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/refreshSession.ts | 1 + .../src/lexicon/types/com/atproto/server/requestAccountDelete.ts | 1 + .../lexicon/types/com/atproto/server/requestEmailConfirmation.ts | 1 + .../src/lexicon/types/com/atproto/server/requestEmailUpdate.ts | 1 + .../src/lexicon/types/com/atproto/server/requestPasswordReset.ts | 1 + .../src/lexicon/types/com/atproto/server/reserveSigningKey.ts | 1 + .../pds/src/lexicon/types/com/atproto/server/resetPassword.ts | 1 + .../src/lexicon/types/com/atproto/server/revokeAppPassword.ts | 1 + packages/pds/src/lexicon/types/com/atproto/server/updateEmail.ts | 1 + packages/pds/src/lexicon/types/com/atproto/sync/getBlob.ts | 1 + packages/pds/src/lexicon/types/com/atproto/sync/getBlocks.ts | 1 + packages/pds/src/lexicon/types/com/atproto/sync/getCheckout.ts | 1 + packages/pds/src/lexicon/types/com/atproto/sync/getHead.ts | 1 + .../pds/src/lexicon/types/com/atproto/sync/getLatestCommit.ts | 1 + packages/pds/src/lexicon/types/com/atproto/sync/getRecord.ts | 1 + packages/pds/src/lexicon/types/com/atproto/sync/getRepo.ts | 1 + packages/pds/src/lexicon/types/com/atproto/sync/getRepoStatus.ts | 1 + packages/pds/src/lexicon/types/com/atproto/sync/listBlobs.ts | 1 + packages/pds/src/lexicon/types/com/atproto/sync/listRepos.ts | 1 + .../pds/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts | 1 + packages/pds/src/lexicon/types/com/atproto/sync/requestCrawl.ts | 1 + .../pds/src/lexicon/types/com/atproto/temp/addReservedHandle.ts | 1 + .../pds/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts | 1 + packages/pds/src/lexicon/types/com/atproto/temp/fetchLabels.ts | 1 + .../lexicon/types/com/atproto/temp/requestPhoneVerification.ts | 1 + .../lexicon/types/tools/ozone/communication/createTemplate.ts | 1 + .../lexicon/types/tools/ozone/communication/deleteTemplate.ts | 1 + .../src/lexicon/types/tools/ozone/communication/listTemplates.ts | 1 + .../lexicon/types/tools/ozone/communication/updateTemplate.ts | 1 + .../pds/src/lexicon/types/tools/ozone/moderation/emitEvent.ts | 1 + .../pds/src/lexicon/types/tools/ozone/moderation/getEvent.ts | 1 + .../pds/src/lexicon/types/tools/ozone/moderation/getRecord.ts | 1 + .../pds/src/lexicon/types/tools/ozone/moderation/getRecords.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/moderation/getRepo.ts | 1 + .../pds/src/lexicon/types/tools/ozone/moderation/getRepos.ts | 1 + .../pds/src/lexicon/types/tools/ozone/moderation/queryEvents.ts | 1 + .../src/lexicon/types/tools/ozone/moderation/queryStatuses.ts | 1 + .../pds/src/lexicon/types/tools/ozone/moderation/searchRepos.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/server/getConfig.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/set/addValues.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/set/deleteSet.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/set/deleteValues.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/set/getValues.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/set/querySets.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/set/upsertSet.ts | 1 + .../pds/src/lexicon/types/tools/ozone/setting/listOptions.ts | 1 + .../pds/src/lexicon/types/tools/ozone/setting/removeOptions.ts | 1 + .../pds/src/lexicon/types/tools/ozone/setting/upsertOption.ts | 1 + .../src/lexicon/types/tools/ozone/signature/findCorrelation.ts | 1 + .../lexicon/types/tools/ozone/signature/findRelatedAccounts.ts | 1 + .../src/lexicon/types/tools/ozone/signature/searchAccounts.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/team/addMember.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/team/deleteMember.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/team/listMembers.ts | 1 + packages/pds/src/lexicon/types/tools/ozone/team/updateMember.ts | 1 + 519 files changed, 519 insertions(+) diff --git a/packages/bsky/src/lexicon/types/app/bsky/actor/getPreferences.ts b/packages/bsky/src/lexicon/types/app/bsky/actor/getPreferences.ts index 305e80484be..f839ece0a4d 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/actor/getPreferences.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/actor/getPreferences.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/actor/getProfile.ts b/packages/bsky/src/lexicon/types/app/bsky/actor/getProfile.ts index 5a7b1f25bfc..f9163fcf168 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/actor/getProfile.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/actor/getProfile.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/actor/getProfiles.ts b/packages/bsky/src/lexicon/types/app/bsky/actor/getProfiles.ts index 16438505654..5c2ffb1f2cc 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/actor/getProfiles.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/actor/getProfiles.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/actor/getSuggestions.ts b/packages/bsky/src/lexicon/types/app/bsky/actor/getSuggestions.ts index 6ecd43f1283..c7e254261a1 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/actor/getSuggestions.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/actor/getSuggestions.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/actor/putPreferences.ts b/packages/bsky/src/lexicon/types/app/bsky/actor/putPreferences.ts index 670e752fea3..59aea81c2da 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/actor/putPreferences.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/actor/putPreferences.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/actor/searchActors.ts b/packages/bsky/src/lexicon/types/app/bsky/actor/searchActors.ts index dcda0c41854..ebd81ececc5 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/actor/searchActors.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/actor/searchActors.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts b/packages/bsky/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts index 0198b23d790..b7e9831b21d 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts index 5bf8699a3ca..0a7d253ce8f 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts @@ -39,6 +39,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getActorFeeds.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getActorFeeds.ts index 0b8afff4ec8..6af507c6e03 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getActorFeeds.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getActorFeeds.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getActorLikes.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getActorLikes.ts index da315ae33c7..daf5060c8d2 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getActorLikes.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getActorLikes.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts index 70c2c439d2a..2a14f45d6da 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts @@ -53,6 +53,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getFeed.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getFeed.ts index e03913a6fb3..5014c102155 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getFeed.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getFeed.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts index 7ab89057a8c..2b99efa318d 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts index 21963a91e2e..2dd6f136f17 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts index ca1cef20f08..cd69f1a10b8 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getLikes.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getLikes.ts index 275d99bba3d..b035c2ea609 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getLikes.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getLikes.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getListFeed.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getListFeed.ts index 84e12deaa92..0720feb5b6b 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getListFeed.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getListFeed.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getPostThread.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getPostThread.ts index 768977193ef..918faddfc1d 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getPostThread.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getPostThread.ts @@ -51,6 +51,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getPosts.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getPosts.ts index 85000c74787..b7048083583 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getPosts.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getPosts.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getQuotes.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getQuotes.ts index 38d04ad88c1..23c7dd831f0 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getQuotes.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getQuotes.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getRepostedBy.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getRepostedBy.ts index 40e008815d9..efae1c0b14f 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getRepostedBy.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getRepostedBy.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts index d1ec590f33d..c660e995f9f 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/getTimeline.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/getTimeline.ts index 5202c9eb6e3..f9cd3d702c5 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/getTimeline.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/getTimeline.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/searchPosts.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/searchPosts.ts index 14efa5276f8..68e0b729b53 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/searchPosts.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/searchPosts.ts @@ -66,6 +66,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/feed/sendInteractions.ts b/packages/bsky/src/lexicon/types/app/bsky/feed/sendInteractions.ts index c22fc1cb2fb..b0280ad8028 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/feed/sendInteractions.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/feed/sendInteractions.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts index 10250d0f3b4..352c542990f 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getBlocks.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getBlocks.ts index 1fc9cd8ce37..1fdd49c6831 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getBlocks.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getBlocks.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getFollowers.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getFollowers.ts index f5645eaef29..1f348e97d20 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getFollowers.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getFollowers.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getFollows.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getFollows.ts index b9bd249da45..a9664991c88 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getFollows.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getFollows.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts index f5645eaef29..1f348e97d20 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getList.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getList.ts index 864a81b3833..a8408edd622 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getList.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getList.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getListBlocks.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getListBlocks.ts index 7399a14fadc..728892f4379 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getListBlocks.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getListBlocks.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getListMutes.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getListMutes.ts index 7399a14fadc..728892f4379 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getListMutes.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getListMutes.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getLists.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getLists.ts index dc0c4f18bea..0ed8abc586e 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getLists.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getLists.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getMutes.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getMutes.ts index f450393522d..45c7966644e 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getMutes.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getMutes.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getRelationships.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getRelationships.ts index bd6b6e765ed..677c8815d43 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getRelationships.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getRelationships.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getStarterPack.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getStarterPack.ts index 93fe21f0b13..bbf8a537da0 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getStarterPack.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getStarterPack.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getStarterPacks.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getStarterPacks.ts index 4b9757b941e..1ea054400b3 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getStarterPacks.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getStarterPacks.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts index be577ecab54..8736dc71b45 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/muteActor.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/muteActor.ts index baa9844046a..7d0057721d6 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/muteActor.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/muteActor.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/muteActorList.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/muteActorList.ts index 6a68f680a1c..1d80ac0d3db 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/muteActorList.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/muteActorList.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/muteThread.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/muteThread.ts index 928c56b6fc3..659ced88112 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/muteThread.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/muteThread.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts index dea496aa50f..70bc184bb43 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteActor.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteActor.ts index baa9844046a..7d0057721d6 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteActor.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteActor.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteActorList.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteActorList.ts index 6a68f680a1c..1d80ac0d3db 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteActorList.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteActorList.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteThread.ts b/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteThread.ts index 928c56b6fc3..659ced88112 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteThread.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/graph/unmuteThread.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/labeler/getServices.ts b/packages/bsky/src/lexicon/types/app/bsky/labeler/getServices.ts index faeb30b4798..e1d318b6177 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/labeler/getServices.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/labeler/getServices.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/notification/getUnreadCount.ts b/packages/bsky/src/lexicon/types/app/bsky/notification/getUnreadCount.ts index 3931e24d3f0..d2cff779da4 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/notification/getUnreadCount.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/notification/getUnreadCount.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/notification/listNotifications.ts b/packages/bsky/src/lexicon/types/app/bsky/notification/listNotifications.ts index 88fe90a0518..69d05288acb 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/notification/listNotifications.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/notification/listNotifications.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/notification/putPreferences.ts b/packages/bsky/src/lexicon/types/app/bsky/notification/putPreferences.ts index 2c3a9d6fdbb..2271b658cb2 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/notification/putPreferences.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/notification/putPreferences.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/notification/registerPush.ts b/packages/bsky/src/lexicon/types/app/bsky/notification/registerPush.ts index cce8f95839d..c4ca7104764 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/notification/registerPush.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/notification/registerPush.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/notification/updateSeen.ts b/packages/bsky/src/lexicon/types/app/bsky/notification/updateSeen.ts index 93db017a152..690e68dbeeb 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/notification/updateSeen.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/notification/updateSeen.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/unspecced/getConfig.ts b/packages/bsky/src/lexicon/types/app/bsky/unspecced/getConfig.ts index da202ab0d54..e922e1f10df 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/unspecced/getConfig.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/unspecced/getConfig.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts b/packages/bsky/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts index 02f19f3cc6a..56ecba098be 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts b/packages/bsky/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts index a89065ffcde..4b68e768e20 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts @@ -50,6 +50,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts b/packages/bsky/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts index a03f442140d..7febcd64994 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts b/packages/bsky/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts index 51b78652a74..469ecd63b79 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts b/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts index 94295f45349..0cb2c5e0b9c 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts b/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts index cd293454902..00318176398 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts @@ -68,6 +68,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts b/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts index e980d884fec..d488cb43fed 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts @@ -50,6 +50,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/video/getJobStatus.ts b/packages/bsky/src/lexicon/types/app/bsky/video/getJobStatus.ts index 3e075ba2195..846dbf5e0b5 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/video/getJobStatus.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/video/getJobStatus.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/video/getUploadLimits.ts b/packages/bsky/src/lexicon/types/app/bsky/video/getUploadLimits.ts index f0f23003b0b..d1930430c9d 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/video/getUploadLimits.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/video/getUploadLimits.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/app/bsky/video/uploadVideo.ts b/packages/bsky/src/lexicon/types/app/bsky/video/uploadVideo.ts index c23ff677a4b..99291559507 100644 --- a/packages/bsky/src/lexicon/types/app/bsky/video/uploadVideo.ts +++ b/packages/bsky/src/lexicon/types/app/bsky/video/uploadVideo.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/actor/deleteAccount.ts b/packages/bsky/src/lexicon/types/chat/bsky/actor/deleteAccount.ts index 08714990fcb..1ae84f6c7cc 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/actor/deleteAccount.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/actor/deleteAccount.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/actor/exportAccountData.ts b/packages/bsky/src/lexicon/types/chat/bsky/actor/exportAccountData.ts index f6f38ab2fb3..363a8c68b97 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/actor/exportAccountData.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/actor/exportAccountData.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts index c05bc99b36a..2a70c63df4f 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/getConvo.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/getConvo.ts index 1448c75b306..e6d1a651280 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/getConvo.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/getConvo.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts index 108dfd6ad5b..0062e2230e6 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/getLog.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/getLog.ts index 89f6778c4d3..2d1354f09bd 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/getLog.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/getLog.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/getMessages.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/getMessages.ts index a615ba37674..689dd4539dd 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/getMessages.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/getMessages.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/leaveConvo.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/leaveConvo.ts index 8b76a7b0c75..99af5702e29 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/leaveConvo.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/leaveConvo.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/listConvos.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/listConvos.ts index 4d6f35bf39c..5e9a3dad264 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/listConvos.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/listConvos.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/muteConvo.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/muteConvo.ts index ddb57623913..4d39442ff86 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/muteConvo.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/muteConvo.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/sendMessage.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/sendMessage.ts index ab2d8b03f89..94acb7f018d 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/sendMessage.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/sendMessage.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts index b3c2c2bc252..29556e52e7a 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts index ddb57623913..4d39442ff86 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/convo/updateRead.ts b/packages/bsky/src/lexicon/types/chat/bsky/convo/updateRead.ts index b879cde82b0..6aa23309332 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/convo/updateRead.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/convo/updateRead.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts b/packages/bsky/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts index 077a0076bab..f99260a1b85 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts b/packages/bsky/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts index 0a1f5b1b691..39489eb7c12 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts b/packages/bsky/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts index d9c95f69643..17324495c1c 100644 --- a/packages/bsky/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts +++ b/packages/bsky/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/deleteAccount.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/deleteAccount.ts index 003c1b5ebcd..1b0223ea303 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/deleteAccount.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/deleteAccount.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts index 68c6503d95e..d8f8ecad320 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts index 2bf8de35583..75a9fb472a5 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts index 3f2836e7142..b072ad7ec56 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/getAccountInfo.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/getAccountInfo.ts index c7b840a153d..acea7749774 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/getAccountInfo.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/getAccountInfo.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/getAccountInfos.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/getAccountInfos.ts index 99ef44a99f5..7d9fa3fdcbf 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/getAccountInfos.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/getAccountInfos.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/getInviteCodes.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/getInviteCodes.ts index d68b97d775a..9619d5e4b5b 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/getInviteCodes.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/getInviteCodes.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts index c13496638c8..3aff3e6f322 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/searchAccounts.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/searchAccounts.ts index 80d0eecd926..96b26867f41 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/searchAccounts.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/searchAccounts.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/sendEmail.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/sendEmail.ts index 836fba39f79..5c8bebe791d 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/sendEmail.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/sendEmail.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts index ebabffbccdb..e3ea26f7298 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts index d6dc4a2dc25..87d861faef5 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts index 948568f0d3d..b6aef601e13 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts b/packages/bsky/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts index c03d9667cae..ae48689cb4f 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts @@ -56,6 +56,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts b/packages/bsky/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts index 5fa374de737..33bd5f6fa05 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts b/packages/bsky/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/identity/resolveHandle.ts b/packages/bsky/src/lexicon/types/com/atproto/identity/resolveHandle.ts index 05019df6166..e319fbfbadb 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/identity/resolveHandle.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/identity/resolveHandle.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/identity/signPlcOperation.ts b/packages/bsky/src/lexicon/types/com/atproto/identity/signPlcOperation.ts index 3c908c049f2..9b0cb540b8e 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/identity/signPlcOperation.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/identity/signPlcOperation.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts b/packages/bsky/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts index 5290b55d023..9b85d7dcb2f 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/identity/updateHandle.ts b/packages/bsky/src/lexicon/types/com/atproto/identity/updateHandle.ts index f451d1f57c7..8a271d80264 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/identity/updateHandle.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/identity/updateHandle.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/label/queryLabels.ts b/packages/bsky/src/lexicon/types/com/atproto/label/queryLabels.ts index 0c9d55a6961..9873f6914b4 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/label/queryLabels.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/label/queryLabels.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/moderation/createReport.ts b/packages/bsky/src/lexicon/types/com/atproto/moderation/createReport.ts index aa3f810a91c..dc7985c7685 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/moderation/createReport.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/moderation/createReport.ts @@ -60,6 +60,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/repo/applyWrites.ts b/packages/bsky/src/lexicon/types/com/atproto/repo/applyWrites.ts index 4e3c8dcef3d..a58fcc0a56b 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/repo/applyWrites.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/repo/applyWrites.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/repo/createRecord.ts b/packages/bsky/src/lexicon/types/com/atproto/repo/createRecord.ts index 5cac0848bf1..0982f49bf3d 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/repo/createRecord.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/repo/createRecord.ts @@ -59,6 +59,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/repo/deleteRecord.ts b/packages/bsky/src/lexicon/types/com/atproto/repo/deleteRecord.ts index e594cd00adf..c86ab7ba47a 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/repo/deleteRecord.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/repo/deleteRecord.ts @@ -54,6 +54,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/repo/describeRepo.ts b/packages/bsky/src/lexicon/types/com/atproto/repo/describeRepo.ts index 749bedcfeb7..5b187f3758c 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/repo/describeRepo.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/repo/describeRepo.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/repo/getRecord.ts b/packages/bsky/src/lexicon/types/com/atproto/repo/getRecord.ts index 9d03da19530..96ce9ee551f 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/repo/getRecord.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/repo/getRecord.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/repo/importRepo.ts b/packages/bsky/src/lexicon/types/com/atproto/repo/importRepo.ts index 59288c7a027..685918f455f 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/repo/importRepo.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/repo/importRepo.ts @@ -30,6 +30,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts b/packages/bsky/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts index 40f4d385e47..f1be00d8e87 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/repo/listRecords.ts b/packages/bsky/src/lexicon/types/com/atproto/repo/listRecords.ts index f46f6eb0f7f..e328cfbb204 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/repo/listRecords.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/repo/listRecords.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/repo/putRecord.ts b/packages/bsky/src/lexicon/types/com/atproto/repo/putRecord.ts index 5cde768d7c2..269244ede91 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/repo/putRecord.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/repo/putRecord.ts @@ -61,6 +61,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/repo/uploadBlob.ts b/packages/bsky/src/lexicon/types/com/atproto/repo/uploadBlob.ts index 4a712346a0b..7595e7295e6 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/repo/uploadBlob.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/repo/uploadBlob.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/activateAccount.ts b/packages/bsky/src/lexicon/types/com/atproto/server/activateAccount.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/activateAccount.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/activateAccount.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/checkAccountStatus.ts b/packages/bsky/src/lexicon/types/com/atproto/server/checkAccountStatus.ts index f17182a8dce..2ad98689303 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/checkAccountStatus.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/checkAccountStatus.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/confirmEmail.ts b/packages/bsky/src/lexicon/types/com/atproto/server/confirmEmail.ts index b667a04b996..d6338b80fc5 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/confirmEmail.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/confirmEmail.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/createAccount.ts b/packages/bsky/src/lexicon/types/com/atproto/server/createAccount.ts index 6e9b2f9f3c2..a85c83edffc 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/createAccount.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/createAccount.ts @@ -71,6 +71,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/createAppPassword.ts b/packages/bsky/src/lexicon/types/com/atproto/server/createAppPassword.ts index 00657a2058f..65ad1d4b4cb 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/createAppPassword.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/createAppPassword.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/createInviteCode.ts b/packages/bsky/src/lexicon/types/com/atproto/server/createInviteCode.ts index 9cfeacc7e28..82daf7eea6f 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/createInviteCode.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/createInviteCode.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/createInviteCodes.ts b/packages/bsky/src/lexicon/types/com/atproto/server/createInviteCodes.ts index eb6cd2bb1b1..fa2c1f73c2a 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/createInviteCodes.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/createInviteCodes.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/createSession.ts b/packages/bsky/src/lexicon/types/com/atproto/server/createSession.ts index 4ed0ae70fb1..47ffaaaa0bd 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/createSession.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/createSession.ts @@ -59,6 +59,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/deactivateAccount.ts b/packages/bsky/src/lexicon/types/com/atproto/server/deactivateAccount.ts index b3793d6b2e0..56b86424e61 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/deactivateAccount.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/deactivateAccount.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/deleteAccount.ts b/packages/bsky/src/lexicon/types/com/atproto/server/deleteAccount.ts index 4fcec360a11..93b7b78a0e5 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/deleteAccount.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/deleteAccount.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/deleteSession.ts b/packages/bsky/src/lexicon/types/com/atproto/server/deleteSession.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/deleteSession.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/deleteSession.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/describeServer.ts b/packages/bsky/src/lexicon/types/com/atproto/server/describeServer.ts index e21868158b3..6964a59ffdf 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/describeServer.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/describeServer.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts b/packages/bsky/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts index 82c3ffa8c31..1cdf1299961 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/getServiceAuth.ts b/packages/bsky/src/lexicon/types/com/atproto/server/getServiceAuth.ts index 14f249fde44..1e9d1398be7 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/getServiceAuth.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/getServiceAuth.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/getSession.ts b/packages/bsky/src/lexicon/types/com/atproto/server/getSession.ts index be34cb92afd..cafa6bc7452 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/getSession.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/getSession.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/listAppPasswords.ts b/packages/bsky/src/lexicon/types/com/atproto/server/listAppPasswords.ts index 397e7043e67..99219e67f7f 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/listAppPasswords.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/listAppPasswords.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/refreshSession.ts b/packages/bsky/src/lexicon/types/com/atproto/server/refreshSession.ts index 1d6272a0d71..59e8f9d5a32 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/refreshSession.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/refreshSession.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/requestAccountDelete.ts b/packages/bsky/src/lexicon/types/com/atproto/server/requestAccountDelete.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/requestAccountDelete.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/requestAccountDelete.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts b/packages/bsky/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts b/packages/bsky/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts index 24dce3e12af..87b9a094ccc 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/requestPasswordReset.ts b/packages/bsky/src/lexicon/types/com/atproto/server/requestPasswordReset.ts index d0f3f2ad769..ae541342aff 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/requestPasswordReset.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/requestPasswordReset.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/reserveSigningKey.ts b/packages/bsky/src/lexicon/types/com/atproto/server/reserveSigningKey.ts index 0ec1e80c77c..72850ce061b 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/reserveSigningKey.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/reserveSigningKey.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/resetPassword.ts b/packages/bsky/src/lexicon/types/com/atproto/server/resetPassword.ts index 38f63382cf0..4b5b8ea1ecc 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/resetPassword.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/resetPassword.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/revokeAppPassword.ts b/packages/bsky/src/lexicon/types/com/atproto/server/revokeAppPassword.ts index 769ad6aa521..80131f8c9e3 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/revokeAppPassword.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/revokeAppPassword.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/server/updateEmail.ts b/packages/bsky/src/lexicon/types/com/atproto/server/updateEmail.ts index 34fc7421979..a80982da4f8 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/server/updateEmail.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/server/updateEmail.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/getBlob.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/getBlob.ts index b1581d6e473..659c71c1a8d 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/getBlob.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/getBlob.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/getBlocks.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/getBlocks.ts index 925b4a7d50b..7fef8b7f64d 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/getBlocks.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/getBlocks.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/getCheckout.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/getCheckout.ts index 51856b9088d..3d519f6916d 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/getCheckout.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/getCheckout.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/getHead.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/getHead.ts index adedd4cf211..d9bb230cef5 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/getHead.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/getHead.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/getLatestCommit.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/getLatestCommit.ts index f0e9a757d04..6041841e311 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/getLatestCommit.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/getLatestCommit.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/getRecord.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/getRecord.ts index 83d88655228..afbd779faf1 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/getRecord.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/getRecord.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/getRepo.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/getRepo.ts index 883ff37def1..62a86f56a38 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/getRepo.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/getRepo.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/getRepoStatus.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/getRepoStatus.ts index 00abbeaa84b..743bcc45767 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/getRepoStatus.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/getRepoStatus.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/listBlobs.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/listBlobs.ts index c6ea955ee0c..abb1719f41b 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/listBlobs.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/listBlobs.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/listRepos.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/listRepos.ts index 5628b0b5147..228d6a004b5 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/listRepos.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/listRepos.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts index 8a0af577c7c..b2d2e6b2e48 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/sync/requestCrawl.ts b/packages/bsky/src/lexicon/types/com/atproto/sync/requestCrawl.ts index 31180aabf58..fd54e157b7b 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/sync/requestCrawl.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/sync/requestCrawl.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/temp/addReservedHandle.ts b/packages/bsky/src/lexicon/types/com/atproto/temp/addReservedHandle.ts index b884cb08998..69be85f72df 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/temp/addReservedHandle.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/temp/addReservedHandle.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts b/packages/bsky/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts index 9486bce2b2b..9c7ef1ae6ab 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts @@ -39,6 +39,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/temp/fetchLabels.ts b/packages/bsky/src/lexicon/types/com/atproto/temp/fetchLabels.ts index 0fbdeed1196..0392ba06ea2 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/temp/fetchLabels.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/temp/fetchLabels.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/bsky/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts b/packages/bsky/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts index c977500fc33..8ebee2ad46d 100644 --- a/packages/bsky/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts +++ b/packages/bsky/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/actor/getPreferences.ts b/packages/ozone/src/lexicon/types/app/bsky/actor/getPreferences.ts index 305e80484be..f839ece0a4d 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/actor/getPreferences.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/actor/getPreferences.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/actor/getProfile.ts b/packages/ozone/src/lexicon/types/app/bsky/actor/getProfile.ts index 5a7b1f25bfc..f9163fcf168 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/actor/getProfile.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/actor/getProfile.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/actor/getProfiles.ts b/packages/ozone/src/lexicon/types/app/bsky/actor/getProfiles.ts index 16438505654..5c2ffb1f2cc 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/actor/getProfiles.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/actor/getProfiles.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/actor/getSuggestions.ts b/packages/ozone/src/lexicon/types/app/bsky/actor/getSuggestions.ts index 6ecd43f1283..c7e254261a1 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/actor/getSuggestions.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/actor/getSuggestions.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/actor/putPreferences.ts b/packages/ozone/src/lexicon/types/app/bsky/actor/putPreferences.ts index 670e752fea3..59aea81c2da 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/actor/putPreferences.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/actor/putPreferences.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/actor/searchActors.ts b/packages/ozone/src/lexicon/types/app/bsky/actor/searchActors.ts index dcda0c41854..ebd81ececc5 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/actor/searchActors.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/actor/searchActors.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts b/packages/ozone/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts index 0198b23d790..b7e9831b21d 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts index 5bf8699a3ca..0a7d253ce8f 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts @@ -39,6 +39,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getActorFeeds.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getActorFeeds.ts index 0b8afff4ec8..6af507c6e03 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getActorFeeds.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getActorFeeds.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getActorLikes.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getActorLikes.ts index da315ae33c7..daf5060c8d2 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getActorLikes.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getActorLikes.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts index 70c2c439d2a..2a14f45d6da 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts @@ -53,6 +53,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getFeed.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getFeed.ts index e03913a6fb3..5014c102155 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getFeed.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getFeed.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts index 7ab89057a8c..2b99efa318d 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts index 21963a91e2e..2dd6f136f17 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts index ca1cef20f08..cd69f1a10b8 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getLikes.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getLikes.ts index 275d99bba3d..b035c2ea609 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getLikes.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getLikes.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getListFeed.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getListFeed.ts index 84e12deaa92..0720feb5b6b 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getListFeed.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getListFeed.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getPostThread.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getPostThread.ts index 768977193ef..918faddfc1d 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getPostThread.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getPostThread.ts @@ -51,6 +51,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getPosts.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getPosts.ts index 85000c74787..b7048083583 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getPosts.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getPosts.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getQuotes.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getQuotes.ts index 38d04ad88c1..23c7dd831f0 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getQuotes.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getQuotes.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getRepostedBy.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getRepostedBy.ts index 40e008815d9..efae1c0b14f 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getRepostedBy.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getRepostedBy.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts index d1ec590f33d..c660e995f9f 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/getTimeline.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/getTimeline.ts index 5202c9eb6e3..f9cd3d702c5 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/getTimeline.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/getTimeline.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/searchPosts.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/searchPosts.ts index 14efa5276f8..68e0b729b53 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/searchPosts.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/searchPosts.ts @@ -66,6 +66,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/feed/sendInteractions.ts b/packages/ozone/src/lexicon/types/app/bsky/feed/sendInteractions.ts index c22fc1cb2fb..b0280ad8028 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/feed/sendInteractions.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/feed/sendInteractions.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts index 10250d0f3b4..352c542990f 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getBlocks.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getBlocks.ts index 1fc9cd8ce37..1fdd49c6831 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getBlocks.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getBlocks.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getFollowers.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getFollowers.ts index f5645eaef29..1f348e97d20 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getFollowers.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getFollowers.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getFollows.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getFollows.ts index b9bd249da45..a9664991c88 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getFollows.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getFollows.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts index f5645eaef29..1f348e97d20 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getList.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getList.ts index 864a81b3833..a8408edd622 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getList.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getList.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getListBlocks.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getListBlocks.ts index 7399a14fadc..728892f4379 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getListBlocks.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getListBlocks.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getListMutes.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getListMutes.ts index 7399a14fadc..728892f4379 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getListMutes.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getListMutes.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getLists.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getLists.ts index dc0c4f18bea..0ed8abc586e 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getLists.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getLists.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getMutes.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getMutes.ts index f450393522d..45c7966644e 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getMutes.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getMutes.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getRelationships.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getRelationships.ts index bd6b6e765ed..677c8815d43 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getRelationships.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getRelationships.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPack.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPack.ts index 93fe21f0b13..bbf8a537da0 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPack.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPack.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPacks.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPacks.ts index 4b9757b941e..1ea054400b3 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPacks.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPacks.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts index be577ecab54..8736dc71b45 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/muteActor.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/muteActor.ts index baa9844046a..7d0057721d6 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/muteActor.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/muteActor.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/muteActorList.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/muteActorList.ts index 6a68f680a1c..1d80ac0d3db 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/muteActorList.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/muteActorList.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/muteThread.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/muteThread.ts index 928c56b6fc3..659ced88112 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/muteThread.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/muteThread.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts index dea496aa50f..70bc184bb43 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActor.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActor.ts index baa9844046a..7d0057721d6 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActor.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActor.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActorList.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActorList.ts index 6a68f680a1c..1d80ac0d3db 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActorList.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActorList.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteThread.ts b/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteThread.ts index 928c56b6fc3..659ced88112 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteThread.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/graph/unmuteThread.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/labeler/getServices.ts b/packages/ozone/src/lexicon/types/app/bsky/labeler/getServices.ts index faeb30b4798..e1d318b6177 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/labeler/getServices.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/labeler/getServices.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/notification/getUnreadCount.ts b/packages/ozone/src/lexicon/types/app/bsky/notification/getUnreadCount.ts index 3931e24d3f0..d2cff779da4 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/notification/getUnreadCount.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/notification/getUnreadCount.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/notification/listNotifications.ts b/packages/ozone/src/lexicon/types/app/bsky/notification/listNotifications.ts index 88fe90a0518..69d05288acb 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/notification/listNotifications.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/notification/listNotifications.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/notification/putPreferences.ts b/packages/ozone/src/lexicon/types/app/bsky/notification/putPreferences.ts index 2c3a9d6fdbb..2271b658cb2 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/notification/putPreferences.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/notification/putPreferences.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/notification/registerPush.ts b/packages/ozone/src/lexicon/types/app/bsky/notification/registerPush.ts index cce8f95839d..c4ca7104764 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/notification/registerPush.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/notification/registerPush.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/notification/updateSeen.ts b/packages/ozone/src/lexicon/types/app/bsky/notification/updateSeen.ts index 93db017a152..690e68dbeeb 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/notification/updateSeen.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/notification/updateSeen.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/unspecced/getConfig.ts b/packages/ozone/src/lexicon/types/app/bsky/unspecced/getConfig.ts index da202ab0d54..e922e1f10df 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/unspecced/getConfig.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/unspecced/getConfig.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts b/packages/ozone/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts index 02f19f3cc6a..56ecba098be 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts b/packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts index a89065ffcde..4b68e768e20 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts @@ -50,6 +50,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts b/packages/ozone/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts index a03f442140d..7febcd64994 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts b/packages/ozone/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts index 51b78652a74..469ecd63b79 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts b/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts index 94295f45349..0cb2c5e0b9c 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts b/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts index cd293454902..00318176398 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts @@ -68,6 +68,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts b/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts index e980d884fec..d488cb43fed 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts @@ -50,6 +50,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/video/getJobStatus.ts b/packages/ozone/src/lexicon/types/app/bsky/video/getJobStatus.ts index 3e075ba2195..846dbf5e0b5 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/video/getJobStatus.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/video/getJobStatus.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/video/getUploadLimits.ts b/packages/ozone/src/lexicon/types/app/bsky/video/getUploadLimits.ts index f0f23003b0b..d1930430c9d 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/video/getUploadLimits.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/video/getUploadLimits.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/app/bsky/video/uploadVideo.ts b/packages/ozone/src/lexicon/types/app/bsky/video/uploadVideo.ts index c23ff677a4b..99291559507 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/video/uploadVideo.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/video/uploadVideo.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/actor/deleteAccount.ts b/packages/ozone/src/lexicon/types/chat/bsky/actor/deleteAccount.ts index 08714990fcb..1ae84f6c7cc 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/actor/deleteAccount.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/actor/deleteAccount.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/actor/exportAccountData.ts b/packages/ozone/src/lexicon/types/chat/bsky/actor/exportAccountData.ts index f6f38ab2fb3..363a8c68b97 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/actor/exportAccountData.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/actor/exportAccountData.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts index c05bc99b36a..2a70c63df4f 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/getConvo.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/getConvo.ts index 1448c75b306..e6d1a651280 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/getConvo.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/getConvo.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts index 108dfd6ad5b..0062e2230e6 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/getLog.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/getLog.ts index 89f6778c4d3..2d1354f09bd 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/getLog.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/getLog.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/getMessages.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/getMessages.ts index a615ba37674..689dd4539dd 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/getMessages.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/getMessages.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/leaveConvo.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/leaveConvo.ts index 8b76a7b0c75..99af5702e29 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/leaveConvo.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/leaveConvo.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts index 4d6f35bf39c..5e9a3dad264 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/muteConvo.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/muteConvo.ts index ddb57623913..4d39442ff86 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/muteConvo.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/muteConvo.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessage.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessage.ts index ab2d8b03f89..94acb7f018d 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessage.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessage.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts index b3c2c2bc252..29556e52e7a 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts index ddb57623913..4d39442ff86 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/updateRead.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/updateRead.ts index b879cde82b0..6aa23309332 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/updateRead.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/updateRead.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts b/packages/ozone/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts index 077a0076bab..f99260a1b85 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts b/packages/ozone/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts index 0a1f5b1b691..39489eb7c12 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts b/packages/ozone/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts index d9c95f69643..17324495c1c 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/deleteAccount.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/deleteAccount.ts index 003c1b5ebcd..1b0223ea303 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/deleteAccount.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/deleteAccount.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts index 68c6503d95e..d8f8ecad320 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts index 2bf8de35583..75a9fb472a5 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts index 3f2836e7142..b072ad7ec56 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/getAccountInfo.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/getAccountInfo.ts index c7b840a153d..acea7749774 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/getAccountInfo.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/getAccountInfo.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/getAccountInfos.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/getAccountInfos.ts index 99ef44a99f5..7d9fa3fdcbf 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/getAccountInfos.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/getAccountInfos.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/getInviteCodes.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/getInviteCodes.ts index d68b97d775a..9619d5e4b5b 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/getInviteCodes.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/getInviteCodes.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts index c13496638c8..3aff3e6f322 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/searchAccounts.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/searchAccounts.ts index 80d0eecd926..96b26867f41 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/searchAccounts.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/searchAccounts.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/sendEmail.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/sendEmail.ts index 836fba39f79..5c8bebe791d 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/sendEmail.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/sendEmail.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts index ebabffbccdb..e3ea26f7298 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts index d6dc4a2dc25..87d861faef5 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts index 948568f0d3d..b6aef601e13 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts b/packages/ozone/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts index c03d9667cae..ae48689cb4f 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts @@ -56,6 +56,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts b/packages/ozone/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts index 5fa374de737..33bd5f6fa05 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts b/packages/ozone/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/identity/resolveHandle.ts b/packages/ozone/src/lexicon/types/com/atproto/identity/resolveHandle.ts index 05019df6166..e319fbfbadb 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/identity/resolveHandle.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/identity/resolveHandle.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/identity/signPlcOperation.ts b/packages/ozone/src/lexicon/types/com/atproto/identity/signPlcOperation.ts index 3c908c049f2..9b0cb540b8e 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/identity/signPlcOperation.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/identity/signPlcOperation.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts b/packages/ozone/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts index 5290b55d023..9b85d7dcb2f 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/identity/updateHandle.ts b/packages/ozone/src/lexicon/types/com/atproto/identity/updateHandle.ts index f451d1f57c7..8a271d80264 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/identity/updateHandle.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/identity/updateHandle.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/label/queryLabels.ts b/packages/ozone/src/lexicon/types/com/atproto/label/queryLabels.ts index 0c9d55a6961..9873f6914b4 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/label/queryLabels.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/label/queryLabels.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/moderation/createReport.ts b/packages/ozone/src/lexicon/types/com/atproto/moderation/createReport.ts index aa3f810a91c..dc7985c7685 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/moderation/createReport.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/moderation/createReport.ts @@ -60,6 +60,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/repo/applyWrites.ts b/packages/ozone/src/lexicon/types/com/atproto/repo/applyWrites.ts index 4e3c8dcef3d..a58fcc0a56b 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/repo/applyWrites.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/repo/applyWrites.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/repo/createRecord.ts b/packages/ozone/src/lexicon/types/com/atproto/repo/createRecord.ts index 5cac0848bf1..0982f49bf3d 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/repo/createRecord.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/repo/createRecord.ts @@ -59,6 +59,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/repo/deleteRecord.ts b/packages/ozone/src/lexicon/types/com/atproto/repo/deleteRecord.ts index e594cd00adf..c86ab7ba47a 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/repo/deleteRecord.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/repo/deleteRecord.ts @@ -54,6 +54,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/repo/describeRepo.ts b/packages/ozone/src/lexicon/types/com/atproto/repo/describeRepo.ts index 749bedcfeb7..5b187f3758c 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/repo/describeRepo.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/repo/describeRepo.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/repo/getRecord.ts b/packages/ozone/src/lexicon/types/com/atproto/repo/getRecord.ts index 9d03da19530..96ce9ee551f 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/repo/getRecord.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/repo/getRecord.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/repo/importRepo.ts b/packages/ozone/src/lexicon/types/com/atproto/repo/importRepo.ts index 59288c7a027..685918f455f 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/repo/importRepo.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/repo/importRepo.ts @@ -30,6 +30,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts b/packages/ozone/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts index 40f4d385e47..f1be00d8e87 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/repo/listRecords.ts b/packages/ozone/src/lexicon/types/com/atproto/repo/listRecords.ts index f46f6eb0f7f..e328cfbb204 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/repo/listRecords.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/repo/listRecords.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/repo/putRecord.ts b/packages/ozone/src/lexicon/types/com/atproto/repo/putRecord.ts index 5cde768d7c2..269244ede91 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/repo/putRecord.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/repo/putRecord.ts @@ -61,6 +61,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/repo/uploadBlob.ts b/packages/ozone/src/lexicon/types/com/atproto/repo/uploadBlob.ts index 4a712346a0b..7595e7295e6 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/repo/uploadBlob.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/repo/uploadBlob.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/activateAccount.ts b/packages/ozone/src/lexicon/types/com/atproto/server/activateAccount.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/activateAccount.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/activateAccount.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/checkAccountStatus.ts b/packages/ozone/src/lexicon/types/com/atproto/server/checkAccountStatus.ts index f17182a8dce..2ad98689303 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/checkAccountStatus.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/checkAccountStatus.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/confirmEmail.ts b/packages/ozone/src/lexicon/types/com/atproto/server/confirmEmail.ts index b667a04b996..d6338b80fc5 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/confirmEmail.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/confirmEmail.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/createAccount.ts b/packages/ozone/src/lexicon/types/com/atproto/server/createAccount.ts index 6e9b2f9f3c2..a85c83edffc 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/createAccount.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/createAccount.ts @@ -71,6 +71,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/createAppPassword.ts b/packages/ozone/src/lexicon/types/com/atproto/server/createAppPassword.ts index 00657a2058f..65ad1d4b4cb 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/createAppPassword.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/createAppPassword.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/createInviteCode.ts b/packages/ozone/src/lexicon/types/com/atproto/server/createInviteCode.ts index 9cfeacc7e28..82daf7eea6f 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/createInviteCode.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/createInviteCode.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/createInviteCodes.ts b/packages/ozone/src/lexicon/types/com/atproto/server/createInviteCodes.ts index eb6cd2bb1b1..fa2c1f73c2a 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/createInviteCodes.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/createInviteCodes.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/createSession.ts b/packages/ozone/src/lexicon/types/com/atproto/server/createSession.ts index 4ed0ae70fb1..47ffaaaa0bd 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/createSession.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/createSession.ts @@ -59,6 +59,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/deactivateAccount.ts b/packages/ozone/src/lexicon/types/com/atproto/server/deactivateAccount.ts index b3793d6b2e0..56b86424e61 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/deactivateAccount.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/deactivateAccount.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/deleteAccount.ts b/packages/ozone/src/lexicon/types/com/atproto/server/deleteAccount.ts index 4fcec360a11..93b7b78a0e5 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/deleteAccount.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/deleteAccount.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/deleteSession.ts b/packages/ozone/src/lexicon/types/com/atproto/server/deleteSession.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/deleteSession.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/deleteSession.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/describeServer.ts b/packages/ozone/src/lexicon/types/com/atproto/server/describeServer.ts index e21868158b3..6964a59ffdf 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/describeServer.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/describeServer.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts b/packages/ozone/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts index 82c3ffa8c31..1cdf1299961 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/getServiceAuth.ts b/packages/ozone/src/lexicon/types/com/atproto/server/getServiceAuth.ts index 14f249fde44..1e9d1398be7 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/getServiceAuth.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/getServiceAuth.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/getSession.ts b/packages/ozone/src/lexicon/types/com/atproto/server/getSession.ts index be34cb92afd..cafa6bc7452 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/getSession.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/getSession.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/listAppPasswords.ts b/packages/ozone/src/lexicon/types/com/atproto/server/listAppPasswords.ts index 397e7043e67..99219e67f7f 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/listAppPasswords.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/listAppPasswords.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/refreshSession.ts b/packages/ozone/src/lexicon/types/com/atproto/server/refreshSession.ts index 1d6272a0d71..59e8f9d5a32 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/refreshSession.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/refreshSession.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/requestAccountDelete.ts b/packages/ozone/src/lexicon/types/com/atproto/server/requestAccountDelete.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/requestAccountDelete.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/requestAccountDelete.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts b/packages/ozone/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts b/packages/ozone/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts index 24dce3e12af..87b9a094ccc 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/requestPasswordReset.ts b/packages/ozone/src/lexicon/types/com/atproto/server/requestPasswordReset.ts index d0f3f2ad769..ae541342aff 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/requestPasswordReset.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/requestPasswordReset.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/reserveSigningKey.ts b/packages/ozone/src/lexicon/types/com/atproto/server/reserveSigningKey.ts index 0ec1e80c77c..72850ce061b 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/reserveSigningKey.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/reserveSigningKey.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/resetPassword.ts b/packages/ozone/src/lexicon/types/com/atproto/server/resetPassword.ts index 38f63382cf0..4b5b8ea1ecc 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/resetPassword.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/resetPassword.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/revokeAppPassword.ts b/packages/ozone/src/lexicon/types/com/atproto/server/revokeAppPassword.ts index 769ad6aa521..80131f8c9e3 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/revokeAppPassword.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/revokeAppPassword.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/server/updateEmail.ts b/packages/ozone/src/lexicon/types/com/atproto/server/updateEmail.ts index 34fc7421979..a80982da4f8 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/server/updateEmail.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/server/updateEmail.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/getBlob.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/getBlob.ts index b1581d6e473..659c71c1a8d 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/getBlob.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/getBlob.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/getBlocks.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/getBlocks.ts index 925b4a7d50b..7fef8b7f64d 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/getBlocks.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/getBlocks.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/getCheckout.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/getCheckout.ts index 51856b9088d..3d519f6916d 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/getCheckout.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/getCheckout.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/getHead.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/getHead.ts index adedd4cf211..d9bb230cef5 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/getHead.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/getHead.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/getLatestCommit.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/getLatestCommit.ts index f0e9a757d04..6041841e311 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/getLatestCommit.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/getLatestCommit.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/getRecord.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/getRecord.ts index 83d88655228..afbd779faf1 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/getRecord.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/getRecord.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/getRepo.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/getRepo.ts index 883ff37def1..62a86f56a38 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/getRepo.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/getRepo.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/getRepoStatus.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/getRepoStatus.ts index 00abbeaa84b..743bcc45767 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/getRepoStatus.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/getRepoStatus.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/listBlobs.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/listBlobs.ts index c6ea955ee0c..abb1719f41b 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/listBlobs.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/listBlobs.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/listRepos.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/listRepos.ts index 5628b0b5147..228d6a004b5 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/listRepos.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/listRepos.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts index 8a0af577c7c..b2d2e6b2e48 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/sync/requestCrawl.ts b/packages/ozone/src/lexicon/types/com/atproto/sync/requestCrawl.ts index 31180aabf58..fd54e157b7b 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/sync/requestCrawl.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/sync/requestCrawl.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/temp/addReservedHandle.ts b/packages/ozone/src/lexicon/types/com/atproto/temp/addReservedHandle.ts index b884cb08998..69be85f72df 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/temp/addReservedHandle.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/temp/addReservedHandle.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts b/packages/ozone/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts index 9486bce2b2b..9c7ef1ae6ab 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts @@ -39,6 +39,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/temp/fetchLabels.ts b/packages/ozone/src/lexicon/types/com/atproto/temp/fetchLabels.ts index 0fbdeed1196..0392ba06ea2 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/temp/fetchLabels.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/temp/fetchLabels.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts b/packages/ozone/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts index c977500fc33..8ebee2ad46d 100644 --- a/packages/ozone/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts +++ b/packages/ozone/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/communication/createTemplate.ts b/packages/ozone/src/lexicon/types/tools/ozone/communication/createTemplate.ts index 6d29f93bdba..49d46cc6299 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/communication/createTemplate.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/communication/createTemplate.ts @@ -51,6 +51,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts b/packages/ozone/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts index c5ae5cd469f..d773d84d8e6 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/communication/listTemplates.ts b/packages/ozone/src/lexicon/types/tools/ozone/communication/listTemplates.ts index 4573ac7bbb9..aa2738f5ca2 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/communication/listTemplates.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/communication/listTemplates.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/communication/updateTemplate.ts b/packages/ozone/src/lexicon/types/tools/ozone/communication/updateTemplate.ts index f8c5817b4d9..9f9c532e136 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/communication/updateTemplate.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/communication/updateTemplate.ts @@ -54,6 +54,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts index 1399cf589ee..d409858ec7b 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts @@ -68,6 +68,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/getEvent.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/getEvent.ts index b583510a791..c7e1b5943f3 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/getEvent.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/getEvent.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRecord.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRecord.ts index a3832cd161c..67eca72d05f 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRecord.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRecord.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRecords.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRecords.ts index 2559727bd65..46e11ef48e3 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRecords.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRecords.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRepo.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRepo.ts index 853d6460e85..ff675e577dc 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRepo.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRepo.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRepos.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRepos.ts index 71da4d1bac9..f113ef4395c 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRepos.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/getRepos.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryEvents.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryEvents.ts index 51003984889..c29249690d4 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryEvents.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryEvents.ts @@ -72,6 +72,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts index 28270425304..73a953e5176 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts @@ -103,6 +103,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/searchRepos.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/searchRepos.ts index 7696df54d0f..2aca4ee5a97 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/searchRepos.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/searchRepos.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/server/getConfig.ts b/packages/ozone/src/lexicon/types/tools/ozone/server/getConfig.ts index b05ce4246d9..78ac5c2fb85 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/server/getConfig.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/server/getConfig.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/set/addValues.ts b/packages/ozone/src/lexicon/types/tools/ozone/set/addValues.ts index 1a48da4e682..41ae9830f30 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/set/addValues.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/set/addValues.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/set/deleteSet.ts b/packages/ozone/src/lexicon/types/tools/ozone/set/deleteSet.ts index 8b1584c3a1a..4612b73d044 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/set/deleteSet.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/set/deleteSet.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/set/deleteValues.ts b/packages/ozone/src/lexicon/types/tools/ozone/set/deleteValues.ts index d1090863925..f0a18ff3b26 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/set/deleteValues.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/set/deleteValues.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/set/getValues.ts b/packages/ozone/src/lexicon/types/tools/ozone/set/getValues.ts index abae3c0b33a..d6f3af9e43e 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/set/getValues.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/set/getValues.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/set/querySets.ts b/packages/ozone/src/lexicon/types/tools/ozone/set/querySets.ts index 1eea93a7c4c..a1fe230268e 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/set/querySets.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/set/querySets.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/set/upsertSet.ts b/packages/ozone/src/lexicon/types/tools/ozone/set/upsertSet.ts index f51e375e425..843ad1029db 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/set/upsertSet.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/set/upsertSet.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/setting/listOptions.ts b/packages/ozone/src/lexicon/types/tools/ozone/setting/listOptions.ts index 54ad9608df3..464cdf7c50b 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/setting/listOptions.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/setting/listOptions.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/setting/removeOptions.ts b/packages/ozone/src/lexicon/types/tools/ozone/setting/removeOptions.ts index 1d653b314da..3aa323a7fa6 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/setting/removeOptions.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/setting/removeOptions.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/setting/upsertOption.ts b/packages/ozone/src/lexicon/types/tools/ozone/setting/upsertOption.ts index b2e66d073d9..ee541ffe817 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/setting/upsertOption.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/setting/upsertOption.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/signature/findCorrelation.ts b/packages/ozone/src/lexicon/types/tools/ozone/signature/findCorrelation.ts index c3eced05a5e..f12bdf6a04f 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/signature/findCorrelation.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/signature/findCorrelation.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts b/packages/ozone/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts index 821d5c6c080..b4773ac2e20 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/signature/searchAccounts.ts b/packages/ozone/src/lexicon/types/tools/ozone/signature/searchAccounts.ts index 4e37745aa4a..ad1f3f3c3b8 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/signature/searchAccounts.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/signature/searchAccounts.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/team/addMember.ts b/packages/ozone/src/lexicon/types/tools/ozone/team/addMember.ts index 85e40f2a461..ad33479adcf 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/team/addMember.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/team/addMember.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/team/deleteMember.ts b/packages/ozone/src/lexicon/types/tools/ozone/team/deleteMember.ts index 3adf03313dc..14f0265fd6f 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/team/deleteMember.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/team/deleteMember.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/team/listMembers.ts b/packages/ozone/src/lexicon/types/tools/ozone/team/listMembers.ts index 1995cc68cc1..813e86e9b16 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/team/listMembers.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/team/listMembers.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/ozone/src/lexicon/types/tools/ozone/team/updateMember.ts b/packages/ozone/src/lexicon/types/tools/ozone/team/updateMember.ts index 57b0a318583..4c343144a1b 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/team/updateMember.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/team/updateMember.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/actor/getPreferences.ts b/packages/pds/src/lexicon/types/app/bsky/actor/getPreferences.ts index 305e80484be..f839ece0a4d 100644 --- a/packages/pds/src/lexicon/types/app/bsky/actor/getPreferences.ts +++ b/packages/pds/src/lexicon/types/app/bsky/actor/getPreferences.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/actor/getProfile.ts b/packages/pds/src/lexicon/types/app/bsky/actor/getProfile.ts index 5a7b1f25bfc..f9163fcf168 100644 --- a/packages/pds/src/lexicon/types/app/bsky/actor/getProfile.ts +++ b/packages/pds/src/lexicon/types/app/bsky/actor/getProfile.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/actor/getProfiles.ts b/packages/pds/src/lexicon/types/app/bsky/actor/getProfiles.ts index 16438505654..5c2ffb1f2cc 100644 --- a/packages/pds/src/lexicon/types/app/bsky/actor/getProfiles.ts +++ b/packages/pds/src/lexicon/types/app/bsky/actor/getProfiles.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/actor/getSuggestions.ts b/packages/pds/src/lexicon/types/app/bsky/actor/getSuggestions.ts index 6ecd43f1283..c7e254261a1 100644 --- a/packages/pds/src/lexicon/types/app/bsky/actor/getSuggestions.ts +++ b/packages/pds/src/lexicon/types/app/bsky/actor/getSuggestions.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/actor/putPreferences.ts b/packages/pds/src/lexicon/types/app/bsky/actor/putPreferences.ts index 670e752fea3..59aea81c2da 100644 --- a/packages/pds/src/lexicon/types/app/bsky/actor/putPreferences.ts +++ b/packages/pds/src/lexicon/types/app/bsky/actor/putPreferences.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/actor/searchActors.ts b/packages/pds/src/lexicon/types/app/bsky/actor/searchActors.ts index dcda0c41854..ebd81ececc5 100644 --- a/packages/pds/src/lexicon/types/app/bsky/actor/searchActors.ts +++ b/packages/pds/src/lexicon/types/app/bsky/actor/searchActors.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts b/packages/pds/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts index 0198b23d790..b7e9831b21d 100644 --- a/packages/pds/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts +++ b/packages/pds/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts b/packages/pds/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts index 5bf8699a3ca..0a7d253ce8f 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts @@ -39,6 +39,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getActorFeeds.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getActorFeeds.ts index 0b8afff4ec8..6af507c6e03 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getActorFeeds.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getActorFeeds.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getActorLikes.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getActorLikes.ts index da315ae33c7..daf5060c8d2 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getActorLikes.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getActorLikes.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts index 70c2c439d2a..2a14f45d6da 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts @@ -53,6 +53,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getFeed.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getFeed.ts index e03913a6fb3..5014c102155 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getFeed.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getFeed.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts index 7ab89057a8c..2b99efa318d 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts index 21963a91e2e..2dd6f136f17 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts index ca1cef20f08..cd69f1a10b8 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getLikes.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getLikes.ts index 275d99bba3d..b035c2ea609 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getLikes.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getLikes.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getListFeed.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getListFeed.ts index 84e12deaa92..0720feb5b6b 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getListFeed.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getListFeed.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getPostThread.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getPostThread.ts index 768977193ef..918faddfc1d 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getPostThread.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getPostThread.ts @@ -51,6 +51,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getPosts.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getPosts.ts index 85000c74787..b7048083583 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getPosts.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getPosts.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getQuotes.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getQuotes.ts index 38d04ad88c1..23c7dd831f0 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getQuotes.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getQuotes.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getRepostedBy.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getRepostedBy.ts index 40e008815d9..efae1c0b14f 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getRepostedBy.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getRepostedBy.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts index d1ec590f33d..c660e995f9f 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/getTimeline.ts b/packages/pds/src/lexicon/types/app/bsky/feed/getTimeline.ts index 5202c9eb6e3..f9cd3d702c5 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/getTimeline.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/getTimeline.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/searchPosts.ts b/packages/pds/src/lexicon/types/app/bsky/feed/searchPosts.ts index 14efa5276f8..68e0b729b53 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/searchPosts.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/searchPosts.ts @@ -66,6 +66,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/feed/sendInteractions.ts b/packages/pds/src/lexicon/types/app/bsky/feed/sendInteractions.ts index c22fc1cb2fb..b0280ad8028 100644 --- a/packages/pds/src/lexicon/types/app/bsky/feed/sendInteractions.ts +++ b/packages/pds/src/lexicon/types/app/bsky/feed/sendInteractions.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts index 10250d0f3b4..352c542990f 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getBlocks.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getBlocks.ts index 1fc9cd8ce37..1fdd49c6831 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getBlocks.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getBlocks.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getFollowers.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getFollowers.ts index f5645eaef29..1f348e97d20 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getFollowers.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getFollowers.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getFollows.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getFollows.ts index b9bd249da45..a9664991c88 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getFollows.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getFollows.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts index f5645eaef29..1f348e97d20 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getList.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getList.ts index 864a81b3833..a8408edd622 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getList.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getList.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getListBlocks.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getListBlocks.ts index 7399a14fadc..728892f4379 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getListBlocks.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getListBlocks.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getListMutes.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getListMutes.ts index 7399a14fadc..728892f4379 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getListMutes.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getListMutes.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getLists.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getLists.ts index dc0c4f18bea..0ed8abc586e 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getLists.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getLists.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getMutes.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getMutes.ts index f450393522d..45c7966644e 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getMutes.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getMutes.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getRelationships.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getRelationships.ts index bd6b6e765ed..677c8815d43 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getRelationships.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getRelationships.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getStarterPack.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getStarterPack.ts index 93fe21f0b13..bbf8a537da0 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getStarterPack.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getStarterPack.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getStarterPacks.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getStarterPacks.ts index 4b9757b941e..1ea054400b3 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getStarterPacks.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getStarterPacks.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts b/packages/pds/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts index be577ecab54..8736dc71b45 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/muteActor.ts b/packages/pds/src/lexicon/types/app/bsky/graph/muteActor.ts index baa9844046a..7d0057721d6 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/muteActor.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/muteActor.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/muteActorList.ts b/packages/pds/src/lexicon/types/app/bsky/graph/muteActorList.ts index 6a68f680a1c..1d80ac0d3db 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/muteActorList.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/muteActorList.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/muteThread.ts b/packages/pds/src/lexicon/types/app/bsky/graph/muteThread.ts index 928c56b6fc3..659ced88112 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/muteThread.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/muteThread.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts b/packages/pds/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts index dea496aa50f..70bc184bb43 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/unmuteActor.ts b/packages/pds/src/lexicon/types/app/bsky/graph/unmuteActor.ts index baa9844046a..7d0057721d6 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/unmuteActor.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/unmuteActor.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/unmuteActorList.ts b/packages/pds/src/lexicon/types/app/bsky/graph/unmuteActorList.ts index 6a68f680a1c..1d80ac0d3db 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/unmuteActorList.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/unmuteActorList.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/graph/unmuteThread.ts b/packages/pds/src/lexicon/types/app/bsky/graph/unmuteThread.ts index 928c56b6fc3..659ced88112 100644 --- a/packages/pds/src/lexicon/types/app/bsky/graph/unmuteThread.ts +++ b/packages/pds/src/lexicon/types/app/bsky/graph/unmuteThread.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/labeler/getServices.ts b/packages/pds/src/lexicon/types/app/bsky/labeler/getServices.ts index faeb30b4798..e1d318b6177 100644 --- a/packages/pds/src/lexicon/types/app/bsky/labeler/getServices.ts +++ b/packages/pds/src/lexicon/types/app/bsky/labeler/getServices.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/notification/getUnreadCount.ts b/packages/pds/src/lexicon/types/app/bsky/notification/getUnreadCount.ts index 3931e24d3f0..d2cff779da4 100644 --- a/packages/pds/src/lexicon/types/app/bsky/notification/getUnreadCount.ts +++ b/packages/pds/src/lexicon/types/app/bsky/notification/getUnreadCount.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/notification/listNotifications.ts b/packages/pds/src/lexicon/types/app/bsky/notification/listNotifications.ts index 88fe90a0518..69d05288acb 100644 --- a/packages/pds/src/lexicon/types/app/bsky/notification/listNotifications.ts +++ b/packages/pds/src/lexicon/types/app/bsky/notification/listNotifications.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/notification/putPreferences.ts b/packages/pds/src/lexicon/types/app/bsky/notification/putPreferences.ts index 2c3a9d6fdbb..2271b658cb2 100644 --- a/packages/pds/src/lexicon/types/app/bsky/notification/putPreferences.ts +++ b/packages/pds/src/lexicon/types/app/bsky/notification/putPreferences.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/notification/registerPush.ts b/packages/pds/src/lexicon/types/app/bsky/notification/registerPush.ts index cce8f95839d..c4ca7104764 100644 --- a/packages/pds/src/lexicon/types/app/bsky/notification/registerPush.ts +++ b/packages/pds/src/lexicon/types/app/bsky/notification/registerPush.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/notification/updateSeen.ts b/packages/pds/src/lexicon/types/app/bsky/notification/updateSeen.ts index 93db017a152..690e68dbeeb 100644 --- a/packages/pds/src/lexicon/types/app/bsky/notification/updateSeen.ts +++ b/packages/pds/src/lexicon/types/app/bsky/notification/updateSeen.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/unspecced/getConfig.ts b/packages/pds/src/lexicon/types/app/bsky/unspecced/getConfig.ts index da202ab0d54..e922e1f10df 100644 --- a/packages/pds/src/lexicon/types/app/bsky/unspecced/getConfig.ts +++ b/packages/pds/src/lexicon/types/app/bsky/unspecced/getConfig.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts b/packages/pds/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts index 02f19f3cc6a..56ecba098be 100644 --- a/packages/pds/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts +++ b/packages/pds/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts b/packages/pds/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts index a89065ffcde..4b68e768e20 100644 --- a/packages/pds/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts +++ b/packages/pds/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts @@ -50,6 +50,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts b/packages/pds/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts index a03f442140d..7febcd64994 100644 --- a/packages/pds/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts +++ b/packages/pds/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts b/packages/pds/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts index 51b78652a74..469ecd63b79 100644 --- a/packages/pds/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts +++ b/packages/pds/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts b/packages/pds/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts index 94295f45349..0cb2c5e0b9c 100644 --- a/packages/pds/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts +++ b/packages/pds/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts b/packages/pds/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts index cd293454902..00318176398 100644 --- a/packages/pds/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts +++ b/packages/pds/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts @@ -68,6 +68,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts b/packages/pds/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts index e980d884fec..d488cb43fed 100644 --- a/packages/pds/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts +++ b/packages/pds/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts @@ -50,6 +50,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/video/getJobStatus.ts b/packages/pds/src/lexicon/types/app/bsky/video/getJobStatus.ts index 3e075ba2195..846dbf5e0b5 100644 --- a/packages/pds/src/lexicon/types/app/bsky/video/getJobStatus.ts +++ b/packages/pds/src/lexicon/types/app/bsky/video/getJobStatus.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/video/getUploadLimits.ts b/packages/pds/src/lexicon/types/app/bsky/video/getUploadLimits.ts index f0f23003b0b..d1930430c9d 100644 --- a/packages/pds/src/lexicon/types/app/bsky/video/getUploadLimits.ts +++ b/packages/pds/src/lexicon/types/app/bsky/video/getUploadLimits.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/app/bsky/video/uploadVideo.ts b/packages/pds/src/lexicon/types/app/bsky/video/uploadVideo.ts index c23ff677a4b..99291559507 100644 --- a/packages/pds/src/lexicon/types/app/bsky/video/uploadVideo.ts +++ b/packages/pds/src/lexicon/types/app/bsky/video/uploadVideo.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/actor/deleteAccount.ts b/packages/pds/src/lexicon/types/chat/bsky/actor/deleteAccount.ts index 08714990fcb..1ae84f6c7cc 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/actor/deleteAccount.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/actor/deleteAccount.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/actor/exportAccountData.ts b/packages/pds/src/lexicon/types/chat/bsky/actor/exportAccountData.ts index f6f38ab2fb3..363a8c68b97 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/actor/exportAccountData.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/actor/exportAccountData.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts index c05bc99b36a..2a70c63df4f 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/getConvo.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/getConvo.ts index 1448c75b306..e6d1a651280 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/getConvo.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/getConvo.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts index 108dfd6ad5b..0062e2230e6 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/getLog.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/getLog.ts index 89f6778c4d3..2d1354f09bd 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/getLog.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/getLog.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/getMessages.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/getMessages.ts index a615ba37674..689dd4539dd 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/getMessages.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/getMessages.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/leaveConvo.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/leaveConvo.ts index 8b76a7b0c75..99af5702e29 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/leaveConvo.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/leaveConvo.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/listConvos.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/listConvos.ts index 4d6f35bf39c..5e9a3dad264 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/listConvos.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/listConvos.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/muteConvo.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/muteConvo.ts index ddb57623913..4d39442ff86 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/muteConvo.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/muteConvo.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/sendMessage.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/sendMessage.ts index ab2d8b03f89..94acb7f018d 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/sendMessage.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/sendMessage.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts index b3c2c2bc252..29556e52e7a 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts index ddb57623913..4d39442ff86 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/convo/updateRead.ts b/packages/pds/src/lexicon/types/chat/bsky/convo/updateRead.ts index b879cde82b0..6aa23309332 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/convo/updateRead.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/convo/updateRead.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts b/packages/pds/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts index 077a0076bab..f99260a1b85 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts b/packages/pds/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts index 0a1f5b1b691..39489eb7c12 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts b/packages/pds/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts index d9c95f69643..17324495c1c 100644 --- a/packages/pds/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts +++ b/packages/pds/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/deleteAccount.ts b/packages/pds/src/lexicon/types/com/atproto/admin/deleteAccount.ts index 003c1b5ebcd..1b0223ea303 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/deleteAccount.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/deleteAccount.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts b/packages/pds/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts index 68c6503d95e..d8f8ecad320 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts b/packages/pds/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts index 2bf8de35583..75a9fb472a5 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts b/packages/pds/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts index 3f2836e7142..b072ad7ec56 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/getAccountInfo.ts b/packages/pds/src/lexicon/types/com/atproto/admin/getAccountInfo.ts index c7b840a153d..acea7749774 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/getAccountInfo.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/getAccountInfo.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/getAccountInfos.ts b/packages/pds/src/lexicon/types/com/atproto/admin/getAccountInfos.ts index 99ef44a99f5..7d9fa3fdcbf 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/getAccountInfos.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/getAccountInfos.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/getInviteCodes.ts b/packages/pds/src/lexicon/types/com/atproto/admin/getInviteCodes.ts index d68b97d775a..9619d5e4b5b 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/getInviteCodes.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/getInviteCodes.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts b/packages/pds/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts index c13496638c8..3aff3e6f322 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/searchAccounts.ts b/packages/pds/src/lexicon/types/com/atproto/admin/searchAccounts.ts index 80d0eecd926..96b26867f41 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/searchAccounts.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/searchAccounts.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/sendEmail.ts b/packages/pds/src/lexicon/types/com/atproto/admin/sendEmail.ts index 836fba39f79..5c8bebe791d 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/sendEmail.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/sendEmail.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts b/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts index ebabffbccdb..e3ea26f7298 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts b/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts index d6dc4a2dc25..87d861faef5 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts b/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts index 948568f0d3d..b6aef601e13 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts b/packages/pds/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts index c03d9667cae..ae48689cb4f 100644 --- a/packages/pds/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts +++ b/packages/pds/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts @@ -56,6 +56,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts b/packages/pds/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts index 5fa374de737..33bd5f6fa05 100644 --- a/packages/pds/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts +++ b/packages/pds/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts b/packages/pds/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/pds/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts +++ b/packages/pds/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/identity/resolveHandle.ts b/packages/pds/src/lexicon/types/com/atproto/identity/resolveHandle.ts index 05019df6166..e319fbfbadb 100644 --- a/packages/pds/src/lexicon/types/com/atproto/identity/resolveHandle.ts +++ b/packages/pds/src/lexicon/types/com/atproto/identity/resolveHandle.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/identity/signPlcOperation.ts b/packages/pds/src/lexicon/types/com/atproto/identity/signPlcOperation.ts index 3c908c049f2..9b0cb540b8e 100644 --- a/packages/pds/src/lexicon/types/com/atproto/identity/signPlcOperation.ts +++ b/packages/pds/src/lexicon/types/com/atproto/identity/signPlcOperation.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts b/packages/pds/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts index 5290b55d023..9b85d7dcb2f 100644 --- a/packages/pds/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts +++ b/packages/pds/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/identity/updateHandle.ts b/packages/pds/src/lexicon/types/com/atproto/identity/updateHandle.ts index f451d1f57c7..8a271d80264 100644 --- a/packages/pds/src/lexicon/types/com/atproto/identity/updateHandle.ts +++ b/packages/pds/src/lexicon/types/com/atproto/identity/updateHandle.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/label/queryLabels.ts b/packages/pds/src/lexicon/types/com/atproto/label/queryLabels.ts index 0c9d55a6961..9873f6914b4 100644 --- a/packages/pds/src/lexicon/types/com/atproto/label/queryLabels.ts +++ b/packages/pds/src/lexicon/types/com/atproto/label/queryLabels.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/moderation/createReport.ts b/packages/pds/src/lexicon/types/com/atproto/moderation/createReport.ts index aa3f810a91c..dc7985c7685 100644 --- a/packages/pds/src/lexicon/types/com/atproto/moderation/createReport.ts +++ b/packages/pds/src/lexicon/types/com/atproto/moderation/createReport.ts @@ -60,6 +60,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/repo/applyWrites.ts b/packages/pds/src/lexicon/types/com/atproto/repo/applyWrites.ts index 4e3c8dcef3d..a58fcc0a56b 100644 --- a/packages/pds/src/lexicon/types/com/atproto/repo/applyWrites.ts +++ b/packages/pds/src/lexicon/types/com/atproto/repo/applyWrites.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/repo/createRecord.ts b/packages/pds/src/lexicon/types/com/atproto/repo/createRecord.ts index 5cac0848bf1..0982f49bf3d 100644 --- a/packages/pds/src/lexicon/types/com/atproto/repo/createRecord.ts +++ b/packages/pds/src/lexicon/types/com/atproto/repo/createRecord.ts @@ -59,6 +59,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/repo/deleteRecord.ts b/packages/pds/src/lexicon/types/com/atproto/repo/deleteRecord.ts index e594cd00adf..c86ab7ba47a 100644 --- a/packages/pds/src/lexicon/types/com/atproto/repo/deleteRecord.ts +++ b/packages/pds/src/lexicon/types/com/atproto/repo/deleteRecord.ts @@ -54,6 +54,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/repo/describeRepo.ts b/packages/pds/src/lexicon/types/com/atproto/repo/describeRepo.ts index 749bedcfeb7..5b187f3758c 100644 --- a/packages/pds/src/lexicon/types/com/atproto/repo/describeRepo.ts +++ b/packages/pds/src/lexicon/types/com/atproto/repo/describeRepo.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/repo/getRecord.ts b/packages/pds/src/lexicon/types/com/atproto/repo/getRecord.ts index 9d03da19530..96ce9ee551f 100644 --- a/packages/pds/src/lexicon/types/com/atproto/repo/getRecord.ts +++ b/packages/pds/src/lexicon/types/com/atproto/repo/getRecord.ts @@ -49,6 +49,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/repo/importRepo.ts b/packages/pds/src/lexicon/types/com/atproto/repo/importRepo.ts index 59288c7a027..685918f455f 100644 --- a/packages/pds/src/lexicon/types/com/atproto/repo/importRepo.ts +++ b/packages/pds/src/lexicon/types/com/atproto/repo/importRepo.ts @@ -30,6 +30,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts b/packages/pds/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts index 40f4d385e47..f1be00d8e87 100644 --- a/packages/pds/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts +++ b/packages/pds/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/repo/listRecords.ts b/packages/pds/src/lexicon/types/com/atproto/repo/listRecords.ts index f46f6eb0f7f..e328cfbb204 100644 --- a/packages/pds/src/lexicon/types/com/atproto/repo/listRecords.ts +++ b/packages/pds/src/lexicon/types/com/atproto/repo/listRecords.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/repo/putRecord.ts b/packages/pds/src/lexicon/types/com/atproto/repo/putRecord.ts index 5cde768d7c2..269244ede91 100644 --- a/packages/pds/src/lexicon/types/com/atproto/repo/putRecord.ts +++ b/packages/pds/src/lexicon/types/com/atproto/repo/putRecord.ts @@ -61,6 +61,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/repo/uploadBlob.ts b/packages/pds/src/lexicon/types/com/atproto/repo/uploadBlob.ts index 4a712346a0b..7595e7295e6 100644 --- a/packages/pds/src/lexicon/types/com/atproto/repo/uploadBlob.ts +++ b/packages/pds/src/lexicon/types/com/atproto/repo/uploadBlob.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/activateAccount.ts b/packages/pds/src/lexicon/types/com/atproto/server/activateAccount.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/activateAccount.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/activateAccount.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/checkAccountStatus.ts b/packages/pds/src/lexicon/types/com/atproto/server/checkAccountStatus.ts index f17182a8dce..2ad98689303 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/checkAccountStatus.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/checkAccountStatus.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/confirmEmail.ts b/packages/pds/src/lexicon/types/com/atproto/server/confirmEmail.ts index b667a04b996..d6338b80fc5 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/confirmEmail.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/confirmEmail.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/createAccount.ts b/packages/pds/src/lexicon/types/com/atproto/server/createAccount.ts index 6e9b2f9f3c2..a85c83edffc 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/createAccount.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/createAccount.ts @@ -71,6 +71,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/createAppPassword.ts b/packages/pds/src/lexicon/types/com/atproto/server/createAppPassword.ts index 00657a2058f..65ad1d4b4cb 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/createAppPassword.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/createAppPassword.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/createInviteCode.ts b/packages/pds/src/lexicon/types/com/atproto/server/createInviteCode.ts index 9cfeacc7e28..82daf7eea6f 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/createInviteCode.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/createInviteCode.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/createInviteCodes.ts b/packages/pds/src/lexicon/types/com/atproto/server/createInviteCodes.ts index eb6cd2bb1b1..fa2c1f73c2a 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/createInviteCodes.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/createInviteCodes.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/createSession.ts b/packages/pds/src/lexicon/types/com/atproto/server/createSession.ts index 4ed0ae70fb1..47ffaaaa0bd 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/createSession.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/createSession.ts @@ -59,6 +59,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/deactivateAccount.ts b/packages/pds/src/lexicon/types/com/atproto/server/deactivateAccount.ts index b3793d6b2e0..56b86424e61 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/deactivateAccount.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/deactivateAccount.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/deleteAccount.ts b/packages/pds/src/lexicon/types/com/atproto/server/deleteAccount.ts index 4fcec360a11..93b7b78a0e5 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/deleteAccount.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/deleteAccount.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/deleteSession.ts b/packages/pds/src/lexicon/types/com/atproto/server/deleteSession.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/deleteSession.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/deleteSession.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/describeServer.ts b/packages/pds/src/lexicon/types/com/atproto/server/describeServer.ts index e21868158b3..6964a59ffdf 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/describeServer.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/describeServer.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts b/packages/pds/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts index 82c3ffa8c31..1cdf1299961 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/getServiceAuth.ts b/packages/pds/src/lexicon/types/com/atproto/server/getServiceAuth.ts index 14f249fde44..1e9d1398be7 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/getServiceAuth.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/getServiceAuth.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/getSession.ts b/packages/pds/src/lexicon/types/com/atproto/server/getSession.ts index be34cb92afd..cafa6bc7452 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/getSession.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/getSession.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/listAppPasswords.ts b/packages/pds/src/lexicon/types/com/atproto/server/listAppPasswords.ts index 397e7043e67..99219e67f7f 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/listAppPasswords.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/listAppPasswords.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/refreshSession.ts b/packages/pds/src/lexicon/types/com/atproto/server/refreshSession.ts index 1d6272a0d71..59e8f9d5a32 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/refreshSession.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/refreshSession.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/requestAccountDelete.ts b/packages/pds/src/lexicon/types/com/atproto/server/requestAccountDelete.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/requestAccountDelete.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/requestAccountDelete.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts b/packages/pds/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts index 82672f1d1c7..7620d0abb69 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts @@ -25,6 +25,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts b/packages/pds/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts index 24dce3e12af..87b9a094ccc 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/requestPasswordReset.ts b/packages/pds/src/lexicon/types/com/atproto/server/requestPasswordReset.ts index d0f3f2ad769..ae541342aff 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/requestPasswordReset.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/requestPasswordReset.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/reserveSigningKey.ts b/packages/pds/src/lexicon/types/com/atproto/server/reserveSigningKey.ts index 0ec1e80c77c..72850ce061b 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/reserveSigningKey.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/reserveSigningKey.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/resetPassword.ts b/packages/pds/src/lexicon/types/com/atproto/server/resetPassword.ts index 38f63382cf0..4b5b8ea1ecc 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/resetPassword.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/resetPassword.ts @@ -34,6 +34,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/revokeAppPassword.ts b/packages/pds/src/lexicon/types/com/atproto/server/revokeAppPassword.ts index 769ad6aa521..80131f8c9e3 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/revokeAppPassword.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/revokeAppPassword.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/server/updateEmail.ts b/packages/pds/src/lexicon/types/com/atproto/server/updateEmail.ts index 34fc7421979..a80982da4f8 100644 --- a/packages/pds/src/lexicon/types/com/atproto/server/updateEmail.ts +++ b/packages/pds/src/lexicon/types/com/atproto/server/updateEmail.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/getBlob.ts b/packages/pds/src/lexicon/types/com/atproto/sync/getBlob.ts index b1581d6e473..659c71c1a8d 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/getBlob.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/getBlob.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/getBlocks.ts b/packages/pds/src/lexicon/types/com/atproto/sync/getBlocks.ts index 925b4a7d50b..7fef8b7f64d 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/getBlocks.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/getBlocks.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/getCheckout.ts b/packages/pds/src/lexicon/types/com/atproto/sync/getCheckout.ts index 51856b9088d..3d519f6916d 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/getCheckout.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/getCheckout.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/getHead.ts b/packages/pds/src/lexicon/types/com/atproto/sync/getHead.ts index adedd4cf211..d9bb230cef5 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/getHead.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/getHead.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/getLatestCommit.ts b/packages/pds/src/lexicon/types/com/atproto/sync/getLatestCommit.ts index f0e9a757d04..6041841e311 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/getLatestCommit.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/getLatestCommit.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/getRecord.ts b/packages/pds/src/lexicon/types/com/atproto/sync/getRecord.ts index 83d88655228..afbd779faf1 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/getRecord.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/getRecord.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/getRepo.ts b/packages/pds/src/lexicon/types/com/atproto/sync/getRepo.ts index 883ff37def1..62a86f56a38 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/getRepo.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/getRepo.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/getRepoStatus.ts b/packages/pds/src/lexicon/types/com/atproto/sync/getRepoStatus.ts index 00abbeaa84b..743bcc45767 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/getRepoStatus.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/getRepoStatus.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/listBlobs.ts b/packages/pds/src/lexicon/types/com/atproto/sync/listBlobs.ts index c6ea955ee0c..abb1719f41b 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/listBlobs.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/listBlobs.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/listRepos.ts b/packages/pds/src/lexicon/types/com/atproto/sync/listRepos.ts index 5628b0b5147..228d6a004b5 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/listRepos.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/listRepos.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts b/packages/pds/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts index 8a0af577c7c..b2d2e6b2e48 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/sync/requestCrawl.ts b/packages/pds/src/lexicon/types/com/atproto/sync/requestCrawl.ts index 31180aabf58..fd54e157b7b 100644 --- a/packages/pds/src/lexicon/types/com/atproto/sync/requestCrawl.ts +++ b/packages/pds/src/lexicon/types/com/atproto/sync/requestCrawl.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/temp/addReservedHandle.ts b/packages/pds/src/lexicon/types/com/atproto/temp/addReservedHandle.ts index b884cb08998..69be85f72df 100644 --- a/packages/pds/src/lexicon/types/com/atproto/temp/addReservedHandle.ts +++ b/packages/pds/src/lexicon/types/com/atproto/temp/addReservedHandle.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts b/packages/pds/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts index 9486bce2b2b..9c7ef1ae6ab 100644 --- a/packages/pds/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts +++ b/packages/pds/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts @@ -39,6 +39,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/temp/fetchLabels.ts b/packages/pds/src/lexicon/types/com/atproto/temp/fetchLabels.ts index 0fbdeed1196..0392ba06ea2 100644 --- a/packages/pds/src/lexicon/types/com/atproto/temp/fetchLabels.ts +++ b/packages/pds/src/lexicon/types/com/atproto/temp/fetchLabels.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts b/packages/pds/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts index c977500fc33..8ebee2ad46d 100644 --- a/packages/pds/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts +++ b/packages/pds/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/communication/createTemplate.ts b/packages/pds/src/lexicon/types/tools/ozone/communication/createTemplate.ts index 6d29f93bdba..49d46cc6299 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/communication/createTemplate.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/communication/createTemplate.ts @@ -51,6 +51,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts b/packages/pds/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts index c5ae5cd469f..d773d84d8e6 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts @@ -32,6 +32,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/communication/listTemplates.ts b/packages/pds/src/lexicon/types/tools/ozone/communication/listTemplates.ts index 4573ac7bbb9..aa2738f5ca2 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/communication/listTemplates.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/communication/listTemplates.ts @@ -38,6 +38,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/communication/updateTemplate.ts b/packages/pds/src/lexicon/types/tools/ozone/communication/updateTemplate.ts index f8c5817b4d9..9f9c532e136 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/communication/updateTemplate.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/communication/updateTemplate.ts @@ -54,6 +54,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/emitEvent.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/emitEvent.ts index 1399cf589ee..d409858ec7b 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/emitEvent.ts @@ -68,6 +68,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/getEvent.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/getEvent.ts index b583510a791..c7e1b5943f3 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/getEvent.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/getEvent.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/getRecord.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/getRecord.ts index a3832cd161c..67eca72d05f 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/getRecord.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/getRecord.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/getRecords.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/getRecords.ts index 2559727bd65..46e11ef48e3 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/getRecords.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/getRecords.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/getRepo.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/getRepo.ts index 853d6460e85..ff675e577dc 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/getRepo.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/getRepo.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/getRepos.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/getRepos.ts index 71da4d1bac9..f113ef4395c 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/getRepos.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/getRepos.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/queryEvents.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/queryEvents.ts index 51003984889..c29249690d4 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/queryEvents.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/queryEvents.ts @@ -72,6 +72,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts index 28270425304..73a953e5176 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts @@ -103,6 +103,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/searchRepos.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/searchRepos.ts index 7696df54d0f..2aca4ee5a97 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/searchRepos.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/searchRepos.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/server/getConfig.ts b/packages/pds/src/lexicon/types/tools/ozone/server/getConfig.ts index b05ce4246d9..78ac5c2fb85 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/server/getConfig.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/server/getConfig.ts @@ -41,6 +41,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/set/addValues.ts b/packages/pds/src/lexicon/types/tools/ozone/set/addValues.ts index 1a48da4e682..41ae9830f30 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/set/addValues.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/set/addValues.ts @@ -35,6 +35,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/set/deleteSet.ts b/packages/pds/src/lexicon/types/tools/ozone/set/deleteSet.ts index 8b1584c3a1a..4612b73d044 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/set/deleteSet.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/set/deleteSet.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/set/deleteValues.ts b/packages/pds/src/lexicon/types/tools/ozone/set/deleteValues.ts index d1090863925..f0a18ff3b26 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/set/deleteValues.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/set/deleteValues.ts @@ -36,6 +36,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/set/getValues.ts b/packages/pds/src/lexicon/types/tools/ozone/set/getValues.ts index abae3c0b33a..d6f3af9e43e 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/set/getValues.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/set/getValues.ts @@ -45,6 +45,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/set/querySets.ts b/packages/pds/src/lexicon/types/tools/ozone/set/querySets.ts index 1eea93a7c4c..a1fe230268e 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/set/querySets.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/set/querySets.ts @@ -46,6 +46,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/set/upsertSet.ts b/packages/pds/src/lexicon/types/tools/ozone/set/upsertSet.ts index f51e375e425..843ad1029db 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/set/upsertSet.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/set/upsertSet.ts @@ -37,6 +37,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/setting/listOptions.ts b/packages/pds/src/lexicon/types/tools/ozone/setting/listOptions.ts index 54ad9608df3..464cdf7c50b 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/setting/listOptions.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/setting/listOptions.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/setting/removeOptions.ts b/packages/pds/src/lexicon/types/tools/ozone/setting/removeOptions.ts index 1d653b314da..3aa323a7fa6 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/setting/removeOptions.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/setting/removeOptions.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/setting/upsertOption.ts b/packages/pds/src/lexicon/types/tools/ozone/setting/upsertOption.ts index b2e66d073d9..ee541ffe817 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/setting/upsertOption.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/setting/upsertOption.ts @@ -52,6 +52,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/signature/findCorrelation.ts b/packages/pds/src/lexicon/types/tools/ozone/signature/findCorrelation.ts index c3eced05a5e..f12bdf6a04f 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/signature/findCorrelation.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/signature/findCorrelation.ts @@ -40,6 +40,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts b/packages/pds/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts index 821d5c6c080..b4773ac2e20 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts @@ -44,6 +44,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/signature/searchAccounts.ts b/packages/pds/src/lexicon/types/tools/ozone/signature/searchAccounts.ts index 4e37745aa4a..ad1f3f3c3b8 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/signature/searchAccounts.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/signature/searchAccounts.ts @@ -43,6 +43,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/team/addMember.ts b/packages/pds/src/lexicon/types/tools/ozone/team/addMember.ts index 85e40f2a461..ad33479adcf 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/team/addMember.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/team/addMember.ts @@ -47,6 +47,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/team/deleteMember.ts b/packages/pds/src/lexicon/types/tools/ozone/team/deleteMember.ts index 3adf03313dc..14f0265fd6f 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/team/deleteMember.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/team/deleteMember.ts @@ -33,6 +33,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/team/listMembers.ts b/packages/pds/src/lexicon/types/tools/ozone/team/listMembers.ts index 1995cc68cc1..813e86e9b16 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/team/listMembers.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/team/listMembers.ts @@ -42,6 +42,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, diff --git a/packages/pds/src/lexicon/types/tools/ozone/team/updateMember.ts b/packages/pds/src/lexicon/types/tools/ozone/team/updateMember.ts index 57b0a318583..4c343144a1b 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/team/updateMember.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/team/updateMember.ts @@ -48,6 +48,7 @@ export type HandlerReqCtx = { input: HandlerInput req: express.Request res: express.Response + resetRouteRateLimits: () => Promise } export type Handler = ( ctx: HandlerReqCtx, From b04943191b9f89a5263a77358d47d1362a6454a6 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Thu, 23 Jan 2025 11:01:37 +0100 Subject: [PATCH 026/101] Add description for transition:* scopes (#3432) --- .changeset/little-fishes-mate.md | 5 +++++ .../oauth-provider/src/assets/app/components/accept-form.tsx | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 .changeset/little-fishes-mate.md diff --git a/.changeset/little-fishes-mate.md b/.changeset/little-fishes-mate.md new file mode 100644 index 00000000000..b4b449eaf65 --- /dev/null +++ b/.changeset/little-fishes-mate.md @@ -0,0 +1,5 @@ +--- +"@atproto/oauth-provider": patch +--- + +Add user friendly description for transition:\* scopes diff --git a/packages/oauth/oauth-provider/src/assets/app/components/accept-form.tsx b/packages/oauth/oauth-provider/src/assets/app/components/accept-form.tsx index 247bd69013c..27c2a1aecbf 100644 --- a/packages/oauth/oauth-provider/src/assets/app/components/accept-form.tsx +++ b/packages/oauth/oauth-provider/src/assets/app/components/accept-form.tsx @@ -127,6 +127,10 @@ function getScopeDescription(scope: string): string { switch (scope) { case 'atproto': return 'Uniquely identify you' + case 'transition:generic': + return 'Access your account data (except chat messages)' + case 'transition:chat.bsky': + return 'Access your chat messages' default: return scope } From 8c6c7813a9c2110c8fe21acdca8f09554a1983ce Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Thu, 23 Jan 2025 14:22:55 +0000 Subject: [PATCH 027/101] Allow passing `allowTakendown` to createSession (#3441) * allow passing `allowTakendown` to createSession * changeset --- .changeset/new-owls-applaud.md | 5 +++++ packages/api/src/atp-agent.ts | 1 + packages/api/src/types.ts | 1 + 3 files changed, 7 insertions(+) create mode 100644 .changeset/new-owls-applaud.md diff --git a/.changeset/new-owls-applaud.md b/.changeset/new-owls-applaud.md new file mode 100644 index 00000000000..2242088c89c --- /dev/null +++ b/.changeset/new-owls-applaud.md @@ -0,0 +1,5 @@ +--- +"@atproto/api": patch +--- + +Allow passing `allowTakendown` to createSession diff --git a/packages/api/src/atp-agent.ts b/packages/api/src/atp-agent.ts index 0d4129dc6d3..e82c78772bc 100644 --- a/packages/api/src/atp-agent.ts +++ b/packages/api/src/atp-agent.ts @@ -309,6 +309,7 @@ export class CredentialSession implements SessionManager { identifier: opts.identifier, password: opts.password, authFactorToken: opts.authFactorToken, + allowTakendown: opts.allowTakendown, }) this.session = { accessJwt: res.data.accessJwt, diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts index 582f9a70c15..fba5b2deebf 100644 --- a/packages/api/src/types.ts +++ b/packages/api/src/types.ts @@ -47,6 +47,7 @@ export interface AtpAgentLoginOpts { identifier: string password: string authFactorToken?: string | undefined + allowTakendown?: boolean } /** From 3aa97a9dd3d222ae0087915e68a707ebcc128e31 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 14:27:29 +0000 Subject: [PATCH 028/101] Version packages (#3438) Co-authored-by: github-actions[bot] --- .changeset/little-fishes-mate.md | 5 ----- .changeset/new-owls-applaud.md | 5 ----- packages/api/CHANGELOG.md | 6 ++++++ packages/api/package.json | 2 +- packages/bsky/CHANGELOG.md | 7 +++++++ packages/bsky/package.json | 2 +- packages/dev-env/CHANGELOG.md | 10 ++++++++++ packages/dev-env/package.json | 2 +- packages/oauth/oauth-provider/CHANGELOG.md | 6 ++++++ packages/oauth/oauth-provider/package.json | 2 +- packages/ozone/CHANGELOG.md | 7 +++++++ packages/ozone/package.json | 2 +- packages/pds/CHANGELOG.md | 8 ++++++++ packages/pds/package.json | 2 +- 14 files changed, 50 insertions(+), 16 deletions(-) delete mode 100644 .changeset/little-fishes-mate.md delete mode 100644 .changeset/new-owls-applaud.md diff --git a/.changeset/little-fishes-mate.md b/.changeset/little-fishes-mate.md deleted file mode 100644 index b4b449eaf65..00000000000 --- a/.changeset/little-fishes-mate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/oauth-provider": patch ---- - -Add user friendly description for transition:\* scopes diff --git a/.changeset/new-owls-applaud.md b/.changeset/new-owls-applaud.md deleted file mode 100644 index 2242088c89c..00000000000 --- a/.changeset/new-owls-applaud.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/api": patch ---- - -Allow passing `allowTakendown` to createSession diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index f3a524ae1e8..6c5179bf40c 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/api +## 0.13.31 + +### Patch Changes + +- [#3441](https://github.com/bluesky-social/atproto/pull/3441) [`8c6c7813a`](https://github.com/bluesky-social/atproto/commit/8c6c7813a9c2110c8fe21acdca8f09554a1983ce) Thanks [@mozzius](https://github.com/mozzius)! - Allow passing `allowTakendown` to createSession + ## 0.13.30 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index 222027b7870..82978a9d811 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.13.30", + "version": "0.13.31", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index 1eecb2411b8..29a46b9a3df 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/bsky +## 0.0.112 + +### Patch Changes + +- Updated dependencies [[`8c6c7813a`](https://github.com/bluesky-social/atproto/commit/8c6c7813a9c2110c8fe21acdca8f09554a1983ce)]: + - @atproto/api@0.13.31 + ## 0.0.111 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 58b6848f593..73db8c83dd8 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.111", + "version": "0.0.112", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index ff18c62f0ad..16932d5c00e 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/dev-env +## 0.3.82 + +### Patch Changes + +- Updated dependencies [[`8c6c7813a`](https://github.com/bluesky-social/atproto/commit/8c6c7813a9c2110c8fe21acdca8f09554a1983ce)]: + - @atproto/api@0.13.31 + - @atproto/pds@0.4.90 + - @atproto/bsky@0.0.112 + - @atproto/ozone@0.1.73 + ## 0.3.81 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index ccc026bc702..a6104c1fafd 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.3.81", + "version": "0.3.82", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/oauth/oauth-provider/CHANGELOG.md b/packages/oauth/oauth-provider/CHANGELOG.md index 5ae5f34792b..188fd0930f4 100644 --- a/packages/oauth/oauth-provider/CHANGELOG.md +++ b/packages/oauth/oauth-provider/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/oauth-provider +## 0.2.15 + +### Patch Changes + +- [#3432](https://github.com/bluesky-social/atproto/pull/3432) [`b04943191`](https://github.com/bluesky-social/atproto/commit/b04943191b9f89a5263a77358d47d1362a6454a6) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add user friendly description for transition:\* scopes + ## 0.2.14 ### Patch Changes diff --git a/packages/oauth/oauth-provider/package.json b/packages/oauth/oauth-provider/package.json index 9b87ac0852d..6c65a12c480 100644 --- a/packages/oauth/oauth-provider/package.json +++ b/packages/oauth/oauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider", - "version": "0.2.14", + "version": "0.2.15", "license": "MIT", "description": "Generic OAuth2 and OpenID Connect provider for Node.js. Currently only supports features needed for Atproto.", "keywords": [ diff --git a/packages/ozone/CHANGELOG.md b/packages/ozone/CHANGELOG.md index 5a45d5e7ab0..9cc6c2b65af 100644 --- a/packages/ozone/CHANGELOG.md +++ b/packages/ozone/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/ozone +## 0.1.73 + +### Patch Changes + +- Updated dependencies [[`8c6c7813a`](https://github.com/bluesky-social/atproto/commit/8c6c7813a9c2110c8fe21acdca8f09554a1983ce)]: + - @atproto/api@0.13.31 + ## 0.1.72 ### Patch Changes diff --git a/packages/ozone/package.json b/packages/ozone/package.json index 781798bd26d..b783902b53d 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ozone", - "version": "0.1.72", + "version": "0.1.73", "license": "MIT", "description": "Backend service for moderating the Bluesky network.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index 64ee066e01d..77e5df5bd00 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/pds +## 0.4.90 + +### Patch Changes + +- Updated dependencies [[`b04943191`](https://github.com/bluesky-social/atproto/commit/b04943191b9f89a5263a77358d47d1362a6454a6), [`8c6c7813a`](https://github.com/bluesky-social/atproto/commit/8c6c7813a9c2110c8fe21acdca8f09554a1983ce)]: + - @atproto/oauth-provider@0.2.15 + - @atproto/api@0.13.31 + ## 0.4.89 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index 34858139bfc..c99bbc41799 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.89", + "version": "0.4.90", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ From 4f2841efeb410e710e0c8da7c9204468f6256a75 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Thu, 23 Jan 2025 15:53:38 +0100 Subject: [PATCH 029/101] Improve error reporting in case of failed PLC update operation (#3439) * Improve error reporting in case of failed PLC update operation * Improve error message * convert all PlcClientError XRPCError * changeset --- .changeset/eighty-eggs-nail.md | 5 +++ .changeset/quiet-geese-begin.md | 5 +++ .changeset/weak-jobs-serve.md | 5 +++ packages/pds/src/index.ts | 25 ++++++++++++++ packages/xrpc-server/src/server.ts | 52 ++++++++++++++++-------------- packages/xrpc-server/src/types.ts | 13 ++++++++ 6 files changed, 81 insertions(+), 24 deletions(-) create mode 100644 .changeset/eighty-eggs-nail.md create mode 100644 .changeset/quiet-geese-begin.md create mode 100644 .changeset/weak-jobs-serve.md diff --git a/.changeset/eighty-eggs-nail.md b/.changeset/eighty-eggs-nail.md new file mode 100644 index 00000000000..3c98610c03b --- /dev/null +++ b/.changeset/eighty-eggs-nail.md @@ -0,0 +1,5 @@ +--- +"@atproto/xrpc-server": patch +--- + +Export the `ResponseType` type used in the `XRPCError` constructor diff --git a/.changeset/quiet-geese-begin.md b/.changeset/quiet-geese-begin.md new file mode 100644 index 00000000000..0f503d3cfd7 --- /dev/null +++ b/.changeset/quiet-geese-begin.md @@ -0,0 +1,5 @@ +--- +"@atproto/xrpc-server": patch +--- + +Allow providing a custom `errorParser` option to XRPCServer diff --git a/.changeset/weak-jobs-serve.md b/.changeset/weak-jobs-serve.md new file mode 100644 index 00000000000..59de543c639 --- /dev/null +++ b/.changeset/weak-jobs-serve.md @@ -0,0 +1,5 @@ +--- +"@atproto/pds": patch +--- + +Improve error reporting in case of failed PLC update operation diff --git a/packages/pds/src/index.ts b/packages/pds/src/index.ts index fb73a3c3017..1508fe9b504 100644 --- a/packages/pds/src/index.ts +++ b/packages/pds/src/index.ts @@ -10,6 +10,9 @@ import http from 'http' import events from 'events' import { Options as XrpcServerOptions } from '@atproto/xrpc-server' import { DAY, HOUR, MINUTE, SECOND } from '@atproto/common' +import { XRPCError, ResponseType } from '@atproto/xrpc-server' +import { PlcClientError } from '@did-plc/lib' + import API from './api' import * as authRoutes from './auth-routes' import * as basicRoutes from './basic-routes' @@ -64,6 +67,28 @@ export class PDS { blobLimit: cfg.service.blobUploadLimit, }, catchall: proxyHandler(ctx), + errorParser: (err) => { + if (err instanceof PlcClientError) { + const payloadMessage = + typeof err.data === 'object' && + err.data != null && + 'message' in err.data && + typeof err.data.message === 'string' && + err.data.message + + const type = + err.status >= 500 + ? ResponseType.UpstreamFailure + : ResponseType.InvalidRequest + + return new XRPCError( + type, + payloadMessage || 'Unable to perform PLC operation', + ) + } + + return XRPCError.fromError(err) + }, rateLimits: ctx.ratelimitCreator ? { creator: ctx.ratelimitCreator, diff --git a/packages/xrpc-server/src/server.ts b/packages/xrpc-server/src/server.ts index ae0a5563c04..41dc8293dd6 100644 --- a/packages/xrpc-server/src/server.ts +++ b/packages/xrpc-server/src/server.ts @@ -68,17 +68,17 @@ export class Server { sharedRateLimiters: Record routeRateLimiters: Record - constructor(lexicons?: LexiconDoc[], opts?: Options) { + constructor(lexicons?: LexiconDoc[], opts: Options = {}) { if (lexicons) { this.addLexicons(lexicons) } this.router.use(this.routes) this.router.use('/xrpc/:methodId', this.catchall.bind(this)) - this.router.use(errorMiddleware) + this.router.use(createErrorMiddleware(opts)) this.router.once('mount', (app: Application) => { this.enableStreamingOnListen(app) }) - this.options = opts ?? {} + this.options = opts this.middleware = { json: express.json({ limit: opts?.payload?.jsonLimit }), text: express.text({ limit: opts?.payload?.textLimit }), @@ -535,26 +535,30 @@ function createAuthMiddleware(verifier: AuthVerifier): RequestHandler { } } -const errorMiddleware: ErrorRequestHandler = function (err, req, res, next) { - const locals: RequestLocals | undefined = req[kRequestLocals] - const methodSuffix = locals ? ` method ${locals.nsid}` : '' - const xrpcError = XRPCError.fromError(err) - if (xrpcError instanceof InternalServerError) { - // log trace for unhandled exceptions - log.error(err, `unhandled exception in xrpc${methodSuffix}`) - } else { - // do not log trace for known xrpc errors - log.error( - { - status: xrpcError.type, - message: xrpcError.message, - name: xrpcError.customErrorName, - }, - `error in xrpc${methodSuffix}`, - ) - } - if (res.headersSent) { - return next(err) +function createErrorMiddleware({ + errorParser = (err) => XRPCError.fromError(err), +}: Options): ErrorRequestHandler { + return (err, req, res, next) => { + const locals: RequestLocals | undefined = req[kRequestLocals] + const methodSuffix = locals ? ` method ${locals.nsid}` : '' + const xrpcError = errorParser(err) + if (xrpcError instanceof InternalServerError) { + // log trace for unhandled exceptions + log.error(err, `unhandled exception in xrpc${methodSuffix}`) + } else { + // do not log trace for known xrpc errors + log.error( + { + status: xrpcError.type, + message: xrpcError.message, + name: xrpcError.customErrorName, + }, + `error in xrpc${methodSuffix}`, + ) + } + if (res.headersSent) { + return next(err) + } + return res.status(xrpcError.type).json(xrpcError.payload) } - return res.status(xrpcError.type).json(xrpcError.payload) } diff --git a/packages/xrpc-server/src/types.ts b/packages/xrpc-server/src/types.ts index afc68150328..5ea430a9fd6 100644 --- a/packages/xrpc-server/src/types.ts +++ b/packages/xrpc-server/src/types.ts @@ -29,6 +29,17 @@ export type Options = { global?: ServerRateLimitDescription[] shared?: ServerRateLimitDescription[] } + /** + * By default, errors are converted to {@link XRPCError} using + * {@link XRPCError.fromError} before being rendered. If method handlers throw + * error objects that are not properly rendered in the HTTP response, this + * function can be used to properly convert them to {@link XRPCError}. The + * provided function will typically fallback to the default error conversion + * (`return XRPCError.fromError(err)`) if the error is not recognized. + * + * @note This function should not throw errors. + */ + errorParser?: (err: unknown) => XRPCError } export type UndecodedParams = (typeof express.request)['query'] @@ -212,6 +223,8 @@ export type XRPCStreamHandlerConfig = { handler: XRPCStreamHandler } +export { ResponseType } + export class XRPCError extends Error { constructor( public type: ResponseType, From 0904515069b104619096f7ef07691f4565bdc6fa Mon Sep 17 00:00:00 2001 From: devin ivy Date: Fri, 24 Jan 2025 01:53:02 -0500 Subject: [PATCH 030/101] Add imax to contributors for disclosure (#3434) --- CONTRIBUTORS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index bc6718114fc..3f0464adf01 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -19,3 +19,5 @@ ATProto receives so many contributions that we could never list everyone who des #### [goeo\_](https://bsky.app/profile/did:web:genco.me), Security disclosure, May 2024 #### [DavidBuchanan314](https://github.com/DavidBuchanan314), Security disclosure, November 2024 + +#### [imax](https://github.com/imax9000), Security disclosure, January 2025 From da7a831a7318343ba1ee98de3811ba337c043dbd Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Fri, 24 Jan 2025 15:29:33 +0100 Subject: [PATCH 031/101] Code cleanup (#3437) --- .changeset/forty-carrots-doubt.md | 5 +++++ packages/ozone/src/background.ts | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 .changeset/forty-carrots-doubt.md diff --git a/.changeset/forty-carrots-doubt.md b/.changeset/forty-carrots-doubt.md new file mode 100644 index 00000000000..f9b66fdcabe --- /dev/null +++ b/.changeset/forty-carrots-doubt.md @@ -0,0 +1,5 @@ +--- +"@atproto/ozone": patch +--- + +Code cleanup diff --git a/packages/ozone/src/background.ts b/packages/ozone/src/background.ts index 5730dd3963c..53aadbf4894 100644 --- a/packages/ozone/src/background.ts +++ b/packages/ozone/src/background.ts @@ -152,10 +152,8 @@ export class PeriodicBackgroundTask { // destroy it here. this.abortController.abort() - console.error('ABOOOORT') await this.intervalPromise this.intervalPromise = undefined - console.error('DONE -_-') } } From e5d4c7462d70a495f7cc82c0ddf15a319e09dba1 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 24 Jan 2025 14:59:31 -0600 Subject: [PATCH 032/101] Update confirm-email template (#2849) --- packages/pds/src/mailer/templates/confirm-email.hbs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/pds/src/mailer/templates/confirm-email.hbs b/packages/pds/src/mailer/templates/confirm-email.hbs index 5fa9192c1d9..aaa14422f65 100644 --- a/packages/pds/src/mailer/templates/confirm-email.hbs +++ b/packages/pds/src/mailer/templates/confirm-email.hbs @@ -67,7 +67,12 @@

To confirm this email for your account, please enter the - code below in the app.

+ click here.

{{token}}

Date: Fri, 24 Jan 2025 18:07:59 -0500 Subject: [PATCH 033/101] Appview: add user-agent for feeds and resolving blobs (#3450) appview: add user-agent for feeds and resolving blobs --- packages/bsky/src/api/app/bsky/feed/getFeed.ts | 3 ++- packages/bsky/src/api/blob-resolver.ts | 3 +++ packages/bsky/src/api/util.ts | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/bsky/src/api/app/bsky/feed/getFeed.ts b/packages/bsky/src/api/app/bsky/feed/getFeed.ts index 8a89d956582..decd4a045fd 100644 --- a/packages/bsky/src/api/app/bsky/feed/getFeed.ts +++ b/packages/bsky/src/api/app/bsky/feed/getFeed.ts @@ -28,7 +28,7 @@ import { isDataplaneError, unpackIdentityServices, } from '../../../../data-plane' -import { resHeaders } from '../../../util' +import { BSKY_USER_AGENT, resHeaders } from '../../../util' import { ids } from '../../../../lexicon/lexicons' export default function (server: Server, ctx: AppContext) { @@ -55,6 +55,7 @@ export default function (server: Server, ctx: AppContext) { const labelers = ctx.reqLabelers(req) const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer }) const headers = noUndefinedVals({ + 'user-agent': BSKY_USER_AGENT, authorization: req.headers['authorization'], 'accept-language': req.headers['accept-language'], 'x-bsky-topics': Array.isArray(req.headers['x-bsky-topics']) diff --git a/packages/bsky/src/api/blob-resolver.ts b/packages/bsky/src/api/blob-resolver.ts index 95dc8f7ba1b..562c1003843 100644 --- a/packages/bsky/src/api/blob-resolver.ts +++ b/packages/bsky/src/api/blob-resolver.ts @@ -28,6 +28,7 @@ import { import { parseCid } from '../hydration/util' import { httpLogger as log } from '../logger' import { Middleware, proxyResponseHeaders, responseSignal } from '../util/http' +import { BSKY_USER_AGENT } from './util' export function createMiddleware(ctx: AppContext): Middleware { return async (req, res, next) => { @@ -298,6 +299,8 @@ function getBlobHeaders( ): Map { const headers = new Map() + headers.set('user-agent', BSKY_USER_AGENT) + if (bypassKey && bypassHostname) { const matchesUrl = bypassHostname.startsWith('.') ? url.hostname.endsWith(bypassHostname) diff --git a/packages/bsky/src/api/util.ts b/packages/bsky/src/api/util.ts index 3ee0ea2c59b..e15cfe08499 100644 --- a/packages/bsky/src/api/util.ts +++ b/packages/bsky/src/api/util.ts @@ -1,5 +1,6 @@ import { ParsedLabelers, formatLabelerHeader } from '../util' +export const BSKY_USER_AGENT = 'BskyAppView' export const ATPROTO_CONTENT_LABELERS = 'Atproto-Content-Labelers' export const ATPROTO_REPO_REV = 'Atproto-Repo-Rev' From a8f06939f94b3a5efee4b56c4de0e36502ff15fd Mon Sep 17 00:00:00 2001 From: devin ivy Date: Fri, 24 Jan 2025 18:49:35 -0500 Subject: [PATCH 034/101] Appview: ensure takedowns on modlist authors always apply (#3192) * appview: begin rewiring logic for applying modlist, based on owner status. * appview: unify logic for checking list-block/mutes * appview: apply actor takedowns for 3p list-blocks * appview: apply actor takedowns for 1p list-blocks, fix dataplane method * appview: test takedown on modlist author, application of list --- .../src/api/app/bsky/feed/getAuthorFeed.ts | 10 +- .../data-plane/server/routes/relationships.ts | 104 +++++++++++------- packages/bsky/src/hydration/graph.ts | 46 ++++---- packages/bsky/src/hydration/hydrator.ts | 85 ++++++++++---- packages/bsky/src/views/index.ts | 83 +++++++++----- packages/bsky/tests/views/author-feed.test.ts | 2 +- .../bsky/tests/views/labels-takedown.test.ts | 29 +++++ 7 files changed, 248 insertions(+), 111 deletions(-) diff --git a/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts b/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts index 1aeaf65f291..d0804bde221 100644 --- a/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts +++ b/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts @@ -145,13 +145,19 @@ const noBlocksOrMutedReposts = (inputs: { }): Skeleton => { const { ctx, skeleton, hydration } = inputs const relationship = hydration.profileViewers?.get(skeleton.actor.did) - if (relationship?.blocking || relationship?.blockingByList) { + if ( + relationship && + (relationship.blocking || ctx.views.blockingByList(relationship, hydration)) + ) { throw new InvalidRequestError( `Requester has blocked actor: ${skeleton.actor.did}`, 'BlockedActor', ) } - if (relationship?.blockedBy || relationship?.blockedByList) { + if ( + relationship && + (relationship.blockedBy || ctx.views.blockedByList(relationship, hydration)) + ) { throw new InvalidRequestError( `Requester is blocked by actor: ${skeleton.actor.did}`, 'BlockedByActor', diff --git a/packages/bsky/src/data-plane/server/routes/relationships.ts b/packages/bsky/src/data-plane/server/routes/relationships.ts index d6029e169e8..a291db9d20e 100644 --- a/packages/bsky/src/data-plane/server/routes/relationships.ts +++ b/packages/bsky/src/data-plane/server/routes/relationships.ts @@ -90,7 +90,7 @@ export default (db: Database): Partial> => ({ async getBlockExistence(req) { const { pairs } = req if (pairs.length === 0) { - return { exists: [] } + return { exists: [], blocks: [] } } const { ref } = db.db.dynamic const sourceRef = ref('pair.source') @@ -101,48 +101,72 @@ export default (db: Database): Partial> => ({ .select([ sql`${sourceRef}`.as('source'), sql`${targetRef}`.as('target'), + (eb) => + eb + .selectFrom('actor_block') + .whereRef('actor_block.creator', '=', sourceRef) + .whereRef('actor_block.subjectDid', '=', targetRef) + .select('uri') + .as('blocking'), + (eb) => + eb + .selectFrom('actor_block') + .whereRef('actor_block.creator', '=', targetRef) + .whereRef('actor_block.subjectDid', '=', sourceRef) + .select('uri') + .as('blockedBy'), + (eb) => + eb + .selectFrom('list_item') + .innerJoin( + 'list_block', + 'list_block.subjectUri', + 'list_item.listUri', + ) + .whereRef('list_block.creator', '=', sourceRef) + .whereRef('list_item.subjectDid', '=', targetRef) + .select('list_item.listUri') + .as('blockingByList'), + (eb) => + eb + .selectFrom('list_item') + .innerJoin( + 'list_block', + 'list_block.subjectUri', + 'list_item.listUri', + ) + .whereRef('list_block.creator', '=', targetRef) + .whereRef('list_item.subjectDid', '=', sourceRef) + .select('list_item.listUri') + .as('blockedByList'), ]) - .whereExists((qb) => - qb - .selectFrom('actor_block') - .whereRef('actor_block.creator', '=', sourceRef) - .whereRef('actor_block.subjectDid', '=', targetRef) - .select('uri'), - ) - .orWhereExists((qb) => - qb - .selectFrom('actor_block') - .whereRef('actor_block.creator', '=', targetRef) - .whereRef('actor_block.subjectDid', '=', sourceRef) - .select('uri'), - ) - .orWhereExists((qb) => - qb - .selectFrom('list_item') - .innerJoin('list_block', 'list_block.subjectUri', 'list_item.listUri') - .whereRef('list_block.creator', '=', sourceRef) - .whereRef('list_item.subjectDid', '=', targetRef) - .select('list_item.listUri'), - ) - .orWhereExists((qb) => - qb - .selectFrom('list_item') - .innerJoin('list_block', 'list_block.subjectUri', 'list_item.listUri') - .whereRef('list_block.creator', '=', targetRef) - .whereRef('list_item.subjectDid', '=', sourceRef) - .select('list_item.listUri'), - ) .execute() - const existMap = res.reduce((acc, cur) => { - const key = [cur.source, cur.target].sort().join(',') - return acc.set(key, true) - }, new Map()) - const exists = pairs.map((pair) => { - const key = [pair.a, pair.b].sort().join(',') - return existMap.get(key) === true - }) + const getKey = (a, b) => [a, b].sort().join(',') + const lookup = res.reduce((acc, cur) => { + const key = getKey(cur.source, cur.target) + return acc.set(key, cur) + }, new Map()) return { - exists, + exists: pairs.map((pair) => { + const item = lookup.get(getKey(pair.a, pair.b)) + if (!item) return false + return !!( + item.blocking || + item.blockedBy || + item.blockingByList || + item.blockedByList + ) + }), + blocks: pairs.map((pair) => { + const item = lookup.get(getKey(pair.a, pair.b)) + if (!item) return {} + return { + blockedBy: item.blockedBy || undefined, + blocking: item.blocking || undefined, + blockedByList: item.blockedByList || undefined, + blockingByList: item.blockingByList || undefined, + } + }), } }, }) diff --git a/packages/bsky/src/hydration/graph.ts b/packages/bsky/src/hydration/graph.ts index 6556af42db0..a153e96ca65 100644 --- a/packages/bsky/src/hydration/graph.ts +++ b/packages/bsky/src/hydration/graph.ts @@ -46,50 +46,46 @@ export type ListAggs = HydrationMap export type RelationshipPair = [didA: string, didB: string] const dedupePairs = (pairs: RelationshipPair[]): RelationshipPair[] => { - const mapped = pairs.reduce( - (acc, cur) => { - const sorted = ([...cur] as RelationshipPair).sort() - acc[sorted.join('-')] = sorted - return acc - }, - {} as Record, - ) - return Object.values(mapped) + const deduped = pairs.reduce((acc, pair) => { + return acc.set(Blocks.key(...pair), pair) + }, new Map()) + return [...deduped.values()] } export class Blocks { - _blocks: Map = new Map() + _blocks: Map = new Map() // did:a,did:b -> block constructor() {} static key(didA: string, didB: string): string { return [didA, didB].sort().join(',') } - set(didA: string, didB: string, exists: boolean): Blocks { + set(didA: string, didB: string, block: BlockEntry): Blocks { const key = Blocks.key(didA, didB) - this._blocks.set(key, exists) + this._blocks.set(key, block) return this } - has(didA: string, didB: string): boolean { + get(didA: string, didB: string): BlockEntry | null { + if (didA === didB) return null // ignore self-blocks const key = Blocks.key(didA, didB) - return this._blocks.has(key) - } - - isBlocked(didA: string, didB: string): boolean { - if (didA === didB) return false // ignore self-blocks - const key = Blocks.key(didA, didB) - return this._blocks.get(key) ?? false + return this._blocks.get(key) ?? null } merge(blocks: Blocks): Blocks { - blocks._blocks.forEach((exists, key) => { - this._blocks.set(key, exists) + blocks._blocks.forEach((block, key) => { + this._blocks.set(key, block) }) return this } } +// No "blocking" vs. "blocked" directionality: only suitable for bidirectional block checks +export type BlockEntry = { + blockUri: string | undefined + blockListUri: string | undefined +} + export class GraphHydrator { constructor(public dataplane: DataPlaneClient) {} @@ -162,7 +158,11 @@ export class GraphHydrator { const blocks = new Blocks() for (let i = 0; i < deduped.length; i++) { const pair = deduped[i] - blocks.set(pair.a, pair.b, res.exists[i] ?? false) + const block = res.blocks[i] + blocks.set(pair.a, pair.b, { + blockUri: block.blockedBy || block.blocking || undefined, + blockListUri: block.blockedByList || block.blockingByList || undefined, + }) } return blocks } diff --git a/packages/bsky/src/hydration/hydrator.ts b/packages/bsky/src/hydration/hydrator.ts index fb19a5cbf3a..39d6015e6a9 100644 --- a/packages/bsky/src/hydration/hydrator.ts +++ b/packages/bsky/src/hydration/hydrator.ts @@ -43,7 +43,7 @@ import { mergeNestedMaps, mergeManyMaps, } from './util' -import { uriToDid as didFromUri } from '../util/uris' +import { uriToDid as didFromUri, uriToDid } from '../util/uris' import { FeedGenAggs, FeedGens, @@ -279,10 +279,11 @@ export class Hydrator { // - profile basic async hydrateLists(uris: string[], ctx: HydrateCtx): Promise { const [listsState, profilesState] = await Promise.all([ - await this.hydrateListsBasic(uris, ctx), - await this.hydrateProfilesBasic(uris.map(didFromUri), ctx), + this.hydrateListsBasic(uris, ctx, { + skipAuthors: true, // handled via author profile hydration + }), + this.hydrateProfilesBasic(uris.map(didFromUri), ctx), ]) - return mergeStates(listsState, profilesState) } @@ -291,19 +292,26 @@ export class Hydrator { async hydrateListsBasic( uris: string[], ctx: HydrateCtx, + opts?: { skipAuthors: boolean }, ): Promise { - const [lists, listAggs, listViewers, labels] = await Promise.all([ + const includeAuthorDids = opts?.skipAuthors ? [] : uris.map(uriToDid) + const [lists, listAggs, listViewers, labels, actors] = await Promise.all([ this.graph.getLists(uris, ctx.includeTakedowns), this.graph.getListAggregates(uris.map((uri) => ({ uri }))), ctx.viewer ? this.graph.getListViewerStates(uris, ctx.viewer) : undefined, - this.label.getLabelsForSubjects(uris, ctx.labelers), + this.label.getLabelsForSubjects( + [...uris, ...includeAuthorDids], + ctx.labelers, + ), + this.actor.getActors(includeAuthorDids, ctx.includeTakedowns), ]) if (!ctx.includeTakedowns) { actionTakedownLabels(uris, lists, labels) + actionTakedownLabels(includeAuthorDids, actors, labels) } - return { lists, listAggs, listViewers, labels, ctx } + return { lists, listAggs, listViewers, labels, actors, ctx } } // app.bsky.graph.defs#listItemView @@ -533,12 +541,14 @@ export class Hydrator { } } // replace embed/parent/root pairs with block state - const blocks = await this.graph.getBidirectionalBlocks(relationships) + const blocks = await this.hydrateBidirectionalBlocks( + pairsToMap(relationships), + ) for (const [uri, { embed, parent, root }] of postBlocksPairs) { postBlocks.set(uri, { - embed: !!embed && blocks.isBlocked(...embed), - parent: !!parent && blocks.isBlocked(...parent), - root: !!root && blocks.isBlocked(...root), + embed: !!embed && !!isBlocked(blocks, embed), + parent: !!parent && !!isBlocked(blocks, parent), + root: !!root && !!isBlocked(blocks, root), }) } return postBlocks @@ -756,8 +766,8 @@ export class Hydrator { ) }, ) - const blocks = await this.graph.getBidirectionalBlocks( - listCreatorMemberPairs, + const blocks = await this.hydrateBidirectionalBlocks( + pairsToMap(listCreatorMemberPairs), ) // sample top list items per starter pack based on their follows const listMemberAggs = await this.actor.getProfileAggregates(listMemberDids) @@ -772,7 +782,8 @@ export class Hydrator { // update aggregation with list items for top 12 most followed members agg.listItemSampleUris = [ ...members.listitems.filter( - (li) => ctx.viewer === creator || !blocks?.isBlocked(creator, li.did), + (li) => + ctx.viewer === creator || !isBlocked(blocks, [creator, li.did]), ), ] .sort((li1, li2) => { @@ -814,11 +825,11 @@ export class Hydrator { pairs.push([authorDid, didFromUri(uri)]) } } - const blocks = await this.graph.getBidirectionalBlocks(pairs) + const blocks = await this.hydrateBidirectionalBlocks(pairsToMap(pairs)) const likeBlocks = new HydrationMap() for (const [uri, like] of likes) { if (like) { - likeBlocks.set(uri, blocks.isBlocked(authorDid, didFromUri(uri))) + likeBlocks.set(uri, isBlocked(blocks, [authorDid, didFromUri(uri)])) } else { likeBlocks.set(uri, null) } @@ -898,13 +909,13 @@ export class Hydrator { pairs.push([didFromUri(uri), follow.record.subject]) } } - const blocks = await this.graph.getBidirectionalBlocks(pairs) + const blocks = await this.hydrateBidirectionalBlocks(pairsToMap(pairs)) const followBlocks = new HydrationMap() for (const [uri, follow] of follows) { if (follow) { followBlocks.set( uri, - blocks.isBlocked(didFromUri(uri), follow.record.subject), + isBlocked(blocks, [didFromUri(uri), follow.record.subject]), ) } else { followBlocks.set(uri, null) @@ -926,10 +937,32 @@ export class Hydrator { const result = new HydrationMap>() const blocks = await this.graph.getBidirectionalBlocks(pairs) + // lookup list authors to apply takedown status to blocklists + const listAuthorDids = new Set() + for (const [source, targets] of didMap) { + for (const target of targets) { + const block = blocks.get(source, target) + if (block?.blockListUri) { + listAuthorDids.add(uriToDid(block.blockListUri)) + } + } + } + + const activeListAuthors = await this.actor.getActors( + [...listAuthorDids], + false, + ) + for (const [source, targets] of didMap) { const didBlocks = new HydrationMap() for (const target of targets) { - didBlocks.set(target, blocks.isBlocked(source, target)) + const block = blocks.get(source, target) + const isBlocked = !!( + block?.blockUri || + (block?.blockListUri && + activeListAuthors.get(uriToDid(block.blockListUri))) + ) + didBlocks.set(target, isBlocked) } result.set(source, didBlocks) } @@ -1198,6 +1231,20 @@ const getListUrisFromThreadgates = (gates: Threadgates) => { return uris } +const isBlocked = (blocks: BidirectionalBlocks, [a, b]: RelationshipPair) => { + return blocks.get(a)?.get(b) ?? null +} + +const pairsToMap = (pairs: RelationshipPair[]): Map => { + const map = new Map() + for (const [a, b] of pairs) { + const list = map.get(a) ?? [] + list.push(b) + map.set(a, list) + } + return map +} + export const mergeStates = ( stateA: HydrationState, stateB: HydrationState, diff --git a/packages/bsky/src/views/index.ts b/packages/bsky/src/views/index.ts index 0d3d2ec576b..e0290eb9b83 100644 --- a/packages/bsky/src/views/index.ts +++ b/packages/bsky/src/views/index.ts @@ -7,7 +7,7 @@ import { ProfileViewDetailed, ProfileView, ProfileViewBasic, - ViewerState as ProfileViewerState, + ViewerState as ProfileViewer, } from '../lexicon/types/app/bsky/actor/defs' import { BlockedPost, @@ -35,7 +35,11 @@ import { VideoUriBuilder, parsePostgate, } from './util' -import { uriToDid as creatorFromUri, safePinnedPost } from '../util/uris' +import { + uriToDid as creatorFromUri, + safePinnedPost, + uriToDid, +} from '../util/uris' import { isListRule } from '../lexicon/types/app/bsky/feed/threadgate' import { isSelfLabels } from '../lexicon/types/com/atproto/label/defs' import { @@ -73,6 +77,7 @@ import { } from '../lexicon/types/app/bsky/labeler/defs' import { Notification } from '../proto/bsky_pb' import { postUriToThreadgateUri, postUriToPostgateUri } from '../util/uris' +import { ProfileViewerState } from '../hydration/actor' export class Views { public imgUriBuilder: ImageUriBuilder = this.opts.imgUriBuilder @@ -101,9 +106,10 @@ export class Views { } actorIsTakendown(did: string, state: HydrationState): boolean { - if (state.actors?.get(did)?.takedownRef) return true - if (state.actors?.get(did)?.upstreamStatus === 'takendown') return true - if (state.actors?.get(did)?.upstreamStatus === 'suspended') return true + const actor = state.actors?.get(did) + if (actor?.takedownRef) return true + if (actor?.upstreamStatus === 'takendown') return true + if (actor?.upstreamStatus === 'suspended') return true if (state.labels?.get(did)?.isTakendown) return true return false } @@ -111,18 +117,45 @@ export class Views { viewerBlockExists(did: string, state: HydrationState): boolean { const actor = state.profileViewers?.get(did) if (!actor) return false - return ( - !!actor.blockedBy || - !!actor.blocking || - !!actor.blockedByList || - !!actor.blockingByList + return !!( + actor.blockedBy || + actor.blocking || + this.blockedByList(actor, state) || + this.blockingByList(actor, state) ) } viewerMuteExists(did: string, state: HydrationState): boolean { const actor = state.profileViewers?.get(did) if (!actor) return false - return actor.muted || !!actor.mutedByList + return !!(actor.muted || this.mutedByList(actor, state)) + } + + blockingByList(viewer: ProfileViewerState, state: HydrationState) { + return ( + viewer.blockingByList && this.recordActive(viewer.blockingByList, state) + ) + } + + blockedByList(viewer: ProfileViewerState, state: HydrationState) { + return ( + viewer.blockedByList && this.recordActive(viewer.blockedByList, state) + ) + } + + mutedByList(viewer: ProfileViewerState, state: HydrationState) { + return viewer.mutedByList && this.recordActive(viewer.mutedByList, state) + } + + recordActive(uri: string, state: HydrationState) { + const did = uriToDid(uri) + const actor = state.actors?.get(did) + if (!actor || this.actorIsTakendown(did, state)) { + // actor may not be present when takedowns are eagerly applied during hydration. + // so it's important to _try_ to hydrate the actor for records checked this way. + return + } + return uri } viewerSeesNeedsReview(did: string, state: HydrationState): boolean { @@ -276,24 +309,22 @@ export class Views { } } - profileViewer( - did: string, - state: HydrationState, - ): ProfileViewerState | undefined { + profileViewer(did: string, state: HydrationState): ProfileViewer | undefined { const viewer = state.profileViewers?.get(did) if (!viewer) return - const blockedByUri = viewer.blockedBy || viewer.blockedByList - const blockingUri = viewer.blocking || viewer.blockingByList + const blockedByList = this.blockedByList(viewer, state) + const blockedByUri = viewer.blockedBy || blockedByList + const blockingByList = this.blockingByList(viewer, state) + const blockingUri = viewer.blocking || blockingByList const block = !!blockedByUri || !!blockingUri + const mutedByList = this.mutedByList(viewer, state) return { - muted: viewer.muted || !!viewer.mutedByList, - mutedByList: viewer.mutedByList - ? this.listBasic(viewer.mutedByList, state) - : undefined, + muted: !!(viewer.muted || mutedByList), + mutedByList: mutedByList ? this.listBasic(mutedByList, state) : undefined, blockedBy: !!blockedByUri, blocking: blockingUri, - blockingByList: viewer.blockingByList - ? this.listBasic(viewer.blockingByList, state) + blockingByList: blockingByList + ? this.listBasic(blockingByList, state) : undefined, following: viewer.following && !block ? viewer.following : undefined, followedBy: viewer.followedBy && !block ? viewer.followedBy : undefined, @@ -323,11 +354,11 @@ export class Views { blockedProfileViewer( did: string, state: HydrationState, - ): ProfileViewerState | undefined { + ): ProfileViewer | undefined { const viewer = state.profileViewers?.get(did) if (!viewer) return - const blockedByUri = viewer.blockedBy || viewer.blockedByList - const blockingUri = viewer.blocking || viewer.blockingByList + const blockedByUri = viewer.blockedBy || this.blockedByList(viewer, state) + const blockingUri = viewer.blocking || this.blockingByList(viewer, state) return { blockedBy: !!blockedByUri, blocking: blockingUri, diff --git a/packages/bsky/tests/views/author-feed.test.ts b/packages/bsky/tests/views/author-feed.test.ts index 50c105d2342..6c42ab04c45 100644 --- a/packages/bsky/tests/views/author-feed.test.ts +++ b/packages/bsky/tests/views/author-feed.test.ts @@ -487,7 +487,7 @@ describe('pds author feed views', () => { await sc.post(alice, 'not pinned post') const post = await createAndPinPost() await sc.post(alice, 'not pinned post') - + await network.processAll() const { data } = await agent.api.app.bsky.feed.getAuthorFeed( { actor: sc.accounts[alice].handle, includePins: true }, { diff --git a/packages/bsky/tests/views/labels-takedown.test.ts b/packages/bsky/tests/views/labels-takedown.test.ts index 5e2e58581bb..f77e9820c8b 100644 --- a/packages/bsky/tests/views/labels-takedown.test.ts +++ b/packages/bsky/tests/views/labels-takedown.test.ts @@ -37,6 +37,16 @@ describe('bsky takedown labels', () => { sc.getHeaders(sc.dids.carol), ) carolListRef = await sc.createList(sc.dids.carol, 'carol list', 'mod') + // alice blocks dan via carol's list, and carol is takendown + await sc.addToList(sc.dids.carol, sc.dids.dan, carolListRef) + await pdsAgent.app.bsky.graph.listblock.create( + { repo: sc.dids.alice }, + { + subject: carolListRef.uriStr, + createdAt: new Date().toISOString(), + }, + sc.getHeaders(sc.dids.alice), + ) aliceGenRef = await sc.createFeedGen( sc.dids.alice, 'did:web:example.com', @@ -190,6 +200,25 @@ describe('bsky takedown labels', () => { expect(profile.viewer?.blockingByList).toBeUndefined() }) + it('author takedown halts application of mod lists', async () => { + const { data: profile } = await agent.app.bsky.actor.getProfile( + { + actor: sc.dids.dan, // blocked via carol's list, and carol is takendown + }, + { + headers: await network.serviceHeaders( + sc.dids.alice, + ids.AppBskyActorGetProfile, + ), + }, + ) + expect(profile.did).toBe(sc.dids.dan) + expect(profile.viewer).not.toBeUndefined() + expect(profile.viewer?.blockedBy).toBe(false) + expect(profile.viewer?.blocking).toBeUndefined() + expect(profile.viewer?.blockingByList).toBeUndefined() + }) + it('takesdown feed generators', async () => { const res = await agent.api.app.bsky.feed.getFeedGenerators({ feeds: [aliceGenRef.uriStr, bobGenRef.uriStr, carolGenRef.uriStr], From 933b6ba36e6bb5ec2d5d1aa4a72cb80375e3cbcb Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Sun, 26 Jan 2025 21:29:28 +0100 Subject: [PATCH 035/101] Improve codegen script (#3465) paralellize codegen --- Makefile | 7 +------ package.json | 1 + 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index d7424038a49..81b7b8acf67 100644 --- a/Makefile +++ b/Makefile @@ -28,12 +28,7 @@ run-dev-env-logged: ## Run a "development environment" shell (with logging) .PHONY: codegen codegen: ## Re-generate packages from lexicon/ files - cd packages/api; pnpm run codegen - cd packages/pds; pnpm run codegen - cd packages/bsky; pnpm run codegen - cd packages/ozone; pnpm run codegen - # clean up codegen output - pnpm format + pnpm codegen .PHONY: lint lint: ## Run style checks and verify syntax diff --git a/package.json b/package.json index 080ec6fcdbf..e9de3327688 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "verify:lint": "pnpm lint", "verify:types": "tsc --build tsconfig.json", "format": "pnpm lint:fix && pnpm style:fix", + "codegen": "pnpm run --recursive --stream --filter '@atproto/lex-cli...' build --force && pnpm run --recursive --stream --parallel codegen", "build": "pnpm --recursive --stream build", "dev": "NODE_ENV=development pnpm --stream '/^dev:.+$/'", "dev:tsc": "tsc --build tsconfig.json --watch", From 8810885b8e7fa0377e6c000c091eec1dd85ed261 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Sun, 26 Jan 2025 22:24:03 +0100 Subject: [PATCH 036/101] fix pds tests flakiness (#3463) --- .changeset/lemon-adults-sparkle.md | 5 +++++ .changeset/tall-kings-poke.md | 5 +++++ packages/ozone/src/mod-service/views.ts | 2 +- .../tests/__snapshots__/get-record.test.ts.snap | 4 ++-- .../tests/__snapshots__/get-records.test.ts.snap | 2 +- .../ozone/tests/__snapshots__/get-repo.test.ts.snap | 2 +- .../ozone/tests/__snapshots__/get-repos.test.ts.snap | 2 +- .../__snapshots__/moderation-events.test.ts.snap | 2 +- .../__snapshots__/moderation-statuses.test.ts.snap | 12 ++++++------ .../tests/__snapshots__/takedown-appeal.test.ts.snap | 7 ++++++- .../tests/proxied/__snapshots__/admin.test.ts.snap | 6 +++--- packages/pds/tests/sequencer.test.ts | 4 ++++ packages/pds/tests/takedown-appeal.test.ts | 2 ++ 13 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 .changeset/lemon-adults-sparkle.md create mode 100644 .changeset/tall-kings-poke.md diff --git a/.changeset/lemon-adults-sparkle.md b/.changeset/lemon-adults-sparkle.md new file mode 100644 index 00000000000..1b6104750ac --- /dev/null +++ b/.changeset/lemon-adults-sparkle.md @@ -0,0 +1,5 @@ +--- +"@atproto/ozone": patch +--- + +Fix typo in recordsStats's $type property diff --git a/.changeset/tall-kings-poke.md b/.changeset/tall-kings-poke.md new file mode 100644 index 00000000000..de58a7ff90f --- /dev/null +++ b/.changeset/tall-kings-poke.md @@ -0,0 +1,5 @@ +--- +"@atproto/pds": patch +--- + +Fix flaky tests diff --git a/packages/ozone/src/mod-service/views.ts b/packages/ozone/src/mod-service/views.ts index 12a3d9f018c..b52f8b47a9c 100644 --- a/packages/ozone/src/mod-service/views.ts +++ b/packages/ozone/src/mod-service/views.ts @@ -628,7 +628,7 @@ export class ModerationViews { recordsStats: { // Explicitly typing to allow for easy manipulation (e.g. to strip from tests snapshots) - $type: 'tools.ozone.moderation.defs#recordStats', + $type: 'tools.ozone.moderation.defs#recordsStats', // account_record_events_stats totalReports: status.totalReports ?? undefined, diff --git a/packages/ozone/tests/__snapshots__/get-record.test.ts.snap b/packages/ozone/tests/__snapshots__/get-record.test.ts.snap index bed827aced6..43eb46abd6b 100644 --- a/packages/ozone/tests/__snapshots__/get-record.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/get-record.test.ts.snap @@ -41,7 +41,7 @@ Object { "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 0, @@ -161,7 +161,7 @@ Object { "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 0, diff --git a/packages/ozone/tests/__snapshots__/get-records.test.ts.snap b/packages/ozone/tests/__snapshots__/get-records.test.ts.snap index 05f6f6f3273..4c95700ffe3 100644 --- a/packages/ozone/tests/__snapshots__/get-records.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/get-records.test.ts.snap @@ -44,7 +44,7 @@ Object { "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 0, diff --git a/packages/ozone/tests/__snapshots__/get-repo.test.ts.snap b/packages/ozone/tests/__snapshots__/get-repo.test.ts.snap index d548cd9d844..87c9000dbc0 100644 --- a/packages/ozone/tests/__snapshots__/get-repo.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/get-repo.test.ts.snap @@ -40,7 +40,7 @@ Object { "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", }, "reviewState": "tools.ozone.moderation.defs#reviewClosed", "subject": Object { diff --git a/packages/ozone/tests/__snapshots__/get-repos.test.ts.snap b/packages/ozone/tests/__snapshots__/get-repos.test.ts.snap index 1da0c8ab0fb..2f6c4f81fb0 100644 --- a/packages/ozone/tests/__snapshots__/get-repos.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/get-repos.test.ts.snap @@ -43,7 +43,7 @@ Object { "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", }, "reviewState": "tools.ozone.moderation.defs#reviewClosed", "subject": Object { diff --git a/packages/ozone/tests/__snapshots__/moderation-events.test.ts.snap b/packages/ozone/tests/__snapshots__/moderation-events.test.ts.snap index 3aaf889373b..cca025f41b3 100644 --- a/packages/ozone/tests/__snapshots__/moderation-events.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/moderation-events.test.ts.snap @@ -36,7 +36,7 @@ Object { "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 2, diff --git a/packages/ozone/tests/__snapshots__/moderation-statuses.test.ts.snap b/packages/ozone/tests/__snapshots__/moderation-statuses.test.ts.snap index 9e1258212db..cc145f6bf2f 100644 --- a/packages/ozone/tests/__snapshots__/moderation-statuses.test.ts.snap +++ b/packages/ozone/tests/__snapshots__/moderation-statuses.test.ts.snap @@ -19,7 +19,7 @@ Array [ "id": 7, "lastReportedAt": "1970-01-01T00:00:00.000Z", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 1, @@ -62,7 +62,7 @@ Array [ "id": 5, "lastReportedAt": "1970-01-01T00:00:00.000Z", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 1, @@ -109,7 +109,7 @@ Array [ "id": 7, "lastReportedAt": "1970-01-01T00:00:00.000Z", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 1, @@ -152,7 +152,7 @@ Array [ "id": 5, "lastReportedAt": "1970-01-01T00:00:00.000Z", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 1, @@ -194,7 +194,7 @@ Array [ "id": 3, "lastReportedAt": "1970-01-01T00:00:00.000Z", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 1, @@ -236,7 +236,7 @@ Array [ "id": 1, "lastReportedAt": "1970-01-01T00:00:00.000Z", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 1, diff --git a/packages/pds/tests/__snapshots__/takedown-appeal.test.ts.snap b/packages/pds/tests/__snapshots__/takedown-appeal.test.ts.snap index 1e7e1c31845..cb103a8defa 100644 --- a/packages/pds/tests/__snapshots__/takedown-appeal.test.ts.snap +++ b/packages/pds/tests/__snapshots__/takedown-appeal.test.ts.snap @@ -4,6 +4,11 @@ exports[`appeal account takedown actor takedown allows appeal request. 1`] = ` Object { "accountStats": Object { "$type": "tools.ozone.moderation.defs#accountStats", + "appealCount": 0, + "escalateCount": 0, + "reportCount": 0, + "suspendCount": 0, + "takedownCount": 1, }, "appealed": true, "createdAt": "1970-01-01T00:00:00.000Z", @@ -17,7 +22,7 @@ Object { "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(0)", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", }, "reviewState": "tools.ozone.moderation.defs#reviewEscalated", "subject": Object { diff --git a/packages/pds/tests/proxied/__snapshots__/admin.test.ts.snap b/packages/pds/tests/proxied/__snapshots__/admin.test.ts.snap index 32f98e2ae62..1886696a4ac 100644 --- a/packages/pds/tests/proxied/__snapshots__/admin.test.ts.snap +++ b/packages/pds/tests/proxied/__snapshots__/admin.test.ts.snap @@ -160,7 +160,7 @@ Object { "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 0, @@ -276,7 +276,7 @@ Object { "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 0, @@ -357,7 +357,7 @@ Object { "lastReviewedAt": "1970-01-01T00:00:00.000Z", "lastReviewedBy": "user(1)", "recordsStats": Object { - "$type": "tools.ozone.moderation.defs#recordStats", + "$type": "tools.ozone.moderation.defs#recordsStats", "appealedCount": 0, "escalatedCount": 0, "pendingCount": 0, diff --git a/packages/pds/tests/sequencer.test.ts b/packages/pds/tests/sequencer.test.ts index 137f4c99978..184463b8ddc 100644 --- a/packages/pds/tests/sequencer.test.ts +++ b/packages/pds/tests/sequencer.test.ts @@ -37,6 +37,10 @@ describe('sequencer', () => { totalEvts = 14 }) + beforeEach(async () => { + await network.processAll() + }) + afterAll(async () => { await network.close() }) diff --git a/packages/pds/tests/takedown-appeal.test.ts b/packages/pds/tests/takedown-appeal.test.ts index 498b42a379c..afe1bbd791e 100644 --- a/packages/pds/tests/takedown-appeal.test.ts +++ b/packages/pds/tests/takedown-appeal.test.ts @@ -61,6 +61,8 @@ describe('appeal account takedown', () => { }, ) + await network.processAll() + // Verify user can not get session token without setting the optional param await expect( agent.com.atproto.server.createSession({ From fb64d50ee220316b9f1183e5c3259629489734c9 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Sun, 26 Jan 2025 22:24:27 +0100 Subject: [PATCH 037/101] Explicitly allow "undefined" values in `headers` (#3456) * Explicitly allow "undefined" values in `headers` * fix tests types --- .changeset/rude-laws-join.md | 5 +++++ packages/bsky/src/api/app/bsky/actor/getSuggestions.ts | 7 ++++--- .../src/api/app/bsky/graph/getSuggestedFollowsByActor.ts | 5 +++-- packages/bsky/tests/label-hydration.test.ts | 7 +++++-- packages/pds/tests/proxied/read-after-write.test.ts | 2 +- packages/xrpc/src/types.ts | 2 +- 6 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 .changeset/rude-laws-join.md diff --git a/.changeset/rude-laws-join.md b/.changeset/rude-laws-join.md new file mode 100644 index 00000000000..894032e2262 --- /dev/null +++ b/.changeset/rude-laws-join.md @@ -0,0 +1,5 @@ +--- +"@atproto/xrpc": patch +--- + +Explicitly allow "undefined" values in `headers` diff --git a/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts b/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts index 911b9cdcefe..4af0927feed 100644 --- a/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts +++ b/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts @@ -1,4 +1,6 @@ import { mapDefined, noUndefinedVals } from '@atproto/common' +import { AtpAgent } from '@atproto/api' +import { HeadersMap } from '@atproto/xrpc' import AppContext from '../../../../context' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/actor/getSuggestions' @@ -12,7 +14,6 @@ import { Views } from '../../../../views' import { DataPlaneClient } from '../../../../data-plane' import { parseString } from '../../../../hydration/util' import { resHeaders } from '../../../util' -import { AtpAgent } from '@atproto/api' export default function (server: Server, ctx: AppContext) { const getSuggestions = createPipeline( @@ -144,12 +145,12 @@ type Context = { type Params = QueryParams & { hydrateCtx: HydrateCtx - headers: Record + headers: HeadersMap } type Skeleton = { dids: string[] cursor?: string recId?: number - resHeaders?: Record + resHeaders?: HeadersMap } diff --git a/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts b/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts index b8d2b563ba6..c7eec21bad9 100644 --- a/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts +++ b/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts @@ -1,6 +1,7 @@ import { mapDefined, noUndefinedVals } from '@atproto/common' import { InvalidRequestError } from '@atproto/xrpc-server' import AtpAgent from '@atproto/api' +import { HeadersMap } from '@atproto/xrpc' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getSuggestedFollowsByActor' import AppContext from '../../../../context' @@ -133,12 +134,12 @@ type Context = { type Params = QueryParams & { hydrateCtx: HydrateCtx & { viewer: string } - headers: Record + headers: HeadersMap } type SkeletonState = { isFallback: boolean suggestedDids: string[] recId?: number - headers?: Record + headers?: HeadersMap } diff --git a/packages/bsky/tests/label-hydration.test.ts b/packages/bsky/tests/label-hydration.test.ts index 9198c9fe29e..ad5ceb482f6 100644 --- a/packages/bsky/tests/label-hydration.test.ts +++ b/packages/bsky/tests/label-hydration.test.ts @@ -73,8 +73,11 @@ describe('label hydration', () => { expect(res.data.labels?.find((l) => l.src === labelerDid)?.val).toEqual( 'misleading', ) - const labelerHeaderDids = res.headers['atproto-content-labelers'].split(',') - expect(labelerHeaderDids.sort()).toEqual( + const labelerHeaderDids = res.headers['atproto-content-labelers'] + ?.split(',') + .sort() + + expect(labelerHeaderDids).toEqual( [alice, `${bob};redact`, labelerDid].sort(), ) }) diff --git a/packages/pds/tests/proxied/read-after-write.test.ts b/packages/pds/tests/proxied/read-after-write.test.ts index 0461efeac75..72aa7f59035 100644 --- a/packages/pds/tests/proxied/read-after-write.test.ts +++ b/packages/pds/tests/proxied/read-after-write.test.ts @@ -282,7 +282,7 @@ describe('proxy read after write', () => { { headers: { ...sc.getHeaders(alice) } }, ) const lag = res.headers['atproto-upstream-lag'] - expect(lag).toBeDefined() + assert(lag !== undefined) const parsed = parseInt(lag) expect(parsed > 0).toBe(true) }) diff --git a/packages/xrpc/src/types.ts b/packages/xrpc/src/types.ts index 11e88445271..bf79f25b2e6 100644 --- a/packages/xrpc/src/types.ts +++ b/packages/xrpc/src/types.ts @@ -2,7 +2,7 @@ import { z } from 'zod' import { ValidationError } from '@atproto/lexicon' export type QueryParams = Record -export type HeadersMap = Record +export type HeadersMap = Record export type { /** @deprecated not to be confused with the WHATWG Headers constructor */ From cc2a1222bd2b8ddd70d70dad174c1c63246a2d87 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Mon, 27 Jan 2025 01:06:06 +0100 Subject: [PATCH 038/101] Fix did:web encoding/decoding (#3454) --- .changeset/gorgeous-lies-warn.md | 5 + .changeset/lovely-news-prove.md | 5 + packages/did/jest.config.js | 13 +++ packages/did/package.json | 5 +- packages/did/src/methods/plc.ts | 8 +- packages/did/src/methods/web.ts | 40 ++++--- packages/did/tests/methods/plc.test.ts | 72 ++++++++++++ packages/did/tests/methods/web.test.ts | 109 ++++++++++++++++++ .../did-resolver/src/did-resolver-base.ts | 9 +- .../internal/did-resolver/src/methods/plc.ts | 1 + .../internal/did-resolver/src/methods/web.ts | 8 +- pnpm-lock.yaml | 6 + 12 files changed, 254 insertions(+), 27 deletions(-) create mode 100644 .changeset/gorgeous-lies-warn.md create mode 100644 .changeset/lovely-news-prove.md create mode 100644 packages/did/jest.config.js create mode 100644 packages/did/tests/methods/plc.test.ts create mode 100644 packages/did/tests/methods/web.test.ts diff --git a/.changeset/gorgeous-lies-warn.md b/.changeset/gorgeous-lies-warn.md new file mode 100644 index 00000000000..541ffc83479 --- /dev/null +++ b/.changeset/gorgeous-lies-warn.md @@ -0,0 +1,5 @@ +--- +"@atproto-labs/did-resolver": patch +--- + +Improve error descriptions diff --git a/.changeset/lovely-news-prove.md b/.changeset/lovely-news-prove.md new file mode 100644 index 00000000000..62cb5f6e114 --- /dev/null +++ b/.changeset/lovely-news-prove.md @@ -0,0 +1,5 @@ +--- +"@atproto/did": patch +--- + +Fix encoding and decoding of did:web diff --git a/packages/did/jest.config.js b/packages/did/jest.config.js new file mode 100644 index 00000000000..5e6f9c6f3f7 --- /dev/null +++ b/packages/did/jest.config.js @@ -0,0 +1,13 @@ +/** @type {import('jest').Config} */ +module.exports = { + displayName: 'PDS', + transform: { '^.+\\.(t|j)s$': '@swc/jest' }, + // Jest requires all ESM dependencies to be transpiled (even if they are + // dynamically import()ed). + transformIgnorePatterns: [ + `/node_modules/.pnpm/(?!(get-port|lande|toygrad)@)`, + ], + testTimeout: 60000, + setupFiles: ['/../../jest.setup.ts'], + moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, +} diff --git a/packages/did/package.json b/packages/did/package.json index f1b90b7be2e..a34ccd2bb43 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -28,9 +28,12 @@ "zod": "^3.23.8" }, "devDependencies": { + "@swc/jest": "^0.2.24", + "jest": "^28.1.2", "typescript": "^5.6.3" }, "scripts": { - "build": "tsc --build tsconfig.build.json" + "build": "tsc --build tsconfig.build.json", + "test": "jest" } } diff --git a/packages/did/src/methods/plc.ts b/packages/did/src/methods/plc.ts index 69f6dc632e9..4e603a7255c 100644 --- a/packages/did/src/methods/plc.ts +++ b/packages/did/src/methods/plc.ts @@ -28,6 +28,10 @@ export function assertDidPlc(input: unknown): asserts input is Did<'plc'> { throw new InvalidDidError(typeof input, `DID must be a string`) } + if (!input.startsWith(DID_PLC_PREFIX)) { + throw new InvalidDidError(input, `Invalid did:plc prefix`) + } + if (input.length !== DID_PLC_LENGTH) { throw new InvalidDidError( input, @@ -35,10 +39,6 @@ export function assertDidPlc(input: unknown): asserts input is Did<'plc'> { ) } - if (!input.startsWith(DID_PLC_PREFIX)) { - throw new InvalidDidError(input, `Invalid did:plc prefix`) - } - // The following check is not necessary, as the check below is more strict: // assertDidMsid(input, DID_PLC_PREFIX.length) diff --git a/packages/did/src/methods/web.ts b/packages/did/src/methods/web.ts index 31405ccb023..b281822be28 100644 --- a/packages/did/src/methods/web.ts +++ b/packages/did/src/methods/web.ts @@ -9,9 +9,11 @@ export const DID_WEB_PREFIX = `did:web:` satisfies Did<'web'> export function isDidWeb(input: unknown): input is Did<'web'> { // Optimization: make cheap checks first if (typeof input !== 'string') return false + if (!input.startsWith(DID_WEB_PREFIX)) return false + if (input.charAt(DID_WEB_PREFIX.length) === ':') return false try { - assertDidWeb(input) + didWebToUrl(input as Did<'web'>) return true } catch { return false @@ -28,25 +30,31 @@ export function assertDidWeb(input: unknown): asserts input is Did<'web'> { throw new InvalidDidError(typeof input, `DID must be a string`) } - void didWebToUrl(input) -} - -export function didWebToUrl(did: string): URL { - if (!did.startsWith(DID_WEB_PREFIX)) { - throw new InvalidDidError(did, `did:web must start with ${DID_WEB_PREFIX}`) + if (!input.startsWith(DID_WEB_PREFIX)) { + throw new InvalidDidError(input, `Invalid did:web prefix`) } - if (did.charAt(DID_WEB_PREFIX.length) === ':') { - throw new InvalidDidError(did, 'did:web MSID must not start with a colon') + if (input.charAt(DID_WEB_PREFIX.length) === ':') { + throw new InvalidDidError(input, 'did:web MSID must not start with a colon') } + void didWebToUrl(input as Did<'web'>) +} + +export function didWebToUrl(did: Did<'web'>) { // Make sure every char is valid (per DID spec) assertDidMsid(did, DID_WEB_PREFIX.length) + const hostIdx = DID_WEB_PREFIX.length + const pathIdx = did.indexOf(':', hostIdx) + + const host = pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx) + const path = pathIdx === -1 ? '' : did.slice(pathIdx) + try { - const msid = did.slice(DID_WEB_PREFIX.length) - const parts = msid.split(':').map(decodeURIComponent) - const url = new URL(`https://${parts.join('/')}`) + const url = new URL( + `https://${host.replaceAll('%3A', ':')}${path.replaceAll(':', '/')}`, + ) as URL & { protocol: 'http:' | 'https:' } if (url.hostname === 'localhost') { url.protocol = 'http:' } @@ -57,10 +65,8 @@ export function didWebToUrl(did: string): URL { } export function urlToDidWeb(url: URL): Did<'web'> { - const path = - url.pathname === '/' - ? '' - : url.pathname.slice(1).split('/').map(encodeURIComponent).join(':') + const port = url.port ? `%3A${url.port}` : '' + const path = url.pathname === '/' ? '' : url.pathname.replaceAll('/', ':') - return `did:web:${encodeURIComponent(url.host)}${path ? `:${path}` : ''}` + return `did:web:${url.hostname}${port}${path}` } diff --git a/packages/did/tests/methods/plc.test.ts b/packages/did/tests/methods/plc.test.ts new file mode 100644 index 00000000000..51ce7daaa7a --- /dev/null +++ b/packages/did/tests/methods/plc.test.ts @@ -0,0 +1,72 @@ +import { InvalidDidError } from '../../src/did-error.js' +import { Did } from '../../src/did.js' +import { asDidPlc, assertDidPlc, isDidPlc } from '../../src/methods/plc.js' + +const VALID: Did<'plc'>[] = [ + 'did:plc:l3rouwludahu3ui3bt66mfvj', + 'did:plc:aaaaaaaaaaaaaaaaaaaaaaaa', + 'did:plc:zzzzzzzzzzzzzzzzzzzzzzzz', +] + +const INVALID: [value: unknown, message: string][] = [ + ['did:plc:l3rouwludahu3ui3bt66mfv0', 'Invalid character at position 31'], + ['did:plc:l3rouwludahu3ui3bt66mfv1', 'Invalid character at position 31'], + ['did:plc:l3rouwludahu3ui3bt66mfv9', 'Invalid character at position 31'], + ['did:plc:l3rouwludahu3ui3bt66mfv', 'did:plc must be 32 characters long'], + ['did:plc:l3rouwludahu3ui3bt66mfvja', 'did:plc must be 32 characters long'], + ['did:plc:example.com:', 'did:plc must be 32 characters long'], + ['did:plc:exam%3Aple.com%3A8080', 'did:plc must be 32 characters long'], + [3, 'DID must be a string'], + [{ toString: () => 'did:plc:foo.com' }, 'DID must be a string'], + [[''], 'DID must be a string'], + ['random-string', 'Invalid did:plc prefix'], + ['did plc', 'Invalid did:plc prefix'], + ['lorem ipsum dolor sit', 'Invalid did:plc prefix'], +] + +describe('isDidPlc', () => { + it('returns true for various valid dids', () => { + for (const did of VALID) { + expect(isDidPlc(did)).toBe(true) + } + }) + + it('returns false for invalid dids', () => { + for (const [did] of INVALID) { + expect(isDidPlc(did)).toBe(false) + } + }) +}) + +describe('assertDidPlc', () => { + it('does not throw on valid dids', () => { + for (const did of VALID) { + expect(() => assertDidPlc(did)).not.toThrow() + } + }) + + it('throws if called with non string argument', () => { + for (const [val, message] of INVALID) { + expect(() => assertDidPlc(val)).toThrowError( + new InvalidDidError( + typeof val === 'string' ? val : typeof val, + message, + ), + ) + } + }) +}) + +describe('asDidPlc', () => { + it('returns the input for valid dids', () => { + for (const did of VALID) { + expect(asDidPlc(did)).toBe(did) + } + }) + + it('throws if called with invalid dids', () => { + for (const [val] of INVALID) { + expect(() => asDidPlc(val)).toThrowError(InvalidDidError) + } + }) +}) diff --git a/packages/did/tests/methods/web.test.ts b/packages/did/tests/methods/web.test.ts new file mode 100644 index 00000000000..61591653a07 --- /dev/null +++ b/packages/did/tests/methods/web.test.ts @@ -0,0 +1,109 @@ +import { InvalidDidError } from '../../src/did-error.js' +import { Did } from '../../src/did.js' +import { + asDidWeb, + assertDidWeb, + didWebToUrl, + isDidWeb, + urlToDidWeb, +} from '../../src/methods/web.js' + +const VALID: [Did<'web'>, string][] = [ + ['did:web:example.com', 'https://example.com/'], + ['did:web:sub.example.com', 'https://sub.example.com/'], + ['did:web:example.com%3A8080', 'https://example.com:8080/'], + [ + 'did:web:example.com:path:to:resource', + 'https://example.com/path/to/resource', + ], + [ + 'did:web:example.com%3A8080:path:to:resource', + 'https://example.com:8080/path/to/resource', + ], + [ + 'did:web:xn--b48h.com%3A8080:path:to:resource', + 'https://🙃.com:8080/path/to/resource', + ], +] + +const INVALID: [value: unknown, message: string][] = [ + ['did:web:', 'DID method-specific id must not be empty'], + ['did:web:foo@example.com', 'Disallowed character in DID at position 11'], + ['did:web::example.com', 'did:web MSID must not start with a colon'], + ['did:web:example.com:', 'DID cannot end with ":"'], + ['did:web:exam%3Aple.com%3A8080', 'Invalid Web DID'], + [3, 'DID must be a string'], + [{ toString: () => 'did:web:foo.com' }, 'DID must be a string'], + [[''], 'DID must be a string'], + ['random-string', 'Invalid did:web prefix'], + ['did web', 'Invalid did:web prefix'], + ['lorem ipsum dolor sit', 'Invalid did:web prefix'], +] + +describe('isDidWeb', () => { + it('returns true for various valid dids', () => { + for (const [did] of VALID) { + expect(isDidWeb(did)).toBe(true) + } + }) + + it('returns false for invalid dids', () => { + for (const did of INVALID) { + expect(isDidWeb(did)).toBe(false) + } + }) +}) + +describe('assertDidWeb', () => { + it('does not throw on valid dids', () => { + for (const [did] of VALID) { + expect(() => assertDidWeb(did)).not.toThrow() + } + }) + + it('throws if called with non string argument', () => { + for (const [val, message] of INVALID) { + expect(() => assertDidWeb(val)).toThrowError( + new InvalidDidError( + typeof val === 'string' ? val : typeof val, + message, + ), + ) + } + }) +}) + +describe('didWebToUrl', () => { + it('converts valid did:web to URL', () => { + for (const [did, url] of VALID) { + expect(didWebToUrl(did)).toStrictEqual(new URL(url)) + } + }) +}) + +describe('urlToDidWeb', () => { + it('converts URL to valid did:web', () => { + for (const [did, url] of VALID) { + expect(urlToDidWeb(new URL(url))).toBe(did) + } + }) +}) + +describe('asDidWeb', () => { + it('returns the input for valid dids', () => { + for (const [did] of VALID) { + expect(asDidWeb(did)).toBe(did) + } + }) + + it('throws if called with invalid dids', () => { + for (const [val, message] of INVALID) { + expect(() => asDidWeb(val)).toThrowError( + new InvalidDidError( + typeof val === 'string' ? val : typeof val, + message, + ), + ) + } + }) +}) diff --git a/packages/internal/did-resolver/src/did-resolver-base.ts b/packages/internal/did-resolver/src/did-resolver-base.ts index 93c9c24ff1e..5c31347e165 100644 --- a/packages/internal/did-resolver/src/did-resolver-base.ts +++ b/packages/internal/did-resolver/src/did-resolver-base.ts @@ -1,4 +1,4 @@ -import { FetchRequestError } from '@atproto-labs/fetch' +import { FetchError, FetchResponseError } from '@atproto-labs/fetch' import { Did, DidError, extractDidMethod } from '@atproto/did' import { ZodError } from 'zod' @@ -46,7 +46,12 @@ export class DidResolverBase return document as ResolvedDocument } catch (err) { - if (err instanceof FetchRequestError) { + if (err instanceof FetchResponseError) { + const status = err.response.status >= 500 ? 502 : err.response.status + throw new DidError(did, err.message, 'did-fetch-error', status, err) + } + + if (err instanceof FetchError) { throw new DidError(did, err.message, 'did-fetch-error', 400, err) } diff --git a/packages/internal/did-resolver/src/methods/plc.ts b/packages/internal/did-resolver/src/methods/plc.ts index 00125db1ef7..5d930ecd462 100644 --- a/packages/internal/did-resolver/src/methods/plc.ts +++ b/packages/internal/did-resolver/src/methods/plc.ts @@ -45,6 +45,7 @@ export class DidPlcMethod implements DidMethod<'plc'> { // should still check if the msid is valid. assertDidPlc(did) + // Should never throw const url = new URL(`/${encodeURIComponent(did)}`, this.plcDirectoryUrl) return this.fetch(url, { diff --git a/packages/internal/did-resolver/src/methods/web.ts b/packages/internal/did-resolver/src/methods/web.ts index 5130309884b..b366cde98ab 100644 --- a/packages/internal/did-resolver/src/methods/web.ts +++ b/packages/internal/did-resolver/src/methods/web.ts @@ -6,7 +6,7 @@ import { fetchOkProcessor, } from '@atproto-labs/fetch' import { pipe } from '@atproto-labs/pipe' -import { Did, didDocumentValidator, didWebToUrl } from '@atproto/did' +import { Did, didDocumentValidator, DidError, didWebToUrl } from '@atproto/did' import { DidMethod, ResolveDidOptions } from '../did-method.js' @@ -38,8 +38,10 @@ export class DidWebMethod implements DidMethod<'web'> { const didDocumentUrl = buildDidWebDocumentUrl(did) if (!this.allowHttp && didDocumentUrl.protocol === 'http:') { - throw new Error( - `Cannot resolve DID document for localhost: ${didDocumentUrl}`, + throw new DidError( + did, + 'Resolution of "http" did:web is not allowed', + 'did-web-http-not-allowed', ) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 88318f4e346..feb0d2272e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -521,6 +521,12 @@ importers: specifier: ^3.23.8 version: 3.23.8 devDependencies: + '@swc/jest': + specifier: ^0.2.24 + version: 0.2.24(@swc/core@1.3.42) + jest: + specifier: ^28.1.2 + version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.6.3 From 8fd5dcea9267bc1e1f91a5dd94f18481e3857354 Mon Sep 17 00:00:00 2001 From: Foysal Ahamed Date: Fri, 31 Jan 2025 11:46:45 -0800 Subject: [PATCH 039/101] :bug: Add account, record and identity events to the list of allowed event filter (#3464) :bug: Add account, record and identity events to he list of allowed event filter --- packages/ozone/src/api/util.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/ozone/src/api/util.ts b/packages/ozone/src/api/util.ts index 7d9c335c876..30cd23d1cd4 100644 --- a/packages/ozone/src/api/util.ts +++ b/packages/ozone/src/api/util.ts @@ -154,6 +154,9 @@ const eventTypes = new Set([ 'tools.ozone.moderation.defs#modEventResolveAppeal', 'tools.ozone.moderation.defs#modEventTag', 'tools.ozone.moderation.defs#modEventDivert', + 'tools.ozone.moderation.defs#accountEvent', + 'tools.ozone.moderation.defs#identityEvent', + 'tools.ozone.moderation.defs#recordEvent', ]) export const getMemberRole = (role: string) => { From d377d1a9be6bdd4508c090e37f47af15bca81540 Mon Sep 17 00:00:00 2001 From: Foysal Ahamed Date: Fri, 31 Jan 2025 11:48:10 -0800 Subject: [PATCH 040/101] :sparkles: Allow creating labels with expiry (#3476) * :sparkles: Allow creating labels with expiry * :broom: Cleanup --- lexicons/tools/ozone/moderation/defs.json | 4 +++ packages/api/src/client/lexicons.ts | 5 +++ .../types/tools/ozone/moderation/defs.ts | 2 ++ .../ozone/src/api/moderation/emitEvent.ts | 1 + packages/ozone/src/lexicon/lexicons.ts | 5 +++ .../types/tools/ozone/moderation/defs.ts | 2 ++ packages/ozone/src/mod-service/index.ts | 6 ++++ packages/ozone/src/mod-service/views.ts | 1 + packages/ozone/tests/moderation.test.ts | 36 ++++++++++++++++--- packages/pds/src/lexicon/lexicons.ts | 5 +++ .../types/tools/ozone/moderation/defs.ts | 2 ++ 11 files changed, 64 insertions(+), 5 deletions(-) diff --git a/lexicons/tools/ozone/moderation/defs.json b/lexicons/tools/ozone/moderation/defs.json index 23bba198f24..daa0c4e8a68 100644 --- a/lexicons/tools/ozone/moderation/defs.json +++ b/lexicons/tools/ozone/moderation/defs.json @@ -374,6 +374,10 @@ "negateLabelVals": { "type": "array", "items": { "type": "string" } + }, + "durationInHours": { + "type": "integer", + "description": "Indicates how long the label will remain on the subject. Only applies on labels that are being added." } } }, diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 36604fa13ae..b8f90be1cce 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -11549,6 +11549,11 @@ export const schemaDict = { type: 'string', }, }, + durationInHours: { + type: 'integer', + description: + 'Indicates how long the label will remain on the subject. Only applies on labels that are being added.', + }, }, }, modEventAcknowledge: { diff --git a/packages/api/src/client/types/tools/ozone/moderation/defs.ts b/packages/api/src/client/types/tools/ozone/moderation/defs.ts index df753c9cfc4..796e32d5749 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/defs.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/defs.ts @@ -347,6 +347,8 @@ export interface ModEventLabel { comment?: string createLabelVals: string[] negateLabelVals: string[] + /** Indicates how long the label will remain on the subject. Only applies on labels that are being added. */ + durationInHours?: number [k: string]: unknown } diff --git a/packages/ozone/src/api/moderation/emitEvent.ts b/packages/ozone/src/api/moderation/emitEvent.ts index 7bf337e005b..47b421ad53b 100644 --- a/packages/ozone/src/api/moderation/emitEvent.ts +++ b/packages/ozone/src/api/moderation/emitEvent.ts @@ -207,6 +207,7 @@ const handleModerationEvent = async ({ ? result.event.negateLabelVals.split(' ') : undefined, }, + result.event.durationInHours ?? undefined, ) } diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 36604fa13ae..b8f90be1cce 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -11549,6 +11549,11 @@ export const schemaDict = { type: 'string', }, }, + durationInHours: { + type: 'integer', + description: + 'Indicates how long the label will remain on the subject. Only applies on labels that are being added.', + }, }, }, modEventAcknowledge: { diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts index 572d323a298..e31a6d03dba 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts @@ -347,6 +347,8 @@ export interface ModEventLabel { comment?: string createLabelVals: string[] negateLabelVals: string[] + /** Indicates how long the label will remain on the subject. Only applies on labels that are being added. */ + durationInHours?: number [k: string]: unknown } diff --git a/packages/ozone/src/mod-service/index.ts b/packages/ozone/src/mod-service/index.ts index ff3891ed225..b298f28a43a 100644 --- a/packages/ozone/src/mod-service/index.ts +++ b/packages/ozone/src/mod-service/index.ts @@ -1159,13 +1159,19 @@ export class ModerationService { uri: string, cid: string | null, labels: { create?: string[]; negate?: string[] }, + durationInHours?: number, ): Promise { + const exp = + durationInHours !== undefined + ? addHoursToDate(durationInHours).toISOString() + : undefined const { create = [], negate = [] } = labels const toCreate = create.map((val) => ({ src: this.cfg.service.did, uri, cid: cid ?? undefined, val, + exp, cts: new Date().toISOString(), })) const toNegate = negate.map((val) => ({ diff --git a/packages/ozone/src/mod-service/views.ts b/packages/ozone/src/mod-service/views.ts index b52f8b47a9c..b4183f0a4d3 100644 --- a/packages/ozone/src/mod-service/views.ts +++ b/packages/ozone/src/mod-service/views.ts @@ -113,6 +113,7 @@ export class ModerationViews { [ 'tools.ozone.moderation.defs#modEventMuteReporter', 'tools.ozone.moderation.defs#modEventTakedown', + 'tools.ozone.moderation.defs#modEventLabel', 'tools.ozone.moderation.defs#modEventMute', ].includes(event.action) ) { diff --git a/packages/ozone/tests/moderation.test.ts b/packages/ozone/tests/moderation.test.ts index b3eae62a7d5..9b9bfb17c3c 100644 --- a/packages/ozone/tests/moderation.test.ts +++ b/packages/ozone/tests/moderation.test.ts @@ -24,6 +24,7 @@ import { EventReverser } from '../src' import { ImageInvalidator } from '../src/image-invalidator' import { TAKEDOWN_LABEL } from '../src/mod-service' import { ids } from '../src/lexicon/lexicons' +import { HOUR } from '@atproto/common' describe('moderation', () => { let network: TestNetwork @@ -514,6 +515,24 @@ describe('moderation', () => { await expect(getRepoLabels(sc.dids.bob)).resolves.toEqual(['kittens']) }) + it('creates expiring label', async () => { + await emitLabelEvent({ + createLabelVals: ['temp'], + negateLabelVals: [], + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.bob, + }, + durationInHours: 24, + }) + const repo = await getRepo(sc.dids.bob) + // Losely check that the expiry date is set to above 23 hours from now + expect( + `${repo?.labels?.[0].exp}` > + new Date(Date.now() + 23 * HOUR).toISOString(), + ).toBeTruthy() + }) + it('does not allow triage moderators to label.', async () => { const attemptLabel = modClient.emitEvent( { @@ -708,14 +727,16 @@ describe('moderation', () => { subject: ToolsOzoneModerationEmitEvent.InputSchema['subject'] createLabelVals: ModEventLabel['createLabelVals'] negateLabelVals: ModEventLabel['negateLabelVals'] + durationInHours?: ModEventLabel['durationInHours'] }, ) { - const { createLabelVals, negateLabelVals } = opts + const { createLabelVals, negateLabelVals, durationInHours } = opts const result = await modClient.emitEvent({ event: { $type: 'tools.ozone.moderation.defs#modEventLabel', createLabelVals, negateLabelVals, + durationInHours, }, createdBy: 'did:example:admin', reason: 'Y', @@ -740,7 +761,7 @@ describe('moderation', () => { } async function getRecordLabels(uri: string) { - const result = await agent.api.tools.ozone.moderation.getRecord( + const result = await agent.tools.ozone.moderation.getRecord( { uri }, { headers: await network.ozone.modHeaders( @@ -752,8 +773,8 @@ describe('moderation', () => { return labels.map((l) => l.val) } - async function getRepoLabels(did: string) { - const result = await agent.api.tools.ozone.moderation.getRepo( + async function getRepo(did: string) { + const result = await agent.tools.ozone.moderation.getRepo( { did }, { headers: await network.ozone.modHeaders( @@ -761,7 +782,12 @@ describe('moderation', () => { ), }, ) - const labels = result.data.labels ?? [] + return result.data + } + + async function getRepoLabels(did: string) { + const result = await getRepo(did) + const labels = result.labels ?? [] return labels.map((l) => l.val) } }) diff --git a/packages/pds/src/lexicon/lexicons.ts b/packages/pds/src/lexicon/lexicons.ts index 36604fa13ae..b8f90be1cce 100644 --- a/packages/pds/src/lexicon/lexicons.ts +++ b/packages/pds/src/lexicon/lexicons.ts @@ -11549,6 +11549,11 @@ export const schemaDict = { type: 'string', }, }, + durationInHours: { + type: 'integer', + description: + 'Indicates how long the label will remain on the subject. Only applies on labels that are being added.', + }, }, }, modEventAcknowledge: { diff --git a/packages/pds/src/lexicon/types/tools/ozone/moderation/defs.ts b/packages/pds/src/lexicon/types/tools/ozone/moderation/defs.ts index 572d323a298..e31a6d03dba 100644 --- a/packages/pds/src/lexicon/types/tools/ozone/moderation/defs.ts +++ b/packages/pds/src/lexicon/types/tools/ozone/moderation/defs.ts @@ -347,6 +347,8 @@ export interface ModEventLabel { comment?: string createLabelVals: string[] negateLabelVals: string[] + /** Indicates how long the label will remain on the subject. Only applies on labels that are being added. */ + durationInHours?: number [k: string]: unknown } From 7f52e67354906c3bf9830d7a2924ab58d6160905 Mon Sep 17 00:00:00 2001 From: Foysal Ahamed Date: Fri, 31 Jan 2025 12:01:17 -0800 Subject: [PATCH 041/101] :sparkles: Mark appeals as resolved when takedown is issued (#3352) * :sparkles: Mark appeals as resolved when takedown is issued * :sparkles: Only set appealed false if in appealed state * :memo: Add changeset --- .changeset/funny-beers-clap.md | 7 +++++++ packages/ozone/src/mod-service/status.ts | 2 ++ 2 files changed, 9 insertions(+) create mode 100644 .changeset/funny-beers-clap.md diff --git a/.changeset/funny-beers-clap.md b/.changeset/funny-beers-clap.md new file mode 100644 index 00000000000..ecd201f289d --- /dev/null +++ b/.changeset/funny-beers-clap.md @@ -0,0 +1,7 @@ +--- +"@atproto/ozone": patch +"@atproto/api": patch +"@atproto/pds": patch +--- + +Auto resolve appeals when taking down diff --git a/packages/ozone/src/mod-service/status.ts b/packages/ozone/src/mod-service/status.ts index 67fb3b4a20c..76f2fb08948 100644 --- a/packages/ozone/src/mod-service/status.ts +++ b/packages/ozone/src/mod-service/status.ts @@ -77,6 +77,8 @@ const getSubjectStatusForModerationEvent = ({ } case 'tools.ozone.moderation.defs#modEventTakedown': return { + // If we are doing a takedown, safe to move the item out of appealed state + ...(currentStatus?.appealed ? { appealed: false } : {}), takendown: true, lastReviewedBy: createdBy, reviewState: REVIEWCLOSED, From 52c687a05c70d5660fae1de9e1bbc6297f37f1f4 Mon Sep 17 00:00:00 2001 From: Daniel Holmgren Date: Fri, 31 Jan 2025 17:57:48 -0600 Subject: [PATCH 042/101] CBOR: parse safe uint64 as number (#3481) * parse safe uint64 as number * rename test --- .changeset/three-papayas-begin.md | 5 +++++ packages/common/src/ipld-multi.ts | 8 +++++++- packages/common/tests/ipld-multi.test.ts | 9 +++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 .changeset/three-papayas-begin.md diff --git a/.changeset/three-papayas-begin.md b/.changeset/three-papayas-begin.md new file mode 100644 index 00000000000..0b2f0513d91 --- /dev/null +++ b/.changeset/three-papayas-begin.md @@ -0,0 +1,5 @@ +--- +"@atproto/common": patch +--- + +Parse safe uint64 as number diff --git a/packages/common/src/ipld-multi.ts b/packages/common/src/ipld-multi.ts index 3b3f766d8b0..9ca9dc5ff81 100644 --- a/packages/common/src/ipld-multi.ts +++ b/packages/common/src/ipld-multi.ts @@ -18,9 +18,15 @@ cborx.addExtension({ }, }) +const decoder = new cborx.Decoder({ + // @ts-ignore + int64AsNumber: true, // not in types for some reason + useRecords: false, +}) + export const cborDecodeMulti = (encoded: Uint8Array): unknown[] => { const decoded: unknown[] = [] - cborx.decodeMultiple(encoded, (value) => { + decoder.decodeMultiple(encoded, (value) => { decoded.push(value) }) return decoded diff --git a/packages/common/tests/ipld-multi.test.ts b/packages/common/tests/ipld-multi.test.ts index 52604860064..6cdecccaef9 100644 --- a/packages/common/tests/ipld-multi.test.ts +++ b/packages/common/tests/ipld-multi.test.ts @@ -22,4 +22,13 @@ describe('ipld decode multi', () => { expect(decoded[0]).toEqual(one) expect(decoded[1]).toEqual(two) }) + + it('parses safe ints as number', async () => { + const one = { + test: Number.MAX_SAFE_INTEGER, + } + const encoded = cborEncode(one) + const decoded = cborDecodeMulti(encoded) + expect(Number.isInteger(decoded[0]?.['test'])).toBe(true) + }) }) From 1c195a384549ed371cdf7ce51495da37388f9c62 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 18:01:32 -0600 Subject: [PATCH 043/101] Version packages (#3442) Co-authored-by: github-actions[bot] --- .changeset/eighty-eggs-nail.md | 5 ----- .changeset/forty-carrots-doubt.md | 5 ----- .changeset/funny-beers-clap.md | 7 ------- .changeset/gorgeous-lies-warn.md | 5 ----- .changeset/lemon-adults-sparkle.md | 5 ----- .changeset/lovely-news-prove.md | 5 ----- .changeset/quiet-geese-begin.md | 5 ----- .changeset/rude-laws-join.md | 5 ----- .changeset/tall-kings-poke.md | 5 ----- .changeset/three-papayas-begin.md | 5 ----- .changeset/weak-jobs-serve.md | 5 ----- packages/api/CHANGELOG.md | 9 ++++++++ packages/api/package.json | 2 +- packages/aws/CHANGELOG.md | 9 ++++++++ packages/aws/package.json | 2 +- packages/bsky/CHANGELOG.md | 14 +++++++++++++ packages/bsky/package.json | 2 +- packages/bsync/CHANGELOG.md | 7 +++++++ packages/bsync/package.json | 2 +- packages/common/CHANGELOG.md | 6 ++++++ packages/common/package.json | 2 +- packages/dev-env/CHANGELOG.md | 14 +++++++++++++ packages/dev-env/package.json | 2 +- packages/did/CHANGELOG.md | 6 ++++++ packages/did/package.json | 2 +- packages/internal/did-resolver/CHANGELOG.md | 9 ++++++++ packages/internal/did-resolver/package.json | 2 +- .../handle-resolver-node/CHANGELOG.md | 8 +++++++ .../handle-resolver-node/package.json | 2 +- .../internal/handle-resolver/CHANGELOG.md | 7 +++++++ .../internal/handle-resolver/package.json | 2 +- .../internal/identity-resolver/CHANGELOG.md | 8 +++++++ .../internal/identity-resolver/package.json | 2 +- packages/internal/xrpc-utils/CHANGELOG.md | 8 +++++++ packages/internal/xrpc-utils/package.json | 2 +- .../oauth/oauth-client-browser/CHANGELOG.md | 10 +++++++++ .../oauth/oauth-client-browser/package.json | 2 +- packages/oauth/oauth-client-node/CHANGELOG.md | 10 +++++++++ packages/oauth/oauth-client-node/package.json | 2 +- packages/oauth/oauth-client/CHANGELOG.md | 11 ++++++++++ packages/oauth/oauth-client/package.json | 2 +- packages/oauth/oauth-provider/CHANGELOG.md | 7 +++++++ packages/oauth/oauth-provider/package.json | 2 +- packages/ozone/CHANGELOG.md | 17 +++++++++++++++ packages/ozone/package.json | 2 +- packages/pds/CHANGELOG.md | 21 +++++++++++++++++++ packages/pds/package.json | 2 +- packages/repo/CHANGELOG.md | 8 +++++++ packages/repo/package.json | 2 +- packages/sync/CHANGELOG.md | 9 ++++++++ packages/sync/package.json | 2 +- packages/xrpc-server/CHANGELOG.md | 13 ++++++++++++ packages/xrpc-server/package.json | 2 +- packages/xrpc/CHANGELOG.md | 6 ++++++ packages/xrpc/package.json | 2 +- 55 files changed, 239 insertions(+), 79 deletions(-) delete mode 100644 .changeset/eighty-eggs-nail.md delete mode 100644 .changeset/forty-carrots-doubt.md delete mode 100644 .changeset/funny-beers-clap.md delete mode 100644 .changeset/gorgeous-lies-warn.md delete mode 100644 .changeset/lemon-adults-sparkle.md delete mode 100644 .changeset/lovely-news-prove.md delete mode 100644 .changeset/quiet-geese-begin.md delete mode 100644 .changeset/rude-laws-join.md delete mode 100644 .changeset/tall-kings-poke.md delete mode 100644 .changeset/three-papayas-begin.md delete mode 100644 .changeset/weak-jobs-serve.md diff --git a/.changeset/eighty-eggs-nail.md b/.changeset/eighty-eggs-nail.md deleted file mode 100644 index 3c98610c03b..00000000000 --- a/.changeset/eighty-eggs-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/xrpc-server": patch ---- - -Export the `ResponseType` type used in the `XRPCError` constructor diff --git a/.changeset/forty-carrots-doubt.md b/.changeset/forty-carrots-doubt.md deleted file mode 100644 index f9b66fdcabe..00000000000 --- a/.changeset/forty-carrots-doubt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/ozone": patch ---- - -Code cleanup diff --git a/.changeset/funny-beers-clap.md b/.changeset/funny-beers-clap.md deleted file mode 100644 index ecd201f289d..00000000000 --- a/.changeset/funny-beers-clap.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@atproto/ozone": patch -"@atproto/api": patch -"@atproto/pds": patch ---- - -Auto resolve appeals when taking down diff --git a/.changeset/gorgeous-lies-warn.md b/.changeset/gorgeous-lies-warn.md deleted file mode 100644 index 541ffc83479..00000000000 --- a/.changeset/gorgeous-lies-warn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto-labs/did-resolver": patch ---- - -Improve error descriptions diff --git a/.changeset/lemon-adults-sparkle.md b/.changeset/lemon-adults-sparkle.md deleted file mode 100644 index 1b6104750ac..00000000000 --- a/.changeset/lemon-adults-sparkle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/ozone": patch ---- - -Fix typo in recordsStats's $type property diff --git a/.changeset/lovely-news-prove.md b/.changeset/lovely-news-prove.md deleted file mode 100644 index 62cb5f6e114..00000000000 --- a/.changeset/lovely-news-prove.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/did": patch ---- - -Fix encoding and decoding of did:web diff --git a/.changeset/quiet-geese-begin.md b/.changeset/quiet-geese-begin.md deleted file mode 100644 index 0f503d3cfd7..00000000000 --- a/.changeset/quiet-geese-begin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/xrpc-server": patch ---- - -Allow providing a custom `errorParser` option to XRPCServer diff --git a/.changeset/rude-laws-join.md b/.changeset/rude-laws-join.md deleted file mode 100644 index 894032e2262..00000000000 --- a/.changeset/rude-laws-join.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/xrpc": patch ---- - -Explicitly allow "undefined" values in `headers` diff --git a/.changeset/tall-kings-poke.md b/.changeset/tall-kings-poke.md deleted file mode 100644 index de58a7ff90f..00000000000 --- a/.changeset/tall-kings-poke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/pds": patch ---- - -Fix flaky tests diff --git a/.changeset/three-papayas-begin.md b/.changeset/three-papayas-begin.md deleted file mode 100644 index 0b2f0513d91..00000000000 --- a/.changeset/three-papayas-begin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/common": patch ---- - -Parse safe uint64 as number diff --git a/.changeset/weak-jobs-serve.md b/.changeset/weak-jobs-serve.md deleted file mode 100644 index 59de543c639..00000000000 --- a/.changeset/weak-jobs-serve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@atproto/pds": patch ---- - -Improve error reporting in case of failed PLC update operation diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 6c5179bf40c..b3ca864102f 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/api +## 0.13.32 + +### Patch Changes + +- [#3352](https://github.com/bluesky-social/atproto/pull/3352) [`7f52e6735`](https://github.com/bluesky-social/atproto/commit/7f52e67354906c3bf9830d7a2924ab58d6160905) Thanks [@foysalit](https://github.com/foysalit)! - Auto resolve appeals when taking down + +- Updated dependencies [[`fb64d50ee`](https://github.com/bluesky-social/atproto/commit/fb64d50ee220316b9f1183e5c3259629489734c9)]: + - @atproto/xrpc@0.6.7 + ## 0.13.31 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index 82978a9d811..4960c141a1d 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.13.31", + "version": "0.13.32", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ diff --git a/packages/aws/CHANGELOG.md b/packages/aws/CHANGELOG.md index 068696e3cde..b6d6739da25 100644 --- a/packages/aws/CHANGELOG.md +++ b/packages/aws/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/aws +## 0.2.13 + +### Patch Changes + +- Updated dependencies [[`52c687a05`](https://github.com/bluesky-social/atproto/commit/52c687a05c70d5660fae1de9e1bbc6297f37f1f4)]: + - @atproto/common@0.4.7 + - @atproto/crypto@0.4.3 + - @atproto/repo@0.6.3 + ## 0.2.12 ### Patch Changes diff --git a/packages/aws/package.json b/packages/aws/package.json index 47bd621e0ae..b277284b583 100644 --- a/packages/aws/package.json +++ b/packages/aws/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/aws", - "version": "0.2.12", + "version": "0.2.13", "license": "MIT", "description": "Shared AWS cloud API helpers for atproto services", "keywords": [ diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index 29a46b9a3df..9f7f0538a17 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,19 @@ # @atproto/bsky +## 0.0.113 + +### Patch Changes + +- Updated dependencies [[`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`7f52e6735`](https://github.com/bluesky-social/atproto/commit/7f52e67354906c3bf9830d7a2924ab58d6160905), [`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87), [`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`52c687a05`](https://github.com/bluesky-social/atproto/commit/52c687a05c70d5660fae1de9e1bbc6297f37f1f4)]: + - @atproto/xrpc-server@0.7.9 + - @atproto/api@0.13.32 + - @atproto/did@0.1.4 + - @atproto/common@0.4.7 + - @atproto-labs/xrpc-utils@0.0.5 + - @atproto/sync@0.1.12 + - @atproto/crypto@0.4.3 + - @atproto/repo@0.6.3 + ## 0.0.112 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 73db8c83dd8..796460106de 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.112", + "version": "0.0.113", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/bsync/CHANGELOG.md b/packages/bsync/CHANGELOG.md index 9da1d09e711..b9199f5a189 100644 --- a/packages/bsync/CHANGELOG.md +++ b/packages/bsync/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/bsync +## 0.0.12 + +### Patch Changes + +- Updated dependencies [[`52c687a05`](https://github.com/bluesky-social/atproto/commit/52c687a05c70d5660fae1de9e1bbc6297f37f1f4)]: + - @atproto/common@0.4.7 + ## 0.0.11 ### Patch Changes diff --git a/packages/bsync/package.json b/packages/bsync/package.json index f7865bede52..d9d48fe2f5a 100644 --- a/packages/bsync/package.json +++ b/packages/bsync/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsync", - "version": "0.0.11", + "version": "0.0.12", "license": "MIT", "description": "Sychronizing service for app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/common/CHANGELOG.md b/packages/common/CHANGELOG.md index d367fe5d148..d4f689a9837 100644 --- a/packages/common/CHANGELOG.md +++ b/packages/common/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/common +## 0.4.7 + +### Patch Changes + +- [#3481](https://github.com/bluesky-social/atproto/pull/3481) [`52c687a05`](https://github.com/bluesky-social/atproto/commit/52c687a05c70d5660fae1de9e1bbc6297f37f1f4) Thanks [@dholms](https://github.com/dholms)! - Parse safe uint64 as number + ## 0.4.6 ### Patch Changes diff --git a/packages/common/package.json b/packages/common/package.json index 4060a4c3027..a02a0492510 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/common", - "version": "0.4.6", + "version": "0.4.7", "license": "MIT", "description": "Shared web-platform-friendly code for atproto libraries", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index 16932d5c00e..d4f01bcf4e7 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,19 @@ # @atproto/dev-env +## 0.3.83 + +### Patch Changes + +- Updated dependencies [[`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`da7a831a7`](https://github.com/bluesky-social/atproto/commit/da7a831a7318343ba1ee98de3811ba337c043dbd), [`7f52e6735`](https://github.com/bluesky-social/atproto/commit/7f52e67354906c3bf9830d7a2924ab58d6160905), [`8810885b8`](https://github.com/bluesky-social/atproto/commit/8810885b8e7fa0377e6c000c091eec1dd85ed261), [`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`8810885b8`](https://github.com/bluesky-social/atproto/commit/8810885b8e7fa0377e6c000c091eec1dd85ed261), [`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75)]: + - @atproto/xrpc-server@0.7.9 + - @atproto/ozone@0.1.74 + - @atproto/api@0.13.32 + - @atproto/pds@0.4.91 + - @atproto/bsky@0.0.113 + - @atproto/sync@0.1.12 + - @atproto/bsync@0.0.12 + - @atproto/crypto@0.4.3 + ## 0.3.82 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index a6104c1fafd..8dad75d48c0 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.3.82", + "version": "0.3.83", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/did/CHANGELOG.md b/packages/did/CHANGELOG.md index bb87e9d5ed3..f2f30038474 100644 --- a/packages/did/CHANGELOG.md +++ b/packages/did/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/did +## 0.1.4 + +### Patch Changes + +- [#3454](https://github.com/bluesky-social/atproto/pull/3454) [`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fix encoding and decoding of did:web + ## 0.1.3 ### Patch Changes diff --git a/packages/did/package.json b/packages/did/package.json index a34ccd2bb43..b9d89b1d943 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/did", - "version": "0.1.3", + "version": "0.1.4", "license": "MIT", "description": "DID resolution and verification library", "keywords": [ diff --git a/packages/internal/did-resolver/CHANGELOG.md b/packages/internal/did-resolver/CHANGELOG.md index 46c68212291..a5290a84fe8 100644 --- a/packages/internal/did-resolver/CHANGELOG.md +++ b/packages/internal/did-resolver/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto-labs/did-resolver +## 0.1.9 + +### Patch Changes + +- [#3454](https://github.com/bluesky-social/atproto/pull/3454) [`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Improve error descriptions + +- Updated dependencies [[`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87)]: + - @atproto/did@0.1.4 + ## 0.1.8 ### Patch Changes diff --git a/packages/internal/did-resolver/package.json b/packages/internal/did-resolver/package.json index 3c8162419dd..b0717b4e995 100644 --- a/packages/internal/did-resolver/package.json +++ b/packages/internal/did-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/did-resolver", - "version": "0.1.8", + "version": "0.1.9", "license": "MIT", "description": "DID resolution and verification library", "keywords": [ diff --git a/packages/internal/handle-resolver-node/CHANGELOG.md b/packages/internal/handle-resolver-node/CHANGELOG.md index 7167efbf0d3..762e606b4da 100644 --- a/packages/internal/handle-resolver-node/CHANGELOG.md +++ b/packages/internal/handle-resolver-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto-labs/handle-resolver-node +## 0.1.12 + +### Patch Changes + +- Updated dependencies [[`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87)]: + - @atproto/did@0.1.4 + - @atproto-labs/handle-resolver@0.1.6 + ## 0.1.11 ### Patch Changes diff --git a/packages/internal/handle-resolver-node/package.json b/packages/internal/handle-resolver-node/package.json index b32221d7ce3..95436279198 100644 --- a/packages/internal/handle-resolver-node/package.json +++ b/packages/internal/handle-resolver-node/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/handle-resolver-node", - "version": "0.1.11", + "version": "0.1.12", "license": "MIT", "description": "Node specific ATProto handle to DID resolver", "keywords": [ diff --git a/packages/internal/handle-resolver/CHANGELOG.md b/packages/internal/handle-resolver/CHANGELOG.md index 20538c57ee5..672c17ff799 100644 --- a/packages/internal/handle-resolver/CHANGELOG.md +++ b/packages/internal/handle-resolver/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto-labs/handle-resolver +## 0.1.6 + +### Patch Changes + +- Updated dependencies [[`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87)]: + - @atproto/did@0.1.4 + ## 0.1.5 ### Patch Changes diff --git a/packages/internal/handle-resolver/package.json b/packages/internal/handle-resolver/package.json index 15908ac0c24..22efe8605ed 100644 --- a/packages/internal/handle-resolver/package.json +++ b/packages/internal/handle-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/handle-resolver", - "version": "0.1.5", + "version": "0.1.6", "license": "MIT", "description": "Isomorphic ATProto handle to DID resolver", "keywords": [ diff --git a/packages/internal/identity-resolver/CHANGELOG.md b/packages/internal/identity-resolver/CHANGELOG.md index 914790c809f..a69835949fe 100644 --- a/packages/internal/identity-resolver/CHANGELOG.md +++ b/packages/internal/identity-resolver/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto-labs/identity-resolver +## 0.1.11 + +### Patch Changes + +- Updated dependencies [[`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87)]: + - @atproto-labs/did-resolver@0.1.9 + - @atproto-labs/handle-resolver@0.1.6 + ## 0.1.10 ### Patch Changes diff --git a/packages/internal/identity-resolver/package.json b/packages/internal/identity-resolver/package.json index 8eee0567a9a..da95f9e9f70 100644 --- a/packages/internal/identity-resolver/package.json +++ b/packages/internal/identity-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/identity-resolver", - "version": "0.1.10", + "version": "0.1.11", "license": "MIT", "description": "A library resolving ATPROTO identities", "keywords": [ diff --git a/packages/internal/xrpc-utils/CHANGELOG.md b/packages/internal/xrpc-utils/CHANGELOG.md index 79220dbb390..9f68eb38da5 100644 --- a/packages/internal/xrpc-utils/CHANGELOG.md +++ b/packages/internal/xrpc-utils/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto-labs/xrpc-utils +## 0.0.5 + +### Patch Changes + +- Updated dependencies [[`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`fb64d50ee`](https://github.com/bluesky-social/atproto/commit/fb64d50ee220316b9f1183e5c3259629489734c9)]: + - @atproto/xrpc-server@0.7.9 + - @atproto/xrpc@0.6.7 + ## 0.0.4 ### Patch Changes diff --git a/packages/internal/xrpc-utils/package.json b/packages/internal/xrpc-utils/package.json index 935cc8a9e62..4e4304f4457 100644 --- a/packages/internal/xrpc-utils/package.json +++ b/packages/internal/xrpc-utils/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/xrpc-utils", - "version": "0.0.4", + "version": "0.0.5", "license": "MIT", "description": "XRPC server utilities for Node.JS", "keywords": [ diff --git a/packages/oauth/oauth-client-browser/CHANGELOG.md b/packages/oauth/oauth-client-browser/CHANGELOG.md index 27b107666fb..f0f0722c01a 100644 --- a/packages/oauth/oauth-client-browser/CHANGELOG.md +++ b/packages/oauth/oauth-client-browser/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/oauth-client-browser +## 0.3.8 + +### Patch Changes + +- Updated dependencies [[`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87), [`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87)]: + - @atproto-labs/did-resolver@0.1.9 + - @atproto/did@0.1.4 + - @atproto/oauth-client@0.3.8 + - @atproto-labs/handle-resolver@0.1.6 + ## 0.3.7 ### Patch Changes diff --git a/packages/oauth/oauth-client-browser/package.json b/packages/oauth/oauth-client-browser/package.json index 8b2e58d36b2..6f258e8227a 100644 --- a/packages/oauth/oauth-client-browser/package.json +++ b/packages/oauth/oauth-client-browser/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client-browser", - "version": "0.3.7", + "version": "0.3.8", "license": "MIT", "description": "ATPROTO OAuth client for the browser (relies on WebCrypto & Indexed DB)", "keywords": [ diff --git a/packages/oauth/oauth-client-node/CHANGELOG.md b/packages/oauth/oauth-client-node/CHANGELOG.md index 63db2e9e6ad..7b9ee7d32ab 100644 --- a/packages/oauth/oauth-client-node/CHANGELOG.md +++ b/packages/oauth/oauth-client-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/oauth-client-node +## 0.2.9 + +### Patch Changes + +- Updated dependencies [[`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87), [`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87)]: + - @atproto-labs/did-resolver@0.1.9 + - @atproto/did@0.1.4 + - @atproto/oauth-client@0.3.8 + - @atproto-labs/handle-resolver-node@0.1.12 + ## 0.2.8 ### Patch Changes diff --git a/packages/oauth/oauth-client-node/package.json b/packages/oauth/oauth-client-node/package.json index abd1f6efafb..eb5de30cc3a 100644 --- a/packages/oauth/oauth-client-node/package.json +++ b/packages/oauth/oauth-client-node/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client-node", - "version": "0.2.8", + "version": "0.2.9", "license": "MIT", "description": "ATPROTO OAuth client for the NodeJS", "keywords": [ diff --git a/packages/oauth/oauth-client/CHANGELOG.md b/packages/oauth/oauth-client/CHANGELOG.md index eed6a2857aa..bd1abda094b 100644 --- a/packages/oauth/oauth-client/CHANGELOG.md +++ b/packages/oauth/oauth-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @atproto/oauth-client +## 0.3.8 + +### Patch Changes + +- Updated dependencies [[`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87), [`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87), [`fb64d50ee`](https://github.com/bluesky-social/atproto/commit/fb64d50ee220316b9f1183e5c3259629489734c9)]: + - @atproto-labs/did-resolver@0.1.9 + - @atproto/did@0.1.4 + - @atproto/xrpc@0.6.7 + - @atproto-labs/identity-resolver@0.1.11 + - @atproto-labs/handle-resolver@0.1.6 + ## 0.3.7 ### Patch Changes diff --git a/packages/oauth/oauth-client/package.json b/packages/oauth/oauth-client/package.json index c59bf2446aa..04d7dea7e33 100644 --- a/packages/oauth/oauth-client/package.json +++ b/packages/oauth/oauth-client/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client", - "version": "0.3.7", + "version": "0.3.8", "license": "MIT", "description": "OAuth client for ATPROTO PDS. This package serves as common base for environment-specific implementations (NodeJS, Browser, React-Native).", "keywords": [ diff --git a/packages/oauth/oauth-provider/CHANGELOG.md b/packages/oauth/oauth-provider/CHANGELOG.md index 188fd0930f4..8026c2e2f81 100644 --- a/packages/oauth/oauth-provider/CHANGELOG.md +++ b/packages/oauth/oauth-provider/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/oauth-provider +## 0.2.16 + +### Patch Changes + +- Updated dependencies [[`52c687a05`](https://github.com/bluesky-social/atproto/commit/52c687a05c70d5660fae1de9e1bbc6297f37f1f4)]: + - @atproto/common@0.4.7 + ## 0.2.15 ### Patch Changes diff --git a/packages/oauth/oauth-provider/package.json b/packages/oauth/oauth-provider/package.json index 6c65a12c480..21fb54b806e 100644 --- a/packages/oauth/oauth-provider/package.json +++ b/packages/oauth/oauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider", - "version": "0.2.15", + "version": "0.2.16", "license": "MIT", "description": "Generic OAuth2 and OpenID Connect provider for Node.js. Currently only supports features needed for Atproto.", "keywords": [ diff --git a/packages/ozone/CHANGELOG.md b/packages/ozone/CHANGELOG.md index 9cc6c2b65af..d57ad6a54de 100644 --- a/packages/ozone/CHANGELOG.md +++ b/packages/ozone/CHANGELOG.md @@ -1,5 +1,22 @@ # @atproto/ozone +## 0.1.74 + +### Patch Changes + +- [#3437](https://github.com/bluesky-social/atproto/pull/3437) [`da7a831a7`](https://github.com/bluesky-social/atproto/commit/da7a831a7318343ba1ee98de3811ba337c043dbd) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Code cleanup + +- [#3352](https://github.com/bluesky-social/atproto/pull/3352) [`7f52e6735`](https://github.com/bluesky-social/atproto/commit/7f52e67354906c3bf9830d7a2924ab58d6160905) Thanks [@foysalit](https://github.com/foysalit)! - Auto resolve appeals when taking down + +- [#3463](https://github.com/bluesky-social/atproto/pull/3463) [`8810885b8`](https://github.com/bluesky-social/atproto/commit/8810885b8e7fa0377e6c000c091eec1dd85ed261) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fix typo in recordsStats's $type property + +- Updated dependencies [[`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`7f52e6735`](https://github.com/bluesky-social/atproto/commit/7f52e67354906c3bf9830d7a2924ab58d6160905), [`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`fb64d50ee`](https://github.com/bluesky-social/atproto/commit/fb64d50ee220316b9f1183e5c3259629489734c9), [`52c687a05`](https://github.com/bluesky-social/atproto/commit/52c687a05c70d5660fae1de9e1bbc6297f37f1f4)]: + - @atproto/xrpc-server@0.7.9 + - @atproto/api@0.13.32 + - @atproto/xrpc@0.6.7 + - @atproto/common@0.4.7 + - @atproto/crypto@0.4.3 + ## 0.1.73 ### Patch Changes diff --git a/packages/ozone/package.json b/packages/ozone/package.json index b783902b53d..45ee74b391e 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ozone", - "version": "0.1.73", + "version": "0.1.74", "license": "MIT", "description": "Backend service for moderating the Bluesky network.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index 77e5df5bd00..9d013841fab 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,26 @@ # @atproto/pds +## 0.4.91 + +### Patch Changes + +- [#3352](https://github.com/bluesky-social/atproto/pull/3352) [`7f52e6735`](https://github.com/bluesky-social/atproto/commit/7f52e67354906c3bf9830d7a2924ab58d6160905) Thanks [@foysalit](https://github.com/foysalit)! - Auto resolve appeals when taking down + +- [#3463](https://github.com/bluesky-social/atproto/pull/3463) [`8810885b8`](https://github.com/bluesky-social/atproto/commit/8810885b8e7fa0377e6c000c091eec1dd85ed261) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fix flaky tests + +- [#3439](https://github.com/bluesky-social/atproto/pull/3439) [`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Improve error reporting in case of failed PLC update operation + +- Updated dependencies [[`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`7f52e6735`](https://github.com/bluesky-social/atproto/commit/7f52e67354906c3bf9830d7a2924ab58d6160905), [`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`fb64d50ee`](https://github.com/bluesky-social/atproto/commit/fb64d50ee220316b9f1183e5c3259629489734c9), [`52c687a05`](https://github.com/bluesky-social/atproto/commit/52c687a05c70d5660fae1de9e1bbc6297f37f1f4)]: + - @atproto/xrpc-server@0.7.9 + - @atproto/api@0.13.32 + - @atproto/xrpc@0.6.7 + - @atproto/common@0.4.7 + - @atproto-labs/xrpc-utils@0.0.5 + - @atproto/aws@0.2.13 + - @atproto/crypto@0.4.3 + - @atproto/oauth-provider@0.2.16 + - @atproto/repo@0.6.3 + ## 0.4.90 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index c99bbc41799..06668d2ee54 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.90", + "version": "0.4.91", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ diff --git a/packages/repo/CHANGELOG.md b/packages/repo/CHANGELOG.md index 40bc230c983..4ce908fac26 100644 --- a/packages/repo/CHANGELOG.md +++ b/packages/repo/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/repo +## 0.6.3 + +### Patch Changes + +- Updated dependencies [[`52c687a05`](https://github.com/bluesky-social/atproto/commit/52c687a05c70d5660fae1de9e1bbc6297f37f1f4)]: + - @atproto/common@0.4.7 + - @atproto/crypto@0.4.3 + ## 0.6.2 ### Patch Changes diff --git a/packages/repo/package.json b/packages/repo/package.json index b17d0cf1b27..548759d9a77 100644 --- a/packages/repo/package.json +++ b/packages/repo/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/repo", - "version": "0.6.2", + "version": "0.6.3", "license": "MIT", "description": "atproto repo and MST implementation", "keywords": [ diff --git a/packages/sync/CHANGELOG.md b/packages/sync/CHANGELOG.md index 49ff04e5723..5a9f659f7ad 100644 --- a/packages/sync/CHANGELOG.md +++ b/packages/sync/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/sync +## 0.1.12 + +### Patch Changes + +- Updated dependencies [[`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75), [`52c687a05`](https://github.com/bluesky-social/atproto/commit/52c687a05c70d5660fae1de9e1bbc6297f37f1f4)]: + - @atproto/xrpc-server@0.7.9 + - @atproto/common@0.4.7 + - @atproto/repo@0.6.3 + ## 0.1.11 ### Patch Changes diff --git a/packages/sync/package.json b/packages/sync/package.json index 306e7b535c5..353c45b2fd8 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/sync", - "version": "0.1.11", + "version": "0.1.12", "license": "MIT", "description": "atproto sync library", "keywords": [ diff --git a/packages/xrpc-server/CHANGELOG.md b/packages/xrpc-server/CHANGELOG.md index 38786a39bff..78578a49a90 100644 --- a/packages/xrpc-server/CHANGELOG.md +++ b/packages/xrpc-server/CHANGELOG.md @@ -1,5 +1,18 @@ # @atproto/xrpc-server +## 0.7.9 + +### Patch Changes + +- [#3439](https://github.com/bluesky-social/atproto/pull/3439) [`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Export the `ResponseType` type used in the `XRPCError` constructor + +- [#3439](https://github.com/bluesky-social/atproto/pull/3439) [`4f2841efe`](https://github.com/bluesky-social/atproto/commit/4f2841efeb410e710e0c8da7c9204468f6256a75) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Allow providing a custom `errorParser` option to XRPCServer + +- Updated dependencies [[`fb64d50ee`](https://github.com/bluesky-social/atproto/commit/fb64d50ee220316b9f1183e5c3259629489734c9), [`52c687a05`](https://github.com/bluesky-social/atproto/commit/52c687a05c70d5660fae1de9e1bbc6297f37f1f4)]: + - @atproto/xrpc@0.6.7 + - @atproto/common@0.4.7 + - @atproto/crypto@0.4.3 + ## 0.7.8 ### Patch Changes diff --git a/packages/xrpc-server/package.json b/packages/xrpc-server/package.json index 4c5037995ac..21f52aa8d9f 100644 --- a/packages/xrpc-server/package.json +++ b/packages/xrpc-server/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/xrpc-server", - "version": "0.7.8", + "version": "0.7.9", "license": "MIT", "description": "atproto HTTP API (XRPC) server library", "keywords": [ diff --git a/packages/xrpc/CHANGELOG.md b/packages/xrpc/CHANGELOG.md index c19de445ef8..d5f666eff40 100644 --- a/packages/xrpc/CHANGELOG.md +++ b/packages/xrpc/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/xrpc +## 0.6.7 + +### Patch Changes + +- [#3456](https://github.com/bluesky-social/atproto/pull/3456) [`fb64d50ee`](https://github.com/bluesky-social/atproto/commit/fb64d50ee220316b9f1183e5c3259629489734c9) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Explicitly allow "undefined" values in `headers` + ## 0.6.6 ### Patch Changes diff --git a/packages/xrpc/package.json b/packages/xrpc/package.json index bc699f3318a..c3a2ecb8996 100644 --- a/packages/xrpc/package.json +++ b/packages/xrpc/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/xrpc", - "version": "0.6.6", + "version": "0.6.7", "license": "MIT", "description": "atproto HTTP API (XRPC) client library", "keywords": [ From 8f88623c99af699453e0117b6abed15be8cf9ec8 Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Sat, 1 Feb 2025 19:03:41 -0700 Subject: [PATCH 044/101] Fix typo in README (#3483) --- packages/api/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/README.md b/packages/api/README.md index ca9768453c5..41e7913d861 100644 --- a/packages/api/README.md +++ b/packages/api/README.md @@ -85,7 +85,7 @@ are available: - [@atproto/oauth-client-node](https://www.npmjs.com/package/@atproto/oauth-client-node): for Node.js. - [@atproto/oauth-client](https://www.npmjs.com/package/@atproto/oauth-client): - Lower lever; compatible with most JS engines. + Lower level; compatible with most JS engines. Every `@atproto/oauth-client-*` implementation has a different way to obtain an `OAuthSession` instance that can be used to instantiate an `Agent` (from From 8a30e0ed9239cb2037d54fb98e70e8b0cfbc3e39 Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 4 Feb 2025 11:37:48 -0800 Subject: [PATCH 045/101] [SH] fixes base (#3445) Co-authored-by: Eric Bailey --- .changeset/honest-windows-appear.md | 5 ++++ .changeset/rich-rocks-think.md | 5 ++++ .../src/data-plane/server/routes/follows.ts | 2 +- .../data-plane/server/routes/interactions.ts | 24 ++++++++++--------- .../src/data-plane/server/routes/likes.ts | 3 +-- .../src/data-plane/server/routes/lists.ts | 2 +- .../src/data-plane/server/routes/mutes.ts | 2 +- .../src/data-plane/server/routes/posts.ts | 2 +- .../src/data-plane/server/routes/profile.ts | 4 ++-- .../src/data-plane/server/routes/records.ts | 10 ++++---- .../data-plane/server/routes/relationships.ts | 18 +++++++------- .../src/data-plane/server/routes/reposts.ts | 3 +-- packages/common-web/src/arrays.ts | 16 ++++++------- 13 files changed, 53 insertions(+), 43 deletions(-) create mode 100644 .changeset/honest-windows-appear.md create mode 100644 .changeset/rich-rocks-think.md diff --git a/.changeset/honest-windows-appear.md b/.changeset/honest-windows-appear.md new file mode 100644 index 00000000000..33be6073426 --- /dev/null +++ b/.changeset/honest-windows-appear.md @@ -0,0 +1,5 @@ +--- +"@atproto/common-web": minor +--- + +Make keyBy typing stricter diff --git a/.changeset/rich-rocks-think.md b/.changeset/rich-rocks-think.md new file mode 100644 index 00000000000..330e675fb38 --- /dev/null +++ b/.changeset/rich-rocks-think.md @@ -0,0 +1,5 @@ +--- +"@atproto/bsky": patch +--- + +Replace undefined values with empty strings in mock dataplane diff --git a/packages/bsky/src/data-plane/server/routes/follows.ts b/packages/bsky/src/data-plane/server/routes/follows.ts index b4dd62654d3..8ef27fdfe05 100644 --- a/packages/bsky/src/data-plane/server/routes/follows.ts +++ b/packages/bsky/src/data-plane/server/routes/follows.ts @@ -18,7 +18,7 @@ export default (db: Database): Partial> => ({ .selectAll() .execute() const bySubject = keyBy(res, 'subjectDid') - const uris = targetDids.map((did) => bySubject[did]?.uri ?? '') + const uris = targetDids.map((did) => bySubject.get(did)?.uri ?? '') return { uris, } diff --git a/packages/bsky/src/data-plane/server/routes/interactions.ts b/packages/bsky/src/data-plane/server/routes/interactions.ts index a9ec11e0eed..2a0e00f2cfc 100644 --- a/packages/bsky/src/data-plane/server/routes/interactions.ts +++ b/packages/bsky/src/data-plane/server/routes/interactions.ts @@ -17,10 +17,10 @@ export default (db: Database): Partial> => ({ .execute() const byUri = keyBy(res, 'uri') return { - likes: uris.map((uri) => byUri[uri]?.likeCount ?? 0), - replies: uris.map((uri) => byUri[uri]?.replyCount ?? 0), - reposts: uris.map((uri) => byUri[uri]?.repostCount ?? 0), - quotes: uris.map((uri) => byUri[uri]?.quoteCount ?? 0), + likes: uris.map((uri) => byUri.get(uri)?.likeCount ?? 0), + replies: uris.map((uri) => byUri.get(uri)?.replyCount ?? 0), + reposts: uris.map((uri) => byUri.get(uri)?.repostCount ?? 0), + quotes: uris.map((uri) => byUri.get(uri)?.quoteCount ?? 0), } }, async getCountsForUsers(req) { @@ -52,12 +52,14 @@ export default (db: Database): Partial> => ({ .execute() const byDid = keyBy(res, 'did') return { - followers: req.dids.map((uri) => byDid[uri]?.followersCount ?? 0), - following: req.dids.map((uri) => byDid[uri]?.followsCount ?? 0), - posts: req.dids.map((uri) => byDid[uri]?.postsCount ?? 0), - lists: req.dids.map((uri) => byDid[uri]?.listsCount ?? 0), - feeds: req.dids.map((uri) => byDid[uri]?.feedGensCount ?? 0), - starterPacks: req.dids.map((uri) => byDid[uri]?.starterPacksCount ?? 0), + followers: req.dids.map((uri) => byDid.get(uri)?.followersCount ?? 0), + following: req.dids.map((uri) => byDid.get(uri)?.followsCount ?? 0), + posts: req.dids.map((uri) => byDid.get(uri)?.postsCount ?? 0), + lists: req.dids.map((uri) => byDid.get(uri)?.listsCount ?? 0), + feeds: req.dids.map((uri) => byDid.get(uri)?.feedGensCount ?? 0), + starterPacks: req.dids.map( + (uri) => byDid.get(uri)?.starterPacksCount ?? 0, + ), } }, async getStarterPackCounts(req) { @@ -105,7 +107,7 @@ export default (db: Database): Partial> => ({ .execute() const countsByUri = keyBy(countsListItems, 'uri') return { - listItems: uris.map((uri) => countsByUri[uri]?.count ?? 0), + listItems: uris.map((uri) => countsByUri.get(uri)?.count ?? 0), } }, }) diff --git a/packages/bsky/src/data-plane/server/routes/likes.ts b/packages/bsky/src/data-plane/server/routes/likes.ts index 00199dca77a..cb9af0b80d5 100644 --- a/packages/bsky/src/data-plane/server/routes/likes.ts +++ b/packages/bsky/src/data-plane/server/routes/likes.ts @@ -58,8 +58,7 @@ export default (db: Database): Partial> => ({ .selectAll() .execute() const bySubject = keyBy(res, 'subject') - // @TODO handling undefineds properly, or do we need to turn them into empty strings? - const uris = refs.map(({ uri }) => bySubject[uri]?.uri) + const uris = refs.map(({ uri }) => bySubject.get(uri)?.uri ?? '') return { uris } }, diff --git a/packages/bsky/src/data-plane/server/routes/lists.ts b/packages/bsky/src/data-plane/server/routes/lists.ts index d757b1d39e4..064d0e9c604 100644 --- a/packages/bsky/src/data-plane/server/routes/lists.ts +++ b/packages/bsky/src/data-plane/server/routes/lists.ts @@ -69,7 +69,7 @@ export default (db: Database): Partial> => ({ .selectAll() .execute() const byListUri = keyBy(res, 'listUri') - const listitemUris = listUris.map((uri) => byListUri[uri]?.uri ?? '') + const listitemUris = listUris.map((uri) => byListUri.get(uri)?.uri ?? '') return { listitemUris, } diff --git a/packages/bsky/src/data-plane/server/routes/mutes.ts b/packages/bsky/src/data-plane/server/routes/mutes.ts index 7e93af53acc..d941ffc66a8 100644 --- a/packages/bsky/src/data-plane/server/routes/mutes.ts +++ b/packages/bsky/src/data-plane/server/routes/mutes.ts @@ -180,7 +180,7 @@ export default (db: Database): Partial> => ({ .where('rootUri', 'in', threadRoots) .execute() const byRootUri = keyBy(res, 'rootUri') - const muted = threadRoots.map((uri) => !!byRootUri[uri]) + const muted = threadRoots.map((uri) => !!byRootUri.get(uri)) return { muted } }, }) diff --git a/packages/bsky/src/data-plane/server/routes/posts.ts b/packages/bsky/src/data-plane/server/routes/posts.ts index 8f90a34b3cc..b400490576d 100644 --- a/packages/bsky/src/data-plane/server/routes/posts.ts +++ b/packages/bsky/src/data-plane/server/routes/posts.ts @@ -15,7 +15,7 @@ export default (db: Database): Partial> => ({ .where('uri', 'in', uris) .execute() const byUri = keyBy(res, 'uri') - const counts = uris.map((uri) => byUri[uri]?.replyCount ?? 0) + const counts = uris.map((uri) => byUri.get(uri)?.replyCount ?? 0) return { counts } }, }) diff --git a/packages/bsky/src/data-plane/server/routes/profile.ts b/packages/bsky/src/data-plane/server/routes/profile.ts index ae3819ebd5a..7f56ff95a82 100644 --- a/packages/bsky/src/data-plane/server/routes/profile.ts +++ b/packages/bsky/src/data-plane/server/routes/profile.ts @@ -39,7 +39,7 @@ export default (db: Database): Partial> => ({ ]) const byDid = keyBy(handlesRes, 'did') const actors = dids.map((did, i) => { - const row = byDid[did] + const row = byDid.get(did) const chatDeclaration = parseRecordBytes( chatDeclarations.records[i].record, ) @@ -74,7 +74,7 @@ export default (db: Database): Partial> => ({ .selectAll() .execute() const byHandle = keyBy(res, 'handle') - const dids = handles.map((handle) => byHandle[handle]?.did ?? '') + const dids = handles.map((handle) => byHandle.get(handle)?.did ?? '') return { dids } }, diff --git a/packages/bsky/src/data-plane/server/routes/records.ts b/packages/bsky/src/data-plane/server/routes/records.ts index 769208c26c1..97c5c57375c 100644 --- a/packages/bsky/src/data-plane/server/routes/records.ts +++ b/packages/bsky/src/data-plane/server/routes/records.ts @@ -41,7 +41,7 @@ export const getRecords = : [] const byUri = keyBy(res, 'uri') const records: Record[] = req.uris.map((uri) => { - const row = byUri[uri] + const row = byUri.get(uri) const json = row ? row.json : JSON.stringify(null) const createdAtRaw = new Date(JSON.parse(json)?.['createdAt']) const createdAt = !isNaN(createdAtRaw.getTime()) @@ -88,10 +88,10 @@ export const getPostRecords = (db: Database) => { const byKey = keyBy(details, 'uri') const meta = req.uris.map((uri) => { return new PostRecordMeta({ - violatesThreadGate: !!byKey[uri]?.violatesThreadGate, - violatesEmbeddingRules: !!byKey[uri]?.violatesEmbeddingRules, - hasThreadGate: !!byKey[uri]?.hasThreadGate, - hasPostGate: !!byKey[uri]?.hasPostGate, + violatesThreadGate: !!byKey.get(uri)?.violatesThreadGate, + violatesEmbeddingRules: !!byKey.get(uri)?.violatesEmbeddingRules, + hasThreadGate: !!byKey.get(uri)?.hasThreadGate, + hasPostGate: !!byKey.get(uri)?.hasPostGate, }) }) return { records, meta } diff --git a/packages/bsky/src/data-plane/server/routes/relationships.ts b/packages/bsky/src/data-plane/server/routes/relationships.ts index a291db9d20e..b6a16d4b05f 100644 --- a/packages/bsky/src/data-plane/server/routes/relationships.ts +++ b/packages/bsky/src/data-plane/server/routes/relationships.ts @@ -72,16 +72,16 @@ export default (db: Database): Partial> => ({ .execute() const byDid = keyBy(res, 'did') const relationships = targetDids.map((did) => { - const row = byDid[did] ?? {} + const row = byDid.get(did) return { - muted: row.muted ?? false, - mutedByList: row.mutedByList ?? '', - blockedBy: row.blockedBy ?? '', - blocking: row.blocking ?? '', - blockedByList: row.blockedByList ?? '', - blockingByList: row.blockingByList ?? '', - following: row.following ?? '', - followedBy: row.followedBy ?? '', + muted: row?.muted ?? false, + mutedByList: row?.mutedByList ?? '', + blockedBy: row?.blockedBy ?? '', + blocking: row?.blocking ?? '', + blockedByList: row?.blockedByList ?? '', + blockingByList: row?.blockingByList ?? '', + following: row?.following ?? '', + followedBy: row?.followedBy ?? '', } }) return { relationships } diff --git a/packages/bsky/src/data-plane/server/routes/reposts.ts b/packages/bsky/src/data-plane/server/routes/reposts.ts index 9c6f72435c0..4b9e1f9f87b 100644 --- a/packages/bsky/src/data-plane/server/routes/reposts.ts +++ b/packages/bsky/src/data-plane/server/routes/reposts.ts @@ -45,8 +45,7 @@ export default (db: Database): Partial> => ({ .selectAll() .execute() const bySubject = keyBy(res, 'subject') - // @TODO handling undefineds properly, or do we need to turn them into empty strings? - const uris = refs.map(({ uri }) => bySubject[uri]?.uri) + const uris = refs.map(({ uri }) => bySubject.get(uri)?.uri ?? '') return { uris } }, diff --git a/packages/common-web/src/arrays.ts b/packages/common-web/src/arrays.ts index 69fb9415cbe..cfaa81e82cb 100644 --- a/packages/common-web/src/arrays.ts +++ b/packages/common-web/src/arrays.ts @@ -1,11 +1,11 @@ -export const keyBy = (arr: T[], key: string): Record => { - return arr.reduce( - (acc, cur) => { - acc[cur[key]] = cur - return acc - }, - {} as Record, - ) +export function keyBy( + arr: readonly T[], + key: K, +): Map { + return arr.reduce((acc, cur) => { + acc.set(cur[key], cur) + return acc + }, new Map()) } export const mapDefined = ( From 53a577fd4bfb1c7301e14db85b42f4758b053dee Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 5 Feb 2025 13:37:16 +0100 Subject: [PATCH 046/101] PDS: ActorStore Refactor (#3492) * Similification of the `pds` package by: - Removing `DetailedAccountStore` class (moving its logic inside `AccountManager`) - Factorizes image URL building into its own class (for easy re-use from `AccountManager`) - Adds an `AppView` class that exposes an `agent: AtpAgent` and url builder function (used by the `ImageUrlBuilder`). - Reworks the `ActorStore` to avoid circular dependency between `AccountManager` and `LocalViewerCreator` (needed because of first item) * tidy * move classes in their own file --- .changeset/serious-pears-sit.md | 5 + packages/pds/src/account-manager/index.ts | 41 ++++- .../pds/src/actor-store/actor-store-reader.ts | 45 ++++++ .../src/actor-store/actor-store-resources.ts | 8 + .../src/actor-store/actor-store-transactor.ts | 31 ++++ .../pds/src/actor-store/actor-store-writer.ts | 17 ++ .../actor-store/{index.ts => actor-store.ts} | 143 ++++------------- packages/pds/src/actor-store/blob/reader.ts | 21 ++- .../pds/src/actor-store/blob/transactor.ts | 15 ++ packages/pds/src/actor-store/record/reader.ts | 127 ++++++++++++++- packages/pds/src/actor-store/repo/reader.ts | 4 +- .../src/actor-store/repo/sql-repo-reader.ts | 5 +- .../pds/src/actor-store/repo/transactor.ts | 17 +- .../src/api/app/bsky/actor/getPreferences.ts | 3 +- .../pds/src/api/app/bsky/actor/getProfile.ts | 4 +- .../pds/src/api/app/bsky/actor/getProfiles.ts | 4 +- .../src/api/app/bsky/actor/putPreferences.ts | 3 +- .../src/api/app/bsky/feed/getActorLikes.ts | 4 +- .../src/api/app/bsky/feed/getAuthorFeed.ts | 4 +- packages/pds/src/api/app/bsky/feed/getFeed.ts | 8 +- .../src/api/app/bsky/feed/getPostThread.ts | 15 +- .../pds/src/api/app/bsky/feed/getTimeline.ts | 4 +- .../api/app/bsky/notification/registerPush.ts | 9 +- .../api/com/atproto/identity/resolveHandle.ts | 24 ++- .../src/api/com/atproto/repo/importRepo.ts | 27 +--- .../pds/src/api/com/atproto/repo/putRecord.ts | 17 +- packages/pds/src/bsky-app-view.ts | 26 ++++ packages/pds/src/context.ts | 50 +++--- packages/pds/src/db/db.ts | 4 +- packages/pds/src/image/image-url-builder.ts | 16 ++ .../pds/src/oauth/detailed-account-store.ts | 96 ------------ packages/pds/src/oauth/provider.ts | 17 +- packages/pds/src/read-after-write/util.ts | 3 +- packages/pds/src/read-after-write/viewer.ts | 146 +++++------------- packages/pds/src/scripts/rebuild-repo.ts | 65 +------- packages/pds/tests/blob-deletes.test.ts | 6 +- packages/pds/tests/crud.test.ts | 18 +-- 37 files changed, 522 insertions(+), 530 deletions(-) create mode 100644 .changeset/serious-pears-sit.md create mode 100644 packages/pds/src/actor-store/actor-store-reader.ts create mode 100644 packages/pds/src/actor-store/actor-store-resources.ts create mode 100644 packages/pds/src/actor-store/actor-store-transactor.ts create mode 100644 packages/pds/src/actor-store/actor-store-writer.ts rename packages/pds/src/actor-store/{index.ts => actor-store.ts} (59%) create mode 100644 packages/pds/src/bsky-app-view.ts create mode 100644 packages/pds/src/image/image-url-builder.ts delete mode 100644 packages/pds/src/oauth/detailed-account-store.ts diff --git a/.changeset/serious-pears-sit.md b/.changeset/serious-pears-sit.md new file mode 100644 index 00000000000..fc3a4fb8579 --- /dev/null +++ b/.changeset/serious-pears-sit.md @@ -0,0 +1,5 @@ +--- +"@atproto/pds": patch +--- + +Code refactor diff --git a/packages/pds/src/account-manager/index.ts b/packages/pds/src/account-manager/index.ts index b646e69bf7c..848aaab04b8 100644 --- a/packages/pds/src/account-manager/index.ts +++ b/packages/pds/src/account-manager/index.ts @@ -1,5 +1,6 @@ import { HOUR, wait } from '@atproto/common' import { + Account, AccountInfo, AccountStore, Code, @@ -20,12 +21,15 @@ import { UpdateRequestData, } from '@atproto/oauth-provider' import { AuthRequiredError } from '@atproto/xrpc-server' +import { Selectable } from 'kysely' import { CID } from 'multiformats/cid' import { KeyObject } from 'node:crypto' +import { ActorStore } from '../actor-store/actor-store' import { AuthScope } from '../auth-verifier' import { BackgroundQueue } from '../background' import { softDeleted } from '../db' +import { ImageUrlBuilder } from '../image/image-url-builder' import { StatusAttr } from '../lexicon/types/com/atproto/admin/defs' import { AccountDb, EmailTokenPurpose, getDb, getMigrator } from './db' import * as account from './helpers/account' @@ -50,6 +54,8 @@ export class AccountManager db: AccountDb constructor( + private actorStore: ActorStore, + private imageUrlBuilder: ImageUrlBuilder, private backgroundQueue: BackgroundQueue, dbLocation: string, private jwtKey: KeyObject, @@ -500,6 +506,29 @@ export class AccountManager // AccountStore + private async buildAccount(row: Selectable): Promise { + const account = deviceAccount.toAccount(row, this.serviceDid) + + if (!account.name || !account.picture) { + const did = account.sub + + const profile = await this.actorStore.read(did, async (store) => { + return store.record.getProfileRecord() + }) + + if (profile) { + const { avatar, displayName } = profile + + account.name ||= displayName + account.picture ||= avatar + ? this.imageUrlBuilder.build('avatar', did, avatar.ref.toString()) + : undefined + } + } + + return account + } + async authenticateAccount( { username: identifier, password, remember = false }: SignInCredentials, deviceId: DeviceId, @@ -554,7 +583,7 @@ export class AccountManager if (!row) return null return { - account: deviceAccount.toAccount(row, this.serviceDid), + account: await this.buildAccount(row), info: deviceAccount.toDeviceAccountInfo(row), } } @@ -564,10 +593,12 @@ export class AccountManager .listRememberedQB(this.db, deviceId) .execute() - return rows.map((row) => ({ - account: deviceAccount.toAccount(row, this.serviceDid), - info: deviceAccount.toDeviceAccountInfo(row), - })) + return Promise.all( + rows.map(async (row) => ({ + account: await this.buildAccount(row), + info: deviceAccount.toDeviceAccountInfo(row), + })), + ) } async removeDeviceAccount(deviceId: DeviceId, sub: string): Promise { diff --git a/packages/pds/src/actor-store/actor-store-reader.ts b/packages/pds/src/actor-store/actor-store-reader.ts new file mode 100644 index 00000000000..ad5abab7ef1 --- /dev/null +++ b/packages/pds/src/actor-store/actor-store-reader.ts @@ -0,0 +1,45 @@ +import { Keypair } from '@atproto/crypto' +import { ActorStoreResources } from './actor-store-resources' +import { ActorDb } from './db' +import { PreferenceReader } from './preference/reader' +import { RecordReader } from './record/reader' +import { RepoReader } from './repo/reader' +import { ActorStoreTransactor } from './actor-store-transactor' + +export class ActorStoreReader { + public readonly repo: RepoReader + public readonly record: RecordReader + public readonly pref: PreferenceReader + + constructor( + public readonly did: string, + protected readonly db: ActorDb, + protected readonly resources: ActorStoreResources, + public readonly keypair: () => Promise, + ) { + const blobstore = resources.blobstore(did) + + this.repo = new RepoReader(db, blobstore) + this.record = new RecordReader(db) + this.pref = new PreferenceReader(db) + + // Invoke "keypair" once. Also avoids leaking "this" as keypair context. + let keypairPromise: Promise + this.keypair = () => (keypairPromise ??= Promise.resolve().then(keypair)) + } + + async transact( + fn: (fn: ActorStoreTransactor) => T | PromiseLike, + ): Promise { + const keypair = await this.keypair() + return this.db.transaction((dbTxn) => { + const store = new ActorStoreTransactor( + this.did, + dbTxn, + keypair, + this.resources, + ) + return fn(store) + }) + } +} diff --git a/packages/pds/src/actor-store/actor-store-resources.ts b/packages/pds/src/actor-store/actor-store-resources.ts new file mode 100644 index 00000000000..c78eb95d27a --- /dev/null +++ b/packages/pds/src/actor-store/actor-store-resources.ts @@ -0,0 +1,8 @@ +import { BlobStore } from '@atproto/repo' +import { BackgroundQueue } from '../background' + +export type ActorStoreResources = { + blobstore: (did: string) => BlobStore + backgroundQueue: BackgroundQueue + reservedKeyDir?: string +} diff --git a/packages/pds/src/actor-store/actor-store-transactor.ts b/packages/pds/src/actor-store/actor-store-transactor.ts new file mode 100644 index 00000000000..497d9f4a0c6 --- /dev/null +++ b/packages/pds/src/actor-store/actor-store-transactor.ts @@ -0,0 +1,31 @@ +import { Keypair } from '@atproto/crypto' +import { ActorStoreResources } from './actor-store-resources' +import { ActorDb } from './db' +import { PreferenceTransactor } from './preference/transactor' +import { RecordTransactor } from './record/transactor' +import { RepoTransactor } from './repo/transactor' + +export class ActorStoreTransactor { + public readonly record: RecordTransactor + public readonly repo: RepoTransactor + public readonly pref: PreferenceTransactor + + constructor( + public readonly did: string, + protected readonly db: ActorDb, + protected readonly keypair: Keypair, + protected readonly resources: ActorStoreResources, + ) { + const blobstore = resources.blobstore(did) + + this.record = new RecordTransactor(db, blobstore) + this.pref = new PreferenceTransactor(db) + this.repo = new RepoTransactor( + db, + blobstore, + did, + keypair, + resources.backgroundQueue, + ) + } +} diff --git a/packages/pds/src/actor-store/actor-store-writer.ts b/packages/pds/src/actor-store/actor-store-writer.ts new file mode 100644 index 00000000000..2571479515e --- /dev/null +++ b/packages/pds/src/actor-store/actor-store-writer.ts @@ -0,0 +1,17 @@ +import { ActorStoreTransactor } from './actor-store-transactor' + +export class ActorStoreWriter extends ActorStoreTransactor { + async transact( + fn: (fn: ActorStoreTransactor) => T | PromiseLike, + ): Promise { + return this.db.transaction((dbTxn) => { + const transactor = new ActorStoreTransactor( + this.did, + dbTxn, + this.keypair, + this.resources, + ) + return fn(transactor) + }) + } +} diff --git a/packages/pds/src/actor-store/index.ts b/packages/pds/src/actor-store/actor-store.ts similarity index 59% rename from packages/pds/src/actor-store/index.ts rename to packages/pds/src/actor-store/actor-store.ts index 281ae10b7b4..414c52455da 100644 --- a/packages/pds/src/actor-store/index.ts +++ b/packages/pds/src/actor-store/actor-store.ts @@ -1,35 +1,23 @@ -import path from 'path' -import assert from 'assert' -import fs from 'fs/promises' -import * as crypto from '@atproto/crypto' -import { Keypair, ExportableKeypair } from '@atproto/crypto' -import { BlobStore } from '@atproto/repo' import { chunkArray, fileExists, readIfExists, rmIfExists, } from '@atproto/common' -import { ActorDb, getDb, getMigrator } from './db' -import { BackgroundQueue } from '../background' -import { RecordReader } from './record/reader' -import { PreferenceReader } from './preference/reader' -import { RepoReader } from './repo/reader' -import { RepoTransactor } from './repo/transactor' -import { PreferenceTransactor } from './preference/transactor' +import * as crypto from '@atproto/crypto' +import { ExportableKeypair, Keypair } from '@atproto/crypto' import { InvalidRequestError } from '@atproto/xrpc-server' -import { RecordTransactor } from './record/transactor' -import { CID } from 'multiformats/cid' -import DiskBlobStore from '../disk-blobstore' -import { mkdir } from 'fs/promises' +import assert from 'node:assert' +import fs, { mkdir } from 'node:fs/promises' +import path from 'node:path' import { ActorStoreConfig } from '../config' import { retrySqlite } from '../db' - -type ActorStoreResources = { - blobstore: (did: string) => BlobStore - backgroundQueue: BackgroundQueue - reservedKeyDir?: string -} +import DiskBlobStore from '../disk-blobstore' +import { ActorStoreReader } from './actor-store-reader' +import { ActorStoreResources } from './actor-store-resources' +import { ActorStoreTransactor } from './actor-store-transactor' +import { ActorStoreWriter } from './actor-store-writer' +import { ActorDb, getDb, getMigrator } from './db' export class ActorStore { reservedKeyDir: string @@ -82,50 +70,39 @@ export class ActorStore { return db } - async read(did: string, fn: ActorStoreReadFn) { + async read(did: string, fn: (fn: ActorStoreReader) => T | PromiseLike) { const db = await this.openDb(did) try { - const reader = createActorReader(did, db, this.resources, () => - this.keypair(did), - ) - return await fn(reader) + const getKeypair = () => this.keypair(did) + return await fn(new ActorStoreReader(did, db, this.resources, getKeypair)) } finally { db.close() } } - async transact(did: string, fn: ActorStoreTransactFn) { + async transact( + did: string, + fn: (fn: ActorStoreTransactor) => T | PromiseLike, + ) { const keypair = await this.keypair(did) const db = await this.openDb(did) try { return await db.transaction((dbTxn) => { - const store = createActorTransactor(did, dbTxn, keypair, this.resources) - return fn(store) + return fn(new ActorStoreTransactor(did, dbTxn, keypair, this.resources)) }) } finally { db.close() } } - async writeNoTransaction(did: string, fn: ActorStoreWriterFn) { + async writeNoTransaction( + did: string, + fn: (fn: ActorStoreWriter) => T | PromiseLike, + ) { const keypair = await this.keypair(did) const db = await this.openDb(did) try { - const writer = createActorTransactor(did, db, keypair, this.resources) - return await fn({ - ...writer, - transact: async (fn: ActorStoreTransactFn): Promise => { - return db.transaction((dbTxn) => { - const transactor = createActorTransactor( - did, - dbTxn, - keypair, - this.resources, - ) - return fn(transactor) - }) - }, - }) + return await fn(new ActorStoreWriter(did, db, keypair, this.resources)) } finally { db.close() } @@ -157,10 +134,9 @@ export class ActorStore { if (blobstore instanceof DiskBlobStore) { await blobstore.deleteAll() } else { - const blobRows = await this.read(did, (store) => - store.db.db.selectFrom('blob').select('cid').execute(), + const cids = await this.read(did, async (store) => + store.repo.blob.getBlobCids(), ) - const cids = blobRows.map((row) => CID.parse(row.cid)) await Promise.allSettled( chunkArray(cids, 500).map((chunk) => blobstore.deleteMany(chunk)), ) @@ -226,73 +202,6 @@ const loadKey = async (loc: string): Promise => { return crypto.Secp256k1Keypair.import(privKey, { exportable: true }) } -const createActorTransactor = ( - did: string, - db: ActorDb, - keypair: Keypair, - resources: ActorStoreResources, -): ActorStoreTransactor => { - const { blobstore, backgroundQueue } = resources - const userBlobstore = blobstore(did) - return { - did, - db, - repo: new RepoTransactor(db, did, keypair, userBlobstore, backgroundQueue), - record: new RecordTransactor(db, userBlobstore), - pref: new PreferenceTransactor(db), - } -} - -const createActorReader = ( - did: string, - db: ActorDb, - resources: ActorStoreResources, - getKeypair: () => Promise, -): ActorStoreReader => { - const { blobstore } = resources - return { - did, - db, - repo: new RepoReader(db, blobstore(did)), - record: new RecordReader(db), - pref: new PreferenceReader(db), - keypair: getKeypair, - transact: async (fn: ActorStoreTransactFn): Promise => { - const keypair = await getKeypair() - return db.transaction((dbTxn) => { - const store = createActorTransactor(did, dbTxn, keypair, resources) - return fn(store) - }) - }, - } -} - -export type ActorStoreReadFn = (fn: ActorStoreReader) => Promise -export type ActorStoreTransactFn = (fn: ActorStoreTransactor) => Promise -export type ActorStoreWriterFn = (fn: ActorStoreWriter) => Promise - -export type ActorStoreReader = { - did: string - db: ActorDb - repo: RepoReader - record: RecordReader - pref: PreferenceReader - keypair: () => Promise - transact: (fn: ActorStoreTransactFn) => Promise -} - -export type ActorStoreTransactor = { - did: string - db: ActorDb - repo: RepoTransactor - record: RecordTransactor - pref: PreferenceTransactor -} - -export type ActorStoreWriter = ActorStoreTransactor & { - transact: (fn: ActorStoreTransactFn) => Promise -} - function assertSafePathPart(part: string) { const normalized = path.normalize(part) assert( diff --git a/packages/pds/src/actor-store/blob/reader.ts b/packages/pds/src/actor-store/blob/reader.ts index 20192f8641c..6ab87d1ad84 100644 --- a/packages/pds/src/actor-store/blob/reader.ts +++ b/packages/pds/src/actor-store/blob/reader.ts @@ -1,10 +1,10 @@ -import stream from 'stream' -import { CID } from 'multiformats/cid' import { BlobNotFoundError, BlobStore } from '@atproto/repo' import { InvalidRequestError } from '@atproto/xrpc-server' -import { ActorDb } from '../db' +import { CID } from 'multiformats/cid' +import stream from 'stream' import { countAll, countDistinct, notSoftDeletedClause } from '../../db/util' import { StatusAttr } from '../../lexicon/types/com/atproto/admin/defs' +import { ActorDb } from '../db' export class BlobReader { constructor( @@ -95,6 +95,16 @@ export class BlobReader { return res.map((row) => row.recordUri) } + async getBlobsForRecord(recordUri: string): Promise { + const res = await this.db.db + .selectFrom('blob') + .innerJoin('record_blob', 'record_blob.blobCid', 'blob.cid') + .where('recordUri', '=', recordUri) + .select('blob.cid') + .execute() + return res.map((row) => row.cid) + } + async blobCount(): Promise { const res = await this.db.db .selectFrom('blob') @@ -138,4 +148,9 @@ export class BlobReader { recordUri: row.recordUri, })) } + + async getBlobCids() { + const blobRows = await this.db.db.selectFrom('blob').select('cid').execute() + return blobRows.map((row) => CID.parse(row.cid)) + } } diff --git a/packages/pds/src/actor-store/blob/transactor.ts b/packages/pds/src/actor-store/blob/transactor.ts index fa937e6bec6..08674e17b95 100644 --- a/packages/pds/src/actor-store/blob/transactor.ts +++ b/packages/pds/src/actor-store/blob/transactor.ts @@ -38,6 +38,21 @@ export class BlobTransactor extends BlobReader { super(db, blobstore) } + async insertBlobs(recordUri: string, blobs: Iterable) { + const values = Array.from(blobs, (cid) => ({ + recordUri, + blobCid: cid.ref.toString(), + })) + + if (values.length) { + await this.db.db + .insertInto('record_blob') + .values(values) + .onConflict((oc) => oc.doNothing()) + .execute() + } + } + async uploadBlobAndGetMetadata( userSuggestedMime: string, blobStream: stream.Readable, diff --git a/packages/pds/src/actor-store/record/reader.ts b/packages/pds/src/actor-store/record/reader.ts index 7c7b3383439..10cd139a589 100644 --- a/packages/pds/src/actor-store/record/reader.ts +++ b/packages/pds/src/actor-store/record/reader.ts @@ -1,12 +1,21 @@ +import { RepoRecord } from '@atproto/lexicon' +import { cborToLexRecord, CidSet, formatDataKey } from '@atproto/repo' import * as syntax from '@atproto/syntax' import { AtUri, ensureValidAtUri } from '@atproto/syntax' -import { cborToLexRecord } from '@atproto/repo' import { CID } from 'multiformats/cid' import { countAll, notSoftDeletedClause } from '../../db/util' import { ids } from '../../lexicon/lexicons' -import { ActorDb, Backlink } from '../db' +import { Record as ProfileRecord } from '../../lexicon/types/app/bsky/actor/profile' +import { Record as PostRecord } from '../../lexicon/types/app/bsky/feed/post' import { StatusAttr } from '../../lexicon/types/com/atproto/admin/defs' -import { RepoRecord } from '@atproto/lexicon' +import { LocalRecords } from '../../read-after-write/types' +import { ActorDb, Backlink } from '../db' + +export type RecordDescript = { + uri: string + path: string + cid: CID +} export class RecordReader { constructor(public db: ActorDb) {} @@ -19,6 +28,30 @@ export class RecordReader { return res?.count ?? 0 } + async listAll(): Promise { + const records: RecordDescript[] = [] + let cursor: string | undefined = '' + while (cursor !== undefined) { + const res = await this.db.db + .selectFrom('record') + .select(['uri', 'cid']) + .where('uri', '>', cursor) + .orderBy('uri', 'asc') + .limit(1000) + .execute() + for (const row of res) { + const parsed = new AtUri(row.uri) + records.push({ + uri: row.uri, + path: formatDataKey(parsed.collection, parsed.rkey), + cid: CID.parse(row.cid), + }) + } + cursor = res.at(-1)?.uri + } + return records + } + async listCollections(): Promise { const collections = await this.db.db .selectFrom('record') @@ -194,6 +227,94 @@ export class RecordReader { .flat() .map(({ rkey }) => AtUri.make(uri.hostname, uri.collection, rkey)) } + + async listExistingBlocks(): Promise { + const cids = new CidSet() + let cursor: string | undefined = '' + while (cursor !== undefined) { + const res = await this.db.db + .selectFrom('repo_block') + .select('cid') + .where('cid', '>', cursor) + .orderBy('cid', 'asc') + .limit(1000) + .execute() + for (const row of res) { + cids.add(CID.parse(row.cid)) + } + cursor = res.at(-1)?.cid + } + return cids + } + + async getProfileRecord() { + const row = await this.db.db + .selectFrom('record') + .leftJoin('repo_block', 'repo_block.cid', 'record.cid') + .where('record.collection', '=', ids.AppBskyActorProfile) + .where('record.rkey', '=', 'self') + .selectAll() + .executeTakeFirst() + + if (!row?.content) return null + + return cborToLexRecord(row.content) as ProfileRecord + } + + async getRecordsSinceRev(rev: string): Promise { + const result: LocalRecords = { count: 0, profile: null, posts: [] } + + const res = await this.db.db + .selectFrom('record') + .innerJoin('repo_block', 'repo_block.cid', 'record.cid') + .select([ + 'repo_block.content', + 'uri', + 'repo_block.cid', + 'record.indexedAt', + ]) + .where('record.repoRev', '>', rev) + .limit(10) + .orderBy('record.repoRev', 'asc') + .execute() + + // sanity check to ensure that the clock received is not before _all_ local records (for instance in case of account migration) + if (res.length > 0) { + const sanityCheckRes = await this.db.db + .selectFrom('record') + .selectAll() + .where('record.repoRev', '<=', rev) + .limit(1) + .executeTakeFirst() + + if (!sanityCheckRes) { + return result + } + } + + for (const cur of res) { + result.count++ + + const uri = new AtUri(cur.uri) + if (uri.collection === ids.AppBskyActorProfile && uri.rkey === 'self') { + result.profile = { + uri, + cid: CID.parse(cur.cid), + indexedAt: cur.indexedAt, + record: cborToLexRecord(cur.content) as ProfileRecord, + } + } else if (uri.collection === ids.AppBskyFeedPost) { + result.posts.push({ + uri, + cid: CID.parse(cur.cid), + indexedAt: cur.indexedAt, + record: cborToLexRecord(cur.content) as PostRecord, + }) + } + } + + return result + } } // @NOTE in the future this can be replaced with a more generic routine that pulls backlinks based on lex docs. diff --git a/packages/pds/src/actor-store/repo/reader.ts b/packages/pds/src/actor-store/repo/reader.ts index 63abe1400d6..5429615efe3 100644 --- a/packages/pds/src/actor-store/repo/reader.ts +++ b/packages/pds/src/actor-store/repo/reader.ts @@ -1,8 +1,10 @@ import { BlobStore } from '@atproto/repo' -import { SqlRepoReader } from './sql-repo-reader' +import { CID } from 'multiformats/cid' + import { BlobReader } from '../blob/reader' import { ActorDb } from '../db' import { RecordReader } from '../record/reader' +import { SqlRepoReader } from './sql-repo-reader' export class RepoReader { blob: BlobReader diff --git a/packages/pds/src/actor-store/repo/sql-repo-reader.ts b/packages/pds/src/actor-store/repo/sql-repo-reader.ts index 15e0b7c6a73..241a8512907 100644 --- a/packages/pds/src/actor-store/repo/sql-repo-reader.ts +++ b/packages/pds/src/actor-store/repo/sql-repo-reader.ts @@ -19,13 +19,14 @@ export class SqlRepoReader extends ReadableBlockstore { async getRoot(): Promise { const root = await this.getRootDetailed() - return root?.cid ?? null + return root.cid } async getRootDetailed(): Promise<{ cid: CID; rev: string }> { const res = await this.db.db .selectFrom('repo_root') - .selectAll() + .select(['cid', 'rev']) + .limit(1) .executeTakeFirstOrThrow() return { cid: CID.parse(res.cid), diff --git a/packages/pds/src/actor-store/repo/transactor.ts b/packages/pds/src/actor-store/repo/transactor.ts index 4f2ef192de9..a9477543779 100644 --- a/packages/pds/src/actor-store/repo/transactor.ts +++ b/packages/pds/src/actor-store/repo/transactor.ts @@ -21,21 +21,28 @@ export class RepoTransactor extends RepoReader { blob: BlobTransactor record: RecordTransactor storage: SqlRepoTransactor - now: string constructor( public db: ActorDb, + public blobstore: BlobStore, public did: string, public signingKey: crypto.Keypair, - public blobstore: BlobStore, public backgroundQueue: BackgroundQueue, - now?: string, + public now: string = new Date().toISOString(), ) { super(db, blobstore) this.blob = new BlobTransactor(db, blobstore, backgroundQueue) this.record = new RecordTransactor(db, blobstore) - this.now = now ?? new Date().toISOString() - this.storage = new SqlRepoTransactor(db, this.did, this.now) + this.storage = new SqlRepoTransactor(db, did, now) + } + + async maybeLoadRepo(): Promise { + const res = await this.db.db + .selectFrom('repo_root') + .select('cid') + .limit(1) + .executeTakeFirst() + return res ? Repo.load(this.storage, CID.parse(res.cid)) : null } async createRepo(writes: PreparedCreate[]): Promise { diff --git a/packages/pds/src/api/app/bsky/actor/getPreferences.ts b/packages/pds/src/api/app/bsky/actor/getPreferences.ts index 761873df473..4a4e7a6943b 100644 --- a/packages/pds/src/api/app/bsky/actor/getPreferences.ts +++ b/packages/pds/src/api/app/bsky/actor/getPreferences.ts @@ -3,7 +3,8 @@ import AppContext from '../../../../context' import { AuthScope } from '../../../../auth-verifier' export default function (server: Server, ctx: AppContext) { - if (!ctx.cfg.bskyAppView) return + if (!ctx.bskyAppView) return + server.app.bsky.actor.getPreferences({ auth: ctx.authVerifier.accessStandard({ additional: [AuthScope.Takendown], diff --git a/packages/pds/src/api/app/bsky/actor/getProfile.ts b/packages/pds/src/api/app/bsky/actor/getProfile.ts index bf31ec8fe00..fda6ad6fde5 100644 --- a/packages/pds/src/api/app/bsky/actor/getProfile.ts +++ b/packages/pds/src/api/app/bsky/actor/getProfile.ts @@ -8,8 +8,8 @@ import { } from '../../../../read-after-write' export default function (server: Server, ctx: AppContext) { - const { bskyAppView } = ctx.cfg - if (!bskyAppView) return + if (!ctx.bskyAppView) return + server.app.bsky.actor.getProfile({ auth: ctx.authVerifier.accessStandard(), handler: async (reqCtx) => { diff --git a/packages/pds/src/api/app/bsky/actor/getProfiles.ts b/packages/pds/src/api/app/bsky/actor/getProfiles.ts index 77e6fc52121..104635bf8e6 100644 --- a/packages/pds/src/api/app/bsky/actor/getProfiles.ts +++ b/packages/pds/src/api/app/bsky/actor/getProfiles.ts @@ -8,8 +8,8 @@ import { } from '../../../../read-after-write' export default function (server: Server, ctx: AppContext) { - const { bskyAppView } = ctx.cfg - if (!bskyAppView) return + if (!ctx.bskyAppView) return + server.app.bsky.actor.getProfiles({ auth: ctx.authVerifier.accessStandard(), handler: async (reqCtx) => { diff --git a/packages/pds/src/api/app/bsky/actor/putPreferences.ts b/packages/pds/src/api/app/bsky/actor/putPreferences.ts index 5006c2150a5..ea559282835 100644 --- a/packages/pds/src/api/app/bsky/actor/putPreferences.ts +++ b/packages/pds/src/api/app/bsky/actor/putPreferences.ts @@ -4,7 +4,8 @@ import AppContext from '../../../../context' import { AccountPreference } from '../../../../actor-store/preference/reader' export default function (server: Server, ctx: AppContext) { - if (!ctx.cfg.bskyAppView) return + if (!ctx.bskyAppView) return + server.app.bsky.actor.putPreferences({ auth: ctx.authVerifier.accessStandard({ checkTakedown: true }), handler: async ({ auth, input }) => { diff --git a/packages/pds/src/api/app/bsky/feed/getActorLikes.ts b/packages/pds/src/api/app/bsky/feed/getActorLikes.ts index ef7ff9a5550..02547bc240c 100644 --- a/packages/pds/src/api/app/bsky/feed/getActorLikes.ts +++ b/packages/pds/src/api/app/bsky/feed/getActorLikes.ts @@ -8,8 +8,8 @@ import { } from '../../../../read-after-write' export default function (server: Server, ctx: AppContext) { - const { bskyAppView } = ctx.cfg - if (!bskyAppView) return + if (!ctx.bskyAppView) return + server.app.bsky.feed.getActorLikes({ auth: ctx.authVerifier.accessStandard(), handler: async (reqCtx) => { diff --git a/packages/pds/src/api/app/bsky/feed/getAuthorFeed.ts b/packages/pds/src/api/app/bsky/feed/getAuthorFeed.ts index 6685267fe1a..942ff8dce50 100644 --- a/packages/pds/src/api/app/bsky/feed/getAuthorFeed.ts +++ b/packages/pds/src/api/app/bsky/feed/getAuthorFeed.ts @@ -9,8 +9,8 @@ import { } from '../../../../read-after-write' export default function (server: Server, ctx: AppContext) { - const { bskyAppView } = ctx.cfg - if (!bskyAppView) return + if (!ctx.bskyAppView) return + server.app.bsky.feed.getAuthorFeed({ auth: ctx.authVerifier.accessStandard(), handler: async (reqCtx) => { diff --git a/packages/pds/src/api/app/bsky/feed/getFeed.ts b/packages/pds/src/api/app/bsky/feed/getFeed.ts index 156fac7257d..e4634a7e1ed 100644 --- a/packages/pds/src/api/app/bsky/feed/getFeed.ts +++ b/packages/pds/src/api/app/bsky/feed/getFeed.ts @@ -6,16 +6,16 @@ import { AtUri } from '@atproto/syntax' import { InvalidRequestError } from '@atproto/oauth-provider' export default function (server: Server, ctx: AppContext) { - const { appViewAgent } = ctx - const { bskyAppView } = ctx.cfg - if (!appViewAgent || !bskyAppView) return + const { bskyAppView } = ctx + if (!bskyAppView) return + server.app.bsky.feed.getFeed({ auth: ctx.authVerifier.accessStandard(), handler: async ({ params, auth, req }) => { const requester = auth.credentials.did const feedUrl = new AtUri(params.feed) - const { data } = await appViewAgent.com.atproto.repo.getRecord({ + const { data } = await bskyAppView.agent.com.atproto.repo.getRecord({ repo: feedUrl.hostname, collection: feedUrl.collection, rkey: feedUrl.rkey, diff --git a/packages/pds/src/api/app/bsky/feed/getPostThread.ts b/packages/pds/src/api/app/bsky/feed/getPostThread.ts index 8a748c33063..9518a4c4db4 100644 --- a/packages/pds/src/api/app/bsky/feed/getPostThread.ts +++ b/packages/pds/src/api/app/bsky/feed/getPostThread.ts @@ -25,8 +25,8 @@ import { import { ids } from '../../../../lexicon/lexicons' export default function (server: Server, ctx: AppContext) { - const { bskyAppView } = ctx.cfg - if (!bskyAppView) return + if (!ctx.bskyAppView) return + server.app.bsky.feed.getPostThread({ auth: ctx.authVerifier.accessStandard(), handler: async (reqCtx) => { @@ -191,11 +191,12 @@ const readAfterWriteNotFound = async ( const highestParent = getHighestParent(thread) if (highestParent) { try { - assert(ctx.appViewAgent) - const parentsRes = await ctx.appViewAgent.api.app.bsky.feed.getPostThread( - { uri: highestParent, parentHeight: params.parentHeight, depth: 0 }, - await ctx.appviewAuthHeaders(requester, ids.AppBskyFeedGetPostThread), - ) + assert(ctx.bskyAppView) + const parentsRes = + await ctx.bskyAppView.agent.app.bsky.feed.getPostThread( + { uri: highestParent, parentHeight: params.parentHeight, depth: 0 }, + await ctx.appviewAuthHeaders(requester, ids.AppBskyFeedGetPostThread), + ) thread.parent = parentsRes.data.thread } catch (err) { // do nothing diff --git a/packages/pds/src/api/app/bsky/feed/getTimeline.ts b/packages/pds/src/api/app/bsky/feed/getTimeline.ts index 1d95c6ce5f8..ce32d10245d 100644 --- a/packages/pds/src/api/app/bsky/feed/getTimeline.ts +++ b/packages/pds/src/api/app/bsky/feed/getTimeline.ts @@ -8,8 +8,8 @@ import { } from '../../../../read-after-write' export default function (server: Server, ctx: AppContext) { - const { bskyAppView } = ctx.cfg - if (!bskyAppView) return + if (!ctx.bskyAppView) return + server.app.bsky.feed.getTimeline({ auth: ctx.authVerifier.accessStandard(), handler: async (reqCtx) => { diff --git a/packages/pds/src/api/app/bsky/notification/registerPush.ts b/packages/pds/src/api/app/bsky/notification/registerPush.ts index 0e481e639a9..22880297f10 100644 --- a/packages/pds/src/api/app/bsky/notification/registerPush.ts +++ b/packages/pds/src/api/app/bsky/notification/registerPush.ts @@ -8,8 +8,9 @@ import { AuthScope } from '../../../../auth-verifier' import { ids } from '../../../../lexicon/lexicons' export default function (server: Server, ctx: AppContext) { - const { appViewAgent } = ctx - if (!appViewAgent) return + const { bskyAppView } = ctx + if (!bskyAppView) return + server.app.bsky.notification.registerPush({ auth: ctx.authVerifier.accessStandard({ additional: [AuthScope.SignupQueued], @@ -26,8 +27,8 @@ export default function (server: Server, ctx: AppContext) { ids.AppBskyNotificationRegisterPush, ) - if (ctx.cfg.bskyAppView?.did === serviceDid) { - await appViewAgent.api.app.bsky.notification.registerPush(input.body, { + if (bskyAppView.did === serviceDid) { + await bskyAppView.agent.app.bsky.notification.registerPush(input.body, { ...authHeaders, encoding: 'application/json', }) diff --git a/packages/pds/src/api/com/atproto/identity/resolveHandle.ts b/packages/pds/src/api/com/atproto/identity/resolveHandle.ts index 40122e2f3b6..f18529d0598 100644 --- a/packages/pds/src/api/com/atproto/identity/resolveHandle.ts +++ b/packages/pds/src/api/com/atproto/identity/resolveHandle.ts @@ -1,4 +1,3 @@ -import { AtpAgent } from '@atproto/api' import { InvalidRequestError } from '@atproto/xrpc-server' import * as ident from '@atproto/syntax' import { Server } from '../../../../lexicon' @@ -33,8 +32,16 @@ export default function (server: Server, ctx: AppContext) { } // this is not someone on our server, but we help with resolving anyway - if (!did && ctx.appViewAgent) { - did = await tryResolveFromAppView(ctx.appViewAgent, handle) + if (!did && ctx.bskyAppView) { + try { + const result = + await ctx.bskyAppView.agent.com.atproto.identity.resolveHandle({ + handle, + }) + did = result.data.did + } catch { + // Ignore + } } if (!did) { @@ -51,14 +58,3 @@ export default function (server: Server, ctx: AppContext) { } }) } - -async function tryResolveFromAppView(agent: AtpAgent, handle: string) { - try { - const result = await agent.api.com.atproto.identity.resolveHandle({ - handle, - }) - return result.data.did - } catch (_err) { - return - } -} diff --git a/packages/pds/src/api/com/atproto/repo/importRepo.ts b/packages/pds/src/api/com/atproto/repo/importRepo.ts index f043b8f4041..e0a5608d065 100644 --- a/packages/pds/src/api/com/atproto/repo/importRepo.ts +++ b/packages/pds/src/api/com/atproto/repo/importRepo.ts @@ -1,9 +1,8 @@ import { Server } from '../../../../lexicon' import AppContext from '../../../../context' -import { ActorStoreTransactor } from '../../../../actor-store' +import { ActorStoreTransactor } from '../../../../actor-store/actor-store-transactor' import { TID } from '@atproto/common' import { - Repo, WriteOpAction, getAndParseRecord, readCarStream, @@ -44,13 +43,7 @@ const importRepo = async ( if (roots.length !== 1) { throw new InvalidRequestError('expected one root') } - const currRoot = await actorStore.db.db - .selectFrom('repo_root') - .selectAll() - .executeTakeFirst() - const currRepo = currRoot - ? await Repo.load(actorStore.repo.storage, CID.parse(currRoot.cid)) - : null + const currRepo = await actorStore.repo.maybeLoadRepo() const diff = await verifyDiff( currRepo, blocks, @@ -89,18 +82,10 @@ const importRepo = async ( now, ) const recordBlobs = findBlobRefs(parsedRecord) - const blobValues = recordBlobs.map((cid) => ({ - recordUri: uri.toString(), - blobCid: cid.ref.toString(), - })) - const indexRecordBlobs = - blobValues.length > 0 - ? actorStore.db.db - .insertInto('record_blob') - .values(blobValues) - .onConflict((oc) => oc.doNothing()) - .execute() - : Promise.resolve() + const indexRecordBlobs = actorStore.repo.blob.insertBlobs( + uri.toString(), + recordBlobs, + ) await Promise.all([indexRecord, indexRecordBlobs]) } }, diff --git a/packages/pds/src/api/com/atproto/repo/putRecord.ts b/packages/pds/src/api/com/atproto/repo/putRecord.ts index 927d27f6992..5cc00dd12ee 100644 --- a/packages/pds/src/api/com/atproto/repo/putRecord.ts +++ b/packages/pds/src/api/com/atproto/repo/putRecord.ts @@ -1,21 +1,22 @@ -import { CID } from 'multiformats/cid' +import { BlobRef } from '@atproto/lexicon' +import { CommitData } from '@atproto/repo' import { AtUri } from '@atproto/syntax' import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server' -import { CommitData } from '@atproto/repo' -import { BlobRef } from '@atproto/lexicon' -import { Server } from '../../../../lexicon' -import { prepareUpdate, prepareCreate } from '../../../../repo' +import { CID } from 'multiformats/cid' +import { ActorStoreTransactor } from '../../../../actor-store/actor-store-transactor' import AppContext from '../../../../context' +import { Server } from '../../../../lexicon' +import { ids } from '../../../../lexicon/lexicons' +import { Record as ProfileRecord } from '../../../../lexicon/types/app/bsky/actor/profile' import { BadCommitSwapError, BadRecordSwapError, InvalidRecordError, + prepareCreate, PreparedCreate, PreparedUpdate, + prepareUpdate, } from '../../../../repo' -import { ids } from '../../../../lexicon/lexicons' -import { Record as ProfileRecord } from '../../../../lexicon/types/app/bsky/actor/profile' -import { ActorStoreTransactor } from '../../../../actor-store' export default function (server: Server, ctx: AppContext) { server.com.atproto.repo.putRecord({ diff --git a/packages/pds/src/bsky-app-view.ts b/packages/pds/src/bsky-app-view.ts new file mode 100644 index 00000000000..ee3f7ae714c --- /dev/null +++ b/packages/pds/src/bsky-app-view.ts @@ -0,0 +1,26 @@ +import { format } from 'node:util' +import { AtpAgent } from '@atproto/api' + +export type AppViewOptions = { + url: string + did: string + cdnUrlPattern?: string +} + +export class BskyAppView { + public did: string + public url: string + public agent: AtpAgent + private cdnUrlPattern?: string + + constructor(options: AppViewOptions) { + this.did = options.did + this.url = options.url + this.agent = new AtpAgent({ service: options.url }) + this.cdnUrlPattern = options.cdnUrlPattern + } + + getImageUrl(pattern: string, did: string, cid: string): string | undefined { + if (this.cdnUrlPattern) return format(this.cdnUrlPattern, pattern, did, cid) + } +} diff --git a/packages/pds/src/context.ts b/packages/pds/src/context.ts index 633a48b46dc..7b43401776a 100644 --- a/packages/pds/src/context.ts +++ b/packages/pds/src/context.ts @@ -41,8 +41,10 @@ import { DidSqliteCache } from './did-cache' import { Crawlers } from './crawlers' import { DiskBlobStore } from './disk-blobstore' import { getRedisClient } from './redis' -import { ActorStore } from './actor-store' +import { ActorStore } from './actor-store/actor-store' import { LocalViewer, LocalViewerCreator } from './read-after-write/viewer' +import { BskyAppView } from './bsky-app-view' +import { ImageUrlBuilder } from './image/image-url-builder' export type AppContextOptions = { actorStore: ActorStore @@ -59,7 +61,7 @@ export type AppContextOptions = { redisScratch?: Redis ratelimitCreator?: RateLimiterCreator crawlers: Crawlers - appViewAgent?: AtpAgent + bskyAppView?: BskyAppView moderationAgent?: AtpAgent reportingAgent?: AtpAgent entrywayAgent?: AtpAgent @@ -86,7 +88,7 @@ export class AppContext { public redisScratch?: Redis public ratelimitCreator?: RateLimiterCreator public crawlers: Crawlers - public appViewAgent: AtpAgent | undefined + public bskyAppView?: BskyAppView public moderationAgent: AtpAgent | undefined public reportingAgent: AtpAgent | undefined public entrywayAgent: AtpAgent | undefined @@ -112,7 +114,7 @@ export class AppContext { this.redisScratch = opts.redisScratch this.ratelimitCreator = opts.ratelimitCreator this.crawlers = opts.crawlers - this.appViewAgent = opts.appViewAgent + this.bskyAppView = opts.bskyAppView this.moderationAgent = opts.moderationAgent this.reportingAgent = opts.reportingAgent this.entrywayAgent = opts.entrywayAgent @@ -214,9 +216,10 @@ export class AppContext { } } - const appViewAgent = cfg.bskyAppView - ? new AtpAgent({ service: cfg.bskyAppView.url }) + const bskyAppView = cfg.bskyAppView + ? new BskyAppView(cfg.bskyAppView) : undefined + const moderationAgent = cfg.modService ? new AtpAgent({ service: cfg.modService.url }) : undefined @@ -232,7 +235,19 @@ export class AppContext { ? createPublicKeyObject(cfg.entryway.jwtPublicKeyHex) : null + const imageUrlBuilder = new ImageUrlBuilder( + cfg.service.hostname, + bskyAppView, + ) + + const actorStore = new ActorStore(cfg.actorStore, { + blobstore, + backgroundQueue, + }) + const accountManager = new AccountManager( + actorStore, + imageUrlBuilder, backgroundQueue, cfg.db.accountDbLoc, jwtSecretKey, @@ -250,18 +265,11 @@ export class AppContext { secrets.plcRotationKey.privateKeyHex, ) - const actorStore = new ActorStore(cfg.actorStore, { - blobstore, - backgroundQueue, - }) - - const localViewer = LocalViewer.creator({ + const localViewer = LocalViewer.creator( accountManager, - appViewAgent, - pdsHostname: cfg.service.hostname, - appviewDid: cfg.bskyAppView?.did, - appviewCdnUrlPattern: cfg.bskyAppView?.cdnUrlPattern, - }) + imageUrlBuilder, + bskyAppView, + ) // An agent for performing HTTP requests based on user provided URLs. const proxyAgentBase = new undici.Agent({ @@ -322,8 +330,6 @@ export class AppContext { await JoseKey.fromKeyLike(jwtSecretKey, undefined, 'HS256'), ], accountManager, - actorStore, - localViewer, redis: redisScratch, dpopSecret: secrets.dpopSecret, customization: cfg.oauth.provider.customization, @@ -371,7 +377,7 @@ export class AppContext { redisScratch, ratelimitCreator, crawlers, - appViewAgent, + bskyAppView, moderationAgent, reportingAgent, entrywayAgent, @@ -386,8 +392,8 @@ export class AppContext { } async appviewAuthHeaders(did: string, lxm: string) { - assert(this.cfg.bskyAppView) - return this.serviceAuthHeaders(did, this.cfg.bskyAppView.did, lxm) + assert(this.bskyAppView) + return this.serviceAuthHeaders(did, this.bskyAppView.did, lxm) } async serviceAuthHeaders(did: string, aud: string, lxm: string) { diff --git a/packages/pds/src/db/db.ts b/packages/pds/src/db/db.ts index 62a3de9ad81..f0a2c670547 100644 --- a/packages/pds/src/db/db.ts +++ b/packages/pds/src/db/db.ts @@ -51,7 +51,7 @@ export class Database { } async transactionNoRetry( - fn: (db: Database) => T | Promise, + fn: (db: Database) => T | PromiseLike, ): Promise { this.assertNotTransaction() const leakyTxPlugin = new LeakyTxPlugin() @@ -77,7 +77,7 @@ export class Database { } async transaction( - fn: (db: Database) => T | Promise, + fn: (db: Database) => T | PromiseLike, ): Promise { return retrySqlite(() => this.transactionNoRetry(fn)) } diff --git a/packages/pds/src/image/image-url-builder.ts b/packages/pds/src/image/image-url-builder.ts new file mode 100644 index 00000000000..8665c7f3f25 --- /dev/null +++ b/packages/pds/src/image/image-url-builder.ts @@ -0,0 +1,16 @@ +import { BskyAppView } from '../bsky-app-view' +import { ids } from '../lexicon/lexicons' + +export class ImageUrlBuilder { + constructor( + readonly pdsHostname: string, + readonly bskyAppView?: BskyAppView, + ) {} + + build(pattern: string, did: string, cid: string): string { + return ( + this.bskyAppView?.getImageUrl(pattern, did, cid) ?? + `https://${this.pdsHostname}/xrpc/${ids.ComAtprotoSyncGetBlob}?did=${did}&cid=${cid}` + ) + } +} diff --git a/packages/pds/src/oauth/detailed-account-store.ts b/packages/pds/src/oauth/detailed-account-store.ts deleted file mode 100644 index 203b735fce0..00000000000 --- a/packages/pds/src/oauth/detailed-account-store.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { - AccountInfo, - AccountStore, - DeviceId, - SignInCredentials, -} from '@atproto/oauth-provider' - -import { AccountManager } from '../account-manager/index' -import { ActorStore } from '../actor-store/index' -import { ProfileViewBasic } from '../lexicon/types/app/bsky/actor/defs' -import { LocalViewerCreator } from '../read-after-write/index' - -/** - * Although the {@link AccountManager} class implements the {@link AccountStore} - * interface, the accounts it returns do not contain any profile information - * (display name, avatar, etc). This is due to the fact that the account manager - * does not have access to the account's repos. The {@link DetailedAccountStore} - * is a wrapper around the {@link AccountManager} that enriches the accounts - * with profile information using the account's repos through the - * {@link ActorStore}. - */ -export class DetailedAccountStore implements AccountStore { - constructor( - private accountManager: AccountManager, - private actorStore: ActorStore, - private localViewer: LocalViewerCreator, - ) {} - - private async getProfile(did: string): Promise { - // TODO: Should we cache this? - return this.actorStore.read(did, async (actorStoreReader) => { - const localViewer = this.localViewer(actorStoreReader) - return localViewer.getProfileBasic() - }) - } - - private async enrichAccountInfo( - accountInfo: AccountInfo, - ): Promise { - const { account } = accountInfo - if (!account.picture || !account.name) { - const profile = await this.getProfile(account.sub) - if (profile) { - account.picture ||= profile.avatar - account.name ||= profile.displayName - } - } - - return accountInfo - } - - async authenticateAccount( - credentials: SignInCredentials, - deviceId: DeviceId, - ): Promise { - const accountInfo = await this.accountManager.authenticateAccount( - credentials, - deviceId, - ) - if (!accountInfo) return null - return this.enrichAccountInfo(accountInfo) - } - - async addAuthorizedClient( - deviceId: DeviceId, - sub: string, - clientId: string, - ): Promise { - return this.accountManager.addAuthorizedClient(deviceId, sub, clientId) - } - - async getDeviceAccount( - deviceId: DeviceId, - sub: string, - ): Promise { - const accountInfo = await this.accountManager.getDeviceAccount( - deviceId, - sub, - ) - if (!accountInfo) return null - return this.enrichAccountInfo(accountInfo) - } - - async listDeviceAccounts(deviceId: DeviceId): Promise { - const accountInfos = await this.accountManager.listDeviceAccounts(deviceId) - return Promise.all( - accountInfos.map(async (accountInfo) => - this.enrichAccountInfo(accountInfo), - ), - ) - } - - async removeDeviceAccount(deviceId: DeviceId, sub: string): Promise { - return this.accountManager.removeDeviceAccount(deviceId, sub) - } -} diff --git a/packages/pds/src/oauth/provider.ts b/packages/pds/src/oauth/provider.ts index 2fb039dd2dc..534e5c34a24 100644 --- a/packages/pds/src/oauth/provider.ts +++ b/packages/pds/src/oauth/provider.ts @@ -5,15 +5,10 @@ import { } from '@atproto/oauth-provider' import { AccountManager } from '../account-manager/index' -import { ActorStore } from '../actor-store/index' import { oauthLogger } from '../logger' -import { LocalViewerCreator } from '../read-after-write/index' -import { DetailedAccountStore } from './detailed-account-store' export type AuthProviderOptions = { accountManager: AccountManager - actorStore: ActorStore - localViewer: LocalViewerCreator } & Pick< OAuthProviderOptions, 'issuer' | 'redis' | 'keyset' | 'dpopSecret' | 'customization' @@ -23,8 +18,6 @@ export type AuthProviderOptions = { export class PdsOAuthProvider extends OAuthProvider { constructor({ accountManager, - actorStore, - localViewer, keyset, redis, dpopSecret, @@ -39,6 +32,7 @@ export class PdsOAuthProvider extends OAuthProvider { redis, safeFetch, customization, + store: accountManager, metadata: { // PdsOAuthProvider is used when the PDS is both an authorization server // & resource server, in which case the issuer origin is also the @@ -48,15 +42,6 @@ export class PdsOAuthProvider extends OAuthProvider { scopes_supported: ['transition:generic', 'transition:chat.bsky'], }, - accountStore: new DetailedAccountStore( - accountManager, - actorStore, - localViewer, - ), - requestStore: accountManager, - deviceStore: accountManager, - tokenStore: accountManager, - // If the PDS is both an authorization server & resource server (no // entryway), there is no need to use JWTs as access tokens. Instead, // the PDS can use tokenId as access tokens. This allows the PDS to diff --git a/packages/pds/src/read-after-write/util.ts b/packages/pds/src/read-after-write/util.ts index fd169ef8b03..16ae22d0811 100644 --- a/packages/pds/src/read-after-write/util.ts +++ b/packages/pds/src/read-after-write/util.ts @@ -16,7 +16,6 @@ import { pipethrough, } from '../pipethrough' import { HandlerResponse, LocalRecords, MungeFn } from './types' -import { getRecordsSinceRev } from './viewer' const REPO_REV_HEADER = 'atproto-repo-rev' @@ -62,7 +61,7 @@ export const pipethroughReadAfterWrite = async ( const lxm = parseReqNsid(req) return await ctx.actorStore.read(requester, async (store) => { - const local = await getRecordsSinceRev(store, rev) + const local = await store.record.getRecordsSinceRev(rev) if (local.count === 0) return streamRes const { buffer } = (bufferRes = await asPipeThroughBuffer(streamRes)) diff --git a/packages/pds/src/read-after-write/viewer.ts b/packages/pds/src/read-after-write/viewer.ts index 9767f751b72..abfd56bacd5 100644 --- a/packages/pds/src/read-after-write/viewer.ts +++ b/packages/pds/src/read-after-write/viewer.ts @@ -1,8 +1,4 @@ -import util from 'util' -import { CID } from 'multiformats/cid' import { AtUri, INVALID_HANDLE } from '@atproto/syntax' -import { cborToLexRecord } from '@atproto/repo' -import { AtpAgent } from '@atproto/api' import { createServiceAuthHeaders } from '@atproto/xrpc-server' import { Record as PostRecord } from '../lexicon/types/app/bsky/feed/post' import { Record as ProfileRecord } from '../lexicon/types/app/bsky/actor/profile' @@ -36,98 +32,75 @@ import { Main as EmbedRecordWithMedia, isMain as isEmbedRecordWithMedia, } from '../lexicon/types/app/bsky/embed/recordWithMedia' -import { ActorStoreReader } from '../actor-store' +import { ActorStoreReader } from '../actor-store/actor-store-reader' import { LocalRecords, RecordDescript } from './types' import { AccountManager } from '../account-manager' +import { BskyAppView } from '../bsky-app-view' +import { ImageUrlBuilder } from '../image/image-url-builder' type CommonSignedUris = 'avatar' | 'banner' | 'feed_thumbnail' | 'feed_fullsize' -export type LocalViewerCreator = (actorStore: ActorStoreReader) => LocalViewer +export type LocalViewerCreator = ( + actorStoreReader: ActorStoreReader, +) => LocalViewer export class LocalViewer { - did: string - actorStore: ActorStoreReader - accountManager: AccountManager - pdsHostname: string - appViewAgent?: AtpAgent - appviewDid?: string - appviewCdnUrlPattern?: string + constructor( + public readonly actorStoreReader: ActorStoreReader, + public readonly accountManager: AccountManager, + public readonly imageUrlBuilder: ImageUrlBuilder, + public readonly bskyAppView?: BskyAppView, + ) {} - constructor(params: { - actorStore: ActorStoreReader - accountManager: AccountManager - pdsHostname: string - appViewAgent?: AtpAgent - appviewDid?: string - appviewCdnUrlPattern?: string - }) { - this.did = params.actorStore.did - this.actorStore = params.actorStore - this.accountManager = params.accountManager - this.pdsHostname = params.pdsHostname - this.appViewAgent = params.appViewAgent - this.appviewDid = params.appviewDid - this.appviewCdnUrlPattern = params.appviewCdnUrlPattern + get did() { + return this.actorStoreReader.did } - static creator(params: { - accountManager: AccountManager - pdsHostname: string - appViewAgent?: AtpAgent - appviewDid?: string - appviewCdnUrlPattern?: string - }): LocalViewerCreator { - return (actorStore) => { - return new LocalViewer({ ...params, actorStore }) - } + static creator( + accountManager: AccountManager, + imageUrlBuilder: ImageUrlBuilder, + bskyAppView?: BskyAppView, + ): LocalViewerCreator { + return (actorStore) => + new LocalViewer(actorStore, accountManager, imageUrlBuilder, bskyAppView) } getImageUrl(pattern: CommonSignedUris, cid: string) { - if (!this.appviewCdnUrlPattern) { - return `https://${this.pdsHostname}/xrpc/${ids.ComAtprotoSyncGetBlob}?did=${this.did}&cid=${cid}` - } - return util.format(this.appviewCdnUrlPattern, pattern, this.did, cid) + return this.imageUrlBuilder.build(pattern, this.did, cid) } async serviceAuthHeaders(did: string, lxm: string) { - if (!this.appviewDid) { + if (!this.bskyAppView) { throw new Error('Could not find bsky appview did') } - const keypair = await this.actorStore.keypair() + const keypair = await this.actorStoreReader.keypair() return createServiceAuthHeaders({ iss: did, - aud: this.appviewDid, + aud: this.bskyAppView.did, lxm, keypair, }) } async getRecordsSinceRev(rev: string): Promise { - return getRecordsSinceRev(this.actorStore, rev) + return this.actorStoreReader.record.getRecordsSinceRev(rev) } async getProfileBasic(): Promise { - const profileQuery = this.actorStore.db.db - .selectFrom('record') - .leftJoin('repo_block', 'repo_block.cid', 'record.cid') - .where('record.collection', '=', ids.AppBskyActorProfile) - .where('record.rkey', '=', 'self') - .selectAll() const [profileRes, accountRes] = await Promise.all([ - profileQuery.executeTakeFirst(), + this.actorStoreReader.record.getProfileRecord(), this.accountManager.getAccount(this.did), ]) + if (!accountRes) return null - const record = profileRes?.content - ? (cborToLexRecord(profileRes.content) as ProfileRecord) - : null + return { did: this.did, handle: accountRes.handle ?? INVALID_HANDLE, - displayName: record?.displayName, - avatar: record?.avatar - ? this.getImageUrl('avatar', record.avatar.ref.toString()) + displayName: profileRes?.displayName, + avatar: profileRes?.avatar + ? this.getImageUrl('avatar', profileRes.avatar.ref.toString()) : undefined, } } @@ -239,12 +212,12 @@ export class LocalViewer { private async formatRecordEmbedInternal( embed: EmbedRecord, ): Promise { - if (!this.appViewAgent || !this.appviewDid) { + if (!this.bskyAppView) { return null } const collection = new AtUri(embed.record.uri).collection if (collection === ids.AppBskyFeedPost) { - const res = await this.appViewAgent.api.app.bsky.feed.getPosts( + const res = await this.bskyAppView.agent.app.bsky.feed.getPosts( { uris: [embed.record.uri] }, await this.serviceAuthHeaders(this.did, ids.AppBskyFeedGetPosts), ) @@ -261,7 +234,7 @@ export class LocalViewer { indexedAt: post.indexedAt, } } else if (collection === ids.AppBskyFeedGenerator) { - const res = await this.appViewAgent.api.app.bsky.feed.getFeedGenerator( + const res = await this.bskyAppView.agent.app.bsky.feed.getFeedGenerator( { feed: embed.record.uri }, await this.serviceAuthHeaders( this.did, @@ -273,7 +246,7 @@ export class LocalViewer { ...res.data.view, } } else if (collection === ids.AppBskyGraphList) { - const res = await this.appViewAgent.api.app.bsky.graph.getList( + const res = await this.bskyAppView.agent.app.bsky.graph.getList( { list: embed.record.uri }, await this.serviceAuthHeaders(this.did, ids.AppBskyGraphGetList), ) @@ -330,50 +303,3 @@ export class LocalViewer { } } } - -export const getRecordsSinceRev = async ( - actorStore: ActorStoreReader, - rev: string, -): Promise => { - const res = await actorStore.db.db - .selectFrom('record') - .innerJoin('repo_block', 'repo_block.cid', 'record.cid') - .select(['repo_block.content', 'uri', 'repo_block.cid', 'record.indexedAt']) - .where('record.repoRev', '>', rev) - .limit(10) - .orderBy('record.repoRev', 'asc') - .execute() - // sanity check to ensure that the clock received is not before _all_ local records (for instance in case of account migration) - if (res.length > 0) { - const sanityCheckRes = await actorStore.db.db - .selectFrom('record') - .selectAll() - .where('record.repoRev', '<=', rev) - .limit(1) - .executeTakeFirst() - if (!sanityCheckRes) { - return { count: 0, profile: null, posts: [] } - } - } - return res.reduce( - (acc, cur) => { - const descript = { - uri: new AtUri(cur.uri), - cid: CID.parse(cur.cid), - indexedAt: cur.indexedAt, - record: cborToLexRecord(cur.content), - } - if ( - descript.uri.collection === ids.AppBskyActorProfile && - descript.uri.rkey === 'self' - ) { - acc.profile = descript as RecordDescript - } else if (descript.uri.collection === ids.AppBskyFeedPost) { - acc.posts.push(descript as RecordDescript) - } - acc.count++ - return acc - }, - { count: 0, profile: null, posts: [] } as LocalRecords, - ) -} diff --git a/packages/pds/src/scripts/rebuild-repo.ts b/packages/pds/src/scripts/rebuild-repo.ts index b02c627ab37..0a71b524aac 100644 --- a/packages/pds/src/scripts/rebuild-repo.ts +++ b/packages/pds/src/scripts/rebuild-repo.ts @@ -1,16 +1,12 @@ -import readline from 'node:readline/promises' -import { CID } from 'multiformats/cid' +import { TID } from '@atproto/common' import { BlockMap, CidSet, MST, MemoryBlockstore, - formatDataKey, signCommit, } from '@atproto/repo' -import { AtUri } from '@atproto/syntax' -import { TID } from '@atproto/common' -import { ActorStoreTransactor } from '../actor-store' +import readline from 'node:readline/promises' import AppContext from '../context' export const rebuildRepo = async (ctx: AppContext, args: string[]) => { @@ -23,8 +19,8 @@ export const rebuildRepo = async (ctx: AppContext, args: string[]) => { const rev = TID.nextStr() const commit = await ctx.actorStore.transact(did, async (store) => { const [records, existingCids] = await Promise.all([ - listAllRecords(store), - listExistingBlocks(store), + store.record.listAll(), + store.record.listExistingBlocks(), ]) let mst = await MST.create(memoryStore) for (const record of records) { @@ -81,53 +77,6 @@ export const rebuildRepo = async (ctx: AppContext, args: string[]) => { await ctx.sequencer.sequenceCommit(did, commit, []) } -const listExistingBlocks = async ( - store: ActorStoreTransactor, -): Promise => { - const cids = new CidSet() - let cursor: string | undefined = '' - while (cursor !== undefined) { - const res = await store.db.db - .selectFrom('repo_block') - .select('cid') - .where('cid', '>', cursor) - .orderBy('cid', 'asc') - .limit(1000) - .execute() - for (const row of res) { - cids.add(CID.parse(row.cid)) - } - cursor = res.at(-1)?.cid - } - return cids -} - -const listAllRecords = async ( - store: ActorStoreTransactor, -): Promise => { - const records: RecordDescript[] = [] - let cursor: string | undefined = '' - while (cursor !== undefined) { - const res = await store.db.db - .selectFrom('record') - .select(['uri', 'cid']) - .where('uri', '>', cursor) - .orderBy('uri', 'asc') - .limit(1000) - .execute() - for (const row of res) { - const parsed = new AtUri(row.uri) - records.push({ - uri: row.uri, - path: formatDataKey(parsed.collection, parsed.rkey), - cid: CID.parse(row.cid), - }) - } - cursor = res.at(-1)?.uri - } - return records -} - const promptContinue = async (): Promise => { const rl = readline.createInterface({ input: process.stdin, @@ -136,9 +85,3 @@ const promptContinue = async (): Promise => { const answer = await rl.question('Continue? y/n ') return answer === '' } - -type RecordDescript = { - uri: string - path: string - cid: CID -} diff --git a/packages/pds/tests/blob-deletes.test.ts b/packages/pds/tests/blob-deletes.test.ts index 10c6a308a19..6b0412b0051 100644 --- a/packages/pds/tests/blob-deletes.test.ts +++ b/packages/pds/tests/blob-deletes.test.ts @@ -40,9 +40,7 @@ describe('blob deletes', () => { }) const getDbBlobsForDid = (did: string) => { - return ctx.actorStore.read(did, (store) => - store.db.db.selectFrom('blob').selectAll().execute(), - ) + return ctx.actorStore.read(did, (store) => store.repo.blob.getBlobCids()) } it('deletes blob when record is deleted', async () => { @@ -79,7 +77,7 @@ describe('blob deletes', () => { const dbBlobs = await getDbBlobsForDid(alice) expect(dbBlobs.length).toBe(1) - expect(dbBlobs[0].cid).toEqual(img2.image.ref.toString()) + expect(dbBlobs[0].toString()).toEqual(img2.image.ref.toString()) const hasImg = await ctx.blobstore(alice).hasStored(img.image.ref) expect(hasImg).toBeFalsy() diff --git a/packages/pds/tests/crud.test.ts b/packages/pds/tests/crud.test.ts index 88cebe20d61..61273410054 100644 --- a/packages/pds/tests/crud.test.ts +++ b/packages/pds/tests/crud.test.ts @@ -1,4 +1,5 @@ -import fs from 'fs/promises' +import assert from 'node:assert' +import fs from 'node:fs/promises' import { AtUri } from '@atproto/syntax' import { AtpAgent } from '@atproto/api' import { BlobRef } from '@atproto/lexicon' @@ -828,22 +829,17 @@ describe('crud operations', () => { const record = await ctx.actorStore.read(aliceAgent.accountDid, (store) => store.record.getRecord(new AtUri(res.data.uri), res.data.cid), ) - expect(record?.value).toMatchObject({ + assert(record) + expect(record.value).toMatchObject({ $type: 'com.example.record', blah: 'thing', }) const recordBlobs = await ctx.actorStore.read( - aliceAgent.accountDid, - (store) => - store.db.db - .selectFrom('blob') - .innerJoin('record_blob', 'record_blob.blobCid', 'blob.cid') - .where('recordUri', '=', res.data.uri) - .selectAll() - .execute(), + aliceAgent.assertDid, + (store) => store.repo.blob.getBlobsForRecord(record.uri), ) expect(recordBlobs.length).toBe(1) - expect(recordBlobs.at(0)?.cid).toBe(uploadedRes.data.blob.ref.toString()) + expect(recordBlobs.at(0)).toBe(uploadedRes.data.blob.ref.toString()) }) it('enforces record type constraint even when unvalidated', async () => { From 61dc0d60e19b88c6427a54c6d95a391b5f4da7bd Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 5 Feb 2025 15:06:58 +0100 Subject: [PATCH 047/101] Add linting rule to sort imports (#3220) * Add linting rule to sort imports * remove spacing between import groups * changeset * changeset * prettier config fine tuning * forbid use of deprecated imports * tidy --- .changeset/fair-tigers-thank.md | 41 + .changeset/mighty-actors-complain.md | 22 + .changeset/olive-teachers-yawn.md | 5 + .eslintrc | 67 +- .gitignore | 2 +- .prettierignore | 6 +- .prettierrc | 7 + .vscode/settings.json | 6 + package.json | 5 +- packages/api/bench/agent.bench.ts | 9 - packages/api/src/agent.ts | 13 +- packages/api/src/index.ts | 6 +- packages/api/src/mocker.ts | 6 +- packages/api/src/moderation/decision.ts | 14 +- packages/api/src/moderation/index.ts | 22 +- .../api/src/moderation/subjects/account.ts | 2 +- .../src/moderation/subjects/feed-generator.ts | 2 +- .../src/moderation/subjects/notification.ts | 2 +- packages/api/src/moderation/subjects/post.ts | 10 +- .../api/src/moderation/subjects/profile.ts | 2 +- .../api/src/moderation/subjects/user-list.ts | 2 +- packages/api/src/moderation/types.ts | 2 +- packages/api/src/moderation/util.ts | 2 +- packages/api/src/rich-text/detection.ts | 2 +- packages/api/src/rich-text/rich-text.ts | 4 +- packages/api/src/util.ts | 17 +- packages/api/tests/atp-agent.test.ts | 2 +- packages/api/tests/dispatcher.test.ts | 8 +- packages/api/tests/errors.test.ts | 2 +- .../api/tests/moderation-behaviors.test.ts | 6 +- .../tests/moderation-custom-labels.test.ts | 8 +- .../api/tests/moderation-mutewords.test.ts | 1 - .../api/tests/moderation-quoteposts.test.ts | 6 +- packages/api/tests/moderation.test.ts | 8 +- .../api/tests/rich-text-sanitization.test.ts | 2 +- .../api/tests/util/moderation-behavior.ts | 4 +- packages/aws/package.json | 3 + packages/aws/src/kms.ts | 2 +- packages/aws/src/s3.ts | 6 +- packages/bsky/bin/migration-create.ts | 4 +- packages/bsky/package.json | 3 + .../bsky/src/api/app/bsky/actor/getProfile.ts | 10 +- .../src/api/app/bsky/actor/getProfiles.ts | 12 +- .../src/api/app/bsky/actor/getSuggestions.ts | 14 +- .../src/api/app/bsky/actor/searchActors.ts | 12 +- .../app/bsky/actor/searchActorsTypeahead.ts | 10 +- .../src/api/app/bsky/feed/getActorFeeds.ts | 14 +- .../src/api/app/bsky/feed/getActorLikes.ts | 18 +- .../src/api/app/bsky/feed/getAuthorFeed.ts | 20 +- .../bsky/src/api/app/bsky/feed/getFeed.ts | 31 +- .../src/api/app/bsky/feed/getFeedGenerator.ts | 6 +- .../api/app/bsky/feed/getFeedGenerators.ts | 8 +- .../bsky/src/api/app/bsky/feed/getLikes.ts | 13 +- .../bsky/src/api/app/bsky/feed/getListFeed.ts | 18 +- .../src/api/app/bsky/feed/getPostThread.ts | 14 +- .../bsky/src/api/app/bsky/feed/getPosts.ts | 12 +- .../bsky/src/api/app/bsky/feed/getQuotes.ts | 14 +- .../src/api/app/bsky/feed/getRepostedBy.ts | 10 +- .../api/app/bsky/feed/getSuggestedFeeds.ts | 4 +- .../bsky/src/api/app/bsky/feed/getTimeline.ts | 18 +- .../bsky/src/api/app/bsky/feed/searchPosts.ts | 12 +- .../app/bsky/graph/getActorStarterPacks.ts | 14 +- .../bsky/src/api/app/bsky/graph/getBlocks.ts | 8 +- .../src/api/app/bsky/graph/getFollowers.ts | 12 +- .../bsky/src/api/app/bsky/graph/getFollows.ts | 12 +- .../api/app/bsky/graph/getKnownFollowers.ts | 4 +- .../bsky/src/api/app/bsky/graph/getList.ts | 20 +- .../src/api/app/bsky/graph/getListBlocks.ts | 8 +- .../src/api/app/bsky/graph/getListMutes.ts | 8 +- .../bsky/src/api/app/bsky/graph/getLists.ts | 8 +- .../bsky/src/api/app/bsky/graph/getMutes.ts | 6 +- .../api/app/bsky/graph/getRelationships.ts | 2 +- .../src/api/app/bsky/graph/getStarterPack.ts | 8 +- .../src/api/app/bsky/graph/getStarterPacks.ts | 10 +- .../bsky/graph/getSuggestedFollowsByActor.ts | 8 +- .../bsky/src/api/app/bsky/graph/muteActor.ts | 2 +- .../src/api/app/bsky/graph/muteActorList.ts | 2 +- .../bsky/src/api/app/bsky/graph/muteThread.ts | 2 +- .../api/app/bsky/graph/searchStarterPacks.ts | 14 +- .../src/api/app/bsky/graph/unmuteActor.ts | 2 +- .../src/api/app/bsky/graph/unmuteActorList.ts | 2 +- .../src/api/app/bsky/graph/unmuteThread.ts | 2 +- .../src/api/app/bsky/labeler/getServices.ts | 4 +- .../app/bsky/notification/getUnreadCount.ts | 4 +- .../bsky/notification/listNotifications.ts | 12 +- .../app/bsky/notification/putPreferences.ts | 2 +- .../api/app/bsky/notification/registerPush.ts | 2 +- .../api/app/bsky/notification/updateSeen.ts | 6 +- .../src/api/app/bsky/unspecced/getConfig.ts | 2 +- .../unspecced/getPopularFeedGenerators.ts | 4 +- .../bsky/unspecced/getTaggedSuggestions.ts | 2 +- .../app/bsky/unspecced/getTrendingTopics.ts | 14 +- packages/bsky/src/api/blob-dispatcher.ts | 3 +- packages/bsky/src/api/blob-resolver.ts | 25 +- .../api/com/atproto/admin/getAccountInfos.ts | 4 +- .../api/com/atproto/admin/getSubjectStatus.ts | 2 +- .../com/atproto/admin/updateSubjectStatus.ts | 4 +- .../api/com/atproto/identity/resolveHandle.ts | 4 +- .../src/api/com/atproto/label/queryLabels.ts | 4 +- .../src/api/com/atproto/repo/getRecord.ts | 4 +- .../src/api/com/atproto/temp/fetchLabels.ts | 4 +- packages/bsky/src/api/health.ts | 8 +- packages/bsky/src/api/index.ts | 42 +- packages/bsky/src/api/well-known.ts | 8 +- packages/bsky/src/auth-verifier.ts | 12 +- packages/bsky/src/bsync.ts | 6 +- packages/bsky/src/context.ts | 18 +- packages/bsky/src/courier.ts | 6 +- packages/bsky/src/data-plane/bsync/index.ts | 12 +- packages/bsky/src/data-plane/client.ts | 2 +- .../bsky/src/data-plane/server/background.ts | 2 +- .../data-plane/server/db/database-schema.ts | 54 +- packages/bsky/src/data-plane/server/db/db.ts | 12 +- .../bsky/src/data-plane/server/db/util.ts | 4 +- packages/bsky/src/data-plane/server/index.ts | 10 +- .../src/data-plane/server/indexing/index.ts | 42 +- .../server/indexing/plugins/block.ts | 8 +- .../indexing/plugins/chat-declaration.ts | 8 +- .../server/indexing/plugins/feed-generator.ts | 8 +- .../server/indexing/plugins/follow.ts | 10 +- .../server/indexing/plugins/labeler.ts | 8 +- .../server/indexing/plugins/like.ts | 10 +- .../server/indexing/plugins/list-block.ts | 8 +- .../server/indexing/plugins/list-item.ts | 10 +- .../server/indexing/plugins/list.ts | 10 +- .../server/indexing/plugins/post-gate.ts | 10 +- .../server/indexing/plugins/post.ts | 36 +- .../server/indexing/plugins/profile.ts | 10 +- .../server/indexing/plugins/repost.ts | 8 +- .../server/indexing/plugins/starter-pack.ts | 8 +- .../server/indexing/plugins/thread-gate.ts | 10 +- .../data-plane/server/indexing/processor.ts | 6 +- .../src/data-plane/server/routes/feeds.ts | 2 +- .../src/data-plane/server/routes/follows.ts | 2 +- .../src/data-plane/server/routes/identity.ts | 4 +- .../src/data-plane/server/routes/index.ts | 4 +- .../data-plane/server/routes/interactions.ts | 2 +- .../src/data-plane/server/routes/labels.ts | 4 +- .../src/data-plane/server/routes/likes.ts | 2 +- .../src/data-plane/server/routes/lists.ts | 4 +- .../src/data-plane/server/routes/mutes.ts | 4 +- .../src/data-plane/server/routes/notifs.ts | 6 +- .../src/data-plane/server/routes/posts.ts | 2 +- .../src/data-plane/server/routes/profile.ts | 8 +- .../src/data-plane/server/routes/quotes.ts | 2 +- .../src/data-plane/server/routes/records.ts | 4 +- .../data-plane/server/routes/relationships.ts | 2 +- .../src/data-plane/server/routes/reposts.ts | 2 +- .../data-plane/server/routes/suggestions.ts | 2 +- .../src/data-plane/server/subscription.ts | 6 +- packages/bsky/src/data-plane/server/util.ts | 4 +- packages/bsky/src/error.ts | 2 +- packages/bsky/src/feature-gates.ts | 2 - packages/bsky/src/hydration/feed.ts | 18 +- packages/bsky/src/hydration/graph.ts | 8 +- packages/bsky/src/hydration/hydrator.ts | 54 +- packages/bsky/src/hydration/label.ts | 8 +- packages/bsky/src/hydration/util.ts | 4 +- packages/bsky/src/image/index.ts | 2 +- packages/bsky/src/image/server.ts | 25 +- packages/bsky/src/image/sharp.ts | 4 +- packages/bsky/src/index.ts | 46 +- packages/bsky/src/logger.ts | 2 +- packages/bsky/src/redis.ts | 2 +- packages/bsky/src/util/http.ts | 2 +- packages/bsky/src/util/uris.ts | 2 +- packages/bsky/src/views/index.ts | 45 +- packages/bsky/src/views/types.ts | 18 +- packages/bsky/src/views/util.ts | 8 +- packages/bsky/tests/_util.ts | 9 +- packages/bsky/tests/admin/admin-auth.test.ts | 4 +- packages/bsky/tests/admin/moderation.test.ts | 2 +- packages/bsky/tests/auth.test.ts | 2 +- packages/bsky/tests/blob-resolver.test.ts | 4 +- .../data-plane/duplicate-records.test.ts | 6 +- .../data-plane/handle-invalidation.test.ts | 4 +- .../bsky/tests/data-plane/indexing.test.ts | 16 +- .../tests/data-plane/subscription.test.ts | 2 +- .../tests/data-plane/thread-mutes.test.ts | 2 +- packages/bsky/tests/entryway-auth.test.ts | 10 +- packages/bsky/tests/feed-generation.test.ts | 16 +- packages/bsky/tests/hydration/util.test.ts | 2 +- packages/bsky/tests/image/server.test.ts | 4 +- packages/bsky/tests/image/uri.test.ts | 4 +- packages/bsky/tests/label-hydration.test.ts | 2 +- packages/bsky/tests/postgates.test.ts | 5 +- packages/bsky/tests/query-labels.test.ts | 2 +- .../bsky/tests/seed/feed-hidden-replies.ts | 2 +- packages/bsky/tests/seed/known-followers.ts | 2 +- packages/bsky/tests/seed/postgates.ts | 2 +- packages/bsky/tests/server.test.ts | 4 +- .../tests/views/account-deactivation.test.ts | 2 +- packages/bsky/tests/views/actor-likes.test.ts | 2 +- .../bsky/tests/views/actor-search.test.ts | 4 +- packages/bsky/tests/views/author-feed.test.ts | 20 +- packages/bsky/tests/views/block-lists.test.ts | 6 +- packages/bsky/tests/views/blocks.test.ts | 8 +- .../tests/views/feed-hidden-replies.test.ts | 5 +- .../bsky/tests/views/feed-view-post.test.ts | 4 +- packages/bsky/tests/views/follows.test.ts | 4 +- .../bsky/tests/views/known-followers.test.ts | 5 +- .../bsky/tests/views/labeler-service.test.ts | 4 +- .../tests/views/labels-needs-review.test.ts | 4 +- .../bsky/tests/views/labels-takedown.test.ts | 2 +- packages/bsky/tests/views/likes.test.ts | 4 +- packages/bsky/tests/views/list-feed.test.ts | 4 +- packages/bsky/tests/views/lists.test.ts | 4 +- packages/bsky/tests/views/mute-lists.test.ts | 6 +- packages/bsky/tests/views/mutes.test.ts | 4 +- .../bsky/tests/views/notifications.test.ts | 6 +- packages/bsky/tests/views/posts.test.ts | 6 +- packages/bsky/tests/views/profile.test.ts | 6 +- packages/bsky/tests/views/quotes.test.ts | 4 +- packages/bsky/tests/views/reposts.test.ts | 4 +- .../bsky/tests/views/starter-packs.test.ts | 6 +- .../tests/views/suggested-follows.test.ts | 4 +- packages/bsky/tests/views/suggestions.test.ts | 4 +- packages/bsky/tests/views/thread.test.ts | 4 +- .../bsky/tests/views/threadgating.test.ts | 6 +- packages/bsky/tests/views/timeline.test.ts | 10 +- packages/bsync/bin/migration-create.ts | 4 +- packages/bsync/package.json | 3 + packages/bsync/src/config.ts | 2 +- packages/bsync/src/context.ts | 6 +- packages/bsync/src/db/index.ts | 16 +- packages/bsync/src/db/schema/index.ts | 4 +- packages/bsync/src/db/types.ts | 2 +- packages/bsync/src/index.ts | 10 +- packages/bsync/src/logger.ts | 2 +- .../bsync/src/routes/add-mute-operation.ts | 8 +- .../bsync/src/routes/add-notif-operation.ts | 8 +- packages/bsync/src/routes/auth.ts | 2 +- packages/bsync/src/routes/index.ts | 6 +- .../bsync/src/routes/scan-mute-operations.ts | 4 +- .../bsync/src/routes/scan-notif-operations.ts | 4 +- packages/bsync/tests/mutes.test.ts | 4 +- packages/bsync/tests/notifications.test.ts | 4 +- packages/common-web/src/tid.ts | 4 +- packages/common-web/tests/check.test.ts | 2 +- packages/common-web/tests/tid.test.ts | 2 +- packages/common/package.json | 3 + packages/common/src/fs.ts | 4 +- packages/common/src/ipld.ts | 8 +- packages/common/src/logger.ts | 4 +- packages/common/src/streams.ts | 2 +- packages/common/tests/ipld-multi.test.ts | 2 +- packages/common/tests/ipld-vectors.ts | 2 - packages/common/tests/ipld.test.ts | 2 +- packages/common/tests/streams.test.ts | 2 +- packages/crypto/package.json | 3 + packages/crypto/src/did.ts | 3 +- packages/crypto/src/p256/keypair.ts | 7 +- packages/crypto/src/p256/operations.ts | 1 - packages/crypto/src/p256/plugin.ts | 9 +- packages/crypto/src/plugins.ts | 6 +- packages/crypto/src/secp256k1/keypair.ts | 3 - packages/crypto/src/secp256k1/operations.ts | 1 - packages/crypto/src/secp256k1/plugin.ts | 9 +- packages/crypto/src/verify.ts | 2 +- packages/crypto/tests/did.test.ts | 2 +- packages/crypto/tests/key-compression.test.ts | 8 +- packages/crypto/tests/keypairs.test.ts | 6 +- packages/crypto/tests/signatures.test.ts | 18 +- packages/dev-env/package.json | 3 + packages/dev-env/src/bsky.ts | 6 +- packages/dev-env/src/feed-gen.ts | 10 +- packages/dev-env/src/introspect.ts | 6 +- packages/dev-env/src/mock/index.ts | 6 +- packages/dev-env/src/moderator-client.ts | 4 +- packages/dev-env/src/network-no-appview.ts | 8 +- packages/dev-env/src/network.ts | 16 +- packages/dev-env/src/ozone-service-profile.ts | 2 +- packages/dev-env/src/ozone.ts | 10 +- packages/dev-env/src/pds.ts | 10 +- packages/dev-env/src/plc.ts | 2 +- packages/dev-env/src/seed/author-feed.ts | 2 +- packages/dev-env/src/seed/basic.ts | 4 +- packages/dev-env/src/seed/client.ts | 11 +- packages/dev-env/src/seed/likes.ts | 2 +- packages/dev-env/src/seed/quotes.ts | 2 +- packages/dev-env/src/seed/reposts.ts | 2 +- packages/dev-env/src/types.ts | 4 +- packages/dev-env/src/util.ts | 6 +- packages/did/src/atproto.ts | 5 +- packages/did/src/did-document.ts | 1 - packages/identity/package.json | 3 + packages/identity/src/did/atproto-data.ts | 12 +- packages/identity/src/did/base-resolver.ts | 10 +- packages/identity/src/did/did-resolver.ts | 10 +- packages/identity/src/did/memory-cache.ts | 2 +- packages/identity/src/did/plc-resolver.ts | 2 +- packages/identity/src/did/web-resolver.ts | 2 +- packages/identity/src/handle/index.ts | 2 +- packages/identity/src/id-resolver.ts | 2 +- packages/identity/tests/did-cache.test.ts | 8 +- packages/identity/tests/did-resolver.test.ts | 8 +- .../identity/tests/handle-resolver.test.ts | 2 +- packages/identity/tests/web/db.ts | 2 - packages/identity/tests/web/server.ts | 6 +- .../did-resolver/src/did-cache-memory.ts | 1 - .../internal/did-resolver/src/did-cache.ts | 5 +- .../did-resolver/src/did-resolver-base.ts | 7 +- .../internal/did-resolver/src/did-resolver.ts | 1 - .../internal/did-resolver/src/methods/plc.ts | 3 +- .../internal/did-resolver/src/methods/web.ts | 5 +- packages/internal/fetch-node/package.json | 3 + packages/internal/fetch-node/src/safe.ts | 3 +- packages/internal/fetch-node/src/unicast.ts | 12 +- packages/internal/fetch/src/fetch-response.ts | 5 +- .../handle-resolver-node/package.json | 3 + .../src/atproto-handle-resolver-node.ts | 1 - .../src/node-resolve-txt-factory.ts | 1 - .../src/app-view-handle-resolver.ts | 3 +- .../src/atproto-doh-handle-resolver.ts | 2 +- .../src/cached-handle-resolver.ts | 2 +- .../src/identity-resolver.ts | 6 +- .../package.json | 6 + .../src/index.ts | 1 - .../internal/simple-store-memory/src/index.ts | 3 +- .../simple-store/src/cached-getter.ts | 2 +- packages/lex-cli/package.json | 3 + packages/lex-cli/src/codegen/client.ts | 14 +- packages/lex-cli/src/codegen/common.ts | 4 +- packages/lex-cli/src/codegen/lex-gen.ts | 16 +- packages/lex-cli/src/codegen/server.ts | 14 +- packages/lex-cli/src/codegen/util.ts | 2 +- packages/lex-cli/src/index.ts | 14 +- packages/lex-cli/src/mdgen/index.ts | 2 +- packages/lex-cli/src/util.ts | 10 +- packages/lexicon/src/blob-refs.ts | 2 +- packages/lexicon/src/lexicons.ts | 14 +- packages/lexicon/src/serialize.ts | 6 +- packages/lexicon/src/validation.ts | 1 - packages/lexicon/src/validators/blob.ts | 2 +- packages/lexicon/src/validators/complex.ts | 3 +- packages/lexicon/src/validators/formats.ts | 8 +- packages/lexicon/src/validators/primitives.ts | 10 +- packages/lexicon/src/validators/xrpc.ts | 5 +- packages/oauth/jwk-jose/src/jose-key.ts | 29 +- .../oauth/jwk-webcrypto/src/webcrypto-key.ts | 3 +- packages/oauth/jwk/src/jwks.ts | 1 - packages/oauth/jwk/src/jwt.ts | 1 - .../rollup.config.js | 9 +- .../auth/credential/use-credential-auth.ts | 2 +- .../src/auth/oauth/use-oauth.ts | 1 - .../src/browser-oauth-client.ts | 7 +- .../src/browser-oauth-database.ts | 5 +- .../src/indexed-db-store.ts | 2 +- .../oauth-client-browser/src/indexed-db/db.ts | 2 +- packages/oauth/oauth-client-node/package.json | 3 + .../oauth-client-node/src/node-dpop-store.ts | 2 +- .../src/node-oauth-client.ts | 10 +- .../src/atproto-token-response.ts | 5 +- packages/oauth/oauth-client/src/fetch-dpop.ts | 4 +- ...-authorization-server-metadata-resolver.ts | 14 +- .../oauth/oauth-client/src/oauth-client.ts | 21 +- ...th-protected-resource-metadata-resolver.ts | 8 +- .../oauth/oauth-client/src/oauth-resolver.ts | 11 +- .../oauth-client/src/oauth-response-error.ts | 2 +- .../oauth-client/src/oauth-server-agent.ts | 5 +- .../oauth-client/src/oauth-server-factory.ts | 3 +- .../oauth/oauth-client/src/oauth-session.ts | 3 +- packages/oauth/oauth-client/src/runtime.ts | 3 +- .../oauth/oauth-client/src/session-getter.ts | 7 +- .../oauth/oauth-client/src/state-store.ts | 2 +- packages/oauth/oauth-client/src/types.ts | 5 +- .../src/validate-client-metadata.ts | 1 - packages/oauth/oauth-provider/package.json | 3 + .../oauth/oauth-provider/rollup.config.js | 9 +- .../src/account/account-store.ts | 3 +- .../oauth-provider/src/account/account.ts | 2 +- .../src/assets/app/hooks/use-api.ts | 3 +- .../oauth-provider/src/assets/app/lib/api.ts | 1 - .../src/assets/assets-middleware.ts | 1 - .../oauth/oauth-provider/src/assets/index.ts | 5 +- .../oauth-provider/src/client/client-auth.ts | 3 +- .../src/client/client-manager.ts | 27 +- .../oauth-provider/src/client/client-store.ts | 1 - .../oauth-provider/src/client/client-utils.ts | 1 - .../oauth/oauth-provider/src/client/client.ts | 27 +- .../oauth-provider/src/device/device-data.ts | 1 - .../src/device/device-details.ts | 1 - .../oauth-provider/src/device/device-id.ts | 1 - .../src/device/device-manager.ts | 5 +- .../oauth-provider/src/device/session-id.ts | 1 - .../oauth-provider/src/dpop/dpop-manager.ts | 2 - .../oauth-provider/src/dpop/dpop-nonce.ts | 1 - .../errors/invalid-client-metadata-error.ts | 2 +- .../src/errors/invalid-token-error.ts | 3 +- .../src/errors/www-authenticate-error.ts | 1 - .../oauth-provider/src/lib/http/accept.ts | 1 - .../oauth-provider/src/lib/http/middleware.ts | 2 +- .../oauth-provider/src/lib/http/request.ts | 5 +- .../oauth-provider/src/lib/http/response.ts | 1 - .../oauth-provider/src/lib/http/stream.ts | 7 +- .../src/lib/util/authorization-header.ts | 3 +- .../oauth-provider/src/lib/util/hostname.ts | 2 +- .../src/metadata/build-metadata.ts | 1 - .../oauth/oauth-provider/src/oauth-hooks.ts | 1 - .../oauth-provider/src/oauth-provider.ts | 17 +- .../oauth-provider/src/oauth-verifier.ts | 3 +- .../src/output/build-authorize-data.ts | 1 - .../src/output/build-error-payload.ts | 3 +- .../src/output/output-manager.ts | 5 +- .../src/output/send-authorize-redirect.ts | 3 +- .../src/output/send-web-page.ts | 5 +- .../src/replay/replay-manager.ts | 2 +- .../src/replay/replay-store-redis.ts | 1 - .../oauth/oauth-provider/src/request/code.ts | 1 - .../src/request/request-data.ts | 1 - .../oauth-provider/src/request/request-id.ts | 1 - .../src/request/request-info.ts | 2 +- .../src/request/request-manager.ts | 7 +- .../src/request/request-store-memory.ts | 2 +- .../src/request/request-store-redis.ts | 3 +- .../oauth-provider/src/request/request-uri.ts | 1 - .../src/signer/signed-token-payload.ts | 3 +- .../oauth/oauth-provider/src/signer/signer.ts | 3 +- .../oauth-provider/src/token/refresh-token.ts | 1 - .../oauth-provider/src/token/token-claims.ts | 3 +- .../oauth-provider/src/token/token-data.ts | 1 - .../oauth-provider/src/token/token-id.ts | 1 - .../oauth-provider/src/token/token-manager.ts | 3 +- .../src/token/verify-token-claims.ts | 1 - .../src/oauth-authorization-request-jar.ts | 2 +- .../src/oauth-authorization-request-par.ts | 1 - .../oauth-authorization-request-parameters.ts | 3 +- .../src/oauth-authorization-request-query.ts | 1 - .../src/oauth-authorization-request-uri.ts | 1 - .../oauth-authorization-server-metadata.ts | 1 - .../src/oauth-client-credentials.ts | 3 +- .../src/oauth-client-id-loopback.ts | 2 +- .../oauth-types/src/oauth-client-metadata.ts | 3 +- .../src/oauth-protected-resource-metadata.ts | 1 - .../oauth-types/src/oauth-redirect-uri.ts | 4 +- .../oauth-types/src/oauth-token-response.ts | 3 +- packages/oauth/oauth-types/src/uri.ts | 17 +- packages/ozone/bin/migration-create.ts | 4 +- packages/ozone/package.json | 3 + .../ozone/src/api/chat/getActorMetadata.ts | 4 +- .../ozone/src/api/chat/getMessageContext.ts | 4 +- packages/ozone/src/api/chat/index.ts | 2 +- .../src/api/communication/createTemplate.ts | 4 +- .../src/api/communication/deleteTemplate.ts | 2 +- .../src/api/communication/listTemplates.ts | 2 +- .../src/api/communication/updateTemplate.ts | 4 +- packages/ozone/src/api/health.ts | 8 +- packages/ozone/src/api/index.ts | 42 +- packages/ozone/src/api/label/fetchLabels.ts | 2 +- packages/ozone/src/api/label/queryLabels.ts | 6 +- .../ozone/src/api/label/subscribeLabels.ts | 6 +- .../ozone/src/api/moderation/emitEvent.ts | 12 +- packages/ozone/src/api/moderation/getEvent.ts | 2 +- .../ozone/src/api/moderation/getRecord.ts | 4 +- .../ozone/src/api/moderation/getRecords.ts | 4 +- packages/ozone/src/api/moderation/getRepo.ts | 2 +- packages/ozone/src/api/moderation/getRepos.ts | 2 +- .../ozone/src/api/moderation/queryEvents.ts | 2 +- .../ozone/src/api/moderation/queryStatuses.ts | 2 +- .../ozone/src/api/moderation/searchRepos.ts | 4 +- packages/ozone/src/api/proxied.ts | 2 +- packages/ozone/src/api/report/createReport.ts | 10 +- packages/ozone/src/api/server/getConfig.ts | 2 +- packages/ozone/src/api/set/addValues.ts | 2 +- packages/ozone/src/api/set/deleteSet.ts | 2 +- packages/ozone/src/api/set/deleteValues.ts | 2 +- packages/ozone/src/api/set/getValues.ts | 2 +- packages/ozone/src/api/set/querySets.ts | 2 +- packages/ozone/src/api/set/upsertSet.ts | 2 +- packages/ozone/src/api/setting/listOptions.ts | 2 +- .../ozone/src/api/setting/removeOptions.ts | 4 +- .../ozone/src/api/setting/upsertOption.ts | 10 +- packages/ozone/src/api/team/addMember.ts | 2 +- packages/ozone/src/api/team/deleteMember.ts | 2 +- packages/ozone/src/api/team/listMembers.ts | 2 +- packages/ozone/src/api/team/updateMember.ts | 2 +- packages/ozone/src/api/util.ts | 22 +- packages/ozone/src/api/well-known.ts | 8 +- .../src/communication-service/template.ts | 2 +- packages/ozone/src/config/config.ts | 2 +- packages/ozone/src/config/secrets.ts | 2 +- packages/ozone/src/context.ts | 27 +- packages/ozone/src/daemon/blob-diverter.ts | 15 +- packages/ozone/src/daemon/context.ts | 14 +- packages/ozone/src/daemon/event-pusher.ts | 12 +- packages/ozone/src/daemon/event-reverser.ts | 2 +- packages/ozone/src/daemon/index.ts | 2 +- .../src/daemon/materialized-view-refresher.ts | 2 +- packages/ozone/src/db/index.ts | 16 +- ...220T144630860Z-stats-materialized-views.ts | 4 +- packages/ozone/src/db/pagination.ts | 2 +- packages/ozone/src/db/schema/index.ts | 23 +- .../db/schema/moderation_subject_status.ts | 2 +- packages/ozone/src/db/types.ts | 2 +- packages/ozone/src/error.ts | 2 +- packages/ozone/src/index.ts | 22 +- packages/ozone/src/logger.ts | 2 +- packages/ozone/src/mod-service/index.ts | 66 +- packages/ozone/src/mod-service/status.ts | 2 +- packages/ozone/src/mod-service/subject.ts | 8 +- packages/ozone/src/mod-service/types.ts | 4 +- packages/ozone/src/mod-service/views.ts | 33 +- packages/ozone/src/sequencer/outbox.ts | 4 +- packages/ozone/src/sequencer/sequencer.ts | 12 +- packages/ozone/src/set/service.ts | 4 +- packages/ozone/src/setting/service.ts | 10 +- packages/ozone/src/setting/validators.ts | 2 +- .../ozone/src/tag-service/embed-tagger.ts | 6 +- packages/ozone/src/tag-service/index.ts | 6 +- .../ozone/src/tag-service/language-tagger.ts | 3 +- packages/ozone/src/team/index.ts | 12 +- packages/ozone/src/util.ts | 4 +- packages/ozone/tests/3p-labeler.test.ts | 10 +- packages/ozone/tests/_util.ts | 8 +- .../tests/ack-all-subjects-of-account.test.ts | 8 +- packages/ozone/tests/blob-divert.test.ts | 2 +- .../tests/communication-templates.test.ts | 2 +- packages/ozone/tests/content-tagger.test.ts | 2 +- packages/ozone/tests/get-config.test.ts | 2 +- packages/ozone/tests/get-lists.test.ts | 8 +- packages/ozone/tests/get-profiles.test.ts | 5 +- packages/ozone/tests/get-record.test.ts | 8 +- packages/ozone/tests/get-records.test.ts | 8 +- packages/ozone/tests/get-repo.test.ts | 6 +- packages/ozone/tests/get-repos.test.ts | 6 +- packages/ozone/tests/get-starter-pack.test.ts | 10 +- .../ozone/tests/moderation-appeals.test.ts | 12 +- .../ozone/tests/moderation-events.test.ts | 8 +- .../tests/moderation-status-tags.test.ts | 4 +- .../ozone/tests/moderation-statuses.test.ts | 16 +- packages/ozone/tests/moderation.test.ts | 18 +- packages/ozone/tests/protected-tags.test.ts | 6 +- packages/ozone/tests/query-labels.test.ts | 6 +- .../tests/record-and-account-events.test.ts | 15 +- packages/ozone/tests/repo-search.test.ts | 4 +- packages/ozone/tests/report-muting.test.ts | 12 +- packages/ozone/tests/sequencer.test.ts | 6 +- packages/ozone/tests/server.test.ts | 2 +- packages/ozone/tests/sets.test.ts | 4 +- packages/ozone/tests/settings.test.ts | 4 +- packages/ozone/tests/takedown.test.ts | 15 +- packages/ozone/tests/team.test.ts | 2 +- packages/pds/bin/migration-create.ts | 4 +- packages/pds/package.json | 3 + packages/pds/src/account-manager/db/index.ts | 2 +- .../db/schema/authorization-request.ts | 2 +- .../src/account-manager/db/schema/device.ts | 2 +- .../src/account-manager/db/schema/index.ts | 14 +- .../src/account-manager/db/schema/token.ts | 3 +- .../db/schema/used-refresh-token.ts | 2 +- .../src/account-manager/helpers/account.ts | 4 +- .../helpers/authorization-request.ts | 4 +- .../account-manager/helpers/device-account.ts | 3 +- .../pds/src/account-manager/helpers/device.ts | 6 +- .../account-manager/helpers/email-token.ts | 2 +- .../pds/src/account-manager/helpers/invite.ts | 2 +- .../src/account-manager/helpers/password.ts | 4 +- .../pds/src/account-manager/helpers/scrypt.ts | 4 +- .../pds/src/account-manager/helpers/token.ts | 2 +- packages/pds/src/account-manager/index.ts | 7 +- .../pds/src/actor-store/actor-store-reader.ts | 2 +- packages/pds/src/actor-store/actor-store.ts | 8 +- packages/pds/src/actor-store/blob/reader.ts | 4 +- .../pds/src/actor-store/blob/transactor.ts | 20 +- packages/pds/src/actor-store/db/index.ts | 2 +- .../pds/src/actor-store/db/schema/index.ts | 6 +- packages/pds/src/actor-store/migrate.ts | 2 +- .../src/actor-store/preference/transactor.ts | 4 +- packages/pds/src/actor-store/record/reader.ts | 4 +- .../pds/src/actor-store/record/transactor.ts | 6 +- packages/pds/src/actor-store/repo/reader.ts | 2 - .../src/actor-store/repo/sql-repo-reader.ts | 8 +- .../actor-store/repo/sql-repo-transactor.ts | 4 +- .../pds/src/actor-store/repo/transactor.ts | 8 +- .../src/api/app/bsky/actor/getPreferences.ts | 4 +- .../pds/src/api/app/bsky/actor/getProfile.ts | 4 +- .../pds/src/api/app/bsky/actor/getProfiles.ts | 4 +- packages/pds/src/api/app/bsky/actor/index.ts | 3 +- .../src/api/app/bsky/actor/putPreferences.ts | 4 +- .../src/api/app/bsky/feed/getActorLikes.ts | 4 +- .../src/api/app/bsky/feed/getAuthorFeed.ts | 6 +- packages/pds/src/api/app/bsky/feed/getFeed.ts | 8 +- .../src/api/app/bsky/feed/getPostThread.ts | 13 +- .../pds/src/api/app/bsky/feed/getTimeline.ts | 4 +- packages/pds/src/api/app/bsky/feed/index.ts | 2 +- packages/pds/src/api/app/bsky/index.ts | 2 +- .../src/api/app/bsky/notification/index.ts | 2 +- .../api/app/bsky/notification/registerPush.ts | 8 +- .../pds/src/api/app/bsky/util/resolver.ts | 2 +- .../api/com/atproto/admin/deleteAccount.ts | 4 +- .../atproto/admin/disableAccountInvites.ts | 2 +- .../com/atproto/admin/disableInviteCodes.ts | 2 +- .../com/atproto/admin/enableAccountInvites.ts | 2 +- .../api/com/atproto/admin/getAccountInfo.ts | 5 +- .../api/com/atproto/admin/getAccountInfos.ts | 2 +- .../api/com/atproto/admin/getInviteCodes.ts | 8 +- .../api/com/atproto/admin/getSubjectStatus.ts | 2 +- .../pds/src/api/com/atproto/admin/index.ts | 18 +- .../src/api/com/atproto/admin/sendEmail.ts | 4 +- .../com/atproto/admin/updateAccountEmail.ts | 2 +- .../com/atproto/admin/updateAccountHandle.ts | 2 +- .../atproto/admin/updateAccountPassword.ts | 2 +- .../com/atproto/admin/updateSubjectStatus.ts | 6 +- .../pds/src/api/com/atproto/admin/util.ts | 2 +- .../identity/getRecommendedDidCredentials.ts | 2 +- .../pds/src/api/com/atproto/identity/index.ts | 6 +- .../identity/requestPlcOperationSignature.ts | 6 +- .../api/com/atproto/identity/resolveHandle.ts | 4 +- .../com/atproto/identity/signPlcOperation.ts | 6 +- .../atproto/identity/submitPlcOperation.ts | 4 +- .../api/com/atproto/identity/updateHandle.ts | 6 +- packages/pds/src/api/com/atproto/index.ts | 2 +- .../com/atproto/moderation/createReport.ts | 8 +- .../src/api/com/atproto/moderation/index.ts | 2 +- .../src/api/com/atproto/repo/applyWrites.ts | 16 +- .../src/api/com/atproto/repo/createRecord.ts | 7 +- .../src/api/com/atproto/repo/deleteRecord.ts | 11 +- .../src/api/com/atproto/repo/describeRepo.ts | 6 +- .../pds/src/api/com/atproto/repo/getRecord.ts | 4 +- .../src/api/com/atproto/repo/importRepo.ts | 14 +- .../pds/src/api/com/atproto/repo/index.ts | 6 +- .../api/com/atproto/repo/listMissingBlobs.ts | 2 +- .../src/api/com/atproto/repo/listRecords.ts | 4 +- .../pds/src/api/com/atproto/repo/putRecord.ts | 6 +- .../src/api/com/atproto/repo/uploadBlob.ts | 4 +- .../api/com/atproto/server/activateAccount.ts | 5 +- .../com/atproto/server/checkAccountStatus.ts | 2 +- .../api/com/atproto/server/confirmEmail.ts | 4 +- .../api/com/atproto/server/createAccount.ts | 13 +- .../com/atproto/server/createAppPassword.ts | 3 +- .../com/atproto/server/createInviteCode.ts | 2 +- .../com/atproto/server/createInviteCodes.ts | 4 +- .../api/com/atproto/server/createSession.ts | 3 +- .../com/atproto/server/deactivateAccount.ts | 2 +- .../api/com/atproto/server/deleteAccount.ts | 4 +- .../api/com/atproto/server/deleteSession.ts | 2 +- .../api/com/atproto/server/describeServer.ts | 2 +- .../atproto/server/getAccountInviteCodes.ts | 6 +- .../api/com/atproto/server/getServiceAuth.ts | 8 +- .../src/api/com/atproto/server/getSession.ts | 7 +- .../pds/src/api/com/atproto/server/index.ts | 45 +- .../com/atproto/server/listAppPasswords.ts | 3 +- .../api/com/atproto/server/refreshSession.ts | 5 +- .../atproto/server/requestAccountDelete.ts | 4 +- .../server/requestEmailConfirmation.ts | 4 +- .../com/atproto/server/requestEmailUpdate.ts | 6 +- .../atproto/server/requestPasswordReset.ts | 2 +- .../com/atproto/server/reserveSigningKey.ts | 2 +- .../api/com/atproto/server/resetPassword.ts | 4 +- .../com/atproto/server/revokeAppPassword.ts | 3 +- .../src/api/com/atproto/server/updateEmail.ts | 6 +- .../pds/src/api/com/atproto/server/util.ts | 6 +- .../atproto/sync/deprecated/getCheckout.ts | 2 +- .../com/atproto/sync/deprecated/getHead.ts | 2 +- .../pds/src/api/com/atproto/sync/getBlob.ts | 8 +- .../pds/src/api/com/atproto/sync/getBlocks.ts | 4 +- .../api/com/atproto/sync/getLatestCommit.ts | 2 +- .../pds/src/api/com/atproto/sync/getRecord.ts | 8 +- .../pds/src/api/com/atproto/sync/getRepo.ts | 8 +- .../src/api/com/atproto/sync/getRepoStatus.ts | 4 +- .../pds/src/api/com/atproto/sync/index.ts | 10 +- .../pds/src/api/com/atproto/sync/listBlobs.ts | 4 +- .../pds/src/api/com/atproto/sync/listRepos.ts | 6 +- .../api/com/atproto/sync/subscribeRepos.ts | 4 +- packages/pds/src/api/com/atproto/sync/util.ts | 2 +- .../api/com/atproto/temp/checkSignupQueue.ts | 4 +- .../pds/src/api/com/atproto/temp/index.ts | 2 +- packages/pds/src/api/index.ts | 4 +- packages/pds/src/api/proxy.ts | 2 +- packages/pds/src/auth-routes.ts | 5 +- packages/pds/src/auth-verifier.ts | 5 +- packages/pds/src/basic-routes.ts | 8 +- packages/pds/src/config/config.ts | 2 +- packages/pds/src/config/env.ts | 2 +- packages/pds/src/context.ts | 51 +- packages/pds/src/crawlers.ts | 2 +- packages/pds/src/db/db.ts | 10 +- packages/pds/src/db/migrator.ts | 2 +- packages/pds/src/db/tables/moderation.ts | 4 +- packages/pds/src/db/util.ts | 4 +- packages/pds/src/did-cache/db/index.ts | 2 +- packages/pds/src/did-cache/index.ts | 2 +- packages/pds/src/disk-blobstore.ts | 14 +- packages/pds/src/error.ts | 4 +- packages/pds/src/handle/index.ts | 4 +- packages/pds/src/image/index.ts | 4 +- packages/pds/src/index.ts | 28 +- packages/pds/src/logger.ts | 2 +- packages/pds/src/mailer/index.ts | 3 +- packages/pds/src/mailer/moderation.ts | 2 +- .../src/mailer/templates/confirm-email.d.ts | 2 +- .../src/mailer/templates/delete-account.d.ts | 2 +- .../src/mailer/templates/plc-operation.d.ts | 2 +- .../src/mailer/templates/reset-password.d.ts | 2 +- .../src/mailer/templates/update-email.d.ts | 2 +- packages/pds/src/oauth/provider.ts | 1 - packages/pds/src/pipethrough.ts | 10 +- packages/pds/src/read-after-write/types.ts | 6 +- packages/pds/src/read-after-write/util.ts | 5 +- packages/pds/src/read-after-write/viewer.ts | 34 +- packages/pds/src/redis.ts | 2 +- packages/pds/src/repo/prepare.ts | 36 +- packages/pds/src/repo/types.ts | 4 +- packages/pds/src/scripts/rebuild-repo.ts | 4 +- packages/pds/src/sequencer/db/index.ts | 2 +- packages/pds/src/sequencer/events.ts | 6 +- packages/pds/src/sequencer/outbox.ts | 4 +- packages/pds/src/sequencer/sequencer.ts | 24 +- packages/pds/src/util/compression.ts | 2 +- packages/pds/src/util/params.ts | 2 +- packages/pds/src/well-known.ts | 8 +- packages/pds/tests/_util.ts | 10 +- packages/pds/tests/account-deletion.test.ts | 14 +- packages/pds/tests/account-migration.test.ts | 6 +- packages/pds/tests/account.test.ts | 4 +- packages/pds/tests/app-passwords.test.ts | 2 +- packages/pds/tests/blob-deletes.test.ts | 4 +- packages/pds/tests/create-post.test.ts | 6 +- packages/pds/tests/crud.test.ts | 10 +- packages/pds/tests/email-confirmation.test.ts | 10 +- packages/pds/tests/entryway.test.ts | 10 +- packages/pds/tests/file-uploads.test.ts | 14 +- packages/pds/tests/handles.test.ts | 6 +- packages/pds/tests/invites-admin.test.ts | 2 +- packages/pds/tests/moderation.test.ts | 4 +- packages/pds/tests/moderator-auth.test.ts | 8 +- packages/pds/tests/oauth.test.ts | 8 +- packages/pds/tests/plc-operations.test.ts | 12 +- packages/pds/tests/preferences.test.ts | 4 +- packages/pds/tests/proxied/admin.test.ts | 4 +- packages/pds/tests/proxied/feedgen.test.ts | 8 +- packages/pds/tests/proxied/notif.test.ts | 10 +- packages/pds/tests/proxied/procedures.test.ts | 2 +- .../pds/tests/proxied/proxy-catchall.test.ts | 12 +- .../pds/tests/proxied/proxy-header.test.ts | 10 +- .../tests/proxied/read-after-write.test.ts | 12 +- packages/pds/tests/proxied/views.test.ts | 6 +- packages/pds/tests/races.test.ts | 4 +- packages/pds/tests/rate-limits.test.ts | 2 +- packages/pds/tests/sequencer.test.ts | 14 +- packages/pds/tests/server.test.ts | 8 +- packages/pds/tests/sync/list.test.ts | 2 +- .../pds/tests/sync/subscribe-repos.test.ts | 18 +- packages/pds/tests/sync/sync.test.ts | 6 +- packages/pds/tests/takedown-appeal.test.ts | 2 +- packages/repo/bench/mst.bench.ts | 4 +- packages/repo/package.json | 3 + packages/repo/src/block-map.ts | 4 +- packages/repo/src/data-diff.ts | 6 +- packages/repo/src/mst/diff.ts | 4 +- packages/repo/src/mst/mst.ts | 17 +- packages/repo/src/mst/util.ts | 6 +- packages/repo/src/mst/walker.ts | 2 - packages/repo/src/parse.ts | 6 +- packages/repo/src/readable-repo.ts | 14 +- packages/repo/src/repo.ts | 18 +- .../repo/src/storage/memory-blockstore.ts | 4 +- .../repo/src/storage/readable-blockstore.ts | 4 +- packages/repo/src/storage/sync-storage.ts | 4 +- packages/repo/src/storage/types.ts | 6 +- packages/repo/src/sync/consumer.ts | 14 +- packages/repo/src/sync/provider.ts | 6 +- packages/repo/src/types.ts | 8 +- packages/repo/src/util.ts | 25 +- packages/repo/tests/_util.ts | 18 +- packages/repo/tests/commit-data.test.ts | 2 +- packages/repo/tests/mst.test.ts | 8 +- packages/repo/tests/proofs.test.ts | 1 - packages/repo/tests/repo.test.ts | 6 +- packages/repo/tests/sync.test.ts | 5 +- packages/sync/package.json | 3 + packages/sync/src/events.ts | 2 +- packages/sync/src/firehose/index.ts | 30 +- packages/sync/src/firehose/lexicons.ts | 3 +- packages/sync/src/runner/memory-runner.ts | 2 - packages/sync/src/util.ts | 2 +- packages/sync/tests/firehose.test.ts | 6 +- packages/syntax/src/aturi_validation.ts | 2 +- packages/syntax/tests/aturi.test.ts | 4 +- packages/syntax/tests/datetime.test.ts | 8 +- packages/syntax/tests/did.test.ts | 6 +- packages/syntax/tests/handle.test.ts | 8 +- packages/syntax/tests/nsid.test.ts | 8 +- packages/syntax/tests/recordkey.test.ts | 6 +- packages/syntax/tests/tid.test.ts | 6 +- packages/xrpc-server/package.json | 3 + packages/xrpc-server/src/auth.ts | 2 +- packages/xrpc-server/src/rate-limiter.ts | 2 +- packages/xrpc-server/src/server.ts | 41 +- packages/xrpc-server/src/stream/frames.ts | 8 +- packages/xrpc-server/src/stream/server.ts | 6 +- packages/xrpc-server/src/stream/stream.ts | 6 +- .../xrpc-server/src/stream/subscription.ts | 2 +- .../src/stream/websocket-keepalive.ts | 2 +- packages/xrpc-server/src/types.ts | 70 +- packages/xrpc-server/src/util.ts | 19 +- packages/xrpc-server/tests/_util.ts | 2 +- packages/xrpc-server/tests/auth.test.ts | 8 +- packages/xrpc-server/tests/bodies.test.ts | 8 +- packages/xrpc-server/tests/errors.test.ts | 2 +- packages/xrpc-server/tests/frames.test.ts | 2 +- packages/xrpc-server/tests/ipld.test.ts | 4 +- packages/xrpc-server/tests/parameters.test.ts | 2 +- packages/xrpc-server/tests/procedures.test.ts | 4 +- packages/xrpc-server/tests/queries.test.ts | 2 +- packages/xrpc-server/tests/responses.test.ts | 4 +- packages/xrpc-server/tests/stream.test.ts | 6 +- .../xrpc-server/tests/subscriptions.test.ts | 10 +- packages/xrpc/src/client.ts | 2 +- packages/xrpc/src/index.ts | 2 + packages/xrpc/src/util.ts | 4 +- pnpm-lock.yaml | 895 ++++++++++++++++++ services/bsky/api.js | 8 +- services/bsync/index.js | 4 +- services/ozone/api.js | 6 +- services/pds/index.js | 2 +- services/pds/run-script.js | 2 +- services/pds/tracer.js | 5 +- 818 files changed, 3563 insertions(+), 2717 deletions(-) create mode 100644 .changeset/fair-tigers-thank.md create mode 100644 .changeset/mighty-actors-complain.md create mode 100644 .changeset/olive-teachers-yawn.md create mode 100644 .vscode/settings.json delete mode 100644 packages/api/bench/agent.bench.ts diff --git a/.changeset/fair-tigers-thank.md b/.changeset/fair-tigers-thank.md new file mode 100644 index 00000000000..9491e3c47c2 --- /dev/null +++ b/.changeset/fair-tigers-thank.md @@ -0,0 +1,41 @@ +--- +"@atproto-labs/rollup-plugin-bundle-manifest": patch +"@atproto/oauth-client-browser-example": patch +"@atproto-labs/handle-resolver-node": patch +"@atproto-labs/simple-store-memory": patch +"@atproto-labs/identity-resolver": patch +"@atproto/oauth-client-browser": patch +"@atproto-labs/handle-resolver": patch +"@atproto/oauth-client-node": patch +"@atproto-labs/did-resolver": patch +"@atproto-labs/simple-store": patch +"@atproto/oauth-provider": patch +"@atproto-labs/fetch-node": patch +"@atproto/jwk-webcrypto": patch +"@atproto/oauth-client": patch +"@atproto/oauth-types": patch +"@atproto-labs/fetch": patch +"@atproto/jwk-jose": patch +"@atproto/xrpc-server": patch +"@atproto/common-web": patch +"@atproto/jwk": patch +"@atproto/identity": patch +"@atproto/dev-env": patch +"@atproto/lex-cli": patch +"@atproto/lexicon": patch +"@atproto/common": patch +"@atproto/crypto": patch +"@atproto/syntax": patch +"@atproto/bsync": patch +"@atproto/ozone": patch +"@atproto/bsky": patch +"@atproto/repo": patch +"@atproto/sync": patch +"@atproto/xrpc": patch +"@atproto/api": patch +"@atproto/aws": patch +"@atproto/did": patch +"@atproto/pds": patch +--- + +Apply new linting rules regarding import order diff --git a/.changeset/mighty-actors-complain.md b/.changeset/mighty-actors-complain.md new file mode 100644 index 00000000000..02236e7d574 --- /dev/null +++ b/.changeset/mighty-actors-complain.md @@ -0,0 +1,22 @@ +--- +"@atproto-labs/rollup-plugin-bundle-manifest": patch +"@atproto-labs/handle-resolver-node": patch +"@atproto/oauth-client-node": patch +"@atproto/oauth-provider": patch +"@atproto-labs/fetch-node": patch +"@atproto/xrpc-server": patch +"@atproto/identity": patch +"@atproto/dev-env": patch +"@atproto/lex-cli": patch +"@atproto/common": patch +"@atproto/crypto": patch +"@atproto/bsync": patch +"@atproto/ozone": patch +"@atproto/bsky": patch +"@atproto/repo": patch +"@atproto/sync": patch +"@atproto/aws": patch +"@atproto/pds": patch +--- + +Update NodeJS engine requirement to >=18.7.0 diff --git a/.changeset/olive-teachers-yawn.md b/.changeset/olive-teachers-yawn.md new file mode 100644 index 00000000000..2211f115909 --- /dev/null +++ b/.changeset/olive-teachers-yawn.md @@ -0,0 +1,5 @@ +--- +"@atproto/oauth-types": patch +--- + +Support environments not providing URL.canParse diff --git a/.eslintrc b/.eslintrc index 8529167b1fd..8afe9bb56dc 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,24 +1,48 @@ { "root": true, - // parse TypeScript files - // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/parser - "parser": "@typescript-eslint/parser", - // configure eslint using options described at - // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin - "plugins": ["@typescript-eslint"], "extends": [ "eslint:recommended", + "plugin:@typescript-eslint/base", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", "plugin:prettier/recommended", - "prettier" + "plugin:import/recommended", + "plugin:import/typescript" ], + "plugins": ["n"], "ignorePatterns": ["dist", "node_modules"], "rules": { "no-var": "error", "prefer-const": "warn", "no-misleading-character-class": "warn", "eqeqeq": ["error", "always", { "null": "ignore" }], + "n/global-require": "error", + "n/no-extraneous-import": "error", + "n/prefer-node-protocol": "error", + "import/extensions": ["off", "ignorePackages"], + "import/export": "off", + "import/namespace": "off", + "import/no-deprecated": "error", + "import/no-absolute-path": "error", + "import/no-dynamic-require": "error", + "import/no-self-import": "error", + "import/order": [ + "error", + { + "named": true, + "distinctGroup": true, + "alphabetize": { "order": "asc" }, + "newlines-between": "never", + "groups": [ + "builtin", + "external", + "internal", + "parent", + ["index", "sibling"], + "object" + ] + } + ], "@typescript-eslint/no-unused-vars": [ "warn", { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" } @@ -43,6 +67,33 @@ "rules": { "@typescript-eslint/no-var-requires": "off" } + }, + { + "files": ["**/*.test.ts", "**/tests/**/*.ts"], + "rules": { + "n/no-extraneous-import": [ + "error", + { "allowModules": ["@atproto/dev-env"] } + ] + } + } + ], + "settings": { + "node": { "version": ">=18.7.0" }, + "import/internal-regex": "^@atproto(?:-labs)?/", + "import/parsers": { "@typescript-eslint/parser": [".ts", ".tsx"] }, + "import/resolver": { + "typescript": { + "project": [ + "tsconfig.json", + "packages/oauth/*/tsconfig.json", + "packages/internal/*/tsconfig.json", + "packages/*/tsconfig.json" + ] + }, + "node": { + "extensions": [".js", ".jsx", ".json"] + } } - ] + } } diff --git a/.gitignore b/.gitignore index dccb907cf77..cda9f5843e8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,12 +5,12 @@ yarn-error.log packages/**/dist .idea packages/*/coverage -.vscode/ test.sqlite .DS_Store *.log *.tsbuildinfo .*.env +.env.* .env \#*\# *~ diff --git a/.prettierignore b/.prettierignore index 16e700de3db..681b5d03670 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,12 +1,8 @@ node_modules interop-test-files +__snapshots__ dist -build -.nyc_output -coverage pnpm-lock.yaml .pnpm* .changeset -*.d.ts -packages/bsky/src/data-plane/gen CHANGELOG.md diff --git a/.prettierrc b/.prettierrc index 078e423519b..d7161f6af07 100644 --- a/.prettierrc +++ b/.prettierrc @@ -9,6 +9,13 @@ "options": { "singleQuote": false } + }, + { + "files": [".eslintrc"], + "options": { + "parser": "json", + "trailingComma": "none" + } } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000000..b5230afc1a4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib", + "files.associations": { + "**/tsconfig/*.json": "jsonc" + } +} diff --git a/package.json b/package.json index e9de3327688..2601cf8493d 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "license": "MIT", "private": true, "engines": { - "node": "18" + "node": ">=18.7.0" }, "packageManager": "pnpm@8.15.9", "scripts": { @@ -43,6 +43,9 @@ "dotenv": "^16.0.3", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-n": "^17.15.0", "eslint-plugin-prettier": "^5.1.3", "jest": "^28.1.2", "node-gyp": "^9.3.1", diff --git a/packages/api/bench/agent.bench.ts b/packages/api/bench/agent.bench.ts deleted file mode 100644 index 333fbd49a20..00000000000 --- a/packages/api/bench/agent.bench.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { BskyAgent } from '@atproto/api' - -describe('Agent Benchmarks', () => { - it('Creates new Agent instance 10 times', () => { - for (let i = 0; i < 10; i++) { - new BskyAgent({ service: 'https://bsky.social' }) - } - }) -}) diff --git a/packages/api/src/agent.ts b/packages/api/src/agent.ts index 7613e58d1fa..b0be3ba7946 100644 --- a/packages/api/src/agent.ts +++ b/packages/api/src/agent.ts @@ -1,12 +1,7 @@ +import AwaitLock from 'await-lock' import { TID } from '@atproto/common-web' import { AtUri, ensureValidDid } from '@atproto/syntax' -import { - buildFetchHandler, - BuildFetchHandlerOptions, - FetchHandler, - XrpcClient, -} from '@atproto/xrpc' -import AwaitLock from 'await-lock' +import { FetchHandler, XrpcClient, buildFetchHandler } from '@atproto/xrpc' import { AppBskyActorDefs, AppBskyActorProfile, @@ -38,14 +33,14 @@ import { BskyThreadViewPreference, } from './types' import { - asDid, Did, + asDid, getSavedFeedType, isDid, sanitizeMutedWordValue, savedFeedsToUriArrays, - validateSavedFeed, validateNux, + validateSavedFeed, } from './util' const FEED_VIEW_PREF_DEFAULTS = { diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 43d46020e18..8ced8afe4ea 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -4,10 +4,10 @@ import { lexicons as internalLexicons } from './client/lexicons' export { AtUri } from '@atproto/syntax' export { BlobRef, + jsonStringToLex, + jsonToLex, lexToJson, stringifyLex, - jsonToLex, - jsonStringToLex, } from '@atproto/lexicon' export { parseLanguage } from '@atproto/common-web' export * from './types' @@ -22,7 +22,7 @@ export * from './rich-text/util' export * from './moderation' export * from './moderation/types' export * from './mocker' -export { LABELS, DEFAULT_LABEL_SETTINGS } from './moderation/const/labels' +export { DEFAULT_LABEL_SETTINGS, LABELS } from './moderation/const/labels' export { Agent } from './agent' export { AtpAgent, type AtpAgentOptions } from './atp-agent' diff --git a/packages/api/src/mocker.ts b/packages/api/src/mocker.ts index 556dba965c8..905268de8d4 100644 --- a/packages/api/src/mocker.ts +++ b/packages/api/src/mocker.ts @@ -1,11 +1,11 @@ import { - ComAtprotoLabelDefs, - AppBskyFeedDefs, AppBskyActorDefs, - AppBskyFeedPost, AppBskyEmbedRecord, + AppBskyFeedDefs, + AppBskyFeedPost, AppBskyGraphDefs, AppBskyNotificationListNotifications, + ComAtprotoLabelDefs, } from './client' const FAKE_CID = 'bafyreiclp443lavogvhj3d2ob2cxbfuscni2k5jk7bebjzg7khl3esabwq' diff --git a/packages/api/src/moderation/decision.ts b/packages/api/src/moderation/decision.ts index 042a90bbe45..bc33e100ca6 100644 --- a/packages/api/src/moderation/decision.ts +++ b/packages/api/src/moderation/decision.ts @@ -1,20 +1,20 @@ import { AppBskyGraphDefs } from '../client/index' +import { LABELS } from './const/labels' import { BLOCK_BEHAVIOR, - MUTE_BEHAVIOR, - MUTEWORD_BEHAVIOR, + CUSTOM_LABEL_VALUE_RE, HIDE_BEHAVIOR, - NOOP_BEHAVIOR, Label, LabelPreference, - ModerationCause, - ModerationOpts, LabelTarget, + MUTEWORD_BEHAVIOR, + MUTE_BEHAVIOR, ModerationBehavior, - CUSTOM_LABEL_VALUE_RE, + ModerationCause, + ModerationOpts, + NOOP_BEHAVIOR, } from './types' import { ModerationUI } from './ui' -import { LABELS } from './const/labels' enum ModerationBehaviorSeverity { High, diff --git a/packages/api/src/moderation/index.ts b/packages/api/src/moderation/index.ts index 503e635c816..b2375899fab 100644 --- a/packages/api/src/moderation/index.ts +++ b/packages/api/src/moderation/index.ts @@ -1,18 +1,18 @@ -import { - ModerationSubjectProfile, - ModerationSubjectPost, - ModerationSubjectNotification, - ModerationSubjectFeedGenerator, - ModerationSubjectUserList, - ModerationOpts, -} from './types' +import { ModerationDecision } from './decision' import { decideAccount } from './subjects/account' -import { decideProfile } from './subjects/profile' +import { decideFeedGenerator } from './subjects/feed-generator' import { decideNotification } from './subjects/notification' import { decidePost } from './subjects/post' -import { decideFeedGenerator } from './subjects/feed-generator' +import { decideProfile } from './subjects/profile' import { decideUserList } from './subjects/user-list' -import { ModerationDecision } from './decision' +import { + ModerationOpts, + ModerationSubjectFeedGenerator, + ModerationSubjectNotification, + ModerationSubjectPost, + ModerationSubjectProfile, + ModerationSubjectUserList, +} from './types' export { ModerationUI } from './ui' export { ModerationDecision } from './decision' diff --git a/packages/api/src/moderation/subjects/account.ts b/packages/api/src/moderation/subjects/account.ts index a1c873b7dd5..6014d46ffad 100644 --- a/packages/api/src/moderation/subjects/account.ts +++ b/packages/api/src/moderation/subjects/account.ts @@ -1,5 +1,5 @@ import { ModerationDecision } from '../decision' -import { Label, ModerationSubjectProfile, ModerationOpts } from '../types' +import { Label, ModerationOpts, ModerationSubjectProfile } from '../types' export function decideAccount( subject: ModerationSubjectProfile, diff --git a/packages/api/src/moderation/subjects/feed-generator.ts b/packages/api/src/moderation/subjects/feed-generator.ts index 3afada34b2d..8568f90f0ed 100644 --- a/packages/api/src/moderation/subjects/feed-generator.ts +++ b/packages/api/src/moderation/subjects/feed-generator.ts @@ -1,5 +1,5 @@ import { ModerationDecision } from '../decision' -import { ModerationSubjectFeedGenerator, ModerationOpts } from '../types' +import { ModerationOpts, ModerationSubjectFeedGenerator } from '../types' import { decideAccount } from './account' import { decideProfile } from './profile' diff --git a/packages/api/src/moderation/subjects/notification.ts b/packages/api/src/moderation/subjects/notification.ts index 610766866a8..2e3a8a09f9d 100644 --- a/packages/api/src/moderation/subjects/notification.ts +++ b/packages/api/src/moderation/subjects/notification.ts @@ -1,5 +1,5 @@ import { ModerationDecision } from '../decision' -import { ModerationSubjectNotification, ModerationOpts } from '../types' +import { ModerationOpts, ModerationSubjectNotification } from '../types' import { decideAccount } from './account' import { decideProfile } from './profile' diff --git a/packages/api/src/moderation/subjects/post.ts b/packages/api/src/moderation/subjects/post.ts index f17ec40293f..8d0b7c6db5b 100644 --- a/packages/api/src/moderation/subjects/post.ts +++ b/packages/api/src/moderation/subjects/post.ts @@ -1,14 +1,14 @@ -import { ModerationDecision } from '../decision' import { - AppBskyFeedPost, + AppBskyActorDefs, + AppBskyEmbedExternal, AppBskyEmbedImages, AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, - AppBskyEmbedExternal, - AppBskyActorDefs, + AppBskyFeedPost, } from '../../client' -import { ModerationSubjectPost, ModerationOpts } from '../types' +import { ModerationDecision } from '../decision' import { hasMutedWord } from '../mutewords' +import { ModerationOpts, ModerationSubjectPost } from '../types' import { decideAccount } from './account' import { decideProfile } from './profile' diff --git a/packages/api/src/moderation/subjects/profile.ts b/packages/api/src/moderation/subjects/profile.ts index f76e2bfa730..0dfcf67b658 100644 --- a/packages/api/src/moderation/subjects/profile.ts +++ b/packages/api/src/moderation/subjects/profile.ts @@ -1,5 +1,5 @@ import { ModerationDecision } from '../decision' -import { Label, ModerationSubjectProfile, ModerationOpts } from '../types' +import { Label, ModerationOpts, ModerationSubjectProfile } from '../types' export function decideProfile( subject: ModerationSubjectProfile, diff --git a/packages/api/src/moderation/subjects/user-list.ts b/packages/api/src/moderation/subjects/user-list.ts index f5ed15177d9..f2d5f408702 100644 --- a/packages/api/src/moderation/subjects/user-list.ts +++ b/packages/api/src/moderation/subjects/user-list.ts @@ -1,7 +1,7 @@ import { AtUri } from '@atproto/syntax' import { AppBskyActorDefs } from '../../client/index' import { ModerationDecision } from '../decision' -import { ModerationSubjectUserList, ModerationOpts } from '../types' +import { ModerationOpts, ModerationSubjectUserList } from '../types' import { decideAccount } from './account' import { decideProfile } from './profile' diff --git a/packages/api/src/moderation/types.ts b/packages/api/src/moderation/types.ts index bbf8d842f23..6d2371b113c 100644 --- a/packages/api/src/moderation/types.ts +++ b/packages/api/src/moderation/types.ts @@ -1,8 +1,8 @@ import { AppBskyActorDefs, AppBskyFeedDefs, - AppBskyNotificationListNotifications, AppBskyGraphDefs, + AppBskyNotificationListNotifications, ComAtprotoLabelDefs, } from '../client/index' import { KnownLabelValue } from './const/labels' diff --git a/packages/api/src/moderation/util.ts b/packages/api/src/moderation/util.ts index c7ac5bdf975..4c4c4eb210e 100644 --- a/packages/api/src/moderation/util.ts +++ b/packages/api/src/moderation/util.ts @@ -6,9 +6,9 @@ import { } from '../client' import { InterpretedLabelValueDefinition, - ModerationBehavior, LabelPreference, LabelValueDefinitionFlag, + ModerationBehavior, } from './types' export function isQuotedPost(embed: unknown): embed is AppBskyEmbedRecord.View { diff --git a/packages/api/src/rich-text/detection.ts b/packages/api/src/rich-text/detection.ts index 8d1e05521f9..f4b190e10fc 100644 --- a/packages/api/src/rich-text/detection.ts +++ b/packages/api/src/rich-text/detection.ts @@ -2,10 +2,10 @@ import TLDs from 'tlds' import { AppBskyRichtextFacet } from '../client' import { UnicodeString } from './unicode' import { - URL_REGEX, MENTION_REGEX, TAG_REGEX, TRAILING_PUNCTUATION_REGEX, + URL_REGEX, } from './util' export type Facet = AppBskyRichtextFacet.Main diff --git a/packages/api/src/rich-text/rich-text.ts b/packages/api/src/rich-text/rich-text.ts index 2b7d0227bc0..44f48b5f4b8 100644 --- a/packages/api/src/rich-text/rich-text.ts +++ b/packages/api/src/rich-text/rich-text.ts @@ -92,9 +92,9 @@ F: 0 1 2 3 4 5 6 7 8 910 // string indices */ import { AppBskyFeedPost, AppBskyRichtextFacet, AtpBaseClient } from '../client' -import { UnicodeString } from './unicode' -import { sanitizeRichText } from './sanitization' import { detectFacets } from './detection' +import { sanitizeRichText } from './sanitization' +import { UnicodeString } from './unicode' export type Facet = AppBskyRichtextFacet.Main export type FacetLink = AppBskyRichtextFacet.Link diff --git a/packages/api/src/util.ts b/packages/api/src/util.ts index 145ffba7fbe..5e9e28bf044 100644 --- a/packages/api/src/util.ts +++ b/packages/api/src/util.ts @@ -1,9 +1,8 @@ -import { AtUri } from '@atproto/syntax' +import { z } from 'zod' import { TID } from '@atproto/common-web' -import zod from 'zod' - -import { Nux } from './client/types/app/bsky/actor/defs' +import { AtUri } from '@atproto/syntax' import { AppBskyActorDefs } from './client' +import { Nux } from './client/types/app/bsky/actor/defs' export function sanitizeMutedWordValue(value: string) { return ( @@ -97,12 +96,12 @@ export const asDid = (value: string): Did => { throw new TypeError(`Invalid DID: ${value}`) } -export const nuxSchema = zod +export const nuxSchema = z .object({ - id: zod.string().max(64), - completed: zod.boolean(), - data: zod.string().max(300).optional(), - expiresAt: zod.string().datetime().optional(), + id: z.string().max(64), + completed: z.boolean(), + data: z.string().max(300).optional(), + expiresAt: z.string().datetime().optional(), }) .strict() diff --git a/packages/api/tests/atp-agent.test.ts b/packages/api/tests/atp-agent.test.ts index b2387dba3c8..823faf63682 100644 --- a/packages/api/tests/atp-agent.test.ts +++ b/packages/api/tests/atp-agent.test.ts @@ -1,5 +1,5 @@ -import { TestNetworkNoAppView } from '@atproto/dev-env' import { TID } from '@atproto/common-web' +import { TestNetworkNoAppView } from '@atproto/dev-env' import { AppBskyActorDefs, AppBskyActorProfile, diff --git a/packages/api/tests/dispatcher.test.ts b/packages/api/tests/dispatcher.test.ts index 0c686aa966a..11c4802ca25 100644 --- a/packages/api/tests/dispatcher.test.ts +++ b/packages/api/tests/dispatcher.test.ts @@ -1,13 +1,13 @@ +import assert from 'node:assert' import { AddressInfo } from 'node:net' -import assert from 'assert' +import { getPdsEndpoint, isValidDidDoc } from '@atproto/common-web' +import { TestNetworkNoAppView } from '@atproto/dev-env' import { AtpAgent, - AtpSessionEvent, AtpSessionData, + AtpSessionEvent, BSKY_LABELER_DID, } from '../src' -import { TestNetworkNoAppView } from '@atproto/dev-env' -import { getPdsEndpoint, isValidDidDoc } from '@atproto/common-web' import { createHeaderEchoServer } from './util/echo-server' const getPdsEndpointUrl = (...args: Parameters) => { diff --git a/packages/api/tests/errors.test.ts b/packages/api/tests/errors.test.ts index 2d903f2f17e..e2cfff26875 100644 --- a/packages/api/tests/errors.test.ts +++ b/packages/api/tests/errors.test.ts @@ -1,5 +1,5 @@ -import { AtpAgent, ComAtprotoServerCreateAccount } from '..' import { TestNetworkNoAppView } from '@atproto/dev-env' +import { AtpAgent, ComAtprotoServerCreateAccount } from '..' describe('errors', () => { let network: TestNetworkNoAppView diff --git a/packages/api/tests/moderation-behaviors.test.ts b/packages/api/tests/moderation-behaviors.test.ts index 7e8b54a69a0..a180828b59b 100644 --- a/packages/api/tests/moderation-behaviors.test.ts +++ b/packages/api/tests/moderation-behaviors.test.ts @@ -1,10 +1,10 @@ -import { moderateProfile, moderatePost } from '../src' +import { moderatePost, moderateProfile } from '../src' import { ModerationBehaviorSuiteRunner, - SuiteUsers, + ModerationTestSuiteScenario, SuiteConfigurations, SuiteScenarios, - ModerationTestSuiteScenario, + SuiteUsers, } from './util/moderation-behavior' const USERS: SuiteUsers = { diff --git a/packages/api/tests/moderation-custom-labels.test.ts b/packages/api/tests/moderation-custom-labels.test.ts index 3e051fb0498..0af184aeb06 100644 --- a/packages/api/tests/moderation-custom-labels.test.ts +++ b/packages/api/tests/moderation-custom-labels.test.ts @@ -1,10 +1,10 @@ import { - moderateProfile, - moderatePost, - mock, - ModerationOpts, InterpretedLabelValueDefinition, + ModerationOpts, interpretLabelValueDefinition, + mock, + moderatePost, + moderateProfile, } from '../src' import './util/moderation-behavior' diff --git a/packages/api/tests/moderation-mutewords.test.ts b/packages/api/tests/moderation-mutewords.test.ts index 681dddc73d8..b8eb014ee56 100644 --- a/packages/api/tests/moderation-mutewords.test.ts +++ b/packages/api/tests/moderation-mutewords.test.ts @@ -1,5 +1,4 @@ import { RichText, mock, moderatePost } from '../src/' - import { hasMutedWord } from '../src/moderation/mutewords' describe(`hasMutedWord`, () => { diff --git a/packages/api/tests/moderation-quoteposts.test.ts b/packages/api/tests/moderation-quoteposts.test.ts index 1ed415d3231..2041f190396 100644 --- a/packages/api/tests/moderation-quoteposts.test.ts +++ b/packages/api/tests/moderation-quoteposts.test.ts @@ -1,9 +1,9 @@ import { - moderatePost, - mock, - ModerationOpts, InterpretedLabelValueDefinition, + ModerationOpts, interpretLabelValueDefinition, + mock, + moderatePost, } from '../src' import './util/moderation-behavior' diff --git a/packages/api/tests/moderation.test.ts b/packages/api/tests/moderation.test.ts index d7d3f9d47bc..f85e4a5325a 100644 --- a/packages/api/tests/moderation.test.ts +++ b/packages/api/tests/moderation.test.ts @@ -1,11 +1,11 @@ +import { ModerationOpts } from '../dist' import { - moderateProfile, - moderatePost, - mock, interpretLabelValueDefinition, + mock, + moderatePost, + moderateProfile, } from '../src' import './util/moderation-behavior' -import { ModerationOpts } from '../dist' describe('Moderation', () => { it('Applies self-labels on profiles according to the global preferences', () => { diff --git a/packages/api/tests/rich-text-sanitization.test.ts b/packages/api/tests/rich-text-sanitization.test.ts index 6e2a889473d..45365df1fff 100644 --- a/packages/api/tests/rich-text-sanitization.test.ts +++ b/packages/api/tests/rich-text-sanitization.test.ts @@ -1,4 +1,4 @@ -import { RichText, sanitizeRichText, Facet, UnicodeString } from '../src' +import { Facet, RichText, UnicodeString, sanitizeRichText } from '../src' describe('sanitizeRichText: cleanNewlines', () => { it('removes more than two consecutive new lines', () => { diff --git a/packages/api/tests/util/moderation-behavior.ts b/packages/api/tests/util/moderation-behavior.ts index 9cc8a9a0761..f30986852f9 100644 --- a/packages/api/tests/util/moderation-behavior.ts +++ b/packages/api/tests/util/moderation-behavior.ts @@ -1,8 +1,8 @@ import { - ModerationUI, - ModerationOpts, ComAtprotoLabelDefs, LabelPreference, + ModerationOpts, + ModerationUI, } from '../../src' import { mock as m } from '../../src/mocker' diff --git a/packages/aws/package.json b/packages/aws/package.json index b277284b583..752d6850761 100644 --- a/packages/aws/package.json +++ b/packages/aws/package.json @@ -18,6 +18,9 @@ "scripts": { "build": "tsc --build tsconfig.build.json" }, + "engines": { + "node": ">=18.7.0" + }, "dependencies": { "@atproto/common": "workspace:^", "@atproto/crypto": "workspace:^", diff --git a/packages/aws/src/kms.ts b/packages/aws/src/kms.ts index da2eb1836db..7589307dd6d 100644 --- a/packages/aws/src/kms.ts +++ b/packages/aws/src/kms.ts @@ -1,8 +1,8 @@ import * as aws from '@aws-sdk/client-kms' import { secp256k1 as noble } from '@noble/curves/secp256k1' +import KeyEncoder from 'key-encoder' import * as ui8 from 'uint8arrays' import * as crypto from '@atproto/crypto' -import KeyEncoder from 'key-encoder' const keyEncoder = new KeyEncoder('secp256k1') diff --git a/packages/aws/src/s3.ts b/packages/aws/src/s3.ts index 81014d63f7d..682a5a0cc8b 100644 --- a/packages/aws/src/s3.ts +++ b/packages/aws/src/s3.ts @@ -1,9 +1,9 @@ +import stream from 'node:stream' import * as aws from '@aws-sdk/client-s3' import { Upload } from '@aws-sdk/lib-storage' -import { BlobStore, BlobNotFoundError } from '@atproto/repo' -import { randomStr } from '@atproto/crypto' import { CID } from 'multiformats/cid' -import stream from 'stream' +import { randomStr } from '@atproto/crypto' +import { BlobNotFoundError, BlobStore } from '@atproto/repo' export type S3Config = { bucket: string; uploadTimeoutMs?: number } & Omit< aws.S3ClientConfig, diff --git a/packages/bsky/bin/migration-create.ts b/packages/bsky/bin/migration-create.ts index 27edc5e0979..4d77afd94fd 100644 --- a/packages/bsky/bin/migration-create.ts +++ b/packages/bsky/bin/migration-create.ts @@ -1,7 +1,7 @@ #!/usr/bin/env ts-node -import * as fs from 'fs/promises' -import * as path from 'path' +import * as fs from 'node:fs/promises' +import * as path from 'node:path' export async function main() { const now = new Date() diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 796460106de..069885e6f4e 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -26,6 +26,9 @@ "migration:create": "ts-node ./bin/migration-create.ts", "buf:gen": "buf generate ../bsync/proto && buf generate ./proto" }, + "engines": { + "node": ">=18.7.0" + }, "dependencies": { "@atproto-labs/fetch-node": "workspace:*", "@atproto-labs/xrpc-utils": "workspace:*", diff --git a/packages/bsky/src/api/app/bsky/actor/getProfile.ts b/packages/bsky/src/api/app/bsky/actor/getProfile.ts index 046312114b6..a28d790459d 100644 --- a/packages/bsky/src/api/app/bsky/actor/getProfile.ts +++ b/packages/bsky/src/api/app/bsky/actor/getProfile.ts @@ -1,15 +1,15 @@ import { InvalidRequestError } from '@atproto/xrpc-server' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/actor/getProfile' -import AppContext from '../../../../context' -import { resHeaders } from '../../../util' -import { createPipeline, noRules } from '../../../../pipeline' +import { AppContext } from '../../../../context' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/actor/getProfile' +import { createPipeline, noRules } from '../../../../pipeline' import { Views } from '../../../../views' +import { resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { const getProfile = createPipeline(skeleton, hydration, noRules, presentation) diff --git a/packages/bsky/src/api/app/bsky/actor/getProfiles.ts b/packages/bsky/src/api/app/bsky/actor/getProfiles.ts index 3328bda7ad2..9f7eb8b5ef2 100644 --- a/packages/bsky/src/api/app/bsky/actor/getProfiles.ts +++ b/packages/bsky/src/api/app/bsky/actor/getProfiles.ts @@ -1,16 +1,16 @@ import { mapDefined } from '@atproto/common' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/actor/getProfiles' -import AppContext from '../../../../context' -import { resHeaders } from '../../../util' -import { createPipeline, noRules } from '../../../../pipeline' +import { AppContext } from '../../../../context' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' +import { Server } from '../../../../lexicon' import { ids } from '../../../../lexicon/lexicons' +import { QueryParams } from '../../../../lexicon/types/app/bsky/actor/getProfiles' +import { createPipeline, noRules } from '../../../../pipeline' +import { Views } from '../../../../views' +import { resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { const getProfile = createPipeline(skeleton, hydration, noRules, presentation) diff --git a/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts b/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts index 4af0927feed..b6f29a2ac25 100644 --- a/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts +++ b/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts @@ -1,18 +1,18 @@ -import { mapDefined, noUndefinedVals } from '@atproto/common' import { AtpAgent } from '@atproto/api' +import { mapDefined, noUndefinedVals } from '@atproto/common' import { HeadersMap } from '@atproto/xrpc' -import AppContext from '../../../../context' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/actor/getSuggestions' -import { createPipeline } from '../../../../pipeline' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' -import { DataPlaneClient } from '../../../../data-plane' import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/actor/getSuggestions' +import { createPipeline } from '../../../../pipeline' +import { Views } from '../../../../views' import { resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/actor/searchActors.ts b/packages/bsky/src/api/app/bsky/actor/searchActors.ts index 9e0d944e706..88dc6213cdb 100644 --- a/packages/bsky/src/api/app/bsky/actor/searchActors.ts +++ b/packages/bsky/src/api/app/bsky/actor/searchActors.ts @@ -1,7 +1,10 @@ -import AppContext from '../../../../context' -import { Server } from '../../../../lexicon' -import { mapDefined } from '@atproto/common' import { AtpAgent } from '@atproto/api' +import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/actor/searchActors' import { HydrationFnInput, @@ -10,10 +13,7 @@ import { SkeletonFnInput, createPipeline, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' -import { DataPlaneClient } from '../../../../data-plane' -import { parseString } from '../../../../hydration/util' import { resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/actor/searchActorsTypeahead.ts b/packages/bsky/src/api/app/bsky/actor/searchActorsTypeahead.ts index e5fbe0e3291..1808833d99f 100644 --- a/packages/bsky/src/api/app/bsky/actor/searchActorsTypeahead.ts +++ b/packages/bsky/src/api/app/bsky/actor/searchActorsTypeahead.ts @@ -1,7 +1,10 @@ -import AppContext from '../../../../context' -import { Server } from '../../../../lexicon' import { AtpAgent } from '@atproto/api' import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/actor/searchActorsTypeahead' import { HydrationFnInput, @@ -10,10 +13,7 @@ import { SkeletonFnInput, createPipeline, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' -import { DataPlaneClient } from '../../../../data-plane' -import { parseString } from '../../../../hydration/util' import { resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/feed/getActorFeeds.ts b/packages/bsky/src/api/app/bsky/feed/getActorFeeds.ts index 55624324aad..b71bead2d9e 100644 --- a/packages/bsky/src/api/app/bsky/feed/getActorFeeds.ts +++ b/packages/bsky/src/api/app/bsky/feed/getActorFeeds.ts @@ -1,17 +1,17 @@ -import { InvalidRequestError } from '@atproto/xrpc-server' import { mapDefined } from '@atproto/common' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getActorFeeds' -import AppContext from '../../../../context' -import { createPipeline, noRules } from '../../../../pipeline' +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' -import { DataPlaneClient } from '../../../../data-plane' import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getActorFeeds' +import { createPipeline, noRules } from '../../../../pipeline' +import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/feed/getActorLikes.ts b/packages/bsky/src/api/app/bsky/feed/getActorLikes.ts index 897a1c25149..1c83ddccab2 100644 --- a/packages/bsky/src/api/app/bsky/feed/getActorLikes.ts +++ b/packages/bsky/src/api/app/bsky/feed/getActorLikes.ts @@ -1,20 +1,20 @@ -import { InvalidRequestError } from '@atproto/xrpc-server' import { mapDefined } from '@atproto/common' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getActorLikes' -import AppContext from '../../../../context' -import { clearlyBadCursor, resHeaders } from '../../../util' -import { createPipeline } from '../../../../pipeline' +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' +import { FeedItem } from '../../../../hydration/feed' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' -import { DataPlaneClient } from '../../../../data-plane' import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getActorLikes' +import { createPipeline } from '../../../../pipeline' import { uriToDid as creatorFromUri } from '../../../../util/uris' -import { FeedItem } from '../../../../hydration/feed' +import { Views } from '../../../../views' +import { clearlyBadCursor, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { const getActorLikes = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts b/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts index d0804bde221..61ba783196f 100644 --- a/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts +++ b/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts @@ -1,23 +1,23 @@ import { mapDefined } from '@atproto/common' import { InvalidRequestError } from '@atproto/xrpc-server' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getAuthorFeed' -import AppContext from '../../../../context' -import { clearlyBadCursor, resHeaders } from '../../../util' -import { createPipeline } from '../../../../pipeline' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' +import { Actor } from '../../../../hydration/actor' +import { FeedItem, Post } from '../../../../hydration/feed' import { HydrateCtx, HydrationState, Hydrator, mergeStates, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' -import { DataPlaneClient } from '../../../../data-plane' import { parseString } from '../../../../hydration/util' -import { safePinnedPost, uriToDid } from '../../../../util/uris' -import { Actor } from '../../../../hydration/actor' -import { FeedItem, Post } from '../../../../hydration/feed' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getAuthorFeed' +import { createPipeline } from '../../../../pipeline' import { FeedType } from '../../../../proto/bsky_pb' +import { safePinnedPost, uriToDid } from '../../../../util/uris' +import { Views } from '../../../../views' +import { clearlyBadCursor, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { const getAuthorFeed = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getFeed.ts b/packages/bsky/src/api/app/bsky/feed/getFeed.ts index decd4a045fd..e61ac0e9474 100644 --- a/packages/bsky/src/api/app/bsky/feed/getFeed.ts +++ b/packages/bsky/src/api/app/bsky/feed/getFeed.ts @@ -1,17 +1,25 @@ -import { mapDefined } from '@atproto/common' +import { AppBskyFeedGetFeedSkeleton, AtpAgent } from '@atproto/api' +import { mapDefined, noUndefinedVals } from '@atproto/common' +import { ResponseType, XRPCError } from '@atproto/xrpc' import { InvalidRequestError, - UpstreamFailureError, ServerTimer, + UpstreamFailureError, serverTimingHeader, } from '@atproto/xrpc-server' -import { ResponseType, XRPCError } from '@atproto/xrpc' -import { AtpAgent, AppBskyFeedGetFeedSkeleton } from '@atproto/api' -import { noUndefinedVals } from '@atproto/common' +import { AppContext } from '../../../../context' +import { + Code, + getServiceEndpoint, + isDataplaneError, + unpackIdentityServices, +} from '../../../../data-plane' +import { FeedItem } from '../../../../hydration/feed' +import { HydrateCtx } from '../../../../hydration/hydrator' +import { Server } from '../../../../lexicon' +import { ids } from '../../../../lexicon/lexicons' import { QueryParams as GetFeedParams } from '../../../../lexicon/types/app/bsky/feed/getFeed' import { OutputSchema as SkeletonOutput } from '../../../../lexicon/types/app/bsky/feed/getFeedSkeleton' -import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { HydrationFnInput, PresentationFnInput, @@ -19,17 +27,8 @@ import { SkeletonFnInput, createPipeline, } from '../../../../pipeline' -import { HydrateCtx } from '../../../../hydration/hydrator' -import { FeedItem } from '../../../../hydration/feed' import { GetIdentityByDidResponse } from '../../../../proto/bsky_pb' -import { - Code, - getServiceEndpoint, - isDataplaneError, - unpackIdentityServices, -} from '../../../../data-plane' import { BSKY_USER_AGENT, resHeaders } from '../../../util' -import { ids } from '../../../../lexicon/lexicons' export default function (server: Server, ctx: AppContext) { const getFeed = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getFeedGenerator.ts b/packages/bsky/src/api/app/bsky/feed/getFeedGenerator.ts index 647bfdd090b..12ce1d4dc5c 100644 --- a/packages/bsky/src/api/app/bsky/feed/getFeedGenerator.ts +++ b/packages/bsky/src/api/app/bsky/feed/getFeedGenerator.ts @@ -1,13 +1,13 @@ import { InvalidRequestError } from '@atproto/xrpc-server' -import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' -import { GetIdentityByDidResponse } from '../../../../proto/bsky_pb' +import { AppContext } from '../../../../context' import { Code, getServiceEndpoint, isDataplaneError, unpackIdentityServices, } from '../../../../data-plane' +import { Server } from '../../../../lexicon' +import { GetIdentityByDidResponse } from '../../../../proto/bsky_pb' import { resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/feed/getFeedGenerators.ts b/packages/bsky/src/api/app/bsky/feed/getFeedGenerators.ts index 9bf3eaf267d..9f8dea404a9 100644 --- a/packages/bsky/src/api/app/bsky/feed/getFeedGenerators.ts +++ b/packages/bsky/src/api/app/bsky/feed/getFeedGenerators.ts @@ -1,13 +1,13 @@ import { mapDefined } from '@atproto/common' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getFeedGenerators' -import AppContext from '../../../../context' -import { createPipeline, noRules } from '../../../../pipeline' +import { AppContext } from '../../../../context' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getFeedGenerators' +import { createPipeline, noRules } from '../../../../pipeline' import { Views } from '../../../../views' import { resHeaders } from '../../../util' diff --git a/packages/bsky/src/api/app/bsky/feed/getLikes.ts b/packages/bsky/src/api/app/bsky/feed/getLikes.ts index e99630452ab..4e09bf00f00 100644 --- a/packages/bsky/src/api/app/bsky/feed/getLikes.ts +++ b/packages/bsky/src/api/app/bsky/feed/getLikes.ts @@ -1,20 +1,19 @@ import { mapDefined } from '@atproto/common' import { normalizeDatetimeAlways } from '@atproto/syntax' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getLikes' -import AppContext from '../../../../context' -import { createPipeline, RulesFnInput } from '../../../../pipeline' +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' import { HydrateCtx, HydrationState, Hydrator, - mergeStates, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getLikes' +import { RulesFnInput, createPipeline } from '../../../../pipeline' import { uriToDid as creatorFromUri } from '../../../../util/uris' +import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' -import { InvalidRequestError } from '@atproto/xrpc-server' export default function (server: Server, ctx: AppContext) { const getLikes = createPipeline(skeleton, hydration, noBlocks, presentation) diff --git a/packages/bsky/src/api/app/bsky/feed/getListFeed.ts b/packages/bsky/src/api/app/bsky/feed/getListFeed.ts index 7d30f3ac67c..e750350aba4 100644 --- a/packages/bsky/src/api/app/bsky/feed/getListFeed.ts +++ b/packages/bsky/src/api/app/bsky/feed/getListFeed.ts @@ -1,20 +1,20 @@ -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getListFeed' -import AppContext from '../../../../context' -import { clearlyBadCursor, resHeaders } from '../../../util' -import { createPipeline } from '../../../../pipeline' +import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' +import { FeedItem } from '../../../../hydration/feed' import { HydrateCtx, HydrationState, Hydrator, mergeStates, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' -import { DataPlaneClient } from '../../../../data-plane' -import { mapDefined } from '@atproto/common' import { parseString } from '../../../../hydration/util' -import { FeedItem } from '../../../../hydration/feed' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getListFeed' +import { createPipeline } from '../../../../pipeline' import { uriToDid } from '../../../../util/uris' +import { Views } from '../../../../views' +import { clearlyBadCursor, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { const getListFeed = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getPostThread.ts b/packages/bsky/src/api/app/bsky/feed/getPostThread.ts index e15f91aa617..5b6613b72b4 100644 --- a/packages/bsky/src/api/app/bsky/feed/getPostThread.ts +++ b/packages/bsky/src/api/app/bsky/feed/getPostThread.ts @@ -1,12 +1,14 @@ import { InvalidRequestError } from '@atproto/xrpc-server' +import { ServerConfig } from '../../../../config' +import { AppContext } from '../../../../context' +import { Code, DataPlaneClient, isDataplaneError } from '../../../../data-plane' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { isNotFoundPost } from '../../../../lexicon/types/app/bsky/feed/defs' import { - QueryParams, OutputSchema, + QueryParams, } from '../../../../lexicon/types/app/bsky/feed/getPostThread' -import AppContext from '../../../../context' -import { ATPROTO_REPO_REV, resHeaders } from '../../../util' import { HydrationFnInput, PresentationFnInput, @@ -14,11 +16,9 @@ import { createPipeline, noRules, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' -import { DataPlaneClient, isDataplaneError, Code } from '../../../../data-plane' import { postUriToThreadgateUri } from '../../../../util/uris' -import { ServerConfig } from '../../../../config' +import { Views } from '../../../../views' +import { ATPROTO_REPO_REV, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { const getPostThread = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getPosts.ts b/packages/bsky/src/api/app/bsky/feed/getPosts.ts index 86fa1cc3d72..6b441631054 100644 --- a/packages/bsky/src/api/app/bsky/feed/getPosts.ts +++ b/packages/bsky/src/api/app/bsky/feed/getPosts.ts @@ -1,17 +1,17 @@ import { dedupeStrs, mapDefined } from '@atproto/common' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getPosts' -import AppContext from '../../../../context' -import { createPipeline } from '../../../../pipeline' +import { AppContext } from '../../../../context' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' +import { Server } from '../../../../lexicon' +import { ids } from '../../../../lexicon/lexicons' +import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getPosts' +import { createPipeline } from '../../../../pipeline' import { uriToDid as creatorFromUri } from '../../../../util/uris' +import { Views } from '../../../../views' import { resHeaders } from '../../../util' -import { ids } from '../../../../lexicon/lexicons' export default function (server: Server, ctx: AppContext) { const getPosts = createPipeline(skeleton, hydration, noBlocks, presentation) diff --git a/packages/bsky/src/api/app/bsky/feed/getQuotes.ts b/packages/bsky/src/api/app/bsky/feed/getQuotes.ts index 630f02d5dd1..d7c7f95d3dc 100644 --- a/packages/bsky/src/api/app/bsky/feed/getQuotes.ts +++ b/packages/bsky/src/api/app/bsky/feed/getQuotes.ts @@ -1,17 +1,17 @@ -import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' -import { createPipeline } from '../../../../pipeline' -import { clearlyBadCursor, resHeaders } from '../../../util' +import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' -import { mapDefined } from '@atproto/common' -import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getQuotes' import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getQuotes' +import { createPipeline } from '../../../../pipeline' import { uriToDid } from '../../../../util/uris' +import { Views } from '../../../../views' +import { clearlyBadCursor, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { const getQuotes = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getRepostedBy.ts b/packages/bsky/src/api/app/bsky/feed/getRepostedBy.ts index 6055c55798d..cf514bbf84b 100644 --- a/packages/bsky/src/api/app/bsky/feed/getRepostedBy.ts +++ b/packages/bsky/src/api/app/bsky/feed/getRepostedBy.ts @@ -1,16 +1,16 @@ import { mapDefined } from '@atproto/common' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getRepostedBy' -import AppContext from '../../../../context' -import { createPipeline } from '../../../../pipeline' +import { AppContext } from '../../../../context' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getRepostedBy' +import { createPipeline } from '../../../../pipeline' import { uriToDid as creatorFromUri } from '../../../../util/uris' +import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/feed/getSuggestedFeeds.ts b/packages/bsky/src/api/app/bsky/feed/getSuggestedFeeds.ts index ad13b3a0a31..17e91c5449c 100644 --- a/packages/bsky/src/api/app/bsky/feed/getSuggestedFeeds.ts +++ b/packages/bsky/src/api/app/bsky/feed/getSuggestedFeeds.ts @@ -1,7 +1,7 @@ import { mapDefined } from '@atproto/common' -import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' +import { AppContext } from '../../../../context' import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' import { resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/feed/getTimeline.ts b/packages/bsky/src/api/app/bsky/feed/getTimeline.ts index 37f1b601b0b..31930e9995e 100644 --- a/packages/bsky/src/api/app/bsky/feed/getTimeline.ts +++ b/packages/bsky/src/api/app/bsky/feed/getTimeline.ts @@ -1,18 +1,18 @@ -import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' -import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getTimeline' -import { clearlyBadCursor, resHeaders } from '../../../util' -import { createPipeline } from '../../../../pipeline' +import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' +import { FeedItem } from '../../../../hydration/feed' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' -import { DataPlaneClient } from '../../../../data-plane' import { parseString } from '../../../../hydration/util' -import { mapDefined } from '@atproto/common' -import { FeedItem } from '../../../../hydration/feed' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/getTimeline' +import { createPipeline } from '../../../../pipeline' +import { Views } from '../../../../views' +import { clearlyBadCursor, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { const getTimeline = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/searchPosts.ts b/packages/bsky/src/api/app/bsky/feed/searchPosts.ts index 853c5453032..d0d31951820 100644 --- a/packages/bsky/src/api/app/bsky/feed/searchPosts.ts +++ b/packages/bsky/src/api/app/bsky/feed/searchPosts.ts @@ -1,7 +1,10 @@ -import AppContext from '../../../../context' -import { Server } from '../../../../lexicon' import { AtpAgent } from '@atproto/api' import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/feed/searchPosts' import { HydrationFnInput, @@ -10,11 +13,8 @@ import { SkeletonFnInput, createPipeline, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' -import { DataPlaneClient } from '../../../../data-plane' -import { parseString } from '../../../../hydration/util' import { uriToDid as creatorFromUri } from '../../../../util/uris' +import { Views } from '../../../../views' import { resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/graph/getActorStarterPacks.ts b/packages/bsky/src/api/app/bsky/graph/getActorStarterPacks.ts index e56efe17a3f..744297b9726 100644 --- a/packages/bsky/src/api/app/bsky/graph/getActorStarterPacks.ts +++ b/packages/bsky/src/api/app/bsky/graph/getActorStarterPacks.ts @@ -1,20 +1,20 @@ +import { mapDefined } from '@atproto/common' import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { parseString } from '../../../../hydration/util' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getActorStarterPacks' -import AppContext from '../../../../context' import { - createPipeline, HydrationFnInput, - noRules, PresentationFnInput, SkeletonFnInput, + createPipeline, + noRules, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' import { resHeaders } from '../../../util' -import { DataPlaneClient } from '../../../../data-plane' -import { parseString } from '../../../../hydration/util' -import { mapDefined } from '@atproto/common' export default function (server: Server, ctx: AppContext) { const getActorStarterPacks = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getBlocks.ts b/packages/bsky/src/api/app/bsky/graph/getBlocks.ts index 3042b07ed13..bed8610babd 100644 --- a/packages/bsky/src/api/app/bsky/graph/getBlocks.ts +++ b/packages/bsky/src/api/app/bsky/graph/getBlocks.ts @@ -1,15 +1,15 @@ import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getBlocks' -import AppContext from '../../../../context' import { - createPipeline, HydrationFnInput, - noRules, PresentationFnInput, SkeletonFnInput, + createPipeline, + noRules, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' diff --git a/packages/bsky/src/api/app/bsky/graph/getFollowers.ts b/packages/bsky/src/api/app/bsky/graph/getFollowers.ts index 76a501a3c6e..80594ab1665 100644 --- a/packages/bsky/src/api/app/bsky/graph/getFollowers.ts +++ b/packages/bsky/src/api/app/bsky/graph/getFollowers.ts @@ -1,8 +1,13 @@ import { mapDefined } from '@atproto/common' import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { + HydrateCtx, + Hydrator, + mergeStates, +} from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getFollowers' -import AppContext from '../../../../context' import { HydrationFnInput, PresentationFnInput, @@ -11,11 +16,6 @@ import { createPipeline, } from '../../../../pipeline' import { uriToDid as didFromUri } from '../../../../util/uris' -import { - HydrateCtx, - Hydrator, - mergeStates, -} from '../../../../hydration/hydrator' import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' diff --git a/packages/bsky/src/api/app/bsky/graph/getFollows.ts b/packages/bsky/src/api/app/bsky/graph/getFollows.ts index 94aac9cdbcb..46bf7af6677 100644 --- a/packages/bsky/src/api/app/bsky/graph/getFollows.ts +++ b/packages/bsky/src/api/app/bsky/graph/getFollows.ts @@ -1,8 +1,13 @@ import { mapDefined } from '@atproto/common' import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { + HydrateCtx, + Hydrator, + mergeStates, +} from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getFollowers' -import AppContext from '../../../../context' import { HydrationFnInput, PresentationFnInput, @@ -10,11 +15,6 @@ import { SkeletonFnInput, createPipeline, } from '../../../../pipeline' -import { - HydrateCtx, - Hydrator, - mergeStates, -} from '../../../../hydration/hydrator' import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' diff --git a/packages/bsky/src/api/app/bsky/graph/getKnownFollowers.ts b/packages/bsky/src/api/app/bsky/graph/getKnownFollowers.ts index 71501ba2344..b314e0a1dad 100644 --- a/packages/bsky/src/api/app/bsky/graph/getKnownFollowers.ts +++ b/packages/bsky/src/api/app/bsky/graph/getKnownFollowers.ts @@ -1,8 +1,9 @@ import { mapDefined } from '@atproto/common' import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getKnownFollowers' -import AppContext from '../../../../context' import { HydrationFnInput, PresentationFnInput, @@ -10,7 +11,6 @@ import { SkeletonFnInput, createPipeline, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' diff --git a/packages/bsky/src/api/app/bsky/graph/getList.ts b/packages/bsky/src/api/app/bsky/graph/getList.ts index 995bc294c6e..e009637c489 100644 --- a/packages/bsky/src/api/app/bsky/graph/getList.ts +++ b/packages/bsky/src/api/app/bsky/graph/getList.ts @@ -1,25 +1,25 @@ import { mapDefined } from '@atproto/common' import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { + HydrateCtx, + HydrationState, + Hydrator, + mergeManyStates, +} from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getList' -import AppContext from '../../../../context' import { - createPipeline, HydrationFnInput, PresentationFnInput, RulesFnInput, SkeletonFnInput, + createPipeline, } from '../../../../pipeline' -import { - HydrateCtx, - HydrationState, - Hydrator, - mergeManyStates, -} from '../../../../hydration/hydrator' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' import { ListItemInfo } from '../../../../proto/bsky_pb' import { uriToDid as didFromUri } from '../../../../util/uris' +import { Views } from '../../../../views' +import { clearlyBadCursor, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { const getList = createPipeline(skeleton, hydration, noBlocks, presentation) diff --git a/packages/bsky/src/api/app/bsky/graph/getListBlocks.ts b/packages/bsky/src/api/app/bsky/graph/getListBlocks.ts index 89f79edbb8f..70fd3c9b4a2 100644 --- a/packages/bsky/src/api/app/bsky/graph/getListBlocks.ts +++ b/packages/bsky/src/api/app/bsky/graph/getListBlocks.ts @@ -1,15 +1,15 @@ import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getListBlocks' -import AppContext from '../../../../context' import { - createPipeline, HydrationFnInput, - noRules, PresentationFnInput, SkeletonFnInput, + createPipeline, + noRules, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' diff --git a/packages/bsky/src/api/app/bsky/graph/getListMutes.ts b/packages/bsky/src/api/app/bsky/graph/getListMutes.ts index fbd62c215c7..61f951d06d2 100644 --- a/packages/bsky/src/api/app/bsky/graph/getListMutes.ts +++ b/packages/bsky/src/api/app/bsky/graph/getListMutes.ts @@ -1,15 +1,15 @@ import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getListBlocks' -import AppContext from '../../../../context' import { - createPipeline, HydrationFnInput, - noRules, PresentationFnInput, SkeletonFnInput, + createPipeline, + noRules, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' diff --git a/packages/bsky/src/api/app/bsky/graph/getLists.ts b/packages/bsky/src/api/app/bsky/graph/getLists.ts index 31d241710c2..e913658a9ba 100644 --- a/packages/bsky/src/api/app/bsky/graph/getLists.ts +++ b/packages/bsky/src/api/app/bsky/graph/getLists.ts @@ -1,17 +1,17 @@ import { mapDefined } from '@atproto/common' import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getLists' import { REFERENCELIST } from '../../../../lexicon/types/app/bsky/graph/defs' -import AppContext from '../../../../context' +import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getLists' import { - createPipeline, HydrationFnInput, PresentationFnInput, RulesFnInput, SkeletonFnInput, + createPipeline, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' diff --git a/packages/bsky/src/api/app/bsky/graph/getMutes.ts b/packages/bsky/src/api/app/bsky/graph/getMutes.ts index 1f417c32b39..c28671ad716 100644 --- a/packages/bsky/src/api/app/bsky/graph/getMutes.ts +++ b/packages/bsky/src/api/app/bsky/graph/getMutes.ts @@ -1,9 +1,8 @@ import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getMutes' -import AppContext from '../../../../context' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' import { HydrationFnInput, PresentationFnInput, @@ -11,6 +10,7 @@ import { createPipeline, noRules, } from '../../../../pipeline' +import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/graph/getRelationships.ts b/packages/bsky/src/api/app/bsky/graph/getRelationships.ts index 47aaa6cd083..b311ac918a9 100644 --- a/packages/bsky/src/api/app/bsky/graph/getRelationships.ts +++ b/packages/bsky/src/api/app/bsky/graph/getRelationships.ts @@ -1,5 +1,5 @@ +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' export default function (server: Server, ctx: AppContext) { server.app.bsky.graph.getRelationships({ diff --git a/packages/bsky/src/api/app/bsky/graph/getStarterPack.ts b/packages/bsky/src/api/app/bsky/graph/getStarterPack.ts index 770f79294ff..8832bfd5f38 100644 --- a/packages/bsky/src/api/app/bsky/graph/getStarterPack.ts +++ b/packages/bsky/src/api/app/bsky/graph/getStarterPack.ts @@ -1,15 +1,15 @@ import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getStarterPack' -import AppContext from '../../../../context' import { - createPipeline, HydrationFnInput, - noRules, PresentationFnInput, SkeletonFnInput, + createPipeline, + noRules, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' import { resHeaders } from '../../../util' diff --git a/packages/bsky/src/api/app/bsky/graph/getStarterPacks.ts b/packages/bsky/src/api/app/bsky/graph/getStarterPacks.ts index 845bc87b19c..dac4baf0315 100644 --- a/packages/bsky/src/api/app/bsky/graph/getStarterPacks.ts +++ b/packages/bsky/src/api/app/bsky/graph/getStarterPacks.ts @@ -1,15 +1,15 @@ import { dedupeStrs, mapDefined } from '@atproto/common' -import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getStarterPacks' -import AppContext from '../../../../context' -import { resHeaders } from '../../../util' -import { createPipeline, noRules } from '../../../../pipeline' +import { AppContext } from '../../../../context' import { HydrateCtx, HydrationState, Hydrator, } from '../../../../hydration/hydrator' +import { Server } from '../../../../lexicon' +import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getStarterPacks' +import { createPipeline, noRules } from '../../../../pipeline' import { Views } from '../../../../views' +import { resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { const getStarterPacks = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts b/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts index c7eec21bad9..9aeb9816c81 100644 --- a/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts +++ b/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts @@ -1,10 +1,11 @@ +import { AtpAgent } from '@atproto/api' import { mapDefined, noUndefinedVals } from '@atproto/common' -import { InvalidRequestError } from '@atproto/xrpc-server' -import AtpAgent from '@atproto/api' import { HeadersMap } from '@atproto/xrpc' +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/getSuggestedFollowsByActor' -import AppContext from '../../../../context' import { HydrationFnInput, PresentationFnInput, @@ -12,7 +13,6 @@ import { SkeletonFnInput, createPipeline, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' import { resHeaders } from '../../../util' diff --git a/packages/bsky/src/api/app/bsky/graph/muteActor.ts b/packages/bsky/src/api/app/bsky/graph/muteActor.ts index 051e5564b9e..2f25af7966e 100644 --- a/packages/bsky/src/api/app/bsky/graph/muteActor.ts +++ b/packages/bsky/src/api/app/bsky/graph/muteActor.ts @@ -1,6 +1,6 @@ import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { MuteOperation_Type } from '../../../../proto/bsync_pb' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/graph/muteActorList.ts b/packages/bsky/src/api/app/bsky/graph/muteActorList.ts index 2f9f8c7573f..177e6a7c21f 100644 --- a/packages/bsky/src/api/app/bsky/graph/muteActorList.ts +++ b/packages/bsky/src/api/app/bsky/graph/muteActorList.ts @@ -1,5 +1,5 @@ +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { MuteOperation_Type } from '../../../../proto/bsync_pb' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/graph/muteThread.ts b/packages/bsky/src/api/app/bsky/graph/muteThread.ts index a0e1cf9df00..013a6772519 100644 --- a/packages/bsky/src/api/app/bsky/graph/muteThread.ts +++ b/packages/bsky/src/api/app/bsky/graph/muteThread.ts @@ -1,5 +1,5 @@ +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { MuteOperation_Type } from '../../../../proto/bsync_pb' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/graph/searchStarterPacks.ts b/packages/bsky/src/api/app/bsky/graph/searchStarterPacks.ts index 53ca0dba859..5665950a63c 100644 --- a/packages/bsky/src/api/app/bsky/graph/searchStarterPacks.ts +++ b/packages/bsky/src/api/app/bsky/graph/searchStarterPacks.ts @@ -1,7 +1,10 @@ -import AppContext from '../../../../context' -import { Server } from '../../../../lexicon' +import { AtpAgent } from '@atproto/api' import { mapDefined } from '@atproto/common' -import { AtpAgent, AtUri } from '@atproto/api' +import { AppContext } from '../../../../context' +import { DataPlaneClient } from '../../../../data-plane' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/graph/searchStarterPacks' import { HydrationFnInput, @@ -10,12 +13,9 @@ import { SkeletonFnInput, createPipeline, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { uriToDid as creatorFromUri } from '../../../../util/uris' import { Views } from '../../../../views' -import { DataPlaneClient } from '../../../../data-plane' -import { parseString } from '../../../../hydration/util' import { resHeaders } from '../../../util' -import { uriToDid as creatorFromUri } from '../../../../util/uris' export default function (server: Server, ctx: AppContext) { const searchStarterPacks = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/unmuteActor.ts b/packages/bsky/src/api/app/bsky/graph/unmuteActor.ts index 5462d7a7117..393da722d5c 100644 --- a/packages/bsky/src/api/app/bsky/graph/unmuteActor.ts +++ b/packages/bsky/src/api/app/bsky/graph/unmuteActor.ts @@ -1,6 +1,6 @@ import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { MuteOperation_Type } from '../../../../proto/bsync_pb' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/graph/unmuteActorList.ts b/packages/bsky/src/api/app/bsky/graph/unmuteActorList.ts index 2c80e42187f..8ebd4c7006c 100644 --- a/packages/bsky/src/api/app/bsky/graph/unmuteActorList.ts +++ b/packages/bsky/src/api/app/bsky/graph/unmuteActorList.ts @@ -1,5 +1,5 @@ +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { MuteOperation_Type } from '../../../../proto/bsync_pb' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/graph/unmuteThread.ts b/packages/bsky/src/api/app/bsky/graph/unmuteThread.ts index d8e53200317..55507633a38 100644 --- a/packages/bsky/src/api/app/bsky/graph/unmuteThread.ts +++ b/packages/bsky/src/api/app/bsky/graph/unmuteThread.ts @@ -1,5 +1,5 @@ +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { MuteOperation_Type } from '../../../../proto/bsync_pb' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/labeler/getServices.ts b/packages/bsky/src/api/app/bsky/labeler/getServices.ts index f5df1cbf5ca..c40b6a4b13f 100644 --- a/packages/bsky/src/api/app/bsky/labeler/getServices.ts +++ b/packages/bsky/src/api/app/bsky/labeler/getServices.ts @@ -1,6 +1,6 @@ -import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { mapDefined } from '@atproto/common' +import { AppContext } from '../../../../context' +import { Server } from '../../../../lexicon' import { resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/notification/getUnreadCount.ts b/packages/bsky/src/api/app/bsky/notification/getUnreadCount.ts index fe58a66b0a5..1b25638dd10 100644 --- a/packages/bsky/src/api/app/bsky/notification/getUnreadCount.ts +++ b/packages/bsky/src/api/app/bsky/notification/getUnreadCount.ts @@ -1,7 +1,8 @@ import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' import { QueryParams } from '../../../../lexicon/types/app/bsky/notification/getUnreadCount' -import AppContext from '../../../../context' import { HydrationFnInput, PresentationFnInput, @@ -9,7 +10,6 @@ import { createPipeline, noRules, } from '../../../../pipeline' -import { Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/notification/listNotifications.ts b/packages/bsky/src/api/app/bsky/notification/listNotifications.ts index 8f4fa2f073e..07d11dac56e 100644 --- a/packages/bsky/src/api/app/bsky/notification/listNotifications.ts +++ b/packages/bsky/src/api/app/bsky/notification/listNotifications.ts @@ -1,20 +1,20 @@ -import { InvalidRequestError } from '@atproto/xrpc-server' import { mapDefined } from '@atproto/common' +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' -import { QueryParams } from '../../../../lexicon/types/app/bsky/notification/listNotifications' import { isRecord as isPostRecord } from '../../../../lexicon/types/app/bsky/feed/post' -import AppContext from '../../../../context' +import { QueryParams } from '../../../../lexicon/types/app/bsky/notification/listNotifications' import { - createPipeline, HydrationFnInput, PresentationFnInput, RulesFnInput, SkeletonFnInput, + createPipeline, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' -import { Views } from '../../../../views' import { Notification } from '../../../../proto/bsky_pb' import { uriToDid as didFromUri } from '../../../../util/uris' +import { Views } from '../../../../views' import { clearlyBadCursor, resHeaders } from '../../../util' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/notification/putPreferences.ts b/packages/bsky/src/api/app/bsky/notification/putPreferences.ts index 7cafa2283ad..901b2549fb5 100644 --- a/packages/bsky/src/api/app/bsky/notification/putPreferences.ts +++ b/packages/bsky/src/api/app/bsky/notification/putPreferences.ts @@ -1,5 +1,5 @@ +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' export default function (server: Server, ctx: AppContext) { server.app.bsky.notification.putPreferences({ diff --git a/packages/bsky/src/api/app/bsky/notification/registerPush.ts b/packages/bsky/src/api/app/bsky/notification/registerPush.ts index 32c04b608f7..959a20acec6 100644 --- a/packages/bsky/src/api/app/bsky/notification/registerPush.ts +++ b/packages/bsky/src/api/app/bsky/notification/registerPush.ts @@ -2,8 +2,8 @@ import { InvalidRequestError, MethodNotImplementedError, } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { AppPlatform } from '../../../../proto/courier_pb' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/notification/updateSeen.ts b/packages/bsky/src/api/app/bsky/notification/updateSeen.ts index 923b4dfe4b6..2ecdea14c86 100644 --- a/packages/bsky/src/api/app/bsky/notification/updateSeen.ts +++ b/packages/bsky/src/api/app/bsky/notification/updateSeen.ts @@ -1,7 +1,7 @@ -import murmur from 'murmurhash' import { Struct, Timestamp } from '@bufbuild/protobuf' +import { v3 as murmurV3 } from 'murmurhash' +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' export default function (server: Server, ctx: AppContext) { server.app.bsky.notification.updateSeen({ @@ -45,5 +45,5 @@ function getNotifId(viewer: string, seenAt: Date) { const key = ['mark-read-generic', viewer, seenAt.getTime().toString()].join( '::', ) - return murmur.v3(key).toString(16) + return murmurV3(key).toString(16) } diff --git a/packages/bsky/src/api/app/bsky/unspecced/getConfig.ts b/packages/bsky/src/api/app/bsky/unspecced/getConfig.ts index f77c4a1993e..441c3f1fe2b 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getConfig.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getConfig.ts @@ -1,5 +1,5 @@ +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' // THIS IS A TEMPORARY UNSPECCED ROUTE export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts b/packages/bsky/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts index d9694382709..8753c44ae80 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts @@ -1,7 +1,7 @@ import { mapDefined } from '@atproto/common' -import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' +import { AppContext } from '../../../../context' import { parseString } from '../../../../hydration/util' +import { Server } from '../../../../lexicon' import { clearlyBadCursor, resHeaders } from '../../../util' // THIS IS A TEMPORARY UNSPECCED ROUTE diff --git a/packages/bsky/src/api/app/bsky/unspecced/getTaggedSuggestions.ts b/packages/bsky/src/api/app/bsky/unspecced/getTaggedSuggestions.ts index 79df4857945..ffe077505db 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getTaggedSuggestions.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getTaggedSuggestions.ts @@ -1,5 +1,5 @@ +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' // THIS IS A TEMPORARY UNSPECCED ROUTE export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/unspecced/getTrendingTopics.ts b/packages/bsky/src/api/app/bsky/unspecced/getTrendingTopics.ts index 35187f78135..7c53caecb1b 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getTrendingTopics.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getTrendingTopics.ts @@ -1,19 +1,19 @@ +import AtpAgent from '@atproto/api' import { noUndefinedVals } from '@atproto/common' -import AppContext from '../../../../context' +import { InternalServerError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Server } from '../../../../lexicon' +import { TrendingTopic } from '../../../../lexicon/types/app/bsky/unspecced/defs' +import { QueryParams } from '../../../../lexicon/types/app/bsky/unspecced/getTrendingTopics' import { - createPipeline, HydrationFnInput, PresentationFnInput, RulesFnInput, SkeletonFnInput, + createPipeline, } from '../../../../pipeline' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' import { Views } from '../../../../views' -import { QueryParams } from '../../../../lexicon/types/app/bsky/unspecced/getTrendingTopics' -import AtpAgent from '@atproto/api' -import { TrendingTopic } from '../../../../lexicon/types/app/bsky/unspecced/defs' -import { InternalServerError } from '@atproto/xrpc-server' export default function (server: Server, ctx: AppContext) { const getTrendingTopics = createPipeline( diff --git a/packages/bsky/src/api/blob-dispatcher.ts b/packages/bsky/src/api/blob-dispatcher.ts index 24dd9694571..3baa89a0c1e 100644 --- a/packages/bsky/src/api/blob-dispatcher.ts +++ b/packages/bsky/src/api/blob-dispatcher.ts @@ -1,6 +1,5 @@ -import { isUnicastIp, unicastLookup } from '@atproto-labs/fetch-node' import { Agent, Dispatcher, Pool, RetryAgent } from 'undici' - +import { isUnicastIp, unicastLookup } from '@atproto-labs/fetch-node' import { ServerConfig } from '../config' import { RETRYABLE_HTTP_STATUS_CODES } from '../util/retry' diff --git a/packages/bsky/src/api/blob-resolver.ts b/packages/bsky/src/api/blob-resolver.ts index 562c1003843..c7098065ffd 100644 --- a/packages/bsky/src/api/blob-resolver.ts +++ b/packages/bsky/src/api/blob-resolver.ts @@ -1,23 +1,22 @@ +import { Duplex, Transform, Writable } from 'node:stream' +import { pipeline } from 'node:stream/promises' +import createError, { isHttpError } from 'http-errors' +import { CID } from 'multiformats/cid' +import { Dispatcher } from 'undici' +import { + VerifyCidError, + VerifyCidTransform, + createDecoders, +} from '@atproto/common' +import { AtprotoDid, isAtprotoDid } from '@atproto/did' import { ACCEPT_ENCODING_COMPRESSED, ACCEPT_ENCODING_UNCOMPRESSED, buildProxiedContentEncoding, formatAcceptHeader, } from '@atproto-labs/xrpc-utils' -import { - createDecoders, - VerifyCidError, - VerifyCidTransform, -} from '@atproto/common' -import { AtprotoDid, isAtprotoDid } from '@atproto/did' -import createError, { isHttpError } from 'http-errors' -import { CID } from 'multiformats/cid' -import { Duplex, Transform, Writable } from 'node:stream' -import { pipeline } from 'node:stream/promises' -import { Dispatcher } from 'undici' - import { ServerConfig } from '../config' -import AppContext from '../context' +import { AppContext } from '../context' import { Code, DataPlaneClient, diff --git a/packages/bsky/src/api/com/atproto/admin/getAccountInfos.ts b/packages/bsky/src/api/com/atproto/admin/getAccountInfos.ts index 788e7dbefc6..4efee135c3f 100644 --- a/packages/bsky/src/api/com/atproto/admin/getAccountInfos.ts +++ b/packages/bsky/src/api/com/atproto/admin/getAccountInfos.ts @@ -1,7 +1,7 @@ -import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { mapDefined } from '@atproto/common' import { INVALID_HANDLE } from '@atproto/syntax' +import { AppContext } from '../../../../context' +import { Server } from '../../../../lexicon' export default function (server: Server, ctx: AppContext) { server.com.atproto.admin.getAccountInfos({ diff --git a/packages/bsky/src/api/com/atproto/admin/getSubjectStatus.ts b/packages/bsky/src/api/com/atproto/admin/getSubjectStatus.ts index 3be4c1c0185..74078737578 100644 --- a/packages/bsky/src/api/com/atproto/admin/getSubjectStatus.ts +++ b/packages/bsky/src/api/com/atproto/admin/getSubjectStatus.ts @@ -1,6 +1,6 @@ import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { OutputSchema } from '../../../../lexicon/types/com/atproto/admin/getSubjectStatus' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/com/atproto/admin/updateSubjectStatus.ts b/packages/bsky/src/api/com/atproto/admin/updateSubjectStatus.ts index 8256efbe7e5..14cf1b9a50d 100644 --- a/packages/bsky/src/api/com/atproto/admin/updateSubjectStatus.ts +++ b/packages/bsky/src/api/com/atproto/admin/updateSubjectStatus.ts @@ -1,10 +1,10 @@ import { Timestamp } from '@bufbuild/protobuf' import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { - isRepoRef, isRepoBlobRef, + isRepoRef, } from '../../../../lexicon/types/com/atproto/admin/defs' import { isMain as isStrongRef } from '../../../../lexicon/types/com/atproto/repo/strongRef' diff --git a/packages/bsky/src/api/com/atproto/identity/resolveHandle.ts b/packages/bsky/src/api/com/atproto/identity/resolveHandle.ts index 6cb524c6ec2..f917ede3de8 100644 --- a/packages/bsky/src/api/com/atproto/identity/resolveHandle.ts +++ b/packages/bsky/src/api/com/atproto/identity/resolveHandle.ts @@ -1,7 +1,7 @@ -import { InvalidRequestError } from '@atproto/xrpc-server' import * as ident from '@atproto/syntax' +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' export default function (server: Server, ctx: AppContext) { server.com.atproto.identity.resolveHandle(async ({ req, params }) => { diff --git a/packages/bsky/src/api/com/atproto/label/queryLabels.ts b/packages/bsky/src/api/com/atproto/label/queryLabels.ts index dbbf32d1049..f9d2b14485d 100644 --- a/packages/bsky/src/api/com/atproto/label/queryLabels.ts +++ b/packages/bsky/src/api/com/atproto/label/queryLabels.ts @@ -1,6 +1,6 @@ -import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { Server } from '../../../../lexicon' export default function (server: Server, ctx: AppContext) { server.com.atproto.label.queryLabels(async ({ params }) => { diff --git a/packages/bsky/src/api/com/atproto/repo/getRecord.ts b/packages/bsky/src/api/com/atproto/repo/getRecord.ts index bb8c8660ae7..c7c9897c3af 100644 --- a/packages/bsky/src/api/com/atproto/repo/getRecord.ts +++ b/packages/bsky/src/api/com/atproto/repo/getRecord.ts @@ -1,7 +1,7 @@ -import { InvalidRequestError } from '@atproto/xrpc-server' import { AtUri } from '@atproto/syntax' +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' export default function (server: Server, ctx: AppContext) { server.com.atproto.repo.getRecord({ diff --git a/packages/bsky/src/api/com/atproto/temp/fetchLabels.ts b/packages/bsky/src/api/com/atproto/temp/fetchLabels.ts index 044a8d4dfd4..5bbebc40af5 100644 --- a/packages/bsky/src/api/com/atproto/temp/fetchLabels.ts +++ b/packages/bsky/src/api/com/atproto/temp/fetchLabels.ts @@ -1,6 +1,6 @@ -import { Server } from '../../../../lexicon' -import AppContext from '../../../../context' import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../../../context' +import { Server } from '../../../../lexicon' export default function (server: Server, _ctx: AppContext) { server.com.atproto.temp.fetchLabels(async (_reqCtx) => { diff --git a/packages/bsky/src/api/health.ts b/packages/bsky/src/api/health.ts index 8b0f42dae95..dd385909007 100644 --- a/packages/bsky/src/api/health.ts +++ b/packages/bsky/src/api/health.ts @@ -1,8 +1,8 @@ -import express from 'express' -import AppContext from '../context' +import { Router } from 'express' +import { AppContext } from '../context' -export const createRouter = (ctx: AppContext): express.Router => { - const router = express.Router() +export const createRouter = (ctx: AppContext): Router => { + const router = Router() router.get('/', function (req, res) { res.type('text/plain') diff --git a/packages/bsky/src/api/index.ts b/packages/bsky/src/api/index.ts index a8eaabf291c..3eb292664c0 100644 --- a/packages/bsky/src/api/index.ts +++ b/packages/bsky/src/api/index.ts @@ -1,8 +1,12 @@ +import { AppContext } from '../context' import { Server } from '../lexicon' -import AppContext from '../context' -import getTimeline from './app/bsky/feed/getTimeline' +import getProfile from './app/bsky/actor/getProfile' +import getProfiles from './app/bsky/actor/getProfiles' +import getSuggestions from './app/bsky/actor/getSuggestions' +import searchActors from './app/bsky/actor/searchActors' +import searchActorsTypeahead from './app/bsky/actor/searchActorsTypeahead' import getActorFeeds from './app/bsky/feed/getActorFeeds' -import getSuggestedFeeds from './app/bsky/feed/getSuggestedFeeds' +import getActorLikes from './app/bsky/feed/getActorLikes' import getAuthorFeed from './app/bsky/feed/getAuthorFeed' import getFeed from './app/bsky/feed/getFeed' import getFeedGenerator from './app/bsky/feed/getFeedGenerator' @@ -11,53 +15,49 @@ import getLikes from './app/bsky/feed/getLikes' import getListFeed from './app/bsky/feed/getListFeed' import getPostThread from './app/bsky/feed/getPostThread' import getPosts from './app/bsky/feed/getPosts' -import searchPosts from './app/bsky/feed/searchPosts' -import getActorLikes from './app/bsky/feed/getActorLikes' import getQuotes from './app/bsky/feed/getQuotes' -import getProfile from './app/bsky/actor/getProfile' -import getProfiles from './app/bsky/actor/getProfiles' import getRepostedBy from './app/bsky/feed/getRepostedBy' +import getSuggestedFeeds from './app/bsky/feed/getSuggestedFeeds' +import getTimeline from './app/bsky/feed/getTimeline' +import searchPosts from './app/bsky/feed/searchPosts' import getActorStarterPacks from './app/bsky/graph/getActorStarterPacks' import getBlocks from './app/bsky/graph/getBlocks' -import getListBlocks from './app/bsky/graph/getListBlocks' import getFollowers from './app/bsky/graph/getFollowers' -import getKnownFollowers from './app/bsky/graph/getKnownFollowers' import getFollows from './app/bsky/graph/getFollows' +import getKnownFollowers from './app/bsky/graph/getKnownFollowers' import getList from './app/bsky/graph/getList' -import getLists from './app/bsky/graph/getLists' +import getListBlocks from './app/bsky/graph/getListBlocks' import getListMutes from './app/bsky/graph/getListMutes' +import getLists from './app/bsky/graph/getLists' import getMutes from './app/bsky/graph/getMutes' import getRelationships from './app/bsky/graph/getRelationships' import getStarterPack from './app/bsky/graph/getStarterPack' import getStarterPacks from './app/bsky/graph/getStarterPacks' -import searchStarterPacks from './app/bsky/graph/searchStarterPacks' +import getSuggestedFollowsByActor from './app/bsky/graph/getSuggestedFollowsByActor' import muteActor from './app/bsky/graph/muteActor' -import unmuteActor from './app/bsky/graph/unmuteActor' import muteActorList from './app/bsky/graph/muteActorList' -import unmuteActorList from './app/bsky/graph/unmuteActorList' import muteThread from './app/bsky/graph/muteThread' +import searchStarterPacks from './app/bsky/graph/searchStarterPacks' +import unmuteActor from './app/bsky/graph/unmuteActor' +import unmuteActorList from './app/bsky/graph/unmuteActorList' import unmuteThread from './app/bsky/graph/unmuteThread' -import getSuggestedFollowsByActor from './app/bsky/graph/getSuggestedFollowsByActor' -import getTrendingTopics from './app/bsky/unspecced/getTrendingTopics' import getLabelerServices from './app/bsky/labeler/getServices' -import searchActors from './app/bsky/actor/searchActors' -import searchActorsTypeahead from './app/bsky/actor/searchActorsTypeahead' -import getSuggestions from './app/bsky/actor/getSuggestions' import getUnreadCount from './app/bsky/notification/getUnreadCount' import listNotifications from './app/bsky/notification/listNotifications' -import updateSeen from './app/bsky/notification/updateSeen' import putPreferences from './app/bsky/notification/putPreferences' import registerPush from './app/bsky/notification/registerPush' +import updateSeen from './app/bsky/notification/updateSeen' import getConfig from './app/bsky/unspecced/getConfig' import getPopularFeedGenerators from './app/bsky/unspecced/getPopularFeedGenerators' import getTaggedSuggestions from './app/bsky/unspecced/getTaggedSuggestions' +import getTrendingTopics from './app/bsky/unspecced/getTrendingTopics' +import getAccountInfos from './com/atproto/admin/getAccountInfos' import getSubjectStatus from './com/atproto/admin/getSubjectStatus' import updateSubjectStatus from './com/atproto/admin/updateSubjectStatus' -import getAccountInfos from './com/atproto/admin/getAccountInfos' import resolveHandle from './com/atproto/identity/resolveHandle' +import queryLabels from './com/atproto/label/queryLabels' import getRecord from './com/atproto/repo/getRecord' import fetchLabels from './com/atproto/temp/fetchLabels' -import queryLabels from './com/atproto/label/queryLabels' export * as health from './health' diff --git a/packages/bsky/src/api/well-known.ts b/packages/bsky/src/api/well-known.ts index e628d0ab2be..cc65a0d8c4b 100644 --- a/packages/bsky/src/api/well-known.ts +++ b/packages/bsky/src/api/well-known.ts @@ -1,8 +1,8 @@ -import express from 'express' -import AppContext from '../context' +import { Router } from 'express' +import { AppContext } from '../context' -export const createRouter = (ctx: AppContext): express.Router => { - const router = express.Router() +export const createRouter = (ctx: AppContext): Router => { + const router = Router() const did = ctx.cfg.serverDid if (did.startsWith('did:web:')) { diff --git a/packages/bsky/src/auth-verifier.ts b/packages/bsky/src/auth-verifier.ts index d1bc06cc8d0..29cfa1bb4db 100644 --- a/packages/bsky/src/auth-verifier.ts +++ b/packages/bsky/src/auth-verifier.ts @@ -1,15 +1,16 @@ import crypto, { KeyObject } from 'node:crypto' +import express from 'express' +import * as jose from 'jose' +import KeyEncoder from 'key-encoder' +import * as ui8 from 'uint8arrays' +import { SECP256K1_JWT_ALG, parseDidKey } from '@atproto/crypto' import { AuthRequiredError, + VerifySignatureWithKeyFn, cryptoVerifySignatureWithKey, parseReqNsid, verifyJwt as verifyServiceJwt, - VerifySignatureWithKeyFn, } from '@atproto/xrpc-server' -import KeyEncoder from 'key-encoder' -import * as ui8 from 'uint8arrays' -import * as jose from 'jose' -import express from 'express' import { Code, DataPlaneClient, @@ -18,7 +19,6 @@ import { unpackIdentityKeys, } from './data-plane' import { GetIdentityByDidResponse } from './proto/bsky_pb' -import { parseDidKey, SECP256K1_JWT_ALG } from '@atproto/crypto' type ReqCtx = { req: express.Request diff --git a/packages/bsky/src/bsync.ts b/packages/bsky/src/bsync.ts index 40a21a9c2c5..83e0bc7b12b 100644 --- a/packages/bsky/src/bsync.ts +++ b/packages/bsky/src/bsync.ts @@ -1,15 +1,15 @@ -import { Service } from './proto/bsync_connect' import { Code, ConnectError, + Interceptor, PromiseClient, createPromiseClient, - Interceptor, } from '@connectrpc/connect' import { - createConnectTransport, ConnectTransportOptions, + createConnectTransport, } from '@connectrpc/connect-node' +import { Service } from './proto/bsync_connect' export type BsyncClient = PromiseClient diff --git a/packages/bsky/src/context.ts b/packages/bsky/src/context.ts index 06e48ba8cf4..55c66599947 100644 --- a/packages/bsky/src/context.ts +++ b/packages/bsky/src/context.ts @@ -1,23 +1,23 @@ -import express from 'express' import * as plc from '@did-plc/lib' -import { IdResolver } from '@atproto/identity' +import express from 'express' +import { Dispatcher } from 'undici' import { AtpAgent } from '@atproto/api' import { Keypair } from '@atproto/crypto' -import { ServerConfig } from './config' -import { DataPlaneClient } from './data-plane/client' -import { Hydrator } from './hydration/hydrator' -import { Views } from './views' +import { IdResolver } from '@atproto/identity' import { AuthVerifier } from './auth-verifier' import { BsyncClient } from './bsync' +import { ServerConfig } from './config' import { CourierClient } from './courier' +import { DataPlaneClient } from './data-plane/client' import { FeatureGates } from './feature-gates' +import { Hydrator } from './hydration/hydrator' +import { httpLogger as log } from './logger' import { ParsedLabelers, defaultLabelerHeader, parseLabelerHeader, } from './util' -import { httpLogger as log } from './logger' -import { Dispatcher } from 'undici' +import { Views } from './views' export class AppContext { constructor( @@ -112,5 +112,3 @@ export class AppContext { return parsed } } - -export default AppContext diff --git a/packages/bsky/src/courier.ts b/packages/bsky/src/courier.ts index aeb095898f6..8de5fe72229 100644 --- a/packages/bsky/src/courier.ts +++ b/packages/bsky/src/courier.ts @@ -1,15 +1,15 @@ -import { Service } from './proto/courier_connect' import { Code, ConnectError, + Interceptor, PromiseClient, createPromiseClient, - Interceptor, } from '@connectrpc/connect' import { - createConnectTransport, ConnectTransportOptions, + createConnectTransport, } from '@connectrpc/connect-node' +import { Service } from './proto/courier_connect' export type CourierClient = PromiseClient diff --git a/packages/bsky/src/data-plane/bsync/index.ts b/packages/bsky/src/data-plane/bsync/index.ts index a8ad57467bc..722d4fa7f83 100644 --- a/packages/bsky/src/data-plane/bsync/index.ts +++ b/packages/bsky/src/data-plane/bsync/index.ts @@ -1,14 +1,14 @@ -import http from 'http' -import events from 'events' -import assert from 'assert' -import express from 'express' +import assert from 'node:assert' +import events from 'node:events' +import http from 'node:http' import { ConnectRouter } from '@connectrpc/connect' import { expressConnectMiddleware } from '@connectrpc/connect-express' +import express from 'express' import { AtUri } from '@atproto/syntax' -import { Database } from '../server/db' +import { ids } from '../../lexicon/lexicons' import { Service } from '../../proto/bsync_connect' import { MuteOperation_Type } from '../../proto/bsync_pb' -import { ids } from '../../lexicon/lexicons' +import { Database } from '../server/db' export class MockBsync { constructor(public server: http.Server) {} diff --git a/packages/bsky/src/data-plane/client.ts b/packages/bsky/src/data-plane/client.ts index 11e68a6680c..0b12db4c670 100644 --- a/packages/bsky/src/data-plane/client.ts +++ b/packages/bsky/src/data-plane/client.ts @@ -1,6 +1,5 @@ import assert from 'node:assert' import { randomInt } from 'node:crypto' -import * as ui8 from 'uint8arrays' import { Code, ConnectError, @@ -9,6 +8,7 @@ import { makeAnyClient, } from '@connectrpc/connect' import { createGrpcTransport } from '@connectrpc/connect-node' +import * as ui8 from 'uint8arrays' import { getDidKeyFromMultibase } from '@atproto/identity' import { Service } from '../proto/bsky_connect' diff --git a/packages/bsky/src/data-plane/server/background.ts b/packages/bsky/src/data-plane/server/background.ts index 59d8ccf0ddf..ef74d3a09bc 100644 --- a/packages/bsky/src/data-plane/server/background.ts +++ b/packages/bsky/src/data-plane/server/background.ts @@ -1,6 +1,6 @@ import PQueue from 'p-queue' -import { Database } from './db' import { dbLogger } from '../../logger' +import { Database } from './db' // A simple queue for in-process, out-of-band/backgrounded work diff --git a/packages/bsky/src/data-plane/server/db/database-schema.ts b/packages/bsky/src/data-plane/server/db/database-schema.ts index 195b09483e0..5fe3f830a1b 100644 --- a/packages/bsky/src/data-plane/server/db/database-schema.ts +++ b/packages/bsky/src/data-plane/server/db/database-schema.ts @@ -1,42 +1,42 @@ import { Kysely } from 'kysely' +import * as actor from './tables/actor' +import * as actorBlock from './tables/actor-block' +import * as actorState from './tables/actor-state' +import * as actorSync from './tables/actor-sync' +import * as algo from './tables/algo' +import * as blobTakedown from './tables/blob-takedown' +import * as didCache from './tables/did-cache' import * as duplicateRecord from './tables/duplicate-record' -import * as profile from './tables/profile' -import * as profileAgg from './tables/profile-agg' -import * as post from './tables/post' -import * as postEmbed from './tables/post-embed' -import * as postAgg from './tables/post-agg' -import * as repost from './tables/repost' -import * as threadgate from './tables/thread-gate' -import * as postgate from './tables/post-gate' +import * as feedGenerator from './tables/feed-generator' import * as feedItem from './tables/feed-item' import * as follow from './tables/follow' +import * as label from './tables/label' +import * as labeler from './tables/labeler' import * as like from './tables/like' import * as list from './tables/list' +import * as listBlock from './tables/list-block' import * as listItem from './tables/list-item' import * as listMute from './tables/list-mute' -import * as listBlock from './tables/list-block' import * as mute from './tables/mute' -import * as actorBlock from './tables/actor-block' -import * as threadMute from './tables/thread-mute' -import * as feedGenerator from './tables/feed-generator' -import * as subscription from './tables/subscription' -import * as actor from './tables/actor' -import * as actorState from './tables/actor-state' -import * as actorSync from './tables/actor-sync' -import * as record from './tables/record' import * as notification from './tables/notification' import * as notificationPushToken from './tables/notification-push-token' -import * as didCache from './tables/did-cache' -import * as label from './tables/label' -import * as algo from './tables/algo' -import * as viewParam from './tables/view-param' -import * as suggestedFollow from './tables/suggested-follow' +import * as post from './tables/post' +import * as postAgg from './tables/post-agg' +import * as postEmbed from './tables/post-embed' +import * as postgate from './tables/post-gate' +import * as profile from './tables/profile' +import * as profileAgg from './tables/profile-agg' +import * as quote from './tables/quote' +import * as record from './tables/record' +import * as repost from './tables/repost' +import * as starterPack from './tables/starter-pack' +import * as subscription from './tables/subscription' import * as suggestedFeed from './tables/suggested-feed' +import * as suggestedFollow from './tables/suggested-follow' import * as taggedSuggestion from './tables/tagged-suggestion' -import * as blobTakedown from './tables/blob-takedown' -import * as labeler from './tables/labeler' -import * as starterPack from './tables/starter-pack' -import * as quote from './tables/quote' +import * as threadgate from './tables/thread-gate' +import * as threadMute from './tables/thread-mute' +import * as viewParam from './tables/view-param' export type DatabaseSchemaType = duplicateRecord.PartialDB & profile.PartialDB & @@ -78,5 +78,3 @@ export type DatabaseSchemaType = duplicateRecord.PartialDB & quote.PartialDB export type DatabaseSchema = Kysely - -export default DatabaseSchema diff --git a/packages/bsky/src/data-plane/server/db/db.ts b/packages/bsky/src/data-plane/server/db/db.ts index 9b1cc645d62..063aef8e248 100644 --- a/packages/bsky/src/data-plane/server/db/db.ts +++ b/packages/bsky/src/data-plane/server/db/db.ts @@ -1,5 +1,5 @@ -import assert from 'assert' -import EventEmitter from 'events' +import assert from 'node:assert' +import EventEmitter from 'node:events' import { Kysely, KyselyPlugin, @@ -11,13 +11,13 @@ import { RootOperationNode, UnknownRow, } from 'kysely' -import TypedEmitter from 'typed-emitter' import { Pool as PgPool, types as pgTypes } from 'pg' -import * as migrations from './migrations' -import DatabaseSchema, { DatabaseSchemaType } from './database-schema' -import { PgOptions } from './types' +import TypedEmitter from 'typed-emitter' import { dbLogger } from '../../../logger' +import { DatabaseSchema, DatabaseSchemaType } from './database-schema' +import * as migrations from './migrations' import { CtxMigrationProvider } from './migrations/provider' +import { PgOptions } from './types' export class Database { pool: PgPool diff --git a/packages/bsky/src/data-plane/server/db/util.ts b/packages/bsky/src/data-plane/server/db/util.ts index cee5d100f3d..ae9dddbf4b0 100644 --- a/packages/bsky/src/data-plane/server/db/util.ts +++ b/packages/bsky/src/data-plane/server/db/util.ts @@ -4,12 +4,12 @@ import { ExpressionBuilder, RawBuilder, SelectQueryBuilder, - sql, SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler, + sql, } from 'kysely' -import DatabaseSchema, { DatabaseSchemaType } from './database-schema' +import { DatabaseSchema, DatabaseSchemaType } from './database-schema' export const actorWhereClause = (actor: string) => { if (actor.startsWith('did:')) { diff --git a/packages/bsky/src/data-plane/server/index.ts b/packages/bsky/src/data-plane/server/index.ts index a12c63a22b3..6814e58a495 100644 --- a/packages/bsky/src/data-plane/server/index.ts +++ b/packages/bsky/src/data-plane/server/index.ts @@ -1,10 +1,10 @@ -import http from 'http' -import events from 'events' -import express from 'express' +import events from 'node:events' +import http from 'node:http' import { expressConnectMiddleware } from '@connectrpc/connect-express' -import createRoutes from './routes' -import { Database } from './db' +import express from 'express' import { IdResolver, MemoryCache } from '@atproto/identity' +import { Database } from './db' +import createRoutes from './routes' export { RepoSubscription } from './subscription' diff --git a/packages/bsky/src/data-plane/server/indexing/index.ts b/packages/bsky/src/data-plane/server/indexing/index.ts index 66f9f98f6b4..17578099a98 100644 --- a/packages/bsky/src/data-plane/server/indexing/index.ts +++ b/packages/bsky/src/data-plane/server/indexing/index.ts @@ -1,38 +1,38 @@ import { sql } from 'kysely' import { CID } from 'multiformats/cid' import { AtpAgent, ComAtprotoSyncGetLatestCommit } from '@atproto/api' +import { DAY, HOUR } from '@atproto/common' +import { IdResolver, getPds } from '@atproto/identity' +import { ValidationError } from '@atproto/lexicon' import { - readCarWithRoot, - WriteOpAction, - verifyRepo, VerifiedRepo, + WriteOpAction, getAndParseRecord, + readCarWithRoot, + verifyRepo, } from '@atproto/repo' import { AtUri } from '@atproto/syntax' -import { IdResolver, getPds } from '@atproto/identity' -import { DAY, HOUR } from '@atproto/common' -import { ValidationError } from '@atproto/lexicon' +import { subLogger } from '../../../logger' +import { retryXrpc } from '../../../util/retry' +import { BackgroundQueue } from '../background' import { Database } from '../db' import { Actor } from '../db/tables/actor' -import * as Post from './plugins/post' -import * as Threadgate from './plugins/thread-gate' -import * as Postgate from './plugins/post-gate' -import * as Like from './plugins/like' -import * as Repost from './plugins/repost' +import * as Block from './plugins/block' +import * as ChatDeclaration from './plugins/chat-declaration' +import * as FeedGenerator from './plugins/feed-generator' import * as Follow from './plugins/follow' -import * as Profile from './plugins/profile' +import * as Labeler from './plugins/labeler' +import * as Like from './plugins/like' import * as List from './plugins/list' -import * as ListItem from './plugins/list-item' import * as ListBlock from './plugins/list-block' -import * as Block from './plugins/block' -import * as FeedGenerator from './plugins/feed-generator' +import * as ListItem from './plugins/list-item' +import * as Post from './plugins/post' +import * as Postgate from './plugins/post-gate' +import * as Profile from './plugins/profile' +import * as Repost from './plugins/repost' import * as StarterPack from './plugins/starter-pack' -import * as Labeler from './plugins/labeler' -import * as ChatDeclaration from './plugins/chat-declaration' -import RecordProcessor from './processor' -import { subLogger } from '../../../logger' -import { retryXrpc } from '../../../util/retry' -import { BackgroundQueue } from '../background' +import * as Threadgate from './plugins/thread-gate' +import { RecordProcessor } from './processor' export class IndexingService { records: { diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/block.ts b/packages/bsky/src/data-plane/server/indexing/plugins/block.ts index ec4956a04f5..290a376f47c 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/block.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/block.ts @@ -1,12 +1,12 @@ import { Selectable } from 'kysely' -import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { CID } from 'multiformats/cid' -import * as Block from '../../../../lexicon/types/app/bsky/graph/block' +import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import * as lex from '../../../../lexicon/lexicons' +import * as Block from '../../../../lexicon/types/app/bsky/graph/block' +import { BackgroundQueue } from '../../background' import { Database } from '../../db' import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import RecordProcessor from '../processor' -import { BackgroundQueue } from '../../background' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyGraphBlock type IndexedBlock = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/chat-declaration.ts b/packages/bsky/src/data-plane/server/indexing/plugins/chat-declaration.ts index e234768e8b5..08e168595ab 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/chat-declaration.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/chat-declaration.ts @@ -1,10 +1,10 @@ -import { AtUri } from '@atproto/syntax' import { CID } from 'multiformats/cid' +import { AtUri } from '@atproto/syntax' import * as lex from '../../../../lexicon/lexicons' -import { DatabaseSchema } from '../../db/database-schema' -import RecordProcessor from '../processor' -import { Database } from '../../db' import { BackgroundQueue } from '../../background' +import { Database } from '../../db' +import { DatabaseSchema } from '../../db/database-schema' +import { RecordProcessor } from '../processor' // @NOTE this indexer is a placeholder to ensure it gets indexed in the generic records table diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/feed-generator.ts b/packages/bsky/src/data-plane/server/indexing/plugins/feed-generator.ts index f3b82c75567..8e567680d88 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/feed-generator.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/feed-generator.ts @@ -1,12 +1,12 @@ import { Selectable } from 'kysely' -import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { CID } from 'multiformats/cid' -import * as FeedGenerator from '../../../../lexicon/types/app/bsky/feed/generator' +import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import * as lex from '../../../../lexicon/lexicons' +import * as FeedGenerator from '../../../../lexicon/types/app/bsky/feed/generator' +import { BackgroundQueue } from '../../background' import { Database } from '../../db' import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import RecordProcessor from '../processor' -import { BackgroundQueue } from '../../background' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyFeedGenerator type IndexedFeedGenerator = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/follow.ts b/packages/bsky/src/data-plane/server/indexing/plugins/follow.ts index 6f238755761..36f8e1d9bb2 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/follow.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/follow.ts @@ -1,13 +1,13 @@ import { Selectable } from 'kysely' -import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { CID } from 'multiformats/cid' -import * as Follow from '../../../../lexicon/types/app/bsky/graph/follow' +import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import * as lex from '../../../../lexicon/lexicons' -import RecordProcessor from '../processor' +import * as Follow from '../../../../lexicon/types/app/bsky/graph/follow' +import { BackgroundQueue } from '../../background' import { Database } from '../../db' -import { countAll, excluded } from '../../db/util' import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { BackgroundQueue } from '../../background' +import { countAll, excluded } from '../../db/util' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyGraphFollow type IndexedFollow = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/labeler.ts b/packages/bsky/src/data-plane/server/indexing/plugins/labeler.ts index 5efdb0e30ca..7ee479055ee 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/labeler.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/labeler.ts @@ -1,12 +1,12 @@ import { Selectable } from 'kysely' -import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { CID } from 'multiformats/cid' -import * as Labeler from '../../../../lexicon/types/app/bsky/labeler/service' +import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import * as lex from '../../../../lexicon/lexicons' +import * as Labeler from '../../../../lexicon/types/app/bsky/labeler/service' +import { BackgroundQueue } from '../../background' import { Database } from '../../db' import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import RecordProcessor from '../processor' -import { BackgroundQueue } from '../../background' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyLabelerService type IndexedLabeler = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/like.ts b/packages/bsky/src/data-plane/server/indexing/plugins/like.ts index 98e9fc722f8..6afd30aff37 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/like.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/like.ts @@ -1,13 +1,13 @@ import { Selectable } from 'kysely' -import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { CID } from 'multiformats/cid' -import * as Like from '../../../../lexicon/types/app/bsky/feed/like' +import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import * as lex from '../../../../lexicon/lexicons' -import RecordProcessor from '../processor' -import { countAll, excluded } from '../../db/util' +import * as Like from '../../../../lexicon/types/app/bsky/feed/like' +import { BackgroundQueue } from '../../background' import { Database } from '../../db' import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { BackgroundQueue } from '../../background' +import { countAll, excluded } from '../../db/util' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyFeedLike type IndexedLike = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/list-block.ts b/packages/bsky/src/data-plane/server/indexing/plugins/list-block.ts index 09eabcdb9f4..19cd392bdcc 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/list-block.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/list-block.ts @@ -1,12 +1,12 @@ import { Selectable } from 'kysely' -import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { CID } from 'multiformats/cid' -import * as ListBlock from '../../../../lexicon/types/app/bsky/graph/listblock' +import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import * as lex from '../../../../lexicon/lexicons' +import * as ListBlock from '../../../../lexicon/types/app/bsky/graph/listblock' +import { BackgroundQueue } from '../../background' import { Database } from '../../db' import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import RecordProcessor from '../processor' -import { BackgroundQueue } from '../../background' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyGraphListblock type IndexedListBlock = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/list-item.ts b/packages/bsky/src/data-plane/server/indexing/plugins/list-item.ts index f2a43cff485..0536176da92 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/list-item.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/list-item.ts @@ -1,13 +1,13 @@ import { Selectable } from 'kysely' -import { InvalidRequestError } from '@atproto/xrpc-server' -import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { CID } from 'multiformats/cid' -import * as ListItem from '../../../../lexicon/types/app/bsky/graph/listitem' +import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' +import { InvalidRequestError } from '@atproto/xrpc-server' import * as lex from '../../../../lexicon/lexicons' -import RecordProcessor from '../processor' +import * as ListItem from '../../../../lexicon/types/app/bsky/graph/listitem' +import { BackgroundQueue } from '../../background' import { Database } from '../../db' import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { BackgroundQueue } from '../../background' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyGraphListitem type IndexedListItem = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/list.ts b/packages/bsky/src/data-plane/server/indexing/plugins/list.ts index f6deaf0a68e..7451060d7c2 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/list.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/list.ts @@ -1,12 +1,12 @@ import { Selectable } from 'kysely' -import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { CID } from 'multiformats/cid' -import * as List from '../../../../lexicon/types/app/bsky/graph/list' +import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import * as lex from '../../../../lexicon/lexicons' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import RecordProcessor from '../processor' -import { Database } from '../../db' +import * as List from '../../../../lexicon/types/app/bsky/graph/list' import { BackgroundQueue } from '../../background' +import { Database } from '../../db' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyGraphList type IndexedList = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/post-gate.ts b/packages/bsky/src/data-plane/server/indexing/plugins/post-gate.ts index 3b92d4a1312..34b9bb4b8ad 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/post-gate.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/post-gate.ts @@ -1,12 +1,12 @@ +import { CID } from 'multiformats/cid' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { InvalidRequestError } from '@atproto/xrpc-server' -import { CID } from 'multiformats/cid' -import * as Postgate from '../../../../lexicon/types/app/bsky/feed/postgate' import * as lex from '../../../../lexicon/lexicons' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { Database } from '../../db' -import RecordProcessor from '../processor' +import * as Postgate from '../../../../lexicon/types/app/bsky/feed/postgate' import { BackgroundQueue } from '../../background' +import { Database } from '../../db' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyFeedPostgate type IndexedGate = DatabaseSchemaType['post_gate'] diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/post.ts b/packages/bsky/src/data-plane/server/indexing/plugins/post.ts index 606d2aff3f8..80ce451354e 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/post.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/post.ts @@ -1,27 +1,33 @@ import { Insertable, Selectable, sql } from 'kysely' import { CID } from 'multiformats/cid' -import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { jsonStringToLex } from '@atproto/lexicon' +import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' +import * as lex from '../../../../lexicon/lexicons' +import { isMain as isEmbedExternal } from '../../../../lexicon/types/app/bsky/embed/external' +import { isMain as isEmbedImage } from '../../../../lexicon/types/app/bsky/embed/images' +import { isMain as isEmbedRecord } from '../../../../lexicon/types/app/bsky/embed/record' +import { isMain as isEmbedRecordWithMedia } from '../../../../lexicon/types/app/bsky/embed/recordWithMedia' +import { isMain as isEmbedVideo } from '../../../../lexicon/types/app/bsky/embed/video' import { Record as PostRecord, ReplyRef, } from '../../../../lexicon/types/app/bsky/feed/post' -import { Record as GateRecord } from '../../../../lexicon/types/app/bsky/feed/threadgate' import { Record as PostgateRecord } from '../../../../lexicon/types/app/bsky/feed/postgate' -import { isMain as isEmbedImage } from '../../../../lexicon/types/app/bsky/embed/images' -import { isMain as isEmbedExternal } from '../../../../lexicon/types/app/bsky/embed/external' -import { isMain as isEmbedRecord } from '../../../../lexicon/types/app/bsky/embed/record' -import { isMain as isEmbedRecordWithMedia } from '../../../../lexicon/types/app/bsky/embed/recordWithMedia' -import { isMain as isEmbedVideo } from '../../../../lexicon/types/app/bsky/embed/video' +import { Record as GateRecord } from '../../../../lexicon/types/app/bsky/feed/threadgate' import { - isMention, isLink, + isMention, } from '../../../../lexicon/types/app/bsky/richtext/facet' -import * as lex from '../../../../lexicon/lexicons' +import { + postUriToPostgateUri, + postUriToThreadgateUri, + uriToDid, +} from '../../../../util/uris' +import { parsePostgate } from '../../../../views/util' +import { BackgroundQueue } from '../../background' +import { Database } from '../../db' import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import RecordProcessor from '../processor' import { Notification } from '../../db/tables/notification' -import { Database } from '../../db' import { countAll, excluded } from '../../db/util' import { getAncestorsAndSelfQb, @@ -29,13 +35,7 @@ import { invalidReplyRoot as checkInvalidReplyRoot, violatesThreadGate as checkViolatesThreadGate, } from '../../util' -import { BackgroundQueue } from '../../background' -import { parsePostgate } from '../../../../views/util' -import { - postUriToThreadgateUri, - postUriToPostgateUri, - uriToDid, -} from '../../../../util/uris' +import { RecordProcessor } from '../processor' type Notif = Insertable type Post = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/profile.ts b/packages/bsky/src/data-plane/server/indexing/plugins/profile.ts index 762fb4c4b29..deeca3f5607 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/profile.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/profile.ts @@ -1,11 +1,11 @@ -import { AtUri } from '@atproto/syntax' import { CID } from 'multiformats/cid' -import * as Profile from '../../../../lexicon/types/app/bsky/actor/profile' +import { AtUri } from '@atproto/syntax' import * as lex from '../../../../lexicon/lexicons' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import RecordProcessor from '../processor' -import { Database } from '../../db' +import * as Profile from '../../../../lexicon/types/app/bsky/actor/profile' import { BackgroundQueue } from '../../background' +import { Database } from '../../db' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyActorProfile type IndexedProfile = DatabaseSchemaType['profile'] diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/repost.ts b/packages/bsky/src/data-plane/server/indexing/plugins/repost.ts index ec2e7754fb0..c43267b8d57 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/repost.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/repost.ts @@ -1,13 +1,13 @@ import { Selectable } from 'kysely' import { CID } from 'multiformats/cid' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import * as Repost from '../../../../lexicon/types/app/bsky/feed/repost' import * as lex from '../../../../lexicon/lexicons' -import RecordProcessor from '../processor' +import * as Repost from '../../../../lexicon/types/app/bsky/feed/repost' +import { BackgroundQueue } from '../../background' import { Database } from '../../db' -import { countAll, excluded } from '../../db/util' import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { BackgroundQueue } from '../../background' +import { countAll, excluded } from '../../db/util' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyFeedRepost type IndexedRepost = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/starter-pack.ts b/packages/bsky/src/data-plane/server/indexing/plugins/starter-pack.ts index 844c84544a9..fe237c5cffd 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/starter-pack.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/starter-pack.ts @@ -1,12 +1,12 @@ import { Selectable } from 'kysely' -import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { CID } from 'multiformats/cid' -import * as StarterPack from '../../../../lexicon/types/app/bsky/graph/starterpack' +import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import * as lex from '../../../../lexicon/lexicons' +import * as StarterPack from '../../../../lexicon/types/app/bsky/graph/starterpack' +import { BackgroundQueue } from '../../background' import { Database } from '../../db' import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import RecordProcessor from '../processor' -import { BackgroundQueue } from '../../background' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyGraphStarterpack type IndexedStarterPack = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/thread-gate.ts b/packages/bsky/src/data-plane/server/indexing/plugins/thread-gate.ts index bbcd42190ed..a6c53d84e18 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/thread-gate.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/thread-gate.ts @@ -1,12 +1,12 @@ +import { CID } from 'multiformats/cid' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { InvalidRequestError } from '@atproto/xrpc-server' -import { CID } from 'multiformats/cid' -import * as Threadgate from '../../../../lexicon/types/app/bsky/feed/threadgate' import * as lex from '../../../../lexicon/lexicons' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { Database } from '../../db' -import RecordProcessor from '../processor' +import * as Threadgate from '../../../../lexicon/types/app/bsky/feed/threadgate' import { BackgroundQueue } from '../../background' +import { Database } from '../../db' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' +import { RecordProcessor } from '../processor' const lexId = lex.ids.AppBskyFeedThreadgate type IndexedGate = DatabaseSchemaType['thread_gate'] diff --git a/packages/bsky/src/data-plane/server/indexing/processor.ts b/packages/bsky/src/data-plane/server/indexing/processor.ts index d88d230dd5d..ade9dea328a 100644 --- a/packages/bsky/src/data-plane/server/indexing/processor.ts +++ b/packages/bsky/src/data-plane/server/indexing/processor.ts @@ -1,13 +1,13 @@ import { Insertable } from 'kysely' import { CID } from 'multiformats/cid' -import { AtUri } from '@atproto/syntax' import { chunkArray } from '@atproto/common' import { jsonStringToLex, stringifyLex } from '@atproto/lexicon' +import { AtUri } from '@atproto/syntax' import { lexicons } from '../../../lexicon/lexicons' +import { BackgroundQueue } from '../background' import { Database } from '../db' -import DatabaseSchema from '../db/database-schema' +import { DatabaseSchema } from '../db/database-schema' import { Notification } from '../db/tables/notification' -import { BackgroundQueue } from '../background' // @NOTE re: insertions and deletions. Due to how record updates are handled, // (insertFn) should have the same effect as (insertFn -> deleteFn -> insertFn). diff --git a/packages/bsky/src/data-plane/server/routes/feeds.ts b/packages/bsky/src/data-plane/server/routes/feeds.ts index 60b737a889a..4a0135d748d 100644 --- a/packages/bsky/src/data-plane/server/routes/feeds.ts +++ b/packages/bsky/src/data-plane/server/routes/feeds.ts @@ -1,8 +1,8 @@ import { ServiceImpl } from '@connectrpc/connect' import { Service } from '../../../proto/bsky_connect' +import { FeedType } from '../../../proto/bsky_pb' import { Database } from '../db' import { TimeCidKeyset, paginate } from '../db/pagination' -import { FeedType } from '../../../proto/bsky_pb' export default (db: Database): Partial> => ({ async getAuthorFeed(req) { diff --git a/packages/bsky/src/data-plane/server/routes/follows.ts b/packages/bsky/src/data-plane/server/routes/follows.ts index 8ef27fdfe05..9038807fdac 100644 --- a/packages/bsky/src/data-plane/server/routes/follows.ts +++ b/packages/bsky/src/data-plane/server/routes/follows.ts @@ -1,5 +1,5 @@ -import { keyBy } from '@atproto/common' import { ServiceImpl } from '@connectrpc/connect' +import { keyBy } from '@atproto/common' import { Service } from '../../../proto/bsky_connect' import { FollowsFollowing } from '../../../proto/bsky_pb' import { Database } from '../db' diff --git a/packages/bsky/src/data-plane/server/routes/identity.ts b/packages/bsky/src/data-plane/server/routes/identity.ts index fb8dffc096c..007ace4fe88 100644 --- a/packages/bsky/src/data-plane/server/routes/identity.ts +++ b/packages/bsky/src/data-plane/server/routes/identity.ts @@ -1,8 +1,8 @@ +import { Timestamp } from '@bufbuild/protobuf' import { Code, ConnectError, ServiceImpl } from '@connectrpc/connect' +import { DidDocument, IdResolver, getDid, getHandle } from '@atproto/identity' import { Service } from '../../../proto/bsky_connect' import { Database } from '../db' -import { DidDocument, IdResolver, getDid, getHandle } from '@atproto/identity' -import { Timestamp } from '@bufbuild/protobuf' export default ( _db: Database, diff --git a/packages/bsky/src/data-plane/server/routes/index.ts b/packages/bsky/src/data-plane/server/routes/index.ts index 5504d38f812..f64bf4bd07f 100644 --- a/packages/bsky/src/data-plane/server/routes/index.ts +++ b/packages/bsky/src/data-plane/server/routes/index.ts @@ -1,6 +1,7 @@ import { ConnectRouter } from '@connectrpc/connect' import { IdResolver } from '@atproto/identity' import { Service } from '../../../proto/bsky_connect' +import { Database } from '../db' import blocks from './blocks' import feedGens from './feed-gens' import feeds from './feeds' @@ -20,11 +21,10 @@ import records from './records' import relationships from './relationships' import reposts from './reposts' import search from './search' +import starterPacks from './starter-packs' import suggestions from './suggestions' import sync from './sync' import threads from './threads' -import starterPacks from './starter-packs' -import { Database } from '../db' export default (db: Database, idResolver: IdResolver) => (router: ConnectRouter) => diff --git a/packages/bsky/src/data-plane/server/routes/interactions.ts b/packages/bsky/src/data-plane/server/routes/interactions.ts index 2a0e00f2cfc..2ce84b391e4 100644 --- a/packages/bsky/src/data-plane/server/routes/interactions.ts +++ b/packages/bsky/src/data-plane/server/routes/interactions.ts @@ -1,5 +1,5 @@ -import { DAY, keyBy } from '@atproto/common' import { ServiceImpl } from '@connectrpc/connect' +import { DAY, keyBy } from '@atproto/common' import { Service } from '../../../proto/bsky_connect' import { Database } from '../db' import { countAll } from '../db/util' diff --git a/packages/bsky/src/data-plane/server/routes/labels.ts b/packages/bsky/src/data-plane/server/routes/labels.ts index ccd485da3ba..045279f8238 100644 --- a/packages/bsky/src/data-plane/server/routes/labels.ts +++ b/packages/bsky/src/data-plane/server/routes/labels.ts @@ -1,9 +1,9 @@ +import { ServiceImpl } from '@connectrpc/connect' +import { Selectable } from 'kysely' import * as ui8 from 'uint8arrays' import { noUndefinedVals } from '@atproto/common' -import { ServiceImpl } from '@connectrpc/connect' import { Service } from '../../../proto/bsky_connect' import { Database } from '../db' -import { Selectable } from 'kysely' import { Label } from '../db/tables/label' type LabelRow = Selectable

(v, id, hashMain) } export interface External { + $type?: 'app.bsky.embed.external#external' uri: string title: string description: string thumb?: BlobRef - [k: string]: unknown } -export function isExternal(v: unknown): v is External { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.embed.external#external' - ) +const hashExternal = 'external' + +export function isExternal(v: V) { + return is$typed(v, id, hashExternal) } -export function validateExternal(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.external#external', v) +export function validateExternal(v: V) { + return validate(v, id, hashExternal) } export interface View { + $type?: 'app.bsky.embed.external#view' external: ViewExternal - [k: string]: unknown } -export function isView(v: unknown): v is View { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.embed.external#view' - ) +const hashView = 'view' + +export function isView(v: V) { + return is$typed(v, id, hashView) } -export function validateView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.external#view', v) +export function validateView(v: V) { + return validate(v, id, hashView) } export interface ViewExternal { + $type?: 'app.bsky.embed.external#viewExternal' uri: string title: string description: string thumb?: string - [k: string]: unknown } -export function isViewExternal(v: unknown): v is ViewExternal { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.embed.external#viewExternal' - ) +const hashViewExternal = 'viewExternal' + +export function isViewExternal(v: V) { + return is$typed(v, id, hashViewExternal) } -export function validateViewExternal(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.external#viewExternal', v) +export function validateViewExternal(v: V) { + return validate(v, id, hashViewExternal) } diff --git a/packages/api/src/client/types/app/bsky/embed/images.ts b/packages/api/src/client/types/app/bsky/embed/images.ts index 886ad7c5c5b..26b6d965235 100644 --- a/packages/api/src/client/types/app/bsky/embed/images.ts +++ b/packages/api/src/client/types/app/bsky/embed/images.ts @@ -2,63 +2,65 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyEmbedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyEmbedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.embed.images' export interface Main { + $type?: 'app.bsky.embed.images' images: Image[] - [k: string]: unknown } -export function isMain(v: unknown): v is Main { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.embed.images#main' || - v.$type === 'app.bsky.embed.images') - ) +const hashMain = 'main' + +export function isMain(v: V) { + return is$typed(v, id, hashMain) } -export function validateMain(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.images#main', v) +export function validateMain(v: V) { + return validate
(v, id, hashMain) } export interface Image { + $type?: 'app.bsky.embed.images#image' image: BlobRef /** Alt text description of the image, for accessibility. */ alt: string aspectRatio?: AppBskyEmbedDefs.AspectRatio - [k: string]: unknown } -export function isImage(v: unknown): v is Image { - return ( - isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.embed.images#image' - ) +const hashImage = 'image' + +export function isImage(v: V) { + return is$typed(v, id, hashImage) } -export function validateImage(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.images#image', v) +export function validateImage(v: V) { + return validate(v, id, hashImage) } export interface View { + $type?: 'app.bsky.embed.images#view' images: ViewImage[] - [k: string]: unknown } -export function isView(v: unknown): v is View { - return ( - isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.embed.images#view' - ) +const hashView = 'view' + +export function isView(v: V) { + return is$typed(v, id, hashView) } -export function validateView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.images#view', v) +export function validateView(v: V) { + return validate(v, id, hashView) } export interface ViewImage { + $type?: 'app.bsky.embed.images#viewImage' /** Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View. */ thumb: string /** Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View. */ @@ -66,17 +68,14 @@ export interface ViewImage { /** Alt text description of the image, for accessibility. */ alt: string aspectRatio?: AppBskyEmbedDefs.AspectRatio - [k: string]: unknown } -export function isViewImage(v: unknown): v is ViewImage { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.embed.images#viewImage' - ) +const hashViewImage = 'viewImage' + +export function isViewImage(v: V) { + return is$typed(v, id, hashViewImage) } -export function validateViewImage(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.images#viewImage', v) +export function validateViewImage(v: V) { + return validate(v, id, hashViewImage) } diff --git a/packages/api/src/client/types/app/bsky/embed/record.ts b/packages/api/src/client/types/app/bsky/embed/record.ts index a3744c29246..9fd1aee2be3 100644 --- a/packages/api/src/client/types/app/bsky/embed/record.ts +++ b/packages/api/src/client/types/app/bsky/embed/record.ts @@ -2,148 +2,141 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef' -import * as AppBskyFeedDefs from '../feed/defs' -import * as AppBskyGraphDefs from '../graph/defs' -import * as AppBskyLabelerDefs from '../labeler/defs' -import * as AppBskyActorDefs from '../actor/defs' -import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' -import * as AppBskyEmbedImages from './images' -import * as AppBskyEmbedVideo from './video' -import * as AppBskyEmbedExternal from './external' -import * as AppBskyEmbedRecordWithMedia from './recordWithMedia' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' +import type * as AppBskyFeedDefs from '../feed/defs.js' +import type * as AppBskyGraphDefs from '../graph/defs.js' +import type * as AppBskyLabelerDefs from '../labeler/defs.js' +import type * as AppBskyActorDefs from '../actor/defs.js' +import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' +import type * as AppBskyEmbedImages from './images.js' +import type * as AppBskyEmbedVideo from './video.js' +import type * as AppBskyEmbedExternal from './external.js' +import type * as AppBskyEmbedRecordWithMedia from './recordWithMedia.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.embed.record' export interface Main { + $type?: 'app.bsky.embed.record' record: ComAtprotoRepoStrongRef.Main - [k: string]: unknown } -export function isMain(v: unknown): v is Main { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.embed.record#main' || - v.$type === 'app.bsky.embed.record') - ) +const hashMain = 'main' + +export function isMain(v: V) { + return is$typed(v, id, hashMain) } -export function validateMain(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.record#main', v) +export function validateMain(v: V) { + return validate
(v, id, hashMain) } export interface View { + $type?: 'app.bsky.embed.record#view' record: - | ViewRecord - | ViewNotFound - | ViewBlocked - | ViewDetached - | AppBskyFeedDefs.GeneratorView - | AppBskyGraphDefs.ListView - | AppBskyLabelerDefs.LabelerView - | AppBskyGraphDefs.StarterPackViewBasic - | { $type: string; [k: string]: unknown } - [k: string]: unknown + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } } -export function isView(v: unknown): v is View { - return ( - isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.embed.record#view' - ) +const hashView = 'view' + +export function isView(v: V) { + return is$typed(v, id, hashView) } -export function validateView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.record#view', v) +export function validateView(v: V) { + return validate(v, id, hashView) } export interface ViewRecord { + $type?: 'app.bsky.embed.record#viewRecord' uri: string cid: string author: AppBskyActorDefs.ProfileViewBasic /** The record data itself. */ - value: {} + value: { [_ in string]: unknown } labels?: ComAtprotoLabelDefs.Label[] replyCount?: number repostCount?: number likeCount?: number quoteCount?: number embeds?: ( - | AppBskyEmbedImages.View - | AppBskyEmbedVideo.View - | AppBskyEmbedExternal.View - | View - | AppBskyEmbedRecordWithMedia.View - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } )[] indexedAt: string - [k: string]: unknown } -export function isViewRecord(v: unknown): v is ViewRecord { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.embed.record#viewRecord' - ) +const hashViewRecord = 'viewRecord' + +export function isViewRecord(v: V) { + return is$typed(v, id, hashViewRecord) } -export function validateViewRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.record#viewRecord', v) +export function validateViewRecord(v: V) { + return validate(v, id, hashViewRecord) } export interface ViewNotFound { + $type?: 'app.bsky.embed.record#viewNotFound' uri: string notFound: true - [k: string]: unknown } -export function isViewNotFound(v: unknown): v is ViewNotFound { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.embed.record#viewNotFound' - ) +const hashViewNotFound = 'viewNotFound' + +export function isViewNotFound(v: V) { + return is$typed(v, id, hashViewNotFound) } -export function validateViewNotFound(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.record#viewNotFound', v) +export function validateViewNotFound(v: V) { + return validate(v, id, hashViewNotFound) } export interface ViewBlocked { + $type?: 'app.bsky.embed.record#viewBlocked' uri: string blocked: true author: AppBskyFeedDefs.BlockedAuthor - [k: string]: unknown } -export function isViewBlocked(v: unknown): v is ViewBlocked { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.embed.record#viewBlocked' - ) +const hashViewBlocked = 'viewBlocked' + +export function isViewBlocked(v: V) { + return is$typed(v, id, hashViewBlocked) } -export function validateViewBlocked(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.record#viewBlocked', v) +export function validateViewBlocked(v: V) { + return validate(v, id, hashViewBlocked) } export interface ViewDetached { + $type?: 'app.bsky.embed.record#viewDetached' uri: string detached: true - [k: string]: unknown } -export function isViewDetached(v: unknown): v is ViewDetached { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.embed.record#viewDetached' - ) +const hashViewDetached = 'viewDetached' + +export function isViewDetached(v: V) { + return is$typed(v, id, hashViewDetached) } -export function validateViewDetached(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.record#viewDetached', v) +export function validateViewDetached(v: V) { + return validate(v, id, hashViewDetached) } diff --git a/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts b/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts index 2b2b3ae6251..2c36a988cc7 100644 --- a/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts +++ b/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts @@ -2,55 +2,54 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyEmbedRecord from './record' -import * as AppBskyEmbedImages from './images' -import * as AppBskyEmbedVideo from './video' -import * as AppBskyEmbedExternal from './external' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyEmbedRecord from './record.js' +import type * as AppBskyEmbedImages from './images.js' +import type * as AppBskyEmbedVideo from './video.js' +import type * as AppBskyEmbedExternal from './external.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.embed.recordWithMedia' export interface Main { + $type?: 'app.bsky.embed.recordWithMedia' record: AppBskyEmbedRecord.Main media: - | AppBskyEmbedImages.Main - | AppBskyEmbedVideo.Main - | AppBskyEmbedExternal.Main - | { $type: string; [k: string]: unknown } - [k: string]: unknown + | $Typed + | $Typed + | $Typed + | { $type: string } } -export function isMain(v: unknown): v is Main { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.embed.recordWithMedia#main' || - v.$type === 'app.bsky.embed.recordWithMedia') - ) +const hashMain = 'main' + +export function isMain(v: V) { + return is$typed(v, id, hashMain) } -export function validateMain(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.recordWithMedia#main', v) +export function validateMain(v: V) { + return validate
(v, id, hashMain) } export interface View { + $type?: 'app.bsky.embed.recordWithMedia#view' record: AppBskyEmbedRecord.View media: - | AppBskyEmbedImages.View - | AppBskyEmbedVideo.View - | AppBskyEmbedExternal.View - | { $type: string; [k: string]: unknown } - [k: string]: unknown + | $Typed + | $Typed + | $Typed + | { $type: string } } -export function isView(v: unknown): v is View { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.embed.recordWithMedia#view' - ) +const hashView = 'view' + +export function isView(v: V) { + return is$typed(v, id, hashView) } -export function validateView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.recordWithMedia#view', v) +export function validateView(v: V) { + return validate(v, id, hashView) } diff --git a/packages/api/src/client/types/app/bsky/embed/video.ts b/packages/api/src/client/types/app/bsky/embed/video.ts index 2be451b85ed..10e59e37539 100644 --- a/packages/api/src/client/types/app/bsky/embed/video.ts +++ b/packages/api/src/client/types/app/bsky/embed/video.ts @@ -2,66 +2,65 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyEmbedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyEmbedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.embed.video' export interface Main { + $type?: 'app.bsky.embed.video' video: BlobRef captions?: Caption[] /** Alt text description of the video, for accessibility. */ alt?: string aspectRatio?: AppBskyEmbedDefs.AspectRatio - [k: string]: unknown } -export function isMain(v: unknown): v is Main { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.embed.video#main' || - v.$type === 'app.bsky.embed.video') - ) +const hashMain = 'main' + +export function isMain(v: V) { + return is$typed(v, id, hashMain) } -export function validateMain(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.video#main', v) +export function validateMain(v: V) { + return validate
(v, id, hashMain) } export interface Caption { + $type?: 'app.bsky.embed.video#caption' lang: string file: BlobRef - [k: string]: unknown } -export function isCaption(v: unknown): v is Caption { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.embed.video#caption' - ) +const hashCaption = 'caption' + +export function isCaption(v: V) { + return is$typed(v, id, hashCaption) } -export function validateCaption(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.video#caption', v) +export function validateCaption(v: V) { + return validate(v, id, hashCaption) } export interface View { + $type?: 'app.bsky.embed.video#view' cid: string playlist: string thumbnail?: string alt?: string aspectRatio?: AppBskyEmbedDefs.AspectRatio - [k: string]: unknown } -export function isView(v: unknown): v is View { - return ( - isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.embed.video#view' - ) +const hashView = 'view' + +export function isView(v: V) { + return is$typed(v, id, hashView) } -export function validateView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.embed.video#view', v) +export function validateView(v: V) { + return validate(v, id, hashView) } diff --git a/packages/api/src/client/types/app/bsky/feed/defs.ts b/packages/api/src/client/types/app/bsky/feed/defs.ts index 760c634d35f..f94aaefa7e9 100644 --- a/packages/api/src/client/types/app/bsky/feed/defs.ts +++ b/packages/api/src/client/types/app/bsky/feed/defs.ts @@ -2,31 +2,36 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' -import * as AppBskyEmbedImages from '../embed/images' -import * as AppBskyEmbedVideo from '../embed/video' -import * as AppBskyEmbedExternal from '../embed/external' -import * as AppBskyEmbedRecord from '../embed/record' -import * as AppBskyEmbedRecordWithMedia from '../embed/recordWithMedia' -import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' -import * as AppBskyRichtextFacet from '../richtext/facet' -import * as AppBskyGraphDefs from '../graph/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' +import type * as AppBskyEmbedImages from '../embed/images.js' +import type * as AppBskyEmbedVideo from '../embed/video.js' +import type * as AppBskyEmbedExternal from '../embed/external.js' +import type * as AppBskyEmbedRecord from '../embed/record.js' +import type * as AppBskyEmbedRecordWithMedia from '../embed/recordWithMedia.js' +import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' +import type * as AppBskyRichtextFacet from '../richtext/facet.js' +import type * as AppBskyGraphDefs from '../graph/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.defs' export interface PostView { + $type?: 'app.bsky.feed.defs#postView' uri: string cid: string author: AppBskyActorDefs.ProfileViewBasic - record: {} + record: { [_ in string]: unknown } embed?: - | AppBskyEmbedImages.View - | AppBskyEmbedVideo.View - | AppBskyEmbedExternal.View - | AppBskyEmbedRecord.View - | AppBskyEmbedRecordWithMedia.View - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } replyCount?: number repostCount?: number likeCount?: number @@ -35,225 +40,207 @@ export interface PostView { viewer?: ViewerState labels?: ComAtprotoLabelDefs.Label[] threadgate?: ThreadgateView - [k: string]: unknown } -export function isPostView(v: unknown): v is PostView { - return ( - isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.feed.defs#postView' - ) +const hashPostView = 'postView' + +export function isPostView(v: V) { + return is$typed(v, id, hashPostView) } -export function validatePostView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#postView', v) +export function validatePostView(v: V) { + return validate(v, id, hashPostView) } /** Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests. */ export interface ViewerState { + $type?: 'app.bsky.feed.defs#viewerState' repost?: string like?: string threadMuted?: boolean replyDisabled?: boolean embeddingDisabled?: boolean pinned?: boolean - [k: string]: unknown } -export function isViewerState(v: unknown): v is ViewerState { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#viewerState' - ) +const hashViewerState = 'viewerState' + +export function isViewerState(v: V) { + return is$typed(v, id, hashViewerState) } -export function validateViewerState(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#viewerState', v) +export function validateViewerState(v: V) { + return validate(v, id, hashViewerState) } /** Metadata about this post within the context of the thread it is in. */ export interface ThreadContext { + $type?: 'app.bsky.feed.defs#threadContext' rootAuthorLike?: string - [k: string]: unknown } -export function isThreadContext(v: unknown): v is ThreadContext { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#threadContext' - ) +const hashThreadContext = 'threadContext' + +export function isThreadContext(v: V) { + return is$typed(v, id, hashThreadContext) } -export function validateThreadContext(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#threadContext', v) +export function validateThreadContext(v: V) { + return validate(v, id, hashThreadContext) } export interface FeedViewPost { + $type?: 'app.bsky.feed.defs#feedViewPost' post: PostView reply?: ReplyRef - reason?: ReasonRepost | ReasonPin | { $type: string; [k: string]: unknown } + reason?: $Typed | $Typed | { $type: string } /** Context provided by feed generator that may be passed back alongside interactions. */ feedContext?: string - [k: string]: unknown } -export function isFeedViewPost(v: unknown): v is FeedViewPost { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#feedViewPost' - ) +const hashFeedViewPost = 'feedViewPost' + +export function isFeedViewPost(v: V) { + return is$typed(v, id, hashFeedViewPost) } -export function validateFeedViewPost(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#feedViewPost', v) +export function validateFeedViewPost(v: V) { + return validate(v, id, hashFeedViewPost) } export interface ReplyRef { + $type?: 'app.bsky.feed.defs#replyRef' root: - | PostView - | NotFoundPost - | BlockedPost - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | { $type: string } parent: - | PostView - | NotFoundPost - | BlockedPost - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | { $type: string } grandparentAuthor?: AppBskyActorDefs.ProfileViewBasic - [k: string]: unknown } -export function isReplyRef(v: unknown): v is ReplyRef { - return ( - isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.feed.defs#replyRef' - ) +const hashReplyRef = 'replyRef' + +export function isReplyRef(v: V) { + return is$typed(v, id, hashReplyRef) } -export function validateReplyRef(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#replyRef', v) +export function validateReplyRef(v: V) { + return validate(v, id, hashReplyRef) } export interface ReasonRepost { + $type?: 'app.bsky.feed.defs#reasonRepost' by: AppBskyActorDefs.ProfileViewBasic indexedAt: string - [k: string]: unknown } -export function isReasonRepost(v: unknown): v is ReasonRepost { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#reasonRepost' - ) +const hashReasonRepost = 'reasonRepost' + +export function isReasonRepost(v: V) { + return is$typed(v, id, hashReasonRepost) } -export function validateReasonRepost(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#reasonRepost', v) +export function validateReasonRepost(v: V) { + return validate(v, id, hashReasonRepost) } export interface ReasonPin { - [k: string]: unknown + $type?: 'app.bsky.feed.defs#reasonPin' } -export function isReasonPin(v: unknown): v is ReasonPin { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#reasonPin' - ) +const hashReasonPin = 'reasonPin' + +export function isReasonPin(v: V) { + return is$typed(v, id, hashReasonPin) } -export function validateReasonPin(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#reasonPin', v) +export function validateReasonPin(v: V) { + return validate(v, id, hashReasonPin) } export interface ThreadViewPost { + $type?: 'app.bsky.feed.defs#threadViewPost' post: PostView parent?: - | ThreadViewPost - | NotFoundPost - | BlockedPost - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | { $type: string } replies?: ( - | ThreadViewPost - | NotFoundPost - | BlockedPost - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | { $type: string } )[] threadContext?: ThreadContext - [k: string]: unknown } -export function isThreadViewPost(v: unknown): v is ThreadViewPost { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#threadViewPost' - ) +const hashThreadViewPost = 'threadViewPost' + +export function isThreadViewPost(v: V) { + return is$typed(v, id, hashThreadViewPost) } -export function validateThreadViewPost(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#threadViewPost', v) +export function validateThreadViewPost(v: V) { + return validate(v, id, hashThreadViewPost) } export interface NotFoundPost { + $type?: 'app.bsky.feed.defs#notFoundPost' uri: string notFound: true - [k: string]: unknown } -export function isNotFoundPost(v: unknown): v is NotFoundPost { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#notFoundPost' - ) +const hashNotFoundPost = 'notFoundPost' + +export function isNotFoundPost(v: V) { + return is$typed(v, id, hashNotFoundPost) } -export function validateNotFoundPost(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#notFoundPost', v) +export function validateNotFoundPost(v: V) { + return validate(v, id, hashNotFoundPost) } export interface BlockedPost { + $type?: 'app.bsky.feed.defs#blockedPost' uri: string blocked: true author: BlockedAuthor - [k: string]: unknown } -export function isBlockedPost(v: unknown): v is BlockedPost { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#blockedPost' - ) +const hashBlockedPost = 'blockedPost' + +export function isBlockedPost(v: V) { + return is$typed(v, id, hashBlockedPost) } -export function validateBlockedPost(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#blockedPost', v) +export function validateBlockedPost(v: V) { + return validate(v, id, hashBlockedPost) } export interface BlockedAuthor { + $type?: 'app.bsky.feed.defs#blockedAuthor' did: string viewer?: AppBskyActorDefs.ViewerState - [k: string]: unknown } -export function isBlockedAuthor(v: unknown): v is BlockedAuthor { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#blockedAuthor' - ) +const hashBlockedAuthor = 'blockedAuthor' + +export function isBlockedAuthor(v: V) { + return is$typed(v, id, hashBlockedAuthor) } -export function validateBlockedAuthor(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#blockedAuthor', v) +export function validateBlockedAuthor(v: V) { + return validate(v, id, hashBlockedAuthor) } export interface GeneratorView { + $type?: 'app.bsky.feed.defs#generatorView' uri: string cid: string did: string @@ -271,115 +258,103 @@ export interface GeneratorView { | 'app.bsky.feed.defs#contentModeVideo' | (string & {}) indexedAt: string - [k: string]: unknown } -export function isGeneratorView(v: unknown): v is GeneratorView { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#generatorView' - ) +const hashGeneratorView = 'generatorView' + +export function isGeneratorView(v: V) { + return is$typed(v, id, hashGeneratorView) } -export function validateGeneratorView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#generatorView', v) +export function validateGeneratorView(v: V) { + return validate(v, id, hashGeneratorView) } export interface GeneratorViewerState { + $type?: 'app.bsky.feed.defs#generatorViewerState' like?: string - [k: string]: unknown } -export function isGeneratorViewerState(v: unknown): v is GeneratorViewerState { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#generatorViewerState' - ) +const hashGeneratorViewerState = 'generatorViewerState' + +export function isGeneratorViewerState(v: V) { + return is$typed(v, id, hashGeneratorViewerState) } -export function validateGeneratorViewerState(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#generatorViewerState', v) +export function validateGeneratorViewerState(v: V) { + return validate(v, id, hashGeneratorViewerState) } export interface SkeletonFeedPost { + $type?: 'app.bsky.feed.defs#skeletonFeedPost' post: string reason?: - | SkeletonReasonRepost - | SkeletonReasonPin - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | { $type: string } /** Context that will be passed through to client and may be passed to feed generator back alongside interactions. */ feedContext?: string - [k: string]: unknown } -export function isSkeletonFeedPost(v: unknown): v is SkeletonFeedPost { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#skeletonFeedPost' - ) +const hashSkeletonFeedPost = 'skeletonFeedPost' + +export function isSkeletonFeedPost(v: V) { + return is$typed(v, id, hashSkeletonFeedPost) } -export function validateSkeletonFeedPost(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#skeletonFeedPost', v) +export function validateSkeletonFeedPost(v: V) { + return validate(v, id, hashSkeletonFeedPost) } export interface SkeletonReasonRepost { + $type?: 'app.bsky.feed.defs#skeletonReasonRepost' repost: string - [k: string]: unknown } -export function isSkeletonReasonRepost(v: unknown): v is SkeletonReasonRepost { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#skeletonReasonRepost' - ) +const hashSkeletonReasonRepost = 'skeletonReasonRepost' + +export function isSkeletonReasonRepost(v: V) { + return is$typed(v, id, hashSkeletonReasonRepost) } -export function validateSkeletonReasonRepost(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#skeletonReasonRepost', v) +export function validateSkeletonReasonRepost(v: V) { + return validate(v, id, hashSkeletonReasonRepost) } export interface SkeletonReasonPin { - [k: string]: unknown + $type?: 'app.bsky.feed.defs#skeletonReasonPin' } -export function isSkeletonReasonPin(v: unknown): v is SkeletonReasonPin { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#skeletonReasonPin' - ) +const hashSkeletonReasonPin = 'skeletonReasonPin' + +export function isSkeletonReasonPin(v: V) { + return is$typed(v, id, hashSkeletonReasonPin) } -export function validateSkeletonReasonPin(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#skeletonReasonPin', v) +export function validateSkeletonReasonPin(v: V) { + return validate(v, id, hashSkeletonReasonPin) } export interface ThreadgateView { + $type?: 'app.bsky.feed.defs#threadgateView' uri?: string cid?: string - record?: {} + record?: { [_ in string]: unknown } lists?: AppBskyGraphDefs.ListViewBasic[] - [k: string]: unknown } -export function isThreadgateView(v: unknown): v is ThreadgateView { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#threadgateView' - ) +const hashThreadgateView = 'threadgateView' + +export function isThreadgateView(v: V) { + return is$typed(v, id, hashThreadgateView) } -export function validateThreadgateView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#threadgateView', v) +export function validateThreadgateView(v: V) { + return validate(v, id, hashThreadgateView) } export interface Interaction { + $type?: 'app.bsky.feed.defs#interaction' item?: string event?: | 'app.bsky.feed.defs#requestLess' @@ -397,47 +372,43 @@ export interface Interaction { | (string & {}) /** Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton. */ feedContext?: string - [k: string]: unknown } -export function isInteraction(v: unknown): v is Interaction { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.defs#interaction' - ) +const hashInteraction = 'interaction' + +export function isInteraction(v: V) { + return is$typed(v, id, hashInteraction) } -export function validateInteraction(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.defs#interaction', v) +export function validateInteraction(v: V) { + return validate(v, id, hashInteraction) } /** Request that less content like the given feed item be shown in the feed */ -export const REQUESTLESS = 'app.bsky.feed.defs#requestLess' +export const REQUESTLESS = `${id}#requestLess` /** Request that more content like the given feed item be shown in the feed */ -export const REQUESTMORE = 'app.bsky.feed.defs#requestMore' +export const REQUESTMORE = `${id}#requestMore` /** User clicked through to the feed item */ -export const CLICKTHROUGHITEM = 'app.bsky.feed.defs#clickthroughItem' +export const CLICKTHROUGHITEM = `${id}#clickthroughItem` /** User clicked through to the author of the feed item */ -export const CLICKTHROUGHAUTHOR = 'app.bsky.feed.defs#clickthroughAuthor' +export const CLICKTHROUGHAUTHOR = `${id}#clickthroughAuthor` /** User clicked through to the reposter of the feed item */ -export const CLICKTHROUGHREPOSTER = 'app.bsky.feed.defs#clickthroughReposter' +export const CLICKTHROUGHREPOSTER = `${id}#clickthroughReposter` /** User clicked through to the embedded content of the feed item */ -export const CLICKTHROUGHEMBED = 'app.bsky.feed.defs#clickthroughEmbed' +export const CLICKTHROUGHEMBED = `${id}#clickthroughEmbed` /** Declares the feed generator returns any types of posts. */ -export const CONTENTMODEUNSPECIFIED = - 'app.bsky.feed.defs#contentModeUnspecified' +export const CONTENTMODEUNSPECIFIED = `${id}#contentModeUnspecified` /** Declares the feed generator returns posts containing app.bsky.embed.video embeds. */ -export const CONTENTMODEVIDEO = 'app.bsky.feed.defs#contentModeVideo' +export const CONTENTMODEVIDEO = `${id}#contentModeVideo` /** Feed item was seen by user */ -export const INTERACTIONSEEN = 'app.bsky.feed.defs#interactionSeen' +export const INTERACTIONSEEN = `${id}#interactionSeen` /** User liked the feed item */ -export const INTERACTIONLIKE = 'app.bsky.feed.defs#interactionLike' +export const INTERACTIONLIKE = `${id}#interactionLike` /** User reposted the feed item */ -export const INTERACTIONREPOST = 'app.bsky.feed.defs#interactionRepost' +export const INTERACTIONREPOST = `${id}#interactionRepost` /** User replied to the feed item */ -export const INTERACTIONREPLY = 'app.bsky.feed.defs#interactionReply' +export const INTERACTIONREPLY = `${id}#interactionReply` /** User quoted the feed item */ -export const INTERACTIONQUOTE = 'app.bsky.feed.defs#interactionQuote' +export const INTERACTIONQUOTE = `${id}#interactionQuote` /** User shared the feed item */ -export const INTERACTIONSHARE = 'app.bsky.feed.defs#interactionShare' +export const INTERACTIONSHARE = `${id}#interactionShare` diff --git a/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts b/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts index b974f496144..6792d3a377f 100644 --- a/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts +++ b/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.describeFeedGenerator' export interface QueryParams {} @@ -15,7 +19,6 @@ export interface OutputSchema { did: string feeds: Feed[] links?: Links - [k: string]: unknown } export interface CallOptions { @@ -34,36 +37,32 @@ export function toKnownErr(e: any) { } export interface Feed { + $type?: 'app.bsky.feed.describeFeedGenerator#feed' uri: string - [k: string]: unknown } -export function isFeed(v: unknown): v is Feed { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.describeFeedGenerator#feed' - ) +const hashFeed = 'feed' + +export function isFeed(v: V) { + return is$typed(v, id, hashFeed) } -export function validateFeed(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.describeFeedGenerator#feed', v) +export function validateFeed(v: V) { + return validate(v, id, hashFeed) } export interface Links { + $type?: 'app.bsky.feed.describeFeedGenerator#links' privacyPolicy?: string termsOfService?: string - [k: string]: unknown } -export function isLinks(v: unknown): v is Links { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.describeFeedGenerator#links' - ) +const hashLinks = 'links' + +export function isLinks(v: V) { + return is$typed(v, id, hashLinks) } -export function validateLinks(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.describeFeedGenerator#links', v) +export function validateLinks(v: V) { + return validate(v, id, hashLinks) } diff --git a/packages/api/src/client/types/app/bsky/feed/generator.ts b/packages/api/src/client/types/app/bsky/feed/generator.ts index 8e1dd9e9c80..3cddbae534b 100644 --- a/packages/api/src/client/types/app/bsky/feed/generator.ts +++ b/packages/api/src/client/types/app/bsky/feed/generator.ts @@ -2,13 +2,18 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyRichtextFacet from '../richtext/facet' -import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyRichtextFacet from '../richtext/facet.js' +import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.generator' export interface Record { + $type: 'app.bsky.feed.generator' did: string displayName: string description?: string @@ -16,9 +21,7 @@ export interface Record { avatar?: BlobRef /** Declaration that a feed accepts feedback interactions from a client through app.bsky.feed.sendInteractions */ acceptsInteractions?: boolean - labels?: - | ComAtprotoLabelDefs.SelfLabels - | { $type: string; [k: string]: unknown } + labels?: $Typed | { $type: string } contentMode?: | 'app.bsky.feed.defs#contentModeUnspecified' | 'app.bsky.feed.defs#contentModeVideo' @@ -27,15 +30,12 @@ export interface Record { [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.feed.generator#main' || - v.$type === 'app.bsky.feed.generator') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.generator#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } diff --git a/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts b/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts index e8a0cb94bd3..f44942711ac 100644 --- a/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts +++ b/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getActorFeeds' export interface QueryParams { actor: string @@ -19,7 +23,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string feeds: AppBskyFeedDefs.GeneratorView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts b/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts index 1da239d96f3..0552f5a18b3 100644 --- a/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts +++ b/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getActorLikes' export interface QueryParams { actor: string @@ -19,7 +23,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string feed: AppBskyFeedDefs.FeedViewPost[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts b/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts index 8fc58a4e46c..5e25ae8ed88 100644 --- a/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts +++ b/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getAuthorFeed' export interface QueryParams { actor: string @@ -28,7 +32,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string feed: AppBskyFeedDefs.FeedViewPost[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getFeed.ts b/packages/api/src/client/types/app/bsky/feed/getFeed.ts index b61a1248e2a..abc65bfe8aa 100644 --- a/packages/api/src/client/types/app/bsky/feed/getFeed.ts +++ b/packages/api/src/client/types/app/bsky/feed/getFeed.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getFeed' export interface QueryParams { feed: string @@ -19,7 +23,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string feed: AppBskyFeedDefs.FeedViewPost[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts b/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts index 8d222f8d521..7ff259ec8cb 100644 --- a/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts +++ b/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getFeedGenerator' export interface QueryParams { /** AT-URI of the feed generator record. */ @@ -21,7 +25,6 @@ export interface OutputSchema { isOnline: boolean /** Indicates whether the feed generator service is compatible with the record declaration. */ isValid: boolean - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts b/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts index 1d99fd6608c..2b51e794beb 100644 --- a/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts +++ b/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getFeedGenerators' export interface QueryParams { feeds: string[] @@ -16,7 +20,6 @@ export type InputSchema = undefined export interface OutputSchema { feeds: AppBskyFeedDefs.GeneratorView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts b/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts index bf859cc1e87..9ebcd480e7e 100644 --- a/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getFeedSkeleton' export interface QueryParams { /** Reference to feed generator record describing the specific feed being requested. */ @@ -20,7 +24,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string feed: AppBskyFeedDefs.SkeletonFeedPost[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getLikes.ts b/packages/api/src/client/types/app/bsky/feed/getLikes.ts index 35af1b3aae5..f1448981f77 100644 --- a/packages/api/src/client/types/app/bsky/feed/getLikes.ts +++ b/packages/api/src/client/types/app/bsky/feed/getLikes.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getLikes' export interface QueryParams { /** AT-URI of the subject (eg, a post record). */ @@ -24,7 +28,6 @@ export interface OutputSchema { cid?: string cursor?: string likes: Like[] - [k: string]: unknown } export interface CallOptions { @@ -43,18 +46,18 @@ export function toKnownErr(e: any) { } export interface Like { + $type?: 'app.bsky.feed.getLikes#like' indexedAt: string createdAt: string actor: AppBskyActorDefs.ProfileView - [k: string]: unknown } -export function isLike(v: unknown): v is Like { - return ( - isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.feed.getLikes#like' - ) +const hashLike = 'like' + +export function isLike(v: V) { + return is$typed(v, id, hashLike) } -export function validateLike(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.getLikes#like', v) +export function validateLike(v: V) { + return validate(v, id, hashLike) } diff --git a/packages/api/src/client/types/app/bsky/feed/getListFeed.ts b/packages/api/src/client/types/app/bsky/feed/getListFeed.ts index 4e47e597afd..484b3213139 100644 --- a/packages/api/src/client/types/app/bsky/feed/getListFeed.ts +++ b/packages/api/src/client/types/app/bsky/feed/getListFeed.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getListFeed' export interface QueryParams { /** Reference (AT-URI) to the list record. */ @@ -20,7 +24,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string feed: AppBskyFeedDefs.FeedViewPost[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getPostThread.ts b/packages/api/src/client/types/app/bsky/feed/getPostThread.ts index df012607df1..5782a534529 100644 --- a/packages/api/src/client/types/app/bsky/feed/getPostThread.ts +++ b/packages/api/src/client/types/app/bsky/feed/getPostThread.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getPostThread' export interface QueryParams { /** Reference (AT-URI) to post record. */ @@ -21,12 +25,11 @@ export type InputSchema = undefined export interface OutputSchema { thread: - | AppBskyFeedDefs.ThreadViewPost - | AppBskyFeedDefs.NotFoundPost - | AppBskyFeedDefs.BlockedPost - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | { $type: string } threadgate?: AppBskyFeedDefs.ThreadgateView - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getPosts.ts b/packages/api/src/client/types/app/bsky/feed/getPosts.ts index 0ae8657de94..2467a092a4d 100644 --- a/packages/api/src/client/types/app/bsky/feed/getPosts.ts +++ b/packages/api/src/client/types/app/bsky/feed/getPosts.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getPosts' export interface QueryParams { /** List of post AT-URIs to return hydrated views for. */ @@ -17,7 +21,6 @@ export type InputSchema = undefined export interface OutputSchema { posts: AppBskyFeedDefs.PostView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getQuotes.ts b/packages/api/src/client/types/app/bsky/feed/getQuotes.ts index aafc487cd43..7397d3bb51b 100644 --- a/packages/api/src/client/types/app/bsky/feed/getQuotes.ts +++ b/packages/api/src/client/types/app/bsky/feed/getQuotes.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getQuotes' export interface QueryParams { /** Reference (AT-URI) of post record */ @@ -24,7 +28,6 @@ export interface OutputSchema { cid?: string cursor?: string posts: AppBskyFeedDefs.PostView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts b/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts index dfbac97453b..d8666e827f2 100644 --- a/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts +++ b/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getRepostedBy' export interface QueryParams { /** Reference (AT-URI) of post record */ @@ -24,7 +28,6 @@ export interface OutputSchema { cid?: string cursor?: string repostedBy: AppBskyActorDefs.ProfileView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts b/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts index 2e9495d8c19..38b63d048e9 100644 --- a/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts +++ b/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getSuggestedFeeds' export interface QueryParams { limit?: number @@ -18,7 +22,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string feeds: AppBskyFeedDefs.GeneratorView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/getTimeline.ts b/packages/api/src/client/types/app/bsky/feed/getTimeline.ts index 6c5280443a9..66202f764e7 100644 --- a/packages/api/src/client/types/app/bsky/feed/getTimeline.ts +++ b/packages/api/src/client/types/app/bsky/feed/getTimeline.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.getTimeline' export interface QueryParams { /** Variant 'algorithm' for timeline. Implementation-specific. NOTE: most feed flexibility has been moved to feed generator mechanism. */ @@ -20,7 +24,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string feed: AppBskyFeedDefs.FeedViewPost[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/like.ts b/packages/api/src/client/types/app/bsky/feed/like.ts index 10237e45f0d..504023db951 100644 --- a/packages/api/src/client/types/app/bsky/feed/like.ts +++ b/packages/api/src/client/types/app/bsky/feed/like.ts @@ -2,25 +2,28 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.like' export interface Record { + $type: 'app.bsky.feed.like' subject: ComAtprotoRepoStrongRef.Main createdAt: string [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.feed.like#main' || v.$type === 'app.bsky.feed.like') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.like#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } diff --git a/packages/api/src/client/types/app/bsky/feed/post.ts b/packages/api/src/client/types/app/bsky/feed/post.ts index e358409c0e0..1c921bf4331 100644 --- a/packages/api/src/client/types/app/bsky/feed/post.ts +++ b/packages/api/src/client/types/app/bsky/feed/post.ts @@ -2,19 +2,24 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyRichtextFacet from '../richtext/facet' -import * as AppBskyEmbedImages from '../embed/images' -import * as AppBskyEmbedVideo from '../embed/video' -import * as AppBskyEmbedExternal from '../embed/external' -import * as AppBskyEmbedRecord from '../embed/record' -import * as AppBskyEmbedRecordWithMedia from '../embed/recordWithMedia' -import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' -import * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyRichtextFacet from '../richtext/facet.js' +import type * as AppBskyEmbedImages from '../embed/images.js' +import type * as AppBskyEmbedVideo from '../embed/video.js' +import type * as AppBskyEmbedExternal from '../embed/external.js' +import type * as AppBskyEmbedRecord from '../embed/record.js' +import type * as AppBskyEmbedRecordWithMedia from '../embed/recordWithMedia.js' +import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' +import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.post' export interface Record { + $type: 'app.bsky.feed.post' /** The primary post content. May be an empty string, if there are embeds. */ text: string /** DEPRECATED: replaced by app.bsky.richtext.facet. */ @@ -23,17 +28,15 @@ export interface Record { facets?: AppBskyRichtextFacet.Main[] reply?: ReplyRef embed?: - | AppBskyEmbedImages.Main - | AppBskyEmbedVideo.Main - | AppBskyEmbedExternal.Main - | AppBskyEmbedRecord.Main - | AppBskyEmbedRecordWithMedia.Main - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } /** Indicates human language of post primary text content. */ langs?: string[] - labels?: - | ComAtprotoLabelDefs.SelfLabels - | { $type: string; [k: string]: unknown } + labels?: $Typed | { $type: string } /** Additional hashtags, in addition to any included in post text and facets. */ tags?: string[] /** Client-declared timestamp when this post was originally created. */ @@ -41,68 +44,64 @@ export interface Record { [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.feed.post#main' || v.$type === 'app.bsky.feed.post') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.post#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } export interface ReplyRef { + $type?: 'app.bsky.feed.post#replyRef' root: ComAtprotoRepoStrongRef.Main parent: ComAtprotoRepoStrongRef.Main - [k: string]: unknown } -export function isReplyRef(v: unknown): v is ReplyRef { - return ( - isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.feed.post#replyRef' - ) +const hashReplyRef = 'replyRef' + +export function isReplyRef(v: V) { + return is$typed(v, id, hashReplyRef) } -export function validateReplyRef(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.post#replyRef', v) +export function validateReplyRef(v: V) { + return validate(v, id, hashReplyRef) } /** Deprecated: use facets instead. */ export interface Entity { + $type?: 'app.bsky.feed.post#entity' index: TextSlice /** Expected values are 'mention' and 'link'. */ type: string value: string - [k: string]: unknown } -export function isEntity(v: unknown): v is Entity { - return ( - isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.feed.post#entity' - ) +const hashEntity = 'entity' + +export function isEntity(v: V) { + return is$typed(v, id, hashEntity) } -export function validateEntity(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.post#entity', v) +export function validateEntity(v: V) { + return validate(v, id, hashEntity) } /** Deprecated. Use app.bsky.richtext instead -- A text segment. Start is inclusive, end is exclusive. Indices are for utf16-encoded strings. */ export interface TextSlice { + $type?: 'app.bsky.feed.post#textSlice' start: number end: number - [k: string]: unknown } -export function isTextSlice(v: unknown): v is TextSlice { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.post#textSlice' - ) +const hashTextSlice = 'textSlice' + +export function isTextSlice(v: V) { + return is$typed(v, id, hashTextSlice) } -export function validateTextSlice(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.post#textSlice', v) +export function validateTextSlice(v: V) { + return validate(v, id, hashTextSlice) } diff --git a/packages/api/src/client/types/app/bsky/feed/postgate.ts b/packages/api/src/client/types/app/bsky/feed/postgate.ts index e3028385873..3bb6fa929ef 100644 --- a/packages/api/src/client/types/app/bsky/feed/postgate.ts +++ b/packages/api/src/client/types/app/bsky/feed/postgate.ts @@ -2,47 +2,47 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.postgate' export interface Record { + $type: 'app.bsky.feed.postgate' createdAt: string /** Reference (AT-URI) to the post record. */ post: string /** List of AT-URIs embedding this post that the author has detached from. */ detachedEmbeddingUris?: string[] /** List of rules defining who can embed this post. If value is an empty array or is undefined, no particular rules apply and anyone can embed. */ - embeddingRules?: (DisableRule | { $type: string; [k: string]: unknown })[] + embeddingRules?: ($Typed | { $type: string })[] [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.feed.postgate#main' || - v.$type === 'app.bsky.feed.postgate') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.postgate#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } /** Disables embedding of this post. */ export interface DisableRule { - [k: string]: unknown + $type?: 'app.bsky.feed.postgate#disableRule' } -export function isDisableRule(v: unknown): v is DisableRule { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.postgate#disableRule' - ) +const hashDisableRule = 'disableRule' + +export function isDisableRule(v: V) { + return is$typed(v, id, hashDisableRule) } -export function validateDisableRule(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.postgate#disableRule', v) +export function validateDisableRule(v: V) { + return validate(v, id, hashDisableRule) } diff --git a/packages/api/src/client/types/app/bsky/feed/repost.ts b/packages/api/src/client/types/app/bsky/feed/repost.ts index 2e8f6e75548..00a74c8b617 100644 --- a/packages/api/src/client/types/app/bsky/feed/repost.ts +++ b/packages/api/src/client/types/app/bsky/feed/repost.ts @@ -2,26 +2,28 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.repost' export interface Record { + $type: 'app.bsky.feed.repost' subject: ComAtprotoRepoStrongRef.Main createdAt: string [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.feed.repost#main' || - v.$type === 'app.bsky.feed.repost') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.repost#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } diff --git a/packages/api/src/client/types/app/bsky/feed/searchPosts.ts b/packages/api/src/client/types/app/bsky/feed/searchPosts.ts index 1a2ec64dcd2..0d477a7d7ae 100644 --- a/packages/api/src/client/types/app/bsky/feed/searchPosts.ts +++ b/packages/api/src/client/types/app/bsky/feed/searchPosts.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.searchPosts' export interface QueryParams { /** Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */ @@ -41,7 +45,6 @@ export interface OutputSchema { /** Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. */ hitsTotal?: number posts: AppBskyFeedDefs.PostView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts b/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts index 4d43e26f3dd..8535c458f08 100644 --- a/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts +++ b/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts @@ -3,21 +3,22 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.sendInteractions' export interface QueryParams {} export interface InputSchema { interactions: AppBskyFeedDefs.Interaction[] - [k: string]: unknown } -export interface OutputSchema { - [k: string]: unknown -} +export interface OutputSchema {} export interface CallOptions { signal?: AbortSignal diff --git a/packages/api/src/client/types/app/bsky/feed/threadgate.ts b/packages/api/src/client/types/app/bsky/feed/threadgate.ts index 1fe87016dce..e15cda096aa 100644 --- a/packages/api/src/client/types/app/bsky/feed/threadgate.ts +++ b/packages/api/src/client/types/app/bsky/feed/threadgate.ts @@ -2,20 +2,25 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.feed.threadgate' export interface Record { + $type: 'app.bsky.feed.threadgate' /** Reference (AT-URI) to the post record. */ post: string /** List of rules defining who can reply to this post. If value is an empty array, no one can reply. If value is undefined, anyone can reply. */ allow?: ( - | MentionRule - | FollowerRule - | FollowingRule - | ListRule - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } )[] createdAt: string /** List of hidden reply URIs. */ @@ -23,84 +28,73 @@ export interface Record { [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.feed.threadgate#main' || - v.$type === 'app.bsky.feed.threadgate') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.threadgate#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } /** Allow replies from actors mentioned in your post. */ export interface MentionRule { - [k: string]: unknown + $type?: 'app.bsky.feed.threadgate#mentionRule' } -export function isMentionRule(v: unknown): v is MentionRule { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.threadgate#mentionRule' - ) +const hashMentionRule = 'mentionRule' + +export function isMentionRule(v: V) { + return is$typed(v, id, hashMentionRule) } -export function validateMentionRule(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.threadgate#mentionRule', v) +export function validateMentionRule(v: V) { + return validate(v, id, hashMentionRule) } /** Allow replies from actors who follow you. */ export interface FollowerRule { - [k: string]: unknown + $type?: 'app.bsky.feed.threadgate#followerRule' } -export function isFollowerRule(v: unknown): v is FollowerRule { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.threadgate#followerRule' - ) +const hashFollowerRule = 'followerRule' + +export function isFollowerRule(v: V) { + return is$typed(v, id, hashFollowerRule) } -export function validateFollowerRule(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.threadgate#followerRule', v) +export function validateFollowerRule(v: V) { + return validate(v, id, hashFollowerRule) } /** Allow replies from actors you follow. */ export interface FollowingRule { - [k: string]: unknown + $type?: 'app.bsky.feed.threadgate#followingRule' } -export function isFollowingRule(v: unknown): v is FollowingRule { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.threadgate#followingRule' - ) +const hashFollowingRule = 'followingRule' + +export function isFollowingRule(v: V) { + return is$typed(v, id, hashFollowingRule) } -export function validateFollowingRule(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.threadgate#followingRule', v) +export function validateFollowingRule(v: V) { + return validate(v, id, hashFollowingRule) } /** Allow replies from actors on a list. */ export interface ListRule { + $type?: 'app.bsky.feed.threadgate#listRule' list: string - [k: string]: unknown } -export function isListRule(v: unknown): v is ListRule { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.feed.threadgate#listRule' - ) +const hashListRule = 'listRule' + +export function isListRule(v: V) { + return is$typed(v, id, hashListRule) } -export function validateListRule(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.feed.threadgate#listRule', v) +export function validateListRule(v: V) { + return validate(v, id, hashListRule) } diff --git a/packages/api/src/client/types/app/bsky/graph/block.ts b/packages/api/src/client/types/app/bsky/graph/block.ts index f2455fc08a2..25ff38bd60d 100644 --- a/packages/api/src/client/types/app/bsky/graph/block.ts +++ b/packages/api/src/client/types/app/bsky/graph/block.ts @@ -2,26 +2,28 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.block' export interface Record { + $type: 'app.bsky.graph.block' /** DID of the account to be blocked. */ subject: string createdAt: string [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.graph.block#main' || - v.$type === 'app.bsky.graph.block') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.block#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } diff --git a/packages/api/src/client/types/app/bsky/graph/defs.ts b/packages/api/src/client/types/app/bsky/graph/defs.ts index aa7e2c068b5..bd9a4d6c07e 100644 --- a/packages/api/src/client/types/app/bsky/graph/defs.ts +++ b/packages/api/src/client/types/app/bsky/graph/defs.ts @@ -2,15 +2,20 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' -import * as AppBskyActorDefs from '../actor/defs' -import * as AppBskyRichtextFacet from '../richtext/facet' -import * as AppBskyFeedDefs from '../feed/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' +import type * as AppBskyActorDefs from '../actor/defs.js' +import type * as AppBskyRichtextFacet from '../richtext/facet.js' +import type * as AppBskyFeedDefs from '../feed/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.defs' export interface ListViewBasic { + $type?: 'app.bsky.graph.defs#listViewBasic' uri: string cid: string name: string @@ -20,22 +25,20 @@ export interface ListViewBasic { labels?: ComAtprotoLabelDefs.Label[] viewer?: ListViewerState indexedAt?: string - [k: string]: unknown } -export function isListViewBasic(v: unknown): v is ListViewBasic { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.graph.defs#listViewBasic' - ) +const hashListViewBasic = 'listViewBasic' + +export function isListViewBasic(v: V) { + return is$typed(v, id, hashListViewBasic) } -export function validateListViewBasic(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.defs#listViewBasic', v) +export function validateListViewBasic(v: V) { + return validate(v, id, hashListViewBasic) } export interface ListView { + $type?: 'app.bsky.graph.defs#listView' uri: string cid: string creator: AppBskyActorDefs.ProfileView @@ -48,43 +51,39 @@ export interface ListView { labels?: ComAtprotoLabelDefs.Label[] viewer?: ListViewerState indexedAt: string - [k: string]: unknown } -export function isListView(v: unknown): v is ListView { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.graph.defs#listView' - ) +const hashListView = 'listView' + +export function isListView(v: V) { + return is$typed(v, id, hashListView) } -export function validateListView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.defs#listView', v) +export function validateListView(v: V) { + return validate(v, id, hashListView) } export interface ListItemView { + $type?: 'app.bsky.graph.defs#listItemView' uri: string subject: AppBskyActorDefs.ProfileView - [k: string]: unknown } -export function isListItemView(v: unknown): v is ListItemView { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.graph.defs#listItemView' - ) +const hashListItemView = 'listItemView' + +export function isListItemView(v: V) { + return is$typed(v, id, hashListItemView) } -export function validateListItemView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.defs#listItemView', v) +export function validateListItemView(v: V) { + return validate(v, id, hashListItemView) } export interface StarterPackView { + $type?: 'app.bsky.graph.defs#starterPackView' uri: string cid: string - record: {} + record: { [_ in string]: unknown } creator: AppBskyActorDefs.ProfileViewBasic list?: ListViewBasic listItemsSample?: ListItemView[] @@ -93,44 +92,39 @@ export interface StarterPackView { joinedAllTimeCount?: number labels?: ComAtprotoLabelDefs.Label[] indexedAt: string - [k: string]: unknown } -export function isStarterPackView(v: unknown): v is StarterPackView { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.graph.defs#starterPackView' - ) +const hashStarterPackView = 'starterPackView' + +export function isStarterPackView(v: V) { + return is$typed(v, id, hashStarterPackView) } -export function validateStarterPackView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.defs#starterPackView', v) +export function validateStarterPackView(v: V) { + return validate(v, id, hashStarterPackView) } export interface StarterPackViewBasic { + $type?: 'app.bsky.graph.defs#starterPackViewBasic' uri: string cid: string - record: {} + record: { [_ in string]: unknown } creator: AppBskyActorDefs.ProfileViewBasic listItemCount?: number joinedWeekCount?: number joinedAllTimeCount?: number labels?: ComAtprotoLabelDefs.Label[] indexedAt: string - [k: string]: unknown } -export function isStarterPackViewBasic(v: unknown): v is StarterPackViewBasic { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.graph.defs#starterPackViewBasic' - ) +const hashStarterPackViewBasic = 'starterPackViewBasic' + +export function isStarterPackViewBasic(v: V) { + return is$typed(v, id, hashStarterPackViewBasic) } -export function validateStarterPackViewBasic(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.defs#starterPackViewBasic', v) +export function validateStarterPackViewBasic(v: V) { + return validate(v, id, hashStarterPackViewBasic) } export type ListPurpose = @@ -140,67 +134,61 @@ export type ListPurpose = | (string & {}) /** A list of actors to apply an aggregate moderation action (mute/block) on. */ -export const MODLIST = 'app.bsky.graph.defs#modlist' +export const MODLIST = `${id}#modlist` /** A list of actors used for curation purposes such as list feeds or interaction gating. */ -export const CURATELIST = 'app.bsky.graph.defs#curatelist' +export const CURATELIST = `${id}#curatelist` /** A list of actors used for only for reference purposes such as within a starter pack. */ -export const REFERENCELIST = 'app.bsky.graph.defs#referencelist' +export const REFERENCELIST = `${id}#referencelist` export interface ListViewerState { + $type?: 'app.bsky.graph.defs#listViewerState' muted?: boolean blocked?: string - [k: string]: unknown } -export function isListViewerState(v: unknown): v is ListViewerState { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.graph.defs#listViewerState' - ) +const hashListViewerState = 'listViewerState' + +export function isListViewerState(v: V) { + return is$typed(v, id, hashListViewerState) } -export function validateListViewerState(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.defs#listViewerState', v) +export function validateListViewerState(v: V) { + return validate(v, id, hashListViewerState) } /** indicates that a handle or DID could not be resolved */ export interface NotFoundActor { + $type?: 'app.bsky.graph.defs#notFoundActor' actor: string notFound: true - [k: string]: unknown } -export function isNotFoundActor(v: unknown): v is NotFoundActor { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.graph.defs#notFoundActor' - ) +const hashNotFoundActor = 'notFoundActor' + +export function isNotFoundActor(v: V) { + return is$typed(v, id, hashNotFoundActor) } -export function validateNotFoundActor(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.defs#notFoundActor', v) +export function validateNotFoundActor(v: V) { + return validate(v, id, hashNotFoundActor) } /** lists the bi-directional graph relationships between one actor (not indicated in the object), and the target actors (the DID included in the object) */ export interface Relationship { + $type?: 'app.bsky.graph.defs#relationship' did: string /** if the actor follows this DID, this is the AT-URI of the follow record */ following?: string /** if the actor is followed by this DID, contains the AT-URI of the follow record */ followedBy?: string - [k: string]: unknown } -export function isRelationship(v: unknown): v is Relationship { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.graph.defs#relationship' - ) +const hashRelationship = 'relationship' + +export function isRelationship(v: V) { + return is$typed(v, id, hashRelationship) } -export function validateRelationship(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.defs#relationship', v) +export function validateRelationship(v: V) { + return validate(v, id, hashRelationship) } diff --git a/packages/api/src/client/types/app/bsky/graph/follow.ts b/packages/api/src/client/types/app/bsky/graph/follow.ts index a68f434f3c8..79478d39135 100644 --- a/packages/api/src/client/types/app/bsky/graph/follow.ts +++ b/packages/api/src/client/types/app/bsky/graph/follow.ts @@ -2,25 +2,27 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.follow' export interface Record { + $type: 'app.bsky.graph.follow' subject: string createdAt: string [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.graph.follow#main' || - v.$type === 'app.bsky.graph.follow') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.follow#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } diff --git a/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts b/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts index bb374e2318d..cb5d0ddea69 100644 --- a/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts +++ b/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyGraphDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyGraphDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getActorStarterPacks' export interface QueryParams { actor: string @@ -19,7 +23,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string starterPacks: AppBskyGraphDefs.StarterPackViewBasic[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getBlocks.ts b/packages/api/src/client/types/app/bsky/graph/getBlocks.ts index f0e4bd96bc8..3f622163750 100644 --- a/packages/api/src/client/types/app/bsky/graph/getBlocks.ts +++ b/packages/api/src/client/types/app/bsky/graph/getBlocks.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getBlocks' export interface QueryParams { limit?: number @@ -18,7 +22,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string blocks: AppBskyActorDefs.ProfileView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getFollowers.ts b/packages/api/src/client/types/app/bsky/graph/getFollowers.ts index f55649dc769..faf9e102588 100644 --- a/packages/api/src/client/types/app/bsky/graph/getFollowers.ts +++ b/packages/api/src/client/types/app/bsky/graph/getFollowers.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getFollowers' export interface QueryParams { actor: string @@ -20,7 +24,6 @@ export interface OutputSchema { subject: AppBskyActorDefs.ProfileView cursor?: string followers: AppBskyActorDefs.ProfileView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getFollows.ts b/packages/api/src/client/types/app/bsky/graph/getFollows.ts index 8570c4a14c0..f56600a6426 100644 --- a/packages/api/src/client/types/app/bsky/graph/getFollows.ts +++ b/packages/api/src/client/types/app/bsky/graph/getFollows.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getFollows' export interface QueryParams { actor: string @@ -20,7 +24,6 @@ export interface OutputSchema { subject: AppBskyActorDefs.ProfileView cursor?: string follows: AppBskyActorDefs.ProfileView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts b/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts index f55649dc769..c91899bcd81 100644 --- a/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts +++ b/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getKnownFollowers' export interface QueryParams { actor: string @@ -20,7 +24,6 @@ export interface OutputSchema { subject: AppBskyActorDefs.ProfileView cursor?: string followers: AppBskyActorDefs.ProfileView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getList.ts b/packages/api/src/client/types/app/bsky/graph/getList.ts index bebde2b49c3..1e133181af6 100644 --- a/packages/api/src/client/types/app/bsky/graph/getList.ts +++ b/packages/api/src/client/types/app/bsky/graph/getList.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyGraphDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyGraphDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getList' export interface QueryParams { /** Reference (AT-URI) of the list record to hydrate. */ @@ -21,7 +25,6 @@ export interface OutputSchema { cursor?: string list: AppBskyGraphDefs.ListView items: AppBskyGraphDefs.ListItemView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts b/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts index d3c7ad5ed7b..31a21664739 100644 --- a/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts +++ b/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyGraphDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyGraphDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getListBlocks' export interface QueryParams { limit?: number @@ -18,7 +22,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string lists: AppBskyGraphDefs.ListView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getListMutes.ts b/packages/api/src/client/types/app/bsky/graph/getListMutes.ts index d3c7ad5ed7b..82bab605ecc 100644 --- a/packages/api/src/client/types/app/bsky/graph/getListMutes.ts +++ b/packages/api/src/client/types/app/bsky/graph/getListMutes.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyGraphDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyGraphDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getListMutes' export interface QueryParams { limit?: number @@ -18,7 +22,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string lists: AppBskyGraphDefs.ListView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getLists.ts b/packages/api/src/client/types/app/bsky/graph/getLists.ts index 89a4bfd58df..4066a3c7c9a 100644 --- a/packages/api/src/client/types/app/bsky/graph/getLists.ts +++ b/packages/api/src/client/types/app/bsky/graph/getLists.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyGraphDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyGraphDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getLists' export interface QueryParams { /** The account (actor) to enumerate lists from. */ @@ -20,7 +24,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string lists: AppBskyGraphDefs.ListView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getMutes.ts b/packages/api/src/client/types/app/bsky/graph/getMutes.ts index 0ee441cf9eb..db4ece098be 100644 --- a/packages/api/src/client/types/app/bsky/graph/getMutes.ts +++ b/packages/api/src/client/types/app/bsky/graph/getMutes.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getMutes' export interface QueryParams { limit?: number @@ -18,7 +22,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string mutes: AppBskyActorDefs.ProfileView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getRelationships.ts b/packages/api/src/client/types/app/bsky/graph/getRelationships.ts index 20194662b71..5d67dbbf731 100644 --- a/packages/api/src/client/types/app/bsky/graph/getRelationships.ts +++ b/packages/api/src/client/types/app/bsky/graph/getRelationships.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyGraphDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyGraphDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getRelationships' export interface QueryParams { /** Primary account requesting relationships for. */ @@ -20,11 +24,10 @@ export type InputSchema = undefined export interface OutputSchema { actor?: string relationships: ( - | AppBskyGraphDefs.Relationship - | AppBskyGraphDefs.NotFoundActor - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | { $type: string } )[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts b/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts index 7eafb2d228d..11f41a3f3ce 100644 --- a/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts +++ b/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyGraphDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyGraphDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getStarterPack' export interface QueryParams { /** Reference (AT-URI) of the starter pack record. */ @@ -17,7 +21,6 @@ export type InputSchema = undefined export interface OutputSchema { starterPack: AppBskyGraphDefs.StarterPackView - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts b/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts index 50dbfdbaeda..b354f6e5a42 100644 --- a/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts +++ b/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyGraphDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyGraphDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getStarterPacks' export interface QueryParams { uris: string[] @@ -16,7 +20,6 @@ export type InputSchema = undefined export interface OutputSchema { starterPacks: AppBskyGraphDefs.StarterPackViewBasic[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts b/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts index fb27392d1b7..744c34a5dd4 100644 --- a/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts +++ b/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.getSuggestedFollowsByActor' export interface QueryParams { actor: string @@ -20,7 +24,6 @@ export interface OutputSchema { isFallback: boolean /** Snowflake for this recommendation, use when submitting recommendation events. */ recId?: number - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/list.ts b/packages/api/src/client/types/app/bsky/graph/list.ts index fec652ccb12..f899e73317a 100644 --- a/packages/api/src/client/types/app/bsky/graph/list.ts +++ b/packages/api/src/client/types/app/bsky/graph/list.ts @@ -2,36 +2,36 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyGraphDefs from './defs' -import * as AppBskyRichtextFacet from '../richtext/facet' -import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyGraphDefs from './defs.js' +import type * as AppBskyRichtextFacet from '../richtext/facet.js' +import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.list' export interface Record { + $type: 'app.bsky.graph.list' purpose: AppBskyGraphDefs.ListPurpose /** Display name for list; can not be empty. */ name: string description?: string descriptionFacets?: AppBskyRichtextFacet.Main[] avatar?: BlobRef - labels?: - | ComAtprotoLabelDefs.SelfLabels - | { $type: string; [k: string]: unknown } + labels?: $Typed | { $type: string } createdAt: string [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.graph.list#main' || - v.$type === 'app.bsky.graph.list') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.list#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } diff --git a/packages/api/src/client/types/app/bsky/graph/listblock.ts b/packages/api/src/client/types/app/bsky/graph/listblock.ts index e0f02be268f..05a204fa3b5 100644 --- a/packages/api/src/client/types/app/bsky/graph/listblock.ts +++ b/packages/api/src/client/types/app/bsky/graph/listblock.ts @@ -2,26 +2,28 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.listblock' export interface Record { + $type: 'app.bsky.graph.listblock' /** Reference (AT-URI) to the mod list record. */ subject: string createdAt: string [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.graph.listblock#main' || - v.$type === 'app.bsky.graph.listblock') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.listblock#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } diff --git a/packages/api/src/client/types/app/bsky/graph/listitem.ts b/packages/api/src/client/types/app/bsky/graph/listitem.ts index d4fb5631e84..46e0ccbf206 100644 --- a/packages/api/src/client/types/app/bsky/graph/listitem.ts +++ b/packages/api/src/client/types/app/bsky/graph/listitem.ts @@ -2,11 +2,16 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.listitem' export interface Record { + $type: 'app.bsky.graph.listitem' /** The account which is included on the list. */ subject: string /** Reference (AT-URI) to the list record (app.bsky.graph.list). */ @@ -15,15 +20,12 @@ export interface Record { [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.graph.listitem#main' || - v.$type === 'app.bsky.graph.listitem') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.listitem#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } diff --git a/packages/api/src/client/types/app/bsky/graph/muteActor.ts b/packages/api/src/client/types/app/bsky/graph/muteActor.ts index c21c00b2069..87007e9b0ec 100644 --- a/packages/api/src/client/types/app/bsky/graph/muteActor.ts +++ b/packages/api/src/client/types/app/bsky/graph/muteActor.ts @@ -3,15 +3,18 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.muteActor' export interface QueryParams {} export interface InputSchema { actor: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/muteActorList.ts b/packages/api/src/client/types/app/bsky/graph/muteActorList.ts index 8a0e8586deb..8b4b818d2e9 100644 --- a/packages/api/src/client/types/app/bsky/graph/muteActorList.ts +++ b/packages/api/src/client/types/app/bsky/graph/muteActorList.ts @@ -3,15 +3,18 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.muteActorList' export interface QueryParams {} export interface InputSchema { list: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/muteThread.ts b/packages/api/src/client/types/app/bsky/graph/muteThread.ts index 275ba7a0f22..fb8bc07bc14 100644 --- a/packages/api/src/client/types/app/bsky/graph/muteThread.ts +++ b/packages/api/src/client/types/app/bsky/graph/muteThread.ts @@ -3,15 +3,18 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.muteThread' export interface QueryParams {} export interface InputSchema { root: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts b/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts index 8291b219a62..162234851e5 100644 --- a/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts +++ b/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyGraphDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyGraphDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.searchStarterPacks' export interface QueryParams { /** Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */ @@ -20,7 +24,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string starterPacks: AppBskyGraphDefs.StarterPackViewBasic[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/starterpack.ts b/packages/api/src/client/types/app/bsky/graph/starterpack.ts index 7cb0aa26c3f..d7761245080 100644 --- a/packages/api/src/client/types/app/bsky/graph/starterpack.ts +++ b/packages/api/src/client/types/app/bsky/graph/starterpack.ts @@ -2,12 +2,17 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyRichtextFacet from '../richtext/facet' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyRichtextFacet from '../richtext/facet.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.starterpack' export interface Record { + $type: 'app.bsky.graph.starterpack' /** Display name for starter pack; can not be empty. */ name: string description?: string @@ -19,32 +24,27 @@ export interface Record { [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.graph.starterpack#main' || - v.$type === 'app.bsky.graph.starterpack') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.starterpack#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } export interface FeedItem { + $type?: 'app.bsky.graph.starterpack#feedItem' uri: string - [k: string]: unknown } -export function isFeedItem(v: unknown): v is FeedItem { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.graph.starterpack#feedItem' - ) +const hashFeedItem = 'feedItem' + +export function isFeedItem(v: V) { + return is$typed(v, id, hashFeedItem) } -export function validateFeedItem(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.graph.starterpack#feedItem', v) +export function validateFeedItem(v: V) { + return validate(v, id, hashFeedItem) } diff --git a/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts b/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts index c21c00b2069..b6e4394b5be 100644 --- a/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts +++ b/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts @@ -3,15 +3,18 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.unmuteActor' export interface QueryParams {} export interface InputSchema { actor: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts b/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts index 8a0e8586deb..de8f3676ebe 100644 --- a/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts +++ b/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts @@ -3,15 +3,18 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.unmuteActorList' export interface QueryParams {} export interface InputSchema { list: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts b/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts index 275ba7a0f22..fafceb748b5 100644 --- a/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts +++ b/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts @@ -3,15 +3,18 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.graph.unmuteThread' export interface QueryParams {} export interface InputSchema { root: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/labeler/defs.ts b/packages/api/src/client/types/app/bsky/labeler/defs.ts index 3d9b1d77f8a..453b010db5e 100644 --- a/packages/api/src/client/types/app/bsky/labeler/defs.ts +++ b/packages/api/src/client/types/app/bsky/labeler/defs.ts @@ -2,13 +2,18 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' -import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' +import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.labeler.defs' export interface LabelerView { + $type?: 'app.bsky.labeler.defs#labelerView' uri: string cid: string creator: AppBskyActorDefs.ProfileView @@ -16,22 +21,20 @@ export interface LabelerView { viewer?: LabelerViewerState indexedAt: string labels?: ComAtprotoLabelDefs.Label[] - [k: string]: unknown } -export function isLabelerView(v: unknown): v is LabelerView { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.labeler.defs#labelerView' - ) +const hashLabelerView = 'labelerView' + +export function isLabelerView(v: V) { + return is$typed(v, id, hashLabelerView) } -export function validateLabelerView(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.labeler.defs#labelerView', v) +export function validateLabelerView(v: V) { + return validate(v, id, hashLabelerView) } export interface LabelerViewDetailed { + $type?: 'app.bsky.labeler.defs#labelerViewDetailed' uri: string cid: string creator: AppBskyActorDefs.ProfileView @@ -40,54 +43,47 @@ export interface LabelerViewDetailed { viewer?: LabelerViewerState indexedAt: string labels?: ComAtprotoLabelDefs.Label[] - [k: string]: unknown } -export function isLabelerViewDetailed(v: unknown): v is LabelerViewDetailed { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.labeler.defs#labelerViewDetailed' - ) +const hashLabelerViewDetailed = 'labelerViewDetailed' + +export function isLabelerViewDetailed(v: V) { + return is$typed(v, id, hashLabelerViewDetailed) } -export function validateLabelerViewDetailed(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.labeler.defs#labelerViewDetailed', v) +export function validateLabelerViewDetailed(v: V) { + return validate(v, id, hashLabelerViewDetailed) } export interface LabelerViewerState { + $type?: 'app.bsky.labeler.defs#labelerViewerState' like?: string - [k: string]: unknown } -export function isLabelerViewerState(v: unknown): v is LabelerViewerState { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.labeler.defs#labelerViewerState' - ) +const hashLabelerViewerState = 'labelerViewerState' + +export function isLabelerViewerState(v: V) { + return is$typed(v, id, hashLabelerViewerState) } -export function validateLabelerViewerState(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.labeler.defs#labelerViewerState', v) +export function validateLabelerViewerState(v: V) { + return validate(v, id, hashLabelerViewerState) } export interface LabelerPolicies { + $type?: 'app.bsky.labeler.defs#labelerPolicies' /** The label values which this labeler publishes. May include global or custom labels. */ labelValues: ComAtprotoLabelDefs.LabelValue[] /** Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler. */ labelValueDefinitions?: ComAtprotoLabelDefs.LabelValueDefinition[] - [k: string]: unknown } -export function isLabelerPolicies(v: unknown): v is LabelerPolicies { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.labeler.defs#labelerPolicies' - ) +const hashLabelerPolicies = 'labelerPolicies' + +export function isLabelerPolicies(v: V) { + return is$typed(v, id, hashLabelerPolicies) } -export function validateLabelerPolicies(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.labeler.defs#labelerPolicies', v) +export function validateLabelerPolicies(v: V) { + return validate(v, id, hashLabelerPolicies) } diff --git a/packages/api/src/client/types/app/bsky/labeler/getServices.ts b/packages/api/src/client/types/app/bsky/labeler/getServices.ts index 688f847d508..51875290cde 100644 --- a/packages/api/src/client/types/app/bsky/labeler/getServices.ts +++ b/packages/api/src/client/types/app/bsky/labeler/getServices.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyLabelerDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyLabelerDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.labeler.getServices' export interface QueryParams { dids: string[] @@ -17,11 +21,10 @@ export type InputSchema = undefined export interface OutputSchema { views: ( - | AppBskyLabelerDefs.LabelerView - | AppBskyLabelerDefs.LabelerViewDetailed - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | { $type: string } )[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/labeler/service.ts b/packages/api/src/client/types/app/bsky/labeler/service.ts index 818249468ec..368f71e53bc 100644 --- a/packages/api/src/client/types/app/bsky/labeler/service.ts +++ b/packages/api/src/client/types/app/bsky/labeler/service.ts @@ -2,30 +2,30 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyLabelerDefs from './defs' -import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyLabelerDefs from './defs.js' +import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.labeler.service' export interface Record { + $type: 'app.bsky.labeler.service' policies: AppBskyLabelerDefs.LabelerPolicies - labels?: - | ComAtprotoLabelDefs.SelfLabels - | { $type: string; [k: string]: unknown } + labels?: $Typed | { $type: string } createdAt: string [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.labeler.service#main' || - v.$type === 'app.bsky.labeler.service') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.labeler.service#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } diff --git a/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts b/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts index 00600ea54e7..77e8c5626be 100644 --- a/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts +++ b/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.notification.getUnreadCount' export interface QueryParams { priority?: boolean @@ -16,7 +20,6 @@ export type InputSchema = undefined export interface OutputSchema { count: number - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/notification/listNotifications.ts b/packages/api/src/client/types/app/bsky/notification/listNotifications.ts index 92b3a27fece..13cc4367875 100644 --- a/packages/api/src/client/types/app/bsky/notification/listNotifications.ts +++ b/packages/api/src/client/types/app/bsky/notification/listNotifications.ts @@ -3,11 +3,15 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../actor/defs' -import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../actor/defs.js' +import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.notification.listNotifications' export interface QueryParams { /** Notification reasons to include in response. */ @@ -25,7 +29,6 @@ export interface OutputSchema { notifications: Notification[] priority?: boolean seenAt?: string - [k: string]: unknown } export interface CallOptions { @@ -44,6 +47,7 @@ export function toKnownErr(e: any) { } export interface Notification { + $type?: 'app.bsky.notification.listNotifications#notification' uri: string cid: string author: AppBskyActorDefs.ProfileView @@ -58,24 +62,18 @@ export interface Notification { | 'starterpack-joined' | (string & {}) reasonSubject?: string - record: {} + record: { [_ in string]: unknown } isRead: boolean indexedAt: string labels?: ComAtprotoLabelDefs.Label[] - [k: string]: unknown } -export function isNotification(v: unknown): v is Notification { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.notification.listNotifications#notification' - ) +const hashNotification = 'notification' + +export function isNotification(v: V) { + return is$typed(v, id, hashNotification) } -export function validateNotification(v: unknown): ValidationResult { - return lexicons.validate( - 'app.bsky.notification.listNotifications#notification', - v, - ) +export function validateNotification(v: V) { + return validate(v, id, hashNotification) } diff --git a/packages/api/src/client/types/app/bsky/notification/putPreferences.ts b/packages/api/src/client/types/app/bsky/notification/putPreferences.ts index bc79909f459..fb6f0054c05 100644 --- a/packages/api/src/client/types/app/bsky/notification/putPreferences.ts +++ b/packages/api/src/client/types/app/bsky/notification/putPreferences.ts @@ -3,15 +3,18 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.notification.putPreferences' export interface QueryParams {} export interface InputSchema { priority: boolean - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/notification/registerPush.ts b/packages/api/src/client/types/app/bsky/notification/registerPush.ts index ddc9d438537..87ebb721451 100644 --- a/packages/api/src/client/types/app/bsky/notification/registerPush.ts +++ b/packages/api/src/client/types/app/bsky/notification/registerPush.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.notification.registerPush' export interface QueryParams {} @@ -14,7 +18,6 @@ export interface InputSchema { token: string platform: 'ios' | 'android' | 'web' | (string & {}) appId: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/notification/updateSeen.ts b/packages/api/src/client/types/app/bsky/notification/updateSeen.ts index 7151e9b0cd4..dc2e4905fbe 100644 --- a/packages/api/src/client/types/app/bsky/notification/updateSeen.ts +++ b/packages/api/src/client/types/app/bsky/notification/updateSeen.ts @@ -3,15 +3,18 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.notification.updateSeen' export interface QueryParams {} export interface InputSchema { seenAt: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/richtext/facet.ts b/packages/api/src/client/types/app/bsky/richtext/facet.ts index 836136b7dac..8085d33c8ee 100644 --- a/packages/api/src/client/types/app/bsky/richtext/facet.ts +++ b/packages/api/src/client/types/app/bsky/richtext/facet.ts @@ -2,97 +2,92 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.richtext.facet' /** Annotation of a sub-string within rich text. */ export interface Main { + $type?: 'app.bsky.richtext.facet' index: ByteSlice - features: (Mention | Link | Tag | { $type: string; [k: string]: unknown })[] - [k: string]: unknown + features: ($Typed | $Typed | $Typed | { $type: string })[] } -export function isMain(v: unknown): v is Main { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'app.bsky.richtext.facet#main' || - v.$type === 'app.bsky.richtext.facet') - ) +const hashMain = 'main' + +export function isMain(v: V) { + return is$typed(v, id, hashMain) } -export function validateMain(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.richtext.facet#main', v) +export function validateMain(v: V) { + return validate
(v, id, hashMain) } /** Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID. */ export interface Mention { + $type?: 'app.bsky.richtext.facet#mention' did: string - [k: string]: unknown } -export function isMention(v: unknown): v is Mention { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.richtext.facet#mention' - ) +const hashMention = 'mention' + +export function isMention(v: V) { + return is$typed(v, id, hashMention) } -export function validateMention(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.richtext.facet#mention', v) +export function validateMention(v: V) { + return validate(v, id, hashMention) } /** Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL. */ export interface Link { + $type?: 'app.bsky.richtext.facet#link' uri: string - [k: string]: unknown } -export function isLink(v: unknown): v is Link { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.richtext.facet#link' - ) +const hashLink = 'link' + +export function isLink(v: V) { + return is$typed(v, id, hashLink) } -export function validateLink(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.richtext.facet#link', v) +export function validateLink(v: V) { + return validate(v, id, hashLink) } /** Facet feature for a hashtag. The text usually includes a '#' prefix, but the facet reference should not (except in the case of 'double hash tags'). */ export interface Tag { + $type?: 'app.bsky.richtext.facet#tag' tag: string - [k: string]: unknown } -export function isTag(v: unknown): v is Tag { - return ( - isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.richtext.facet#tag' - ) +const hashTag = 'tag' + +export function isTag(v: V) { + return is$typed(v, id, hashTag) } -export function validateTag(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.richtext.facet#tag', v) +export function validateTag(v: V) { + return validate(v, id, hashTag) } /** Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets. */ export interface ByteSlice { + $type?: 'app.bsky.richtext.facet#byteSlice' byteStart: number byteEnd: number - [k: string]: unknown } -export function isByteSlice(v: unknown): v is ByteSlice { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.richtext.facet#byteSlice' - ) +const hashByteSlice = 'byteSlice' + +export function isByteSlice(v: V) { + return is$typed(v, id, hashByteSlice) } -export function validateByteSlice(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.richtext.facet#byteSlice', v) +export function validateByteSlice(v: V) { + return validate(v, id, hashByteSlice) } diff --git a/packages/api/src/client/types/app/bsky/unspecced/defs.ts b/packages/api/src/client/types/app/bsky/unspecced/defs.ts index 81f821ecf73..6bde35e5709 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/defs.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/defs.ts @@ -2,84 +2,77 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.unspecced.defs' export interface SkeletonSearchPost { + $type?: 'app.bsky.unspecced.defs#skeletonSearchPost' uri: string - [k: string]: unknown } -export function isSkeletonSearchPost(v: unknown): v is SkeletonSearchPost { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.unspecced.defs#skeletonSearchPost' - ) +const hashSkeletonSearchPost = 'skeletonSearchPost' + +export function isSkeletonSearchPost(v: V) { + return is$typed(v, id, hashSkeletonSearchPost) } -export function validateSkeletonSearchPost(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.unspecced.defs#skeletonSearchPost', v) +export function validateSkeletonSearchPost(v: V) { + return validate(v, id, hashSkeletonSearchPost) } export interface SkeletonSearchActor { + $type?: 'app.bsky.unspecced.defs#skeletonSearchActor' did: string - [k: string]: unknown } -export function isSkeletonSearchActor(v: unknown): v is SkeletonSearchActor { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.unspecced.defs#skeletonSearchActor' - ) +const hashSkeletonSearchActor = 'skeletonSearchActor' + +export function isSkeletonSearchActor(v: V) { + return is$typed(v, id, hashSkeletonSearchActor) } -export function validateSkeletonSearchActor(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.unspecced.defs#skeletonSearchActor', v) +export function validateSkeletonSearchActor(v: V) { + return validate(v, id, hashSkeletonSearchActor) } export interface SkeletonSearchStarterPack { + $type?: 'app.bsky.unspecced.defs#skeletonSearchStarterPack' uri: string - [k: string]: unknown } -export function isSkeletonSearchStarterPack( - v: unknown, -): v is SkeletonSearchStarterPack { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.unspecced.defs#skeletonSearchStarterPack' - ) +const hashSkeletonSearchStarterPack = 'skeletonSearchStarterPack' + +export function isSkeletonSearchStarterPack(v: V) { + return is$typed(v, id, hashSkeletonSearchStarterPack) } -export function validateSkeletonSearchStarterPack( - v: unknown, -): ValidationResult { - return lexicons.validate( - 'app.bsky.unspecced.defs#skeletonSearchStarterPack', +export function validateSkeletonSearchStarterPack(v: V) { + return validate( v, + id, + hashSkeletonSearchStarterPack, ) } export interface TrendingTopic { + $type?: 'app.bsky.unspecced.defs#trendingTopic' topic: string displayName?: string description?: string link: string - [k: string]: unknown } -export function isTrendingTopic(v: unknown): v is TrendingTopic { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.unspecced.defs#trendingTopic' - ) +const hashTrendingTopic = 'trendingTopic' + +export function isTrendingTopic(v: V) { + return is$typed(v, id, hashTrendingTopic) } -export function validateTrendingTopic(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.unspecced.defs#trendingTopic', v) +export function validateTrendingTopic(v: V) { + return validate(v, id, hashTrendingTopic) } diff --git a/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts b/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts index d1ee6f7957d..b75201aec3a 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.unspecced.getConfig' export interface QueryParams {} @@ -13,7 +17,6 @@ export type InputSchema = undefined export interface OutputSchema { checkEmailConfirmed?: boolean - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts b/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts index 780b4b6641c..7d08a854ede 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyFeedDefs from '../feed/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyFeedDefs from '../feed/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.unspecced.getPopularFeedGenerators' export interface QueryParams { limit?: number @@ -19,7 +23,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string feeds: AppBskyFeedDefs.GeneratorView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts index 0759165f1d0..45d7c11df39 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyUnspeccedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyUnspeccedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.unspecced.getSuggestionsSkeleton' export interface QueryParams { /** DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking. */ @@ -26,7 +30,6 @@ export interface OutputSchema { relativeToDid?: string /** Snowflake for this recommendation, use when submitting recommendation events. */ recId?: number - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts b/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts index 0ee04b8e85d..28efdc1ad7a 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.unspecced.getTaggedSuggestions' export interface QueryParams {} @@ -13,7 +17,6 @@ export type InputSchema = undefined export interface OutputSchema { suggestions: Suggestion[] - [k: string]: unknown } export interface CallOptions { @@ -32,23 +35,18 @@ export function toKnownErr(e: any) { } export interface Suggestion { + $type?: 'app.bsky.unspecced.getTaggedSuggestions#suggestion' tag: string subjectType: 'actor' | 'feed' | (string & {}) subject: string - [k: string]: unknown } -export function isSuggestion(v: unknown): v is Suggestion { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.unspecced.getTaggedSuggestions#suggestion' - ) +const hashSuggestion = 'suggestion' + +export function isSuggestion(v: V) { + return is$typed(v, id, hashSuggestion) } -export function validateSuggestion(v: unknown): ValidationResult { - return lexicons.validate( - 'app.bsky.unspecced.getTaggedSuggestions#suggestion', - v, - ) +export function validateSuggestion(v: V) { + return validate(v, id, hashSuggestion) } diff --git a/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts b/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts index 70e790e14ba..9877d3744aa 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyUnspeccedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyUnspeccedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.unspecced.getTrendingTopics' export interface QueryParams { /** DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking. */ @@ -19,7 +23,6 @@ export type InputSchema = undefined export interface OutputSchema { topics: AppBskyUnspeccedDefs.TrendingTopic[] suggested: AppBskyUnspeccedDefs.TrendingTopic[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts index d9fe6737d37..4bd5de8572a 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyUnspeccedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyUnspeccedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.unspecced.searchActorsSkeleton' export interface QueryParams { /** Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. For typeahead search, only simple term match is supported, not full syntax. */ @@ -27,7 +31,6 @@ export interface OutputSchema { /** Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. */ hitsTotal?: number actors: AppBskyUnspeccedDefs.SkeletonSearchActor[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts index ea0135dde83..a75698c27b7 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyUnspeccedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyUnspeccedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.unspecced.searchPostsSkeleton' export interface QueryParams { /** Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */ @@ -43,7 +47,6 @@ export interface OutputSchema { /** Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. */ hitsTotal?: number posts: AppBskyUnspeccedDefs.SkeletonSearchPost[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts index c331b86d3e1..525d71af30b 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyUnspeccedDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyUnspeccedDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.unspecced.searchStarterPacksSkeleton' export interface QueryParams { /** Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */ @@ -25,7 +29,6 @@ export interface OutputSchema { /** Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. */ hitsTotal?: number starterPacks: AppBskyUnspeccedDefs.SkeletonSearchStarterPack[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/video/defs.ts b/packages/api/src/client/types/app/bsky/video/defs.ts index a7ec84316b6..15079613e68 100644 --- a/packages/api/src/client/types/app/bsky/video/defs.ts +++ b/packages/api/src/client/types/app/bsky/video/defs.ts @@ -2,11 +2,16 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.video.defs' export interface JobStatus { + $type?: 'app.bsky.video.defs#jobStatus' jobId: string did: string /** The state of the video processing job. All values not listed as a known value indicate that the job is in process. */ @@ -16,17 +21,14 @@ export interface JobStatus { blob?: BlobRef error?: string message?: string - [k: string]: unknown } -export function isJobStatus(v: unknown): v is JobStatus { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'app.bsky.video.defs#jobStatus' - ) +const hashJobStatus = 'jobStatus' + +export function isJobStatus(v: V) { + return is$typed(v, id, hashJobStatus) } -export function validateJobStatus(v: unknown): ValidationResult { - return lexicons.validate('app.bsky.video.defs#jobStatus', v) +export function validateJobStatus(v: V) { + return validate(v, id, hashJobStatus) } diff --git a/packages/api/src/client/types/app/bsky/video/getJobStatus.ts b/packages/api/src/client/types/app/bsky/video/getJobStatus.ts index 0e9638311c0..d9ff3c1c2a4 100644 --- a/packages/api/src/client/types/app/bsky/video/getJobStatus.ts +++ b/packages/api/src/client/types/app/bsky/video/getJobStatus.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyVideoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyVideoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.video.getJobStatus' export interface QueryParams { jobId: string @@ -16,7 +20,6 @@ export type InputSchema = undefined export interface OutputSchema { jobStatus: AppBskyVideoDefs.JobStatus - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts b/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts index 4a2f13617b3..08780b06455 100644 --- a/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts +++ b/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.video.getUploadLimits' export interface QueryParams {} @@ -17,7 +21,6 @@ export interface OutputSchema { remainingDailyBytes?: number message?: string error?: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/app/bsky/video/uploadVideo.ts b/packages/api/src/client/types/app/bsky/video/uploadVideo.ts index f51ba897bbe..2881aee071e 100644 --- a/packages/api/src/client/types/app/bsky/video/uploadVideo.ts +++ b/packages/api/src/client/types/app/bsky/video/uploadVideo.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyVideoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyVideoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'app.bsky.video.uploadVideo' export interface QueryParams {} @@ -14,7 +18,6 @@ export type InputSchema = string | Uint8Array | Blob export interface OutputSchema { jobStatus: AppBskyVideoDefs.JobStatus - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/actor/declaration.ts b/packages/api/src/client/types/chat/bsky/actor/declaration.ts index 99b14f45608..b153d13a088 100644 --- a/packages/api/src/client/types/chat/bsky/actor/declaration.ts +++ b/packages/api/src/client/types/chat/bsky/actor/declaration.ts @@ -2,24 +2,26 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.actor.declaration' export interface Record { + $type: 'chat.bsky.actor.declaration' allowIncoming: 'all' | 'none' | 'following' | (string & {}) [k: string]: unknown } -export function isRecord(v: unknown): v is Record { - return ( - isObj(v) && - hasProp(v, '$type') && - (v.$type === 'chat.bsky.actor.declaration#main' || - v.$type === 'chat.bsky.actor.declaration') - ) +const hashRecord = 'main' + +export function isRecord(v: V) { + return is$typed(v, id, hashRecord) } -export function validateRecord(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.actor.declaration#main', v) +export function validateRecord(v: V) { + return validate(v, id, hashRecord, true) } diff --git a/packages/api/src/client/types/chat/bsky/actor/defs.ts b/packages/api/src/client/types/chat/bsky/actor/defs.ts index 87aaac96218..031c1d1a87c 100644 --- a/packages/api/src/client/types/chat/bsky/actor/defs.ts +++ b/packages/api/src/client/types/chat/bsky/actor/defs.ts @@ -2,13 +2,18 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyActorDefs from '../../../app/bsky/actor/defs' -import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyActorDefs from '../../../app/bsky/actor/defs.js' +import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.actor.defs' export interface ProfileViewBasic { + $type?: 'chat.bsky.actor.defs#profileViewBasic' did: string handle: string displayName?: string @@ -18,17 +23,14 @@ export interface ProfileViewBasic { labels?: ComAtprotoLabelDefs.Label[] /** Set to true when the actor cannot actively participate in converations */ chatDisabled?: boolean - [k: string]: unknown } -export function isProfileViewBasic(v: unknown): v is ProfileViewBasic { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.actor.defs#profileViewBasic' - ) +const hashProfileViewBasic = 'profileViewBasic' + +export function isProfileViewBasic(v: V) { + return is$typed(v, id, hashProfileViewBasic) } -export function validateProfileViewBasic(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.actor.defs#profileViewBasic', v) +export function validateProfileViewBasic(v: V) { + return validate(v, id, hashProfileViewBasic) } diff --git a/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts b/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts index 1a045c21c29..7d65ebe0483 100644 --- a/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts +++ b/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts @@ -3,17 +3,19 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.actor.deleteAccount' export interface QueryParams {} export type InputSchema = undefined -export interface OutputSchema { - [k: string]: unknown -} +export interface OutputSchema {} export interface CallOptions { signal?: AbortSignal diff --git a/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts b/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts index 0142436b05e..730dbdf381d 100644 --- a/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts +++ b/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.actor.exportAccountData' export interface QueryParams {} diff --git a/packages/api/src/client/types/chat/bsky/convo/defs.ts b/packages/api/src/client/types/chat/bsky/convo/defs.ts index 4908b2dc46a..4d458fb798e 100644 --- a/packages/api/src/client/types/chat/bsky/convo/defs.ts +++ b/packages/api/src/client/types/chat/bsky/convo/defs.ts @@ -2,215 +2,193 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as AppBskyRichtextFacet from '../../../app/bsky/richtext/facet' -import * as AppBskyEmbedRecord from '../../../app/bsky/embed/record' -import * as ChatBskyActorDefs from '../actor/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as AppBskyRichtextFacet from '../../../app/bsky/richtext/facet.js' +import type * as AppBskyEmbedRecord from '../../../app/bsky/embed/record.js' +import type * as ChatBskyActorDefs from '../actor/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.defs' export interface MessageRef { + $type?: 'chat.bsky.convo.defs#messageRef' did: string convoId: string messageId: string - [k: string]: unknown } -export function isMessageRef(v: unknown): v is MessageRef { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.defs#messageRef' - ) +const hashMessageRef = 'messageRef' + +export function isMessageRef(v: V) { + return is$typed(v, id, hashMessageRef) } -export function validateMessageRef(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.defs#messageRef', v) +export function validateMessageRef(v: V) { + return validate(v, id, hashMessageRef) } export interface MessageInput { + $type?: 'chat.bsky.convo.defs#messageInput' text: string /** Annotations of text (mentions, URLs, hashtags, etc) */ facets?: AppBskyRichtextFacet.Main[] - embed?: AppBskyEmbedRecord.Main | { $type: string; [k: string]: unknown } - [k: string]: unknown + embed?: $Typed | { $type: string } } -export function isMessageInput(v: unknown): v is MessageInput { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.defs#messageInput' - ) +const hashMessageInput = 'messageInput' + +export function isMessageInput(v: V) { + return is$typed(v, id, hashMessageInput) } -export function validateMessageInput(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.defs#messageInput', v) +export function validateMessageInput(v: V) { + return validate(v, id, hashMessageInput) } export interface MessageView { + $type?: 'chat.bsky.convo.defs#messageView' id: string rev: string text: string /** Annotations of text (mentions, URLs, hashtags, etc) */ facets?: AppBskyRichtextFacet.Main[] - embed?: AppBskyEmbedRecord.View | { $type: string; [k: string]: unknown } + embed?: $Typed | { $type: string } sender: MessageViewSender sentAt: string - [k: string]: unknown } -export function isMessageView(v: unknown): v is MessageView { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.defs#messageView' - ) +const hashMessageView = 'messageView' + +export function isMessageView(v: V) { + return is$typed(v, id, hashMessageView) } -export function validateMessageView(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.defs#messageView', v) +export function validateMessageView(v: V) { + return validate(v, id, hashMessageView) } export interface DeletedMessageView { + $type?: 'chat.bsky.convo.defs#deletedMessageView' id: string rev: string sender: MessageViewSender sentAt: string - [k: string]: unknown } -export function isDeletedMessageView(v: unknown): v is DeletedMessageView { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.defs#deletedMessageView' - ) +const hashDeletedMessageView = 'deletedMessageView' + +export function isDeletedMessageView(v: V) { + return is$typed(v, id, hashDeletedMessageView) } -export function validateDeletedMessageView(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.defs#deletedMessageView', v) +export function validateDeletedMessageView(v: V) { + return validate(v, id, hashDeletedMessageView) } export interface MessageViewSender { + $type?: 'chat.bsky.convo.defs#messageViewSender' did: string - [k: string]: unknown } -export function isMessageViewSender(v: unknown): v is MessageViewSender { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.defs#messageViewSender' - ) +const hashMessageViewSender = 'messageViewSender' + +export function isMessageViewSender(v: V) { + return is$typed(v, id, hashMessageViewSender) } -export function validateMessageViewSender(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.defs#messageViewSender', v) +export function validateMessageViewSender(v: V) { + return validate(v, id, hashMessageViewSender) } export interface ConvoView { + $type?: 'chat.bsky.convo.defs#convoView' id: string rev: string members: ChatBskyActorDefs.ProfileViewBasic[] lastMessage?: - | MessageView - | DeletedMessageView - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | { $type: string } muted: boolean opened?: boolean unreadCount: number - [k: string]: unknown } -export function isConvoView(v: unknown): v is ConvoView { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.defs#convoView' - ) +const hashConvoView = 'convoView' + +export function isConvoView(v: V) { + return is$typed(v, id, hashConvoView) } -export function validateConvoView(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.defs#convoView', v) +export function validateConvoView(v: V) { + return validate(v, id, hashConvoView) } export interface LogBeginConvo { + $type?: 'chat.bsky.convo.defs#logBeginConvo' rev: string convoId: string - [k: string]: unknown } -export function isLogBeginConvo(v: unknown): v is LogBeginConvo { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.defs#logBeginConvo' - ) +const hashLogBeginConvo = 'logBeginConvo' + +export function isLogBeginConvo(v: V) { + return is$typed(v, id, hashLogBeginConvo) } -export function validateLogBeginConvo(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.defs#logBeginConvo', v) +export function validateLogBeginConvo(v: V) { + return validate(v, id, hashLogBeginConvo) } export interface LogLeaveConvo { + $type?: 'chat.bsky.convo.defs#logLeaveConvo' rev: string convoId: string - [k: string]: unknown } -export function isLogLeaveConvo(v: unknown): v is LogLeaveConvo { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.defs#logLeaveConvo' - ) +const hashLogLeaveConvo = 'logLeaveConvo' + +export function isLogLeaveConvo(v: V) { + return is$typed(v, id, hashLogLeaveConvo) } -export function validateLogLeaveConvo(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.defs#logLeaveConvo', v) +export function validateLogLeaveConvo(v: V) { + return validate(v, id, hashLogLeaveConvo) } export interface LogCreateMessage { + $type?: 'chat.bsky.convo.defs#logCreateMessage' rev: string convoId: string - message: - | MessageView - | DeletedMessageView - | { $type: string; [k: string]: unknown } - [k: string]: unknown + message: $Typed | $Typed | { $type: string } } -export function isLogCreateMessage(v: unknown): v is LogCreateMessage { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.defs#logCreateMessage' - ) +const hashLogCreateMessage = 'logCreateMessage' + +export function isLogCreateMessage(v: V) { + return is$typed(v, id, hashLogCreateMessage) } -export function validateLogCreateMessage(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.defs#logCreateMessage', v) +export function validateLogCreateMessage(v: V) { + return validate(v, id, hashLogCreateMessage) } export interface LogDeleteMessage { + $type?: 'chat.bsky.convo.defs#logDeleteMessage' rev: string convoId: string - message: - | MessageView - | DeletedMessageView - | { $type: string; [k: string]: unknown } - [k: string]: unknown + message: $Typed | $Typed | { $type: string } } -export function isLogDeleteMessage(v: unknown): v is LogDeleteMessage { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.defs#logDeleteMessage' - ) +const hashLogDeleteMessage = 'logDeleteMessage' + +export function isLogDeleteMessage(v: V) { + return is$typed(v, id, hashLogDeleteMessage) } -export function validateLogDeleteMessage(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.defs#logDeleteMessage', v) +export function validateLogDeleteMessage(v: V) { + return validate(v, id, hashLogDeleteMessage) } diff --git a/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts b/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts index 863d2208cb8..0b26480e9ad 100644 --- a/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts +++ b/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts @@ -3,17 +3,20 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.deleteMessageForSelf' export interface QueryParams {} export interface InputSchema { convoId: string messageId: string - [k: string]: unknown } export type OutputSchema = ChatBskyConvoDefs.DeletedMessageView diff --git a/packages/api/src/client/types/chat/bsky/convo/getConvo.ts b/packages/api/src/client/types/chat/bsky/convo/getConvo.ts index b3834234b5f..6a44fb581e4 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getConvo.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.getConvo' export interface QueryParams { convoId: string @@ -16,7 +20,6 @@ export type InputSchema = undefined export interface OutputSchema { convo: ChatBskyConvoDefs.ConvoView - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts b/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts index 9db44887410..bca156adc3b 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.getConvoForMembers' export interface QueryParams { members: string[] @@ -16,7 +20,6 @@ export type InputSchema = undefined export interface OutputSchema { convo: ChatBskyConvoDefs.ConvoView - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/convo/getLog.ts b/packages/api/src/client/types/chat/bsky/convo/getLog.ts index f1470fd89ba..27ad0960d93 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getLog.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getLog.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.getLog' export interface QueryParams { cursor?: string @@ -17,13 +21,12 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string logs: ( - | ChatBskyConvoDefs.LogBeginConvo - | ChatBskyConvoDefs.LogLeaveConvo - | ChatBskyConvoDefs.LogCreateMessage - | ChatBskyConvoDefs.LogDeleteMessage - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } )[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/convo/getMessages.ts b/packages/api/src/client/types/chat/bsky/convo/getMessages.ts index eea7cba82e1..065c8678ad0 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getMessages.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getMessages.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.getMessages' export interface QueryParams { convoId: string @@ -19,11 +23,10 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string messages: ( - | ChatBskyConvoDefs.MessageView - | ChatBskyConvoDefs.DeletedMessageView - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | { $type: string } )[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts b/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts index 4124db1855d..82e044b3d32 100644 --- a/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts @@ -3,21 +3,23 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.leaveConvo' export interface QueryParams {} export interface InputSchema { convoId: string - [k: string]: unknown } export interface OutputSchema { convoId: string rev: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/convo/listConvos.ts b/packages/api/src/client/types/chat/bsky/convo/listConvos.ts index 3cd1ad68516..ae6a16f8661 100644 --- a/packages/api/src/client/types/chat/bsky/convo/listConvos.ts +++ b/packages/api/src/client/types/chat/bsky/convo/listConvos.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.listConvos' export interface QueryParams { limit?: number @@ -18,7 +22,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string convos: ChatBskyConvoDefs.ConvoView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts b/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts index 93ac8785db7..d21c235354b 100644 --- a/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts @@ -3,21 +3,23 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.muteConvo' export interface QueryParams {} export interface InputSchema { convoId: string - [k: string]: unknown } export interface OutputSchema { convo: ChatBskyConvoDefs.ConvoView - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts b/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts index e260ba6eee0..f8c69b61ecc 100644 --- a/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts +++ b/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts @@ -3,17 +3,20 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.sendMessage' export interface QueryParams {} export interface InputSchema { convoId: string message: ChatBskyConvoDefs.MessageInput - [k: string]: unknown } export type OutputSchema = ChatBskyConvoDefs.MessageView diff --git a/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts b/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts index 68ff2711df5..0a80a238673 100644 --- a/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts +++ b/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts @@ -3,21 +3,23 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.sendMessageBatch' export interface QueryParams {} export interface InputSchema { items: BatchItem[] - [k: string]: unknown } export interface OutputSchema { items: ChatBskyConvoDefs.MessageView[] - [k: string]: unknown } export interface CallOptions { @@ -38,19 +40,17 @@ export function toKnownErr(e: any) { } export interface BatchItem { + $type?: 'chat.bsky.convo.sendMessageBatch#batchItem' convoId: string message: ChatBskyConvoDefs.MessageInput - [k: string]: unknown } -export function isBatchItem(v: unknown): v is BatchItem { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.convo.sendMessageBatch#batchItem' - ) +const hashBatchItem = 'batchItem' + +export function isBatchItem(v: V) { + return is$typed(v, id, hashBatchItem) } -export function validateBatchItem(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.convo.sendMessageBatch#batchItem', v) +export function validateBatchItem(v: V) { + return validate(v, id, hashBatchItem) } diff --git a/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts b/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts index 93ac8785db7..12457078ee3 100644 --- a/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts @@ -3,21 +3,23 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.unmuteConvo' export interface QueryParams {} export interface InputSchema { convoId: string - [k: string]: unknown } export interface OutputSchema { convo: ChatBskyConvoDefs.ConvoView - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/convo/updateRead.ts b/packages/api/src/client/types/chat/bsky/convo/updateRead.ts index b7a8041dbd7..7003bf0e544 100644 --- a/packages/api/src/client/types/chat/bsky/convo/updateRead.ts +++ b/packages/api/src/client/types/chat/bsky/convo/updateRead.ts @@ -3,22 +3,24 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.convo.updateRead' export interface QueryParams {} export interface InputSchema { convoId: string messageId?: string - [k: string]: unknown } export interface OutputSchema { convo: ChatBskyConvoDefs.ConvoView - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts b/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts index 6761c9939b5..ed3fbcb964d 100644 --- a/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts +++ b/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.moderation.getActorMetadata' export interface QueryParams { actor: string @@ -17,7 +21,6 @@ export interface OutputSchema { day: Metadata month: Metadata all: Metadata - [k: string]: unknown } export interface CallOptions { @@ -36,21 +39,19 @@ export function toKnownErr(e: any) { } export interface Metadata { + $type?: 'chat.bsky.moderation.getActorMetadata#metadata' messagesSent: number messagesReceived: number convos: number convosStarted: number - [k: string]: unknown } -export function isMetadata(v: unknown): v is Metadata { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'chat.bsky.moderation.getActorMetadata#metadata' - ) +const hashMetadata = 'metadata' + +export function isMetadata(v: V) { + return is$typed(v, id, hashMetadata) } -export function validateMetadata(v: unknown): ValidationResult { - return lexicons.validate('chat.bsky.moderation.getActorMetadata#metadata', v) +export function validateMetadata(v: V) { + return validate(v, id, hashMetadata) } diff --git a/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts b/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts index 2315bfd4ad8..fb13f5ac6bb 100644 --- a/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts +++ b/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ChatBskyConvoDefs from '../convo/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ChatBskyConvoDefs from '../convo/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.moderation.getMessageContext' export interface QueryParams { /** Conversation that the message is from. NOTE: this field will eventually be required. */ @@ -20,11 +24,10 @@ export type InputSchema = undefined export interface OutputSchema { messages: ( - | ChatBskyConvoDefs.MessageView - | ChatBskyConvoDefs.DeletedMessageView - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | { $type: string } )[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts b/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts index d6f0205672e..94950f5a5c2 100644 --- a/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts +++ b/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.moderation.updateActorAccess' export interface QueryParams {} @@ -13,7 +17,6 @@ export interface InputSchema { actor: string allowAccess: boolean ref?: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/defs.ts b/packages/api/src/client/types/com/atproto/admin/defs.ts index 26510680347..c130e5bb0c2 100644 --- a/packages/api/src/client/types/com/atproto/admin/defs.ts +++ b/packages/api/src/client/types/com/atproto/admin/defs.ts @@ -2,34 +2,37 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoServerDefs from '../server/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoServerDefs from '../server/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.defs' export interface StatusAttr { + $type?: 'com.atproto.admin.defs#statusAttr' applied: boolean ref?: string - [k: string]: unknown } -export function isStatusAttr(v: unknown): v is StatusAttr { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'com.atproto.admin.defs#statusAttr' - ) +const hashStatusAttr = 'statusAttr' + +export function isStatusAttr(v: V) { + return is$typed(v, id, hashStatusAttr) } -export function validateStatusAttr(v: unknown): ValidationResult { - return lexicons.validate('com.atproto.admin.defs#statusAttr', v) +export function validateStatusAttr(v: V) { + return validate(v, id, hashStatusAttr) } export interface AccountView { + $type?: 'com.atproto.admin.defs#accountView' did: string handle: string email?: string - relatedRecords?: {}[] + relatedRecords?: { [_ in string]: unknown }[] indexedAt: string invitedBy?: ComAtprotoServerDefs.InviteCode invites?: ComAtprotoServerDefs.InviteCode[] @@ -38,71 +41,62 @@ export interface AccountView { inviteNote?: string deactivatedAt?: string threatSignatures?: ThreatSignature[] - [k: string]: unknown } -export function isAccountView(v: unknown): v is AccountView { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'com.atproto.admin.defs#accountView' - ) +const hashAccountView = 'accountView' + +export function isAccountView(v: V) { + return is$typed(v, id, hashAccountView) } -export function validateAccountView(v: unknown): ValidationResult { - return lexicons.validate('com.atproto.admin.defs#accountView', v) +export function validateAccountView(v: V) { + return validate(v, id, hashAccountView) } export interface RepoRef { + $type?: 'com.atproto.admin.defs#repoRef' did: string - [k: string]: unknown } -export function isRepoRef(v: unknown): v is RepoRef { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'com.atproto.admin.defs#repoRef' - ) +const hashRepoRef = 'repoRef' + +export function isRepoRef(v: V) { + return is$typed(v, id, hashRepoRef) } -export function validateRepoRef(v: unknown): ValidationResult { - return lexicons.validate('com.atproto.admin.defs#repoRef', v) +export function validateRepoRef(v: V) { + return validate(v, id, hashRepoRef) } export interface RepoBlobRef { + $type?: 'com.atproto.admin.defs#repoBlobRef' did: string cid: string recordUri?: string - [k: string]: unknown } -export function isRepoBlobRef(v: unknown): v is RepoBlobRef { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'com.atproto.admin.defs#repoBlobRef' - ) +const hashRepoBlobRef = 'repoBlobRef' + +export function isRepoBlobRef(v: V) { + return is$typed(v, id, hashRepoBlobRef) } -export function validateRepoBlobRef(v: unknown): ValidationResult { - return lexicons.validate('com.atproto.admin.defs#repoBlobRef', v) +export function validateRepoBlobRef(v: V) { + return validate(v, id, hashRepoBlobRef) } export interface ThreatSignature { + $type?: 'com.atproto.admin.defs#threatSignature' property: string value: string - [k: string]: unknown } -export function isThreatSignature(v: unknown): v is ThreatSignature { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'com.atproto.admin.defs#threatSignature' - ) +const hashThreatSignature = 'threatSignature' + +export function isThreatSignature(v: V) { + return is$typed(v, id, hashThreatSignature) } -export function validateThreatSignature(v: unknown): ValidationResult { - return lexicons.validate('com.atproto.admin.defs#threatSignature', v) +export function validateThreatSignature(v: V) { + return validate(v, id, hashThreatSignature) } diff --git a/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts b/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts index 72066a656b7..b8aa22091d8 100644 --- a/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts +++ b/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts @@ -3,15 +3,18 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.deleteAccount' export interface QueryParams {} export interface InputSchema { did: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts b/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts index 8df420239de..dcb96b88673 100644 --- a/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts +++ b/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.disableAccountInvites' export interface QueryParams {} @@ -13,7 +17,6 @@ export interface InputSchema { account: string /** Optional reason for disabled invites. */ note?: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts b/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts index c264b65dbc2..0afc3772a96 100644 --- a/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts +++ b/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts @@ -3,16 +3,19 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.disableInviteCodes' export interface QueryParams {} export interface InputSchema { codes?: string[] accounts?: string[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts b/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts index 094b3dfe0af..71c826d41e3 100644 --- a/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts +++ b/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.enableAccountInvites' export interface QueryParams {} @@ -13,7 +17,6 @@ export interface InputSchema { account: string /** Optional reason for enabled invites. */ note?: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts b/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts index 645b9e613ff..9aa44104d7a 100644 --- a/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts +++ b/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoAdminDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoAdminDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.getAccountInfo' export interface QueryParams { did: string diff --git a/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts b/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts index 9c1c273b9d9..8fa95fb39ab 100644 --- a/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts +++ b/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoAdminDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoAdminDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.getAccountInfos' export interface QueryParams { dids: string[] @@ -16,7 +20,6 @@ export type InputSchema = undefined export interface OutputSchema { infos: ComAtprotoAdminDefs.AccountView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts b/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts index faa4c8bed25..125d09b54f5 100644 --- a/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts +++ b/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoServerDefs from '../server/defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoServerDefs from '../server/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.getInviteCodes' export interface QueryParams { sort?: 'recent' | 'usage' | (string & {}) @@ -19,7 +23,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string codes: ComAtprotoServerDefs.InviteCode[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts b/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts index f11b514507d..b5e1ea1fcc7 100644 --- a/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts +++ b/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts @@ -3,11 +3,15 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoAdminDefs from './defs' -import * as ComAtprotoRepoStrongRef from '../repo/strongRef' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoAdminDefs from './defs.js' +import type * as ComAtprotoRepoStrongRef from '../repo/strongRef.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.getSubjectStatus' export interface QueryParams { did?: string @@ -19,13 +23,12 @@ export type InputSchema = undefined export interface OutputSchema { subject: - | ComAtprotoAdminDefs.RepoRef - | ComAtprotoRepoStrongRef.Main - | ComAtprotoAdminDefs.RepoBlobRef - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | { $type: string } takedown?: ComAtprotoAdminDefs.StatusAttr deactivated?: ComAtprotoAdminDefs.StatusAttr - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts b/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts index 2d22806238c..d51219d3131 100644 --- a/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts +++ b/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts @@ -3,10 +3,14 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoAdminDefs from './defs' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoAdminDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.searchAccounts' export interface QueryParams { email?: string @@ -19,7 +23,6 @@ export type InputSchema = undefined export interface OutputSchema { cursor?: string accounts: ComAtprotoAdminDefs.AccountView[] - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/sendEmail.ts b/packages/api/src/client/types/com/atproto/admin/sendEmail.ts index 3f7c06d7070..2e0b39ceeab 100644 --- a/packages/api/src/client/types/com/atproto/admin/sendEmail.ts +++ b/packages/api/src/client/types/com/atproto/admin/sendEmail.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.sendEmail' export interface QueryParams {} @@ -16,12 +20,10 @@ export interface InputSchema { senderDid: string /** Additional comment by the sender that won't be used in the email itself but helpful to provide more context for moderators/reviewers */ comment?: string - [k: string]: unknown } export interface OutputSchema { sent: boolean - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts index d13878711a6..695f6c0f770 100644 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts +++ b/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.updateAccountEmail' export interface QueryParams {} @@ -13,7 +17,6 @@ export interface InputSchema { /** The handle or DID of the repo. */ account: string email: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts index 38fbcae1681..e1d20d19a25 100644 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts +++ b/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts @@ -3,16 +3,19 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.updateAccountHandle' export interface QueryParams {} export interface InputSchema { did: string handle: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts index 412f0facca2..8494a8f4a53 100644 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts +++ b/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts @@ -3,16 +3,19 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.updateAccountPassword' export interface QueryParams {} export interface InputSchema { did: string password: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts b/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts index d890993cf3a..6ef3a83fdfa 100644 --- a/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts +++ b/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts @@ -3,33 +3,35 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' -import * as ComAtprotoAdminDefs from './defs' -import * as ComAtprotoRepoStrongRef from '../repo/strongRef' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' +import type * as ComAtprotoAdminDefs from './defs.js' +import type * as ComAtprotoRepoStrongRef from '../repo/strongRef.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.admin.updateSubjectStatus' export interface QueryParams {} export interface InputSchema { subject: - | ComAtprotoAdminDefs.RepoRef - | ComAtprotoRepoStrongRef.Main - | ComAtprotoAdminDefs.RepoBlobRef - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | { $type: string } takedown?: ComAtprotoAdminDefs.StatusAttr deactivated?: ComAtprotoAdminDefs.StatusAttr - [k: string]: unknown } export interface OutputSchema { subject: - | ComAtprotoAdminDefs.RepoRef - | ComAtprotoRepoStrongRef.Main - | ComAtprotoAdminDefs.RepoBlobRef - | { $type: string; [k: string]: unknown } + | $Typed + | $Typed + | $Typed + | { $type: string } takedown?: ComAtprotoAdminDefs.StatusAttr - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts b/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts index a5e4a0296de..39d0436544e 100644 --- a/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts +++ b/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.identity.getRecommendedDidCredentials' export interface QueryParams {} @@ -15,9 +19,8 @@ export interface OutputSchema { /** Recommended rotation keys for PLC dids. Should be undefined (or ignored) for did:webs. */ rotationKeys?: string[] alsoKnownAs?: string[] - verificationMethods?: {} - services?: {} - [k: string]: unknown + verificationMethods?: { [_ in string]: unknown } + services?: { [_ in string]: unknown } } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts b/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts index dcab71e2558..bea45b12cf9 100644 --- a/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts +++ b/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.identity.requestPlcOperationSignature' export interface QueryParams {} diff --git a/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts b/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts index 32db72138f7..3610d75c0a2 100644 --- a/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts +++ b/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.identity.resolveHandle' export interface QueryParams { /** The handle to resolve. */ @@ -16,7 +20,6 @@ export type InputSchema = undefined export interface OutputSchema { did: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts b/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts index 88c04c5993c..ee670d1f589 100644 --- a/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts +++ b/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts @@ -3,9 +3,13 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.identity.signPlcOperation' export interface QueryParams {} @@ -14,15 +18,13 @@ export interface InputSchema { token?: string rotationKeys?: string[] alsoKnownAs?: string[] - verificationMethods?: {} - services?: {} - [k: string]: unknown + verificationMethods?: { [_ in string]: unknown } + services?: { [_ in string]: unknown } } export interface OutputSchema { /** A signed DID PLC operation. */ - operation: {} - [k: string]: unknown + operation: { [_ in string]: unknown } } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts b/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts index 74dea9f196d..27706159918 100644 --- a/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts +++ b/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts @@ -3,15 +3,18 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.identity.submitPlcOperation' export interface QueryParams {} export interface InputSchema { - operation: {} - [k: string]: unknown + operation: { [_ in string]: unknown } } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/identity/updateHandle.ts b/packages/api/src/client/types/com/atproto/identity/updateHandle.ts index c01d4887a4a..10110120687 100644 --- a/packages/api/src/client/types/com/atproto/identity/updateHandle.ts +++ b/packages/api/src/client/types/com/atproto/identity/updateHandle.ts @@ -3,16 +3,19 @@ */ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.identity.updateHandle' export interface QueryParams {} export interface InputSchema { /** The new handle. */ handle: string - [k: string]: unknown } export interface CallOptions { diff --git a/packages/api/src/client/types/com/atproto/label/defs.ts b/packages/api/src/client/types/com/atproto/label/defs.ts index 131682e550c..b5f75bfce0b 100644 --- a/packages/api/src/client/types/com/atproto/label/defs.ts +++ b/packages/api/src/client/types/com/atproto/label/defs.ts @@ -2,12 +2,17 @@ * GENERATED CODE - DO NOT MODIFY */ import { ValidationResult, BlobRef } from '@atproto/lexicon' -import { isObj, hasProp } from '../../../../util' -import { lexicons } from '../../../../lexicons' import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { $Typed, is$typed as _is$typed, OmitKey } from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'com.atproto.label.defs' /** Metadata tag on an atproto resource (eg, repo or record). */ export interface Label { + $type?: 'com.atproto.label.defs#label' /** The AT Protocol version of the label object. */ ver?: number /** DID of the actor who created this label. */ @@ -26,60 +31,54 @@ export interface Label { exp?: string /** Signature of dag-cbor encoded label. */ sig?: Uint8Array - [k: string]: unknown } -export function isLabel(v: unknown): v is Label { - return ( - isObj(v) && - hasProp(v, '$type') && - v.$type === 'com.atproto.label.defs#label' - ) +const hashLabel = 'label' + +export function isLabel(v: V) { + return is$typed(v, id, hashLabel) } -export function validateLabel(v: unknown): ValidationResult { - return lexicons.validate('com.atproto.label.defs#label', v) +export function validateLabel(v: V) { + return validate