JSIndexedRAMBundle.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. #pragma once
  8. #include <istream>
  9. #include <memory>
  10. #include <cxxreact/JSBigString.h>
  11. #include <cxxreact/JSModulesUnbundle.h>
  12. #ifndef RN_EXPORT
  13. #define RN_EXPORT __attribute__((visibility("default")))
  14. #endif
  15. namespace facebook {
  16. namespace react {
  17. class RN_EXPORT JSIndexedRAMBundle : public JSModulesUnbundle {
  18. public:
  19. static std::function<std::unique_ptr<JSModulesUnbundle>(std::string)>
  20. buildFactory();
  21. // Throws std::runtime_error on failure.
  22. JSIndexedRAMBundle(const char *sourceURL);
  23. JSIndexedRAMBundle(std::unique_ptr<const JSBigString> script);
  24. // Throws std::runtime_error on failure.
  25. std::unique_ptr<const JSBigString> getStartupCode();
  26. // Throws std::runtime_error on failure.
  27. Module getModule(uint32_t moduleId) const override;
  28. private:
  29. struct ModuleData {
  30. uint32_t offset;
  31. uint32_t length;
  32. };
  33. static_assert(
  34. sizeof(ModuleData) == 8,
  35. "ModuleData must not have any padding and use sizes matching input files");
  36. struct ModuleTable {
  37. size_t numEntries;
  38. std::unique_ptr<ModuleData[]> data;
  39. ModuleTable() : numEntries(0){};
  40. ModuleTable(size_t entries)
  41. : numEntries(entries),
  42. data(std::unique_ptr<ModuleData[]>(new ModuleData[numEntries])){};
  43. size_t byteLength() const {
  44. return numEntries * sizeof(ModuleData);
  45. }
  46. };
  47. void init();
  48. std::string getModuleCode(const uint32_t id) const;
  49. void readBundle(char *buffer, const std::streamsize bytes) const;
  50. void readBundle(
  51. char *buffer,
  52. const std::streamsize bytes,
  53. const std::istream::pos_type position) const;
  54. mutable std::unique_ptr<std::istream> m_bundle;
  55. ModuleTable m_table;
  56. size_t m_baseOffset;
  57. std::unique_ptr<JSBigBufferString> m_startupCode;
  58. };
  59. } // namespace react
  60. } // namespace facebook