@hankei6km/reposition
Version:
`reposition` is a command line tool to send a repository list to Notion database.
40 lines (39 loc) • 1.39 kB
JavaScript
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;
}
}