Skip to content

@web-engine-dev/scheduler


@web-engine-dev/scheduler / Scheduler

Interface: Scheduler<TContext>

The Scheduler manages system execution order and parallel execution.

Systems are organized into stages and ordered based on their dependencies. The scheduler uses topological sorting to determine execution order.

Example

typescript
interface GameContext {
  deltaTime: number;
  world: World;
}

const scheduler = createScheduler<GameContext>();

// Add systems
scheduler.addSystem(defineSystem('input', handleInput).inStage(CoreStages.FIRST).build());
scheduler.addSystem(defineSystem('physics', updatePhysics).after('input').build());
scheduler.addSystem(defineSystem('render', drawScene).after('physics').build());

// Run in game loop
function gameLoop(dt: number) {
  scheduler.run({ deltaTime: dt, world: gameWorld });
}

Type Parameters

TContext

TContext = unknown

Methods

addStage()

addStage(name, options?): void

Add a new stage to the scheduler.

Parameters

name

string

Stage name

options?

Positioning options

after?

string

before?

string

Returns

void

Example

typescript
// Add custom stage after UPDATE
scheduler.addStage('ai', { after: CoreStages.UPDATE });

// Add custom stage before LAST
scheduler.addStage('networking', { before: CoreStages.LAST });

addSystem()

addSystem(descriptor): void

Register a system with the scheduler.

Parameters

descriptor

SystemDescriptor<TContext>

System descriptor with metadata

Returns

void

Example

typescript
// Using defineSystem builder
scheduler.addSystem(
  defineSystem('movement', (ctx) => updatePositions(ctx))
    .inStage(CoreStages.UPDATE)
    .after('input')
    .build()
);

// Using direct descriptor
scheduler.addSystem({
  id: 'render',
  fn: renderScene,
  stage: CoreStages.POST_UPDATE,
});

addSystemSet()

addSystemSet(name, options?): void

Create a system set for grouping systems with shared ordering.

Parameters

name

string

Unique name for the set

options?

Ordering constraints for the set

runAfter?

string[]

runBefore?

string[]

Returns

void


addSystemToSet()

addSystemToSet(setName, systemId): void

Add a system to a system set.

Parameters

setName

string

Name of the system set

systemId

SystemId

ID of the system to add

Returns

void


build()

build(): void

Build the execution graph based on dependencies.

Called automatically by run() if needed. Call manually to validate the dependency graph or get the execution order before running.

Returns

void

Throws

If a cycle is detected

Example

typescript
scheduler.addSystem(systemA);
scheduler.addSystem(systemB);

// Validate dependencies before first run
scheduler.build();

// Inspect computed order
console.log(scheduler.getExecutionOrder());

getExecutionOrder()

getExecutionOrder(): SystemId[]

Get the computed execution order.

Returns

SystemId[]


getStages()

getStages(): Stage[]

Get all registered stages in order.

Returns

Stage[]


getSystemSets()

getSystemSets(): SystemSet[]

Get all registered system sets.

Returns

SystemSet[]


removeSystem()

removeSystem(id): void

Remove a system from the scheduler.

Parameters

id

SystemId

System identifier

Returns

void


run()

run(context): void | Promise<void>

Run all systems in order.

Automatically calls build() if needed. Returns a Promise if any system is async or parallel execution is enabled.

Parameters

context

TContext

Context passed to each system

Returns

void | Promise<void>

Example

typescript
// Synchronous execution
scheduler.run({ deltaTime: 0.016, world });

// Async execution (when systems return Promises)
await scheduler.run({ deltaTime: 0.016, world });

Proprietary software. All rights reserved.