我想从服务器获取 CalDAV 日历和地址簿,将值本地存储在磁盘上以缓存它们,并保存 syncToken。然后,稍后,在一段时间内或最迟在应用程序的下一次启动期间,再次运行同步。在第二次同步期间,我只想获取那些(并且正是那些)更改的日历条目和联系人(包括添加、删除或修改)。
我无法从lambdabaa/dav = npm dav的日历和地址簿同步 API 中弄清楚如何做到这一点。文档没有描述这一点。有一个syncCalendar()
函数,从名字上看应该可以做我需要的,但是没有描述参数和整个过程。在代码中,有一个syncToken
(然后还有一个ctag
and etag
)。我正在尝试使用syncToken,它应该可以满足我的需要,但它没有。
在同步之后,我获取calendar.syncToken
并存储它,在下一次同步之前(可能是在重新启动之后),我恢复了 syncToken。但我每次都能完全同步。似乎我使用的 API 错误,但我不知道什么是正确的。
专用测试用例:
git clone https://github.com/benbucksch/test-dav-sync/
yarn install
yarn start
代码,对于自包含性:
import dav from 'dav';
import config from './config.js'; /* Pseudo JSON File with:
export default
{
"serverURL": "https://...hostname.../remote.php/dav",
"username": "...",
"password": "..."
}
*/
var gJSONSavedFile = {}; // would normally be a file or database table
async function start() {
let syncToken = gJSONSavedFile.syncToken; // get it from file
console.info("sync token from file", syncToken);
console.time("calendar-connect");
let xhr = new dav.transport.Basic(
new dav.Credentials({
username: config.username,
password: config.password,
})
);
let account = await dav.createAccount({
server: config.serverURL,
//loadCollections: false,
//loadObjects: false,
xhr: xhr,
});
console.timeEnd("calendar-connect");
let calendar = account.calendars[0]; // just the first, just for testing
console.time("calendar sync");
console.log("sync token after init", calendar.syncToken);
if (syncToken) {
console.log("but setting sync token to", syncToken);
calendar.syncToken = syncToken; // TODO Already set. Doesn't work.
}
calendar = await dav.syncCalendar(calendar, {
syncToken: syncToken, // TODO Doesn't work
xhr: xhr,
});
console.timeEnd("calendar sync");
gJSONSavedFile.syncToken = calendar.syncToken; // save it
console.log("sync token after sync", gJSONSavedFile.syncToken);
console.log("Got", calendar.objects.length, "calendar entries");
}
(async () => {
try {
console.log("Test first start");
await start();
console.log("\nTest second start");
await start();
} catch (ex) {
console.error(ex);
}
})();
针对 NextCloud 运行时的输出:
Test first start
sync token from file undefined
calendar-connect: 4.765s
sync token after init http://sabre.io/ns/sync/1157
calendar sync: 2.562s
sync token after sync http://sabre.io/ns/sync/1157
Got 1051 calendar entries
Test second start
sync token from file http://sabre.io/ns/sync/1157
calendar-connect: 3.351s
sync token after init http://sabre.io/ns/sync/1157
but setting sync token to http://sabre.io/ns/sync/1157
calendar sync: 2.510s
sync token after sync http://sabre.io/ns/sync/1157
Got 1051 calendar entries
Done in 13.29s.
预期输出为:
- 第二次同步返回 0 个条目。
calendar.syncToken
在初始化和登录后不会立即设置。
在 init 之后已经设置的事实syncToken
表明我在这里误解了 API。