node-firestore-import-export
Version:
Firestore data import and export
101 lines (100 loc) • 4.16 kB
JavaScript
;
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;