Fix the number of Dart sass transpiler instances spun up

This commit is contained in:
Mumbi Francis
2024-07-25 13:45:23 +03:00
committed by Mumbi Francis
parent eb10e19b3a
commit a56b825528
4 changed files with 119 additions and 91 deletions
+49 -53
View File
@@ -1,54 +1,53 @@
package app
import (
"context"
"crypto/tls"
"fmt"
"github.com/cortezaproject/corteza/server/pkg/sass"
"net/url"
"os"
"regexp"
"strings"
"time"
"context"
"crypto/tls"
"fmt"
"net/url"
"os"
"regexp"
"strings"
"time"
authService "github.com/cortezaproject/corteza/server/auth"
"github.com/cortezaproject/corteza/server/auth/saml"
authSettings "github.com/cortezaproject/corteza/server/auth/settings"
autService "github.com/cortezaproject/corteza/server/automation/service"
cmpService "github.com/cortezaproject/corteza/server/compose/service"
cmpEvent "github.com/cortezaproject/corteza/server/compose/service/event"
discoveryService "github.com/cortezaproject/corteza/server/discovery/service"
fedService "github.com/cortezaproject/corteza/server/federation/service"
"github.com/cortezaproject/corteza/server/pkg/actionlog"
"github.com/cortezaproject/corteza/server/pkg/apigw"
apigwTypes "github.com/cortezaproject/corteza/server/pkg/apigw/types"
"github.com/cortezaproject/corteza/server/pkg/auth"
"github.com/cortezaproject/corteza/server/pkg/corredor"
"github.com/cortezaproject/corteza/server/pkg/eventbus"
"github.com/cortezaproject/corteza/server/pkg/healthcheck"
"github.com/cortezaproject/corteza/server/pkg/http"
"github.com/cortezaproject/corteza/server/pkg/id"
"github.com/cortezaproject/corteza/server/pkg/locale"
"github.com/cortezaproject/corteza/server/pkg/logger"
"github.com/cortezaproject/corteza/server/pkg/mail"
"github.com/cortezaproject/corteza/server/pkg/messagebus"
"github.com/cortezaproject/corteza/server/pkg/monitor"
"github.com/cortezaproject/corteza/server/pkg/options"
"github.com/cortezaproject/corteza/server/pkg/provision"
"github.com/cortezaproject/corteza/server/pkg/rbac"
"github.com/cortezaproject/corteza/server/pkg/scheduler"
"github.com/cortezaproject/corteza/server/pkg/sentry"
"github.com/cortezaproject/corteza/server/pkg/valuestore"
"github.com/cortezaproject/corteza/server/pkg/version"
"github.com/cortezaproject/corteza/server/pkg/websocket"
"github.com/cortezaproject/corteza/server/store"
"github.com/cortezaproject/corteza/server/system/service"
sysService "github.com/cortezaproject/corteza/server/system/service"
sysEvent "github.com/cortezaproject/corteza/server/system/service/event"
"github.com/cortezaproject/corteza/server/system/types"
"github.com/lestrrat-go/jwx/jwt"
"go.uber.org/zap"
gomail "gopkg.in/mail.v2"
authService "github.com/cortezaproject/corteza/server/auth"
"github.com/cortezaproject/corteza/server/auth/saml"
authSettings "github.com/cortezaproject/corteza/server/auth/settings"
autService "github.com/cortezaproject/corteza/server/automation/service"
cmpService "github.com/cortezaproject/corteza/server/compose/service"
cmpEvent "github.com/cortezaproject/corteza/server/compose/service/event"
discoveryService "github.com/cortezaproject/corteza/server/discovery/service"
fedService "github.com/cortezaproject/corteza/server/federation/service"
"github.com/cortezaproject/corteza/server/pkg/actionlog"
"github.com/cortezaproject/corteza/server/pkg/apigw"
apigwTypes "github.com/cortezaproject/corteza/server/pkg/apigw/types"
"github.com/cortezaproject/corteza/server/pkg/auth"
"github.com/cortezaproject/corteza/server/pkg/corredor"
"github.com/cortezaproject/corteza/server/pkg/eventbus"
"github.com/cortezaproject/corteza/server/pkg/healthcheck"
"github.com/cortezaproject/corteza/server/pkg/http"
"github.com/cortezaproject/corteza/server/pkg/id"
"github.com/cortezaproject/corteza/server/pkg/locale"
"github.com/cortezaproject/corteza/server/pkg/logger"
"github.com/cortezaproject/corteza/server/pkg/mail"
"github.com/cortezaproject/corteza/server/pkg/messagebus"
"github.com/cortezaproject/corteza/server/pkg/monitor"
"github.com/cortezaproject/corteza/server/pkg/options"
"github.com/cortezaproject/corteza/server/pkg/provision"
"github.com/cortezaproject/corteza/server/pkg/rbac"
"github.com/cortezaproject/corteza/server/pkg/scheduler"
"github.com/cortezaproject/corteza/server/pkg/sentry"
"github.com/cortezaproject/corteza/server/pkg/valuestore"
"github.com/cortezaproject/corteza/server/pkg/version"
"github.com/cortezaproject/corteza/server/pkg/websocket"
"github.com/cortezaproject/corteza/server/store"
"github.com/cortezaproject/corteza/server/system/service"
sysService "github.com/cortezaproject/corteza/server/system/service"
sysEvent "github.com/cortezaproject/corteza/server/system/service/event"
"github.com/cortezaproject/corteza/server/system/types"
"github.com/lestrrat-go/jwx/jwt"
"go.uber.org/zap"
gomail "gopkg.in/mail.v2"
)
const (
@@ -561,12 +560,11 @@ func (app *CortezaApp) Activate(ctx context.Context) (err error) {
updateDiscoverySettings(app.Opt.Discovery, service.CurrentSettings)
updateLocaleSettings(app.Opt.Locale)
updateSassInstallSettings(ctx, app.Log)
app.AuthService.Watch(ctx)
updateSassInstallSettings(ctx, sysService.DefaultStylesheet.SassInstalled(), app.Log)
//Generate CSS for webapps
if err = service.GenerateCSS(sysService.CurrentSettings, app.Opt.Webapp.ScssDirPath, app.Log); err != nil {
if err = sysService.DefaultStylesheet.GenerateCSS(sysService.CurrentSettings, app.Opt.Webapp.ScssDirPath, app.Log); err != nil {
return fmt.Errorf("could not generate css for webapps: %w", err)
}
@@ -970,9 +968,7 @@ func updateSmtpSettings(log *zap.Logger, current *types.AppSettings) {
setupSmtpDialer(log, current.SMTP.Servers...)
}
func updateSassInstallSettings(ctx context.Context, log *zap.Logger) {
sassInstalled := sass.DartSassTranspiler(log) != nil
func updateSassInstallSettings(ctx context.Context, sassInstalled bool, log *zap.Logger) {
// update dart-sass installed setting
err := updateSetting(ctx, "ui.studio.sass-installed", sassInstalled)
if err != nil {
+40 -21
View File
@@ -1,28 +1,29 @@
package service
import (
"context"
"errors"
"time"
"context"
"errors"
"github.com/bep/godartsass/v2"
"time"
automationService "github.com/cortezaproject/corteza/server/automation/service"
discoveryService "github.com/cortezaproject/corteza/server/discovery/service"
"github.com/cortezaproject/corteza/server/pkg/actionlog"
"github.com/cortezaproject/corteza/server/pkg/dal"
"github.com/cortezaproject/corteza/server/pkg/eventbus"
"github.com/cortezaproject/corteza/server/pkg/healthcheck"
"github.com/cortezaproject/corteza/server/pkg/id"
"github.com/cortezaproject/corteza/server/pkg/logger"
"github.com/cortezaproject/corteza/server/pkg/objstore"
"github.com/cortezaproject/corteza/server/pkg/objstore/minio"
"github.com/cortezaproject/corteza/server/pkg/objstore/plain"
"github.com/cortezaproject/corteza/server/pkg/options"
"github.com/cortezaproject/corteza/server/pkg/rbac"
"github.com/cortezaproject/corteza/server/pkg/valuestore"
"github.com/cortezaproject/corteza/server/store"
"github.com/cortezaproject/corteza/server/system/automation"
"github.com/cortezaproject/corteza/server/system/types"
"go.uber.org/zap"
automationService "github.com/cortezaproject/corteza/server/automation/service"
discoveryService "github.com/cortezaproject/corteza/server/discovery/service"
"github.com/cortezaproject/corteza/server/pkg/actionlog"
"github.com/cortezaproject/corteza/server/pkg/dal"
"github.com/cortezaproject/corteza/server/pkg/eventbus"
"github.com/cortezaproject/corteza/server/pkg/healthcheck"
"github.com/cortezaproject/corteza/server/pkg/id"
"github.com/cortezaproject/corteza/server/pkg/logger"
"github.com/cortezaproject/corteza/server/pkg/objstore"
"github.com/cortezaproject/corteza/server/pkg/objstore/minio"
"github.com/cortezaproject/corteza/server/pkg/objstore/plain"
"github.com/cortezaproject/corteza/server/pkg/options"
"github.com/cortezaproject/corteza/server/pkg/rbac"
"github.com/cortezaproject/corteza/server/pkg/valuestore"
"github.com/cortezaproject/corteza/server/store"
"github.com/cortezaproject/corteza/server/system/automation"
"github.com/cortezaproject/corteza/server/system/types"
"go.uber.org/zap"
)
type (
@@ -62,6 +63,8 @@ var (
// DefaultSettings controls system's settings
DefaultSettings *settings
DefaultStylesheet *stylesheet
// DefaultAccessControl Access control checking
DefaultAccessControl *accessControl
@@ -152,9 +155,12 @@ func Initialize(ctx context.Context, log *zap.Logger, s store.Storer, ws websock
}
}
sassTranspiler := dartSassTranspiler(log)
DefaultAccessControl = AccessControl(s)
DefaultSettings = Settings(ctx, DefaultStore, DefaultLogger, DefaultAccessControl, DefaultActionlog, CurrentSettings, c.Webapps)
DefaultStylesheet = Stylesheet(sassTranspiler, log)
DefaultDalConnection = Connection(ctx, dal.Service(), c.DB)
@@ -344,3 +350,16 @@ func isStale(new *time.Time, updatedAt *time.Time, createdAt time.Time) bool {
return new.Equal(createdAt)
}
func dartSassTranspiler(log *zap.Logger) *godartsass.Transpiler {
transpiler, err := godartsass.Start(godartsass.Options{
DartSassEmbeddedFilename: "sass",
})
if err != nil {
log.Warn("dart sass is not installed in your system", zap.Error(err))
return nil
}
return transpiler
}
+1 -1
View File
@@ -256,7 +256,7 @@ func (svc *settings) BulkSet(ctx context.Context, vv types.SettingValueSet) (err
compStyles = current.FindByName("ui.studio.themes")
}
updateCSS(v, current.FindByName(v.Name), compStyles, v.Name, svc.webappsConf.ScssDirPath, svc.logger)
DefaultStylesheet.updateCSS(v, current.FindByName(v.Name), compStyles, v.Name, svc.webappsConf.ScssDirPath, svc.logger)
}
svc.logChange(ctx, v)
+29 -16
View File
@@ -1,15 +1,29 @@
package service
import (
"fmt"
"github.com/cespare/xxhash/v2"
"strings"
"github.com/cortezaproject/corteza/server/pkg/sass"
"github.com/cortezaproject/corteza/server/system/types"
"go.uber.org/zap"
"fmt"
"github.com/bep/godartsass/v2"
"github.com/cespare/xxhash/v2"
"github.com/cortezaproject/corteza/server/pkg/sass"
"github.com/cortezaproject/corteza/server/system/types"
"go.uber.org/zap"
"strings"
)
type (
stylesheet struct {
transpiler *godartsass.Transpiler
logger *zap.Logger
}
)
func Stylesheet(transpiler *godartsass.Transpiler, logger *zap.Logger) *stylesheet {
return &stylesheet{
transpiler: transpiler,
logger: logger,
}
}
// GenerateCSS takes care of creating CSS for webapps by reading SASS content from embedded assets,
// combining it with different themeSASS and customCSS themes, and then transpiling it using the dart-sass compiler.
//
@@ -18,7 +32,7 @@ import (
// If dart isn't installed on the host machine, customCustom css will continue to function, but without sass support.
//
// In case of an error, it will return default css and log out the error
func GenerateCSS(settings *types.AppSettings, sassDirPath string, log *zap.Logger) (err error) {
func (svc *stylesheet) GenerateCSS(settings *types.AppSettings, sassDirPath string, log *zap.Logger) (err error) {
var (
studio = settings.UI.Studio
customCSSMap = make(map[string]string)
@@ -39,12 +53,10 @@ func GenerateCSS(settings *types.AppSettings, sassDirPath string, log *zap.Logge
return
}
transpiler := sass.DartSassTranspiler(log)
// transpile sass to css for each theme
for _, theme := range studio.Themes {
if studio.CustomCSS == nil {
err := sass.Transpile(transpiler, log, theme.ID, theme.Values, "", sassDirPath)
err := sass.Transpile(svc.transpiler, log, theme.ID, theme.Values, "", sassDirPath)
if err != nil {
continue
}
@@ -52,7 +64,7 @@ func GenerateCSS(settings *types.AppSettings, sassDirPath string, log *zap.Logge
customCSS := processCustomCSS(theme.ID, customCSSMap)
// transpile sass to css
err := sass.Transpile(transpiler, log, theme.ID, theme.Values, customCSS, sassDirPath)
err := sass.Transpile(svc.transpiler, log, theme.ID, theme.Values, customCSS, sassDirPath)
if err != nil {
continue
}
@@ -61,6 +73,9 @@ func GenerateCSS(settings *types.AppSettings, sassDirPath string, log *zap.Logge
return
}
func (svc *stylesheet) SassInstalled() bool {
return svc.transpiler != nil
}
// processCustomCSS, processes CustomCSS input and gives priority to theme specific customCSS
func processCustomCSS(themeID string, customCSSMap map[string]string) (customCSS string) {
var stringsBuilder strings.Builder
@@ -82,16 +97,14 @@ func processCustomCSS(themeID string, customCSSMap map[string]string) (customCSS
}
// updateCSS, updates theme css when ui.studio.themes or ui.studio.custom-css settings are updated
func updateCSS(current, old, compStyles *types.SettingValue, name, sassDirPath string, log *zap.Logger) {
transpiler := sass.DartSassTranspiler(log)
func (svc *stylesheet) updateCSS(current, old, compStyles *types.SettingValue, name, sassDirPath string, log *zap.Logger) {
complimentaryStylesMap := themeMap(compStyles)
oldThemesMap := themeMap(old)
currentThemesMap := themeMap(current)
transpileSASS := func(themeID, themeSASS string, themeCustomCSS map[string]string) {
customCSS := processCustomCSS(themeID, themeCustomCSS)
err := sass.Transpile(transpiler, log, themeID, themeSASS, customCSS, sassDirPath)
err := sass.Transpile(svc.transpiler, log, themeID, themeSASS, customCSS, sassDirPath)
if err != nil {
log.Error("failed to transpile sass to css", zap.Error(err))
}