memory_zip.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package bundle_packager
  2. import (
  3. "archive/zip"
  4. "bytes"
  5. "io"
  6. "strings"
  7. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/bundle_entities"
  8. "github.com/langgenius/dify-plugin-daemon/internal/utils/parser"
  9. )
  10. type MemoryZipBundlePackager struct {
  11. GenericBundlePackager
  12. zipReader *zip.Reader
  13. }
  14. func NewMemoryZipBundlePackager(zipFile []byte) (*MemoryZipBundlePackager, error) {
  15. // try read manifest file
  16. zipReader, err := zip.NewReader(bytes.NewReader(zipFile), int64(len(zipFile)))
  17. if err != nil {
  18. return nil, err
  19. }
  20. manifestFile, err := zipReader.Open("manifest.yaml")
  21. if err != nil {
  22. return nil, err
  23. }
  24. defer manifestFile.Close()
  25. manifestBytes, err := io.ReadAll(manifestFile)
  26. if err != nil {
  27. return nil, err
  28. }
  29. bundle, err := parser.UnmarshalYamlBytes[bundle_entities.Bundle](manifestBytes)
  30. if err != nil {
  31. return nil, err
  32. }
  33. // collect files starts with README
  34. extraFiles := make(map[string]*bytes.Buffer)
  35. for _, file := range zipReader.File {
  36. if strings.HasPrefix(file.Name, "README") {
  37. buffer := bytes.NewBuffer([]byte{})
  38. readFile, err := file.Open()
  39. if err != nil {
  40. return nil, err
  41. }
  42. defer readFile.Close()
  43. io.Copy(buffer, readFile)
  44. extraFiles[file.Name] = buffer
  45. }
  46. }
  47. packager := &MemoryZipBundlePackager{
  48. GenericBundlePackager: *NewGenericBundlePackager(&bundle, extraFiles),
  49. zipReader: zipReader,
  50. }
  51. // walk through the zip file and load the assets
  52. for _, file := range zipReader.File {
  53. // if file starts with "_assets/"
  54. if strings.HasPrefix(file.Name, "_assets/") {
  55. // load the asset
  56. asset, err := file.Open()
  57. if err != nil {
  58. return nil, err
  59. }
  60. defer asset.Close()
  61. assetBytes, err := io.ReadAll(asset)
  62. if err != nil {
  63. return nil, err
  64. }
  65. // trim the prefix "_assets/"
  66. assetName := strings.TrimPrefix(file.Name, "_assets/")
  67. packager.assets[assetName] = bytes.NewBuffer(assetBytes)
  68. }
  69. }
  70. return packager, nil
  71. }
  72. func (p *MemoryZipBundlePackager) Save() error {
  73. return nil
  74. }
  75. func (p *MemoryZipBundlePackager) ReadFile(path string) ([]byte, error) {
  76. // read the file from the zip reader
  77. file, err := p.zipReader.Open(path)
  78. if err != nil {
  79. return nil, err
  80. }
  81. defer file.Close()
  82. return io.ReadAll(file)
  83. }