@@ -62,6 +62,7 @@ def __init__(self, *, wasm_path: Optional[str] = None) -> None:
6262 self ._get_result_json_fn : Any = None
6363 self ._get_result_json_length_fn : Any = None
6464 self ._get_version_key_fn : Any = None
65+ self ._version_key : Optional [str ] = None
6566
6667 async def initialize (self ) -> None :
6768 """Load and instantiate the WASM module. Safe to call multiple times."""
@@ -110,7 +111,10 @@ async def initialize(self) -> None:
110111 raise RuntimeError ("WASM module does not export 'checkFlagCombined'" )
111112
112113 self ._initialized = True
113- logger .debug ("Rules engine WASM initialized (version: %s)" , self .get_version_key ())
114+ # Cache the version key immediately — the WASM pointer is only stable
115+ # before any other WASM calls mutate the linear memory.
116+ self ._version_key = self ._read_version_key_from_wasm ()
117+ logger .debug ("Rules engine WASM initialized (version: %s)" , self ._version_key )
114118
115119 def is_initialized (self ) -> bool :
116120 return self ._initialized
@@ -143,12 +147,15 @@ def get_version_key(self) -> str:
143147 """Get the version key from the WASM rules engine.
144148
145149 Used for cache key generation to ensure cache invalidation on engine updates.
150+ The value is computed once during initialization and cached.
146151 """
147152 self ._ensure_initialized ()
153+ return self ._version_key or "1"
148154
155+ def _read_version_key_from_wasm (self ) -> str :
156+ """Read the version key from WASM. Called once during init."""
149157 if self ._get_version_key_fn is None :
150158 return "1"
151-
152159 ptr = self ._get_version_key_fn (self ._store )
153160 return self ._read_null_terminated_string (ptr )
154161
@@ -190,4 +197,4 @@ def _read_null_terminated_string(self, ptr: int, max_length: int = 256) -> str:
190197 null_idx = raw .find (0 )
191198 if null_idx >= 0 :
192199 raw = raw [:null_idx ]
193- return raw .decode ("utf-8" )
200+ return raw .decode ("utf-8" ). strip ()
0 commit comments