glimr/loom/registry

Loom Module Registry

The WebSocket init message includes a module name chosen by the client. Without validation, a malicious client could invoke arbitrary Erlang modules via dynamic dispatch. This registry acts as an allowlist — only modules explicitly registered during compilation can be dispatched to, closing the arbitrary-execution hole.

Types

Each entry tracks both the module path (for dispatch validation) and the source template path (for debugging and recompilation). Storing both avoids a second lookup to map between module names and their source files.

pub type ModuleEntry {
  ModuleEntry(module: String, source: String)
}

Constructors

  • ModuleEntry(module: String, source: String)

Values

pub fn clear() -> Result(Nil, String)

A full recompilation starts fresh to avoid stale entries from renamed or deleted templates lingering in the registry. Clearing first and re-registering during compilation guarantees the registry exactly matches the current template set.

pub fn is_valid_module(module: String) -> Bool

The WebSocket handler calls this before starting an actor to ensure the client-requested module was actually compiled by the framework. Rejecting unknown modules here prevents arbitrary code execution via the dynamic dispatch path.

pub fn list_modules() -> List(ModuleEntry)

The compiler and diagnostic tools need to inspect the full registry contents — for example, to rebuild all known modules or display the list of live templates in development tooling.

pub fn register_module(
  module: String,
  source: String,
) -> Result(Nil, String)

The compiler calls this after successfully generating a live template module. Adding the module to the registry at compile time ensures the allowlist is always in sync with the actual set of generated modules, without requiring a separate configuration step.

pub fn unregister_module(module: String) -> Result(Nil, String)

When a template file is deleted, its compiled module should no longer be dispatchable. Removing it from the registry ensures stale module names can’t be exploited after the template source is gone.

Search Document