This commit is contained in:
Jurgis Sakalauskas
2025-04-16 11:21:02 +03:00
commit 5c4aa0091c
38 changed files with 9910 additions and 0 deletions
+79
View File
@@ -0,0 +1,79 @@
import { PartialMessageMime } from './types';
import { stat, readFile, unlink } from 'fs/promises';
import { simpleParser } from 'mailparser';
export const checkAndCombinePartial = async (partial: PartialMessageMime['params']) => {
const allStats = await Promise.allSettled(
[...
Array(partial.total)
.fill(null)
.map((_, i) => stat(`./partials/${partial.id}-part_${i + 1}-attachment`)),
...Array(partial.total)
.fill(null)
.map((_, i) => stat(`./partials/${partial.id}-part_${i + 1}-article.json`)),
]
);
const allExists = allStats.every((result) => result.status === 'fulfilled' && result.value.isFile());
if (!allExists) {
return null;
}
//combine all partials
const filesReadPromises = Array(partial.total)
.fill(null)
.map((_, index) => {
console.log(`Reading file ./partials/${partial.id}-part_${index + 1}-attachment`)
return readFile(`./partials/${partial.id}-part_${index + 1}-attachment`)
})
const files = await Promise.all(filesReadPromises);
const file = Buffer.concat(files);
const parsed = await simpleParser(file);
const xrefs = new Set<string>();
let articleId = '';
const articlesReadPromises = Array(partial.total)
.fill(null)
.map(async (_, index) => {
console.log(`Reading file ./partials/${partial.id}-part_${index + 1}-article.json`)
const articleJson = await readFile(`./partials/${partial.id}-part_${index + 1}-article.json`)
const article = JSON.parse(articleJson.toString());
if (index === 0) {
articleId = article.articleId;
}
if (article && article.headers && article.headers.xref) {
return article.headers.xref as string;
}
})
const articlesXrefs = await Promise.all(articlesReadPromises);
articlesXrefs.forEach((xref) => {
if (xref) {
xref.split(' ').forEach(xre => xrefs.add(xre))
}
})
parsed.headers.set('xref', Array.from(xrefs).join(' '));
if (!articleId) {
throw new Error(`articleId not found for ${partial.id}`);
}
const deletePromises = Array(partial.total)
.fill(null)
.map(async (_, index) => {
console.log(`Deleting file ./partials/${partial.id}-part_${index + 1}-article.json`)
await unlink(`./partials/${partial.id}-part_${index + 1}-article.json`)
console.log(`Deleting file ./partials/${partial.id}-part_${index + 1}-attachment`)
await unlink(`./partials/${partial.id}-part_${index + 1}-attachment`)
})
await Promise.all(deletePromises);
parsed.headers.set('messageId', articleId);
parsed.messageId = articleId;
return parsed;
}