diff --git a/src/@types/settings.ts b/src/@types/settings.ts index 649b2ad..98cb997 100644 --- a/src/@types/settings.ts +++ b/src/@types/settings.ts @@ -21,6 +21,12 @@ export interface PubkeyLimits { export type EventKindsRange = [EventKinds, EventKinds] +export interface EventRateLimit { + kinds?: (EventKinds | [EventKinds, EventKinds])[] + rate: number + period: number +} + export interface KindLimits { whitelist?: (EventKinds | EventKindsRange)[] blacklist?: (EventKinds | EventKindsRange)[] @@ -42,6 +48,7 @@ export interface EventLimits { pubkey?: PubkeyLimits kind?: KindLimits createdAt?: CreatedAtLimits + rateLimits?: EventRateLimit[] } export interface ClientSubscriptionLimits { @@ -53,9 +60,20 @@ export interface ClientLimits { subscription?: ClientSubscriptionLimits } +export interface MessageRateLimit { + rate: number + period: number +} + +export interface MessageLimits { + rateLimits?: MessageRateLimit[] + ipWhitelist?: string[] +} + export interface Limits { client?: ClientLimits event?: EventLimits + message?: MessageLimits } export interface Worker { diff --git a/src/utils/settings.ts b/src/utils/settings.ts index 4086482..6d1bee3 100644 --- a/src/utils/settings.ts +++ b/src/utils/settings.ts @@ -4,10 +4,12 @@ import { join } from 'path' import { mergeDeepRight } from 'ramda' import { createLogger } from '../factories/logger-factory' +import { EventKinds } from '../constants/base' import { ISettings } from '../@types/settings' import packageJson from '../../package.json' const debug = createLogger('settings') + export class SettingsStatic { static _settings: ISettings @@ -48,6 +50,26 @@ export class SettingsStatic { maxPositiveDelta: 900, maxNegativeDelta: 0, // disabled }, + rateLimits: [ + { + kinds: [EventKinds.TEXT_NOTE], + period: 60000, + rate: 60, + }, + { + kinds: [[EventKinds.EPHEMERAL_FIRST, EventKinds.EPHEMERAL_LAST]], + period: 60000, + rate: 240, + }, + { + period: 3600000, + rate: 3600, + }, + { + period: 86400000, + rate: 86400, + }, + ], }, client: { subscription: { @@ -55,6 +77,26 @@ export class SettingsStatic { maxFilters: 10, }, }, + message: { + rateLimits: [ + { + period: 60000, // minute + rate: 240, + }, + { + period: 3600000, // hour + rate: 3600, + }, + { + period: 86400000, // day + rate: 86400, + }, + ], + ipWhitelist: [ + '::1', // local host + '::ffff:10.10.10.1', // host running docker + ], + }, }, } } diff --git a/test/unit/utils/settings.spec.ts b/test/unit/utils/settings.spec.ts index bd7b8aa..688e062 100644 --- a/test/unit/utils/settings.spec.ts +++ b/test/unit/utils/settings.spec.ts @@ -79,6 +79,15 @@ describe('SettingsStatic', () => { maxFilters: 10, }, }, + message: { + dailyRate: 86400, + hourlyRate: 3600, + minutelyRate: 240, + ipWhitelist: [ + '::1', + '::ffff:10.10.10.1', + ], + }, }) }) })