UNPKG

node-firestore-import-export

Version:
101 lines (100 loc) 4.16 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const firestore_helpers_1 = require("./firestore-helpers"); const helpers_1 = require("./helpers"); const SLEEP_TIME = 1000; const exportData = (startingRef) => __awaiter(this, void 0, void 0, function* () { if (firestore_helpers_1.isLikeDocument(startingRef)) { const collectionsPromise = getCollections(startingRef); let dataPromise; if (firestore_helpers_1.isRootOfDatabase(startingRef)) { dataPromise = Promise.resolve({}); } else { dataPromise = startingRef.get().then(snapshot => snapshot.data()); } return yield Promise.all([collectionsPromise, dataPromise]).then(res => { return Object.assign({ '__collections__': res[0] }, res[1]); }); } else { return yield getDocuments(startingRef); } }); const getCollections = (startingRef) => __awaiter(this, void 0, void 0, function* () { let collectionsSnapshot, deadlineError = false; do { try { collectionsSnapshot = yield startingRef.getCollections(); deadlineError = false; } catch (e) { if (e.message === 'Deadline Exceeded') { console.log(`Deadline Error in getCollections()...waiting ${SLEEP_TIME / 1000} second(s) before retrying`); yield firestore_helpers_1.sleep(SLEEP_TIME); deadlineError = true; } else { throw e; } } } while (deadlineError || !collectionsSnapshot); const collectionNames = []; const collectionPromises = []; collectionsSnapshot.map((collectionRef) => { collectionNames.push(collectionRef.id); collectionPromises.push(getDocuments(collectionRef)); }); const results = yield Promise.all(collectionPromises); const zipped = {}; results.map((res, idx) => { zipped[collectionNames[idx]] = res; }); return zipped; }); const getDocuments = (collectionRef) => __awaiter(this, void 0, void 0, function* () { console.log(`Retrieving documents from ${collectionRef.path}`); let allDocuments, deadlineError = false; do { try { allDocuments = yield collectionRef.get(); deadlineError = false; } catch (e) { if (e.code && e.code === 4) { console.log(`Deadline Error in getDocuments()...waiting ${SLEEP_TIME / 1000} second(s) before retrying`); yield firestore_helpers_1.sleep(SLEEP_TIME); deadlineError = true; } else { throw e; } } } while (deadlineError || !allDocuments); const results = {}; const documentPromises = []; allDocuments.forEach((docSnapshot) => { documentPromises.push(new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { const docDetails = {}; // console.log(docSnapshot.id, '=>', docSnapshot.data()); docDetails[docSnapshot.id] = helpers_1.serializeSpecialTypes(docSnapshot.data()); const collections = yield getCollections(docSnapshot.ref); docDetails[docSnapshot.id]['__collections__'] = collections; resolve(docDetails); }))); }); (yield Promise.all(documentPromises)) .map((res) => { Object.keys(res).map(key => results[key] = res[key]); }); return results; }); exports.default = exportData;