commit 36fdb151704960fce8e78150d45dc3dc6a543c17 from: mtmn date: Thu Jun 25 12:28:56 2026 UTC fix: precompile regexes instead of unsafeCrashWith commit - 3cafafa461a3cfa707bb5c57be92cf16bb6d522e commit + 36fdb151704960fce8e78150d45dc3dc6a543c17 blob - ebdcdda05656016d927a3cec8cbae96fda53c7f4 blob + 699c1e8ca1c24a9f1533766ddf24ee97bf73ae90 --- src/Cover.purs +++ src/Cover.purs @@ -13,13 +13,12 @@ import Control.Alt ((<|>)) import Config (UserConfig, s3ConfigFromUser) import S3 (existsInS3, getPresignedUrl, uploadToS3) import Data.Array ((!!), find) -import Data.Either (Either(..), fromRight') +import Data.Either (Either(..), hush) import Data.Foldable (foldM) import Data.Map as Map import Data.Maybe (Maybe(..), fromMaybe) import Data.String.CaseInsensitive (CaseInsensitiveString(..)) -import Data.String.Regex (regex, replace, parseFlags) -import Partial.Unsafe (unsafeCrashWith) +import Data.String.Regex (Regex, regex, replace, parseFlags) import Effect (Effect) import Effect.Aff (Aff, forkAff, try) import Effect.Class (liftEffect) @@ -50,11 +49,19 @@ type CoverSource = } sanitizeKey :: String -> String -sanitizeKey = replace re1 "_" >>> replace re2 "_" - where - re1 = fromRight' (\_ -> unsafeCrashWith "invalid regex re1") $ regex "[^a-z0-9.-]" (parseFlags "gi") - re2 = fromRight' (\_ -> unsafeCrashWith "invalid regex re2") $ regex "_{2,}" (parseFlags "g") +sanitizeKey = safeReplace sanitizeKeyRe1 "_" >>> safeReplace sanitizeKeyRe2 "_" +safeReplace :: Maybe Regex -> String -> String -> String +safeReplace mRe replacement s = case mRe of + Nothing -> s + Just re -> replace re replacement s + +sanitizeKeyRe1 :: Maybe Regex +sanitizeKeyRe1 = hush $ regex "[^a-z0-9.-]" (parseFlags "gi") + +sanitizeKeyRe2 :: Maybe Regex +sanitizeKeyRe2 = hush $ regex "_{2,}" (parseFlags "g") + getQueryParam :: String -> URL -> Maybe String getQueryParam key url = URLSearchParams.get key (URL.searchParams url) blob - e6e8364d993b9adc086e770fbb1a5d22b8e2d772 blob + a046c5b38ceac71fde10ad03e5e7067730439258 --- src/Main.purs +++ src/Main.purs @@ -8,13 +8,12 @@ import Cosine (serveSimilar) import Data.Argonaut (decodeJson, encodeJson, parseJson, stringify) import Data.Array (find, length) import Data.Array as Data.Array -import Data.Either (Either(..), fromRight') +import Data.Either (Either(..), hush) import Data.Foldable (for_, traverse_) import Data.Int as Int import Data.Maybe (Maybe(..), fromMaybe) import Data.String (Pattern(..), stripPrefix) -import Data.String.Regex (regex, replace, parseFlags) -import Partial.Unsafe (unsafeCrashWith) +import Data.String.Regex (Regex, regex, replace, parseFlags) import Data.Traversable (traverse) import Db (Connection, backupDb, connect, fromString, getOrCreateToken, getScrobbles, getStats, getTokenUser, initDb, initReleaseMetadata, ping, upsertScrobble, withTransaction) import Effect (Effect) @@ -272,8 +271,13 @@ serveProxy corsOrigin db url res = do end w sanitizeDate :: String -> String -sanitizeDate = replace (fromRight' (\_ -> unsafeCrashWith "invalid regex") $ regex "[^0-9\\-]" (parseFlags "g")) "" +sanitizeDate s = case sanitizeDateRe of + Nothing -> s + Just re -> replace re "" s +sanitizeDateRe :: Maybe Regex +sanitizeDateRe = hush $ regex "[^0-9\\-]" (parseFlags "g") + serveStats :: Connection -> URL -> Response -> Effect Unit serveStats db url res = do setHeader "Content-Type" "application/json" (toOutgoingMessage res)