5.2 KiB
12 — Network stack & the impossible catalog
Three link-time stubs (
libcurl_stub.a,libgit2_stub.a,libnng_stub.a) gate a cluster of features. Two are revivable in the browser (HTTP libraries, local history); one is genuinely impossible (the IPC socket transport). This doc covers those plus the full catalog of what stays off and why — so the "everything web-feasible should work" policy has a clear boundary.
curl → emscripten Fetch (revives HTTP libraries)
wasm/stubs/curl_stub.c makes curl_easy_init() return NULL, so
KICAD_CURL_EASY's ctor throws "Unable to initialize CURL session"
(common/kicad_curl/kicad_curl_easy.cpp:127-130). That kills: the HTTP schematic library
(SCH_IO_HTTP_LIB, which is otherwise compiled and registered — see 08),
the update check, and PCM downloads.
The right move is not porting libcurl (browsers can't do raw TCP; the real libcurl-wasm
ports tunnel TCP over WebSocket proxies — wrong tool). Instead, replace the stub with a
functional implementation of the ~12 curl_easy_* entry points KICAD_CURL_EASY actually
uses (setopt URL/headers/POST/writefunction, perform, getinfo response-code) over the
emscripten Fetch API — Asyncify-friendly (the build already runs full Asyncify), same
pattern as the clipboard. New file in wasm/stubs/, zero KiCad-file changes. Constraint:
target servers must send CORS headers. ~2–4 days. Same shim revives every other curl consumer
(version checks in pgm_base.cpp / build_version.cpp, currently failing silently).
libgit2 → real static build (fixes silently-broken local history)
wasm/stubs/libgit2_stub.c makes all git ops fail with -1. This kills two things:
- Project git integration — UI lives in the
kicadproject-manager (not a wasm target), so mostly moot. - Local history — not moot.
common/local_history.cpp(git-backed save snapshots) is wired into the shipped editors (pcb_edit_frame.cpp,files.cpp,sch_edit_frame.cpp,eda_base_frame.cpp) and currently fails silently on every save. This is a real product gap worth a deliberate decision.
Port (medium, ~1 week): build a real static libgit2.a for wasm (wasm-git /
petersalomonsen proves libgit2 compiles to emscripten cleanly) and drop the stub for the
editors. Local-only commits need no network. Remote push/pull would additionally need
wasm-git's HTTP smart-transport — skip that. Alternatively, if local history isn't a
priority, disable the feature via config so it stops failing silently — but pick one; the
current state (compiled-in, failing every save) is the worst option.
nng / IPC API transport — keep stubbed (impossible)
KICAD_IPC_API=ON builds the API handlers + protobuf (that's what the ON flag is for), but
api_server.cpp / api_plugin_manager.cpp are excluded and kinng isn't linked
(common/CMakeLists.txt). nng is raw sockets and the IPC clients are external OS
processes — neither exists in a browser sandbox. Keep libnng_stub.a.
The mainline-aligned future for plugins (post-SWIG KiCad 11) is this same IPC API, reachable from the browser only via a JS bridge (postMessage/WebSocket) implementing the request/reply surface — a different transport, not nng. That's a separate project; see
../../../features/python/research.md.
The impossible catalog (and why)
| Feature | Why it can't work in a browser |
|---|---|
| 3Dconnexion SpaceMouse / navlib | needs the native 3DxWare driver/daemon; WebHID can't replace the SDK protocol |
| Dynamic KIFACE / DSO loading | no dlopen of native DSOs in wasm; the static single-kiface architecture is correct (kiway.cpp / kiway.h) |
ODBC database (nanodbc) |
driver-manager + native driver model has no browser equivalent (08) |
| nng / IPC transport | raw sockets to external OS processes (above) |
wxUSE_FSWATCHER |
no inotify/kqueue; MEMFS has no change notification and nothing edits files externally |
wxUSE_WEBVIEW |
no browser backend for the wasm port; only the unshipped project-manager uses it |
OS keychain (wxUSE_SECRETSTORE) |
no OS credential service; only insecure approximations (localStorage) exist |
Pointer warping (WarpPointer) |
browsers can't move the OS pointer — handled by zoom-to-cursor (03) |
| System trash / host env / process info | sandbox (kiplatform environment.cpp, sysinfo.cpp) |
PYTHON_MANAGER subprocess execution |
no fork/subprocess in emscripten; an embedded interpreter is the only path (policy-off) |
Policy-off (not impossible — chosen)
- Python scripting —
KICAD_SCRIPTINGOFF + stubs. Stays off per the standing decision; the mainline path is the IPC API, not SWIG (see../../../features/python/research.md). - PCM, update check — networking features the team skipped; the curl shim above would revive the update check if ever wanted.
kicadproject manager,cvpcb,bitmap2component— never given wasm targets; the web app is the "manager" and the product ships per-tool editors (pcbnew, eeschema, symbol_editor, gerbview, pl_editor, calculator).