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.

packages/hashtree/src/offer.ts
import { httpUrl } from '../../format/src/urls';
export const HASH = /^[a-f0-9]{64}$/;
export const CHUNK_BYTES = 64 * 1024;
export const FANOUT = 128;
export const MAX_BLOB_BYTES = 2 * 1024 * 1024;
export interface FipsProvider {
  /** Compressed transport public key; distinct from the Nostr publisher key. */
  peerId: string;
  seedUrls: string[];
  /** Standard Hashtree TCP/FIPS service when omitted. */
  servicePort?: number;
  /** Absent means that this provider does not advertise server operations. */
  rpcPort?: number;
}
export function parseFipsProviders(value: unknown): FipsProvider[] {
  if (!Array.isArray(value) || value.length > 8) throw new Error('Invalid FIPS providers');
  const port = (value: unknown): number => {
    if (!Number.isInteger(value) || Number(value) < 1 || Number(value) > 65535)
      throw new Error('Invalid FIPS service port');
    return value as number;
  };
  const providers: FipsProvider[] = [];
  for (const raw of value) {
    if (
      !raw ||
      typeof raw !== 'object' ||
      typeof raw.peerId !== 'string' ||
      !/^(02|03)[a-f0-9]{64}$/.test(raw.peerId) ||
      !Array.isArray(raw.seedUrls) ||
      !raw.seedUrls.length ||
      raw.seedUrls.length > 8
    )
      throw new Error('Invalid FIPS provider');
    const seedUrls = [
      ...new Set<string>(
        raw.seedUrls.map((seed: unknown) => {
          if (typeof seed !== 'string' || seed.length > 2048)
            throw new Error('Invalid FIPS seed URL');
          const u = new URL(seed);
          if (!['ws:', 'wss:'].includes(u.protocol) || u.username || u.password || u.hash)
            throw new Error('Invalid FIPS seed URL');
          return u.href;
        }),
      ),
    ];
    const provider: FipsProvider = {
      peerId: raw.peerId,
      seedUrls,
      servicePort: raw.servicePort === undefined ? 39018 : port(raw.servicePort),
      ...(raw.rpcPort !== undefined ? { rpcPort: port(raw.rpcPort) } : {}),
    };
    const existing = providers.find(
      (p) =>
        p.peerId === provider.peerId &&
        p.servicePort === provider.servicePort &&
        p.rpcPort === provider.rpcPort,
    );
    if (existing) {
      existing.seedUrls = [...new Set([...existing.seedUrls, ...seedUrls])].slice(0, 8);
    } else providers.push(provider);
  }
  return providers;
}
export interface TreeOffer {
  version: 1;
  root: string;
  bytes: number;
  chunkBytes: number;
  providers: string[];
  fips?: FipsProvider[];
}
export function parseTree(value: unknown, bytes: number, allowNoProviders = false): TreeOffer {
  const v = value as TreeOffer;
  if (
    !v ||
    v.version !== 1 ||
    !HASH.test(v.root) ||
    v.bytes !== bytes ||
    !Number.isSafeInteger(bytes) ||
    bytes <= 0 ||
    !Number.isInteger(v.chunkBytes) ||
    v.chunkBytes < 16384 ||
    v.chunkBytes > MAX_BLOB_BYTES ||
    !Array.isArray(v.providers) ||
    v.providers.length > 8
  )
    throw new Error('Invalid Hashtree offer');
  const fips = v.fips === undefined ? undefined : parseFipsProviders(v.fips);
  if (!allowNoProviders && !v.providers.length && !fips?.length)
    throw new Error('Invalid Hashtree offer');
  return {
    version: 1,
    root: v.root,
    bytes,
    chunkBytes: v.chunkBytes,
    providers: [...new Set(v.providers.map((p) => httpUrl(p).replace(/\/$/, '')))],
    ...(fips?.length ? { fips } : {}),
  };
}