/**
 * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
 *
 * Do not edit this file as changes may cause incorrect behavior and will be lost
 * once the code is regenerated.
 *
 * @generated by codegen project: GenerateModuleH.js
 */

#pragma once

#include <ReactCommon/TurboModule.h>
#include <react/bridging/Bridging.h>

namespace facebook::react {


  
#pragma mark - NativeRnWifiP2PConfig

template <typename P0, typename P1, typename P2>
struct NativeRnWifiP2PConfig {
  P0 notificationTitle;
  P1 sendingMessageText;
  P2 channelName;
  bool operator==(const NativeRnWifiP2PConfig &other) const {
    return notificationTitle == other.notificationTitle && sendingMessageText == other.sendingMessageText && channelName == other.channelName;
  }
};

template <typename T>
struct NativeRnWifiP2PConfigBridging {
  static T types;

  static T fromJs(
      jsi::Runtime &rt,
      const jsi::Object &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    T result{
      bridging::fromJs<decltype(types.notificationTitle)>(rt, value.getProperty(rt, "notificationTitle"), jsInvoker),
      bridging::fromJs<decltype(types.sendingMessageText)>(rt, value.getProperty(rt, "sendingMessageText"), jsInvoker),
      bridging::fromJs<decltype(types.channelName)>(rt, value.getProperty(rt, "channelName"), jsInvoker)};
    return result;
  }

#ifdef DEBUG
  static jsi::String notificationTitleToJs(jsi::Runtime &rt, decltype(types.notificationTitle) value) {
    return bridging::toJs(rt, value);
  }

  static jsi::String sendingMessageTextToJs(jsi::Runtime &rt, decltype(types.sendingMessageText) value) {
    return bridging::toJs(rt, value);
  }

  static jsi::String channelNameToJs(jsi::Runtime &rt, decltype(types.channelName) value) {
    return bridging::toJs(rt, value);
  }
#endif

  static jsi::Object toJs(
      jsi::Runtime &rt,
      const T &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    auto result = facebook::jsi::Object(rt);
    result.setProperty(rt, "notificationTitle", bridging::toJs(rt, value.notificationTitle, jsInvoker));
    result.setProperty(rt, "sendingMessageText", bridging::toJs(rt, value.sendingMessageText, jsInvoker));
    result.setProperty(rt, "channelName", bridging::toJs(rt, value.channelName, jsInvoker));
    return result;
  }
};



#pragma mark - NativeRnWifiP2PConnectionArgs

template <typename P0, typename P1>
struct NativeRnWifiP2PConnectionArgs {
  P0 deviceAddress;
  P1 groupOwnerIntent;
  bool operator==(const NativeRnWifiP2PConnectionArgs &other) const {
    return deviceAddress == other.deviceAddress && groupOwnerIntent == other.groupOwnerIntent;
  }
};

template <typename T>
struct NativeRnWifiP2PConnectionArgsBridging {
  static T types;

  static T fromJs(
      jsi::Runtime &rt,
      const jsi::Object &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    T result{
      bridging::fromJs<decltype(types.deviceAddress)>(rt, value.getProperty(rt, "deviceAddress"), jsInvoker),
      bridging::fromJs<decltype(types.groupOwnerIntent)>(rt, value.getProperty(rt, "groupOwnerIntent"), jsInvoker)};
    return result;
  }

#ifdef DEBUG
  static jsi::String deviceAddressToJs(jsi::Runtime &rt, decltype(types.deviceAddress) value) {
    return bridging::toJs(rt, value);
  }

  static double groupOwnerIntentToJs(jsi::Runtime &rt, decltype(types.groupOwnerIntent) value) {
    return bridging::toJs(rt, value);
  }
#endif

