snapshot of https://github.com/ueberdosis/hocuspocus.git @ cf3cfa355b4d3bb61c6b6c80071f71783e32470e (2026-09-15)
Some checks failed
build / lint (22) (push) Failing after 17s
build / test (22) (push) Failing after 8s
build / lint (23) (push) Failing after 2s
build / build (22) (push) Has been skipped
build / build (23) (push) Has been skipped
build / test (23) (push) Failing after 4s
docsearch / docsearch (push) Failing after 1s

This commit is contained in:
upstream-mirror
2026-09-15 17:21:35 +05:00
commit e0c588ca1c
265 changed files with 55259 additions and 0 deletions

View File

@@ -0,0 +1,103 @@
import test from 'ava'
import type { onConnectPayload } from '@hocuspocus/server'
import * as MockDate from 'mockdate'
import { Throttle } from '@hocuspocus/extension-throttle'
const getOnConnectPayload = (ip: string) => {
return {
request: {
headers: new Headers({
'x-real-ip': ip,
}),
},
} as unknown as onConnectPayload
}
const generateRequests = async (instance: Throttle, ip: string, numberOfRequests: number) => {
for (let i = 0; i < numberOfRequests; i += 1) {
// eslint-disable-next-line no-await-in-loop
await instance.onConnect(getOnConnectPayload(ip))
}
}
test('throttle extension bans properly', async t => {
const throttle = new Throttle({ banTime: 5, throttle: 15 })
t.teardown(() => throttle.onDestroy())
const ip = '127.0.0.1'
t.false(throttle.isBanned(ip))
await generateRequests(throttle, ip, 15)
try {
await throttle.onConnect(getOnConnectPayload(ip))
t.fail()
} catch (e) {
t.true(throttle.isBanned(ip))
}
})
test('throttle extension unbans properly', async t => {
const throttle = new Throttle({ banTime: 5, throttle: 15 })
t.teardown(() => throttle.onDestroy())
const ip = '127.0.0.1'
t.false(throttle.isBanned(ip))
await generateRequests(throttle, ip, 15)
try {
await throttle.onConnect(getOnConnectPayload(ip))
t.fail()
} catch (e) {
t.true(throttle.isBanned(ip))
}
MockDate.set(Date.now() + 1000 * (throttle.configuration.banTime * 60))
await throttle.onConnect(getOnConnectPayload(ip))
t.false(throttle.isBanned(ip))
MockDate.reset()
})
test.serial('map cleanup works for connectionsByIp', async t => {
const throttle = new Throttle({ consideredSeconds: 60 })
t.teardown(() => throttle.onDestroy())
const ip = '127.0.0.1'
await generateRequests(throttle, ip, 10)
t.is(throttle.connectionsByIp.get(ip)!.length, 10)
MockDate.set(Date.now() + 1000 * throttle.configuration.consideredSeconds)
await throttle.clearMaps()
t.false(throttle.connectionsByIp.has(ip))
MockDate.reset()
})
test.serial('map cleanup works for bannedIps', async t => {
const throttle = new Throttle({ consideredSeconds: 60, throttle: 15 })
t.teardown(() => throttle.onDestroy())
const ip = '127.0.0.1'
await generateRequests(throttle, ip, 15)
try {
await throttle.onConnect(getOnConnectPayload(ip))
// eslint-disable-next-line no-empty
} catch (e) {}
t.true(throttle.bannedIps.has(ip))
MockDate.set(Date.now() + 1000 * throttle.configuration.banTime * 60)
await throttle.clearMaps()
t.false(throttle.bannedIps.has(ip))
MockDate.reset()
})

View File

@@ -0,0 +1,26 @@
import test from 'ava'
import { Throttle } from '@hocuspocus/extension-throttle'
test('throttle has the default configuration', async t => {
const throttle = new Throttle()
t.teardown(() => throttle.onDestroy())
t.is(throttle.configuration.throttle, 15)
})
test('banTime has the default configuration', async t => {
const throttle = new Throttle()
t.teardown(() => throttle.onDestroy())
t.is(throttle.configuration.banTime, 5)
})
test('throttle has a custom value', async t => {
const throttle = new Throttle({ throttle: 100 })
t.teardown(() => throttle.onDestroy())
t.is(throttle.configuration.throttle, 100)
})
test('banTime has a custom value', async t => {
const throttle = new Throttle({ banTime: 100 })
t.teardown(() => throttle.onDestroy())
t.is(throttle.configuration.banTime, 100)
})