- Remove hardcoded JWT_SECRET fallback (crash on boot if unset) - Make LiveKit config optional with 503 guard on token endpoint - Add REST rate limiting via @fastify/rate-limit (auth 10/15m, messages 5/5s, uploads 10/1m, global 60/1m) - Add WebSocket token bucket rate limiter (30 burst, 2/sec refill) - Add DM channel ownership (ownerId) with migration, enforce on add-member - Require friendship to add users to group DMs - Add silent 20Hz oscillator to prevent Safari AudioContext suspension - Move WebSocket heartbeat to Web Worker to bypass Safari background throttling
71 lines
1.7 KiB
TypeScript
71 lines
1.7 KiB
TypeScript
import Database from 'better-sqlite3';
|
|
|
|
export function runMigrations(db: Database.Database): void {
|
|
console.log('Checking for database migrations...');
|
|
|
|
const tables = [
|
|
{
|
|
name: 'messages',
|
|
columns: [
|
|
{ name: 'reply_to_id', type: 'TEXT REFERENCES messages(id) ON DELETE SET NULL' }
|
|
]
|
|
},
|
|
{
|
|
name: 'users',
|
|
columns: [
|
|
{ name: 'status', type: "TEXT DEFAULT 'offline'" },
|
|
{ name: 'custom_status', type: 'TEXT' }
|
|
]
|
|
},
|
|
{
|
|
name: 'roles',
|
|
columns: [
|
|
{ name: 'permissions', type: 'TEXT' }
|
|
]
|
|
},
|
|
{
|
|
name: 'dm_messages',
|
|
columns: [
|
|
{ name: 'edited_at', type: 'INTEGER' },
|
|
{ name: 'reply_to_id', type: 'TEXT' }
|
|
]
|
|
},
|
|
{
|
|
name: 'attachments',
|
|
columns: [
|
|
{ name: 'dm_message_id', type: 'TEXT' }
|
|
]
|
|
},
|
|
{
|
|
name: 'dm_members',
|
|
columns: [
|
|
{ name: 'closed', type: 'INTEGER DEFAULT 0' }
|
|
]
|
|
},
|
|
{
|
|
name: 'dm_channels',
|
|
columns: [
|
|
{ name: 'owner_id', type: 'TEXT' }
|
|
]
|
|
}
|
|
];
|
|
|
|
for (const table of tables) {
|
|
const tableInfo = db.pragma(`table_info(${table.name})`) as { name: string }[];
|
|
const existingColumns = new Set(tableInfo.map(c => c.name));
|
|
|
|
for (const column of table.columns) {
|
|
if (!existingColumns.has(column.name)) {
|
|
console.log(`Migrating: Adding column ${column.name} to ${table.name}`);
|
|
try {
|
|
db.exec(`ALTER TABLE ${table.name} ADD COLUMN ${column.name} ${column.type}`);
|
|
} catch (error) {
|
|
console.error(`Failed to add column ${column.name} to ${table.name}:`, error);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log('Migrations complete.');
|
|
}
|