| // Based on https://sebastiandedeyne.com/webmentions-on-a-static-site-with-github-actions/ | |
| const https = require('https'); | |
| const fs = require('fs'); | |
| // This token is provided to you after signing up to webmention.io | |
| const { WEBMENTIONS_IO_TOKEN } = process.env; | |
| function fetchMentions() { | |
| const url = `https://webmention.io/api/mentions.jf2?domain=janmonschke.com&token=${WEBMENTIONS_IO_TOKEN}&per-page=999`; | |
| return new Promise((resolve, reject) => { | |
| https | |
| .get(url, (res) => { | |
| let body = ''; | |
| res.on('data', (chunk) => { | |
| body += chunk; | |
| }); | |
| res.on('end', () => { | |
| try { | |
| resolve(JSON.parse(body)); | |
| } catch (error) { | |
| reject(error); | |
| } | |
| }); | |
| }) | |
| .on('error', (error) => { | |
| reject(error); | |
| }); | |
| }).then((response) => { | |
| if (!('children' in response)) { | |
| throw new Error('Invalid webmention.io response.'); | |
| } | |
| return response.children; | |
| }); | |
| } | |
| console.log('Syncing webmentions'); | |
| fetchMentions().then((webmentions) => { | |
| console.log(`Fetched ${webmentions.length} webmentions`); | |
| webmentions.forEach((webmention) => { | |
| const slug = new URL(webmention['wm-target']).pathname | |
| .replace(/\/$/, '') | |
| .replace(/^\//, '') | |
| .replaceAll('/', '__'); | |
| const filename = `${__dirname}/data/${slug}.json`; | |
| // this is the first mention, create the source file | |
| if (!fs.existsSync(filename)) { | |
| console.log('Creating a new webmentions cache file for', filename); | |
| fs.writeFileSync(filename, JSON.stringify([webmention], null, 2)); | |
| return; | |
| } | |
| // there is already a source file for this target | |
| // therefore we are parsing that file, adding the mention to the source | |
| // and then we're writing that file to disk again | |
| const entries = JSON.parse(fs.readFileSync(filename)); | |
| const newEntries = entries | |
| .filter((wm) => wm['wm-id'] !== webmention['wm-id']) | |
| .concat([webmention]); | |
| newEntries.sort((a, b) => a['wm-id'] - b['wm-id']); | |
| fs.writeFileSync(filename, JSON.stringify(newEntries, null, 2)); | |
| if (entries.length !== newEntries.length) { | |
| console.log('Wrote new mention to disk for', filename); | |
| } | |
| }); | |
| console.log('Done syncing webmentions'); | |
| }); |