sources/new-log-data/new-log-data.mjs
import common from "../common/timer-based.mjs"; export default { ...common, key: "mailgun-new-log-data", name: "New Log Data", type: "source", description: "Emit new event when new data is logged in Mailgun's Control Panel. Occurs for most actions within the associated Mailgun account.", version: "0.0.3", dedupe: "unique", methods: { ...common.methods, _getLastSeenTime() { return this.db.get("lastSeenTime"); }, _setLastSeenTime(lastSeenTime) { this.db.set("lastSeenTime", lastSeenTime); }, generateMeta(payload) { return { id: payload.id, summary: `[${payload["log-level"]}] ${payload.event}`, ts: payload.timestamp, }; }, async getLatestEvents(page = null, limit = 300, ascending = "yes") { const date = new Date(); if (ascending === "yes") { date.setDate(date.getDate() - 1); } else { date.setDate(date.getDate()); } const config = { begin: Math.floor(date.valueOf() / 1000), ascending, limit, }; if (page) { config.page = page; } return this.mailgun.api("events").get(this.domain, config); }, }, hooks: { async deploy() { let lastSeenTime = this._getLastSeenTime(); const { items } = await this.getLatestEvents(null, 5, "no"); if (items.length === 0) { return; } for (let item of items) { if (item.timestamp <= lastSeenTime) { continue; } this._setLastSeenTime(item.timestamp); this.$emit(item, this.generateMeta(item)); } }, }, async run() { let result = { items: [], pages: { next: { id: null, }, }, }; while (true) { result = await this.getLatestEvents(result.pages.next.number, 300); if (result.items.length === 0) { return; } const lastSeenTime = this._getLastSeenTime(); for (let item of result.items) { if (item.timestamp <= lastSeenTime) { continue; } this._setLastSeenTime(item.timestamp); this.$emit(item, this.generateMeta(item)); } } }, };