UNPKG

rxdb

Version:

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

71 lines (70 loc) 2.94 kB
import { newRxFetchError } from "../../rx-error.js"; import { ensureNotFalsy, lastOfArray } from "../utils/index.js"; import { fetchDocumentContents } from "./document-handling.js"; import { getDriveBaseUrl } from "./microsoft-onedrive-helper.js"; export async function fetchChanges(oneDriveState, init, checkpoint, batchSize = 10) { var filesResult = await fetchChangesFiles(oneDriveState, init, checkpoint, batchSize); var contents = await fetchDocumentContents(oneDriveState, filesResult.files.map(file => file.id)); return { checkpoint: filesResult.checkpoint, documents: contents.ordered }; } export async function fetchChangesFiles(oneDriveState, init, checkpoint, batchSize = 10) { var baseUrl = getDriveBaseUrl(oneDriveState); // Intentionally overfetch in case multiple docs have the same lastModifiedDateTime. var OVERFETCH_AMOUNT = 6; var url = baseUrl + "/items/" + init.docsFolderId + "/children?"; var params = new URLSearchParams(); params.set('$top', (batchSize + OVERFETCH_AMOUNT).toString()); params.set('$select', 'id,name,eTag,lastModifiedDateTime,size,file'); params.set('$orderby', 'lastModifiedDateTime asc,name asc'); if (checkpoint) { // Warning: MS Graph $filter with string timestamps params.set('$filter', "lastModifiedDateTime ge '" + checkpoint.lastModifiedDateTime + "'"); } url += params.toString(); var res = await fetch(url, { headers: { Authorization: "Bearer " + oneDriveState.authToken } }); if (!res.ok) { throw await newRxFetchError(res); } var data = await res.json(); var files = data.value || []; if (checkpoint) { files = files.filter(file => { if (file.lastModifiedDateTime === checkpoint.lastModifiedDateTime) { // If it's the exact same time, check if we already processed it var docId = file.name.split('.')[0]; return !checkpoint.docIdsWithSameModifiedTime?.includes(docId); } return true; }); } files = files.slice(0, batchSize); var first = files[0]; var newCheckpoint = checkpoint; var last = lastOfArray(files); if (last) { var lastModified = ensureNotFalsy(last.lastModifiedDateTime); var docIdsWithSameModifiedTime = files.filter(file => file.lastModifiedDateTime === lastModified).map(file => file.name.split('.')[0]); if (checkpoint && first && first.lastModifiedDateTime === checkpoint.lastModifiedDateTime) { var oldIds = checkpoint.docIdsWithSameModifiedTime || []; docIdsWithSameModifiedTime = docIdsWithSameModifiedTime.concat(oldIds); } newCheckpoint = { docIdsWithSameModifiedTime, lastModifiedDateTime: lastModified }; // using 'any' to dynamically assign docIdsWithSameModifiedTime, // as doing it on the type strictly might conflict with standard Checkpoint usage in RxDB. } return { checkpoint: newCheckpoint, files }; } //# sourceMappingURL=downstream.js.map