mirror of
https://github.com/MichMich/MagicMirror.git
synced 2025-12-01 02:21:39 +00:00
1. Convert CalendarFetcher from legacy constructor function pattern to ES6 class (which simplifies future migration from CommonJS to ES modules). 2. Implement targeted HTTP error handling with smart retry strategies for common calendar feed issues: - 401/403: Extended retry delay (5× interval, min 30 min) - 429: Retry-After header parsing with 15 min fallback - 5xx: Exponential backoff (2^count, max 3 retries) - 4xx: Extended retry (2× interval, min 15 min) - Add serverErrorCount tracking for exponential backoff - Error messages now include specific HTTP status codes and calculated retry delays for better debugging and user feedback Previously, CalendarFetcher did not respond appropriately to HTTP errors, continuing to hammer endpoints without backoff, potentially overloading servers and triggering rate limits. This refactoring implements respectful retry strategies that adapt to server responses and reduce unnecessary load. Maybe we could later centralize the HTTP error handling and use it for weather and newsfeed as well. The PR was inspired by having worked on the calendar fetcher for MMM-CalendarExt2, where there was already better error handling.
41 lines
1.2 KiB
JavaScript
41 lines
1.2 KiB
JavaScript
/*
|
|
* CalendarFetcher Tester
|
|
* use this script with `node debug.js` to test the fetcher without the need
|
|
* of starting the MagicMirror² core. Adjust the values below to your desire.
|
|
*/
|
|
// Load internal alias resolver
|
|
require("../../../js/alias-resolver");
|
|
const Log = require("logger");
|
|
|
|
const CalendarFetcher = require("./calendarfetcher");
|
|
|
|
const url = "https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics"; // Standard test URL
|
|
//const url = "https://www.googleapis.com/calendar/v3/calendars/primary/events/"; // URL for Bearer auth (must be configured in Google OAuth2 first)
|
|
const fetchInterval = 60 * 60 * 1000;
|
|
const maximumEntries = 10;
|
|
const maximumNumberOfDays = 365;
|
|
const user = "magicmirror";
|
|
const pass = "MyStrongPass";
|
|
const auth = {
|
|
user: user,
|
|
pass: pass
|
|
};
|
|
|
|
Log.log("Create fetcher ...");
|
|
|
|
const fetcher = new CalendarFetcher(url, fetchInterval, [], maximumEntries, maximumNumberOfDays, auth);
|
|
|
|
fetcher.onReceive(function (fetcher) {
|
|
Log.log(fetcher.events);
|
|
process.exit(0);
|
|
});
|
|
|
|
fetcher.onError(function (fetcher, error) {
|
|
Log.log("Fetcher error:", error);
|
|
process.exit(1);
|
|
});
|
|
|
|
fetcher.startFetch();
|
|
|
|
Log.log("Create fetcher done! ");
|