  static jsi::Object toJs(
      jsi::Runtime &rt,
      const T &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    auto result = facebook::jsi::Object(rt);
    result.setProperty(rt, "deviceAddress", bridging::toJs(rt, value.deviceAddress, jsInvoker));
    if (value.groupOwnerIntent) {
      result.setProperty(rt, "groupOwnerIntent", bridging::toJs(rt, value.groupOwnerIntent.value(), jsInvoker));
    }
    return result;
  }
};



#pragma mark - NativeRnWifiP2PDevice

template <typename P0, typename P1, typename P2, typename P3, typename P4, typename P5>
struct NativeRnWifiP2PDevice {
  P0 deviceAddress;
  P1 deviceName;
  P2 isGroupOwner;
  P3 primaryDeviceType;
  P4 secondaryDeviceType;
  P5 status;
  bool operator==(const NativeRnWifiP2PDevice &other) const {
    return deviceAddress == other.deviceAddress && deviceName == other.deviceName && isGroupOwner == other.isGroupOwner && primaryDeviceType == other.primaryDeviceType && secondaryDeviceType == other.secondaryDeviceType && status == other.status;
  }
};

template <typename T>
struct NativeRnWifiP2PDeviceBridging {
  static T types;

  static T fromJs(
      jsi::Runtime &rt,
      const jsi::Object &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    T result{
      bridging::fromJs<decltype(types.deviceAddress)>(rt, value.getProperty(rt, "deviceAddress"), jsInvoker),
      bridging::fromJs<decltype(types.deviceName)>(rt, value.getProperty(rt, "deviceName"), jsInvoker),
      bridging::fromJs<decltype(types.isGroupOwner)>(rt, value.getProperty(rt, "isGroupOwner"), jsInvoker),
      bridging::fromJs<decltype(types.primaryDeviceType)>(rt, value.getProperty(rt, "primaryDeviceType"), jsInvoker),
      bridging::fromJs<decltype(types.secondaryDeviceType)>(rt, value.getProperty(rt, "secondaryDeviceType"), jsInvoker),
      bridging::fromJs<decltype(types.status)>(rt, value.getProperty(rt, "status"), jsInvoker)};
    return result;
  }

#ifdef DEBUG
  static jsi::String deviceAddressToJs(jsi::Runtime &rt, decltype(types.deviceAddress) value) {
    return bridging::toJs(rt, value);
  }

  static jsi::String deviceNameToJs(jsi::Runtime &rt, decltype(types.deviceName) value) {
    return bridging::toJs(rt, value);
  }

  static bool isGroupOwnerToJs(jsi::Runtime &rt, decltype(types.isGroupOwner) value) {
    return bridging::toJs(rt, value);
  }

  static std::optional<jsi::String> primaryDeviceTypeToJs(jsi::Runtime &rt, decltype(types.primaryDeviceType) value) {
    return bridging::toJs(rt, value);
  }

  static std::optional<jsi::String> secondaryDeviceTypeToJs(jsi::Runtime &rt, decltype(types.secondaryDeviceType) value) {
    return bridging::toJs(rt, value);
  }

  static double statusToJs(jsi::Runtime &rt, decltype(types.status) value) {
    return bridging::toJs(rt, value);
  }
#endif

  static jsi::Object toJs(
      jsi::Runtime &rt,
      const T &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    auto result = facebook::jsi::Object(rt);
    result.setProperty(rt, "deviceAddress", bridging::toJs(rt, value.deviceAddress, jsInvoker));
    result.setProperty(rt, "deviceName", bridging::toJs(rt, value.deviceName, jsInvoker));
    result.setProperty(rt, "isGroupOwner", bridging::toJs(rt, value.isGroupOwner, jsInvoker));
    result.setProperty(rt, "primaryDeviceType", bridging::toJs(rt, value.primaryDeviceType, jsInvoker));
    result.setProperty(rt, "secondaryDeviceType", bridging::toJs(rt, value.secondaryDeviceType, jsInvoker));
    result.setProperty(rt, "status", bridging::toJs(rt, value.status, jsInvoker));
    return result;
  }
};



#pragma mark - NativeRnWifiP2PFileTransferResult

template <typename P0, typename P1>
struct NativeRnWifiP2PFileTransferResult {
  P0 file;
  P1 time;
  bool operator==(const NativeRnWifiP2PFileTransferResult &other) const {
    return file == other.file && time == other.time;
  }
};

template <typename T>
struct NativeRnWifiP2PFileTransferResultBridging {
  static T types;

