From 82d6bf4ec8e8d62102436f28b2705e2c532bedc7 Mon Sep 17 00:00:00 2001 From: rafaelsideguide <150964962+rafaelsideguide@users.noreply.github.com> Date: Thu, 5 Sep 2024 16:14:21 -0300 Subject: [PATCH] feat(go-parser): singleton --- apps/api/src/lib/html-to-markdown.ts | 47 +++++++++++++++++++--------- 1 file changed, 32 insertions(+), 15 deletions(-) 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);