packager.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package packager
  2. import (
  3. "archive/zip"
  4. "bytes"
  5. "errors"
  6. "path/filepath"
  7. "strconv"
  8. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/decoder"
  9. )
  10. type Packager struct {
  11. decoder decoder.PluginDecoder
  12. manifest string // manifest file path
  13. }
  14. func NewPackager(decoder decoder.PluginDecoder) *Packager {
  15. return &Packager{
  16. decoder: decoder,
  17. manifest: "manifest.yaml",
  18. }
  19. }
  20. func (p *Packager) Pack(maxSize int64) ([]byte, error) {
  21. err := p.Validate()
  22. if err != nil {
  23. return nil, err
  24. }
  25. zipBuffer := new(bytes.Buffer)
  26. zipWriter := zip.NewWriter(zipBuffer)
  27. totalSize := int64(0)
  28. err = p.decoder.Walk(func(filename, dir string) error {
  29. fullPath := filepath.Join(dir, filename)
  30. file, err := p.decoder.ReadFile(fullPath)
  31. if err != nil {
  32. return err
  33. }
  34. totalSize += int64(len(file))
  35. if totalSize > maxSize {
  36. return errors.New("plugin package size is too large, please ensure the uncompressed size is less than " + strconv.FormatInt(maxSize, 10) + " bytes")
  37. }
  38. zipFile, err := zipWriter.Create(fullPath)
  39. if err != nil {
  40. return err
  41. }
  42. _, err = zipFile.Write(file)
  43. if err != nil {
  44. return err
  45. }
  46. return nil
  47. })
  48. if err != nil {
  49. return nil, err
  50. }
  51. err = zipWriter.Close()
  52. if err != nil {
  53. return nil, err
  54. }
  55. return zipBuffer.Bytes(), nil
  56. }