import { app } from 'electron'; import * as fs from 'fs'; import * as fsp from 'fs/promises'; import * as path from 'path'; import { DataSource } from 'typeorm'; import { MessageEntity, UserEntity, RoomEntity, RoomChannelEntity, RoomMemberEntity, ReactionEntity, BanEntity, AttachmentEntity, MetaEntity } from '../entities'; import { settings } from '../settings'; let applicationDataSource: DataSource | undefined; export function getDataSource(): DataSource | undefined { return applicationDataSource; } export async function initializeDatabase(): Promise { const userDataPath = app.getPath('userData'); const dbDir = path.join(userDataPath, 'metoyou'); await fsp.mkdir(dbDir, { recursive: true }); const databaseFilePath = path.join(dbDir, settings.databaseName); let database: Uint8Array | undefined; if (fs.existsSync(databaseFilePath)) { database = fs.readFileSync(databaseFilePath); } applicationDataSource = new DataSource({ type: 'sqljs', database, entities: [ MessageEntity, UserEntity, RoomEntity, RoomChannelEntity, RoomMemberEntity, ReactionEntity, BanEntity, AttachmentEntity, MetaEntity ], migrations: [path.join(__dirname, '..', 'migrations', '*.js'), path.join(__dirname, '..', 'migrations', '*.ts')], synchronize: false, logging: false, autoSave: true, location: databaseFilePath }); try { await applicationDataSource.initialize(); console.log('[DB] Connection initialised at:', databaseFilePath); try { await applicationDataSource.runMigrations(); console.log('[DB] Migrations executed'); } catch (migErr) { console.error('[DB] Migration error:', migErr); } } catch (error) { console.error('[DB] Initialisation error:', error); } } export async function destroyDatabase(): Promise { if (applicationDataSource?.isInitialized) { try { await applicationDataSource.destroy(); console.log('[DB] Connection closed'); } catch (error) { console.error('[DB] Error closing connection:', error); } finally { applicationDataSource = undefined; } } }