upload.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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](2)
  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. return response, nil
  46. }
  47. // create lambda function
  48. packager := NewPackager(decoder)
  49. context, err := packager.Pack()
  50. if err != nil {
  51. return nil, err
  52. }
  53. defer os.Remove(context.Name())
  54. defer context.Close()
  55. response, err := LaunchLambda(identity, checksum, context)
  56. if err != nil {
  57. return nil, err
  58. }
  59. return response, nil
  60. }