InspectorInterfaces.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #include "InspectorInterfaces.h"
  8. #include <mutex>
  9. #include <tuple>
  10. #include <unordered_map>
  11. namespace facebook {
  12. namespace react {
  13. // pure destructors in C++ are odd. You would think they don't want an
  14. // implementation, but in fact the linker requires one. Define them to be
  15. // empty so that people don't count on them for any particular behaviour.
  16. IDestructible::~IDestructible() {}
  17. ILocalConnection::~ILocalConnection() {}
  18. IRemoteConnection::~IRemoteConnection() {}
  19. IInspector::~IInspector() {}
  20. namespace {
  21. class InspectorImpl : public IInspector {
  22. public:
  23. int addPage(
  24. const std::string &title,
  25. const std::string &vm,
  26. ConnectFunc connectFunc) override;
  27. void removePage(int pageId) override;
  28. std::vector<InspectorPage> getPages() const override;
  29. std::unique_ptr<ILocalConnection> connect(
  30. int pageId,
  31. std::unique_ptr<IRemoteConnection> remote) override;
  32. private:
  33. mutable std::mutex mutex_;
  34. int nextPageId_{1};
  35. std::unordered_map<int, std::tuple<std::string, std::string>> titles_;
  36. std::unordered_map<int, ConnectFunc> connectFuncs_;
  37. };
  38. int InspectorImpl::addPage(
  39. const std::string &title,
  40. const std::string &vm,
  41. ConnectFunc connectFunc) {
  42. std::lock_guard<std::mutex> lock(mutex_);
  43. int pageId = nextPageId_++;
  44. titles_[pageId] = std::make_tuple(title, vm);
  45. connectFuncs_[pageId] = std::move(connectFunc);
  46. return pageId;
  47. }
  48. void InspectorImpl::removePage(int pageId) {
  49. std::lock_guard<std::mutex> lock(mutex_);
  50. titles_.erase(pageId);
  51. connectFuncs_.erase(pageId);
  52. }
  53. std::vector<InspectorPage> InspectorImpl::getPages() const {
  54. std::lock_guard<std::mutex> lock(mutex_);
  55. std::vector<InspectorPage> inspectorPages;
  56. for (auto &it : titles_) {
  57. inspectorPages.push_back(InspectorPage{
  58. it.first, std::get<0>(it.second), std::get<1>(it.second)});
  59. }
  60. return inspectorPages;
  61. }
  62. std::unique_ptr<ILocalConnection> InspectorImpl::connect(
  63. int pageId,
  64. std::unique_ptr<IRemoteConnection> remote) {
  65. IInspector::ConnectFunc connectFunc;
  66. {
  67. std::lock_guard<std::mutex> lock(mutex_);
  68. auto it = connectFuncs_.find(pageId);
  69. if (it != connectFuncs_.end()) {
  70. connectFunc = it->second;
  71. }
  72. }
  73. return connectFunc ? connectFunc(std::move(remote)) : nullptr;
  74. }
  75. } // namespace
  76. IInspector &getInspectorInstance() {
  77. static InspectorImpl instance;
  78. return instance;
  79. }
  80. std::unique_ptr<IInspector> makeTestInspectorInstance() {
  81. return std::make_unique<InspectorImpl>();
  82. }
  83. } // namespace react
  84. } // namespace facebook