@outray/runtime-shared 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +4 -2
- package/dist/chunk-7Z55KL36.js +1111 -0
- package/dist/chunk-7Z55KL36.js.map +1 -0
- package/dist/chunk-EBXUVSOO.js +37 -0
- package/dist/chunk-EBXUVSOO.js.map +1 -0
- package/dist/chunk-XAMVXW6B.js +19 -0
- package/dist/chunk-XAMVXW6B.js.map +1 -0
- package/dist/durable-queue.cjs +316 -0
- package/dist/durable-queue.cjs.map +1 -0
- package/dist/durable-queue.d.cts +41 -0
- package/dist/durable-queue.d.ts +41 -0
- package/dist/durable-queue.js +290 -0
- package/dist/durable-queue.js.map +1 -0
- package/dist/helpers.cjs +1167 -0
- package/dist/helpers.cjs.map +1 -0
- package/dist/helpers.d.cts +6 -0
- package/dist/helpers.d.ts +6 -0
- package/dist/helpers.js +14 -0
- package/dist/helpers.js.map +1 -0
- package/dist/postgres-ssl.cjs +37 -0
- package/dist/postgres-ssl.cjs.map +1 -0
- package/dist/postgres-ssl.d.cts +9 -0
- package/dist/postgres-ssl.d.ts +9 -0
- package/dist/postgres-ssl.js +12 -0
- package/dist/postgres-ssl.js.map +1 -0
- package/dist/protocol.cjs +38 -0
- package/dist/protocol.cjs.map +1 -0
- package/dist/protocol.d.cts +8 -0
- package/dist/protocol.d.ts +8 -0
- package/dist/protocol.js +13 -0
- package/dist/protocol.js.map +1 -0
- package/dist/public-hosts.cjs +116 -0
- package/dist/public-hosts.cjs.map +1 -0
- package/dist/public-hosts.d.cts +29 -0
- package/dist/public-hosts.d.ts +29 -0
- package/dist/public-hosts.js +82 -0
- package/dist/public-hosts.js.map +1 -0
- package/dist/tunnel-accounting.cjs +71 -0
- package/dist/tunnel-accounting.cjs.map +1 -0
- package/dist/tunnel-accounting.d.cts +12 -0
- package/dist/tunnel-accounting.d.ts +12 -0
- package/dist/tunnel-accounting.js +32 -0
- package/dist/tunnel-accounting.js.map +1 -0
- package/dist/tunnel-product-usage.cjs +107 -0
- package/dist/tunnel-product-usage.cjs.map +1 -0
- package/dist/tunnel-product-usage.d.cts +26 -0
- package/dist/tunnel-product-usage.d.ts +26 -0
- package/dist/tunnel-product-usage.js +81 -0
- package/dist/tunnel-product-usage.js.map +1 -0
- package/dist/types.cjs +19 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +105 -0
- package/dist/types.d.ts +105 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/usage-writer.cjs +43 -0
- package/dist/usage-writer.cjs.map +1 -0
- package/dist/usage-writer.d.cts +14 -0
- package/dist/usage-writer.d.ts +14 -0
- package/dist/usage-writer.js +7 -0
- package/dist/usage-writer.js.map +1 -0
- package/dist/utils.cjs +1171 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +2 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +19 -0
- package/dist/utils.js.map +1 -0
- package/dist/words.cjs +1136 -0
- package/dist/words.cjs.map +1 -0
- package/dist/words.d.cts +4 -0
- package/dist/words.d.ts +4 -0
- package/dist/words.js +9 -0
- package/dist/words.js.map +1 -0
- package/package.json +89 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/helpers.ts","../src/words.ts"],"sourcesContent":["import { ADJECTIVES, NOUNS } from \"./words\";\n\nexport function generateId(prefix: string = \"\"): string {\n const random = Math.random().toString(36).substring(2, 15);\n return prefix ? `${prefix}_${random}` : random;\n}\n\nexport function generateSubdomain(): string {\n const adj = ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)];\n const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)];\n return `${adj}-${noun}`.toLowerCase().replace(/[^a-z0-9-]/g, \"\");\n}\n\nexport function extractSubdomain(\n host: string,\n baseDomain: string,\n): string | null {\n if (!host) return null;\n\n const cleanHost = host.split(\":\")[0].replace(/\\.$/, \"\").toLowerCase();\n const base = baseDomain.toLowerCase();\n\n if (cleanHost === base) return null;\n if (!cleanHost.endsWith(`.${base}`)) return null;\n\n const sub = cleanHost.slice(0, cleanHost.length - base.length - 1);\n return sub || null;\n}\n\nexport function getBandwidthKey(organizationId: string, date = new Date()): string {\n const year = date.getUTCFullYear();\n const month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n return `bw:${organizationId}:${year}-${month}`;\n}\n","export const ADJECTIVES = [\n \"happy\",\n \"sad\",\n \"angry\",\n \"excited\",\n \"nervous\",\n \"calm\",\n \"brave\",\n \"scared\",\n \"silly\",\n \"serious\",\n \"funny\",\n \"boring\",\n \"loud\",\n \"quiet\",\n \"fast\",\n \"slow\",\n \"big\",\n \"small\",\n \"tall\",\n \"short\",\n \"fat\",\n \"thin\",\n \"hot\",\n \"cold\",\n \"warm\",\n \"cool\",\n \"wet\",\n \"dry\",\n \"hard\",\n \"soft\",\n \"rough\",\n \"smooth\",\n \"heavy\",\n \"light\",\n \"dark\",\n \"bright\",\n \"clean\",\n \"dirty\",\n \"good\",\n \"bad\",\n \"new\",\n \"old\",\n \"young\",\n \"rich\",\n \"poor\",\n \"strong\",\n \"weak\",\n \"easy\",\n \"difficult\",\n \"simple\",\n \"complex\",\n \"beautiful\",\n \"ugly\",\n \"smart\",\n \"stupid\",\n \"crazy\",\n \"sane\",\n \"polite\",\n \"rude\",\n \"kind\",\n \"cruel\",\n \"honest\",\n \"dishonest\",\n \"loyal\",\n \"disloyal\",\n \"generous\",\n \"stingy\",\n \"friendly\",\n \"unfriendly\",\n \"lucky\",\n \"unlucky\",\n \"healthy\",\n \"sick\",\n \"safe\",\n \"dangerous\",\n \"free\",\n \"busy\",\n \"lazy\",\n \"active\",\n \"passive\",\n \"creative\",\n \"destructive\",\n \"positive\",\n \"negative\",\n \"optimistic\",\n \"pessimistic\",\n \"realistic\",\n \"idealistic\",\n \"practical\",\n \"impractical\",\n \"logical\",\n \"illogical\",\n \"rational\",\n \"irrational\",\n \"emotional\",\n \"unemotional\",\n \"sensitive\",\n \"insensitive\",\n \"sympathetic\",\n \"unsympathetic\",\n \"compassionate\",\n \"uncompassionate\",\n \"tolerant\",\n \"intolerant\",\n \"patient\",\n \"impatient\",\n \"humble\",\n \"arrogant\",\n \"modest\",\n \"immodest\",\n \"confident\",\n \"insecure\",\n \"shy\",\n \"outgoing\",\n \"introverted\",\n \"extroverted\",\n \"ambitious\",\n \"unambitious\",\n \"adventurous\",\n \"unadventurous\",\n \"cautious\",\n \"reckless\",\n \"careful\",\n \"careless\",\n \"responsible\",\n \"irresponsible\",\n \"reliable\",\n \"unreliable\",\n \"trustworthy\",\n \"untrustworthy\",\n \"honest\",\n \"dishonest\",\n \"loyal\",\n \"disloyal\",\n \"generous\",\n \"stingy\",\n \"friendly\",\n \"unfriendly\",\n \"lucky\",\n \"unlucky\",\n \"healthy\",\n \"sick\",\n \"safe\",\n \"dangerous\",\n \"free\",\n \"busy\",\n \"lazy\",\n \"active\",\n \"passive\",\n \"creative\",\n \"destructive\",\n \"positive\",\n \"negative\",\n \"optimistic\",\n \"pessimistic\",\n \"realistic\",\n \"idealistic\",\n \"practical\",\n \"impractical\",\n \"logical\",\n \"illogical\",\n \"rational\",\n \"irrational\",\n \"emotional\",\n \"unemotional\",\n \"sensitive\",\n \"insensitive\",\n \"sympathetic\",\n \"unsympathetic\",\n \"compassionate\",\n \"uncompassionate\",\n \"tolerant\",\n \"intolerant\",\n \"patient\",\n \"impatient\",\n \"humble\",\n \"arrogant\",\n \"modest\",\n \"immodest\",\n \"confident\",\n \"insecure\",\n \"shy\",\n \"outgoing\",\n \"introverted\",\n \"extroverted\",\n \"ambitious\",\n \"unambitious\",\n \"adventurous\",\n \"unadventurous\",\n \"cautious\",\n \"reckless\",\n \"careful\",\n \"careless\",\n \"responsible\",\n \"irresponsible\",\n \"reliable\",\n \"unreliable\",\n \"trustworthy\",\n \"untrustworthy\",\n];\n\nexport const NOUNS = [\n \"dog\",\n \"cat\",\n \"bird\",\n \"fish\",\n \"horse\",\n \"cow\",\n \"pig\",\n \"sheep\",\n \"goat\",\n \"chicken\",\n \"duck\",\n \"goose\",\n \"turkey\",\n \"rabbit\",\n \"mouse\",\n \"rat\",\n \"hamster\",\n \"guinea pig\",\n \"snake\",\n \"lizard\",\n \"turtle\",\n \"frog\",\n \"toad\",\n \"spider\",\n \"ant\",\n \"bee\",\n \"wasp\",\n \"butterfly\",\n \"moth\",\n \"fly\",\n \"mosquito\",\n \"beetle\",\n \"cockroach\",\n \"worm\",\n \"snail\",\n \"slug\",\n \"crab\",\n \"lobster\",\n \"shrimp\",\n \"octopus\",\n \"squid\",\n \"jellyfish\",\n \"starfish\",\n \"shark\",\n \"whale\",\n \"dolphin\",\n \"seal\",\n \"walrus\",\n \"penguin\",\n \"polar bear\",\n \"bear\",\n \"lion\",\n \"tiger\",\n \"leopard\",\n \"cheetah\",\n \"jaguar\",\n \"panther\",\n \"wolf\",\n \"fox\",\n \"coyote\",\n \"hyena\",\n \"jackal\",\n \"elephant\",\n \"rhinoceros\",\n \"hippopotamus\",\n \"giraffe\",\n \"zebra\",\n \"camel\",\n \"llama\",\n \"alpaca\",\n \"kangaroo\",\n \"koala\",\n \"panda\",\n \"monkey\",\n \"ape\",\n \"gorilla\",\n \"chimpanzee\",\n \"orangutan\",\n \"baboon\",\n \"lemur\",\n \"sloth\",\n \"armadillo\",\n \"anteater\",\n \"bat\",\n \"squirrel\",\n \"chipmunk\",\n \"beaver\",\n \"otter\",\n \"raccoon\",\n \"skunk\",\n \"badger\",\n \"weasel\",\n \"ferret\",\n \"mink\",\n \"stoat\",\n \"mongoose\",\n \"meerkat\",\n \"porcupine\",\n \"hedgehog\",\n \"mole\",\n \"shrew\",\n \"platypus\",\n \"echidna\",\n \"opossum\",\n \"kangaroo\",\n \"wallaby\",\n \"wombat\",\n \"koala\",\n \"tasmanian devil\",\n \"dingo\",\n \"emu\",\n \"cassowary\",\n \"kiwi\",\n \"ostrich\",\n \"rhea\",\n \"flamingo\",\n \"stork\",\n \"heron\",\n \"crane\",\n \"pelican\",\n \"seagull\",\n \"albatross\",\n \"eagle\",\n \"hawk\",\n \"falcon\",\n \"owl\",\n \"vulture\",\n \"parrot\",\n \"cockatoo\",\n \"macaw\",\n \"parakeet\",\n \"budgerigar\",\n \"canary\",\n \"finch\",\n \"sparrow\",\n \"robin\",\n \"bluebird\",\n \"cardinal\",\n \"woodpecker\",\n \"hummingbird\",\n \"pigeon\",\n \"dove\",\n \"crow\",\n \"raven\",\n \"magpie\",\n \"jay\",\n \"swallow\",\n \"swift\",\n \"martin\",\n \"thrush\",\n \"wren\",\n \"starling\",\n \"blackbird\",\n \"lark\",\n \"nightingale\",\n \"cuckoo\",\n \"kingfisher\",\n \"toucan\",\n \"hornbill\",\n \"hoopoe\",\n \"roller\",\n \"bee-eater\",\n \"motmot\",\n \"tody\",\n \"jacamar\",\n \"puffbird\",\n \"barbet\",\n \"honeyguide\",\n \"woodpecker\",\n \"wryneck\",\n \"piculet\",\n \"flicker\",\n \"sapsucker\",\n \"honeycreeper\",\n \"flowerpecker\",\n \"sunbird\",\n \"spiderhunter\",\n \"white-eye\",\n \"waxbill\",\n \"munia\",\n \"mannikin\",\n \"silver\",\n \"gold\",\n \"copper\",\n \"iron\",\n \"steel\",\n \"aluminum\",\n \"lead\",\n \"tin\",\n \"zinc\",\n \"nickel\",\n \"platinum\",\n \"titanium\",\n \"mercury\",\n \"uranium\",\n \"plutonium\",\n \"diamond\",\n \"ruby\",\n \"emerald\",\n \"sapphire\",\n \"topaz\",\n \"opal\",\n \"pearl\",\n \"jade\",\n \"amethyst\",\n \"garnet\",\n \"turquoise\",\n \"aquamarine\",\n \"peridot\",\n \"citrine\",\n \"zircon\",\n \"spinel\",\n \"tourmaline\",\n \"quartz\",\n \"agate\",\n \"onyx\",\n \"jasper\",\n \"bloodstone\",\n \"moonstone\",\n \"sunstone\",\n \"labradorite\",\n \"amazonite\",\n \"rhodonite\",\n \"rhodochrosite\",\n \"malachite\",\n \"azurite\",\n \"lapis lazuli\",\n \"sodalite\",\n \"calcite\",\n \"fluorite\",\n \"gypsum\",\n \"talc\",\n \"mica\",\n \"feldspar\",\n \"granite\",\n \"marble\",\n \"limestone\",\n \"sandstone\",\n \"shale\",\n \"slate\",\n \"schist\",\n \"gneiss\",\n \"basalt\",\n \"obsidian\",\n \"pumice\",\n \"scoria\",\n \"tuff\",\n \"breccia\",\n \"conglomerate\",\n \"coal\",\n \"peat\",\n \"oil\",\n \"gas\",\n \"water\",\n \"ice\",\n \"steam\",\n \"cloud\",\n \"rain\",\n \"snow\",\n \"hail\",\n \"sleet\",\n \"fog\",\n \"mist\",\n \"dew\",\n \"frost\",\n \"wind\",\n \"storm\",\n \"thunder\",\n \"lightning\",\n \"tornado\",\n \"hurricane\",\n \"typhoon\",\n \"cyclone\",\n \"monsoon\",\n \"drought\",\n \"flood\",\n \"earthquake\",\n \"volcano\",\n \"tsunami\",\n \"avalanche\",\n \"landslide\",\n \"mudslide\",\n \"fire\",\n \"smoke\",\n \"ash\",\n \"dust\",\n \"sand\",\n \"soil\",\n \"dirt\",\n \"mud\",\n \"clay\",\n \"silt\",\n \"loam\",\n \"gravel\",\n \"pebble\",\n \"rock\",\n \"stone\",\n \"boulder\",\n \"mountain\",\n \"hill\",\n \"valley\",\n \"canyon\",\n \"plain\",\n \"plateau\",\n \"desert\",\n \"forest\",\n \"jungle\",\n \"swamp\",\n \"marsh\",\n \"bog\",\n \"fen\",\n \"lake\",\n \"pond\",\n \"river\",\n \"stream\",\n \"creek\",\n \"brook\",\n \"ocean\",\n \"sea\",\n \"bay\",\n \"gulf\",\n \"cove\",\n \"inlet\",\n \"strait\",\n \"channel\",\n \"canal\",\n \"island\",\n \"peninsula\",\n \"cape\",\n \"isthmus\",\n \"delta\",\n \"estuary\",\n \"lagoon\",\n \"reef\",\n \"atoll\",\n \"archipelago\",\n \"continent\",\n \"country\",\n \"state\",\n \"province\",\n \"county\",\n \"city\",\n \"town\",\n \"village\",\n \"hamlet\",\n \"suburb\",\n \"neighborhood\",\n \"street\",\n \"road\",\n \"avenue\",\n \"boulevard\",\n \"lane\",\n \"drive\",\n \"court\",\n \"place\",\n \"square\",\n \"plaza\",\n \"park\",\n \"garden\",\n \"yard\",\n \"lawn\",\n \"field\",\n \"meadow\",\n \"pasture\",\n \"orchard\",\n \"vineyard\",\n \"farm\",\n \"ranch\",\n \"plantation\",\n \"factory\",\n \"mill\",\n \"plant\",\n \"workshop\",\n \"warehouse\",\n \"store\",\n \"shop\",\n \"market\",\n \"mall\",\n \"supermarket\",\n \"grocery\",\n \"bakery\",\n \"butcher\",\n \"pharmacy\",\n \"drugstore\",\n \"hospital\",\n \"clinic\",\n \"doctor\",\n \"dentist\",\n \"nurse\",\n \"school\",\n \"college\",\n \"university\",\n \"library\",\n \"museum\",\n \"theater\",\n \"cinema\",\n \"stadium\",\n \"arena\",\n \"gym\",\n \"pool\",\n \"beach\",\n \"hotel\",\n \"motel\",\n \"inn\",\n \"hostel\",\n \"restaurant\",\n \"cafe\",\n \"bar\",\n \"pub\",\n \"club\",\n \"disco\",\n \"casino\",\n \"bank\",\n \"post office\",\n \"police station\",\n \"fire station\",\n \"jail\",\n \"prison\",\n \"courthouse\",\n \"church\",\n \"cathedral\",\n \"temple\",\n \"mosque\",\n \"synagogue\",\n \"shrine\",\n \"monument\",\n \"statue\",\n \"fountain\",\n \"bridge\",\n \"tunnel\",\n \"dam\",\n \"reservoir\",\n \"power plant\",\n \"airport\",\n \"station\",\n \"port\",\n \"harbor\",\n \"dock\",\n \"pier\",\n \"wharf\",\n \"lighthouse\",\n \"beacon\",\n \"tower\",\n \"skyscraper\",\n \"building\",\n \"house\",\n \"apartment\",\n \"condo\",\n \"flat\",\n \"room\",\n \"kitchen\",\n \"bedroom\",\n \"bathroom\",\n \"living room\",\n \"dining room\",\n \"hall\",\n \"corridor\",\n \"stairs\",\n \"elevator\",\n \"escalator\",\n \"door\",\n \"window\",\n \"wall\",\n \"floor\",\n \"ceiling\",\n \"roof\",\n \"chimney\",\n \"fireplace\",\n \"stove\",\n \"oven\",\n \"fridge\",\n \"freezer\",\n \"sink\",\n \"toilet\",\n \"shower\",\n \"bath\",\n \"bed\",\n \"sofa\",\n \"chair\",\n \"table\",\n \"desk\",\n \"lamp\",\n \"light\",\n \"fan\",\n \"heater\",\n \"ac\",\n \"tv\",\n \"radio\",\n \"computer\",\n \"phone\",\n \"clock\",\n \"watch\",\n \"camera\",\n \"book\",\n \"pen\",\n \"pencil\",\n \"paper\",\n \"bag\",\n \"box\",\n \"bottle\",\n \"cup\",\n \"plate\",\n \"bowl\",\n \"spoon\",\n \"fork\",\n \"knife\",\n \"clothes\",\n \"shirt\",\n \"pants\",\n \"dress\",\n \"skirt\",\n \"coat\",\n \"jacket\",\n \"hat\",\n \"shoes\",\n \"socks\",\n \"underwear\",\n \"jewelry\",\n \"ring\",\n \"necklace\",\n \"bracelet\",\n \"earrings\",\n \"glasses\",\n \"sunglasses\",\n \"wallet\",\n \"purse\",\n \"money\",\n \"card\",\n \"key\",\n \"lock\",\n \"car\",\n \"truck\",\n \"bus\",\n \"van\",\n \"motorcycle\",\n \"bicycle\",\n \"scooter\",\n \"skateboard\",\n \"skates\",\n \"boat\",\n \"ship\",\n \"plane\",\n \"helicopter\",\n \"rocket\",\n \"train\",\n \"subway\",\n \"tram\",\n \"taxi\",\n \"ambulance\",\n \"police car\",\n \"fire truck\",\n \"tractor\",\n \"bulldozer\",\n \"crane\",\n \"forklift\",\n \"robot\",\n \"machine\",\n \"engine\",\n \"motor\",\n \"battery\",\n \"fuel\",\n \"energy\",\n \"power\",\n \"force\",\n \"motion\",\n \"speed\",\n \"time\",\n \"space\",\n \"matter\",\n \"atom\",\n \"molecule\",\n \"cell\",\n \"gene\",\n \"dna\",\n \"life\",\n \"death\",\n \"birth\",\n \"growth\",\n \"health\",\n \"disease\",\n \"pain\",\n \"pleasure\",\n \"love\",\n \"hate\",\n \"fear\",\n \"anger\",\n \"joy\",\n \"sadness\",\n \"surprise\",\n \"disgust\",\n \"hope\",\n \"despair\",\n \"faith\",\n \"doubt\",\n \"belief\",\n \"knowledge\",\n \"wisdom\",\n \"truth\",\n \"lie\",\n \"fact\",\n \"fiction\",\n \"story\",\n \"poem\",\n \"song\",\n \"music\",\n \"art\",\n \"science\",\n \"math\",\n \"history\",\n \"geography\",\n \"language\",\n \"word\",\n \"letter\",\n \"number\",\n \"symbol\",\n \"sign\",\n \"signal\",\n \"code\",\n \"data\",\n \"info\",\n \"news\",\n \"message\",\n \"letter\",\n \"email\",\n \"text\",\n \"call\",\n \"chat\",\n \"talk\",\n \"speech\",\n \"voice\",\n \"sound\",\n \"noise\",\n \"silence\",\n \"light\",\n \"darkness\",\n \"color\",\n \"shape\",\n \"size\",\n \"weight\",\n \"height\",\n \"width\",\n \"depth\",\n \"length\",\n \"distance\",\n \"area\",\n \"volume\",\n \"mass\",\n \"density\",\n \"temperature\",\n \"pressure\",\n \"force\",\n \"energy\",\n \"power\",\n \"work\",\n \"heat\",\n \"cold\",\n \"hot\",\n \"warm\",\n \"cool\",\n \"wet\",\n \"dry\",\n \"hard\",\n \"soft\",\n \"rough\",\n \"smooth\",\n \"heavy\",\n \"light\",\n \"fast\",\n \"slow\",\n \"strong\",\n \"weak\",\n \"good\",\n \"bad\",\n \"right\",\n \"wrong\",\n \"true\",\n \"false\",\n \"yes\",\n \"no\",\n \"maybe\",\n \"perhaps\",\n \"possibly\",\n \"probably\",\n \"certainly\",\n \"definitely\",\n \"absolutely\",\n \"exactly\",\n \"precisely\",\n \"clearly\",\n \"obviously\",\n \"naturally\",\n \"normally\",\n \"usually\",\n \"often\",\n \"sometimes\",\n \"rarely\",\n \"never\",\n \"always\",\n \"forever\",\n \"eternity\",\n \"infinity\",\n \"universe\",\n \"world\",\n \"earth\",\n \"sun\",\n \"moon\",\n \"star\",\n \"planet\",\n \"galaxy\",\n \"cosmos\",\n \"nature\",\n \"environment\",\n \"ecology\",\n \"biology\",\n \"chemistry\",\n \"physics\",\n \"astronomy\",\n \"geology\",\n \"meteorology\",\n \"psychology\",\n \"sociology\",\n \"philosophy\",\n \"religion\",\n \"politics\",\n \"economics\",\n \"business\",\n \"finance\",\n \"marketing\",\n \"management\",\n \"law\",\n \"justice\",\n \"crime\",\n \"punishment\",\n \"war\",\n \"peace\",\n \"freedom\",\n \"liberty\",\n \"rights\",\n \"duty\",\n \"responsibility\",\n \"authority\",\n \"power\",\n \"control\",\n \"influence\",\n \"leadership\",\n \"government\",\n \"democracy\",\n \"republic\",\n \"monarchy\",\n \"dictatorship\",\n \"communism\",\n \"socialism\",\n \"capitalism\",\n \"fascism\",\n \"anarchy\",\n \"revolution\",\n \"rebellion\",\n \"protest\",\n \"strike\",\n \"riot\",\n \"chaos\",\n \"order\",\n \"system\",\n \"structure\",\n \"organization\",\n \"institution\",\n \"community\",\n \"society\",\n \"culture\",\n \"civilization\",\n \"humanity\",\n \"mankind\",\n \"people\",\n \"person\",\n \"individual\",\n \"group\",\n \"team\",\n \"family\",\n \"friend\",\n \"enemy\",\n \"stranger\",\n \"neighbor\",\n \"citizen\",\n \"alien\",\n \"immigrant\",\n \"refugee\",\n \"tourist\",\n \"visitor\",\n \"guest\",\n \"host\",\n \"customer\",\n \"client\",\n \"patient\",\n \"student\",\n \"teacher\",\n \"worker\",\n \"boss\",\n \"leader\",\n \"follower\",\n \"hero\",\n \"villain\",\n \"victim\",\n \"criminal\",\n \"prisoner\",\n \"slave\",\n \"master\",\n \"servant\",\n \"king\",\n \"queen\",\n \"prince\",\n \"princess\",\n \"duke\",\n \"duchess\",\n \"lord\",\n \"lady\",\n \"knight\",\n \"dame\",\n \"baron\",\n \"baroness\",\n \"count\",\n \"countess\",\n \"emperor\",\n \"empress\",\n \"president\",\n \"minister\",\n \"governor\",\n \"mayor\",\n \"senator\",\n \"representative\",\n \"judge\",\n \"lawyer\",\n \"doctor\",\n \"nurse\",\n \"engineer\",\n \"scientist\",\n \"artist\",\n \"writer\",\n \"musician\",\n \"actor\",\n \"actress\",\n \"director\",\n \"producer\",\n \"designer\",\n \"architect\",\n \"builder\",\n \"farmer\",\n \"driver\",\n \"pilot\",\n \"sailor\",\n \"soldier\",\n \"police\",\n \"firefighter\",\n \"priest\",\n \"monk\",\n \"nun\",\n \"pope\",\n \"bishop\",\n \"rabbi\",\n \"imam\",\n \"guru\",\n \"prophet\",\n \"saint\",\n \"angel\",\n \"devil\",\n \"demon\",\n \"ghost\",\n \"spirit\",\n \"soul\",\n \"mind\",\n \"body\",\n \"heart\",\n \"brain\",\n \"blood\",\n \"bone\",\n \"skin\",\n \"hair\",\n \"eye\",\n \"ear\",\n \"nose\",\n \"mouth\",\n \"tooth\",\n \"tongue\",\n \"hand\",\n \"foot\",\n \"arm\",\n \"leg\",\n \"finger\",\n \"toe\",\n \"head\",\n \"face\",\n \"neck\",\n \"shoulder\",\n \"chest\",\n \"back\",\n \"stomach\",\n \"waist\",\n \"hip\",\n \"knee\",\n \"ankle\",\n \"elbow\",\n \"wrist\",\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,QAAQ;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AD9kCO,SAAS,WAAW,SAAiB,IAAY;AACtD,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AACzD,SAAO,SAAS,GAAG,MAAM,IAAI,MAAM,KAAK;AAC1C;AAEO,SAAS,oBAA4B;AAC1C,QAAM,MAAM,WAAW,KAAK,MAAM,KAAK,OAAO,IAAI,WAAW,MAAM,CAAC;AACpE,QAAM,OAAO,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,MAAM,CAAC;AAC3D,SAAO,GAAG,GAAG,IAAI,IAAI,GAAG,YAAY,EAAE,QAAQ,eAAe,EAAE;AACjE;AAEO,SAAS,iBACd,MACA,YACe;AACf,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,YAAY,KAAK,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,OAAO,EAAE,EAAE,YAAY;AACpE,QAAM,OAAO,WAAW,YAAY;AAEpC,MAAI,cAAc,KAAM,QAAO;AAC/B,MAAI,CAAC,UAAU,SAAS,IAAI,IAAI,EAAE,EAAG,QAAO;AAE5C,QAAM,MAAM,UAAU,MAAM,GAAG,UAAU,SAAS,KAAK,SAAS,CAAC;AACjE,SAAO,OAAO;AAChB;AAEO,SAAS,gBAAgB,gBAAwB,OAAO,oBAAI,KAAK,GAAW;AACjF,QAAM,OAAO,KAAK,eAAe;AACjC,QAAM,QAAQ,OAAO,KAAK,YAAY,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AAC5D,SAAO,MAAM,cAAc,IAAI,IAAI,IAAI,KAAK;AAC9C;","names":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare function generateId(prefix?: string): string;
|
|
2
|
+
declare function generateSubdomain(): string;
|
|
3
|
+
declare function extractSubdomain(host: string, baseDomain: string): string | null;
|
|
4
|
+
declare function getBandwidthKey(organizationId: string, date?: Date): string;
|
|
5
|
+
|
|
6
|
+
export { extractSubdomain, generateId, generateSubdomain, getBandwidthKey };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare function generateId(prefix?: string): string;
|
|
2
|
+
declare function generateSubdomain(): string;
|
|
3
|
+
declare function extractSubdomain(host: string, baseDomain: string): string | null;
|
|
4
|
+
declare function getBandwidthKey(organizationId: string, date?: Date): string;
|
|
5
|
+
|
|
6
|
+
export { extractSubdomain, generateId, generateSubdomain, getBandwidthKey };
|
package/dist/helpers.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {
|
|
2
|
+
extractSubdomain,
|
|
3
|
+
generateId,
|
|
4
|
+
generateSubdomain,
|
|
5
|
+
getBandwidthKey
|
|
6
|
+
} from "./chunk-EBXUVSOO.js";
|
|
7
|
+
import "./chunk-7Z55KL36.js";
|
|
8
|
+
export {
|
|
9
|
+
extractSubdomain,
|
|
10
|
+
generateId,
|
|
11
|
+
generateSubdomain,
|
|
12
|
+
getBandwidthKey
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/postgres-ssl.ts
|
|
21
|
+
var postgres_ssl_exports = {};
|
|
22
|
+
__export(postgres_ssl_exports, {
|
|
23
|
+
default: () => postgres_ssl_default,
|
|
24
|
+
postgresSsl: () => postgresSsl
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(postgres_ssl_exports);
|
|
27
|
+
function postgresSsl(connectionString, rejectUnauthorized = true) {
|
|
28
|
+
const url = new URL(connectionString);
|
|
29
|
+
if (url.searchParams.get("sslmode") === "disable" || ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname)) return false;
|
|
30
|
+
return { rejectUnauthorized };
|
|
31
|
+
}
|
|
32
|
+
var postgres_ssl_default = { postgresSsl };
|
|
33
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
34
|
+
0 && (module.exports = {
|
|
35
|
+
postgresSsl
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=postgres-ssl.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/postgres-ssl.ts"],"sourcesContent":["/** Explicit sslmode=disable supports private Docker networks, not just localhost. */\nexport function postgresSsl(connectionString: string, rejectUnauthorized = true) {\n const url = new URL(connectionString);\n if (url.searchParams.get(\"sslmode\") === \"disable\" ||\n [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname)) return false;\n return { rejectUnauthorized };\n}\n\nexport default { postgresSsl };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,SAAS,YAAY,kBAA0B,qBAAqB,MAAM;AAC/E,QAAM,MAAM,IAAI,IAAI,gBAAgB;AACpC,MAAI,IAAI,aAAa,IAAI,SAAS,MAAM,aACpC,CAAC,aAAa,aAAa,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAG,QAAO;AACvE,SAAO,EAAE,mBAAmB;AAC9B;AAEA,IAAO,uBAAQ,EAAE,YAAY;","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Explicit sslmode=disable supports private Docker networks, not just localhost. */
|
|
2
|
+
declare function postgresSsl(connectionString: string, rejectUnauthorized?: boolean): false | {
|
|
3
|
+
rejectUnauthorized: boolean;
|
|
4
|
+
};
|
|
5
|
+
declare const _default: {
|
|
6
|
+
postgresSsl: typeof postgresSsl;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export { _default as default, postgresSsl };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Explicit sslmode=disable supports private Docker networks, not just localhost. */
|
|
2
|
+
declare function postgresSsl(connectionString: string, rejectUnauthorized?: boolean): false | {
|
|
3
|
+
rejectUnauthorized: boolean;
|
|
4
|
+
};
|
|
5
|
+
declare const _default: {
|
|
6
|
+
postgresSsl: typeof postgresSsl;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export { _default as default, postgresSsl };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// src/postgres-ssl.ts
|
|
2
|
+
function postgresSsl(connectionString, rejectUnauthorized = true) {
|
|
3
|
+
const url = new URL(connectionString);
|
|
4
|
+
if (url.searchParams.get("sslmode") === "disable" || ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname)) return false;
|
|
5
|
+
return { rejectUnauthorized };
|
|
6
|
+
}
|
|
7
|
+
var postgres_ssl_default = { postgresSsl };
|
|
8
|
+
export {
|
|
9
|
+
postgres_ssl_default as default,
|
|
10
|
+
postgresSsl
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=postgres-ssl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/postgres-ssl.ts"],"sourcesContent":["/** Explicit sslmode=disable supports private Docker networks, not just localhost. */\nexport function postgresSsl(connectionString: string, rejectUnauthorized = true) {\n const url = new URL(connectionString);\n if (url.searchParams.get(\"sslmode\") === \"disable\" ||\n [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname)) return false;\n return { rejectUnauthorized };\n}\n\nexport default { postgresSsl };\n"],"mappings":";AACO,SAAS,YAAY,kBAA0B,qBAAqB,MAAM;AAC/E,QAAM,MAAM,IAAI,IAAI,gBAAgB;AACpC,MAAI,IAAI,aAAa,IAAI,SAAS,MAAM,aACpC,CAAC,aAAa,aAAa,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAG,QAAO;AACvE,SAAO,EAAE,mBAAmB;AAC9B;AAEA,IAAO,uBAAQ,EAAE,YAAY;","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/protocol.ts
|
|
21
|
+
var protocol_exports = {};
|
|
22
|
+
__export(protocol_exports, {
|
|
23
|
+
Protocol: () => Protocol
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(protocol_exports);
|
|
26
|
+
var Protocol = class {
|
|
27
|
+
static encode(message) {
|
|
28
|
+
return JSON.stringify(message);
|
|
29
|
+
}
|
|
30
|
+
static decode(data) {
|
|
31
|
+
return JSON.parse(data);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
35
|
+
0 && (module.exports = {
|
|
36
|
+
Protocol
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=protocol.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/protocol.ts"],"sourcesContent":["import { Message } from \"./types\";\n\nexport class Protocol {\n static encode(message: Message): string {\n return JSON.stringify(message);\n }\n\n static decode(data: string): Message {\n return JSON.parse(data) as Message;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,WAAN,MAAe;AAAA,EACpB,OAAO,OAAO,SAA0B;AACtC,WAAO,KAAK,UAAU,OAAO;AAAA,EAC/B;AAAA,EAEA,OAAO,OAAO,MAAuB;AACnC,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AACF;","names":[]}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/protocol.ts"],"sourcesContent":["import { Message } from \"./types\";\n\nexport class Protocol {\n static encode(message: Message): string {\n return JSON.stringify(message);\n }\n\n static decode(data: string): Message {\n return JSON.parse(data) as Message;\n }\n}\n"],"mappings":";AAEO,IAAM,WAAN,MAAe;AAAA,EACpB,OAAO,OAAO,SAA0B;AACtC,WAAO,KAAK,UAAU,OAAO;AAAA,EAC/B;AAAA,EAEA,OAAO,OAAO,MAAuB;AACnC,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AACF;","names":[]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/public-hosts.ts
|
|
21
|
+
var public_hosts_exports = {};
|
|
22
|
+
__export(public_hosts_exports, {
|
|
23
|
+
canonicalStatusHostname: () => canonicalStatusHostname,
|
|
24
|
+
default: () => public_hosts_default,
|
|
25
|
+
infrastructureHostnames: () => infrastructureHostnames,
|
|
26
|
+
isReservedStatusCustomDomain: () => isReservedStatusCustomDomain,
|
|
27
|
+
isTunnelControlHost: () => isTunnelControlHost,
|
|
28
|
+
normalizePublicHostname: () => normalizePublicHostname,
|
|
29
|
+
publicOrigin: () => publicOrigin,
|
|
30
|
+
statusPublicOrigin: () => statusPublicOrigin,
|
|
31
|
+
tunnelBaseDomain: () => tunnelBaseDomain,
|
|
32
|
+
tunnelDnsHostname: () => tunnelDnsHostname,
|
|
33
|
+
tunnelRootRedirect: () => tunnelRootRedirect
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(public_hosts_exports);
|
|
36
|
+
var environment = () => typeof process === "undefined" ? {} : process.env;
|
|
37
|
+
function normalizePublicHostname(value) {
|
|
38
|
+
const host = value.trim().toLowerCase().replace(/\.$/, "");
|
|
39
|
+
if (host.length > 253 || !host.split(".").every(
|
|
40
|
+
(label) => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label)
|
|
41
|
+
)) return null;
|
|
42
|
+
return host;
|
|
43
|
+
}
|
|
44
|
+
function publicOrigin(value, variable) {
|
|
45
|
+
const url = new URL(value);
|
|
46
|
+
if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.pathname !== "/" || url.search || url.hash || !normalizePublicHostname(url.hostname)) {
|
|
47
|
+
throw new Error(`${variable} must be an HTTP(S) origin without credentials, a path or query`);
|
|
48
|
+
}
|
|
49
|
+
return url;
|
|
50
|
+
}
|
|
51
|
+
function statusPublicOrigin(env = environment()) {
|
|
52
|
+
return publicOrigin(env.OUTRAY_STATUS_URL || env.STATUS_PUBLIC_URL || "https://status.outray.app", "STATUS_PUBLIC_URL");
|
|
53
|
+
}
|
|
54
|
+
function canonicalStatusHostname(env = environment()) {
|
|
55
|
+
return statusPublicOrigin(env).hostname.toLowerCase().replace(/\.$/, "");
|
|
56
|
+
}
|
|
57
|
+
function tunnelBaseDomain(env = environment(), fallback = "outray.app") {
|
|
58
|
+
const host = normalizePublicHostname(env.BASE_DOMAIN || fallback);
|
|
59
|
+
if (!host) throw new Error("BASE_DOMAIN must be a hostname without a scheme or port");
|
|
60
|
+
return host;
|
|
61
|
+
}
|
|
62
|
+
function infrastructureHostnames(env = environment()) {
|
|
63
|
+
const base = tunnelBaseDomain(env);
|
|
64
|
+
const hosts = /* @__PURE__ */ new Set([base, `www.${base}`, `edge.${base}`, `api.${base}`, canonicalStatusHostname(env)]);
|
|
65
|
+
if (env.OUTRAY_DEPLOYMENT_MODE !== "self-hosted") {
|
|
66
|
+
hosts.add("connect.outray.co");
|
|
67
|
+
hosts.add("api.outray.co");
|
|
68
|
+
hosts.add("api.outray.dev");
|
|
69
|
+
}
|
|
70
|
+
for (const variable of ["CONSOLE_PUBLIC_URL", "APP_URL", "BETTER_AUTH_URL", "TUNNEL_PUBLIC_URL", "INGEST_PUBLIC_URL", "OUTRAY_INGEST_URL", "OUTRAY_SHARE_URL", "SHARE_PUBLIC_URL"]) {
|
|
71
|
+
if (env[variable]) hosts.add(publicOrigin(env[variable], variable).hostname.toLowerCase());
|
|
72
|
+
}
|
|
73
|
+
return [...hosts];
|
|
74
|
+
}
|
|
75
|
+
function isReservedStatusCustomDomain(host, env = environment()) {
|
|
76
|
+
const hostname = normalizePublicHostname(host);
|
|
77
|
+
if (!hostname) return true;
|
|
78
|
+
const namespace = (base) => hostname === base || hostname.endsWith(`.${base}`);
|
|
79
|
+
if (namespace(canonicalStatusHostname(env))) return true;
|
|
80
|
+
if (env.OUTRAY_DEPLOYMENT_MODE !== "self-hosted") return namespace("outray.app") || namespace("outray.dev");
|
|
81
|
+
return infrastructureHostnames(env).some(namespace);
|
|
82
|
+
}
|
|
83
|
+
function tunnelDnsHostname(value) {
|
|
84
|
+
if (!value) return "edge.outray.app";
|
|
85
|
+
const url = new URL(value);
|
|
86
|
+
if (!["https:", "http:", "wss:", "ws:"].includes(url.protocol) || url.username || url.password || url.search || url.hash || !normalizePublicHostname(url.hostname)) throw new Error("VITE_TUNNEL_URL must be a public HTTP(S) or WebSocket URL");
|
|
87
|
+
return url.hostname.toLowerCase().replace(/\.$/, "");
|
|
88
|
+
}
|
|
89
|
+
function isTunnelControlHost(host, base, env = environment()) {
|
|
90
|
+
if (host === base.toLowerCase() || host === "localhost") return true;
|
|
91
|
+
if (env.TUNNEL_PUBLIC_URL && host === publicOrigin(env.TUNNEL_PUBLIC_URL, "TUNNEL_PUBLIC_URL").hostname.toLowerCase()) return true;
|
|
92
|
+
return env.OUTRAY_DEPLOYMENT_MODE === "self-hosted" ? host === `api.${base.toLowerCase()}` : host === "connect.outray.co" || host.startsWith("api.");
|
|
93
|
+
}
|
|
94
|
+
function tunnelRootRedirect(host, base, path, env = environment()) {
|
|
95
|
+
const normalizedBase = normalizePublicHostname(base);
|
|
96
|
+
if (!normalizedBase || host !== normalizedBase && host !== `www.${normalizedBase}`) return null;
|
|
97
|
+
const destination = env.CONSOLE_PUBLIC_URL || env.APP_URL || env.BETTER_AUTH_URL || (env.OUTRAY_DEPLOYMENT_MODE !== "self-hosted" && normalizedBase === "outray.app" ? "https://outray.co" : void 0);
|
|
98
|
+
if (!destination) return null;
|
|
99
|
+
const origin = publicOrigin(destination, "CONSOLE_PUBLIC_URL");
|
|
100
|
+
return `${origin.origin}${path.startsWith("/") ? path : `/${path}`}`;
|
|
101
|
+
}
|
|
102
|
+
var public_hosts_default = { publicOrigin, canonicalStatusHostname, statusPublicOrigin, tunnelBaseDomain, infrastructureHostnames, tunnelRootRedirect, normalizePublicHostname, isTunnelControlHost, isReservedStatusCustomDomain, tunnelDnsHostname };
|
|
103
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
104
|
+
0 && (module.exports = {
|
|
105
|
+
canonicalStatusHostname,
|
|
106
|
+
infrastructureHostnames,
|
|
107
|
+
isReservedStatusCustomDomain,
|
|
108
|
+
isTunnelControlHost,
|
|
109
|
+
normalizePublicHostname,
|
|
110
|
+
publicOrigin,
|
|
111
|
+
statusPublicOrigin,
|
|
112
|
+
tunnelBaseDomain,
|
|
113
|
+
tunnelDnsHostname,
|
|
114
|
+
tunnelRootRedirect
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=public-hosts.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/public-hosts.ts"],"sourcesContent":["/** Public routing configuration only. Safe to import in dashboard clients when\n * an explicit build-time environment is supplied; never exposes credentials. */\nexport type PublicHostEnvironment = Readonly<Record<string, string | undefined>>;\nconst environment = (): PublicHostEnvironment => typeof process === \"undefined\" ? {} : process.env;\n\nexport function normalizePublicHostname(value: string): string | null {\n const host = value.trim().toLowerCase().replace(/\\.$/, \"\");\n if (host.length > 253 || !host.split(\".\").every((label) =>\n /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label),\n )) return null;\n return host;\n}\n\nexport function publicOrigin(value: string, variable: string): URL {\n const url = new URL(value);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password ||\n url.pathname !== \"/\" || url.search || url.hash || !normalizePublicHostname(url.hostname)) {\n throw new Error(`${variable} must be an HTTP(S) origin without credentials, a path or query`);\n }\n return url;\n}\n\nexport function statusPublicOrigin(env: PublicHostEnvironment = environment()): URL {\n return publicOrigin(env.OUTRAY_STATUS_URL || env.STATUS_PUBLIC_URL || \"https://status.outray.app\", \"STATUS_PUBLIC_URL\");\n}\n\nexport function canonicalStatusHostname(env: PublicHostEnvironment = environment()): string {\n return statusPublicOrigin(env).hostname.toLowerCase().replace(/\\.$/, \"\");\n}\n\nexport function tunnelBaseDomain(env: PublicHostEnvironment = environment(), fallback = \"outray.app\"): string {\n const host = normalizePublicHostname(env.BASE_DOMAIN || fallback);\n if (!host) throw new Error(\"BASE_DOMAIN must be a hostname without a scheme or port\");\n return host;\n}\n\nexport function infrastructureHostnames(env: PublicHostEnvironment = environment()): string[] {\n const base = tunnelBaseDomain(env);\n const hosts = new Set([base, `www.${base}`, `edge.${base}`, `api.${base}`, canonicalStatusHostname(env)]);\n if (env.OUTRAY_DEPLOYMENT_MODE !== \"self-hosted\") {\n hosts.add(\"connect.outray.co\");\n hosts.add(\"api.outray.co\");\n hosts.add(\"api.outray.dev\");\n }\n for (const variable of [\"CONSOLE_PUBLIC_URL\", \"APP_URL\", \"BETTER_AUTH_URL\", \"TUNNEL_PUBLIC_URL\", \"INGEST_PUBLIC_URL\", \"OUTRAY_INGEST_URL\", \"OUTRAY_SHARE_URL\", \"SHARE_PUBLIC_URL\"]) {\n if (env[variable]) hosts.add(publicOrigin(env[variable]!, variable).hostname.toLowerCase());\n }\n return [...hosts];\n}\n\nexport function isReservedStatusCustomDomain(host: string, env: PublicHostEnvironment = environment()): boolean {\n const hostname = normalizePublicHostname(host);\n if (!hostname) return true;\n const namespace = (base: string) => hostname === base || hostname.endsWith(`.${base}`);\n if (namespace(canonicalStatusHostname(env))) return true;\n if (env.OUTRAY_DEPLOYMENT_MODE !== \"self-hosted\") return namespace(\"outray.app\") || namespace(\"outray.dev\");\n return infrastructureHostnames(env).some(namespace);\n}\n\n/** DNS instructions can derive a hostname from the same ws(s) URL used by the\n * dashboard feed, without shipping runtime environment variables to clients. */\nexport function tunnelDnsHostname(value?: string): string {\n if (!value) return \"edge.outray.app\";\n const url = new URL(value);\n if (![\"https:\", \"http:\", \"wss:\", \"ws:\"].includes(url.protocol) || url.username || url.password ||\n url.search || url.hash || !normalizePublicHostname(url.hostname)) throw new Error(\"VITE_TUNNEL_URL must be a public HTTP(S) or WebSocket URL\");\n return url.hostname.toLowerCase().replace(/\\.$/, \"\");\n}\n\nexport function isTunnelControlHost(host: string, base: string, env: PublicHostEnvironment = environment()): boolean {\n if (host === base.toLowerCase() || host === \"localhost\") return true;\n if (env.TUNNEL_PUBLIC_URL && host === publicOrigin(env.TUNNEL_PUBLIC_URL, \"TUNNEL_PUBLIC_URL\").hostname.toLowerCase()) return true;\n // Hosted installations use connect and retain the existing API aliases. Self-hosted routing\n // must not capture arbitrary customer api.* hosts as the CLI control plane.\n return env.OUTRAY_DEPLOYMENT_MODE === \"self-hosted\"\n ? host === `api.${base.toLowerCase()}`\n : host === \"connect.outray.co\" || host.startsWith(\"api.\");\n}\n\nexport function tunnelRootRedirect(host: string, base: string, path: string, env: PublicHostEnvironment = environment()): string | null {\n const normalizedBase = normalizePublicHostname(base);\n if (!normalizedBase || (host !== normalizedBase && host !== `www.${normalizedBase}`)) return null;\n const destination = env.CONSOLE_PUBLIC_URL || env.APP_URL || env.BETTER_AUTH_URL ||\n (env.OUTRAY_DEPLOYMENT_MODE !== \"self-hosted\" && normalizedBase === \"outray.app\" ? \"https://outray.co\" : undefined);\n if (!destination) return null;\n const origin = publicOrigin(destination, \"CONSOLE_PUBLIC_URL\");\n // Concatenation keeps a request such as //evil.example a path, not an open redirect.\n return `${origin.origin}${path.startsWith(\"/\") ? path : `/${path}`}`;\n}\n\n// Node workers also consume these helpers through CommonJS in development.\nexport default { publicOrigin, canonicalStatusHostname, statusPublicOrigin, tunnelBaseDomain, infrastructureHostnames, tunnelRootRedirect, normalizePublicHostname, isTunnelControlHost, isReservedStatusCustomDomain, tunnelDnsHostname };\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Public routing configuration only. Safe to import in dashboard clients when
|
|
2
|
+
* an explicit build-time environment is supplied; never exposes credentials. */
|
|
3
|
+
type PublicHostEnvironment = Readonly<Record<string, string | undefined>>;
|
|
4
|
+
declare function normalizePublicHostname(value: string): string | null;
|
|
5
|
+
declare function publicOrigin(value: string, variable: string): URL;
|
|
6
|
+
declare function statusPublicOrigin(env?: PublicHostEnvironment): URL;
|
|
7
|
+
declare function canonicalStatusHostname(env?: PublicHostEnvironment): string;
|
|
8
|
+
declare function tunnelBaseDomain(env?: PublicHostEnvironment, fallback?: string): string;
|
|
9
|
+
declare function infrastructureHostnames(env?: PublicHostEnvironment): string[];
|
|
10
|
+
declare function isReservedStatusCustomDomain(host: string, env?: PublicHostEnvironment): boolean;
|
|
11
|
+
/** DNS instructions can derive a hostname from the same ws(s) URL used by the
|
|
12
|
+
* dashboard feed, without shipping runtime environment variables to clients. */
|
|
13
|
+
declare function tunnelDnsHostname(value?: string): string;
|
|
14
|
+
declare function isTunnelControlHost(host: string, base: string, env?: PublicHostEnvironment): boolean;
|
|
15
|
+
declare function tunnelRootRedirect(host: string, base: string, path: string, env?: PublicHostEnvironment): string | null;
|
|
16
|
+
declare const _default: {
|
|
17
|
+
publicOrigin: typeof publicOrigin;
|
|
18
|
+
canonicalStatusHostname: typeof canonicalStatusHostname;
|
|
19
|
+
statusPublicOrigin: typeof statusPublicOrigin;
|
|
20
|
+
tunnelBaseDomain: typeof tunnelBaseDomain;
|
|
21
|
+
infrastructureHostnames: typeof infrastructureHostnames;
|
|
22
|
+
tunnelRootRedirect: typeof tunnelRootRedirect;
|
|
23
|
+
normalizePublicHostname: typeof normalizePublicHostname;
|
|
24
|
+
isTunnelControlHost: typeof isTunnelControlHost;
|
|
25
|
+
isReservedStatusCustomDomain: typeof isReservedStatusCustomDomain;
|
|
26
|
+
tunnelDnsHostname: typeof tunnelDnsHostname;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { type PublicHostEnvironment, canonicalStatusHostname, _default as default, infrastructureHostnames, isReservedStatusCustomDomain, isTunnelControlHost, normalizePublicHostname, publicOrigin, statusPublicOrigin, tunnelBaseDomain, tunnelDnsHostname, tunnelRootRedirect };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Public routing configuration only. Safe to import in dashboard clients when
|
|
2
|
+
* an explicit build-time environment is supplied; never exposes credentials. */
|
|
3
|
+
type PublicHostEnvironment = Readonly<Record<string, string | undefined>>;
|
|
4
|
+
declare function normalizePublicHostname(value: string): string | null;
|
|
5
|
+
declare function publicOrigin(value: string, variable: string): URL;
|
|
6
|
+
declare function statusPublicOrigin(env?: PublicHostEnvironment): URL;
|
|
7
|
+
declare function canonicalStatusHostname(env?: PublicHostEnvironment): string;
|
|
8
|
+
declare function tunnelBaseDomain(env?: PublicHostEnvironment, fallback?: string): string;
|
|
9
|
+
declare function infrastructureHostnames(env?: PublicHostEnvironment): string[];
|
|
10
|
+
declare function isReservedStatusCustomDomain(host: string, env?: PublicHostEnvironment): boolean;
|
|
11
|
+
/** DNS instructions can derive a hostname from the same ws(s) URL used by the
|
|
12
|
+
* dashboard feed, without shipping runtime environment variables to clients. */
|
|
13
|
+
declare function tunnelDnsHostname(value?: string): string;
|
|
14
|
+
declare function isTunnelControlHost(host: string, base: string, env?: PublicHostEnvironment): boolean;
|
|
15
|
+
declare function tunnelRootRedirect(host: string, base: string, path: string, env?: PublicHostEnvironment): string | null;
|
|
16
|
+
declare const _default: {
|
|
17
|
+
publicOrigin: typeof publicOrigin;
|
|
18
|
+
canonicalStatusHostname: typeof canonicalStatusHostname;
|
|
19
|
+
statusPublicOrigin: typeof statusPublicOrigin;
|
|
20
|
+
tunnelBaseDomain: typeof tunnelBaseDomain;
|
|
21
|
+
infrastructureHostnames: typeof infrastructureHostnames;
|
|
22
|
+
tunnelRootRedirect: typeof tunnelRootRedirect;
|
|
23
|
+
normalizePublicHostname: typeof normalizePublicHostname;
|
|
24
|
+
isTunnelControlHost: typeof isTunnelControlHost;
|
|
25
|
+
isReservedStatusCustomDomain: typeof isReservedStatusCustomDomain;
|
|
26
|
+
tunnelDnsHostname: typeof tunnelDnsHostname;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { type PublicHostEnvironment, canonicalStatusHostname, _default as default, infrastructureHostnames, isReservedStatusCustomDomain, isTunnelControlHost, normalizePublicHostname, publicOrigin, statusPublicOrigin, tunnelBaseDomain, tunnelDnsHostname, tunnelRootRedirect };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// src/public-hosts.ts
|
|
2
|
+
var environment = () => typeof process === "undefined" ? {} : process.env;
|
|
3
|
+
function normalizePublicHostname(value) {
|
|
4
|
+
const host = value.trim().toLowerCase().replace(/\.$/, "");
|
|
5
|
+
if (host.length > 253 || !host.split(".").every(
|
|
6
|
+
(label) => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label)
|
|
7
|
+
)) return null;
|
|
8
|
+
return host;
|
|
9
|
+
}
|
|
10
|
+
function publicOrigin(value, variable) {
|
|
11
|
+
const url = new URL(value);
|
|
12
|
+
if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.pathname !== "/" || url.search || url.hash || !normalizePublicHostname(url.hostname)) {
|
|
13
|
+
throw new Error(`${variable} must be an HTTP(S) origin without credentials, a path or query`);
|
|
14
|
+
}
|
|
15
|
+
return url;
|
|
16
|
+
}
|
|
17
|
+
function statusPublicOrigin(env = environment()) {
|
|
18
|
+
return publicOrigin(env.OUTRAY_STATUS_URL || env.STATUS_PUBLIC_URL || "https://status.outray.app", "STATUS_PUBLIC_URL");
|
|
19
|
+
}
|
|
20
|
+
function canonicalStatusHostname(env = environment()) {
|
|
21
|
+
return statusPublicOrigin(env).hostname.toLowerCase().replace(/\.$/, "");
|
|
22
|
+
}
|
|
23
|
+
function tunnelBaseDomain(env = environment(), fallback = "outray.app") {
|
|
24
|
+
const host = normalizePublicHostname(env.BASE_DOMAIN || fallback);
|
|
25
|
+
if (!host) throw new Error("BASE_DOMAIN must be a hostname without a scheme or port");
|
|
26
|
+
return host;
|
|
27
|
+
}
|
|
28
|
+
function infrastructureHostnames(env = environment()) {
|
|
29
|
+
const base = tunnelBaseDomain(env);
|
|
30
|
+
const hosts = /* @__PURE__ */ new Set([base, `www.${base}`, `edge.${base}`, `api.${base}`, canonicalStatusHostname(env)]);
|
|
31
|
+
if (env.OUTRAY_DEPLOYMENT_MODE !== "self-hosted") {
|
|
32
|
+
hosts.add("connect.outray.co");
|
|
33
|
+
hosts.add("api.outray.co");
|
|
34
|
+
hosts.add("api.outray.dev");
|
|
35
|
+
}
|
|
36
|
+
for (const variable of ["CONSOLE_PUBLIC_URL", "APP_URL", "BETTER_AUTH_URL", "TUNNEL_PUBLIC_URL", "INGEST_PUBLIC_URL", "OUTRAY_INGEST_URL", "OUTRAY_SHARE_URL", "SHARE_PUBLIC_URL"]) {
|
|
37
|
+
if (env[variable]) hosts.add(publicOrigin(env[variable], variable).hostname.toLowerCase());
|
|
38
|
+
}
|
|
39
|
+
return [...hosts];
|
|
40
|
+
}
|
|
41
|
+
function isReservedStatusCustomDomain(host, env = environment()) {
|
|
42
|
+
const hostname = normalizePublicHostname(host);
|
|
43
|
+
if (!hostname) return true;
|
|
44
|
+
const namespace = (base) => hostname === base || hostname.endsWith(`.${base}`);
|
|
45
|
+
if (namespace(canonicalStatusHostname(env))) return true;
|
|
46
|
+
if (env.OUTRAY_DEPLOYMENT_MODE !== "self-hosted") return namespace("outray.app") || namespace("outray.dev");
|
|
47
|
+
return infrastructureHostnames(env).some(namespace);
|
|
48
|
+
}
|
|
49
|
+
function tunnelDnsHostname(value) {
|
|
50
|
+
if (!value) return "edge.outray.app";
|
|
51
|
+
const url = new URL(value);
|
|
52
|
+
if (!["https:", "http:", "wss:", "ws:"].includes(url.protocol) || url.username || url.password || url.search || url.hash || !normalizePublicHostname(url.hostname)) throw new Error("VITE_TUNNEL_URL must be a public HTTP(S) or WebSocket URL");
|
|
53
|
+
return url.hostname.toLowerCase().replace(/\.$/, "");
|
|
54
|
+
}
|
|
55
|
+
function isTunnelControlHost(host, base, env = environment()) {
|
|
56
|
+
if (host === base.toLowerCase() || host === "localhost") return true;
|
|
57
|
+
if (env.TUNNEL_PUBLIC_URL && host === publicOrigin(env.TUNNEL_PUBLIC_URL, "TUNNEL_PUBLIC_URL").hostname.toLowerCase()) return true;
|
|
58
|
+
return env.OUTRAY_DEPLOYMENT_MODE === "self-hosted" ? host === `api.${base.toLowerCase()}` : host === "connect.outray.co" || host.startsWith("api.");
|
|
59
|
+
}
|
|
60
|
+
function tunnelRootRedirect(host, base, path, env = environment()) {
|
|
61
|
+
const normalizedBase = normalizePublicHostname(base);
|
|
62
|
+
if (!normalizedBase || host !== normalizedBase && host !== `www.${normalizedBase}`) return null;
|
|
63
|
+
const destination = env.CONSOLE_PUBLIC_URL || env.APP_URL || env.BETTER_AUTH_URL || (env.OUTRAY_DEPLOYMENT_MODE !== "self-hosted" && normalizedBase === "outray.app" ? "https://outray.co" : void 0);
|
|
64
|
+
if (!destination) return null;
|
|
65
|
+
const origin = publicOrigin(destination, "CONSOLE_PUBLIC_URL");
|
|
66
|
+
return `${origin.origin}${path.startsWith("/") ? path : `/${path}`}`;
|
|
67
|
+
}
|
|
68
|
+
var public_hosts_default = { publicOrigin, canonicalStatusHostname, statusPublicOrigin, tunnelBaseDomain, infrastructureHostnames, tunnelRootRedirect, normalizePublicHostname, isTunnelControlHost, isReservedStatusCustomDomain, tunnelDnsHostname };
|
|
69
|
+
export {
|
|
70
|
+
canonicalStatusHostname,
|
|
71
|
+
public_hosts_default as default,
|
|
72
|
+
infrastructureHostnames,
|
|
73
|
+
isReservedStatusCustomDomain,
|
|
74
|
+
isTunnelControlHost,
|
|
75
|
+
normalizePublicHostname,
|
|
76
|
+
publicOrigin,
|
|
77
|
+
statusPublicOrigin,
|
|
78
|
+
tunnelBaseDomain,
|
|
79
|
+
tunnelDnsHostname,
|
|
80
|
+
tunnelRootRedirect
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=public-hosts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/public-hosts.ts"],"sourcesContent":["/** Public routing configuration only. Safe to import in dashboard clients when\n * an explicit build-time environment is supplied; never exposes credentials. */\nexport type PublicHostEnvironment = Readonly<Record<string, string | undefined>>;\nconst environment = (): PublicHostEnvironment => typeof process === \"undefined\" ? {} : process.env;\n\nexport function normalizePublicHostname(value: string): string | null {\n const host = value.trim().toLowerCase().replace(/\\.$/, \"\");\n if (host.length > 253 || !host.split(\".\").every((label) =>\n /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label),\n )) return null;\n return host;\n}\n\nexport function publicOrigin(value: string, variable: string): URL {\n const url = new URL(value);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password ||\n url.pathname !== \"/\" || url.search || url.hash || !normalizePublicHostname(url.hostname)) {\n throw new Error(`${variable} must be an HTTP(S) origin without credentials, a path or query`);\n }\n return url;\n}\n\nexport function statusPublicOrigin(env: PublicHostEnvironment = environment()): URL {\n return publicOrigin(env.OUTRAY_STATUS_URL || env.STATUS_PUBLIC_URL || \"https://status.outray.app\", \"STATUS_PUBLIC_URL\");\n}\n\nexport function canonicalStatusHostname(env: PublicHostEnvironment = environment()): string {\n return statusPublicOrigin(env).hostname.toLowerCase().replace(/\\.$/, \"\");\n}\n\nexport function tunnelBaseDomain(env: PublicHostEnvironment = environment(), fallback = \"outray.app\"): string {\n const host = normalizePublicHostname(env.BASE_DOMAIN || fallback);\n if (!host) throw new Error(\"BASE_DOMAIN must be a hostname without a scheme or port\");\n return host;\n}\n\nexport function infrastructureHostnames(env: PublicHostEnvironment = environment()): string[] {\n const base = tunnelBaseDomain(env);\n const hosts = new Set([base, `www.${base}`, `edge.${base}`, `api.${base}`, canonicalStatusHostname(env)]);\n if (env.OUTRAY_DEPLOYMENT_MODE !== \"self-hosted\") {\n hosts.add(\"connect.outray.co\");\n hosts.add(\"api.outray.co\");\n hosts.add(\"api.outray.dev\");\n }\n for (const variable of [\"CONSOLE_PUBLIC_URL\", \"APP_URL\", \"BETTER_AUTH_URL\", \"TUNNEL_PUBLIC_URL\", \"INGEST_PUBLIC_URL\", \"OUTRAY_INGEST_URL\", \"OUTRAY_SHARE_URL\", \"SHARE_PUBLIC_URL\"]) {\n if (env[variable]) hosts.add(publicOrigin(env[variable]!, variable).hostname.toLowerCase());\n }\n return [...hosts];\n}\n\nexport function isReservedStatusCustomDomain(host: string, env: PublicHostEnvironment = environment()): boolean {\n const hostname = normalizePublicHostname(host);\n if (!hostname) return true;\n const namespace = (base: string) => hostname === base || hostname.endsWith(`.${base}`);\n if (namespace(canonicalStatusHostname(env))) return true;\n if (env.OUTRAY_DEPLOYMENT_MODE !== \"self-hosted\") return namespace(\"outray.app\") || namespace(\"outray.dev\");\n return infrastructureHostnames(env).some(namespace);\n}\n\n/** DNS instructions can derive a hostname from the same ws(s) URL used by the\n * dashboard feed, without shipping runtime environment variables to clients. */\nexport function tunnelDnsHostname(value?: string): string {\n if (!value) return \"edge.outray.app\";\n const url = new URL(value);\n if (![\"https:\", \"http:\", \"wss:\", \"ws:\"].includes(url.protocol) || url.username || url.password ||\n url.search || url.hash || !normalizePublicHostname(url.hostname)) throw new Error(\"VITE_TUNNEL_URL must be a public HTTP(S) or WebSocket URL\");\n return url.hostname.toLowerCase().replace(/\\.$/, \"\");\n}\n\nexport function isTunnelControlHost(host: string, base: string, env: PublicHostEnvironment = environment()): boolean {\n if (host === base.toLowerCase() || host === \"localhost\") return true;\n if (env.TUNNEL_PUBLIC_URL && host === publicOrigin(env.TUNNEL_PUBLIC_URL, \"TUNNEL_PUBLIC_URL\").hostname.toLowerCase()) return true;\n // Hosted installations use connect and retain the existing API aliases. Self-hosted routing\n // must not capture arbitrary customer api.* hosts as the CLI control plane.\n return env.OUTRAY_DEPLOYMENT_MODE === \"self-hosted\"\n ? host === `api.${base.toLowerCase()}`\n : host === \"connect.outray.co\" || host.startsWith(\"api.\");\n}\n\nexport function tunnelRootRedirect(host: string, base: string, path: string, env: PublicHostEnvironment = environment()): string | null {\n const normalizedBase = normalizePublicHostname(base);\n if (!normalizedBase || (host !== normalizedBase && host !== `www.${normalizedBase}`)) return null;\n const destination = env.CONSOLE_PUBLIC_URL || env.APP_URL || env.BETTER_AUTH_URL ||\n (env.OUTRAY_DEPLOYMENT_MODE !== \"self-hosted\" && normalizedBase === \"outray.app\" ? \"https://outray.co\" : undefined);\n if (!destination) return null;\n const origin = publicOrigin(destination, \"CONSOLE_PUBLIC_URL\");\n // Concatenation keeps a request such as //evil.example a path, not an open redirect.\n return `${origin.origin}${path.startsWith(\"/\") ? path : `/${path}`}`;\n}\n\n// Node workers also consume these helpers through CommonJS in development.\nexport default { publicOrigin, canonicalStatusHostname, statusPublicOrigin, tunnelBaseDomain, infrastructureHostnames, tunnelRootRedirect, normalizePublicHostname, isTunnelControlHost, isReservedStatusCustomDomain, tunnelDnsHostname };\n"],"mappings":"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","names":[]}
|