gnablib
Version:
A lean, zero dependency library to provide a useful base for your project.
2 lines • 1.32 kB
JavaScript
/*! Copyright 2023-2024 the gnablib contributors MPL-1.1 */
import{ContentError as o}from"../error/ContentError.js";import{hex as t}from"./Hex.js";import{utf8 as n}from"./Utf8.js";const r=["-",".","","0","1","2","3","4","5","6","7","8","9","","","","","","","","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","","","","","_","","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","","","","~"];export const uri={fromBytes:function(o){let n="";for(const i of o){if(i>=45&&i<=126){const o=r[i-45];if(""!==o){n+=o;continue}}n+="%"+t.fromByte(i)}return n},toBytes:function(r,i){var e;(i=i||{invalid:"throw",overProvisionOutput:8}).overProvisionOutput=null!==(e=i.overProvisionOutput)&&void 0!==e?e:8;const c=new Uint8Array(r.length+i.overProvisionOutput);let s=0,f=0;const u="throw"===i.invalid?function(t){throw new o("invalid character","URI encoding",String.fromCodePoint(t))}:"ignore"===i.invalid?function(){}:function(o){const t=n.bytesFromCodePoint(o);for(const o of t)c[f++]=o};for(;s<r.length;){const n=r[s++];if("%"===n){const n=r.substring(s,s+2);try{c[f++]=t.toByte(n)}catch(t){throw new o("invalid escape","URI encoding","%"+n)}s+=2}else{const o=n.charCodeAt(0);o<=255?c[f++]=o:u(o)}}return c.slice(0,f)}};