  static T fromJs(
      jsi::Runtime &rt,
      const jsi::Object &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    T result{
      bridging::fromJs<decltype(types.file)>(rt, value.getProperty(rt, "file"), jsInvoker),
      bridging::fromJs<decltype(types.time)>(rt, value.getProperty(rt, "time"), jsInvoker)};
    return result;
  }

#ifdef DEBUG
  static jsi::String fileToJs(jsi::Runtime &rt, decltype(types.file) value) {
    return bridging::toJs(rt, value);
  }

  static double timeToJs(jsi::Runtime &rt, decltype(types.time) value) {
    return bridging::toJs(rt, value);
  }
#endif

  static jsi::Object toJs(
      jsi::Runtime &rt,
      const T &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    auto result = facebook::jsi::Object(rt);
    result.setProperty(rt, "file", bridging::toJs(rt, value.file, jsInvoker));
    result.setProperty(rt, "time", bridging::toJs(rt, value.time, jsInvoker));
    return result;
  }
};



#pragma mark - NativeRnWifiP2PGroupInfo

template <typename P0, typename P1, typename P2, typename P3, typename P4>
struct NativeRnWifiP2PGroupInfo {
  P0 interface;
  P1 networkName;
  P2 passphrase;
  P3 clientList;
  P4 owner;
  bool operator==(const NativeRnWifiP2PGroupInfo &other) const {
    return interface == other.interface && networkName == other.networkName && passphrase == other.passphrase && clientList == other.clientList && owner == other.owner;
  }
};

template <typename T>
struct NativeRnWifiP2PGroupInfoBridging {
  static T types;

  static T fromJs(
      jsi::Runtime &rt,
      const jsi::Object &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    T result{
      bridging::fromJs<decltype(types.interface)>(rt, value.getProperty(rt, "interface"), jsInvoker),
      bridging::fromJs<decltype(types.networkName)>(rt, value.getProperty(rt, "networkName"), jsInvoker),
      bridging::fromJs<decltype(types.passphrase)>(rt, value.getProperty(rt, "passphrase"), jsInvoker),
      bridging::fromJs<decltype(types.clientList)>(rt, value.getProperty(rt, "clientList"), jsInvoker),
      bridging::fromJs<decltype(types.owner)>(rt, value.getProperty(rt, "owner"), jsInvoker)};
    return result;
  }

#ifdef DEBUG
  static jsi::String interfaceToJs(jsi::Runtime &rt, decltype(types.interface) value) {
    return bridging::toJs(rt, value);
  }

  static jsi::String networkNameToJs(jsi::Runtime &rt, decltype(types.networkName) value) {
    return bridging::toJs(rt, value);
  }

  static jsi::String passphraseToJs(jsi::Runtime &rt, decltype(types.passphrase) value) {
    return bridging::toJs(rt, value);
  }

  static jsi::Array clientListToJs(jsi::Runtime &rt, decltype(types.clientList) value) {
    return bridging::toJs(rt, value);
  }

  static std::optional<jsi::Object> ownerToJs(jsi::Runtime &rt, decltype(types.owner) value) {
    return bridging::toJs(rt, value);
  }
#endif

