UNPKG

@didtools/siwx

Version:

Typescript library for Sign-In With X

26 lines (25 loc) 1.09 kB
import { choice, foldMap, literal, match, option, joinSeq } from 'codeco/linear'; import { left, right } from 'codeco'; import { ipLiteral, ipv4Address } from './ip-address.js'; export const port = foldMap(match(/^\d+/), (digits)=>{ if (String(parseInt(digits, 10)) === digits) return right(digits); return left(new Error(`Invalid port ${digits}`)); }); /** * ABNF: * ``` * reg-name = *( unreserved / pct-encoded / sub-delims ) * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" * pct-encoded = "%" HEXDIG HEXDIG * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" * ``` */ export const regName = match(/^([a-zA-Z0-9\-._~!$&'()*+,;=]|(%[a-fA-F0-9]{2}))*/); export const host = choice(ipLiteral, ipv4Address, regName); /** * `dnsauthority = host [ ":" port ]` */ const colonPort = joinSeq(literal(':'), port); export const dnsauthority = joinSeq(host, option(colonPort, '')); export const domain = foldMap(dnsauthority, (found)=>{ if (!found) return left(new Error(`domain can not be empty`)); return right(found); });