UNPKG

rxdb

Version:

A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/

133 lines (119 loc) 3.13 kB
import * as fs from 'node:fs'; import * as path from 'node:path'; import type { BackupMetaFileContent, BackupOptions, RxDatabase } from '../../types/index.d.ts'; import { blobToString, now } from '../../plugins/utils/index.ts'; /** * ensure that the given folder exists */ export function ensureFolderExists(folderPath: string): void { if (!fs.existsSync(folderPath)) { fs.mkdirSync(folderPath, { recursive: true }); } } /** * deletes and recreates the folder */ export function clearFolder(folderPath: string): void { deleteFolder(folderPath); ensureFolderExists(folderPath); } export function deleteFolder(folderPath: string): void { // only remove if exists to not raise warning if (fs.existsSync(folderPath)) { fs.rmdirSync(folderPath, { recursive: true }); } } export function prepareFolders( database: RxDatabase, options: BackupOptions ) { ensureFolderExists(options.directory); const metaLoc = metaFileLocation(options); if (!fs.existsSync(metaLoc)) { const currentTime = now(); const metaData: BackupMetaFileContent = { createdAt: currentTime, updatedAt: currentTime, collectionStates: {} }; fs.writeFileSync(metaLoc, JSON.stringify(metaData), 'utf-8'); } Object.keys(database.collections).forEach(collectionName => { ensureFolderExists( path.join( options.directory, collectionName ) ); }); } export async function writeToFile( location: string, data: string | Blob ): Promise<void> { if (typeof data !== 'string') { data = await blobToString(data); } return new Promise(function (res, rej) { fs.writeFile( location, data as string, 'utf-8', (err) => { if (err) { rej(err); } else { res(); } } ); }); } export function writeJsonToFile( location: string, data: any ): Promise<void> { return writeToFile( location, JSON.stringify(data) ); } export function metaFileLocation(options: BackupOptions): string { return path.join( options.directory, 'backup_meta.json' ); } export function getMeta(options: BackupOptions): Promise<BackupMetaFileContent> { const loc = metaFileLocation(options); return new Promise((res, rej) => { fs.readFile(loc, 'utf-8', (err, data) => { if (err) { rej(err); } else { const metaContent = JSON.parse(data); res(metaContent); } }); }); } export function setMeta( options: BackupOptions, meta: BackupMetaFileContent ): Promise<void> { const loc = metaFileLocation(options); return writeJsonToFile(loc, meta); } export function documentFolder( options: BackupOptions, docId: string ): string { return path.join( options.directory, docId ); }