From a03191b9e84f39c96160e6da64f83a2f700959b0 Mon Sep 17 00:00:00 2001 From: Saran Tunyasuvunakool Date: Fri, 15 May 2026 09:47:38 -0700 Subject: [PATCH] Add a `github:` resource provider scheme to MuJoCo Live. This resolves to https://raw.githubusercontent.com/... under the hood. PiperOrigin-RevId: 916050807 Change-Id: I1630e29a5b5aad0e39cdd8aa4cfc1ff1a71f19d9 --- src/experimental/studio/emscripten.cc | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/experimental/studio/emscripten.cc b/src/experimental/studio/emscripten.cc index 29da5294..f399ebfb 100644 --- a/src/experimental/studio/emscripten.cc +++ b/src/experimental/studio/emscripten.cc @@ -195,6 +195,35 @@ void Init() { http_provider.prefix = "https"; mjp_registerResourceProvider(&http_provider); + // Register a "github:" resource provider that resolves + // github:org/repo/branch/path/to/file.xml to + // https://raw.githubusercontent.com/org/repo/branch/path/to/file.xml + mjpResourceProvider github_provider; + mjp_defaultResourceProvider(&github_provider); + + github_provider.open = [](mjResource* resource) { + std::string name(resource->name); + // Strip the "github:" prefix and prepend the raw.githubusercontent URL. + std::string url = + "https://raw.githubusercontent.com/" + name.substr(strlen("github:")); + return FetchCache::Instance().Fetch(url.c_str()); + }; + github_provider.read = [](mjResource* resource, const void** buffer) { + std::string name(resource->name); + std::string url = + "https://raw.githubusercontent.com/" + name.substr(strlen("github:")); + return FetchCache::Instance().Read(url.c_str(), buffer); + }; + github_provider.close = [](mjResource* resource) { + std::string name(resource->name); + std::string url = + "https://raw.githubusercontent.com/" + name.substr(strlen("github:")); + FetchCache::Instance().Close(url.c_str()); + }; + + github_provider.prefix = "github"; + mjp_registerResourceProvider(&github_provider); + g_app = new mujoco::studio::App({ .width = width, .height = height,