1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//! Session-based execution for persistent WASM state.
//!
//! This module provides session-based execution that maintains state between
//! WASM executions, avoiding the ~1.5ms Python interpreter initialization
//! overhead on each call.
//!
//! ## Available Session Types
//!
//! - **[`SessionExecutor`]**: Core executor that keeps WASM Store and Instance alive
//! between executions. This is the foundation for session-based execution.
//!
//! - **[`InProcessSession`]**: High-level session API wrapping the sandbox.
//! Provides a simple interface for REPL-style interactive execution.
//!
//! ## State Persistence (Coming Soon)
//!
//! The WIT export approach will enable Python-level state snapshots via
//! `snapshot_state()` and `restore_state()` exports in the runtime. This
//! provides serializable state with minimal overhead (~KB vs ~50MB for
//! WASM-level snapshots).
//!
//! # Example
//!
//! ```rust,ignore
//! use eryx::session::{InProcessSession, Session};
//!
//! // Create a sandbox and start a session
//! let sandbox = Sandbox::builder()
//! .with_embedded_runtime()
//! .build()?;
//!
//! let mut session = InProcessSession::new(&sandbox).await?;
//!
//! // Execute multiple statements, preserving state
//! session.execute("x = 1").await?;
//! session.execute("y = 2").await?;
//! let result = session.execute("print(x + y)").await?;
//! assert_eq!(result.stdout, "3");
//!
//! // Reset to fresh state
//! session.reset().await?;
//! ```
use async_trait;
use crateError;
use crateExecuteResult;
pub use ;
pub use ;
pub use InProcessSession;
/// Common trait for all session implementations.
///
/// A session maintains persistent state across multiple `execute()` calls,
/// avoiding the ~1.5ms Python interpreter initialization overhead on each call.
/// Trait for sessions that support state snapshots.
///
/// Snapshots capture the current state of the session so it can be:
/// - Persisted to disk or a database
/// - Sent over the network to another process
/// - Restored later to continue execution
///
/// # Snapshot Timing
///
/// Snapshots can only be captured when `execute()` has returned. It is not
/// possible to snapshot mid-execution (e.g., while Python code is running).
/// This is a fundamental limitation of JIT-compiled WASM.
///
/// # Implementation Note
///
/// The recommended approach for snapshots is the WIT export method, where
/// Python-level state is serialized via `pickle` and exposed through
/// `snapshot_state()` and `restore_state()` exports in the runtime.