#ifndef JS_HPP #define JS_HPP #include #include #include #include using JSON = nlohmann::json; namespace JS { using Value = emscripten::val; // Global JS scope const static Value gGlobal = Value::global(); // Global JS Object const static Value gObject = Value::global("Object"); Value getGlobal(char const* name); Value getGlobal(std::string const& name); Value getConstant(const std::string& name); bool isInstanceOf(const Value& val, const char* name); std::vector jsArrayToVector(const Value& array); std::map jsObjectToMap(const Value& object); template Value vectorToJSArray(const std::vector& vector) { Value array = Value::array(); for (std::size_t i = 0; i < vector.size(); i++) array.set(i, static_cast(vector[i])); return array; } template Value mapToJSObject(const std::map& map) { Value object = Value::object(); for (const auto& pair : map) object.set(pair.first, pair.second); return object; } Value fromJSON(const JSON& json); JSON toJSON(const Value& value); class Console { public: Console(); template void log(Args&&... args) { object_.call("log", std::forward(args)...); } private: Value object_; }; extern Console console; } // namespace JS #endif // JS_HPP