rxdb
Version:
A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/
133 lines (119 loc) • 3.13 kB
text/typescript
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
);
}