File size: 6,574 Bytes
538142a | 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 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | # BEX Engine Production Readiness Audit
This document records the current production posture of `pluginengine01` after the HTTP/backend re-audit.
## Current Verdict
The engine is **usable in C/C++ desktop/server apps today** as a portable WASM plugin runtime with:
- Pure C ABI (`bex_engine.h`)
- Async callback API
- Wasmtime Component Model sandboxing
- Per-plugin manifests and capability gates
- HTTP host API with browser-like headers, cookies, compression, HTTP/2
- QuickJS host API for site-specific JavaScript/cipher code
- Redb-backed KV/secrets storage
- FlatBuffer/JSON conversion paths for C++ apps
The engine is **not yet a universal Cloudflare bypass engine**. The default HTTP backend is intentionally portable (`reqwest + rustls`) and does not byte-match Chrome's TLS JA3/JA4 fingerprint.
## Production-Safe Default Backend
Current default:
```toml
reqwest = { version = "0.12", default-features = false, features = [
"rustls-tls", "json", "gzip", "brotli", "deflate", "cookies", "http2"
] }
```
Why this is the default:
- Builds reliably on Linux, macOS, Windows.
- Embeds cleanly into C/C++ apps.
- Avoids native BoringSSL/curl-impersonate build complexity.
- Keeps the repo buildable without unverified crate APIs.
Limitations:
- TLS fingerprint is rustls, not Chrome/BoringSSL.
- Advanced anti-bot systems may still challenge/block.
- Browser-like HTTP headers help with simple checks but do not fix JA3/JA4.
## Cloudflare / Anti-Bot Reality
| Protection type | Default backend | Notes |
|---|---:|---|
| Basic header checks | ✅ | Chrome-like headers, cookies, H2, compression |
| Cookie/session checks | ✅ | `cookie_store(true)` |
| Simple CF managed challenge | ⚠️ | Can pass some; not guaranteed due TLS fingerprint |
| CF JS challenge | ⚠️ | Requires plugin/QuickJS solver and session cookies |
| Turnstile/CAPTCHA | ❌ | Needs user interaction/WebView/browser handoff |
| DataDome/PerimeterX/Akamai bot | ❌/⚠️ | Usually requires Chrome TLS + H2 fingerprint impersonation |
## Optional Hardened HTTP Backend Roadmap
For real browser-grade anti-bot bypass, add an **optional Cargo feature**, not the default:
```toml
[features]
default = ["http-reqwest"]
http-reqwest = ["dep:reqwest"]
http-impersonate = ["dep:rquest"] # or another verified crate
```
Requirements before enabling this in production:
1. Verify crate/version exists and API compiles.
2. Verify Chrome profile enum/import path.
3. Verify Linux/macOS/Windows build in CI.
4. Verify cross-compilation for app targets.
5. Verify TLS fingerprint on every target with an external JA3/JA4 tester.
6. Keep `reqwest` fallback for platforms where impersonation cannot build.
Do **not** ship an unverified `rquest = "1.0"` or undocumented builder API.
## C++ App Integration Status
### Good
- ABI is plain C, no Rust types across boundary.
- Callbacks return `payload` plus length; C++ can copy before return.
- Sync plugin management functions use integer status codes.
- Strings returned by Rust have explicit free functions.
- CMake now supports macOS/Linux/Windows better and no longer forces full static glibc linking.
### Integration Rules
C++ apps must:
1. Keep `BexEngine*` alive until all callbacks complete.
2. Keep `user_data` alive until callback fires or request is cancelled and callback path is known.
3. Copy callback payload before returning from callback.
4. Marshal callback results to the app/UI thread if needed.
5. Call `bex_engine_free` only during shutdown, not while new requests are being submitted.
## Known Issues To Fix Before Hard Production
These are not architecture blockers, but should be addressed before high-volume deployment:
1. **Cancellation tokens should be removed after async task completion.**
- Current code inserts tokens but does not visibly remove them in `submit_async` after completion.
- Long-running apps may leak entries in the cancellation map.
2. **`bex_engine_secret_get` should guard zero-length buffers.**
- If caller passes `*out_buf_len == 0`, `buf_size - 1` underflows.
- Add explicit `if buf_size == 0 { required_len = value.len()+1; return -2; }`.
3. **Scheduler exists but FFI async submit path does not visibly acquire scheduler permits.**
- The architecture has lane semaphores, but `submit_async` currently uses `spawn_blocking` directly.
- Add scheduler acquisition around user/control/background calls for true production backpressure.
4. **HTTP cache key is URL-only.**
- If two plugins request the same URL with different auth headers, cached response can cross-contaminate.
- Make key `plugin_id + method + url + vary-relevant headers`, or disable cache for requests with auth/cookie-sensitive headers.
5. **`call-js-fn` should resolve Promises like `eval-js`.**
- Async JS functions returning promises may stringify as `{}`.
- Reuse the Promise resolution logic from `eval_js` in `worker.rs`.
## Plugin Architecture Assessment
The WIT interface is sufficient for multi-site media plugins:
- home/category/search/info/servers/stream
- subtitles/articles
- HTTP with headers/body/method/cache mode
- KV/secrets
- QuickJS for ciphers/player scripts
- logging/clock/rng
The KaiAnime plugin proves the model works end-to-end:
- HTML scraping
- AJAX endpoints
- self-describing episode IDs
- multi-step token encryption/decryption
- server listing
- stream resolution
- HLS + subtitles
However, KaiAnime currently depends on `enc-dec.app` instead of local QuickJS cipher code. For long-term reliability, move site ciphers into plugin-local JS via `call-js-fn`.
## Cross-Platform Matrix
| Target | Current default backend | Status |
|---|---:|---|
| Linux x86_64 | reqwest/rustls | ✅ Good |
| Linux aarch64 | reqwest/rustls | ✅ Good |
| macOS x86_64/arm64 | reqwest/rustls | ✅ Good, CMake framework links added |
| Windows MSVC | reqwest/rustls | ✅ Likely, system libs added |
| Android | Rust staticlib possible | ⚠️ Needs NDK CI proof |
| iOS | Rust staticlib possible | ⚠️ Needs iOS toolchain + Wasmtime support verification |
| Fully static Linux glibc | Not default | ⚠️ Opt-in only via `BEX_FORCE_STATIC_EXE=ON` |
## Recommendation
For production apps today:
1. Use the current default backend for portability.
2. Add CI for Linux/macOS/Windows release builds.
3. Fix the five known issues above.
4. Add optional impersonation backend later, behind a feature flag, only after compile/API/fingerprint verification.
5. For sites with serious bot defenses, provide app-level browser/WebView handoff as fallback.
|