diff --git a/apps/api/src/lib/html-to-markdown.ts b/apps/api/src/lib/html-to-markdown.ts index 103948f4..a542a434 100644 --- a/apps/api/src/lib/html-to-markdown.ts +++ b/apps/api/src/lib/html-to-markdown.ts @@ -8,9 +8,38 @@ import dotenv from 'dotenv'; import { Logger } from './logger'; dotenv.config(); -// TODO: create a singleton for the converter // TODO: add a timeout to the Go parser +class GoMarkdownConverter { + private static instance: GoMarkdownConverter; + private convert: any; + + private constructor() { + const goExecutablePath = join(__dirname, 'go-html-to-md/html-to-markdown.so'); + const lib = koffi.load(goExecutablePath); + this.convert = lib.func('ConvertHTMLToMarkdown', 'string', ['string']); + } + + public static getInstance(): GoMarkdownConverter { + if (!GoMarkdownConverter.instance) { + GoMarkdownConverter.instance = new GoMarkdownConverter(); + } + return GoMarkdownConverter.instance; + } + + public async convertHTMLToMarkdown(html: string): Promise { + return new Promise((resolve, reject) => { + this.convert.async(html, (err: Error, res: string) => { + if (err) { + reject(err); + } else { + resolve(res); + } + }); + }); + } +} + export async function parseMarkdown(html: string): Promise { if (!html) { return ''; @@ -18,20 +47,8 @@ export async function parseMarkdown(html: string): Promise { try { if (process.env.USE_GO_MARKDOWN_PARSER == "true") { - const goExecutablePath = join(__dirname, 'go-html-to-md/html-to-markdown.so'); - const lib = koffi.load(goExecutablePath); - - const convert = lib.func('ConvertHTMLToMarkdown', 'string', ['string']); - - let markdownContent = await new Promise((resolve, reject) => { - convert.async(html, (err: Error, res: string) => { - if (err) { - reject(err); - } else { - resolve(res); - } - }); - }); + const converter = GoMarkdownConverter.getInstance(); + let markdownContent = await converter.convertHTMLToMarkdown(html); markdownContent = processMultiLineLinks(markdownContent); markdownContent = removeSkipToContentLinks(markdownContent);