UNPKG

@pipedream/instantly

Version:

Pipedream Instantly Components

92 lines (83 loc) 2.08 kB
import instantly from "../../instantly.app.mjs"; import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform"; export default { props: { instantly, db: "$.service.db", timer: { type: "$.interface.timer", default: { intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, }, }, }, methods: { _getLastTs() { return this.db.get("lastTs") || 0; }, _setLastTs(lastTs) { this.db.set("lastTs", lastTs); }, getArgs() { return {}; }, generateMeta(item) { return { id: item.id, summary: this.getSummary(item), ts: Date.parse(item[this.getTsField()]), }; }, async processEvent(max) { const lastTs = this._getLastTs(); let maxTs = lastTs; const resourceFn = this.getResourceFn(); const args = this.getArgs(); const tsField = this.getTsField(); const isSortedDesc = args?.sort_order === "desc"; const items = this.instantly.paginate({ fn: resourceFn, args, max: isSortedDesc && max, }); let results = []; for await (const item of items) { const ts = Date.parse(item[tsField]); if (ts >= lastTs) { results.push(item); maxTs = Math.max(ts, maxTs); } else if (isSortedDesc) { break; } } if (!results.length) { return; } if (max && !isSortedDesc) { results = results.slice(-1 * max).reverse(); } results.forEach((item) => { const meta = this.generateMeta(item); this.$emit(item, meta); }); this._setLastTs(maxTs); }, getResourceFn() { throw new Error("getResourceFn is not implemented"); }, getTsField() { throw new Error("getTsField is not implemented"); }, getSummary() { throw new Error("getSummary is not implemented"); }, }, hooks: { async deploy() { await this.processEvent(25); }, }, async run() { await this.processEvent(); }, };