offline-web/DESIGN.md

1.7 KiB

Design Notes

Synchronization

We support several operations for Bootstrapping

  • Fetch Bootstrap
  • Fetch Reference
  • Fetch Object

Resource Datamodel

We assume all resources are content-addressable and form a merkle tree. We maintain an index of path to content-addressable items.

Resource reference paths are rooted at a /ref/ prefix for their path namespace. They contain a payload with the objectID, content_address if there is one, and a list of any dependent resources.

{
    "objectId": <merkle-hash>,
    "content_address": <content-hash>,
    "path": "/path/name0",
    "dependents": [
        {
            "path": "path/name1",
            "content_address": <content-hash>,
            "objectId": <merkle-hash>, content: <payload>
        },
        {
            "path": "path/name2",
            "content_address": <content-hash>,
            "objectId": <merkle-hash>, content: <payload>
        }
    ],
}

Reserved References

  • /ref/all/<username> The root of the resouce tree. List all sub resources that the user has access too.
  • /ref/user/<username> The user information.

Content-Addressable Query API

The content addressable store is considered immutable. You do not delete from it. We may garbage collect at some point as a storage optimization.

Content addressable paths are rooted at /object/<content-hash>.

Their payloads are whatever the contents serialize to in json

Syncrhonization

Bootstrapping

  • Load /ref/all/<username>
  • Follow the sub resources recusively to load the entire dataset locally making sure to keep the content-addresses around for comparison.

Benchmarking

Bootstrapping benchmark tests

  • Rest API
  • WebSockets