limit strict bs converstion and refactor to not use fs read

This commit is contained in:
Lucy Cifferello
2021-09-22 20:57:33 -06:00
committed by Keagan McClelland
parent aadbc385d0
commit c7effc51f4
7 changed files with 56 additions and 201 deletions

3
.gitignore vendored
View File

@@ -30,4 +30,5 @@ version
**/*.s9pk **/*.s9pk
**/appmgr **/appmgr
0.3.0_features.md 0.3.0_features.md
**/embassy-sdk **/embassy-sdk
start9-registry.prof

View File

@@ -1,163 +0,0 @@
bitcoind:
title: Bitcoin Core
icon-type: png
description:
long: Bitcoin is an innovative payment network and a new kind of money. Bitcoin
uses peer-to-peer technology to operate with no central authority or banks;
managing transactions and the issuing of bitcoins is carried out collectively
by the network. Bitcoin is open-source; its design is public, nobody owns or
controls Bitcoin and everyone can take part. Through many of its unique properties,
Bitcoin allows exciting uses that could not be covered by any previous payment
system.
short: A Bitcoin Full Node by Bitcoin Core
version-info:
- os-version-required: '>=0.2.5'
release-notes: https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.20.1.md
dependencies: {}
version: 0.20.1.1
os-version-recommended: '>=0.2.5'
- os-version-required: '>=0.2.4'
release-notes: https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.20.1.md
dependencies: {}
version: 0.20.1
os-version-recommended: '>=0.2.4'
- os-version-required: '*'
release-notes: https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.20.0.md
dependencies: {}
version: 0.20.0
os-version-recommended: '*'
- os-version-required: '*'
release-notes: https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.19.1.md
dependencies: {}
version: 0.19.1
os-version-recommended: '*'
- os-version-required: '*'
release-notes: https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.19.0.1.md
dependencies: {}
version: 0.19.0
os-version-recommended: '*'
- os-version-required: '*'
release-notes: https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.18.1.md
dependencies: {}
version: 0.18.1
os-version-recommended: '*'
cups:
title: Cups Messenger
icon-type: png
description:
long: Cups is a private, self-hosted, peer-to-peer, Tor-based, instant messenger.
Unlike other end-to-end encrypted messengers, with Cups on the Embassy there
are no trusted third parties.
short: Real private messaging
version-info:
- os-version-required: '>=0.2.4'
release-notes: |
Features
- Adds instructions defined by EmbassyOS 0.2.4 instructions feature
dependencies: {}
version: 0.3.6
os-version-recommended: '>=0.2.4'
- os-version-required: '*'
release-notes: |
Bug Fixes
- Upgrade UI to gracefully handle Consulate browser
dependencies: {}
version: 0.3.5
os-version-recommended: '*'
- os-version-required: '*'
release-notes: |
Bug Fixes
- Register a SIGTERM handler for graceful shutdown
dependencies: {}
version: 0.3.4
os-version-recommended: '*'
- os-version-required: '*'
release-notes: |
Features
- Conversation manual refresh
Bug Fixes
- Contacts hilighting for unread messages
- Avatar first initial centering
- Styling improvements
dependencies: {}
version: 0.3.3
os-version-recommended: '*'
- os-version-required: '*'
release-notes: |
Features
- Conversation manual refresh
Bug Fixes
- Contacts hilighting for unread messages
- Avatar first initial centering
- Styling improvements
dependencies: {}
version: 0.3.2
os-version-recommended: '*'
- os-version-required: '*'
release-notes: |
Big UX overhaul, including the code requisite to power the new Cups Messenger mobile application.
Check out "Cups Messenger" on the iOS and Google Play store
- Usable from your phone without the Tor browser.
- New Dark Theme.
- Message Previews + Old conversation removal
- Fixes bugs from 0.3.0
dependencies: {}
version: 0.3.1
os-version-recommended: '*'
- os-version-required: '*'
release-notes: |
Big UX overhaul, including the code requisite to power the new Cups Messenger mobile application.
Check out "Cups Messenger" on the iOS and Google Play store
- Usable from your phone without the Tor browser.
- New Dark Theme.
- Message Previews + Old conversation removal
dependencies: {}
version: 0.3.0
os-version-recommended: '*'
- os-version-required: '*'
release-notes: Added headers for Consulate caching
dependencies: {}
version: 0.2.4
os-version-recommended: '*'
- os-version-required: '*'
release-notes: fix autofill for password field
dependencies: {}
version: 0.2.3
os-version-recommended: '*'
- os-version-required: '*'
release-notes: |
- Massive load-time improvements
dependencies: {}
version: 0.2.2
os-version-recommended: '*'
- os-version-required: '*'
release-notes: |
- Signin security improvements
dependencies: {}
version: 0.2.1
os-version-recommended: '*'
- os-version-required: '*'
release-notes: |
# Cups UI released
- Breaks compatibility with cups-cli 0.1.x
dependencies: {}
version: 0.2.0
os-version-recommended: '*'
- os-version-required: '*'
release-notes: |
# Alpha Release
- Send messages
- Recieve messages
- Contact book
dependencies: {}
version: 0.1.1
os-version-recommended: '*'
- os-version-required: '*'
release-notes: |
# Alpha Release
- Send messages
- Recieve messages
- Contact book
dependencies: {}
version: 0.1.0
os-version-recommended: '*'