  static jsi::Object toJs(
      jsi::Runtime &rt,
      const T &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    auto result = facebook::jsi::Object(rt);
    result.setProperty(rt, "interface", bridging::toJs(rt, value.interface, jsInvoker));
    result.setProperty(rt, "networkName", bridging::toJs(rt, value.networkName, jsInvoker));
    result.setProperty(rt, "passphrase", bridging::toJs(rt, value.passphrase, jsInvoker));
    result.setProperty(rt, "clientList", bridging::toJs(rt, value.clientList, jsInvoker));
    result.setProperty(rt, "owner", bridging::toJs(rt, value.owner, jsInvoker));
    return result;
  }
};



#pragma mark - NativeRnWifiP2PMessageTransferResult

template <typename P0, typename P1>
struct NativeRnWifiP2PMessageTransferResult {
  P0 message;
  P1 time;
  bool operator==(const NativeRnWifiP2PMessageTransferResult &other) const {
    return message == other.message && time == other.time;
  }
};

template <typename T>
struct NativeRnWifiP2PMessageTransferResultBridging {
  static T types;

  static T fromJs(
      jsi::Runtime &rt,
      const jsi::Object &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    T result{
      bridging::fromJs<decltype(types.message)>(rt, value.getProperty(rt, "message"), jsInvoker),
      bridging::fromJs<decltype(types.time)>(rt, value.getProperty(rt, "time"), jsInvoker)};
    return result;
  }

#ifdef DEBUG
  static jsi::String messageToJs(jsi::Runtime &rt, decltype(types.message) value) {
    return bridging::toJs(rt, value);
  }

  static double timeToJs(jsi::Runtime &rt, decltype(types.time) value) {
    return bridging::toJs(rt, value);
  }
#endif

  static jsi::Object toJs(
      jsi::Runtime &rt,
      const T &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    auto result = facebook::jsi::Object(rt);
    result.setProperty(rt, "message", bridging::toJs(rt, value.message, jsInvoker));
    result.setProperty(rt, "time", bridging::toJs(rt, value.time, jsInvoker));
    return result;
  }
};



#pragma mark - NativeRnWifiP2PWifiP2pInfo

template <typename P0, typename P1, typename P2>
struct NativeRnWifiP2PWifiP2pInfo {
  P0 groupOwnerAddress;
  P1 groupFormed;
  P2 isGroupOwner;
  bool operator==(const NativeRnWifiP2PWifiP2pInfo &other) const {
    return groupOwnerAddress == other.groupOwnerAddress && groupFormed == other.groupFormed && isGroupOwner == other.isGroupOwner;
  }
};

template <typename T>
struct NativeRnWifiP2PWifiP2pInfoBridging {
  static T types;

  static T fromJs(
      jsi::Runtime &rt,
      const jsi::Object &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    T result{
      bridging::fromJs<decltype(types.groupOwnerAddress)>(rt, value.getProperty(rt, "groupOwnerAddress"), jsInvoker),
      bridging::fromJs<decltype(types.groupFormed)>(rt, value.getProperty(rt, "groupFormed"), jsInvoker),
      bridging::fromJs<decltype(types.isGroupOwner)>(rt, value.getProperty(rt, "isGroupOwner"), jsInvoker)};
    return result;
  }

#ifdef DEBUG
  static std::optional<jsi::Object> groupOwnerAddressToJs(jsi::Runtime &rt, decltype(types.groupOwnerAddress) value) {
    return bridging::toJs(rt, value);
  }

  static bool groupFormedToJs(jsi::Runtime &rt, decltype(types.groupFormed) value) {
    return bridging::toJs(rt, value);
  }

  static bool isGroupOwnerToJs(jsi::Runtime &rt, decltype(types.isGroupOwner) value) {
    return bridging::toJs(rt, value);
  }
#endif

