diff --git a/packages/pds/src/api/com/atproto/server/createAccount.ts b/packages/pds/src/api/com/atproto/server/createAccount.ts index 1b322f76304..3064e6dd541 100644 --- a/packages/pds/src/api/com/atproto/server/createAccount.ts +++ b/packages/pds/src/api/com/atproto/server/createAccount.ts @@ -28,7 +28,7 @@ export default function (server: Server, ctx: AppContext) { points: 100, }, handler: async ({ input, req }) => { - const hasAvailability = ctx.signupLimiter.hasAvailability() + const hasAvailability = await ctx.signupLimiter.hasAvailability() const { did, diff --git a/packages/pds/src/api/com/atproto/temp/checkSignupQueue.ts b/packages/pds/src/api/com/atproto/temp/checkSignupQueue.ts index 2a94c4fa558..a71fe5d1dae 100644 --- a/packages/pds/src/api/com/atproto/temp/checkSignupQueue.ts +++ b/packages/pds/src/api/com/atproto/temp/checkSignupQueue.ts @@ -25,17 +25,15 @@ export default function (server: Server, ctx: AppContext) { placeInQueue = res?.count } - const limiterStatus = ctx.signupLimiter.status + const limiter = ctx.signupLimiter let estimatedTimeMs: number | undefined - if ( - placeInQueue && - !limiterStatus.disableSignups && - limiterStatus.accountsInPeriod > 0 - ) { - estimatedTimeMs = Math.ceil( - (placeInQueue * limiterStatus.periodMs) / - limiterStatus.accountsInPeriod, - ) + if (placeInQueue && !limiter.flags.disableSignups) { + const accountsInPeriod = await limiter.accountsInPeriod() + if (accountsInPeriod > 0) { + estimatedTimeMs = Math.ceil( + (placeInQueue * limiter.flags.periodMs) / accountsInPeriod, + ) + } } return { diff --git a/packages/pds/src/signup-queue/limiter.ts b/packages/pds/src/signup-queue/limiter.ts index 934d04a73da..d8a3945931e 100644 --- a/packages/pds/src/signup-queue/limiter.ts +++ b/packages/pds/src/signup-queue/limiter.ts @@ -1,19 +1,20 @@ import { SECOND } from '@atproto/common' import { limiterLogger as log } from '../logger' import Database from '../db' -import { LimiterStatus, getQueueStatus } from './util' +import { LimiterFlags, getAccountsInPeriod, getQueueStatus } from './util' export class SignupLimiter { destroyed = false promise: Promise = Promise.resolve() timer: NodeJS.Timer | undefined - status: LimiterStatus + flags: LimiterFlags constructor(private db: Database) {} - hasAvailability(): boolean { - if (this.status.disableSignups) return false - return this.status.accountsInPeriod < this.status.periodAllowance + async hasAvailability(): Promise { + if (this.flags.disableSignups) return false + const accountsInPeriod = await this.accountsInPeriod() + return accountsInPeriod < this.flags.periodAllowance } async start() { @@ -38,9 +39,13 @@ export class SignupLimiter { await this.promise } + async accountsInPeriod(): Promise { + return getAccountsInPeriod(this.db, this.flags.periodMs) + } + async refresh() { - this.status = await getQueueStatus(this.db) + this.flags = await getQueueStatus(this.db) - log.info({ ...this.status }, 'limiter refresh') + log.info({ ...this.flags }, 'limiter refresh') } }