1
#pragma once
2

            
3
#include <memory>
4

            
5
#include "envoy/config/core/v3/base.pb.h"
6
#include "envoy/extensions/wasm/v3/wasm.pb.validate.h"
7
#include "envoy/local_info/local_info.h"
8

            
9
#include "source/common/protobuf/protobuf.h"
10
#include "source/common/protobuf/utility.h"
11

            
12
#include "include/proxy-wasm/wasm.h"
13

            
14
namespace Envoy {
15
namespace Extensions {
16
namespace Common {
17
namespace Wasm {
18

            
19
// clang-format off
20
using EnvironmentVariableMap = std::unordered_map<std::string, std::string>;
21
// clang-format on
22

            
23
class WasmConfig {
24
public:
25
  WasmConfig(const envoy::extensions::wasm::v3::PluginConfig& config);
26
3409
  const envoy::extensions::wasm::v3::PluginConfig& config() { return config_; }
27
663
  proxy_wasm::AllowedCapabilitiesMap& allowedCapabilities() { return allowed_capabilities_; }
28
402
  EnvironmentVariableMap& environmentVariables() { return envs_; }
29

            
30
private:
31
  const envoy::extensions::wasm::v3::PluginConfig config_;
32
  proxy_wasm::AllowedCapabilitiesMap allowed_capabilities_{};
33
  EnvironmentVariableMap envs_;
34
};
35

            
36
using WasmConfigPtr = std::unique_ptr<WasmConfig>;
37

            
38
// Plugin contains the information for a filter/service.
39
class Plugin : public proxy_wasm::PluginBase {
40
public:
41
  Plugin(const envoy::extensions::wasm::v3::PluginConfig& config,
42
         envoy::config::core::v3::TrafficDirection direction,
43
         const LocalInfo::LocalInfo& local_info,
44
         const envoy::config::core::v3::Metadata* listener_metadata)
45
437
      : PluginBase(
46
437
            config.name(), config.root_id(), config.vm_config().vm_id(),
47
437
            config.vm_config().runtime(),
48
437
            THROW_OR_RETURN_VALUE(MessageUtil::anyToBytes(config.configuration()), std::string),
49
437
            config.fail_open(), createPluginKey(config, direction, listener_metadata)),
50
437
        local_info_(local_info), wasm_config_(std::make_unique<WasmConfig>(config)) {}
51

            
52
828
  const LocalInfo::LocalInfo& localInfo() { return local_info_; }
53
2156
  WasmConfig& wasmConfig() { return *wasm_config_; }
54

            
55
private:
56
  static std::string createPluginKey(const envoy::extensions::wasm::v3::PluginConfig& config,
57
                                     envoy::config::core::v3::TrafficDirection direction,
58
437
                                     const envoy::config::core::v3::Metadata* listener_metadata) {
59
437
    return config.name() + "||" + envoy::config::core::v3::TrafficDirection_Name(direction) +
60
437
           (listener_metadata ? "||" + std::to_string(MessageUtil::hash(*listener_metadata)) : "");
61
437
  }
62

            
63
private:
64
  const LocalInfo::LocalInfo& local_info_;
65
  WasmConfigPtr wasm_config_;
66
};
67

            
68
using PluginSharedPtr = std::shared_ptr<Plugin>;
69

            
70
} // namespace Wasm
71
} // namespace Common
72
} // namespace Extensions
73
} // namespace Envoy