clone

nostr relays on demand at <name>.bind.ws: claim one with your key, pay in zaps past the free allowance

dependabot/github_actions/actions-9b61906d8b
bindws / src / names.ts
names.ts 3.5K
1// Relay names: what a valid one looks like, which are kept back, and the2// memorable ones handed out for temporary leases.34export const NAME_RE = /^[a-z0-9](?:[a-z0-9-]{1,30}[a-z0-9])?$/;5export const RESERVED = new Set(["www", "api", "admin", "app", "mail", "relay", "relays", "gateway", "static", "cdn", "status", "docs", "help", "support", "abuse", "root", "ns1", "ns2", "smtp", "imap", "ftp"]);67export function validName(name: string): boolean {8 return NAME_RE.test(name) && name.length >= 3 && !RESERVED.has(name);9}1011// Two short lists, read over once for pairings that read badly. A lease name12// is adjective-animal; after a few collisions it falls back to animal plus13// two digits.14export const ADJECTIVES = [15 "amber", "ancient", "autumn", "bold", "brave", "bright", "brisk", "calm", "candid", "cheerful", "civil", "clear", "clever", "cool", "copper", "cosmic", "cozy", "crisp", "curious", "daring",16 "dawn", "deep", "eager", "early", "earnest", "easy", "electric", "fair", "faithful", "fancy", "fine", "fleet", "fluent", "fond", "free", "fresh", "gentle", "gilded", "glad", "golden",17 "good", "graceful", "grand", "green", "happy", "hardy", "hearty", "hidden", "honest", "humble", "icy", "indigo", "ivory", "jade", "jolly", "keen", "kind", "lively", "lucid", "lucky",18 "lunar", "magic", "major", "marble", "mellow", "merry", "mighty", "misty", "modest", "nimble", "noble", "north", "olive", "opal", "patient", "pearl", "plain", "polar", "proud", "quick",19 "quiet", "rapid", "ready", "rosy", "royal", "ruby", "rustic", "sage", "sandy", "scarlet", "serene", "sharp", "silent", "silver", "simple", "sleek", "smart", "snowy", "solar", "solid",20 "sonic", "spry", "steady", "stellar", "still", "stormy", "sunny", "swift", "tidy", "tiny", "true", "velvet", "vivid", "warm", "wild", "windy", "wise", "witty", "young", "zesty",21];22export const ANIMALS = [23 "alpaca", "badger", "beaver", "bison", "bobcat", "camel", "capybara", "cardinal", "caribou", "cheetah", "cobra", "condor", "coyote", "crane", "cricket", "deer", "dingo", "dolphin", "dove", "eagle",24 "egret", "elk", "falcon", "ferret", "finch", "firefly", "fox", "gazelle", "gecko", "gibbon", "giraffe", "goose", "gopher", "heron", "hornet", "ibex", "ibis", "iguana", "impala", "jackal",25 "jaguar", "kestrel", "koala", "lark", "lemur", "leopard", "lion", "lizard", "llama", "lynx", "macaw", "magpie", "manatee", "marlin", "marmot", "marten", "meerkat", "mole", "moose", "moth",26 "narwhal", "newt", "ocelot", "octopus", "orca", "oriole", "osprey", "otter", "owl", "oyster", "panda", "panther", "parrot", "pelican", "penguin", "pike", "plover", "puffin", "puma", "quail",27 "rabbit", "raven", "robin", "salmon", "seal", "shrike", "sparrow", "spider", "squid", "stork", "swan", "tapir", "tern", "tiger", "toucan", "trout", "turtle", "urchin", "viper",28 "vole", "walrus", "wapiti", "weasel", "whale", "wombat", "wren", "yak", "zebra",29];3031export const DEFAULT_LEASE_DAYS = 14;3233// leaseDays reads LEASE_DAYS, falling back to the default.34export function leaseDays(env: { LEASE_DAYS?: string }): number {35 const n = Number(env.LEASE_DAYS);36 return Number.isInteger(n) && n > 0 && n <= 365 ? n : DEFAULT_LEASE_DAYS;37}3839function rand(n: number): number {40 return crypto.getRandomValues(new Uint32Array(1))[0] % n;41}4243// leaseNames yields candidate names, memorable first, until one is free.44export function* leaseNames(): Generator<string> {45 const pick = (list: string[]) => list[rand(list.length)];46 for (let i = 0; i < 8; i++) yield pick(ADJECTIVES) + "-" + pick(ANIMALS);47 for (let i = 0; i < 8; i++) yield pick(ANIMALS) + String(10 + rand(90));48}