Back to Atlas map viewer
SOURCE / PINNED RELEASE

Made of little things.

Atlas map viewer

Release
1d2807e80b44…
Author-recorded commit
43810ed2b368…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-4757dbabc86

Archive hash verified: 8db6876d96c460ac…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

app/src/main.ts
import './napplet-settings';
import './styles.css';
import { MAP_LAYERS } from '../../packages/format/src/index';
import { CompositionMap, type CompositionStats } from '../../packages/renderer/src/composition';
import { initSync } from '../../packages/renderer/pkg/atlas_renderer';
import wasmBase64 from 'atlas-renderer-wasm';
import { PreviewBridge, type ConsumerStatus, type PreviewUpdate } from './bridge';
import { MapComposition } from './composition';

function el<T extends HTMLElement = HTMLElement>(id: string): T {
  const value = document.getElementById(id);
  if (!value) throw new Error(`Missing element ${id}`);
  return value as T;
}
function bytes(value: number) {
  if (value < 1024) return `${value} B`;
  const power = Math.min(3, Math.floor(Math.log(value) / Math.log(1024)));
  return `${(value / 1024 ** power).toFixed(power > 1 ? 2 : 1)} ${['B', 'KiB', 'MiB', 'GiB'][power]}`;
}
let map: CompositionMap | undefined;
let composition: MapComposition | undefined;
let latest: ConsumerStatus | undefined;
let generation = 0, opening = false, closed = false;
let failed: false | 'map' | 'discovery' = false;
const bridge = new PreviewBridge(update);
function diagnostics() {
  if (!latest) return;
  const s = latest.stats;
  el('bytes').textContent = bytes(s.fipsBytes);
  el('blobs').textContent = s.verifiedBlobs.toLocaleString();
  el('reuse').textContent = `${s.cacheHits.toLocaleString()} shell cache hits · ${composition?.cacheHits ?? 0} Atlas cache hits`;
  el('requests').textContent = `${s.networkRequests} FIPS requests · ${s.activeTransfers} active · ${s.queuedTransfers} queued · ${s.retries} retries · ${s.errors} errors · ${s.cancelledRequests} cancelled`;
}
function update(status: PreviewUpdate) {
  if (closed) return;
  if ('catalog' in status) {
    latest = status;
    composition?.setCatalog(status);
    el('discovery').textContent = `${status.catalog.length} signed maps · ${status.discovery.ready ? 'discovery current' : status.discovery.settled ? 'discovery incomplete' : 'discovering…'}`;
    el('publishers').textContent = status.discovery.publishers.join('\n');
    el('relays').textContent = status.discovery.relayUrls.join('\n');
    el('discovery-notes').textContent = status.discovery.messages.join(' · ');
    if (status.state === 'error') fail(status.error ?? 'FIPS discovery failed', 'discovery');
    else if (failed === 'discovery') clearFailure();
    if (status.state === 'closed') { fail('The resource session closed. Reopen the napplet to continue.'); shutdown(); }
  } else if (latest) latest.stats = status.stats;
  diagnostics(); connection();
}
function connection() {
  if (closed || failed) return;
  const active = composition?.active ?? [];
  el('map-name').textContent = active.length === 1 ? active[0].offer.manifest.name : active.length ? `${active.length} maps · one view` : 'Choose maps to explore';
  el('status').textContent = composition?.opening ? 'Opening selected Atlas directories over FIPS…'
    : active.length ? 'Reading over FIPS · geometry first'
    : latest?.catalog.length ? 'Select one or more signed maps below'
    : latest?.discovery.ready ? 'No signed maps found · refresh discovery to try again'
    : 'Discovering signed maps through OUTBOX…';
  document.body.dataset.state = composition?.readyCount ? 'ready' : 'starting';
}
function clearFailure() {
  failed = false; el('error').hidden = true; el('retry').hidden = true;
}
function fail(message: string, kind: 'map' | 'discovery' = 'map') {
  if (closed) return;
  failed = kind;
  el('status').textContent = kind === 'discovery' ? 'Could not discover signed maps · refresh to retry'
    : composition?.readyCount ? 'Some map data could not load · you can keep exploring' : 'Could not open selected maps · retry or refresh discovery';
  el('retry').textContent = kind === 'discovery' ? 'Refresh discovery' : map ? 'Retry map loading' : 'Try connection';
  el('error').textContent = message; el('error').hidden = false;
  el('retry').hidden = false; document.body.dataset.state = 'error';
}
function renderStats(s: CompositionStats) {
  el('zoom').textContent = `z${s.zoom.toFixed(1)}`;
  const complete = s.wanted > 0 && s.tiles === s.wanted && s.missing === 0 && s.loading === 0 && s.labels.loading === 0 && s.labels.missing === 0;
  el('render-status').textContent = `${s.sources} sources in view · ${s.tiles}/${s.wanted} tiles · ${s.triangles.toLocaleString()} triangles${s.loading ? ' · receiving…' : complete ? ' · ready' : ' · partial view'}`;
  if (failed === 'map' && complete && !composition?.errors.length && !composition?.opening && latest?.state !== 'error') {
    clearFailure(); connection();
  }
}
function renderCatalog() {
  if (!composition || closed) return;
  const list = el('catalog'); list.replaceChildren();
  const active = composition.active;
  const ordered = [...active, ...composition.catalog.filter(e => !composition!.isSelected(e))];
  for (const entry of ordered) {
    const row = document.createElement('div'); row.className = 'map-option';
    const label = document.createElement('label');
    const input = document.createElement('input'); input.type = 'checkbox'; input.checked = composition.isSelected(entry);
    input.addEventListener('change', () => composition?.select(entry, input.checked));
    const copy = document.createElement('span');
    const title = document.createElement('strong'); title.textContent = entry.offer.manifest.name;
    const detail = document.createElement('small');
    const imageryOnly = entry.offer.manifest.tileLayers?.length === 0 && !!entry.offer.manifest.rasters?.length;
    detail.textContent = `${composition.state(entry)} · ${bytes(entry.offer.bytes)}${imageryOnly ? ' · enable imagery to display' : ''}`;
    copy.append(title, detail); label.append(input, copy); row.append(label);
    if (input.checked) {
      const raise = document.createElement('button'); raise.type = 'button'; raise.textContent = '↑';
      raise.setAttribute('aria-label', `Move ${entry.offer.manifest.name} above other maps`);
      raise.disabled = active[0]?.key === entry.key;
      raise.addEventListener('click', () => composition?.raise(entry)); row.append(raise);
    }
    list.append(row);
  }
  el('selection').textContent = `${active.length} selected · first map has priority where coverage overlaps`;
  el('roots').textContent = active.map(e => `${e.offer.manifest.name}\n${e.offer.hashtree!.root}`).join('\n\n') || 'No map selected';
  el('provider').textContent = [...new Set(active.flatMap(e => e.offer.hashtree?.fips?.map(p => p.peerId) ?? []))].join('\n') || 'No active FIPS provider';
  diagnostics(); connection();
}
async function start() {
  if (opening || closed || map) return;
  opening = true; failed = false;
  const run = ++generation;
  el('error').hidden = true; el('retry').hidden = true;
  el('status').textContent = 'Discovering signed maps through the shell…';
  try {
    const status = await bridge.status();
    if (closed || run !== generation) return;
    update(status);
    if (closed) return;
    // Embedded bytes initialize WASM before CompositionMap's shared loader is called.
    initSync({ module: Uint8Array.from(atob(wasmBase64), c => c.charCodeAt(0)) });
    if (closed || run !== generation) return;
    let created: CompositionMap | undefined;
    const current = () => !closed && run === generation && created !== undefined && map === created;
    created = await CompositionMap.create(el<HTMLCanvasElement>('map'),
      stats => { if (current()) renderStats(stats); },
      (id, message) => { if (current() && composition?.active.some(e => e.key === id)) fail(message); });
    if (closed || run !== generation) { created.destroy(); return; }
    map = created;
    composition = new MapComposition(map, bridge, renderCatalog, fail, diagnostics);
    composition.setLayers(MAP_LAYERS.filter(layer => el<HTMLInputElement>(`layer-${layer}`).checked));
    composition.setLabels({ places: el<HTMLInputElement>('labels-places').checked,
      streets: el<HTMLInputElement>('labels-streets').checked, pois: el<HTMLInputElement>('labels-pois').checked });
    composition.setImagery(el<HTMLInputElement>('imagery').checked);
    map.coverage = el<HTMLInputElement>('coverage').checked;
    composition.setCatalog(latest ?? status);
    for (const id of ['zoom-in', 'zoom-out', 'fit']) el<HTMLButtonElement>(id).disabled = false;
    connection();
  } catch (error) { if (!closed && run === generation) fail(error instanceof Error ? error.message : String(error)); }
  finally { opening = false; }
}
for (const layer of MAP_LAYERS) {
  const label = document.createElement('label'), input = document.createElement('input');
  input.type = 'checkbox'; input.checked = true; input.value = layer;
  input.addEventListener('change', () => composition?.setLayers(MAP_LAYERS.filter(l => el<HTMLInputElement>(`layer-${l}`).checked)));
  input.id = `layer-${layer}`; label.append(input, document.createTextNode(layer)); el('layers').append(label);
}
for (const label of ['places', 'streets', 'pois'] as const) el(`labels-${label}`).addEventListener('change', () => composition?.setLabels({
  places: el<HTMLInputElement>('labels-places').checked,
  streets: el<HTMLInputElement>('labels-streets').checked,
  pois: el<HTMLInputElement>('labels-pois').checked,
}));
el('imagery').addEventListener('change', () => composition?.setImagery(el<HTMLInputElement>('imagery').checked));
el('coverage').addEventListener('change', () => { if (map) { map.coverage = el<HTMLInputElement>('coverage').checked; map.invalidate(); } });
el('zoom-in').addEventListener('click', () => map?.zoomBy(1));
el('zoom-out').addEventListener('click', () => map?.zoomBy(-1));
el('fit').addEventListener('click', () => map?.fit());
async function refresh() {
  const button = el<HTMLButtonElement>('refresh'); button.disabled = true;
  try { update(await bridge.refresh()); if (!map) await start(); }
  catch (error) { fail(error instanceof Error ? error.message : String(error)); }
  finally { if (!closed) button.disabled = false; }
}
el('refresh').addEventListener('click', () => { void refresh(); });
el('retry').addEventListener('click', () => {
  if (failed === 'discovery') { void refresh(); return; }
  if (!map) { void start(); return; }
  composition?.retry();
  el('status').textContent = 'Retrying missing map data…';
});
function shutdown() {
  if (closed) return;
  closed = true; generation++;
  composition?.dispose(); map?.destroy(); bridge.dispose();
  for (const id of ['zoom-in', 'zoom-out', 'fit', 'refresh', 'retry']) el<HTMLButtonElement>(id).disabled = true;
}
window.addEventListener('pagehide', shutdown, { once: true });
void start();