package servicecontext import ( "context" "errors" {{if eq .Storage "local"}} "git.yuntuo.hk/k2safe/go-omni/storage/local" {{else}} "net" "net/http" "time" {{if eq .Storage "oss"}} ossStore "git.yuntuo.hk/k2safe/go-omni/storage/oss" ossSDK "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" {{else}} "git.yuntuo.hk/k2safe/go-omni/storage/s3" "github.com/minio/minio-go/v7/pkg/credentials" {{end}}{{end}} "git.yuntuo.hk/k2safe/go-omni/storage" "{{.Module}}/internal/settings" ) // InitStorage is called once, before serving requests. The composition root // owns provider clients; business services receive only capability interfaces. func (c *Context) InitStorage(ctx context.Context,cfg settings.StorageConfig)error { if c==nil || ctx==nil{return errors.New("storage initialization requires context")} c.closeMu.Lock();defer c.closeMu.Unlock() if c.closed{return errors.New("service dependencies are closed")} if err:=ctx.Err();err!=nil{return err} if c.Files!=nil{return errors.New("storage already initialized")} if err:=cfg.Validate();err!=nil{return err} {{if eq .Storage "local"}} files,err:=local.New(cfg.Root,cfg.MaxBytes) if err!=nil{return err} signer,err:=storage.NewUploadSigner(files,cfg.PublicURL,[]byte(cfg.SigningKey),cfg.Policy()) if err!=nil{return err} uploader,err:=storage.NewUploader(files,cfg.Policy()) if err!=nil{return err} c.Files,c.Uploads,c.Downloads,c.UploadLinks,c.FileHTTP=files,uploader,signer,signer,signer {{else}} // Dedicated bounded pool, never the process-wide default transport. transport:=&http.Transport{ Proxy:http.ProxyFromEnvironment, DialContext:(&net.Dialer{Timeout:5*time.Second,KeepAlive:30*time.Second}).DialContext, ForceAttemptHTTP2:true, MaxIdleConns:32,MaxIdleConnsPerHost:8,MaxConnsPerHost:32, IdleConnTimeout:90*time.Second,TLSHandshakeTimeout:5*time.Second, ResponseHeaderTimeout:cfg.RequestTimeout, } initialized:=false defer func(){if !initialized{transport.CloseIdleConnections()}}() {{if eq .Storage "oss"}} sdkConfig:=ossSDK.LoadDefaultConfig().WithRegion(cfg.Region). WithSignatureVersion(ossSDK.SignatureVersionV4). WithAdditionalHeaders([]string{"content-length"}). WithCredentialsProvider(credentials.NewStaticCredentialsProvider(cfg.AccessKey,cfg.SecretKey,cfg.SessionToken)). WithHttpClient(&http.Client{Transport:transport,Timeout:cfg.RequestTimeout}) if cfg.Endpoint!=""{sdkConfig.WithEndpoint(cfg.Endpoint)} files,err:=ossStore.New(ossSDK.NewClient(sdkConfig),cfg.Bucket,cfg.MaxBytes) {{else}} creds:=credentials.NewStaticV4(cfg.AccessKey,cfg.SecretKey,cfg.SessionToken) {{if eq .Storage "r2"}} options,err:=s3.R2Config(cfg.AccountID,cfg.Bucket,creds) if err!=nil{return err} options.MaxBytes,options.Transport=cfg.MaxBytes,transport {{else}} options:=s3.Config{Endpoint:cfg.Endpoint,Region:cfg.Region,Bucket:cfg.Bucket,Secure:cfg.Secure,MaxBytes:cfg.MaxBytes,Credentials:creds,Transport:transport} {{end}} files,err:=s3.Open(options) {{end}} if err!=nil{return err} uploader,err:=storage.NewUploader(files,cfg.Policy()) if err!=nil{return err} c.Files,c.Uploads,c.Downloads,c.UploadLinks=files,uploader,files,uploader c.storageClose=func()error{transport.CloseIdleConnections();return nil} initialized=true {{end}} return nil }