  static jsi::Object toJs(
      jsi::Runtime &rt,
      const T &value,
      const std::shared_ptr<CallInvoker> &jsInvoker) {
    auto result = facebook::jsi::Object(rt);
    result.setProperty(rt, "groupOwnerAddress", bridging::toJs(rt, value.groupOwnerAddress, jsInvoker));
    result.setProperty(rt, "groupFormed", bridging::toJs(rt, value.groupFormed, jsInvoker));
    result.setProperty(rt, "isGroupOwner", bridging::toJs(rt, value.isGroupOwner, jsInvoker));
    return result;
  }
};

class JSI_EXPORT NativeRnWifiP2PCxxSpecJSI : public TurboModule {
protected:
  NativeRnWifiP2PCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker);

public:
  virtual jsi::Value init(jsi::Runtime &rt) = 0;
  virtual jsi::Value stop(jsi::Runtime &rt) = 0;
  virtual void setConfig(jsi::Runtime &rt, jsi::Object config) = 0;
  virtual jsi::Value getConfig(jsi::Runtime &rt) = 0;
  virtual jsi::Value discoverPeers(jsi::Runtime &rt) = 0;
  virtual jsi::Value stopPeerDiscovery(jsi::Runtime &rt) = 0;
  virtual jsi::Value getAvailablePeersList(jsi::Runtime &rt) = 0;
  virtual jsi::Value connectWithConfig(jsi::Runtime &rt, jsi::Object config) = 0;
  virtual jsi::Value cancelConnect(jsi::Runtime &rt) = 0;
  virtual jsi::Value createGroup(jsi::Runtime &rt) = 0;
  virtual jsi::Value removeGroup(jsi::Runtime &rt) = 0;
  virtual jsi::Value getConnectionInfo(jsi::Runtime &rt) = 0;
  virtual jsi::Value getGroupInfo(jsi::Runtime &rt) = 0;
  virtual jsi::Value sendFile(jsi::Runtime &rt, jsi::String path) = 0;
  virtual jsi::Value sendFileTo(jsi::Runtime &rt, jsi::String path, jsi::String address) = 0;
  virtual jsi::Value receiveFile(jsi::Runtime &rt, jsi::String folder, jsi::String fileName, bool forceToScanGallery) = 0;
  virtual jsi::Value sendMessage(jsi::Runtime &rt, jsi::String message) = 0;
  virtual jsi::Value sendMessageTo(jsi::Runtime &rt, jsi::String message, jsi::String address) = 0;
  virtual jsi::Value startReceivingMessage(jsi::Runtime &rt, std::optional<jsi::Object> props) = 0;
  virtual void stopReceivingMessage(jsi::Runtime &rt) = 0;

};

template <typename T>
class JSI_EXPORT NativeRnWifiP2PCxxSpec : public TurboModule {
public:
  jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
    return delegate_.create(rt, propName);
  }

  std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime& runtime) override {
    return delegate_.getPropertyNames(runtime);
  }

  static constexpr std::string_view kModuleName = "RnWifiP2P";

protected:
  NativeRnWifiP2PCxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
    : TurboModule(std::string{NativeRnWifiP2PCxxSpec::kModuleName}, jsInvoker),
      delegate_(reinterpret_cast<T*>(this), jsInvoker) {}


