|
- import {
- createWriteStream,
- createReadStream,
- promises,
- ReadStream,
- } from 'fs';
- import readline from 'readline';
-
- export type Item = {
- url: string,
- reactions?: string[],
- }
-
- export const save = async (userId: string, item: Item): Promise<void> => {
- try {
- await promises.stat('.data');
- } catch {
- await promises.mkdir('.data');
- }
-
- return new Promise((resolve, reject) => {
- const ws = createWriteStream(`.data/${userId}.txt`, { flags: 'a' });
- ws.on('error', reject);
- ws.on('finish', resolve);
- ws.end(`${[item.url, ...(item.reactions || [])].join(' ')}\n`);
- });
- };
-
- export const load = async (userId: string, count = 1): Promise<Item[]> => {
- try {
- await promises.stat('.data');
- } catch {
- await promises.mkdir('.data');
- }
-
- return new Promise<Item[]>((resolve, reject) => {
- let rs: ReadStream;
- const items: Item[] = [];
- try {
- rs = createReadStream(`.data/${userId}.txt`, { flags: 'r' });
- rs.on('error', reject);
- const rl = readline.createInterface(rs);
- rl.on('line', (line) => {
- if (items.length >= count) {
- return;
- }
- const [url, ...reactions] = line.split(' ');
- items.push({
- url,
- reactions,
- });
- });
- rl.on('close', () => {
- resolve(items);
- });
- } catch {
- // noop
- }
- });
- };
-
- export const remove = async (userId: string, count = 1): Promise<void> => {
- try {
- await promises.stat('.data');
- } catch {
- await promises.mkdir('.data');
- }
-
- return new Promise((resolve, reject) => {
- let rs: ReadStream;
- let lines = 0;
- try {
- rs = createReadStream(`.data/${userId}.txt`, { flags: 'r' });
- rs.on('error', reject);
- const rl = readline.createInterface(rs);
- const ws = createWriteStream(`.data/${userId}.txt.tmp`, { flags: 'w' });
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
- ws.on('close', async () => {
- await promises.unlink(`.data/${userId}.txt`);
- await promises.rename(`.data/${userId}.txt.tmp`, `.data/${userId}.txt`);
- resolve();
- });
- rl.on('line', (line) => {
- lines += 1;
- if (lines <= count) {
- return;
- }
- ws.write(`${line}\n`);
- });
- rl.on('close', () => {
- ws.close();
- });
- } catch (e) {
- // noop
- reject(e);
- }
- });
- };
|