View File

@@ -41,7 +41,7 @@ getIconsR appId = do
Just v -> pure v Just v -> pure v
let appDir = (<> "/") . (</> show spec) . (</> toS appId) $ appsDir let appDir = (<> "/") . (</> show spec) . (</> toS appId) $ appsDir
manifest' <- handleS9ErrT $ getManifest appMgrDir appDir ext manifest' <- handleS9ErrT $ getManifest appMgrDir appDir ext
manifest <- case eitherDecode $ BS.fromStrict manifest' of manifest <- case eitherDecode manifest' of
Left e -> do Left e -> do
$logError "could not parse service manifest!" $logError "could not parse service manifest!"
$logError (show e) $logError (show e)
@@ -61,7 +61,7 @@ getIconsR appId = do
SVG -> pure typeSvg SVG -> pure typeSvg
JPG -> pure typeJpeg JPG -> pure typeJpeg
JPEG -> pure typeJpeg JPEG -> pure typeJpeg
respondSource mimeType (sendChunkBS =<< handleS9ErrT (getIcon appMgrDir (appDir </> show ext) ext)) respondSource mimeType (sendChunkBS =<< BS.toStrict <$> handleS9ErrT (getIcon appMgrDir (appDir </> show ext) ext))
-- (_, Just hout, _, _) <- liftIO (createProcess $ iconBs { std_out = CreatePipe }) -- (_, Just hout, _, _) <- liftIO (createProcess $ iconBs { std_out = CreatePipe })
-- respondSource typePlain (runConduit $ yieldMany () [iconBs]) -- respondSource typePlain (runConduit $ yieldMany () [iconBs])
-- respondSource typePlain $ sourceHandle hout .| awaitForever sendChunkBS -- respondSource typePlain $ sourceHandle hout .| awaitForever sendChunkBS
@@ -77,7 +77,7 @@ getLicenseR appId = do
case servicePath of case servicePath of
Nothing -> notFound Nothing -> notFound
Just p -> do Just p -> do
respondSource typePlain (sendChunkBS =<< handleS9ErrT (getLicense appMgrDir p ext)) respondSource typePlain (sendChunkBS =<< BS.toStrict <$> handleS9ErrT (getLicense appMgrDir p ext))
where ext = Extension (show appId) :: Extension "s9pk" where ext = Extension (show appId) :: Extension "s9pk"
getInstructionsR :: AppIdentifier -> Handler TypedContent getInstructionsR :: AppIdentifier -> Handler TypedContent
@@ -90,5 +90,5 @@ getInstructionsR appId = do
case servicePath of case servicePath of
Nothing -> notFound Nothing -> notFound
Just p -> do Just p -> do
respondSource typePlain (sendChunkBS =<< handleS9ErrT (getInstructions appMgrDir p ext)) respondSource typePlain (sendChunkBS =<< BS.toStrict <$> handleS9ErrT (getInstructions appMgrDir p ext))
where ext = Extension (show appId) :: Extension "s9pk" where ext = Extension (show appId) :: Extension "s9pk"

