123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- package bundle_packager
- import (
- "archive/zip"
- "bytes"
- "io"
- "path/filepath"
- "strings"
- "github.com/langgenius/dify-plugin-daemon/internal/utils/parser"
- "github.com/langgenius/dify-plugin-daemon/pkg/entities/bundle_entities"
- )
- type MemoryZipBundlePackager struct {
- GenericBundlePackager
- zipReader *zip.Reader
- }
- func NewMemoryZipBundlePackager(zipFile []byte) (*MemoryZipBundlePackager, error) {
- // try read manifest file
- zipReader, err := zip.NewReader(bytes.NewReader(zipFile), int64(len(zipFile)))
- if err != nil {
- return nil, err
- }
- manifestFile, err := zipReader.Open("manifest.yaml")
- if err != nil {
- return nil, err
- }
- defer manifestFile.Close()
- manifestBytes, err := io.ReadAll(manifestFile)
- if err != nil {
- return nil, err
- }
- bundle, err := parser.UnmarshalYamlBytes[bundle_entities.Bundle](manifestBytes)
- if err != nil {
- return nil, err
- }
- // collect files starts with README
- extraFiles := make(map[string]*bytes.Buffer)
- for _, file := range zipReader.File {
- if strings.HasPrefix(file.Name, "README") {
- buffer := bytes.NewBuffer([]byte{})
- readFile, err := file.Open()
- if err != nil {
- return nil, err
- }
- defer readFile.Close()
- io.Copy(buffer, readFile)
- extraFiles[file.Name] = buffer
- }
- }
- packager := &MemoryZipBundlePackager{
- GenericBundlePackager: *NewGenericBundlePackager(&bundle, extraFiles),
- zipReader: zipReader,
- }
- // walk through the zip file and load the assets
- for _, file := range zipReader.File {
- // if file starts with "_assets/"
- if strings.HasPrefix(file.Name, "_assets"+string(filepath.Separator)) {
- // load the asset
- asset, err := file.Open()
- if err != nil {
- return nil, err
- }
- defer asset.Close()
- assetBytes, err := io.ReadAll(asset)
- if err != nil {
- return nil, err
- }
- // trim the prefix "_assets/"
- assetName := strings.TrimPrefix(file.Name, "_assets"+string(filepath.Separator))
- packager.assets[assetName] = bytes.NewBuffer(assetBytes)
- }
- }
- return packager, nil
- }
- func (p *MemoryZipBundlePackager) Save() error {
- return nil
- }
- func (p *MemoryZipBundlePackager) ReadFile(path string) ([]byte, error) {
- // read the file from the zip reader
- file, err := p.zipReader.Open(path)
- if err != nil {
- return nil, err
- }
- defer file.Close()
- return io.ReadAll(file)
- }
|