/** * externalReach — "can THIS browser reach the external service?" * * # Why this exists * * Three machines must reach three addresses before the Office editor works, * and until now only one of them was ever checked: * * | address | who must reach it | who checked it | * | ---------------------- | ------------------------------------- | ---------------- | * | the Document Server URL| the **browser** (loads the editor JS) | nobody | * | the Document Server URL| the filex process | the Test button | * | `FILEX_PUBLIC_URL` | the **document server** (fetch + save)| nobody | * * So an operator on podman types `http://onlyoffice`, filex reaches it, Test * goes green, and the browser cannot resolve that name at all. The editor then * fails with the same message as a missing configuration — issue #17, twice. * * The admin page runs **in the browser that will actually open the editor**, * so it can answer the first row directly instead of disclaiming it. That is * what this module does. * * # Mechanism, and why not `fetch` * * ⚠ A plain `fetch()` is the obvious choice and the wrong one: a document * server that works perfectly will usually answer without CORS headers, the * promise rejects, and a naive `catch` reports failure for a healthy service. * * Instead each service is probed **the same way the real viewer loads it**: * * - **onlyoffice** — a `