diff --git a/puppeteer-config.json b/puppeteer-config.json deleted file mode 100644 index 411c0e7..0000000 --- a/puppeteer-config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "args": ["--no-sandbox", "--disable-setuid-sandbox"] -} \ No newline at end of file diff --git a/src/Docster/Mermaid.hs b/src/Docster/Mermaid.hs index 22fb880..e3e3b4d 100644 --- a/src/Docster/Mermaid.hs +++ b/src/Docster/Mermaid.hs @@ -16,8 +16,10 @@ import qualified Data.Text as T import qualified Data.Text.IO as TIO import Data.Hashable (hash) import System.FilePath (takeFileName, ()) -import System.Directory (removeFile) +import System.Directory (removeFile, getTemporaryDirectory) import System.Process (callProcess) +import System.IO (hClose) +import System.IO.Temp (openTempFile) import Control.Exception (bracket, catch, SomeException) -- | Application constants @@ -77,17 +79,30 @@ generateDiagramPaths (DiagramConfig (SourceDir sourceDir) format) (DiagramId dia PDF -> let pngFile = sourceDir diagIdStr <> ".png" in (pngFile, T.pack pngFile) +-- | Puppeteer configuration content for disabling sandbox +puppeteerConfigContent :: Text +puppeteerConfigContent = "{\n \"args\": [\"--no-sandbox\", \"--disable-setuid-sandbox\"]\n}" + -- | Call mermaid CLI process with appropriate arguments callMermaidProcess :: OutputFormat -> FilePath -> FilePath -> IO (Either DocsterError ()) callMermaidProcess format mmdFile outputFile = do let baseArgs = case format of HTML -> ["-i", mmdFile, "-o", outputFile] PDF -> ["-i", mmdFile, "-o", outputFile, "--scale", "3"] - args = baseArgs ++ ["--puppeteerConfigFile", "puppeteer-config.json"] - result <- catch - (callProcess (T.unpack mermaidCommand) args >> return (Right ())) - (\(e :: SomeException) -> return $ Left $ ProcessError $ "Mermaid process failed: " <> T.pack (show e)) + -- Create temporary puppeteer config file + result <- bracket + (do tempDir <- getTemporaryDirectory + (configPath, configHandle) <- openTempFile tempDir "puppeteer-config.json" + hClose configHandle + TIO.writeFile configPath puppeteerConfigContent + return configPath) + (\configPath -> removeFile configPath `catch` \(_ :: SomeException) -> return ()) + (\configPath -> do + let args = baseArgs ++ ["--puppeteerConfigFile", configPath] + catch + (callProcess (T.unpack mermaidCommand) args >> return (Right ())) + (\(e :: SomeException) -> return $ Left $ ProcessError $ "Mermaid process failed: " <> T.pack (show e))) return result -- | Create Pandoc image block from image path