upload.go 1.8 KB

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