--- /dev/null
+from base64 import urlsafe_b64encode
+from hashlib import sha3_512
+from pathlib import Path
+from secrets import token_urlsafe
+
+from falcon.constants import MEDIA_JS
+from jinja2 import Environment, FileSystemLoader
+
+
+class CryptResource:
+ @staticmethod
+ def scramble(secret, value):
+ h = sha3_512()
+ h.update(f"{secret}{value}".encode())
+ return urlsafe_b64encode(h.digest()).rstrip(b'=').decode('ascii')
+
+ def __init__(self, secret=None):
+ self.current_hubapp = "first"
+ self.secret = secret or token_urlsafe(64)
+ self.master_uri = f"/{self.scramble(self.secret, 'index.html')}"
+ self.master_js_uri = f"/{self.scramble(self.secret, 'master.js')}"
+ hubapp_dir = Path(__file__).parents[1] / "hubapps" / self.current_hubapp
+ self.env = Environment(loader=FileSystemLoader(hubapp_dir))
+ with open(hubapp_dir / "index.js", "rb") as fh:
+ self._index_js = fh.read()
+ with open(hubapp_dir / "master.js", "rb") as fh:
+ self._master_js = fh.read()
+
+ async def on_get(self, req, resp):
+ resp.data = self.env.get_template("index.html.j2").render({}).encode()
+
+ async def on_get_index_js(self, req, resp):
+ resp.data = self.env.get_template("index.js").render({}).encode()
+
+ async def on_get_master(self, req, resp):
+ resp.data = self.env.get_template("master.html.j2").render({"master_js": self.master_js_uri}).encode()
+
+ async def on_get_master_js(self, req, resp):
+ resp.data = self._master_js
+ resp.content_type = MEDIA_JS
+
+ def register_on(self, app):
+ app.add_route("/", self)
+ app.add_route("/index.js", self, suffix="index_js")
+ app.add_route(self.master_uri, self, suffix="master")
+ app.add_route(self.master_js_uri, self, suffix="master_js")