1use crate::engine_access::EngineAccess;
2use crate::wire::ActionWire;
3
4#[derive(Debug, Clone)]
5pub struct RawProviderEvent {
6 pub payload_type: String,
7 pub payload: Vec<u8>,
8}
9
10pub const DEFAULT_FUEL: u64 = 10_000_000;
12pub const DEFAULT_MAX_MEMORY: usize = 16 * 1024 * 1024;
14
15pub struct StoreData {
22 pub engine_access: *const dyn EngineAccess,
23 pub now: f64,
24 pub injected_actions: Vec<ActionWire>,
25 pub log_messages: Vec<String>,
26 pub provider_events: Vec<RawProviderEvent>,
27 pub provider_events_enabled: bool,
28}
29
30unsafe impl Send for StoreData {}
34unsafe impl Sync for StoreData {}
35
36impl StoreData {
37 pub unsafe fn engine(&self) -> &dyn EngineAccess {
42 &*self.engine_access
43 }
44
45 pub fn reset_per_call(
47 &mut self,
48 engine_access: *const dyn EngineAccess,
49 now: f64,
50 provider_events_enabled: bool,
51 ) {
52 self.engine_access = engine_access;
53 self.now = now;
54 self.injected_actions.clear();
55 self.log_messages.clear();
56 self.provider_events.clear();
57 self.provider_events_enabled = provider_events_enabled;
58 }
59}
60
61pub struct WasmRuntime {
63 engine: wasmtime::Engine,
64 fuel: u64,
65}
66
67impl WasmRuntime {
68 pub fn new() -> Result<Self, wasmtime::Error> {
69 let mut config = wasmtime::Config::new();
70 config.consume_fuel(true);
71 let engine = wasmtime::Engine::new(&config)?;
72 Ok(WasmRuntime {
73 engine,
74 fuel: DEFAULT_FUEL,
75 })
76 }
77
78 pub fn compile(&self, bytes: &[u8]) -> Result<wasmtime::Module, wasmtime::Error> {
79 wasmtime::Module::new(&self.engine, bytes)
80 }
81
82 pub fn engine(&self) -> &wasmtime::Engine {
83 &self.engine
84 }
85
86 pub fn fuel(&self) -> u64 {
87 self.fuel
88 }
89}