1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- <!doctype html><html lang="en" class="no-js"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta http-equiv="x-ua-compatible" content="ie=edge"><meta name="description" content="Documentation home Rojo, a tool for enabling professional development tools on Roblox."><link rel="canonical" href="https://rojo.space/docs/0.5.x/internals/overview/"><meta name="lang:clipboard.copy" content="Copy to clipboard"><meta name="lang:clipboard.copied" content="Copied to clipboard"><meta name="lang:search.language" content="en"><meta name="lang:search.pipeline.stopwords" content="True"><meta name="lang:search.pipeline.trimmer" content="True"><meta name="lang:search.result.none" content="No matching documents"><meta name="lang:search.result.one" content="1 matching document"><meta name="lang:search.result.other" content="# matching documents"><meta name="lang:search.tokenizer" content="[\s\-]+"><link rel="shortcut icon" href="../../../assets/images/favicon.png"><meta name="generator" content="mkdocs-1.0.4, mkdocs-material-4.3.1"><title>Internals Overview - Rojo Documentation</title><link rel="stylesheet" href="../../../assets/stylesheets/application.4031d38b.css"><link rel="stylesheet" href="../../../assets/stylesheets/application-palette.224b79ff.css"><meta name="theme-color" content="#ef5350"><script src="../../../assets/javascripts/modernizr.74668098.js"></script><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono&display=swap"><style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style><link rel="stylesheet" href="../../../assets/fonts/material-icons.css"><link rel="stylesheet" href="../../../extra.css"></head><body dir="ltr" data-md-color-primary="red" data-md-color-accent="red"><svg class="md-svg"><defs><svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="__github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg></defs></svg> <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> <label class="md-overlay" data-md-component="overlay" for="__drawer"></label><a href="#cli" tabindex="1" class="md-skip">Skip to content </a><header class="md-header" data-md-component="header"><nav class="md-header-nav md-grid"><div class="md-flex"><div class="md-flex__cell md-flex__cell--shrink"><a href="https://rojo.space/docs" title="Rojo Documentation" class="md-header-nav__button md-logo"><i class="md-icon"></i></a></div><div class="md-flex__cell md-flex__cell--shrink"><label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label></div><div class="md-flex__cell md-flex__cell--stretch"><div class="md-flex__ellipsis md-header-nav__title" data-md-component="title"><span class="md-header-nav__topic">Rojo Documentation</span><span class="md-header-nav__topic">Internals Overview</span></div></div><div class="md-flex__cell md-flex__cell--shrink"><label class="md-icon md-icon--search md-header-nav__button" for="__search"></label><div class="md-search" data-md-component="search" role="dialog"><label class="md-search__overlay" for="__search"></label><div class="md-search__inner" role="search"><form class="md-search__form" name="search"><input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active"> <label class="md-icon md-search__icon" for="__search"></label> <button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1"></button></form><div class="md-search__output"><div class="md-search__scrollwrap" data-md-scrollfix><div class="md-search-result" data-md-component="result"><div class="md-search-result__meta">Type to start searching</div><ol class="md-search-result__list"></ol></div></div></div></div></div></div><div class="md-flex__cell md-flex__cell--shrink"><div class="md-header-nav__source"><a href="https://github.com/rojo-rbx/rojo.space/" title="Go to repository" class="md-source" data-md-source="github"><div class="md-source__icon"><svg viewBox="0 0 24 24" width="24" height="24"><use xlink:href="#__github" width="24" height="24"></use></svg></div><div class="md-source__repository">rojo-rbx/rojo.space</div></a></div></div></div></nav></header><div class="md-container"><main class="md-main"><div class="md-main__inner md-grid" data-md-component="container"><div class="md-sidebar md-sidebar--primary" data-md-component="navigation"><div class="md-sidebar__scrollwrap"><div class="md-sidebar__inner"><nav class="md-nav md-nav--primary" data-md-level="0"><label class="md-nav__title md-nav__title--site" for="__drawer"><a href="https://rojo.space/docs" title="Rojo Documentation" class="md-nav__button md-logo"><i class="md-icon"></i></a>Rojo Documentation</label><div class="md-nav__source"><a href="https://github.com/rojo-rbx/rojo.space/" title="Go to repository" class="md-source" data-md-source="github"><div class="md-source__icon"><svg viewBox="0 0 24 24" width="24" height="24"><use xlink:href="#__github" width="24" height="24"></use></svg></div><div class="md-source__repository">rojo-rbx/rojo.space</div></a></div><ul class="md-nav__list" data-md-scrollfix><li class="md-nav__item"><a href="../../.." title="Home" class="md-nav__link">Home</a></li><li class="md-nav__item"><a href="../../../why-rojo/" title="Why Rojo?" class="md-nav__link">Why Rojo?</a></li><li class="md-nav__item"><a href="../../../help/" title="Get Help with Rojo" class="md-nav__link">Get Help with Rojo</a></li><li class="md-nav__item"><a href="../../../rojo-alternatives/" title="Rojo Alternatives" class="md-nav__link">Rojo Alternatives</a></li><li class="md-nav__item"><a href="../../../installation/" title="Installing Rojo" class="md-nav__link">Installing Rojo</a></li><li class="md-nav__item md-nav__item--active md-nav__item--nested"><input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6" checked><label class="md-nav__link" for="nav-6">Rojo 0.5.x</label><nav class="md-nav" data-md-component="collapsible" data-md-level="1"><label class="md-nav__title" for="nav-6">Rojo 0.5.x</label><ul class="md-nav__list" data-md-scrollfix><li class="md-nav__item md-nav__item--nested"><input class="md-toggle md-nav__toggle" data-md-toggle="nav-6-1" type="checkbox" id="nav-6-1"><label class="md-nav__link" for="nav-6-1">Guide</label><nav class="md-nav" data-md-component="collapsible" data-md-level="2"><label class="md-nav__title" for="nav-6-1">Guide</label><ul class="md-nav__list" data-md-scrollfix><li class="md-nav__item"><a href="../../guide/new-game/" title="Creating a Game with Rojo" class="md-nav__link">Creating a Game with Rojo</a></li><li class="md-nav__item"><a href="../../guide/existing-game/" title="Porting an Existing Game to Rojo" class="md-nav__link">Porting an Existing Game to Rojo</a></li><li class="md-nav__item"><a href="../../guide/migrating-to-epiphany/" title="Migrating from 0.4.x to 0.5.x" class="md-nav__link">Migrating from 0.4.x to 0.5.x</a></li></ul></nav></li><li class="md-nav__item md-nav__item--nested"><input class="md-toggle md-nav__toggle" data-md-toggle="nav-6-2" type="checkbox" id="nav-6-2"><label class="md-nav__link" for="nav-6-2">Reference</label><nav class="md-nav" data-md-component="collapsible" data-md-level="2"><label class="md-nav__title" for="nav-6-2">Reference</label><ul class="md-nav__list" data-md-scrollfix><li class="md-nav__item"><a href="../../reference/full-vs-partial/" title="Fully vs Partially Managed Rojo" class="md-nav__link">Fully vs Partially Managed Rojo</a></li><li class="md-nav__item"><a href="../../reference/project-format/" title="Project Format" class="md-nav__link">Project Format</a></li><li class="md-nav__item"><a href="../../reference/sync-details/" title="Sync Details" class="md-nav__link">Sync Details</a></li></ul></nav></li><li class="md-nav__item md-nav__item--active md-nav__item--nested"><input class="md-toggle md-nav__toggle" data-md-toggle="nav-6-3" type="checkbox" id="nav-6-3" checked><label class="md-nav__link" for="nav-6-3">Rojo Internals</label><nav class="md-nav" data-md-component="collapsible" data-md-level="2"><label class="md-nav__title" for="nav-6-3">Rojo Internals</label><ul class="md-nav__list" data-md-scrollfix><li class="md-nav__item md-nav__item--active"><input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc"><label class="md-nav__link md-nav__link--active" for="__toc">Internals Overview</label><a href="./" title="Internals Overview" class="md-nav__link md-nav__link--active">Internals Overview</a><nav class="md-nav md-nav--secondary"><label class="md-nav__title" for="__toc">Table of contents</label><ul class="md-nav__list" data-md-scrollfix><li class="md-nav__item"><a href="#cli" title="CLI" class="md-nav__link">CLI</a><nav class="md-nav"><ul class="md-nav__list"><li class="md-nav__item"><a href="#rbxtree" title="RbxTree" class="md-nav__link">RbxTree</a></li><li class="md-nav__item"><a href="#in-memory-filesystem-imfs" title="In-Memory Filesystem (IMFS)" class="md-nav__link">In-Memory Filesystem (IMFS)</a></li><li class="md-nav__item"><a href="#snapshot-reconciler" title="Snapshot Reconciler" class="md-nav__link">Snapshot Reconciler</a></li><li class="md-nav__item"><a href="#http-api" title="HTTP API" class="md-nav__link">HTTP API</a></li></ul></nav></li><li class="md-nav__item"><a href="#roblox-studio-plugin" title="Roblox Studio Plugin" class="md-nav__link">Roblox Studio Plugin</a></li></ul></nav></li></ul></nav></li></ul></nav></li><li class="md-nav__item md-nav__item--nested"><input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7"><label class="md-nav__link" for="nav-7">Rojo 0.4.x</label><nav class="md-nav" data-md-component="collapsible" data-md-level="1"><label class="md-nav__title" for="nav-7">Rojo 0.4.x</label><ul class="md-nav__list" data-md-scrollfix><li class="md-nav__item md-nav__item--nested"><input class="md-toggle md-nav__toggle" data-md-toggle="nav-7-1" type="checkbox" id="nav-7-1"><label class="md-nav__link" for="nav-7-1">Getting Started</label><nav class="md-nav" data-md-component="collapsible" data-md-level="2"><label class="md-nav__title" for="nav-7-1">Getting Started</label><ul class="md-nav__list" data-md-scrollfix><li class="md-nav__item"><a href="../../../0.4.x/getting-started/creating-a-project/" title="Creating a Project" class="md-nav__link">Creating a Project</a></li></ul></nav></li><li class="md-nav__item"><a href="../../../0.4.x/sync-details/" title="Sync Details" class="md-nav__link">Sync Details</a></li></ul></nav></li></ul></nav></div></div></div><div class="md-sidebar md-sidebar--secondary" data-md-component="toc"><div class="md-sidebar__scrollwrap"><div class="md-sidebar__inner"><nav class="md-nav md-nav--secondary"><label class="md-nav__title" for="__toc">Table of contents</label><ul class="md-nav__list" data-md-scrollfix><li class="md-nav__item"><a href="#cli" title="CLI" class="md-nav__link">CLI</a><nav class="md-nav"><ul class="md-nav__list"><li class="md-nav__item"><a href="#rbxtree" title="RbxTree" class="md-nav__link">RbxTree</a></li><li class="md-nav__item"><a href="#in-memory-filesystem-imfs" title="In-Memory Filesystem (IMFS)" class="md-nav__link">In-Memory Filesystem (IMFS)</a></li><li class="md-nav__item"><a href="#snapshot-reconciler" title="Snapshot Reconciler" class="md-nav__link">Snapshot Reconciler</a></li><li class="md-nav__item"><a href="#http-api" title="HTTP API" class="md-nav__link">HTTP API</a></li></ul></nav></li><li class="md-nav__item"><a href="#roblox-studio-plugin" title="Roblox Studio Plugin" class="md-nav__link">Roblox Studio Plugin</a></li></ul></nav></div></div></div><div class="md-content"><article class="md-content__inner md-typeset"><a href="https://github.com/rojo-rbx/rojo.space/edit/master/docs/0.5.x/internals/overview.md" title="Edit this page" class="md-icon md-content__icon"></a><h1>Internals Overview</h1><p>This document aims to give a general overview of how Rojo works. It's intended for people who want to contribute to the project as well as anyone who's just curious how the tool works!</p>
- <div class="toc">
- <ul>
- <li><a href="#cli">CLI</a><ul>
- <li><a href="#rbxtree">RbxTree</a></li>
- <li><a href="#in-memory-filesystem-imfs">In-Memory Filesystem (IMFS)</a></li>
- <li><a href="#snapshot-reconciler">Snapshot Reconciler</a></li>
- <li><a href="#http-api">HTTP API</a></li>
- </ul>
- </li>
- <li><a href="#roblox-studio-plugin">Roblox Studio Plugin</a></li>
- </ul>
- </div>
- <h2 id="cli">CLI<a class="headerlink" href="#cli" title="Permanent link">¶</a></h2>
- <h3 id="rbxtree">RbxTree<a class="headerlink" href="#rbxtree" title="Permanent link">¶</a></h3>
- <p>Rojo uses a library named <a href="https://github.com/LPGhatguy/rbx-tree"><code>rbx_tree</code></a> as its implementation of the Roblox DOM. It serves as a common format for serialization to all the formats Rojo supports!</p>
- <p>Rojo uses two related libraries to deserialize instances from Roblox's file formats, <code>rbx_xml</code> and <code>rbx_binary</code>.</p>
- <h3 id="in-memory-filesystem-imfs">In-Memory Filesystem (IMFS)<a class="headerlink" href="#in-memory-filesystem-imfs" title="Permanent link">¶</a></h3>
- <p>Relevant source files:</p>
- <ul>
- <li><a href="https://github.com/LPGhatguy/rojo/blob/master/server/src/imfs.rs"><code>server/src/imfs.rs</code></a></li>
- <li><a href="https://github.com/LPGhatguy/rojo/blob/master/server/src/fs_watcher.rs"><code>server/src/fs_watcher.rs</code></a></li>
- </ul>
- <p>Rojo keeps an in-memory copy of all files that it needs reasons about. This enables taking fast, stateless, tear-tree snapshots of files to turn them into instances.</p>
- <p>Keeping an in-memory copy of file contents will also enable Rojo to debounce changes that are caused by Rojo itself. This'll happen when two-way sync finally happens.</p>
- <h3 id="snapshot-reconciler">Snapshot Reconciler<a class="headerlink" href="#snapshot-reconciler" title="Permanent link">¶</a></h3>
- <p>Relevant source files:</p>
- <ul>
- <li><a href="https://github.com/LPGhatguy/rojo/blob/master/server/src/snapshot_reconciler.rs"><code>server/src/snapshot_reconciler.rs</code></a></li>
- <li><a href="https://github.com/LPGhatguy/rojo/blob/master/server/src/rbx_snapshot.rs"><code>server/src/rbx_snapshot.rs</code></a></li>
- <li><a href="https://github.com/LPGhatguy/rojo/blob/master/server/src/rbx_session.rs"><code>server/src/rbx_session.rs</code></a></li>
- </ul>
- <p>To simplify incremental updates of instances, Rojo generates lightweight snapshots describing how files map to instances. This means that Rojo can treat file change events similarly to damage painting as opposed to trying to surgically update the correct instances.</p>
- <p>This approach reduces the number of desynchronization bugs, reduces the complexity of important pieces of the codebase, and makes writing plugins a lot easier.</p>
- <h3 id="http-api">HTTP API<a class="headerlink" href="#http-api" title="Permanent link">¶</a></h3>
- <p>Relevant source files:</p>
- <ul>
- <li><a href="https://github.com/LPGhatguy/rojo/blob/master/server/src/web.rs"><code>server/src/web.rs</code></a></li>
- </ul>
- <p>The Rojo live-sync server and Roblox Studio plugin communicate via HTTP.</p>
- <p>Requests sent from the plugin to the server are regular HTTP requests.</p>
- <p>Messages sent from the server to the plugin are delivered via HTTP long-polling. This is an approach that uses long-lived HTTP requests that restart on timeout. It's largely been replaced by WebSockets, but Roblox doesn't have support for them.</p>
- <h2 id="roblox-studio-plugin">Roblox Studio Plugin<a class="headerlink" href="#roblox-studio-plugin" title="Permanent link">¶</a></h2>
- <p>TODO</p></article></div></div></main><footer class="md-footer"><div class="md-footer-nav"><nav class="md-footer-nav__inner md-grid"><a href="../../reference/sync-details/" title="Sync Details" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev"><div class="md-flex__cell md-flex__cell--shrink"><i class="md-icon md-icon--arrow-back md-footer-nav__button"></i></div><div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title"><span class="md-flex__ellipsis"><span class="md-footer-nav__direction">Previous</span>Sync Details</span></div></a><a href="../../../0.4.x/getting-started/creating-a-project/" title="Creating a Project" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next"><div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title"><span class="md-flex__ellipsis"><span class="md-footer-nav__direction">Next</span>Creating a Project</span></div><div class="md-flex__cell md-flex__cell--shrink"><i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i></div></a></nav></div><div class="md-footer-meta md-typeset"><div class="md-footer-meta__inner md-grid"><div class="md-footer-copyright">powered by <a href="https://www.mkdocs.org">MkDocs</a> and <a href="https://squidfunk.github.io/mkdocs-material/">Material for MkDocs</a></div></div></div></footer></div><script src="../../../assets/javascripts/application.b260a35d.js"></script><script>app.initialize({version:"1.0.4",url:{base:"../../.."}})</script></body></html>
|