View File

@@ -43,7 +43,9 @@ import Util.Shared
import Lib.Types.AppIndex ( ) import Lib.Types.AppIndex ( )
import UnliftIO.Async import UnliftIO.Async
import Database.Esqueleto.PostgreSQL ( arrayAggDistinct ) import Database.Esqueleto.PostgreSQL ( arrayAggDistinct )
import Data.Semigroup
type URL = Text
newtype CategoryRes = CategoryRes { newtype CategoryRes = CategoryRes {
categories :: [CategoryTitle] categories :: [CategoryTitle]
} deriving (Show, Generic) } deriving (Show, Generic)
@@ -283,11 +285,14 @@ getPackageListR = do
Left e -> sendResponseStatus status400 ("could not parse query param \"ids\"" <> show e :: Text) Left e -> sendResponseStatus status400 ("could not parse query param \"ids\"" <> show e :: Text)
Right (packages :: [PackageVersion]) -> do Right (packages :: [PackageVersion]) -> do
-- for each item in list get best available from version range -- for each item in list get best available from version range
settings <- getsYesod appSettings settings <- getsYesod appSettings
availableServices <- traverse (getPackageDetails settings) packages availableServicesResult <- liftIO $ mapConcurrently (getPackageDetails settings) packages
-- @TODO fix _ error
let (_, availableServices) = partitionEithers availableServicesResult
packageMetadata <- runDB $ fetchPackageMetadata (snd <$> availableServices) packageMetadata <- runDB $ fetchPackageMetadata (snd <$> availableServices)
serviceDetailResult <- liftIO serviceDetailResult <- liftIO
$ mapConcurrently (uncurry $ getServiceDetails settings packageMetadata) availableServices $ mapConcurrently (uncurry $ getServiceDetails settings packageMetadata) availableServices
-- @TODO fix _ error
let (_, services) = partitionEithers serviceDetailResult let (_, services) = partitionEithers serviceDetailResult
pure $ ServiceAvailableRes services pure $ ServiceAvailableRes services
-- if null errors -- if null errors
@@ -296,21 +301,28 @@ getPackageListR = do
where where
getPackageDetails :: (MonadHandler m) getPackageDetails :: (MonadIO m)
=> AppSettings => AppSettings
-> PackageVersion -> PackageVersion
-> m (Maybe Version, AppIdentifier) -> m (Either Text ((Maybe Version), AppIdentifier))
getPackageDetails settings pv = do getPackageDetails settings pv = do
let appId = packageVersionId pv let appId = packageVersionId pv
let spec = packageVersionVersion pv let spec = packageVersionVersion pv
let appExt = Extension (show appId) :: Extension "s9pk" let appExt = Extension (show appId) :: Extension "s9pk"
getBestVersion ((</> "apps") . resourcesDir $ settings) appExt spec >>= \case getBestVersion ((</> "apps") . resourcesDir $ settings) appExt spec >>= \case
Nothing -> sendResponseStatus Nothing ->
status404 pure
("best version could not be found for " <> show appId <> " with spec " <> show spec :: Text) $ Left
$ "best version could not be found for "
<> show appId
<> " with spec "
<> show spec
Just v -> do Just v -> do
pure (Just v, appId) pure $ Right (Just v, appId)
getServiceDetails :: (MonadIO m, Monad m, MonadError IOException m) getServiceDetails :: (MonadIO m, Monad m, MonadError IOException m)
=> AppSettings => AppSettings
@@ -334,13 +346,13 @@ getServiceDetails settings metadata maybeVersion appId = do
let appDir = (<> "/") . (</> show version) . (</> show appId) $ appsDir let appDir = (<> "/") . (</> show version) . (</> show appId) $ appsDir
let appExt = Extension (show appId) :: Extension "s9pk" let appExt = Extension (show appId) :: Extension "s9pk"
manifest' <- handleS9ErrNuclear $ getManifest appMgrDir appDir appExt manifest' <- handleS9ErrNuclear $ getManifest appMgrDir appDir appExt
case eitherDecode $ BS.fromStrict manifest' of case eitherDecode $ manifest' of
Left e -> pure $ Left $ "Could not parse service manifest for " <> show appId <> ": " <> show e Left e -> pure $ Left $ "Could not parse service manifest for " <> show appId <> ": " <> show e
Right m -> do Right m -> do
d <- liftIO d <- liftIO
$ mapConcurrently (mapDependencyMetadata appsDir domain) (HM.toList $ serviceManifestDependencies m) $ mapConcurrently (mapDependencyMetadata domain metadata) (HM.toList $ serviceManifestDependencies m)
pure $ Right $ ServiceRes { serviceResIcon = [i|https://#{domain}/package/icon/#{appId}|] pure $ Right $ ServiceRes { serviceResIcon = [i|https://#{domain}/package/icon/#{appId}|]
, serviceResManifest = decode $ BS.fromStrict manifest' -- pass through raw JSON Value , serviceResManifest = decode $ manifest' -- pass through raw JSON Value
, serviceResCategories = snd packageMetadata , serviceResCategories = snd packageMetadata
, serviceResInstructions = [i|https://#{domain}/package/instructions/#{appId}|] , serviceResInstructions = [i|https://#{domain}/package/instructions/#{appId}|]
, serviceResLicense = [i|https://#{domain}/package/license/#{appId}|] , serviceResLicense = [i|https://#{domain}/package/license/#{appId}|]
@@ -349,16 +361,19 @@ getServiceDetails settings metadata maybeVersion appId = do
} }
type URL = Text
mapDependencyMetadata :: (MonadIO m) mapDependencyMetadata :: (MonadIO m)
=> FilePath => Text
-> Text -> HM.HashMap AppIdentifier ([Version], [CategoryTitle])
-> (AppIdentifier, ServiceDependencyInfo) -> (AppIdentifier, ServiceDependencyInfo)
-> m (Either Text (AppIdentifier, DependencyInfo)) -> m (Either Text (AppIdentifier, DependencyInfo))
mapDependencyMetadata appsDir domain (appId, depInfo) = do mapDependencyMetadata domain metadata (appId, depInfo) = do
let ext = (Extension (show appId) :: Extension "s9pk") depMetadata <- case HM.lookup appId metadata of
Nothing -> throwIO $ NotFoundE [i|dependency metadata for #{appId} not found.|]
Just m -> pure m
-- get best version from VersionRange of dependency -- get best version from VersionRange of dependency
version <- getBestVersion appsDir ext (serviceDependencyInfoVersion depInfo) >>= \case let satisfactory = filter (<|| serviceDependencyInfoVersion depInfo) (fst depMetadata)
let best = getMax <$> foldMap (Just . Max) satisfactory
version <- case best of
Nothing -> throwIO $ NotFoundE $ "best version not found for dependent package " <> show appId Nothing -> throwIO $ NotFoundE $ "best version not found for dependent package " <> show appId
Just v -> pure v Just v -> pure v
pure $ Right pure $ Right
@@ -371,7 +386,7 @@ mapDependencyMetadata appsDir domain (appId, depInfo) = do
decodeIcon :: (MonadHandler m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> m URL decodeIcon :: (MonadHandler m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> m URL
decodeIcon appmgrPath depPath e@(Extension icon) = do decodeIcon appmgrPath depPath e@(Extension icon) = do
icon' <- handleS9ErrT $ getIcon appmgrPath depPath e icon' <- handleS9ErrT $ getIcon appmgrPath depPath e
case eitherDecode $ BS.fromStrict icon' of case eitherDecode icon' of
Left e' -> do Left e' -> do
$logInfo $ T.pack e' $logInfo $ T.pack e'
sendResponseStatus status400 e' sendResponseStatus status400 e'
@@ -380,12 +395,12 @@ decodeIcon appmgrPath depPath e@(Extension icon) = do
decodeInstructions :: (MonadHandler m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> m Text decodeInstructions :: (MonadHandler m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> m Text
decodeInstructions appmgrPath depPath package = do decodeInstructions appmgrPath depPath package = do
instructions <- handleS9ErrT $ getInstructions appmgrPath depPath package instructions <- handleS9ErrT $ getInstructions appmgrPath depPath package
pure $ decodeUtf8 instructions pure $ decodeUtf8 $ BS.toStrict instructions
decodeLicense :: (MonadHandler m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> m Text decodeLicense :: (MonadHandler m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> m Text
decodeLicense appmgrPath depPath package = do decodeLicense appmgrPath depPath package = do
license <- handleS9ErrT $ getLicense appmgrPath depPath package license <- handleS9ErrT $ getLicense appmgrPath depPath package
pure $ decodeUtf8 license pure $ decodeUtf8 $ BS.toStrict license
fetchAllAppVersions :: Key SApp -> HandlerFor RegistryCtx ([VersionInfo], ReleaseNotes) fetchAllAppVersions :: Key SApp -> HandlerFor RegistryCtx ([VersionInfo], ReleaseNotes)
fetchAllAppVersions appId = do fetchAllAppVersions appId = do
@@ -453,7 +468,8 @@ fetchPackageMetadata ids = do
==. category ==. category
?. ServiceCategoryServiceId ?. ServiceCategoryServiceId
) )
where_ $ service ^. SAppAppId `in_` valList ids -- where_ $
-- service ^. SAppAppId `in_` valList ids
Database.Esqueleto.Experimental.groupBy $ service ^. SAppAppId Database.Esqueleto.Experimental.groupBy $ service ^. SAppAppId
pure (service ^. SAppAppId, arrayAggDistinct (category ?. ServiceCategoryCategoryName)) pure (service ^. SAppAppId, arrayAggDistinct (category ?. ServiceCategoryCategoryName))
let versionsQuery = select $ do let versionsQuery = select $ do
@@ -462,7 +478,8 @@ fetchPackageMetadata ids = do
$ table @SApp $ table @SApp
`innerJoin` table @SVersion `innerJoin` table @SVersion
`on` (\(service :& version) -> (service ^. SAppId) ==. version ^. SVersionAppId) `on` (\(service :& version) -> (service ^. SAppId) ==. version ^. SVersionAppId)
where_ $ service ^. SAppAppId `in_` valList ids -- where_ $
-- service ^. SAppAppId `in_` valList ids
orderBy [desc (version ^. SVersionNumber)] orderBy [desc (version ^. SVersionNumber)]
Database.Esqueleto.Experimental.groupBy $ (service ^. SAppAppId, version ^. SVersionNumber) Database.Esqueleto.Experimental.groupBy $ (service ^. SAppAppId, version ^. SVersionNumber)
pure (service ^. SAppAppId, arrayAggDistinct (version ^. SVersionNumber)) pure (service ^. SAppAppId, arrayAggDistinct (version ^. SVersionNumber))

View File

@@ -31,7 +31,7 @@ readProcessWithExitCode' a b c = liftIO $ do
(LBS.toStrict <$> getStdout process) (LBS.toStrict <$> getStdout process)
(LBS.toStrict <$> getStderr process) (LBS.toStrict <$> getStderr process)
readProcessInheritStderr :: MonadIO m => String -> [String] -> ByteString -> m (ExitCode, ByteString) readProcessInheritStderr :: MonadIO m => String -> [String] -> ByteString -> m (ExitCode, LBS.ByteString)
readProcessInheritStderr a b c = liftIO $ do readProcessInheritStderr a b c = liftIO $ do
let pc = let pc =
setStdin (byteStringInput $ LBS.fromStrict c) setStdin (byteStringInput $ LBS.fromStrict c)
@@ -39,8 +39,7 @@ readProcessInheritStderr a b c = liftIO $ do
$ setEnvInherit $ setEnvInherit
$ setStdout byteStringOutput $ setStdout byteStringOutput
$ System.Process.Typed.proc a b $ System.Process.Typed.proc a b
withProcessWait pc withProcessWait pc $ \process -> atomically $ liftA2 (,) (waitExitCodeSTM process) (getStdout process)
$ \process -> atomically $ liftA2 (,) (waitExitCodeSTM process) (LBS.toStrict <$> getStdout process)
getConfig :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m Text getConfig :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m Text
getConfig appmgrPath appPath e@(Extension appId) = fmap decodeUtf8 $ do getConfig appmgrPath appPath e@(Extension appId) = fmap decodeUtf8 $ do
@@ -48,38 +47,38 @@ getConfig appmgrPath appPath e@(Extension appId) = fmap decodeUtf8 $ do
["inspect", "config", appPath <> show e, "--json"] ["inspect", "config", appPath <> show e, "--json"]
"" ""
case ec of case ec of
ExitSuccess -> pure out ExitSuccess -> pure $ LBS.toStrict out
ExitFailure n -> throwE $ AppMgrE [i|info config #{appId} \--json|] n ExitFailure n -> throwE $ AppMgrE [i|info config #{appId} \--json|] n
getManifest :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m ByteString getManifest :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m LBS.ByteString
getManifest appmgrPath appPath e@(Extension appId) = do getManifest appmgrPath appPath e@(Extension appId) = do
(ec, bs) <- readProcessInheritStderr (appmgrPath <> "embassy-sdk") ["inspect", "manifest", appPath <> show e] "" (ec, bs) <- readProcessInheritStderr (appmgrPath <> "embassy-sdk") ["inspect", "manifest", appPath <> show e] ""
case ec of case ec of
ExitSuccess -> pure bs ExitSuccess -> pure bs
ExitFailure n -> throwE $ AppMgrE [i|embassy-sdk inspect manifest #{appId}|] n ExitFailure n -> throwE $ AppMgrE [i|embassy-sdk inspect manifest #{appId}|] n
getIcon :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m ByteString getIcon :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m LBS.ByteString
getIcon appmgrPath appPath (Extension icon) = do getIcon appmgrPath appPath (Extension icon) = do
(ec, bs) <- readProcessInheritStderr (appmgrPath <> "embassy-sdk") ["inspect", "icon", appPath] "" (ec, bs) <- readProcessInheritStderr (appmgrPath <> "embassy-sdk") ["inspect", "icon", appPath] ""
case ec of case ec of
ExitSuccess -> pure bs ExitSuccess -> pure bs
ExitFailure n -> throwE $ AppMgrE [i|embassy-sdk inspect icon #{icon}|] n ExitFailure n -> throwE $ AppMgrE [i|embassy-sdk inspect icon #{icon}|] n
getPackageHash :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m ByteString getPackageHash :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m LBS.ByteString
getPackageHash appmgrPath appPath e@(Extension appId) = do getPackageHash appmgrPath appPath e@(Extension appId) = do
(ec, bs) <- readProcessInheritStderr (appmgrPath <> "embassy-sdk") ["inspect", "hash", appPath <> show e] "" (ec, bs) <- readProcessInheritStderr (appmgrPath <> "embassy-sdk") ["inspect", "hash", appPath <> show e] ""
case ec of case ec of
ExitSuccess -> pure bs ExitSuccess -> pure bs
ExitFailure n -> throwE $ AppMgrE [i|embassy-sdk inspect hash #{appId}|] n ExitFailure n -> throwE $ AppMgrE [i|embassy-sdk inspect hash #{appId}|] n
getInstructions :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m ByteString getInstructions :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m LBS.ByteString
getInstructions appmgrPath appPath (Extension appId) = do getInstructions appmgrPath appPath (Extension appId) = do
(ec, bs) <- readProcessInheritStderr (appmgrPath <> "embassy-sdk") ["inspect", "instructions", appPath] "" (ec, bs) <- readProcessInheritStderr (appmgrPath <> "embassy-sdk") ["inspect", "instructions", appPath] ""
case ec of case ec of
ExitSuccess -> pure bs ExitSuccess -> pure bs
ExitFailure n -> throwE $ AppMgrE [i|embassy-sdk inspect instructions #{appId}|] n ExitFailure n -> throwE $ AppMgrE [i|embassy-sdk inspect instructions #{appId}|] n
getLicense :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m ByteString getLicense :: (MonadIO m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> S9ErrT m LBS.ByteString
getLicense appmgrPath appPath (Extension appId) = do getLicense appmgrPath appPath (Extension appId) = do
(ec, bs) <- readProcessInheritStderr (appmgrPath <> "embassy-sdk") ["inspect", "license", appPath] "" (ec, bs) <- readProcessInheritStderr (appmgrPath <> "embassy-sdk") ["inspect", "license", appPath] ""
case ec of case ec of

View File

@@ -226,7 +226,7 @@ instance ToJSON ServiceManifest where
] ]
-- >>> eitherDecode testManifest :: Either String ServiceManifest -- >>> eitherDecode testManifest :: Either String ServiceManifest
-- Right (ServiceManifest {serviceManifestId = "embassy-pages", serviceManifestTitle = "Embassy Pages", serviceManifestVersion = 0.1.3, serviceManifestDescriptionLong = "Embassy Pages is a simple web server that uses directories inside File Browser to serve Tor websites.", serviceManifestDescriptionShort = "Create Tor websites, hosted on your Embassy.", serviceManifestReleaseNotes = "Upgrade to EmbassyOS v0.3.0", serviceManifestIcon = Just "icon.png", serviceManifestAlerts = fromList [(INSTALL,Nothing),(UNINSTALL,Nothing),(STOP,Nothing),(RESTORE,Nothing),(START,Nothing)], serviceManifestDependencies = fromList [("filebrowser",ServiceDependencyInfo {serviceDependencyInfoOptional = Nothing, serviceDependencyInfoVersion = >=2.14.1.1 <3.0.0, serviceDependencyInfoDescription = Just "Used to upload files to serve.", serviceDependencyInfoCritical = False})]}) -- Right (ServiceManifest {serviceManifestId = embassy-pages, serviceManifestTitle = "Embassy Pages", serviceManifestVersion = 0.1.3, serviceManifestDescriptionLong = "Embassy Pages is a simple web server that uses directories inside File Browser to serve Tor websites.", serviceManifestDescriptionShort = "Create Tor websites, hosted on your Embassy.", serviceManifestReleaseNotes = "Upgrade to EmbassyOS v0.3.0", serviceManifestIcon = Just "icon.png", serviceManifestAlerts = fromList [(INSTALL,Nothing),(UNINSTALL,Nothing),(STOP,Nothing),(RESTORE,Nothing),(START,Nothing)], serviceManifestDependencies = fromList [(filebrowser,ServiceDependencyInfo {serviceDependencyInfoOptional = Nothing, serviceDependencyInfoVersion = >=2.14.1.1 <3.0.0, serviceDependencyInfoDescription = Just "Used to upload files to serve.", serviceDependencyInfoCritical = False})]})
testManifest :: BS.ByteString testManifest :: BS.ByteString
testManifest = [i|{ testManifest = [i|{
"id": "embassy-pages", "id": "embassy-pages",

View File

@@ -14,6 +14,7 @@ import Lib.Types.Emver
import Data.Semigroup import Data.Semigroup
import Lib.External.AppMgr import Lib.External.AppMgr
import Lib.Error import Lib.Error
import qualified Data.ByteString.Lazy as BS
getVersionFromQuery :: KnownSymbol a => FilePath -> Extension a -> Handler (Maybe Version) getVersionFromQuery :: KnownSymbol a => FilePath -> Extension a -> Handler (Maybe Version)
getVersionFromQuery rootDir ext = do getVersionFromQuery rootDir ext = do
@@ -38,4 +39,4 @@ getBestVersion rootDir ext spec = do
addPackageHeader :: (MonadHandler m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> m () addPackageHeader :: (MonadHandler m, KnownSymbol a) => FilePath -> FilePath -> Extension a -> m ()
addPackageHeader appMgrDir appDir appExt = do addPackageHeader appMgrDir appDir appExt = do
packageHash <- handleS9ErrT $ getPackageHash appMgrDir appDir appExt packageHash <- handleS9ErrT $ getPackageHash appMgrDir appDir appExt
addHeader "X-S9PK-HASH" $ decodeUtf8 packageHash addHeader "X-S9PK-HASH" $ decodeUtf8 $ BS.toStrict packageHash