@decentnetwork/beagle-ui
v0.2.33
Published
The Beagle chat UI, minus the machine it runs on — shared by the desktop install and the browser build.
Readme
@decentnetwork/beagle-ui
The Beagle chat UI, minus the machine it runs on.
Two clients render these components: the desktop install
(@decentnetwork/beagle,
whose local server holds the identity as a file on disk) and the browser build
(beagle-web, where the peer runs inside the tab). They were two copies of the
same files, kept in sync by hand, until the drift was measured — 306 lines
across three files, none of it two implementations of the same thing. This
package is that measurement made permanent.
Using it
import { mount, setUiHost } from "@decentnetwork/beagle-ui";
setUiHost({
fileUrl: (name) => "/api/file-download?name=" + encodeURIComponent(name),
fileDownloadUrl: (name) => "/api/file-download?name=" + encodeURIComponent(name) + "&dl=1",
});
mount(document.getElementById("root"));setUiHost must run before mount — the flags it sets are read during the
first render.
React, ReactDOM, window.PeerWebRTC (calls) and window.ChatComponents (form
messages) are expected as <script> globals. This bundle references them; it
does not import them, so a page never ends up with two copies of React.
The host
Everything the two platforms cannot agree on. A host that supplies nothing gets the simple case: a local server that answers plain URLs.
| key | what it is for |
|---|---|
| fileUrl(name) | a stored file as a URL an <img> can use |
| fileDownloadUrl(name) | the same, for <a download> |
| prefetchThreadFiles(msgs) | resolve a thread's files before it renders |
| DkWelcome | first-run flow |
| DkLockedOut | another tab owns the identity |
| DkBrowserNotice | standing caveat about running in a browser |
| hostNeedsWelcome | run the first-run flow, and refuse a nameless friend request |
| hostPrefersRtcFile | send files over a DataChannel when the peer can take one |
| hostHasKeyBackup | offer to export the keypair |
In a browser, <img src> and <a download> issue native requests that
bypass a patched fetch, so a plain /api/... URL reaches nobody when the peer
lives in the tab — which is why fileUrl exists rather than being hardcoded.
Versioning
Consumers should pin an exact version. The release cadence is manual, and a UI change that reaches an already-published client through a caret range is a change nobody chose to ship.
