80 lines
3.3 KiB
Cheetah
80 lines
3.3 KiB
Cheetah
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
|
|
}
|