Skip to content

@web-engine-dev/assets

Async asset loading with handles, caching, and hot-reload support.

Features

  • Async Loading: Promise-based asset loading
  • Asset Handles: Reference counting and lifecycle
  • Caching: Automatic cache with configurable TTL
  • Hot Reload: Development-time asset reloading
  • Load Groups: Batch loading with progress
  • Type Safety: Generic typed asset handles

Installation

bash
npm install @web-engine-dev/assets
# or
pnpm add @web-engine-dev/assets

Quick Start

typescript
import { AssetManager, AssetHandle } from '@web-engine-dev/assets';

// Create asset manager
const assets = new AssetManager();

// Register loaders
assets.registerLoader('texture', textureLoader);
assets.registerLoader('audio', audioLoader);

// Load assets
const texture = await assets.load<Texture>('textures/player.png');

// Use handle
const sprite = new Sprite(texture.get());

// Release when done
texture.release();

API Overview

Asset Manager

MethodDescription
registerLoader()Add asset type loader
load<T>(path)Load asset, returns handle
loadAll(paths)Load multiple assets
get<T>(path)Get cached asset
unload(path)Force unload asset
preload(paths)Preload assets in background

Asset Handle

typescript
const handle = await assets.load<Texture>('player.png');

// Check state
handle.isLoaded;
handle.isLoading;
handle.error;

// Get value
const texture = handle.get();

// Reference counting
handle.retain();
handle.release();

// Listen for reload
handle.onReload(() => {
  // Handle reloaded asset
});

Load Groups

typescript
const group = assets.createGroup(['textures/player.png', 'textures/enemy.png', 'audio/music.mp3']);

group.onProgress((loaded, total) => {
  console.log(`${loaded}/${total}`);
});

await group.load();

Hot Reload

typescript
const assets = new AssetManager({
  hotReload: true,
  watchPaths: ['./assets'],
});

// Assets automatically reload on file change
const handle = await assets.load('player.png');
handle.onReload((newAsset) => {
  updateSprite(newAsset);
});

Custom Loader

typescript
assets.registerLoader('json', {
  async load(path: string): Promise<unknown> {
    const response = await fetch(path);
    return response.json();
  },

  extensions: ['.json'],
});

Proprietary software. All rights reserved.