Skip to content

On Method Nightly ​

The on method is the event-driven heart of LightVM, allowing you to hook into specific VM lifecycle events. By registering callbacks, you can react to internal state changes and execution milestones in real-time.

Using TypeScript ​

For TypeScript, the on method allows you to attach event listeners that execute whenever a registered event is triggered. This is ideal for logging, monitoring VM state changes, or triggering external logic when specific conditions are met.

ts
import { LightVM, VMEvent } from 'lightvm';

const vm = new LightVM({ caps: [] });

vm.on(VMEvent.Tick, (data) => {
  console.log('Event: ', data.event);
  console.log('Payload: ', data.payload);
});
vm.run();
ts
import { LightVM, VMEvent } from 'lightvm';

const vm = new LightVM({ caps: [] });

vm.on(VMEvent.Halt, (data) => {
  console.log('Event: ', data.event);
  console.log('Payload: ', data.payload);
});
vm.halt();
vm.run(); // will not be executed
ts
import { LightVM, VMEvent } from 'lightvm';

const vm = new LightVM({ caps: [] });

vm.on(VMEvent.Start, (data) => {
  console.log('Event: ', data.event);
  console.log('Payload: ', data.payload);
});
vm.run();
ts
import { LightVM, VMEvent } from 'lightvm';

const vm = new LightVM({ caps: [] });

vm.on(VMEvent.Finish, (data) => {
  console.log('Event: ', data.event);
  console.log('Payload: ', data.payload);
});
vm.run();

Using Rust ​

In Rust, the on method enables you to define event handlers that integrate directly with your system's logic. This allows for robust asynchronous notification when the VM enters a certain state, such as halting or encountering an error.

rust
use lightvm::LightVM;
use lightvm::types::{vmconfig::VmConfig, vmevent::VmEvent};

fn main() {
  let mut vm = LightVM::new(VmConfig {
    caps: vec![],
    ..Default::default()
  });

  vm.on(VmEvent::Tick, |data| {
    println!("Event: {:?}", data.event);
    println!("Payload: {:?}", data.payload);
  });
  vm.run(None);
}
rust
use lightvm::LightVM;
use lightvm::types::{capability::Capability, vmconfig::VmConfig, vmevent::VmEvent};

fn main() {
  let mut vm = LightVM::new(VmConfig {
    caps: vec![Capability::Unsafe],
    ..Default::default()
  });

  vm.on(VmEvent::Halt, |data| {
    println!("Event: {:?}", data.event);
    println!("Payload: {:?}", data.payload);
  });
  vm.halt();
}
rust
use lightvm::LightVM;
use lightvm::types::{capability::Capability, vmconfig::VmConfig, vmevent::VmEvent};

fn main() {
  let mut vm = LightVM::new(VmConfig {
    caps: vec![Capability::Control],
    ..Default::default()
  });

  vm.on(VmEvent::Start, |data| {
    println!("Event: {:?}", data.event);
    println!("Payload: {:?}", data.payload);
  });
  vm.load(r#"[["stop"]]"#)
    .run(None);
}
rust
use lightvm::LightVM;
use lightvm::types::{capability::Capability, vmconfig::VmConfig, vmevent::VmEvent};

fn main() {
  let mut vm = LightVM::new(VmConfig {
    caps: vec![Capability::Control],
    ..Default::default()
  });

  vm.on(VmEvent::Finish, |data| {
    println!("Event: {:?}", data.event);
    println!("Payload: {:?}", data.payload);
  });
  vm.load(r#"[["stop"]]"#)
    .run(None);
}

INFO

Capability Required: no specific capability

Owned Events: Tick, Halt, Panic, Start, and Finish