local.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package bundle_packager
  2. import (
  3. "bytes"
  4. "io"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/bundle_entities"
  9. "github.com/langgenius/dify-plugin-daemon/internal/utils/parser"
  10. )
  11. type LocalBundlePackager struct {
  12. GenericBundlePackager
  13. path string
  14. }
  15. func NewLocalBundlePackager(path string) (BundlePackager, error) {
  16. // try read manifest file
  17. manifestFile, err := os.Open(filepath.Join(path, "manifest.yaml"))
  18. if err != nil {
  19. return nil, err
  20. }
  21. defer manifestFile.Close()
  22. manifestBytes, err := io.ReadAll(manifestFile)
  23. if err != nil {
  24. return nil, err
  25. }
  26. bundle, err := parser.UnmarshalYamlBytes[bundle_entities.Bundle](manifestBytes)
  27. if err != nil {
  28. return nil, err
  29. }
  30. packager := &LocalBundlePackager{
  31. GenericBundlePackager: *NewGenericBundlePackager(&bundle),
  32. path: path,
  33. }
  34. // walk through the path and load the assets
  35. err = filepath.Walk(filepath.Join(path, "_assets"), func(filePath string, info os.FileInfo, err error) error {
  36. if err != nil {
  37. return err
  38. }
  39. if info.IsDir() {
  40. return nil
  41. }
  42. assetBytes, err := os.ReadFile(filePath)
  43. if err != nil {
  44. return err
  45. }
  46. prefix := filepath.Join(path, "_assets")
  47. assetName := strings.TrimPrefix(filePath, prefix)
  48. // trim slash
  49. assetName = strings.Trim(assetName, "/")
  50. packager.assets[assetName] = bytes.NewBuffer(assetBytes)
  51. return nil
  52. })
  53. if err != nil {
  54. return nil, err
  55. }
  56. return packager, nil
  57. }
  58. func (p *LocalBundlePackager) Save() error {
  59. // save the assets
  60. for name, asset := range p.assets {
  61. err := os.WriteFile(filepath.Join(p.path, "_assets", name), asset.Bytes(), 0644)
  62. if err != nil {
  63. return err
  64. }
  65. }
  66. // save the manifest file
  67. manifestBytes := parser.MarshalYamlBytes(p.bundle)
  68. err := os.WriteFile(filepath.Join(p.path, "manifest.yaml"), manifestBytes, 0644)
  69. if err != nil {
  70. return err
  71. }
  72. return nil
  73. }