# Stateful Post-Processor Plugin Create a stateful post-processor that maintains state across multiple extraction calls. ```typescript title="WASM" import init, { registerPostProcessor, extractBytes } from "kreuzberg-wasm"; await init(); // Create a stateful post-processor using a closure function createStatefulProcessor() { const state = { extractionCount: 0, totalChars: 0, lastResult: null, }; return { processingStage: () => "post-extraction", process: (extractionResult) => { // Update state state.extractionCount++; state.totalChars += extractionResult.text?.length || 0; state.lastResult = extractionResult; // Enrich result with statistics const enriched = { ...extractionResult, metadata: { ...extractionResult.metadata, extractionIndex: state.extractionCount, cumulativeChars: state.totalChars, averageDocLength: Math.round(state.totalChars / state.extractionCount), }, }; console.log( `[Extraction ${state.extractionCount}] ${enriched.text?.length || 0} chars, cumulative: ${state.totalChars}`, ); return enriched; }, // Optional: expose state for inspection getState: () => state, }; } // Register the stateful processor const statefulProcessor = createStatefulProcessor(); registerPostProcessor(statefulProcessor); // Multiple extractions use the same state async function processMultipleDocs() { const docs = [ new Uint8Array([ /* Doc 1 */ ]), new Uint8Array([ /* Doc 2 */ ]), new Uint8Array([ /* Doc 3 */ ]), ]; const results = []; for (const docBytes of docs) { const result = await extractBytes(docBytes, "application/pdf", {}); results.push(result); } return results; } await processMultipleDocs(); ``` Stateful processors can track metrics across multiple extractions or maintain context.