private:
  class Delegate : public NativeRnWifiP2PCxxSpecJSI {
  public:
    Delegate(T *instance, std::shared_ptr<CallInvoker> jsInvoker) :
      NativeRnWifiP2PCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {

    }

    jsi::Value init(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::init) == 1,
          "Expected init(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::init, jsInvoker_, instance_);
    }
    jsi::Value stop(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::stop) == 1,
          "Expected stop(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::stop, jsInvoker_, instance_);
    }
    void setConfig(jsi::Runtime &rt, jsi::Object config) override {
      static_assert(
          bridging::getParameterCount(&T::setConfig) == 2,
          "Expected setConfig(...) to have 2 parameters");

      return bridging::callFromJs<void>(
          rt, &T::setConfig, jsInvoker_, instance_, std::move(config));
    }
    jsi::Value getConfig(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::getConfig) == 1,
          "Expected getConfig(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::getConfig, jsInvoker_, instance_);
    }
    jsi::Value discoverPeers(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::discoverPeers) == 1,
          "Expected discoverPeers(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::discoverPeers, jsInvoker_, instance_);
    }
    jsi::Value stopPeerDiscovery(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::stopPeerDiscovery) == 1,
          "Expected stopPeerDiscovery(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::stopPeerDiscovery, jsInvoker_, instance_);
    }
    jsi::Value getAvailablePeersList(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::getAvailablePeersList) == 1,
          "Expected getAvailablePeersList(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::getAvailablePeersList, jsInvoker_, instance_);
    }
    jsi::Value connectWithConfig(jsi::Runtime &rt, jsi::Object config) override {
      static_assert(
          bridging::getParameterCount(&T::connectWithConfig) == 2,
          "Expected connectWithConfig(...) to have 2 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::connectWithConfig, jsInvoker_, instance_, std::move(config));
    }
    jsi::Value cancelConnect(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::cancelConnect) == 1,
          "Expected cancelConnect(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::cancelConnect, jsInvoker_, instance_);
    }
    jsi::Value createGroup(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::createGroup) == 1,
          "Expected createGroup(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::createGroup, jsInvoker_, instance_);
    }
    jsi::Value removeGroup(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::removeGroup) == 1,
          "Expected removeGroup(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::removeGroup, jsInvoker_, instance_);
    }
    jsi::Value getConnectionInfo(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::getConnectionInfo) == 1,
          "Expected getConnectionInfo(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::getConnectionInfo, jsInvoker_, instance_);
    }
    jsi::Value getGroupInfo(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::getGroupInfo) == 1,
          "Expected getGroupInfo(...) to have 1 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::getGroupInfo, jsInvoker_, instance_);
    }
    jsi::Value sendFile(jsi::Runtime &rt, jsi::String path) override {
      static_assert(
          bridging::getParameterCount(&T::sendFile) == 2,
          "Expected sendFile(...) to have 2 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::sendFile, jsInvoker_, instance_, std::move(path));
    }
    jsi::Value sendFileTo(jsi::Runtime &rt, jsi::String path, jsi::String address) override {
      static_assert(
          bridging::getParameterCount(&T::sendFileTo) == 3,
          "Expected sendFileTo(...) to have 3 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::sendFileTo, jsInvoker_, instance_, std::move(path), std::move(address));
    }
    jsi::Value receiveFile(jsi::Runtime &rt, jsi::String folder, jsi::String fileName, bool forceToScanGallery) override {
      static_assert(
          bridging::getParameterCount(&T::receiveFile) == 4,
          "Expected receiveFile(...) to have 4 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::receiveFile, jsInvoker_, instance_, std::move(folder), std::move(fileName), std::move(forceToScanGallery));
    }
    jsi::Value sendMessage(jsi::Runtime &rt, jsi::String message) override {
      static_assert(
          bridging::getParameterCount(&T::sendMessage) == 2,
          "Expected sendMessage(...) to have 2 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::sendMessage, jsInvoker_, instance_, std::move(message));
    }
    jsi::Value sendMessageTo(jsi::Runtime &rt, jsi::String message, jsi::String address) override {
      static_assert(
          bridging::getParameterCount(&T::sendMessageTo) == 3,
          "Expected sendMessageTo(...) to have 3 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::sendMessageTo, jsInvoker_, instance_, std::move(message), std::move(address));
    }
    jsi::Value startReceivingMessage(jsi::Runtime &rt, std::optional<jsi::Object> props) override {
      static_assert(
          bridging::getParameterCount(&T::startReceivingMessage) == 2,
          "Expected startReceivingMessage(...) to have 2 parameters");

      return bridging::callFromJs<jsi::Value>(
          rt, &T::startReceivingMessage, jsInvoker_, instance_, std::move(props));
    }
    void stopReceivingMessage(jsi::Runtime &rt) override {
      static_assert(
          bridging::getParameterCount(&T::stopReceivingMessage) == 1,
          "Expected stopReceivingMessage(...) to have 1 parameters");

      return bridging::callFromJs<void>(
          rt, &T::stopReceivingMessage, jsInvoker_, instance_);
    }

  private:
    friend class NativeRnWifiP2PCxxSpec;
    T *instance_;
  };

  Delegate delegate_;
};

} // namespace facebook::react
