UNPKG

@hankei6km/reposition

Version:

`reposition` is a command line tool to send a repository list to Notion database.

40 lines (39 loc) 1.39 kB
import util from 'node:util'; import { parse } from 'ndjson'; import { Chan } from 'chanpuru'; import { validateRepoItem } from './validate.js'; import { send } from './notion.js'; import { Filter } from './filter.js'; export async function reposition({ client, databaseId, filterTimeRange, workersNum, input, output }) { const jsonStream = input.pipe(parse()); const ch = new Chan(workersNum - 1, { rejectInReceiver: true }); let err = null; const filter = new Filter({ now: Date.now(), filterTimeRange }); const LogWrite = util.promisify(output.write.bind(output)); (async () => { try { for await (const data of jsonStream) { const p = (async (data) => { if (validateRepoItem(data) && filter.do(data)) { await send(client, databaseId, data); } })(data); await ch.send(p); } } catch (e) { // rejectInReceiver を設定しているから、ここで catch はほぼない、かな. err = e; } finally { ch.close(); } })(); // ite を回しているときに validate などから reject されるようにしてある. // errCh 作るか検討. for await (const i of ch.receiver()) { } if (err) { throw err; } }