XyPriss Immutability API (const) #

The __const__ global API is the core engine for data integrity and state protection within the XyPriss framework. It provides a robust mechanism for defining global constants and creating deeply immutable data structures that are protected at the engine level via JavaScript Proxies.

Functional Components #

The API is divided into two primary functional areas: the Named Constants Registry and the Deep Immutability Engine.


1. Named Constants Registry #

The registry allows for the definition of key-value pairs that are locked upon creation. Unlike standard JavaScript variables, these constants cannot be redefined or deleted once set.

Methods #

  • $set(key, value): Registers a new constant. Throws an error if the key already exists.
  • $get(key, defaultValue): Retrieves a constant value.
  • $has(key): Returns a boolean indicating if a constant is registered.
  • $keys(): Returns an array of all registered constant identifiers.

Example #

__const__.$set("API_VERSION", "v2");

// This will throw an error
__const__.$set("API_VERSION", "v3");

2. Deep Immutability Engine ($make) #

The $make method is a sophisticated utility that transforms standard JavaScript objects into immutable structures. It recursively applies protection to nested objects, arrays, Maps, and Sets.

Technical Implementation #

  • Object.freeze: Used for basic property protection.
  • Proxies: Used to intercept and block mutation operations (set, delete, defineProperty) with descriptive error messages.
  • WeakMap Caching: Ensures that circular references are handled correctly and that objects are not redundantly wrapped in multiple proxies, maintaining optimal performance.

Supported Data Types #

  • Objects: Protects all properties and prototype.
  • Arrays: Blocks index assignment and mutation methods (push, pop, splice, etc.).
  • Maps: Overrides set, delete, and clear.
  • Sets: Overrides add, delete, and clear.

Usage Example #

const securityPolicy = __const__.$make({
    firewall: {
        enabled: true,
        rules: ["ALLOW_HTTPS", "BLOCK_SSH"],
    },
});

// The following operations will throw runtime errors:
securityPolicy.firewall.enabled = false;
securityPolicy.firewall.rules.push("ALLOW_FTP");
delete securityPolicy.firewall;

Error Handling #

When a modification attempt is intercepted, __const__ throws a detailed error indicating the exact path of the violation.

Example Error Message: [XyPrissConst] Cannot modify immutable property "Configs.server.port". Attempted to set value: 8080

Performance Considerations #

While the Immutability Engine provides powerful protection, it should be used judiciously:

  1. Initialization Cost: Creating a deep proxy for very large, deeply nested objects has a one-time CPU cost.
  2. Memory: The WeakMap cache ensures memory efficiency by reusing proxies, but the proxies themselves occupy a small amount of additional memory.
  3. Runtime: Accessing properties through a Proxy is slightly slower than direct access, though this is negligible for configuration and constant data.

Best Practices #

  • Configuration Locking: Use $make to lock configuration objects before passing them to untrusted modules or plugins.
  • State Snapshots: When exporting internal state that should not be modified by the consumer, wrap the export in $make.
  • Constants Naming: Use UPPER_SNAKE_CASE for keys in the constants registry to distinguish them from standard variables.