upload.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package serverless
  2. import (
  3. "os"
  4. "time"
  5. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/checksum"
  6. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/decoder"
  7. "github.com/langgenius/dify-plugin-daemon/internal/utils/cache"
  8. "github.com/langgenius/dify-plugin-daemon/internal/utils/stream"
  9. )
  10. var (
  11. AWS_LAUNCH_LOCK_PREFIX = "aws_launch_lock_"
  12. )
  13. // UploadPlugin uploads the plugin to the AWS Lambda
  14. // return the lambda url and name
  15. func UploadPlugin(decoder decoder.PluginDecoder) (*stream.Stream[LaunchAWSLambdaFunctionResponse], error) {
  16. checksum, err := checksum.CalculateChecksum(decoder)
  17. if err != nil {
  18. return nil, err
  19. }
  20. // check if the plugin has already been initialized, at most 300s
  21. if err := cache.Lock(AWS_LAUNCH_LOCK_PREFIX+checksum, 300*time.Second, 300*time.Second); err != nil {
  22. return nil, err
  23. }
  24. defer cache.Unlock(AWS_LAUNCH_LOCK_PREFIX + checksum)
  25. manifest, err := decoder.Manifest()
  26. if err != nil {
  27. return nil, err
  28. }
  29. identity := manifest.Identity()
  30. function, err := FetchLambda(identity, checksum)
  31. if err != nil {
  32. if err != ErrNoLambdaFunction {
  33. return nil, err
  34. }
  35. } else {
  36. // found, return directly
  37. response := stream.NewStreamResponse[LaunchAWSLambdaFunctionResponse](2)
  38. response.Write(LaunchAWSLambdaFunctionResponse{
  39. Event: LambdaUrl,
  40. Message: function.FunctionURL,
  41. })
  42. response.Write(LaunchAWSLambdaFunctionResponse{
  43. Event: Lambda,
  44. Message: function.FunctionName,
  45. })
  46. return response, nil
  47. }
  48. // create lambda function
  49. packager := NewPackager(decoder)
  50. context, err := packager.Pack()
  51. if err != nil {
  52. return nil, err
  53. }
  54. defer os.Remove(context.Name())
  55. defer context.Close()
  56. response, err := LaunchLambda(identity, checksum, context)
  57. if err != nil {
  58. return nil, err
  59. }
  60. return response, nil
  61. }