185 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
/*
 | 
						|
 * Copyright 2025 coze-dev Authors
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
package appinfra
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"strconv"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"gorm.io/gorm"
 | 
						|
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/contract/coderunner"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/contract/imagex"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/contract/modelmgr"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/impl/cache/redis"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/impl/coderunner/direct"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/impl/coderunner/sandbox"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/impl/es"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/impl/eventbus"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/impl/idgen"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/impl/imagex/veimagex"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/impl/mysql"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/infra/impl/storage"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/types/consts"
 | 
						|
)
 | 
						|
 | 
						|
type AppDependencies struct {
 | 
						|
	DB                    *gorm.DB
 | 
						|
	CacheCli              *redis.Client
 | 
						|
	IDGenSVC              idgen.IDGenerator
 | 
						|
	ESClient              es.Client
 | 
						|
	ImageXClient          imagex.ImageX
 | 
						|
	TOSClient             storage.Storage
 | 
						|
	ResourceEventProducer eventbus.Producer
 | 
						|
	AppEventProducer      eventbus.Producer
 | 
						|
	ModelMgr              modelmgr.Manager
 | 
						|
	CodeRunner            coderunner.Runner
 | 
						|
}
 | 
						|
 | 
						|
func Init(ctx context.Context) (*AppDependencies, error) {
 | 
						|
	deps := &AppDependencies{}
 | 
						|
	var err error
 | 
						|
 | 
						|
	deps.DB, err = mysql.New()
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	deps.CacheCli = redis.New()
 | 
						|
 | 
						|
	deps.IDGenSVC, err = idgen.New(deps.CacheCli)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	deps.ESClient, err = es.New()
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	deps.ImageXClient, err = initImageX(ctx)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	deps.TOSClient, err = initTOS(ctx)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	deps.ResourceEventProducer, err = initResourceEventBusProducer()
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	deps.AppEventProducer, err = initAppEventProducer()
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	deps.ModelMgr, err = initModelMgr()
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	deps.CodeRunner = initCodeRunner()
 | 
						|
 | 
						|
	return deps, nil
 | 
						|
}
 | 
						|
 | 
						|
func initImageX(ctx context.Context) (imagex.ImageX, error) {
 | 
						|
 | 
						|
	uploadComponentType := os.Getenv(consts.FileUploadComponentType)
 | 
						|
 | 
						|
	if uploadComponentType != consts.FileUploadComponentTypeImagex {
 | 
						|
		return storage.NewImagex(ctx)
 | 
						|
	}
 | 
						|
	return veimagex.New(
 | 
						|
		os.Getenv(consts.VeImageXAK),
 | 
						|
		os.Getenv(consts.VeImageXSK),
 | 
						|
		os.Getenv(consts.VeImageXDomain),
 | 
						|
		os.Getenv(consts.VeImageXUploadHost),
 | 
						|
		os.Getenv(consts.VeImageXTemplate),
 | 
						|
		[]string{os.Getenv(consts.VeImageXServerID)},
 | 
						|
	)
 | 
						|
}
 | 
						|
 | 
						|
func initTOS(ctx context.Context) (storage.Storage, error) {
 | 
						|
	return storage.New(ctx)
 | 
						|
}
 | 
						|
 | 
						|
func initResourceEventBusProducer() (eventbus.Producer, error) {
 | 
						|
	nameServer := os.Getenv(consts.MQServer)
 | 
						|
	resourceEventBusProducer, err := eventbus.NewProducer(nameServer,
 | 
						|
		consts.RMQTopicResource, consts.RMQConsumeGroupResource, 1)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("init resource producer failed, err=%w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	return resourceEventBusProducer, nil
 | 
						|
}
 | 
						|
 | 
						|
func initAppEventProducer() (eventbus.Producer, error) {
 | 
						|
	nameServer := os.Getenv(consts.MQServer)
 | 
						|
	appEventProducer, err := eventbus.NewProducer(nameServer, consts.RMQTopicApp, consts.RMQConsumeGroupApp, 1)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("init app producer failed, err=%w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	return appEventProducer, nil
 | 
						|
}
 | 
						|
 | 
						|
func initCodeRunner() coderunner.Runner {
 | 
						|
	switch typ := os.Getenv(consts.CodeRunnerType); typ {
 | 
						|
	case "sandbox":
 | 
						|
		getAndSplit := func(key string) []string {
 | 
						|
			v := os.Getenv(key)
 | 
						|
			if v == "" {
 | 
						|
				return nil
 | 
						|
			}
 | 
						|
			return strings.Split(v, ",")
 | 
						|
		}
 | 
						|
		config := &sandbox.Config{
 | 
						|
			AllowEnv:       getAndSplit(consts.CodeRunnerAllowEnv),
 | 
						|
			AllowRead:      getAndSplit(consts.CodeRunnerAllowRead),
 | 
						|
			AllowWrite:     getAndSplit(consts.CodeRunnerAllowWrite),
 | 
						|
			AllowNet:       getAndSplit(consts.CodeRunnerAllowNet),
 | 
						|
			AllowRun:       getAndSplit(consts.CodeRunnerAllowRun),
 | 
						|
			AllowFFI:       getAndSplit(consts.CodeRunnerAllowFFI),
 | 
						|
			NodeModulesDir: os.Getenv(consts.CodeRunnerNodeModulesDir),
 | 
						|
			TimeoutSeconds: 0,
 | 
						|
			MemoryLimitMB:  0,
 | 
						|
		}
 | 
						|
		if f, err := strconv.ParseFloat(os.Getenv(consts.CodeRunnerTimeoutSeconds), 64); err == nil {
 | 
						|
			config.TimeoutSeconds = f
 | 
						|
		} else {
 | 
						|
			config.TimeoutSeconds = 60.0
 | 
						|
		}
 | 
						|
		if mem, err := strconv.ParseInt(os.Getenv(consts.CodeRunnerMemoryLimitMB), 10, 64); err == nil {
 | 
						|
			config.MemoryLimitMB = mem
 | 
						|
		} else {
 | 
						|
			config.MemoryLimitMB = 100
 | 
						|
		}
 | 
						|
		return sandbox.NewRunner(config)
 | 
						|
	default:
 | 
						|
		return direct.NewRunner()
 | 
						|
	}
 | 
						|
}
 |