@didtools/siwx
Version:
Typescript library for Sign-In With X
26 lines (25 loc) • 1.09 kB
JavaScript
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);
});