UNPKG

rxdb

Version:

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

66 lines (65 loc) 2.51 kB
import { newRxFetchError } from "../../rx-error.js"; import { ensureNotFalsy, lastOfArray } from "../utils/index.js"; import { fetchDocumentContents } from "./document-handling.js"; export async function fetchChanges(googleDriveOptions, init, checkpoint, batchSize = 10) { var filesResult = await fetchChangesFiles(googleDriveOptions, init, checkpoint, batchSize); var contents = await fetchDocumentContents(googleDriveOptions, filesResult.files.map(file => file.id)); return { checkpoint: filesResult.checkpoint, documents: contents.ordered }; } export async function fetchChangesFiles(googleDriveOptions, init, checkpoint, batchSize = 10) { var queryParts = ["'" + init.docsFolderId + "' in parents", "and trashed = false"]; if (checkpoint) { queryParts.push("and modifiedTime >= '" + checkpoint.modifiedTime + "'"); } /** * Intentionally overfetch in case * multiple docs have the same modifiedTime. * We later have to strip the additional ones. */ var OVERFETCH_AMOUNT = 6; var params = new URLSearchParams({ q: queryParts.join(' '), pageSize: batchSize + OVERFETCH_AMOUNT + '', orderBy: "modifiedTime asc,name asc", fields: "files(id,name,mimeType,parents,modifiedTime,size)", supportsAllDrives: "true", includeItemsFromAllDrives: "true" }); var url = googleDriveOptions.apiEndpoint + "/drive/v3/files?" + params.toString(); var res = await fetch(url, { headers: { Authorization: "Bearer " + googleDriveOptions.authToken } }); if (!res.ok) { throw await newRxFetchError(res); } var data = await res.json(); var files = data.files; if (checkpoint) { files = files.filter(file => !(file.modifiedTime === checkpoint.modifiedTime && checkpoint.docIdsWithSameModifiedTime.includes(file.name))); } files = files.slice(0, batchSize); var first = files[0]; var newCheckpoint = checkpoint; var last = lastOfArray(files); if (last) { var lastModified = ensureNotFalsy(last.modifiedTime); var docIdsWithSameModifiedTime = files.filter(file => file.modifiedTime === lastModified).map(file => file.name); if (checkpoint && first.modifiedTime === checkpoint.modifiedTime) { docIdsWithSameModifiedTime = docIdsWithSameModifiedTime.concat(checkpoint.docIdsWithSameModifiedTime); } newCheckpoint = { docIdsWithSameModifiedTime, modifiedTime: lastModified }; } return { checkpoint: newCheckpoint, files }; } //# sourceMappingURL=downstream.js.map