UNPKG

@intuitionrobotics/thunderstorm

Version:
64 lines 4.49 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FirestoreBackupScheduler = exports.FirestoreBackupScheduler_Class = void 0; const ts_common_1 = require("@intuitionrobotics/ts-common"); const firebase_function_1 = require("@intuitionrobotics/firebase/app-backend/functions/firebase-function"); const FirebaseModule_1 = require("@intuitionrobotics/firebase/app-backend/FirebaseModule"); const dispatch_onFirestoreBackupSchedulerAct = new ts_common_1.Dispatcher("__onFirestoreBackupSchedulerAct"); class FirestoreBackupScheduler_Class extends firebase_function_1.FirebaseScheduledFunction { constructor() { super("FirestoreBackupScheduler"); this.onScheduledEvent = () => __awaiter(this, void 0, void 0, function* () { const backupStatusCollection = FirebaseModule_1.FirebaseModule.createAdminSession().getFirestore().getCollection('firestore-backup-status', ["moduleKey", "timestamp"]); const backups = []; (0, ts_common_1.filterInstances)(dispatch_onFirestoreBackupSchedulerAct.dispatchModule()).forEach(backupArray => { backups.push(...backupArray); }); const bucket = yield FirebaseModule_1.FirebaseModule.createAdminSession().getStorage().getOrCreateBucket(); yield Promise.all(backups.map((backupItem) => __awaiter(this, void 0, void 0, function* () { const query = { where: { moduleKey: backupItem.moduleKey }, orderBy: [{ key: "timestamp", order: "asc" }], limit: 1 }; const docs = yield backupStatusCollection.query(query); const latestDoc = docs[0]; if (latestDoc && latestDoc.timestamp + backupItem.interval > (0, ts_common_1.currentTimeMillies)()) return; const backupPath = `backup/firestore/${backupItem.moduleKey}/${(0, ts_common_1.currentTimeMillies)()}.json`; try { const toBackupData = yield backupItem.collection.query(backupItem.backupQuery); yield (yield bucket.getFile(backupPath)).write(toBackupData); yield backupStatusCollection.upsert({ timestamp: (0, ts_common_1.currentTimeMillies)(), moduleKey: backupItem.moduleKey, backupPath }); const keepInterval = backupItem.keepInterval; if (keepInterval) { const queryOld = { where: { moduleKey: backupItem.moduleKey, timestamp: { $lt: (0, ts_common_1.currentTimeMillies)() - keepInterval } } }; const oldDocs = yield backupStatusCollection.query(queryOld); yield Promise.all(oldDocs.map((oldDoc) => __awaiter(this, void 0, void 0, function* () { yield (yield bucket.getFile(oldDoc.backupPath)).delete(); }))); yield backupStatusCollection.delete(queryOld); } } catch (e) { this.logWarning(`backup of ${backupItem.moduleKey} has failed with error`, e); const errorMessage = `Error backing up firestore collection config:\n ${(0, ts_common_1.__stringify)(backupItem, true)}\nError: ${(0, ts_common_1._logger_logException)(e)}`; yield ts_common_1.dispatch_onServerError.dispatchModuleAsync(ts_common_1.ServerErrorSeverity.Critical, errorMessage); } }))); }); this.setSchedule('every 24 hours'); } } exports.FirestoreBackupScheduler_Class = FirestoreBackupScheduler_Class; exports.FirestoreBackupScheduler = new FirestoreBackupScheduler_Class(); //# sourceMappingURL=FirestoreBackupScheduler.js.map