80 lines
5.2 KiB
Markdown
80 lines
5.2 KiB
Markdown
|
|
# 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](08-importers.md)),
|
|||
|
|
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 `kicad` project-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`](../../../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](08-importers.md)) |
|
|||
|
|
| 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](03-config-not-code.md)) |
|
|||
|
|
| 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_SCRIPTING` OFF + stubs. Stays off per the standing decision;
|
|||
|
|
the mainline path is the IPC API, not SWIG (see
|
|||
|
|
[`../../../features/python/research.md`](../../../features/python/research.md)).
|
|||
|
|
- **PCM, update check** — networking features the team skipped; the curl shim above would
|
|||
|
|
revive the update check if ever wanted.
|
|||
|
|
- **`kicad` project 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).
|