a proof of concept realtime collaborative text editor using atproto as a sync server jake.tngl.io/y-pds/
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

atcute -> atsw.js

+531 -227
+21 -15
app.js
··· 1 1 import { Component, createRef } from "preact"; 2 2 import { html } from "htm/preact"; 3 3 import { signal } from "@preact/signals"; 4 - import { getSession, createAuthorizationUrl } from "@atcute/oauth-browser-client"; 4 + import { getSession, logIn, resolveDID } from "./atsw.js"; 5 + import metadata from "./client-metadata.json" with { type: "json" }; 5 6 import * as Y from "yjs"; 6 7 import { ySyncPlugin, yUndoPlugin, yCursorPlugin } from "y-prosemirror"; 7 8 import { schema } from "prosemirror-schema-basic"; ··· 9 10 import { EditorView } from "prosemirror-view"; 10 11 import { exampleSetup, buildMenuItems } from "prosemirror-example-setup"; 11 12 import { MenuItem, joinUpItem, liftItem, undoItem, redoItem } from "prosemirror-menu"; 12 - import { configure, client, resolve, scope } from "./oauth.js"; 13 13 import { DOC_COLLECTION, YPdsProvider } from "./y-pds.js"; 14 14 import "actor-typeahead"; 15 - 16 - configure(); 17 15 18 16 /** @param {string} did */ 19 17 async function fetchProfile(did) { ··· 54 52 55 53 this.loading.value = true; 56 54 57 - const session = await getSession(did, { allowStale: false }); 58 - this.did.value = session.info.sub; 55 + const session = await getSession(did); 56 + if (!session) { 57 + this.did.value = ""; 58 + return; 59 + } 60 + this.did.value = session.did; 59 61 60 62 const params = new URLSearchParams(location.search); 61 63 let uri = params.get("id") ?? localStorage.getItem("ypds:pending-id") ?? ""; ··· 98 100 if (typeof identifier !== "string") throw new Error("invalid handle"); 99 101 const id = new URLSearchParams(location.search).get("id"); 100 102 if (id) localStorage.setItem("ypds:pending-id", id); 101 - const authUrl = await createAuthorizationUrl({ 102 - target: { type: "account", identifier }, 103 - scope, 104 - }); 105 - await new Promise(r => setTimeout(r, 100)); 106 - window.location.assign(authUrl); 103 + const did = await resolveDID(identifier); 104 + localStorage.setItem("ypds:did", did); 105 + await logIn( 106 + { 107 + clientId: metadata.client_id, 108 + redirectUri: metadata.redirect_uris[0], 109 + scope: metadata.scope, 110 + }, 111 + identifier, 112 + ); 107 113 } 108 114 109 115 render() { ··· 139 145 view = null; 140 146 141 147 async componentDidMount() { 142 - const session = await getSession(this.props.did, { allowStale: false }); 148 + const session = await getSession(this.props.did); 143 149 144 150 const ydoc = new Y.Doc(); 145 151 const yxml = ydoc.getXmlFragment("prosemirror"); 146 152 147 153 this.provider.value = new YPdsProvider({ 148 154 ydoc, 149 - client: client(session), 155 + pds: session.pds, 150 156 atUri: this.props.atUri, 151 157 did: this.props.did, 152 158 }); ··· 266 272 e.preventDefault(); 267 273 const identifier = e.currentTarget.did.value.trim(); 268 274 if (!identifier) return; 269 - const newDid = await resolve(identifier); 275 + const newDid = await resolveDID(identifier); 270 276 const dids = this.props.provider.getMembers(); 271 277 if (dids.includes(newDid)) return; 272 278 const updated = [...dids, newDid];
+467
atsw.js
··· 1 + // This Source Code Form is subject to the terms of the Mozilla Public 2 + // License, v. 2.0. If a copy of the MPL was not distributed with this 3 + // file, You can obtain one at https://mozilla.org/MPL/2.0/. 4 + // 5 + // Copyright (c) 2026 Jake Lazaroff https://tangled.org/jakelazaroff.com/atsw 6 + 7 + /** 8 + * @typedef {Object} DPoPKey 9 + * @property {CryptoKey} privateKey 10 + * @property {JsonWebKey} jwk 11 + */ 12 + 13 + /** 14 + * @typedef {Object} OAuthConfig 15 + * @property {string} clientId 16 + * @property {string} redirectUri 17 + * @property {string} scope 18 + */ 19 + 20 + /** 21 + * @typedef {Object} AuthingSession 22 + * @property {string} state 23 + * @property {string} verifier 24 + * @property {DPoPKey} dpopKey 25 + * @property {string} tokenEndpoint 26 + * @property {string} issuer 27 + * @property {string} did 28 + * @property {string} pds 29 + * @property {OAuthConfig} config 30 + */ 31 + 32 + /** 33 + * @typedef {Object} OAuthSession 34 + * @property {string} pds 35 + * @property {string} did 36 + * @property {string} access_token 37 + * @property {DPoPKey} dpopKey 38 + * @property {string} tokenEndpoint 39 + * @property {string} clientId 40 + * @property {number} expiresAt 41 + * @property {string} [refresh_token] 42 + * @property {string} [dpopNonce] 43 + */ 44 + 45 + /** 46 + * @typedef {Object} AuthServerMetadata 47 + * @property {string} issuer 48 + * @property {string} authorization_endpoint 49 + * @property {string} token_endpoint 50 + * @property {string} pushed_authorization_request_endpoint 51 + */ 52 + 53 + const enc = new TextEncoder(); 54 + 55 + /** @param {ArrayBuffer | Uint8Array} buf */ 56 + const b64url = buf => 57 + btoa(String.fromCharCode(...new Uint8Array(buf))) 58 + .replace(/\+/g, "-") 59 + .replace(/\//g, "_") 60 + .replace(/=+$/, ""); 61 + 62 + /** @param {number} n */ 63 + const randomB64url = n => b64url(crypto.getRandomValues(new Uint8Array(n)).buffer); 64 + 65 + async function generatePKCE() { 66 + const verifier = randomB64url(32); 67 + const challenge = b64url(await crypto.subtle.digest("SHA-256", enc.encode(verifier))); 68 + return { verifier, challenge }; 69 + } 70 + 71 + async function generateDPoPKey() { 72 + const key = await crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, true, [ 73 + "sign", 74 + ]); 75 + const jwk = await crypto.subtle.exportKey("jwk", key.publicKey); 76 + 77 + return { privateKey: key.privateKey, jwk }; 78 + } 79 + 80 + /** 81 + * @param {DPoPKey} dpopKey 82 + * @param {string} htm 83 + * @param {string} htu 84 + * @param {string} [nonce] 85 + * @param {string} [ath] 86 + */ 87 + async function createDPoP(dpopKey, htm, htu, nonce, ath) { 88 + const header = { alg: "ES256", typ: "dpop+jwt", jwk: dpopKey.jwk }; 89 + 90 + const jti = randomB64url(16); 91 + 92 + /** @type {Record<string, string | number>} */ 93 + const payload = { jti, htm, htu, iat: Math.floor(Date.now() / 1000) }; 94 + if (nonce) payload["nonce"] = nonce; 95 + if (ath) payload["ath"] = ath; 96 + 97 + const toSign = [ 98 + b64url(enc.encode(JSON.stringify(header)).buffer), 99 + b64url(enc.encode(JSON.stringify(payload)).buffer), 100 + ].join("."); 101 + 102 + const sig = await crypto.subtle.sign( 103 + { name: "ECDSA", hash: "SHA-256" }, 104 + dpopKey.privateKey, 105 + enc.encode(toSign), 106 + ); 107 + 108 + return toSign + "." + b64url(sig); 109 + } 110 + 111 + const MAX_DPOP_RETRIES = 2; 112 + const DEFAULT_TOKEN_TTL = 3600; 113 + const DID_HEADER = "x-atsw-did"; 114 + 115 + /** 116 + * @param {DPoPKey} key 117 + * @param {string} url 118 + * @param {URLSearchParams} body 119 + * @param {string} [nonce] 120 + * @returns {Promise<{ json: any, dpopNonce: string | undefined }>} 121 + */ 122 + async function dpopPost(key, url, body, nonce) { 123 + let dpopNonce = nonce; 124 + for (let attempts = 0; attempts < MAX_DPOP_RETRIES; attempts++) { 125 + const dpop = await createDPoP(key, "POST", url, dpopNonce); 126 + const res = await fetch(url, { 127 + method: "POST", 128 + headers: { "content-type": "application/x-www-form-urlencoded", DPoP: dpop }, 129 + body, 130 + }); 131 + 132 + const newNonce = res.headers.get("dpop-nonce"); 133 + const nonceChanged = newNonce && newNonce !== dpopNonce; 134 + dpopNonce = newNonce ?? dpopNonce; 135 + 136 + if (nonceChanged && 400 <= res.status && res.status <= 499) continue; 137 + 138 + return { json: await res.json(), dpopNonce }; 139 + } 140 + 141 + throw new Error("DPoP nonce retry failed"); 142 + } 143 + 144 + const DB_NAME = "atproto:oauth"; 145 + const DB_VERSION = 3; 146 + 147 + /** @type {Promise<IDBDatabase> | null} */ 148 + let dbPromise = null; 149 + 150 + /** @returns {Promise<IDBDatabase>} */ 151 + function openDb() { 152 + if (dbPromise) return dbPromise; 153 + dbPromise = new Promise((resolve, reject) => { 154 + const req = indexedDB.open(DB_NAME, DB_VERSION); 155 + req.onupgradeneeded = () => { 156 + const db = req.result; 157 + if (!db.objectStoreNames.contains("authing")) 158 + db.createObjectStore("authing", { keyPath: "state" }); 159 + 160 + if (db.objectStoreNames.contains("sessions")) db.deleteObjectStore("sessions"); 161 + const ssns = db.createObjectStore("sessions", { keyPath: "did" }); 162 + ssns.createIndex("pds", "pds", { unique: false }); 163 + }; 164 + req.onsuccess = () => resolve(req.result); 165 + req.onerror = () => { 166 + dbPromise = null; 167 + reject(req.error); 168 + }; 169 + }); 170 + 171 + return dbPromise; 172 + } 173 + 174 + /** 175 + * @param {IDBTransactionMode} mode 176 + * @param {string} store 177 + * @param {(s: IDBObjectStore) => IDBRequest} fn 178 + * @returns {Promise<any>} 179 + */ 180 + async function idb(mode, store, fn) { 181 + const db = await openDb(); 182 + return new Promise((resolve, reject) => { 183 + const tx = db.transaction(store, mode); 184 + const req = fn(tx.objectStore(store)); 185 + req.onsuccess = () => resolve(req.result); 186 + req.onerror = () => reject(req.error); 187 + }); 188 + } 189 + 190 + /** @param {AuthingSession} v */ 191 + const putAuthing = v => idb("readwrite", "authing", s => s.put(v)); 192 + 193 + /** @param {string} state @returns {Promise<AuthingSession | undefined>} */ 194 + const getAuthing = state => idb("readonly", "authing", s => s.get(state)); 195 + 196 + /** @param {string} state */ 197 + const deleteAuthing = state => idb("readwrite", "authing", s => s.delete(state)); 198 + 199 + /** @param {OAuthSession} v */ 200 + const putSession = v => idb("readwrite", "sessions", s => s.put(v)); 201 + 202 + /** @returns {Promise<OAuthSession[]>} */ 203 + export const listSessions = () => idb("readonly", "sessions", s => s.getAll()); 204 + 205 + /** @param {string} did @returns {Promise<OAuthSession | undefined>} */ 206 + export const getSession = did => idb("readonly", "sessions", s => s.get(did)); 207 + 208 + /** @param {string} pds @returns {Promise<OAuthSession[]>} */ 209 + const listSessionsByPDS = pds => idb("readonly", "sessions", s => s.index("pds").getAll(pds)); 210 + 211 + /** @param {string} did */ 212 + export const logOut = did => idb("readwrite", "sessions", s => s.delete(did)); 213 + 214 + /** @param {string} handle */ 215 + export async function resolveDID(handle) { 216 + // try to resolve DID using the DNS record 217 + try { 218 + const r = await fetch(`https://dns.google/resolve?name=_atproto.${handle}&type=TXT`); 219 + const j = await r.json(); 220 + const txt = j.Answer?.find(/** @param {any} a */ a => a.data?.startsWith('"did=')); 221 + if (txt) return /** @type {string} */ (txt.data.replace(/"/g, "").replace("did=", "")); 222 + } catch {} 223 + 224 + // HTTP .well-known resolution is blocked by CORS from the browser, so fall 225 + // back to a public AppView which exposes a CORS-enabled resolver. 226 + const r = await fetch( 227 + `https://public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle?handle=${handle}`, 228 + ); 229 + const j = await r.json(); 230 + if (!j.did) throw new Error(`Could not resolve handle ${handle}: ${JSON.stringify(j)}`); 231 + return /** @type {string} */ (j.did); 232 + } 233 + 234 + /** @param {string} did */ 235 + async function resolvePDS(did) { 236 + // find URL of DID doc 237 + const url = did.startsWith("did:web:") 238 + ? `https://${did.split(":")[2]}/.well-known/did.json` 239 + : `https://plc.directory/${did}`; 240 + 241 + /** @type {{ service?: { type: string; serviceEndpoint: string }[] }} */ 242 + const doc = await fetch(url).then(res => res.json()); 243 + 244 + // get service endpoint 245 + const endpoint = doc.service?.find( 246 + ({ type }) => type === "AtprotoPersonalDataServer", 247 + )?.serviceEndpoint; 248 + if (!endpoint) throw new Error(`No PDS found for ${did}`); 249 + 250 + return endpoint; 251 + } 252 + 253 + /** 254 + * @param {string} pds 255 + * @returns {Promise<AuthServerMetadata>} 256 + */ 257 + async function discoverAuthServer(pds) { 258 + try { 259 + const res = await fetch(`${pds}/.well-known/oauth-protected-resource`).then(res => res.json()); 260 + const issuer = /** @type {string} */ (res.authorization_servers[0]); 261 + return await fetch(`${issuer}/.well-known/oauth-authorization-server`).then(res => res.json()); 262 + } catch { 263 + return await fetch(`${pds}/.well-known/oauth-authorization-server`).then(res => res.json()); 264 + } 265 + } 266 + 267 + /** 268 + * Start the OAuth login flow. Stores an authing session in IndexedDB and 269 + * redirects the browser to the authorization server. When the auth server 270 + * redirects back, the service worker will intercept the callback and complete 271 + * the token exchange. 272 + * @param {OAuthConfig} config 273 + * @param {string} handle 274 + * @returns {Promise<void>} 275 + */ 276 + export async function logIn(config, handle) { 277 + const did = await resolveDID(handle); 278 + const pds = await resolvePDS(did); 279 + const [meta, pkce, dpopKey] = await Promise.all([ 280 + discoverAuthServer(pds), 281 + generatePKCE(), 282 + generateDPoPKey(), 283 + ]); 284 + const state = randomB64url(16); 285 + 286 + await putAuthing({ 287 + state, 288 + verifier: pkce.verifier, 289 + dpopKey, 290 + tokenEndpoint: meta.token_endpoint, 291 + issuer: meta.issuer, 292 + did, 293 + pds: new URL(pds).origin, 294 + config, 295 + }); 296 + 297 + const parBody = new URLSearchParams({ 298 + client_id: config.clientId, 299 + redirect_uri: config.redirectUri, 300 + response_type: "code", 301 + scope: config.scope, 302 + state, 303 + code_challenge: pkce.challenge, 304 + code_challenge_method: "S256", 305 + login_hint: handle, 306 + }); 307 + 308 + const { json: parJson } = await dpopPost( 309 + dpopKey, 310 + meta.pushed_authorization_request_endpoint, 311 + parBody, 312 + ); 313 + if (parJson.error) throw new Error("PAR error: " + JSON.stringify(parJson)); 314 + 315 + const authUrl = new URL(meta.authorization_endpoint); 316 + authUrl.searchParams.set("client_id", config.clientId); 317 + authUrl.searchParams.set("request_uri", parJson.request_uri); 318 + location.href = authUrl.href; 319 + } 320 + 321 + const sw = globalThis; 322 + if (typeof ServiceWorkerGlobalScope !== "undefined" && sw instanceof ServiceWorkerGlobalScope) { 323 + sw.oninstall = () => sw.skipWaiting(); 324 + sw.onactivate = e => e.waitUntil(sw.clients.claim()); 325 + sw.onfetch = async e => 326 + e.respondWith( 327 + new Promise(async resolve => { 328 + const url = new URL(e.request.url); 329 + const code = url.searchParams.get("code"); 330 + const state = url.searchParams.get("state"); 331 + if (code && state) { 332 + const authing = await getAuthing(state); 333 + if (authing) return resolve(callback(authing, code, state)); 334 + } 335 + 336 + resolve(authedFetch(e.request)); 337 + }), 338 + ); 339 + } 340 + 341 + /** 342 + * @param {AuthingSession} authing 343 + * @param {string} code 344 + * @param {string} state 345 + */ 346 + async function callback(authing, code, state) { 347 + const body = new URLSearchParams({ 348 + grant_type: "authorization_code", 349 + code, 350 + redirect_uri: authing.config.redirectUri, 351 + client_id: authing.config.clientId, 352 + code_verifier: authing.verifier, 353 + }); 354 + 355 + const { json: tokenJson, dpopNonce } = await dpopPost( 356 + authing.dpopKey, 357 + authing.tokenEndpoint, 358 + body, 359 + ); 360 + if (tokenJson.error) { 361 + return new Response("token error: " + JSON.stringify(tokenJson), { status: 400 }); 362 + } 363 + 364 + /** @type {OAuthSession} */ 365 + const session = { 366 + pds: authing.pds, 367 + did: authing.did, 368 + access_token: tokenJson.access_token, 369 + refresh_token: tokenJson.refresh_token, 370 + dpopKey: authing.dpopKey, 371 + dpopNonce, 372 + tokenEndpoint: authing.tokenEndpoint, 373 + clientId: authing.config.clientId, 374 + expiresAt: Date.now() + (tokenJson.expires_in ?? DEFAULT_TOKEN_TTL) * 1000, 375 + }; 376 + await putSession(session); 377 + await deleteAuthing(state); 378 + 379 + const dest = new URL(authing.config.redirectUri); 380 + return Response.redirect(dest.href, 302); 381 + } 382 + 383 + /** @type {Map<string, Promise<OAuthSession>>} */ 384 + const refreshLocks = new Map(); 385 + 386 + /** @param {OAuthSession} session */ 387 + async function ensureFresh(session) { 388 + if (session.expiresAt > Date.now() || !session.refresh_token) return session; 389 + 390 + // see if this session is already being refreshed 391 + const lock = refreshLocks.get(session.did); 392 + if (lock) return lock; 393 + 394 + // lock the DID 395 + /** @type {PromiseWithResolvers<OAuthSession>} */ 396 + const { promise, resolve, reject } = Promise.withResolvers(); 397 + refreshLocks.set(session.did, promise); 398 + 399 + try { 400 + // refresh the session 401 + const { tokenEndpoint, dpopKey, refresh_token, clientId: client_id } = session; 402 + const body = new URLSearchParams({ grant_type: "refresh_token", refresh_token, client_id }); 403 + const { json, dpopNonce } = await dpopPost(dpopKey, tokenEndpoint, body, session.dpopNonce); 404 + if (json.error) throw new Error("Refresh error: " + JSON.stringify(json)); 405 + 406 + session.access_token = json.access_token; 407 + session.expiresAt = Date.now() + (json.expires_in ?? DEFAULT_TOKEN_TTL) * 1000; 408 + if (json.refresh_token) session.refresh_token = json.refresh_token; 409 + session.dpopNonce = dpopNonce; 410 + 411 + await putSession(session); 412 + resolve(session); 413 + return session; 414 + } catch (e) { 415 + reject(e); 416 + throw e; 417 + } finally { 418 + // release the lock 419 + refreshLocks.delete(session.did); 420 + } 421 + } 422 + 423 + /** @param {Request} req */ 424 + async function authedFetch(req) { 425 + const url = new URL(req.url); 426 + const did = req.headers.get(DID_HEADER); 427 + 428 + /** @type {OAuthSession | undefined} */ 429 + let session; 430 + if (did) session = await getSession(did); 431 + else { 432 + const sessions = await listSessionsByPDS(url.origin); 433 + if (sessions.length > 1) 434 + throw new Error(`Multiple sessions for ${url.origin}; set "x-atsw-did" header`); 435 + session = sessions[0]; 436 + } 437 + 438 + if (!session) return fetch(req); 439 + session = await ensureFresh(session); 440 + 441 + const htu = url.origin + url.pathname; 442 + const htm = req.method; 443 + 444 + let res = new Response(); 445 + for (let attempt = 0; attempt < MAX_DPOP_RETRIES; attempt++) { 446 + if (attempt > 0) session = (await getSession(session.did)) ?? session; 447 + 448 + const ath = b64url(await crypto.subtle.digest("SHA-256", enc.encode(session.access_token))); 449 + const dpop = await createDPoP(session.dpopKey, htm, htu, session.dpopNonce, ath); 450 + 451 + const headers = new Headers(req.headers); 452 + headers.delete(DID_HEADER); 453 + headers.set("authorization", `DPoP ${session.access_token}`); 454 + headers.set("dpop", dpop); 455 + 456 + res = await fetch(new Request(req.clone(), { headers })); 457 + const nonce = res.headers.get("dpop-nonce"); 458 + if (nonce && nonce !== session.dpopNonce) { 459 + session.dpopNonce = nonce; 460 + await putSession(session); 461 + } 462 + 463 + if (res.status !== 401) break; 464 + } 465 + 466 + return /** @type {Response} */ (res); 467 + }
-17
callback.html
··· 1 - <!doctype html> 2 - <script src="./vendor/importmap.js"></script> 3 - <script type="module"> 4 - import { finalizeAuthorization } from "@atcute/oauth-browser-client"; 5 - 6 - import { configure } from "./oauth.js"; 7 - configure(); 8 - 9 - const params = new URLSearchParams(location.hash.slice(1)); 10 - 11 - finalizeAuthorization(params) 12 - .then(agent => { 13 - localStorage.setItem("ypds:did", agent.session.info.sub); 14 - window.location.assign("/y-pds/"); 15 - }) 16 - .catch(err => console.error(err)); 17 - </script>
+4 -4
client-metadata.json
··· 1 1 { 2 - "client_id": "https://6c1c-66-108-106-210.ngrok-free.app/client-metadata.json", 3 - "client_uri": "https://6c1c-66-108-106-210.ngrok-free.app", 4 - "redirect_uris": ["https://6c1c-66-108-106-210.ngrok-free.app/callback.html"], 2 + "client_id": "https://jake.tngl.io/y-pds/client-metadata.json", 3 + "client_uri": "https://jake.tngl.io/y-pds/", 4 + "redirect_uris": ["https://jake.tngl.io/y-pds/"], 5 5 "application_type": "native", 6 - "client_name": "atrtc demo", 6 + "client_name": "y-pds", 7 7 "dpop_bound_access_tokens": true, 8 8 "grant_types": ["authorization_code", "refresh_token"], 9 9 "response_types": ["code"],
+1
index.html
··· 3 3 <head> 4 4 <title>yjs via pds</title> 5 5 <meta charset="utf8" /> 6 + <script>navigator.serviceWorker.register("./atsw.js", { type: "module" });</script> 6 7 <script src="./vendor/importmap.js"></script> 7 8 <link rel="stylesheet" href="./style.css" /> 8 9 </head>
-39
oauth.js
··· 1 - import metadata from "./client-metadata.json" with { type: "json" }; 2 - 3 - export const scope = metadata.scope; 4 - 5 - import { Client } from "@atcute/client"; 6 - import { configureOAuth, OAuthUserAgent } from "@atcute/oauth-browser-client"; 7 - import { 8 - CompositeDidDocumentResolver, 9 - LocalActorResolver, 10 - PlcDidDocumentResolver, 11 - WebDidDocumentResolver, 12 - XrpcHandleResolver, 13 - } from "@atcute/identity-resolver"; 14 - 15 - const resolver = new LocalActorResolver({ 16 - handleResolver: new XrpcHandleResolver({ serviceUrl: "https://public.api.bsky.app" }), 17 - didDocumentResolver: new CompositeDidDocumentResolver({ 18 - methods: { plc: new PlcDidDocumentResolver(), web: new WebDidDocumentResolver() }, 19 - }), 20 - }); 21 - 22 - export function configure() { 23 - configureOAuth({ 24 - metadata: { client_id: metadata.client_id, redirect_uri: metadata.redirect_uris[0] }, 25 - identityResolver: resolver, 26 - }); 27 - } 28 - 29 - /** @param {string} handleOrDid */ 30 - export async function resolve(handleOrDid) { 31 - const { did } = await resolver.resolve(handleOrDid); 32 - return did; 33 - } 34 - 35 - /** @param {import("@atcute/oauth-browser-client").Session} */ 36 - export function client(session) { 37 - const handler = new OAuthUserAgent(session); 38 - return new Client({ handler }); 39 - }
-3
unpm.json
··· 4 4 "preact/hooks": "https://esm.sh/preact/hooks", 5 5 "htm/preact": "https://esm.sh/htm/preact?external=preact", 6 6 "@preact/signals": "https://esm.sh/@preact/signals?external=preact", 7 - "@atcute/client": "https://esm.sh/@atcute/client", 8 - "@atcute/identity-resolver": "https://esm.sh/@atcute/identity-resolver", 9 - "@atcute/oauth-browser-client": "https://esm.sh/@atcute/oauth-browser-client@3.0.0", 10 7 "prosemirror-state": "https://esm.sh/prosemirror-state", 11 8 "prosemirror-view": "https://esm.sh/prosemirror-view", 12 9 "prosemirror-model": "https://esm.sh/prosemirror-model",
-3
vendor/esm.sh/@atcute/client@4.2.1/es2022/client.mjs
··· 1 - /* esm.sh - @atcute/client@4.2.1 */ 2 - import*as u from"../../lexicons@1.2.10/es2022/validations.mjs";var v=s=>typeof s=="object"?s.handle.bind(s):s,S=({service:s,fetch:e=fetch})=>async(t,r)=>{let n=new URL(t,s);return await e(n.href,r)};var E=/\bapplication\/json\b/,w=class s{handler;proxy;constructor({handler:e,proxy:t=null}){this.handler=v(e),this.proxy=t}clone({handler:e=this.handler,proxy:t=this.proxy}={}){return new s({handler:e,proxy:t})}get(e,t={}){return this.#e("get",e,t)}post(e,t={}){return this.#e("post",e,t)}async call(e,t={}){if(!u.xrpcSchemaGenerated)return;if("mainSchema"in e&&(e=e.mainSchema),e.params!==null){let a=u.safeParse(e.params,t.params);if(!a.ok)throw new f("params",a)}if(e.type==="xrpc_procedure"&&e.input?.type==="lex"){let a=u.safeParse(e.input.schema,t.input);if(!a.ok)throw new f("input",a)}let r=e.type==="xrpc_query",n=r?"get":"post";if(t.as===void 0&&e.output?.type==="blob")throw new TypeError("`as` option is required for endpoints returning blobs");let i=t.as!==void 0?t.as:e.output?.type==="lex"?"json":null,o=await this.#e(n,e.nsid,{params:t.params,input:r?void 0:t.input,as:i,signal:t.signal,headers:t.headers});if(i==="json"&&o.ok&&e.output?.type==="lex"){let a=u.safeParse(e.output.schema,o.data);if(!a.ok)throw new f("output",a);return{ok:!0,status:o.status,headers:o.headers,data:a.value}}return o}async#e(e,t,{signal:r,as:n="json",headers:i,input:o,params:a}){let k=o&&(o instanceof Blob||ArrayBuffer.isView(o)||o instanceof ArrayBuffer||o instanceof ReadableStream),R=`/xrpc/${t}`+J(a),c=await this.handler(R,{method:e,signal:r,body:o&&!k?JSON.stringify(o):o,headers:P(i,{"content-type":o&&!k?"application/json":null,"atproto-proxy":U(this.proxy)}),duplex:o instanceof ReadableStream?"half":void 0});{let p=c.status,m=c.headers,l=m.get("content-type");if(p!==200){let h;if(l!=null&&E.test(l))try{let x=await c.json();b(x)&&(h=x)}catch{}else await c.body?.cancel();return{ok:!1,status:p,headers:m,data:h??{error:"UnknownXRPCError",message:`Request failed with status code ${p}`}}}{let h;switch(n){case"json":{if(l!=null&&E.test(l))h=await c.json();else throw await c.body?.cancel(),new TypeError(`Invalid response content-type (got ${l})`);break}case null:{h=null,await c.body?.cancel();break}case"blob":{h=await c.blob();break}case"bytes":{h=new Uint8Array(await c.arrayBuffer());break}case"stream":{h=c.body;break}}return{ok:!0,status:p,headers:m,data:h}}}}},J=s=>{let e;for(let t in s){let r=s[t];if(r!==void 0)if(e??=new URLSearchParams,Array.isArray(r))for(let n=0,i=r.length;n<i;n++){let o=r[n];e.append(t,""+o)}else e.set(t,""+r)}return e?"?"+e.toString():""},U=s=>s!=null?`${s.did}${s.serviceId}`:null,P=(s,e)=>{let t;for(let r in e){let n=e[r];n!==null&&(t??=new Headers(s),t.has(r)||t.set(r,n))}return t??s},b=s=>{if(typeof s!="object"||s==null)return!1;let e=typeof s.error,t=typeof s.message;return e==="string"&&(t==="undefined"||t==="string")},y=s=>{if(s instanceof Promise)return s.then(y);if(s.ok)return s.data;throw new d(s)},d=class extends Error{error;description;status;headers;constructor({status:e,headers:t=new Headers,data:r}){super(`${r.error} > ${r.message??"(unspecified description)"}`),this.name="ClientResponseError",this.error=r.error,this.description=r.message,this.status=e,this.headers=t}},f=class extends Error{target;result;constructor(e,t){super(`validation failed for ${e}: ${t.message}`),this.name="ClientValidationError",this.target=e,this.result=t}};import{getPdsEndpoint as I}from"../../identity@1.1.4/es2022/identity.mjs";var g=s=>{let t=s.split(".")[1],r;if(typeof t!="string")throw new Error("invalid token: missing part 2");try{r=j(t)}catch(n){throw new Error("invalid token: invalid b64 for part 2 ("+n.message+")")}try{return JSON.parse(r)}catch(n){throw new Error("invalid token: invalid json for part 2 ("+n.message+")")}},j=s=>{let e=s.replace(/-/g,"+").replace(/_/g,"/");switch(e.length%4){case 0:break;case 2:e+="==";break;case 3:e+="=";break;default:throw new Error("base64 string is not of the correct length")}try{return $(e)}catch{return atob(e)}},$=s=>decodeURIComponent(atob(s).replace(/(.)/g,(e,t)=>{let r=t.charCodeAt(0).toString(16).toUpperCase();return r.length<2&&(r="0"+r),"%"+r}));var T=class{serviceUrl;fetch;#e;#t;#s;#n;#o;session;constructor({service:e,onExpired:t,onRefresh:r,onSessionUpdate:n,fetch:i=fetch}){this.serviceUrl=e,this.fetch=i,this.#e=new w({handler:S({service:e,fetch:i})}),this.#n=r,this.#s=t,this.#o=n}get dispatchUrl(){return this.session?.pdsUri??this.serviceUrl}async handle(e,t){await this.#t;let r=new URL(e,this.dispatchUrl),n=new Headers(t.headers);if(!this.session||n.has("authorization"))return(0,this.fetch)(r,t);let i=this.session.accessJwt;n.set("authorization",`Bearer ${i}`);let o=await(0,this.fetch)(r,{...t,headers:n});if(o.status!==401&&!await C(o))return o;try{await this.#a()}catch{return o}let a=this.session?.accessJwt;return t.signal?.aborted||!a||a===i||t.body instanceof ReadableStream?o:(await o.body?.cancel(),n.set("authorization",`Bearer ${a}`),await(0,this.fetch)(r,{...t,headers:n}))}#a(){return this.#t||=this.#i().finally(()=>this.#t=void 0)}async#i(){let e=this.session;if(!e)return;let t=await this.#e.post("com.atproto.server.refreshSession",{headers:{authorization:`Bearer ${e.refreshJwt}`}});if(!t.ok)throw(t.status===401||t.data.error==="ExpiredToken"||t.data.error==="InvalidToken")&&(this.session=void 0,this.#s?.(e)),new d(t);if(t.data.did!==e.did)throw this.session=void 0,this.#s?.(e),new d({status:401,data:{error:"InvalidDID"}});if(this.session!==e)throw new Error("concurrent session update detected");this.#r({...e,...t.data}),this.#n?.(this.session)}#r(e){let t=e.didDoc,r;t&&(r=I(t));let n={accessJwt:e.accessJwt,refreshJwt:e.refreshJwt,handle:e.handle,did:e.did,pdsUri:r,email:e.email,emailConfirmed:e.emailConfirmed,emailAuthFactor:e.emailAuthFactor,active:e.active??!0,inactiveStatus:e.status};return this.session=n,this.#o?.(n),n}async resume(e){if(e.refreshJwt===this.session?.refreshJwt){if(await this.#t,!this.session||e.did!==this.session.did)throw new d({status:401,data:{error:"InvalidToken"}});return this.session}let t=Date.now()/1e3+300,r=g(e.refreshJwt);if(t>=r.exp||r.sub!==e.did)throw new d({status:401,data:{error:"InvalidToken"}});let n=g(e.accessJwt);if(n.sub!==e.did)throw new d({status:401,data:{error:"InvalidToken"}});if(this.session=e,this.#t=void 0,t>=n.exp?await this.#a():y(this.#e.get("com.atproto.server.getSession",{headers:{authorization:`Bearer ${e.accessJwt}`}})).then(o=>{let a=this.session;!a||a.did!==o.did||this.#r({...a,...o})},o=>{}),!this.session)throw new d({status:401,data:{error:"InvalidToken"}});return this.session}async login(e){this.session=void 0,this.#t=void 0;let t=await y(this.#e.post("com.atproto.server.createSession",{input:{identifier:e.identifier,password:e.password,authFactorToken:e.code,allowTakendown:e.allowTakendown}}));return this.#r(t)}async logout(){let e=this.session;if(e){this.session=void 0,this.#t=void 0;try{await this.#e.post("com.atproto.server.deleteSession",{as:null,headers:{authorization:`Bearer ${e.refreshJwt}`}})}catch{}}}},C=async s=>{if(s.status!==400||_(s.headers)!=="application/json"||B(s.headers)>54*1.5)return!1;try{let e=await s.clone().json();if(b(e))return e.error==="ExpiredToken"}catch{}return!1},_=s=>s.get("content-type")?.split(";")[0]?.trim(),B=s=>Number(s.get("content-length")??";");export{w as Client,d as ClientResponseError,f as ClientValidationError,T as CredentialManager,v as buildFetchHandler,b as isXRPCErrorPayload,y as ok,S as simpleFetchHandler}; 3 - //# sourceMappingURL=./client.mjs.map
-1
vendor/esm.sh/@atcute/client@4.2.1/es2022/client.mjs.map
··· 1 - {"mappings":";AAEA,UAAYA,MAAO,qDCMZ,IAAMC,EAAqBC,GAC7B,OAAOA,GAAY,SACfA,EAAQ,OAAO,KAAKA,CAAO,EAG5BA,EAQKC,EAAqB,CAAC,CAClC,QAAAC,EACA,MAAOC,EAAS,KAAK,IAEd,MAAOC,EAAUC,IAAS,CAChC,IAAMC,EAAM,IAAI,IAAIF,EAAUF,CAAO,EACrC,OAAO,MAAMC,EAAOG,EAAI,KAAMD,CAAI,CAAE,ED4LtC,IAAME,EAAuB,wBAGhBC,EAAP,MAAOC,CAAM,CAClB,QACA,MAEA,YAAY,CAAE,QAAAC,EAAS,MAAAC,EAAQ,IAAI,EAAmB,CACrD,KAAK,QAAUC,EAAkBF,CAAO,EACxC,KAAK,MAAQC,CAAM,CAQpB,MAAM,CAAE,QAAAD,EAAU,KAAK,QAAS,MAAAC,EAAQ,KAAK,KAAK,EAA6B,CAAA,EAG7E,CACD,OAAO,IAAIF,EAAO,CAAE,QAAAC,EAAS,MAAAC,CAAK,CAAE,CAAE,CAavC,IAAIE,EAAcC,EAAkC,CAAA,EAAI,CACvD,OAAO,KAAKC,GAAS,MAAOF,EAAMC,CAAO,CAAE,CAa5C,KAAKD,EAAcC,EAAkC,CAAA,EAAI,CACxD,OAAO,KAAKC,GAAS,OAAQF,EAAMC,CAAO,CAAE,CAa7C,MAAM,KAAKE,EAAaF,EAAe,CAAA,EAAkB,CAExD,GAAI,CAAG,sBACN,OAQD,GAJI,eAAgBE,IACnBA,EAASA,EAAO,YAGbA,EAAO,SAAW,KAAM,CAC3B,IAAMC,EAAiB,YAAUD,EAAO,OAAQF,EAAQ,MAAM,EAC9D,GAAI,CAACG,EAAa,GACjB,MAAM,IAAIC,EAAsB,SAAUD,CAAY,CAExD,CAEA,GAAID,EAAO,OAAS,kBAAoBA,EAAO,OAAO,OAAS,MAAO,CACrE,IAAMG,EAAgB,YAAUH,EAAO,MAAM,OAAQF,EAAQ,KAAK,EAClE,GAAI,CAACK,EAAY,GAChB,MAAM,IAAID,EAAsB,QAASC,CAAW,CAEtD,CAEA,IAAMC,EAAUJ,EAAO,OAAS,aAC1BK,EAASD,EAAU,MAAQ,OAEjC,GAAIN,EAAQ,KAAO,QAAaE,EAAO,QAAQ,OAAS,OACvD,MAAM,IAAI,UAAU,uDAAyD,EAG9E,IAAMM,EAASR,EAAQ,KAAO,OAAYA,EAAQ,GAAKE,EAAO,QAAQ,OAAS,MAAQ,OAAS,KAE1FO,EAAW,MAAM,KAAKR,GAASM,EAAQL,EAAO,KAAM,CACzD,OAAQF,EAAQ,OAChB,MAAOM,EAAU,OAAYN,EAAQ,MACrC,GAAIQ,EACJ,OAAQR,EAAQ,OAChB,QAASA,EAAQ,QACjB,EAED,GAAIQ,IAAW,QAAUC,EAAS,IAAMP,EAAO,QAAQ,OAAS,MAAO,CACtE,IAAMQ,EAAiB,YAAUR,EAAO,OAAO,OAAQO,EAAS,IAAI,EACpE,GAAI,CAACC,EAAa,GACjB,MAAM,IAAIN,EAAsB,SAAUM,CAAY,EAGvD,MAAO,CACN,GAAI,GACJ,OAAQD,EAAS,OACjB,QAASA,EAAS,QAClB,KAAMC,EAAa,MAErB,CAEA,OAAOD,CAAS,CAGjB,KAAMR,GACLM,EACAR,EACA,CAAE,OAAAY,EAAQ,GAAIH,EAAS,OAAQ,QAAAI,EAAS,MAAAC,EAAO,OAAAC,CAAM,EACpD,CACD,IAAMC,EACLF,IACCA,aAAiB,MACjB,YAAY,OAAOA,CAAK,GACxBA,aAAiB,aACjBA,aAAiB,gBAEbG,EAAM,SAASjB,CAAI,GAAKkB,EAAuBH,CAAM,EAErDL,EAAW,MAAM,KAAK,QAAQO,EAAK,CACxC,OAAAT,EACA,OAAAI,EACA,KAAME,GAAS,CAACE,EAAa,KAAK,UAAUF,CAAK,EAAIA,EACrD,QAASK,EAAcN,EAAS,CAC/B,eAAgBC,GAAS,CAACE,EAAa,mBAAqB,KAC5D,gBAAiBI,EAAsB,KAAK,KAAK,EACjD,EACD,OAAQN,aAAiB,eAAiB,OAAS,OACnD,EAED,CACC,IAAMO,EAASX,EAAS,OAClBG,EAAUH,EAAS,QAEnBY,EAAOT,EAAQ,IAAI,cAAc,EAEvC,GAAIQ,IAAW,IAAK,CACnB,IAAIE,EAEJ,GAAID,GAAQ,MAAQ5B,EAAqB,KAAK4B,CAAI,EAEjD,GAAI,CACH,IAAME,EAAS,MAAMd,EAAS,KAAI,EAC9Be,EAAmBD,CAAM,IAC5BD,EAAOC,EAET,MAAQ,CAAC,MAET,MAAMd,EAAS,MAAM,OAAM,EAG5B,MAAO,CACN,GAAI,GACJ,OAAQW,EACR,QAASR,EACT,KAAMU,GAAQ,CACb,MAAO,mBACP,QAAS,mCAAmCF,CAAM,IAGrD,CAEA,CACC,IAAIK,EACJ,OAAQjB,EAAQ,CACf,IAAK,OAAQ,CACZ,GAAIa,GAAQ,MAAQ5B,EAAqB,KAAK4B,CAAI,EAEjDI,EAAO,MAAMhB,EAAS,KAAI,MAE1B,aAAMA,EAAS,MAAM,OAAM,EAErB,IAAI,UAAU,sCAAsCY,CAAI,GAAG,EAGlE,KACD,CAEA,KAAK,KAAM,CACVI,EAAO,KAEP,MAAMhB,EAAS,MAAM,OAAM,EAE3B,KACD,CAEA,IAAK,OAAQ,CACZgB,EAAO,MAAMhB,EAAS,KAAI,EAC1B,KACD,CACA,IAAK,QAAS,CACbgB,EAAO,IAAI,WAAW,MAAMhB,EAAS,YAAW,CAAE,EAClD,KACD,CACA,IAAK,SAAU,CACdgB,EAAOhB,EAAS,KAChB,KACD,CACD,CAEA,MAAO,CACN,GAAI,GACJ,OAAQW,EACR,QAASR,EACT,KAAMa,EAER,CACD,CAAC,GAOGR,EAA0BH,GAAwD,CACvF,IAAIY,EAEJ,QAAWC,KAAOb,EAAQ,CACzB,IAAMc,EAAQd,EAAOa,CAAG,EAExB,GAAIC,IAAU,OAGb,GAFAF,IAAiB,IAAI,gBAEjB,MAAM,QAAQE,CAAK,EACtB,QAASC,EAAM,EAAGC,EAAMF,EAAM,OAAQC,EAAMC,EAAKD,IAAO,CACvD,IAAME,EAAMH,EAAMC,CAAG,EACrBH,EAAa,OAAOC,EAAK,GAAKI,CAAG,CAClC,MAEAL,EAAa,IAAIC,EAAK,GAAKC,CAAK,CAGnC,CAEA,OAAOF,EAAe,IAAMA,EAAa,SAAQ,EAAK,EAAG,EAGpDP,EAAyBtB,GAC1BA,GAAS,KACL,GAAGA,EAAM,GAAG,GAAGA,EAAM,SAAS,GAG/B,KAGFqB,EAAgB,CACrBc,EACAC,IAC6B,CAC7B,IAAIrB,EAEJ,QAAWb,KAAQkC,EAAU,CAC5B,IAAML,EAAQK,EAASlC,CAAI,EAEvB6B,IAAU,OACbhB,IAAY,IAAI,QAAQoB,CAAI,EAEvBpB,EAAQ,IAAIb,CAAI,GACpBa,EAAQ,IAAIb,EAAM6B,CAAK,EAG1B,CAEA,OAAOhB,GAAWoB,CAAK,EAGXR,EAAsBX,GAA0C,CAC5E,GAAI,OAAOA,GAAU,UAAYA,GAAS,KACzC,MAAO,GAGR,IAAMqB,EAAW,OAAOrB,EAAM,MACxBsB,EAAc,OAAOtB,EAAM,QAEjC,OAAOqB,IAAa,WAAaC,IAAgB,aAAeA,IAAgB,SAAU,EAiB9EC,EAGRvB,GAAuE,CAC3E,GAAIA,aAAiB,QACpB,OAAOA,EAAM,KAAKuB,CAAE,EAGrB,GAAIvB,EAAM,GACT,OAAOA,EAAM,KAGd,MAAM,IAAIwB,EAAoBxB,CAAK,CAAE,EAWzBwB,EAAP,cAAmC,KAAK,CAEpC,MAEA,YAGA,OAEA,QAET,YAAY,CAAE,OAAAjB,EAAQ,QAAAR,EAAU,IAAI,QAAW,KAAAa,CAAI,EAAgC,CAClF,MAAM,GAAGA,EAAK,KAAK,MAAMA,EAAK,SAAW,2BAA2B,EAAE,EAEtE,KAAK,KAAO,sBAEZ,KAAK,MAAQA,EAAK,MAClB,KAAK,YAAcA,EAAK,QAExB,KAAK,OAASL,EACd,KAAK,QAAUR,CAAQ,GAKZR,EAAP,cAAqC,KAAK,CAEtC,OAEA,OAET,YAAYkC,EAAuCC,EAAe,CACjE,MAAM,yBAAyBD,CAAM,KAAKC,EAAO,OAAO,EAAE,EAE1D,KAAK,KAAO,wBACZ,KAAK,OAASD,EACd,KAAK,OAASC,CAAO,GErkBvB,OAAS,kBAAAC,MAAwC,yCCY1C,IAAMC,EAAaC,GAA2B,CAEpD,IAAMC,EAAOD,EAAM,MAAM,GAAG,EAAE,CAAC,EAE3BE,EAEJ,GAAI,OAAOD,GAAS,SACnB,MAAM,IAAI,MAAM,+BAA0C,EAG3D,GAAI,CACHC,EAAUC,EAAgBF,CAAI,CAC/B,OAASG,EAAG,CACX,MAAM,IAAI,MAAM,0CAA6DA,EAAY,QAAU,GAAG,CACvG,CAEA,GAAI,CACH,OAAO,KAAK,MAAMF,CAAO,CAC1B,OAASE,EAAG,CACX,MAAM,IAAI,MAAM,2CAA8DA,EAAY,QAAU,GAAG,CACxG,CAAC,EAQWD,EAAmBE,GAAwB,CACvD,IAAIC,EAASD,EAAI,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,GAAG,EAErD,OAAQC,EAAO,OAAS,EAAG,CAC1B,IAAK,GACJ,MACD,IAAK,GACJA,GAAU,KACV,MACD,IAAK,GACJA,GAAU,IACV,MACD,QACC,MAAM,IAAI,MAAM,4CAA4C,CAC9D,CAEA,GAAI,CACH,OAAOC,EAAiBD,CAAM,CAC/B,MAAQ,CACP,OAAO,KAAKA,CAAM,CACnB,CAAC,EAGIC,EAAoBF,GAClB,mBACN,KAAKA,CAAG,EAAE,QAAQ,OAAQ,CAACG,EAAIC,IAAM,CACpC,IAAIC,EAAOD,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAW,EAEnD,OAAIC,EAAK,OAAS,IACjBA,EAAO,IAAMA,GAGP,IAAMA,CAAK,CAClB,CAAC,EDeE,IAAOC,EAAP,KAAwB,CAEpB,WAET,MAGAC,GAEAC,GAGAC,GAEAC,GAEAC,GAGA,QAEA,YAAY,CACX,QAAAC,EACA,UAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,MAAOC,EAAS,KAAK,EACO,CAC5B,KAAK,WAAaJ,EAClB,KAAK,MAAQI,EAEb,KAAKT,GAAU,IAAIU,EAAO,CAAE,QAASC,EAAmB,CAAE,QAAAN,EAAS,MAAOI,CAAM,CAAE,CAAC,CAAE,EAErF,KAAKN,GAAaI,EAClB,KAAKL,GAAaI,EAClB,KAAKF,GAAmBI,CAAgB,CAIzC,IAAI,aAAc,CACjB,OAAO,KAAK,SAAS,QAAU,KAAK,UAAW,CAGhD,MAAM,OAAOI,EAAkBC,EAAsC,CACpE,MAAM,KAAKZ,GAEX,IAAMa,EAAM,IAAI,IAAIF,EAAU,KAAK,WAAW,EACxCG,EAAU,IAAI,QAAQF,EAAK,OAAO,EAExC,GAAI,CAAC,KAAK,SAAWE,EAAQ,IAAI,eAAe,EAC/C,SAAW,KAAK,OAAOD,EAAKD,CAAI,EAGjC,IAAMG,EAAe,KAAK,QAAQ,UAClCD,EAAQ,IAAI,gBAAiB,UAAUC,CAAY,EAAE,EAErD,IAAMC,EAAkB,QAAU,KAAK,OAAOH,EAAK,CAAE,GAAGD,EAAM,QAAAE,CAAO,CAAE,EAEvE,GAAIE,EAAgB,SAAW,KAAO,CAAE,MAAMC,EAAuBD,CAAe,EACnF,OAAOA,EAGR,GAAI,CACH,MAAM,KAAKE,GAAe,CAC3B,MAAQ,CACP,OAAOF,CACR,CAOA,IAAMG,EAAe,KAAK,SAAS,UACnC,OACCP,EAAK,QAAQ,SACb,CAACO,GACDA,IAAiBJ,GACjBH,EAAK,gBAAgB,eAEdI,GAIR,MAAMA,EAAgB,MAAM,OAAM,EAElCF,EAAQ,IAAI,gBAAiB,UAAUK,CAAY,EAAE,EAC9C,QAAU,KAAK,OAAON,EAAK,CAAE,GAAGD,EAAM,QAAAE,CAAO,CAAE,EAAE,CAGzDI,IAAkB,CACjB,OAAQ,KAAKlB,KAA2B,KAAKoB,GAAoB,EAAG,QACnE,IAAO,KAAKpB,GAAyB,MAAU,CAC7C,CAGJ,KAAMoB,IAAsC,CAC3C,IAAMC,EAAiB,KAAK,QAC5B,GAAI,CAACA,EACJ,OAGD,IAAMC,EAAW,MAAM,KAAKvB,GAAQ,KAAK,oCAAqC,CAC7E,QAAS,CACR,cAAe,UAAUsB,EAAe,UAAU,IAEnD,EAED,GAAI,CAACC,EAAS,GAMb,MAJCA,EAAS,SAAW,KACpBA,EAAS,KAAK,QAAU,gBACxBA,EAAS,KAAK,QAAU,kBAGxB,KAAK,QAAU,OACf,KAAKrB,KAAaoB,CAAc,GAG3B,IAAIE,EAAoBD,CAAQ,EAIvC,GAAIA,EAAS,KAAK,MAAQD,EAAe,IACxC,WAAK,QAAU,OACf,KAAKpB,KAAaoB,CAAc,EAC1B,IAAIE,EAAoB,CAAE,OAAQ,IAAK,KAAM,CAAE,MAAO,YAAY,CAAE,CAAE,EAI7E,GAAI,KAAK,UAAYF,EACpB,MAAM,IAAI,MAAM,oCAAoC,EAGrD,KAAKG,GAAe,CAAE,GAAGH,EAAgB,GAAGC,EAAS,IAAI,CAAE,EAC3D,KAAKpB,KAAa,KAAK,OAAQ,CAAE,CAGlCsB,GAAeC,EAA4D,CAC1E,IAAMC,EAASD,EAAI,OAEfE,EACAD,IACHC,EAASC,EAAeF,CAAM,GAG/B,IAAMG,EAA6B,CAClC,UAAWJ,EAAI,UACf,WAAYA,EAAI,WAChB,OAAQA,EAAI,OACZ,IAAKA,EAAI,IACT,OAAQE,EACR,MAAOF,EAAI,MACX,eAAgBA,EAAI,eACpB,gBAAiBA,EAAI,gBACrB,OAAQA,EAAI,QAAU,GACtB,eAAgBA,EAAI,QAGrB,YAAK,QAAUI,EACf,KAAK1B,KAAmB0B,CAAU,EAE3BA,CAAW,CAOnB,MAAM,OAAOC,EAAkD,CAE9D,GAAIA,EAAQ,aAAe,KAAK,SAAS,WAAY,CAEpD,GADA,MAAM,KAAK9B,GACP,CAAC,KAAK,SAAW8B,EAAQ,MAAQ,KAAK,QAAQ,IACjD,MAAM,IAAIP,EAAoB,CAAE,OAAQ,IAAK,KAAM,CAAE,MAAO,cAAc,CAAE,CAAE,EAE/E,OAAO,KAAK,OACb,CAEA,IAAMQ,EAAM,KAAK,IAAG,EAAK,IAAQ,IAE3BC,EAAeC,EAAUH,EAAQ,UAAU,EACjD,GAAIC,GAAOC,EAAa,KAAOA,EAAa,MAAQF,EAAQ,IAC3D,MAAM,IAAIP,EAAoB,CAAE,OAAQ,IAAK,KAAM,CAAE,MAAO,cAAc,CAAE,CAAE,EAG/E,IAAMW,EAAcD,EAAUH,EAAQ,SAAS,EAC/C,GAAII,EAAY,MAAQJ,EAAQ,IAC/B,MAAM,IAAIP,EAAoB,CAAE,OAAQ,IAAK,KAAM,CAAE,MAAO,cAAc,CAAE,CAAE,EAmC/E,GA/BA,KAAK,QAAUO,EACf,KAAK9B,GAAyB,OAE1B+B,GAAOG,EAAY,IAEtB,MAAM,KAAKhB,GAAe,EAGViB,EACf,KAAKpC,GAAQ,IAAI,gCAAiC,CACjD,QAAS,CACR,cAAe,UAAU+B,EAAQ,SAAS,IAE3C,CAAC,EAGK,KACNM,GAAS,CACT,IAAMC,EAAW,KAAK,QAClB,CAACA,GAAYA,EAAS,MAAQD,EAAK,KAIvC,KAAKZ,GAAe,CAAE,GAAGa,EAAU,GAAGD,CAAI,CAAE,CAAE,EAE9CE,GAAS,CAAC,CAEV,EAIC,CAAC,KAAK,QACT,MAAM,IAAIf,EAAoB,CAAE,OAAQ,IAAK,KAAM,CAAE,MAAO,cAAc,CAAE,CAAE,EAG/E,OAAO,KAAK,OAAQ,CAQrB,MAAM,MAAMgB,EAAoD,CAE/D,KAAK,QAAU,OACf,KAAKvC,GAAyB,OAE9B,IAAM8B,EAAU,MAAMK,EACrB,KAAKpC,GAAQ,KAAK,mCAAoC,CACrD,MAAO,CACN,WAAYwC,EAAQ,WACpB,SAAUA,EAAQ,SAClB,gBAAiBA,EAAQ,KACzB,eAAgBA,EAAQ,gBAEzB,CAAC,EAGH,OAAO,KAAKf,GAAeM,CAAO,CAAE,CAMrC,MAAM,QAAwB,CAC7B,IAAMT,EAAiB,KAAK,QAC5B,GAAKA,EAIL,MAAK,QAAU,OACf,KAAKrB,GAAyB,OAE9B,GAAI,CACH,MAAM,KAAKD,GAAQ,KAAK,mCAAoC,CAC3D,GAAI,KACJ,QAAS,CACR,cAAe,UAAUsB,EAAe,UAAU,IAEnD,CACF,MAAQ,CAER,EAAC,GAgBGJ,EAAyB,MAAOK,GAAyC,CAc9E,GAbIA,EAAS,SAAW,KAIpBkB,EAAmBlB,EAAS,OAAO,IAAM,oBASzCmB,EAAqBnB,EAAS,OAAO,EAAI,GAAK,IACjD,MAAO,GAGR,GAAI,CACH,IAAMoB,EAAO,MAAMpB,EAAS,MAAK,EAAG,KAAI,EACxC,GAAIqB,EAAmBD,CAAI,EAC1B,OAAOA,EAAK,QAAU,cAExB,MAAQ,CAAC,CAET,MAAO,EAAM,EAGRF,EAAsB1B,GACpBA,EAAQ,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,KAAI,EAElD2B,EAAwB3B,GACtB,OAAOA,EAAQ,IAAI,gBAAgB,GAAK,GAAG","names":["v","buildFetchHandler","handler","simpleFetchHandler","service","_fetch","pathname","init","url","JSON_CONTENT_TYPE_RE","Client","_Client","handler","proxy","buildFetchHandler","name","options","#perform","schema","paramsResult","ClientValidationError","inputResult","isQuery","method","format","response","outputResult","signal","headers","input","params","isWebInput","url","_constructSearchParams","_mergeHeaders","_constructProxyHeader","status","type","json","parsed","isXRPCErrorPayload","data","searchParams","key","value","idx","len","val","init","defaults","kindType","messageType","ok","ClientResponseError","target","result","getPdsEndpoint","decodeJwt","token","part","decoded","base64UrlDecode","e","str","output","b64DecodeUnicode","_m","p","code","CredentialManager","#server","#refreshSessionPromise","#onExpired","#onRefresh","#onSessionUpdate","service","onExpired","onRefresh","onSessionUpdate","_fetch","Client","simpleFetchHandler","pathname","init","url","headers","initialToken","initialResponse","isExpiredTokenResponse","#refreshSession","updatedToken","#refreshSessionInner","currentSession","response","ClientResponseError","#updateSession","raw","didDoc","pdsUri","getPdsEndpoint","newSession","session","now","refreshToken","decodeJwt","accessToken","ok","next","existing","_err","options","extractContentType","extractContentLength","data","isXRPCErrorPayload"],"sources":["../esm/npm/@atcute/client@4.2.1/node_modules/@atcute/client/lib/client.ts","../esm/npm/@atcute/client@4.2.1/node_modules/@atcute/client/lib/fetch-handler.ts","../esm/npm/@atcute/client@4.2.1/node_modules/@atcute/client/lib/credential-manager.ts","../esm/npm/@atcute/client@4.2.1/node_modules/@atcute/client/lib/utils/jwt.ts"],"sourcesContent":["import type { Did } from '@atcute/lexicons';\nimport type { XRPCProcedures, XRPCQueries } from '@atcute/lexicons/ambient';\nimport * as v from '@atcute/lexicons/validations';\nimport type {\n\tInferInput,\n\tInferOutput,\n\tObjectSchema,\n\tXRPCBlobBodyParam,\n\tXRPCLexBodyParam,\n\tXRPCProcedureMetadata,\n\tXRPCQueryMetadata,\n} from '@atcute/lexicons/validations';\n\nimport { buildFetchHandler, type FetchHandler, type FetchHandlerObject } from './fetch-handler.js';\n\n// #region Type utilities\ntype RequiredKeysOf\u003cTType extends object\u003e = TType extends any\n\t? Exclude\u003c\n\t\t\t{\n\t\t\t\t[Key in keyof TType]: TType extends Record\u003cKey, TType[Key]\u003e ? Key : never;\n\t\t\t}[keyof TType],\n\t\t\tundefined\n\t\t\u003e\n\t: never;\n\ntype HasRequiredKeys\u003cTType extends object\u003e = RequiredKeysOf\u003cTType\u003e extends never ? false : true;\n\n// #endregion\n\n// #region Type definitions for response formats\ntype ResponseFormat = 'json' | 'blob' | 'bytes' | 'stream';\n\ntype FormattedResponse\u003cTDef\u003e = {\n\tjson: TDef extends XRPCQueryMetadata\u003cany, infer Body extends XRPCLexBodyParam, any\u003e\n\t\t? InferOutput\u003cBody['schema']\u003e\n\t\t: TDef extends XRPCProcedureMetadata\u003cany, any, infer Body extends XRPCLexBodyParam, any\u003e\n\t\t\t? InferOutput\u003cBody['schema']\u003e\n\t\t\t: unknown;\n\tblob: Blob;\n\tbytes: Uint8Array;\n\tstream: ReadableStream\u003cUint8Array\u003e;\n};\n\n// #endregion\n\n// #region Type definitions for request options\ntype BaseRequestOptions = {\n\tsignal?: AbortSignal;\n\theaders?: HeadersInit;\n};\n\nexport type QueryRequestOptions\u003cTDef\u003e = BaseRequestOptions \u0026\n\t(TDef extends XRPCQueryMetadata\u003cinfer Params, infer Output, any\u003e\n\t\t? (Params extends ObjectSchema\n\t\t\t\t? // query has parameters\n\t\t\t\t\t{ params: InferInput\u003cParams\u003e }\n\t\t\t\t: // query has no parameters\n\t\t\t\t\t{ params?: Record\u003cstring, unknown\u003e }) \u0026\n\t\t\t\t(Output extends XRPCLexBodyParam // query has JSON response, format is optionally specified\n\t\t\t\t\t? { as?: ResponseFormat | null }\n\t\t\t\t\t: // query doesn't have JSON response, format needs to be specified\n\t\t\t\t\t\t{ as: ResponseFormat | null })\n\t\t: {\n\t\t\t\tas: ResponseFormat | null;\n\t\t\t\tparams?: Record\u003cstring, unknown\u003e;\n\t\t\t});\n\nexport type ProcedureRequestOptions\u003cTDef\u003e = BaseRequestOptions \u0026\n\t(TDef extends XRPCProcedureMetadata\u003cinfer Params, infer Input, infer Output, any\u003e\n\t\t? (Params extends ObjectSchema\n\t\t\t\t? // procedure has parameters\n\t\t\t\t\t{ params: InferInput\u003cParams\u003e }\n\t\t\t\t: // procedure has no parameters\n\t\t\t\t\t{ params?: Record\u003cstring, unknown\u003e }) \u0026\n\t\t\t\t(Input extends XRPCLexBodyParam\n\t\t\t\t\t? // procedure requires JSON input\n\t\t\t\t\t\t{ input: InferInput\u003cInput['schema']\u003e }\n\t\t\t\t\t: Input extends XRPCBlobBodyParam\n\t\t\t\t\t\t? // procedure requires blob\n\t\t\t\t\t\t\t{ input: Blob | ArrayBuffer | ArrayBufferView | ReadableStream }\n\t\t\t\t\t\t: // procedure doesn't specify input\n\t\t\t\t\t\t\t{ input?: Record\u003cstring, unknown\u003e | Blob | ArrayBuffer | ArrayBufferView | ReadableStream }) \u0026\n\t\t\t\t(Output extends XRPCLexBodyParam\n\t\t\t\t\t? // procedure has JSON response, format is optionally specified\n\t\t\t\t\t\t{ as?: ResponseFormat | null }\n\t\t\t\t\t: // procedure doesn't have JSON response, format needs to be specified\n\t\t\t\t\t\t{ as: ResponseFormat | null })\n\t\t: {\n\t\t\t\tas: ResponseFormat | null;\n\t\t\t\tinput?: Record\u003cstring, unknown\u003e | Blob | ArrayBuffer | ArrayBufferView | ReadableStream;\n\t\t\t\tparams?: Record\u003cstring, unknown\u003e;\n\t\t\t});\n\nexport type CallRequestOptions\u003cTMeta\u003e = BaseRequestOptions \u0026\n\t// as is required if the endpoint returns blob, optional otherwise\n\t(TMeta extends XRPCQueryMetadata\u003cany, infer Output, any\u003e\n\t\t? Output extends XRPCBlobBodyParam\n\t\t\t? { as: ResponseFormat | null }\n\t\t\t: { as?: ResponseFormat | null }\n\t\t: TMeta extends XRPCProcedureMetadata\u003cany, any, infer Output, any\u003e\n\t\t\t? Output extends XRPCBlobBodyParam\n\t\t\t\t? { as: ResponseFormat | null }\n\t\t\t\t: { as?: ResponseFormat | null }\n\t\t\t: { as?: ResponseFormat | null }) \u0026\n\t(TMeta extends XRPCQueryMetadata\u003cinfer Params, any, any\u003e\n\t\t? // query\n\t\t\tParams extends ObjectSchema\n\t\t\t? { params: InferInput\u003cParams\u003e }\n\t\t\t: { params?: Record\u003cstring, unknown\u003e }\n\t\t: TMeta extends XRPCProcedureMetadata\u003cinfer Params, infer Input, any, any\u003e\n\t\t\t? // procedure\n\t\t\t\t(Params extends ObjectSchema\n\t\t\t\t\t? { params: InferInput\u003cParams\u003e }\n\t\t\t\t\t: { params?: Record\u003cstring, unknown\u003e }) \u0026\n\t\t\t\t\t(Input extends XRPCLexBodyParam\n\t\t\t\t\t\t? { input: InferInput\u003cInput['schema']\u003e }\n\t\t\t\t\t\t: Input extends XRPCBlobBodyParam\n\t\t\t\t\t\t\t? { input: Blob | ArrayBuffer | ArrayBufferView | ReadableStream }\n\t\t\t\t\t\t\t: { input?: Record\u003cstring, unknown\u003e | Blob | ArrayBuffer | ArrayBufferView | ReadableStream })\n\t\t\t: never);\n\ntype InternalRequestOptions = BaseRequestOptions \u0026 {\n\tas?: ResponseFormat | null;\n\tparams?: Record\u003cstring, unknown\u003e;\n\tinput?: Record\u003cstring, unknown\u003e | Blob | BufferSource | ReadableStream;\n};\n\n// #endregion\n\n// #region Type definitions for client response\n/** standard XRPC error payload structure */\nexport type XRPCErrorPayload = {\n\t/** error name */\n\terror: string;\n\t/** error description */\n\tmessage?: string;\n};\n\ntype BaseClientResponse = {\n\t/** response status */\n\tstatus: number;\n\t/** response headers */\n\theaders: Headers;\n};\n\n/** represents a successful response returned by the client */\nexport type SuccessClientResponse\u003cTDef, TInit\u003e = BaseClientResponse \u0026 {\n\tok: true;\n\t/** response data */\n\tdata: TInit extends { as: infer TFormat }\n\t\t? TFormat extends ResponseFormat\n\t\t\t? FormattedResponse\u003cTDef\u003e[TFormat]\n\t\t\t: TFormat extends null\n\t\t\t\t? null\n\t\t\t\t: never\n\t\t: TDef extends XRPCQueryMetadata\u003cany, infer Body, any\u003e\n\t\t\t? Body extends XRPCLexBodyParam\n\t\t\t\t? InferOutput\u003cBody['schema']\u003e\n\t\t\t\t: null\n\t\t\t: TDef extends XRPCProcedureMetadata\u003cany, any, infer Body, any\u003e\n\t\t\t\t? Body extends XRPCLexBodyParam\n\t\t\t\t\t? InferOutput\u003cBody['schema']\u003e\n\t\t\t\t\t: null\n\t\t\t\t: never;\n};\n\n/** represents a failed response returned by the client */\nexport type FailedClientResponse = BaseClientResponse \u0026 {\n\tok: false;\n\t/** response data */\n\tdata: XRPCErrorPayload;\n};\n\n/** represents a response returned by the client */\nexport type ClientResponse\u003cTDef, TInit\u003e = SuccessClientResponse\u003cTDef, TInit\u003e | FailedClientResponse;\n\ntype UnknownClientResponse = { status: number; headers: Headers } \u0026 (\n\t| { ok: true; data: unknown }\n\t| { ok: false; data: XRPCErrorPayload }\n);\n\n// #endregion\n\n// #region Type definitions for call method\ntype Namespaced\u003cT\u003e = { mainSchema: T };\n\n// #endregion\n\n// #region Client\n/** options for configuring service proxying */\nexport type ServiceProxyOptions = {\n\t/** DID identifier that the upstream service should look up */\n\tdid: Did;\n\t/**\n\t * the specific service ID within the resolved DID document's `service` array\n\t * that the upstream service should forward requests to.\n\t *\n\t * must start with `#`\n\t *\n\t * common values include:\n\t * - `#atproto_pds` (personal data server)\n\t * - `#atproto_labeler` (labeler service)\n\t * - `#bsky_chat` (Bluesky chat service)\n\t */\n\tserviceId: `#${string}`;\n};\n\n/** options for configuring the client */\nexport type ClientOptions = {\n\t/** the underlying fetch handler it should make requests with */\n\thandler: FetchHandler | FetchHandlerObject;\n\t/** service proxy configuration */\n\tproxy?: ServiceProxyOptions | null;\n};\n\nconst JSON_CONTENT_TYPE_RE = /\\bapplication\\/json\\b/;\n\n/** XRPC API client */\nexport class Client\u003cTQueries = XRPCQueries, TProcedures = XRPCProcedures\u003e {\n\thandler: FetchHandler;\n\tproxy: ServiceProxyOptions | null;\n\n\tconstructor({ handler, proxy = null }: ClientOptions) {\n\t\tthis.handler = buildFetchHandler(handler);\n\t\tthis.proxy = proxy;\n\t}\n\n\t/**\n\t * clones this XRPC client\n\t * @param opts options to merge with\n\t * @returns the cloned XRPC client\n\t */\n\tclone({ handler = this.handler, proxy = this.proxy }: Partial\u003cClientOptions\u003e = {}): Client\u003c\n\t\tTQueries,\n\t\tTProcedures\n\t\u003e {\n\t\treturn new Client({ handler, proxy });\n\t}\n\n\t/**\n\t * performs an XRPC query request (HTTP GET)\n\t * @param name NSID of the query\n\t * @param options query options\n\t */\n\tget\u003cTName extends keyof TQueries, TInit extends QueryRequestOptions\u003cTQueries[TName]\u003e\u003e(\n\t\tname: TName,\n\t\t...options: HasRequiredKeys\u003cTInit\u003e extends true ? [init: TInit] : [init?: TInit]\n\t): Promise\u003cClientResponse\u003cTQueries[TName], TInit\u003e\u003e;\n\n\tget(name: string, options: InternalRequestOptions = {}) {\n\t\treturn this.#perform('get', name, options);\n\t}\n\n\t/**\n\t * performs an XRPC procedure request (HTTP POST)\n\t * @param name NSID of the procedure\n\t * @param options procedure options\n\t */\n\tpost\u003cTName extends keyof TProcedures, TInit extends ProcedureRequestOptions\u003cTProcedures[TName]\u003e\u003e(\n\t\tname: TName,\n\t\t...options: HasRequiredKeys\u003cTInit\u003e extends true ? [init: TInit] : [init?: TInit]\n\t): Promise\u003cClientResponse\u003cTProcedures[TName], TInit\u003e\u003e;\n\n\tpost(name: string, options: InternalRequestOptions = {}) {\n\t\treturn this.#perform('post', name, options);\n\t}\n\n\t/**\n\t * performs an XRPC call with schema validation\n\t * @param schema the lexicon schema for the endpoint, or a namespace containing mainSchema\n\t * @param options call options\n\t */\n\tcall\u003cTMeta extends XRPCQueryMetadata | XRPCProcedureMetadata, TInit extends CallRequestOptions\u003cTMeta\u003e\u003e(\n\t\tschema: TMeta | Namespaced\u003cTMeta\u003e,\n\t\t...options: HasRequiredKeys\u003cTInit\u003e extends true ? [init: TInit] : [init?: TInit]\n\t): Promise\u003cClientResponse\u003cTMeta, TInit\u003e\u003e;\n\n\tasync call(schema: any, options: any = {}): Promise\u003cany\u003e {\n\t\t// early bailout for tree-shaking when schemas aren't used\n\t\tif (!v.xrpcSchemaGenerated) {\n\t\t\treturn;\n\t\t}\n\n\t\t// extract mainSchema if namespace was passed\n\t\tif ('mainSchema' in schema) {\n\t\t\tschema = schema.mainSchema;\n\t\t}\n\n\t\tif (schema.params !== null) {\n\t\t\tconst paramsResult = v.safeParse(schema.params, options.params);\n\t\t\tif (!paramsResult.ok) {\n\t\t\t\tthrow new ClientValidationError('params', paramsResult);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.type === 'xrpc_procedure' \u0026\u0026 schema.input?.type === 'lex') {\n\t\t\tconst inputResult = v.safeParse(schema.input.schema, options.input);\n\t\t\tif (!inputResult.ok) {\n\t\t\t\tthrow new ClientValidationError('input', inputResult);\n\t\t\t}\n\t\t}\n\n\t\tconst isQuery = schema.type === 'xrpc_query';\n\t\tconst method = isQuery ? 'get' : 'post';\n\n\t\tif (options.as === undefined \u0026\u0026 schema.output?.type === 'blob') {\n\t\t\tthrow new TypeError(`\\`as\\` option is required for endpoints returning blobs`);\n\t\t}\n\n\t\tconst format = options.as !== undefined ? options.as : schema.output?.type === 'lex' ? 'json' : null;\n\n\t\tconst response = await this.#perform(method, schema.nsid, {\n\t\t\tparams: options.params,\n\t\t\tinput: isQuery ? undefined : options.input,\n\t\t\tas: format,\n\t\t\tsignal: options.signal,\n\t\t\theaders: options.headers,\n\t\t});\n\n\t\tif (format === 'json' \u0026\u0026 response.ok \u0026\u0026 schema.output?.type === 'lex') {\n\t\t\tconst outputResult = v.safeParse(schema.output.schema, response.data);\n\t\t\tif (!outputResult.ok) {\n\t\t\t\tthrow new ClientValidationError('output', outputResult);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders: response.headers,\n\t\t\t\tdata: outputResult.value,\n\t\t\t};\n\t\t}\n\n\t\treturn response;\n\t}\n\n\tasync #perform(\n\t\tmethod: 'get' | 'post',\n\t\tname: string,\n\t\t{ signal, as: format = 'json', headers, input, params }: InternalRequestOptions,\n\t) {\n\t\tconst isWebInput =\n\t\t\tinput \u0026\u0026\n\t\t\t(input instanceof Blob ||\n\t\t\t\tArrayBuffer.isView(input) ||\n\t\t\t\tinput instanceof ArrayBuffer ||\n\t\t\t\tinput instanceof ReadableStream);\n\n\t\tconst url = `/xrpc/${name}` + _constructSearchParams(params);\n\n\t\tconst response = await this.handler(url, {\n\t\t\tmethod,\n\t\t\tsignal,\n\t\t\tbody: input \u0026\u0026 !isWebInput ? JSON.stringify(input) : input,\n\t\t\theaders: _mergeHeaders(headers, {\n\t\t\t\t'content-type': input \u0026\u0026 !isWebInput ? 'application/json' : null,\n\t\t\t\t'atproto-proxy': _constructProxyHeader(this.proxy),\n\t\t\t}),\n\t\t\tduplex: input instanceof ReadableStream ? 'half' : undefined,\n\t\t});\n\n\t\t{\n\t\t\tconst status = response.status;\n\t\t\tconst headers = response.headers;\n\n\t\t\tconst type = headers.get('content-type');\n\n\t\t\tif (status !== 200) {\n\t\t\t\tlet json: any;\n\n\t\t\t\tif (type != null \u0026\u0026 JSON_CONTENT_TYPE_RE.test(type)) {\n\t\t\t\t\t// it should be okay to swallow the parsing error here\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = await response.json();\n\t\t\t\t\t\tif (isXRPCErrorPayload(parsed)) {\n\t\t\t\t\t\t\tjson = parsed;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t} else {\n\t\t\t\t\tawait response.body?.cancel();\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tstatus: status,\n\t\t\t\t\theaders: headers,\n\t\t\t\t\tdata: json ?? {\n\t\t\t\t\t\terror: `UnknownXRPCError`,\n\t\t\t\t\t\tmessage: `Request failed with status code ${status}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tlet data: any;\n\t\t\t\tswitch (format) {\n\t\t\t\t\tcase 'json': {\n\t\t\t\t\t\tif (type != null \u0026\u0026 JSON_CONTENT_TYPE_RE.test(type)) {\n\t\t\t\t\t\t\t// we shouldn't be handling parsing errors\n\t\t\t\t\t\t\tdata = await response.json();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait response.body?.cancel();\n\n\t\t\t\t\t\t\tthrow new TypeError(`Invalid response content-type (got ${type})`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase null: {\n\t\t\t\t\t\tdata = null;\n\n\t\t\t\t\t\tawait response.body?.cancel();\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'blob': {\n\t\t\t\t\t\tdata = await response.blob();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'bytes': {\n\t\t\t\t\t\tdata = new Uint8Array(await response.arrayBuffer());\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'stream': {\n\t\t\t\t\t\tdata = response.body!;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tok: true,\n\t\t\t\t\tstatus: status,\n\t\t\t\t\theaders: headers,\n\t\t\t\t\tdata: data,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n}\n\n// #endregion\n\n// #region Utility functions\nconst _constructSearchParams = (params: Record\u003cstring, unknown\u003e | undefined): string =\u003e {\n\tlet searchParams: URLSearchParams | undefined;\n\n\tfor (const key in params) {\n\t\tconst value = params[key];\n\n\t\tif (value !== undefined) {\n\t\t\tsearchParams ??= new URLSearchParams();\n\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (let idx = 0, len = value.length; idx \u003c len; idx++) {\n\t\t\t\t\tconst val = value[idx];\n\t\t\t\t\tsearchParams.append(key, '' + val);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsearchParams.set(key, '' + value);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn searchParams ? `?` + searchParams.toString() : '';\n};\n\nconst _constructProxyHeader = (proxy: ServiceProxyOptions | null | undefined): string | null =\u003e {\n\tif (proxy != null) {\n\t\treturn `${proxy.did}${proxy.serviceId}`;\n\t}\n\n\treturn null;\n};\n\nconst _mergeHeaders = (\n\tinit: HeadersInit | undefined,\n\tdefaults: Record\u003cstring, string | null\u003e,\n): HeadersInit | undefined =\u003e {\n\tlet headers: Headers | undefined;\n\n\tfor (const name in defaults) {\n\t\tconst value = defaults[name];\n\n\t\tif (value !== null) {\n\t\t\theaders ??= new Headers(init);\n\n\t\t\tif (!headers.has(name)) {\n\t\t\t\theaders.set(name, value);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn headers ?? init;\n};\n\nexport const isXRPCErrorPayload = (input: any): input is XRPCErrorPayload =\u003e {\n\tif (typeof input !== 'object' || input == null) {\n\t\treturn false;\n\t}\n\n\tconst kindType = typeof input.error;\n\tconst messageType = typeof input.message;\n\n\treturn kindType === 'string' \u0026\u0026 (messageType === 'undefined' || messageType === 'string');\n};\n// #endregion\n\n// #region Optimistic response helper\ntype ExtractSuccessData\u003cR\u003e = R extends { ok: true; data: infer D } ? D : never;\n\n/**\n * takes in the response returned by the client, and either returns the data if\n * it is a successful response, or throws if it's a failed response.\n * @param input either a ClientResponse, or a promise that resolves to a ClientResponse\n * @returns the data from a successful response\n *\n * @example\n * const data = await ok(client.get('com.atproto.server.describeServer'));\n * // ^? ComAtprotoServerDescribeServer.Output\n */\nexport const ok: {\n\t\u003cT extends UnknownClientResponse\u003e(promise: Promise\u003cT\u003e): Promise\u003cExtractSuccessData\u003cT\u003e\u003e;\n\t\u003cT extends UnknownClientResponse\u003e(response: T): ExtractSuccessData\u003cT\u003e;\n} = (input: Promise\u003cUnknownClientResponse\u003e | UnknownClientResponse): any =\u003e {\n\tif (input instanceof Promise) {\n\t\treturn input.then(ok);\n\t}\n\n\tif (input.ok) {\n\t\treturn input.data;\n\t}\n\n\tthrow new ClientResponseError(input);\n};\n\n/** options when constructing a ClientResponseError */\nexport type ClientResponseErrorOptions = {\n\tstatus: number;\n\theaders?: Headers;\n\tdata: XRPCErrorPayload;\n};\n\n/** represents an error response returned by the client */\nexport class ClientResponseError extends Error {\n\t/** error name returned by service */\n\treadonly error: string;\n\t/** error message returned by service */\n\treadonly description?: string;\n\n\t/** response status */\n\treadonly status: number;\n\t/** response headers */\n\treadonly headers: Headers;\n\n\tconstructor({ status, headers = new Headers(), data }: ClientResponseErrorOptions) {\n\t\tsuper(`${data.error} \u003e ${data.message ?? '(unspecified description)'}`);\n\n\t\tthis.name = 'ClientResponseError';\n\n\t\tthis.error = data.error;\n\t\tthis.description = data.message;\n\n\t\tthis.status = status;\n\t\tthis.headers = headers;\n\t}\n}\n\n/** represents a validation error during typed calls */\nexport class ClientValidationError extends Error {\n\t/** validation target (params, input, or output) */\n\treadonly target: 'params' | 'input' | 'output';\n\t/** validation result */\n\treadonly result: v.Err;\n\n\tconstructor(target: 'params' | 'input' | 'output', result: v.Err) {\n\t\tsuper(`validation failed for ${target}: ${result.message}`);\n\n\t\tthis.name = 'ClientValidationError';\n\t\tthis.target = target;\n\t\tthis.result = result;\n\t}\n}\n\n// #endregion\n","/** fetch handler function */\nexport type FetchHandler = (pathname: string, init: RequestInit) =\u003e Promise\u003cResponse\u003e;\n\n/** fetch handler in an object */\nexport interface FetchHandlerObject {\n\thandle(this: FetchHandlerObject, pathname: string, init: RequestInit): Promise\u003cResponse\u003e;\n}\n\nexport const buildFetchHandler = (handler: FetchHandler | FetchHandlerObject): FetchHandler =\u003e {\n\tif (typeof handler === 'object') {\n\t\treturn handler.handle.bind(handler);\n\t}\n\n\treturn handler;\n};\n\nexport interface SimpleFetchHandlerOptions {\n\tservice: string | URL;\n\tfetch?: typeof globalThis.fetch;\n}\n\nexport const simpleFetchHandler = ({\n\tservice,\n\tfetch: _fetch = fetch,\n}: SimpleFetchHandlerOptions): FetchHandler =\u003e {\n\treturn async (pathname, init) =\u003e {\n\t\tconst url = new URL(pathname, service);\n\t\treturn await _fetch(url.href, init);\n\t};\n};\n","import { getPdsEndpoint, type DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons';\n\nimport type { ComAtprotoServerCreateSession } from '@atcute/atproto';\n\nimport { Client, ClientResponseError, isXRPCErrorPayload, ok } from './client.js';\nimport { simpleFetchHandler, type FetchHandlerObject } from './fetch-handler.js';\n\nimport { decodeJwt } from './utils/jwt.js';\n\n/**\n * represents the decoded access token, for convenience\n * @deprecated\n */\nexport interface AtpAccessJwt {\n\t/** access token scope */\n\tscope:\n\t\t| 'com.atproto.access'\n\t\t| 'com.atproto.appPass'\n\t\t| 'com.atproto.appPassPrivileged'\n\t\t| 'com.atproto.signupQueued'\n\t\t| 'com.atproto.takendown';\n\t/** account DID */\n\tsub: Did;\n\t/** expiration time in Unix seconds */\n\texp: number;\n\t/** token issued time in Unix seconds */\n\tiat: number;\n}\n\n/**\n * represents the the decoded refresh token, for convenience\n * @deprecated\n */\nexport interface AtpRefreshJwt {\n\t/** refresh token scope */\n\tscope: 'com.atproto.refresh';\n\t/** unique identifier for this session */\n\tjti: string;\n\t/** account DID */\n\tsub: Did;\n\t/** intended audience of this refresh token, in DID */\n\taud: Did;\n\t/** token expiration time in seconds */\n\texp: number;\n\t/** token issued time in seconds */\n\tiat: number;\n}\n\n/** session data, can be persisted and reused */\nexport interface AtpSessionData {\n\t/** refresh token */\n\trefreshJwt: string;\n\t/** access token */\n\taccessJwt: string;\n\t/** account handle */\n\thandle: string;\n\t/** account DID */\n\tdid: Did;\n\t/** PDS endpoint found in the DID document, this will be used as the service URI if provided */\n\tpdsUri?: string;\n\t/** email address of the account, might not be available if on app password */\n\temail?: string;\n\t/** whether the email address has been confirmed or not */\n\temailConfirmed?: boolean;\n\t/** whether the account has email-based two-factor authentication enabled */\n\temailAuthFactor?: boolean;\n\t/** whether the account is active (not deactivated, taken down, or suspended) */\n\tactive: boolean;\n\t/** possible reason for why the account is inactive */\n\tinactiveStatus?: string;\n}\n\nexport interface CredentialManagerOptions {\n\t/** PDS server URL */\n\tservice: string;\n\n\t/** custom fetch function */\n\tfetch?: typeof fetch;\n\n\t/** function called when the session expires and can't be refreshed */\n\tonExpired?: (session: AtpSessionData) =\u003e void;\n\t/** function called after a successful session refresh */\n\tonRefresh?: (session: AtpSessionData) =\u003e void;\n\t/** function called whenever the session object is updated (login, resume, refresh) */\n\tonSessionUpdate?: (session: AtpSessionData) =\u003e void;\n}\n\nexport class CredentialManager implements FetchHandlerObject {\n\t/** service URL to make authentication requests with */\n\treadonly serviceUrl: string;\n\t/** fetch implementation */\n\tfetch: typeof fetch;\n\n\t/** internal client instance for making authentication requests */\n\t#server: Client;\n\t/** holds a promise for the current refresh operation, used for debouncing */\n\t#refreshSessionPromise: Promise\u003cvoid\u003e | undefined;\n\n\t/** callback for session expiration */\n\t#onExpired: CredentialManagerOptions['onExpired'];\n\t/** callback for successful session refresh */\n\t#onRefresh: CredentialManagerOptions['onRefresh'];\n\t/** callback for session updates */\n\t#onSessionUpdate: CredentialManagerOptions['onSessionUpdate'];\n\n\t/** current active session, undefined if not authenticated */\n\tsession?: AtpSessionData;\n\n\tconstructor({\n\t\tservice,\n\t\tonExpired,\n\t\tonRefresh,\n\t\tonSessionUpdate,\n\t\tfetch: _fetch = fetch,\n\t}: CredentialManagerOptions) {\n\t\tthis.serviceUrl = service;\n\t\tthis.fetch = _fetch;\n\n\t\tthis.#server = new Client({ handler: simpleFetchHandler({ service, fetch: _fetch }) });\n\n\t\tthis.#onRefresh = onRefresh;\n\t\tthis.#onExpired = onExpired;\n\t\tthis.#onSessionUpdate = onSessionUpdate;\n\t}\n\n\t/** service URL to make actual API requests with */\n\tget dispatchUrl() {\n\t\treturn this.session?.pdsUri ?? this.serviceUrl;\n\t}\n\n\tasync handle(pathname: string, init: RequestInit): Promise\u003cResponse\u003e {\n\t\tawait this.#refreshSessionPromise;\n\n\t\tconst url = new URL(pathname, this.dispatchUrl);\n\t\tconst headers = new Headers(init.headers);\n\n\t\tif (!this.session || headers.has('authorization')) {\n\t\t\treturn (0, this.fetch)(url, init);\n\t\t}\n\n\t\tconst initialToken = this.session.accessJwt;\n\t\theaders.set('authorization', `Bearer ${initialToken}`);\n\n\t\tconst initialResponse = await (0, this.fetch)(url, { ...init, headers });\n\n\t\tif (initialResponse.status !== 401 \u0026\u0026 !(await isExpiredTokenResponse(initialResponse))) {\n\t\t\treturn initialResponse;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.#refreshSession();\n\t\t} catch {\n\t\t\treturn initialResponse;\n\t\t}\n\n\t\t// return initial response if:\n\t\t// - request was aborted\n\t\t// - refresh failed and cleared the session\n\t\t// - token didn't actually change (refresh failed silently)\n\t\t// - request body was a stream (can't be resent)\n\t\tconst updatedToken = this.session?.accessJwt;\n\t\tif (\n\t\t\tinit.signal?.aborted ||\n\t\t\t!updatedToken ||\n\t\t\tupdatedToken === initialToken ||\n\t\t\tinit.body instanceof ReadableStream\n\t\t) {\n\t\t\treturn initialResponse;\n\t\t}\n\n\t\t// cancel initial response to avoid resource leaks (Node.js)\n\t\tawait initialResponse.body?.cancel();\n\n\t\theaders.set('authorization', `Bearer ${updatedToken}`);\n\t\treturn await (0, this.fetch)(url, { ...init, headers });\n\t}\n\n\t#refreshSession() {\n\t\treturn (this.#refreshSessionPromise ||= this.#refreshSessionInner().finally(\n\t\t\t() =\u003e (this.#refreshSessionPromise = undefined),\n\t\t));\n\t}\n\n\tasync #refreshSessionInner(): Promise\u003cvoid\u003e {\n\t\tconst currentSession = this.session;\n\t\tif (!currentSession) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst response = await this.#server.post('com.atproto.server.refreshSession', {\n\t\t\theaders: {\n\t\t\t\tauthorization: `Bearer ${currentSession.refreshJwt}`,\n\t\t\t},\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst isExpired =\n\t\t\t\tresponse.status === 401 ||\n\t\t\t\tresponse.data.error === 'ExpiredToken' ||\n\t\t\t\tresponse.data.error === 'InvalidToken';\n\n\t\t\tif (isExpired) {\n\t\t\t\tthis.session = undefined;\n\t\t\t\tthis.#onExpired?.(currentSession);\n\t\t\t}\n\n\t\t\tthrow new ClientResponseError(response);\n\t\t}\n\n\t\t// DID must not change during refresh\n\t\tif (response.data.did !== currentSession.did) {\n\t\t\tthis.session = undefined;\n\t\t\tthis.#onExpired?.(currentSession);\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidDID' } });\n\t\t}\n\n\t\t// protect against concurrent session updates\n\t\tif (this.session !== currentSession) {\n\t\t\tthrow new Error('concurrent session update detected');\n\t\t}\n\n\t\tthis.#updateSession({ ...currentSession, ...response.data });\n\t\tthis.#onRefresh?.(this.session!);\n\t}\n\n\t#updateSession(raw: ComAtprotoServerCreateSession.$output): AtpSessionData {\n\t\tconst didDoc = raw.didDoc as DidDocument | undefined;\n\n\t\tlet pdsUri: string | undefined;\n\t\tif (didDoc) {\n\t\t\tpdsUri = getPdsEndpoint(didDoc);\n\t\t}\n\n\t\tconst newSession: AtpSessionData = {\n\t\t\taccessJwt: raw.accessJwt,\n\t\t\trefreshJwt: raw.refreshJwt,\n\t\t\thandle: raw.handle,\n\t\t\tdid: raw.did,\n\t\t\tpdsUri: pdsUri,\n\t\t\temail: raw.email,\n\t\t\temailConfirmed: raw.emailConfirmed,\n\t\t\temailAuthFactor: raw.emailAuthFactor,\n\t\t\tactive: raw.active ?? true,\n\t\t\tinactiveStatus: raw.status,\n\t\t};\n\n\t\tthis.session = newSession;\n\t\tthis.#onSessionUpdate?.(newSession);\n\n\t\treturn newSession;\n\t}\n\n\t/**\n\t * resume from a persisted session\n\t * @param session session data, taken from `AtpAuth#session` after login\n\t */\n\tasync resume(session: AtpSessionData): Promise\u003cAtpSessionData\u003e {\n\t\t// protect against concurrent resume of the same session\n\t\tif (session.refreshJwt === this.session?.refreshJwt) {\n\t\t\tawait this.#refreshSessionPromise;\n\t\t\tif (!this.session || session.did !== this.session.did) {\n\t\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t\t}\n\t\t\treturn this.session;\n\t\t}\n\n\t\tconst now = Date.now() / 1_000 + 60 * 5;\n\n\t\tconst refreshToken = decodeJwt(session.refreshJwt) as AtpRefreshJwt;\n\t\tif (now \u003e= refreshToken.exp || refreshToken.sub !== session.did) {\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t}\n\n\t\tconst accessToken = decodeJwt(session.accessJwt) as AtpAccessJwt;\n\t\tif (accessToken.sub !== session.did) {\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t}\n\n\t\t// set the session and clear any stale refresh promise\n\t\tthis.session = session;\n\t\tthis.#refreshSessionPromise = undefined;\n\n\t\tif (now \u003e= accessToken.exp) {\n\t\t\t// access token expired, need to refresh\n\t\t\tawait this.#refreshSession();\n\t\t} else {\n\t\t\t// access token still valid, fetch session info in background\n\t\t\tconst promise = ok(\n\t\t\t\tthis.#server.get('com.atproto.server.getSession', {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tauthorization: `Bearer ${session.accessJwt}`,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tpromise.then(\n\t\t\t\t(next) =\u003e {\n\t\t\t\t\tconst existing = this.session;\n\t\t\t\t\tif (!existing || existing.did !== next.did) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#updateSession({ ...existing, ...next });\n\t\t\t\t},\n\t\t\t\t(_err) =\u003e {\n\t\t\t\t\t// ignore error\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tif (!this.session) {\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t}\n\n\t\treturn this.session;\n\t}\n\n\t/**\n\t * sign in to an account\n\t * @param options credential options\n\t * @returns session data\n\t */\n\tasync login(options: AuthLoginOptions): Promise\u003cAtpSessionData\u003e {\n\t\t// reset the session\n\t\tthis.session = undefined;\n\t\tthis.#refreshSessionPromise = undefined;\n\n\t\tconst session = await ok(\n\t\t\tthis.#server.post('com.atproto.server.createSession', {\n\t\t\t\tinput: {\n\t\t\t\t\tidentifier: options.identifier,\n\t\t\t\t\tpassword: options.password,\n\t\t\t\t\tauthFactorToken: options.code,\n\t\t\t\t\tallowTakendown: options.allowTakendown,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\treturn this.#updateSession(session);\n\t}\n\n\t/**\n\t * sign out of the current session, invalidating it server-side\n\t */\n\tasync logout(): Promise\u003cvoid\u003e {\n\t\tconst currentSession = this.session;\n\t\tif (!currentSession) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.session = undefined;\n\t\tthis.#refreshSessionPromise = undefined;\n\n\t\ttry {\n\t\t\tawait this.#server.post('com.atproto.server.deleteSession', {\n\t\t\t\tas: null,\n\t\t\t\theaders: {\n\t\t\t\t\tauthorization: `Bearer ${currentSession.refreshJwt}`,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch {\n\t\t\t// ignore errors - session is already cleared locally\n\t\t}\n\t}\n}\n\n/** credentials */\nexport interface AuthLoginOptions {\n\t/** what account to login as, this could be domain handle, DID, or email address */\n\tidentifier: string;\n\t/** account password */\n\tpassword: string;\n\t/** two-factor authentication code, if email TOTP is enabled */\n\tcode?: string;\n\t/** allow signing in even if the account has been taken down */\n\tallowTakendown?: boolean;\n}\n\nconst isExpiredTokenResponse = async (response: Response): Promise\u003cboolean\u003e =\u003e {\n\tif (response.status !== 400) {\n\t\treturn false;\n\t}\n\n\tif (extractContentType(response.headers) !== 'application/json') {\n\t\treturn false;\n\t}\n\n\t// this is nasty as it relies heavily on what the PDS returns, but avoiding\n\t// cloning and reading the request as much as possible is better.\n\n\t// {\"error\":\"ExpiredToken\",\"message\":\"Token has expired\"}\n\t// {\"error\":\"ExpiredToken\",\"message\":\"Token is expired\"}\n\tif (extractContentLength(response.headers) \u003e 54 * 1.5) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst data = await response.clone().json();\n\t\tif (isXRPCErrorPayload(data)) {\n\t\t\treturn data.error === 'ExpiredToken';\n\t\t}\n\t} catch {}\n\n\treturn false;\n};\n\nconst extractContentType = (headers: Headers) =\u003e {\n\treturn headers.get('content-type')?.split(';')[0]?.trim();\n};\nconst extractContentLength = (headers: Headers) =\u003e {\n\treturn Number(headers.get('content-length') ?? ';');\n};\n","/**\n * @module\n * JWT decoding utilities for session resumption checks.\n * This module is exported for convenience and is no way part of public API,\n * it can be removed at any time.\n */\n\n/**\n * Decodes a JWT token\n * @param token The token string\n * @returns JSON object from the token\n */\nexport const decodeJwt = (token: string): unknown =\u003e {\n\tconst pos = 1;\n\tconst part = token.split('.')[1];\n\n\tlet decoded: string;\n\n\tif (typeof part !== 'string') {\n\t\tthrow new Error('invalid token: missing part ' + (pos + 1));\n\t}\n\n\ttry {\n\t\tdecoded = base64UrlDecode(part);\n\t} catch (e) {\n\t\tthrow new Error('invalid token: invalid b64 for part ' + (pos + 1) + ' (' + (e as Error).message + ')');\n\t}\n\n\ttry {\n\t\treturn JSON.parse(decoded);\n\t} catch (e) {\n\t\tthrow new Error('invalid token: invalid json for part ' + (pos + 1) + ' (' + (e as Error).message + ')');\n\t}\n};\n\n/**\n * Decodes a URL-safe Base64 string\n * @param str URL-safe Base64 that needed to be decoded\n * @returns The actual string\n */\nexport const base64UrlDecode = (str: string): string =\u003e {\n\tlet output = str.replace(/-/g, '+').replace(/_/g, '/');\n\n\tswitch (output.length % 4) {\n\t\tcase 0:\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\toutput += '==';\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\toutput += '=';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error('base64 string is not of the correct length');\n\t}\n\n\ttry {\n\t\treturn b64DecodeUnicode(output);\n\t} catch {\n\t\treturn atob(output);\n\t}\n};\n\nconst b64DecodeUnicode = (str: string): string =\u003e {\n\treturn decodeURIComponent(\n\t\tatob(str).replace(/(.)/g, (_m, p) =\u003e {\n\t\t\tlet code = p.charCodeAt(0).toString(16).toUpperCase();\n\n\t\t\tif (code.length \u003c 2) {\n\t\t\t\tcode = '0' + code;\n\t\t\t}\n\n\t\t\treturn '%' + code;\n\t\t}),\n\t);\n};\n"],"version":3}
-4
vendor/esm.sh/@atcute/identity-resolver@1.2.2/es2022/identity-resolver.mjs
··· 1 - /* esm.sh - @atcute/identity-resolver@1.2.2 */ 2 - import{getAtprotoHandle as H,getPdsEndpoint as S}from"../../identity@1.1.4/es2022/identity.mjs";import{isDid as X}from"../../lexicons@1.2.10/es2022/syntax.mjs";var v=class extends Error{name="DidResolutionError"},h=class extends v{did;name="UnsupportedDidMethodError";constructor(e){super(`unsupported did method; did=${e}`),this.did=e}},U=class extends v{did;name="ImproperDidError";constructor(e){super(`improper did; did=${e}`),this.did=e}},p=class extends v{did;name="DocumentNotFoundError";constructor(e){super(`did document not found; did=${e}`),this.did=e}},u=class extends v{did;name="FailedDocumentResolutionError";constructor(e,r){super(`failed to resolve did document; did=${e}`,r),this.did=e}},E=class extends Error{name="HandleResolutionError"},f=class extends E{handle;name="DidNotFoundError";constructor(e){super(`handle returned no did; handle=${e}`),this.handle=e}},m=class extends E{handle;name="FailedHandleResolutionError";constructor(e,r){super(`failed to resolve handle; handle=${e}`,r),this.handle=e}},g=class extends E{handle;did;name="InvalidResolvedHandleError";constructor(e,r){super(`handle returned invalid did; handle=${e}; did=${r}`),this.handle=e,this.did=r}},R=class extends E{name="AmbiguousHandleError";constructor(e){super(`handle returned multiple did values; handle=${e}`)}},y=class extends Error{name="ActorResolutionError"};var A=class{handleResolver;didDocumentResolver;constructor(e){this.handleResolver=e.handleResolver,this.didDocumentResolver=e.didDocumentResolver}async resolve(e,r){let n=X(e),t;if(n)t=e;else try{t=await this.handleResolver.resolve(e,r)}catch(c){throw new y("failed to resolve handle",{cause:c})}let s;try{s=await this.didDocumentResolver.resolve(t,r)}catch(c){throw new y("failed to resolve did document",{cause:c})}let o=S(s);if(!o)throw new y("missing pds endpoint");let a="handle.invalid";if(n){let c=H(s);if(c)try{await this.handleResolver.resolve(c,r)===t&&(a=c)}catch{}}else H(s)===e&&(a=e);return{did:t,handle:a,pds:new URL(o).href}}};import{extractDidMethod as B}from"../../identity@1.1.4/es2022/identity.mjs";var T=class{#e;constructor({methods:e}){this.#e=new Map(Object.entries(e))}async resolve(e,r){let n=B(e),t=this.#e.get(n);if(t===void 0)throw new h(e);return await t.resolve(e,r)}};import{FailedResponseError as Q}from"../../util-fetch@1.0.5/es2022/util-fetch.mjs";import{defs as _}from"../../identity@1.1.4/es2022/identity.mjs";import{isResponseOk as q,parseResponseAsJson as z,pipe as G,validateJsonWith as K}from"../../util-fetch@1.0.5/es2022/util-fetch.mjs";var j=G(q,z(/^application\/(did\+ld\+)?json$/,20*1024),K(_.didDocument,{mode:"passthrough"}));var N=class{apiUrl;#e;constructor({apiUrl:e="https://plc.directory",fetch:r=fetch}={}){this.apiUrl=e,this.#e=r}async resolve(e,r){if(!e.startsWith("did:plc:"))throw new h(e);let n;try{let t=new URL(`/${encodeURIComponent(e)}`,this.apiUrl),s=await(0,this.#e)(t,{signal:r?.signal,cache:r?.noCache?"no-cache":void 0,redirect:"manual",headers:{accept:"application/did+ld+json,application/json"}});if(s.status>=300&&s.status<400)throw new TypeError("unexpected redirect");n=(await j(s)).json}catch(t){throw t instanceof Q&&t.status===404?new p(e):new u(e,{cause:t})}return n}};import{webDidToDocumentUrl as V}from"../../identity@1.1.4/es2022/identity.mjs";import{FailedResponseError as I}from"../../util-fetch@1.0.5/es2022/util-fetch.mjs";var P=class{#e;constructor({fetch:e=fetch}={}){this.#e=e}async resolve(e,r){if(!e.startsWith("did:web:"))throw new h(e);let n;try{let t=V(e),s=await(0,this.#e)(t,{signal:r?.signal,cache:r?.noCache?"no-cache":void 0,redirect:"manual",headers:{accept:"application/did+ld+json,application/json"}});if(s.status>=300&&s.status<400)throw new TypeError("unexpected redirect");n=(await j(s)).json}catch(t){throw t instanceof I&&t.status===404?new p(e):new u(e,{cause:t})}return n}},C=class{#e;constructor({fetch:e=fetch}={}){this.#e=e}async resolve(e,r){if(!e.startsWith("did:web:"))throw new h(e);let[n,...t]=e.slice(8).split(":").map(decodeURIComponent),s=new URL(`https://${n}/.well-known/did.json`);if(t.length>0)throw new U(e);let o;try{let a=await(0,this.#e)(s,{signal:r?.signal,cache:r?.noCache?"no-cache":void 0,redirect:"manual",headers:{accept:"application/did+ld+json,application/json"}});if(a.status>=300&&a.status<400)throw new TypeError("unexpected redirect");o=(await j(a)).json}catch(a){throw a instanceof I&&a.status===404?new p(e):new u(e,{cause:a})}return o}};import{defs as Y}from"../../identity@1.1.4/es2022/identity.mjs";import{FailedResponseError as Z,isResponseOk as ee,parseResponseAsJson as re,pipe as te,validateJsonWith as oe}from"../../util-fetch@1.0.5/es2022/util-fetch.mjs";import*as M from"../../../@badrap/valita@0.4.6/es2022/valita.mjs";var se=te(ee,re(/^application\/json$/,20*1024+16),oe(M.object({didDoc:Y.didDocument}),{mode:"passthrough"})),L=class{serviceUrl;#e;constructor({serviceUrl:e,fetch:r=fetch}){this.serviceUrl=e,this.#e=r}async resolve(e,r){let n;try{let t=new URL("/xrpc/com.atproto.identity.resolveDid",this.serviceUrl);t.searchParams.set("did",e);let s=await(0,this.#e)(t,{signal:r?.signal,cache:r?.noCache?"no-cache":void 0,headers:{accept:"application/json"}});n=(await se(s)).json.didDoc}catch(t){throw t instanceof Z&&t.status===404?new p(e):new u(e,{cause:t})}return n}};var k=class{#e;strategy;constructor({methods:e,strategy:r="race"}){this.#e=e,this.strategy=r}async resolve(e,r){let{http:n,dns:t}=this.#e,s=r?.signal,o=new AbortController;s&&s.addEventListener("abort",()=>o.abort(),{signal:o.signal});let a=t.resolve(e,{...r,signal:o.signal}),c=n.resolve(e,{...r,signal:o.signal});switch(this.strategy){case"race":return new Promise(d=>{a.then(l=>{o.abort(),d(l)},()=>d(c)),c.then(l=>{o.abort(),d(l)},()=>d(a))});case"dns-first":{c.catch(F);let d=await a.catch(F);return d?(o.abort(),d):c}case"http-first":{a.catch(F);let d=await c.catch(F);return d?(o.abort(),d):a}case"both":{let[d,l]=await Promise.allSettled([a,c]),x=d.status==="fulfilled"?d.value:void 0,D=l.status==="fulfilled"?l.value:void 0;if(x&&D&&x!==D)throw new R(e);return x||D||a}}}},F=()=>{};import{isAtprotoDid as ne}from"../../identity@1.1.4/es2022/identity.mjs";import{fetchDohJsonTxt as ae}from"../../util-fetch@1.0.5/es2022/util-fetch.mjs";var ie="_atproto",b="did=",J=class{dohUrl;#e;constructor({dohUrl:e,fetch:r=fetch}){this.dohUrl=e,this.#e=r}async resolve(e,r){let n;try{let o=new URL(this.dohUrl);o.searchParams.set("name",`${ie}.${e}`),o.searchParams.set("type","TXT");let a=await(0,this.#e)(o,{signal:r?.signal,cache:r?.noCache?"no-cache":void 0,headers:{accept:"application/dns-json"}});n=(await ae(a)).json}catch(o){throw new m(e,{cause:o})}let t=n.Status,s=n.Answer;if(t!==0)throw t===3?new f(e):new m(e,{cause:new TypeError(`dns returned ${t}`)});for(let o=0,a=s.length;o<a;o++){let d=s[o].data;if(!d.startsWith(b))continue;for(let x=o+1;x<a;x++)if(s[x].data.startsWith(b))throw new R(e);let l=d.slice(b.length);if(!ne(l))throw new g(e,l);return l}throw new f(e)}};import{isAtprotoDid as ce}from"../../identity@1.1.4/es2022/identity.mjs";import{FailedResponseError as de,isResponseOk as le,pipe as he,readResponseAsText as pe}from"../../util-fetch@1.0.5/es2022/util-fetch.mjs";var ue=he(le,pe(2064)),O=class{#e;constructor({fetch:e=fetch}={}){this.#e=e}async resolve(e,r){let n;try{let s=new URL("/.well-known/atproto-did",`https://${e}`),o=await(0,this.#e)(s,{signal:r?.signal,cache:r?.noCache?"no-cache":void 0,redirect:"manual"});if(o.status>=300&&o.status<400)throw new TypeError("unexpected redirect");n=(await ue(o)).text}catch(s){throw s instanceof de&&s.status===404?new f(e):new m(e,{cause:s})}let t=n.split(` 3 - `)[0].trim();if(!ce(t))throw new g(e,t);return t}};import*as $ from"../../../@badrap/valita@0.4.6/es2022/valita.mjs";import{isAtprotoDid as fe}from"../../identity@1.1.4/es2022/identity.mjs";import{FailedResponseError as me,isResponseOk as we,parseResponseAsJson as xe,pipe as ve,validateJsonWith as Ee}from"../../util-fetch@1.0.5/es2022/util-fetch.mjs";var ge=$.object({did:$.string().assert(i=>fe(i))}),Re=ve(we,xe(/^application\/json$/,4*1024),Ee(ge,{mode:"passthrough"})),W=class{serviceUrl;#e;constructor({serviceUrl:e,fetch:r=fetch}){this.serviceUrl=e,this.#e=r}async resolve(e,r){let n;try{let t=new URL("/xrpc/com.atproto.identity.resolveHandle",this.serviceUrl);t.searchParams.set("handle",e);let s=await(0,this.#e)(t,{signal:r?.signal,cache:r?.noCache?"no-cache":void 0,headers:{accept:"application/json"}});n=(await Re(s)).json}catch(t){throw t instanceof me&&t.status===400?new f(e):new m(e,{cause:t})}return n.did}};export{y as ActorResolutionError,R as AmbiguousHandleError,C as AtprotoWebDidDocumentResolver,T as CompositeDidDocumentResolver,k as CompositeHandleResolver,v as DidDocumentResolutionError,f as DidNotFoundError,p as DocumentNotFoundError,J as DohJsonHandleResolver,u as FailedDocumentResolutionError,m as FailedHandleResolutionError,E as HandleResolutionError,U as ImproperDidError,g as InvalidResolvedHandleError,A as LocalActorResolver,N as PlcDidDocumentResolver,h as UnsupportedDidMethodError,P as WebDidDocumentResolver,O as WellKnownHandleResolver,L as XrpcDidDocumentResolver,W as XrpcHandleResolver}; 4 - //# sourceMappingURL=./identity-resolver.mjs.map
-1
vendor/esm.sh/@atcute/identity-resolver@1.2.2/es2022/identity-resolver.mjs.map
··· 1 - {"mappings":"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","names":["getAtprotoHandle","getPdsEndpoint","isDid","DidDocumentResolutionError","UnsupportedDidMethodError","did","ImproperDidError","DocumentNotFoundError","FailedDocumentResolutionError","options","HandleResolutionError","DidNotFoundError","handle","FailedHandleResolutionError","InvalidResolvedHandleError","AmbiguousHandleError","ActorResolutionError","LocalActorResolver","options","actor","identifierIsDid","isDid","did","err","ActorResolutionError","doc","pds","getPdsEndpoint","handle","writtenHandle","getAtprotoHandle","extractDidMethod","CompositeDidDocumentResolver","#methods","methods","did","options","method","extractDidMethod","resolver","UnsupportedDidMethodError","FailedResponseError","defs","isResponseOk","parseResponseAsJson","pipe","validateJsonWith","fetchDocHandler","PlcDidDocumentResolver","#fetch","apiUrl","fetchThis","did","options","UnsupportedDidMethodError","json","url","response","fetchDocHandler","cause","FailedResponseError","DocumentNotFoundError","FailedDocumentResolutionError","webDidToDocumentUrl","FailedResponseError","WebDidDocumentResolver","#fetch","fetchThis","did","options","UnsupportedDidMethodError","json","url","webDidToDocumentUrl","response","fetchDocHandler","cause","FailedResponseError","DocumentNotFoundError","FailedDocumentResolutionError","AtprotoWebDidDocumentResolver","host","paths","ImproperDidError","defs","FailedResponseError","isResponseOk","parseResponseAsJson","pipe","validateJsonWith","v","fetchXrpcHandler","pipe","isResponseOk","parseResponseAsJson","validateJsonWith","defs","XrpcDidDocumentResolver","#fetch","serviceUrl","fetchThis","did","options","json","url","response","cause","FailedResponseError","DocumentNotFoundError","FailedDocumentResolutionError","CompositeHandleResolver","#methods","methods","strategy","handle","options","http","dns","parentSignal","controller","dnsPromise","httpPromise","resolve","did","noop","resolved","dnsResponse","httpResponse","dnsDid","httpDid","AmbiguousHandleError","isAtprotoDid","fetchDohJsonTxt","SUBDOMAIN","PREFIX","DohJsonHandleResolver","#fetch","dohUrl","fetchThis","handle","options","json","url","response","fetchDohJsonTxt","cause","FailedHandleResolutionError","status","answers","DidNotFoundError","i","il","data","j","AmbiguousHandleError","did","isAtprotoDid","InvalidResolvedHandleError","isAtprotoDid","FailedResponseError","isResponseOk","pipe","readResponseAsText","fetchWellKnownHandler","pipe","isResponseOk","readResponseAsText","WellKnownHandleResolver","#fetch","fetchThis","handle","options","text","url","response","cause","FailedResponseError","DidNotFoundError","FailedHandleResolutionError","did","isAtprotoDid","InvalidResolvedHandleError","v","isAtprotoDid","FailedResponseError","isResponseOk","parseResponseAsJson","pipe","validateJsonWith","response","input","isAtprotoDid","fetchXrpcHandler","pipe","isResponseOk","parseResponseAsJson","validateJsonWith","XrpcHandleResolver","#fetch","serviceUrl","fetchThis","handle","options","json","url","cause","FailedResponseError","DidNotFoundError","FailedHandleResolutionError"],"sources":["../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/actor/local.ts","../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/errors.ts","../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/did/composite.ts","../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/did/methods/plc.ts","../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/did/utils.ts","../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/did/methods/web.ts","../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/did/methods/xrpc.ts","../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/handle/composite.ts","../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/handle/methods/doh-json.ts","../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/handle/methods/well-known.ts","../esm/npm/@atcute/identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/handle/methods/xrpc.ts"],"sourcesContent":["import { getAtprotoHandle, getPdsEndpoint } from '@atcute/identity';\nimport { isDid, type ActorIdentifier, type Did, type Handle } from '@atcute/lexicons/syntax';\n\nimport { ActorResolutionError } from '../errors.js';\nimport type {\n\tActorResolver,\n\tDidDocumentResolver,\n\tHandleResolver,\n\tResolveActorOptions,\n\tResolvedActor,\n} from '../types.js';\n\nexport interface LocalActorResolverOptions {\n\thandleResolver: HandleResolver;\n\tdidDocumentResolver: DidDocumentResolver;\n}\n\nexport class LocalActorResolver implements ActorResolver {\n\thandleResolver: HandleResolver;\n\tdidDocumentResolver: DidDocumentResolver;\n\n\tconstructor(options: LocalActorResolverOptions) {\n\t\tthis.handleResolver = options.handleResolver;\n\t\tthis.didDocumentResolver = options.didDocumentResolver;\n\t}\n\n\tasync resolve(actor: ActorIdentifier, options?: ResolveActorOptions): Promise\u003cResolvedActor\u003e {\n\t\tconst identifierIsDid = isDid(actor);\n\n\t\tlet did: Did;\n\t\tif (identifierIsDid) {\n\t\t\tdid = actor as Did;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tdid = await this.handleResolver.resolve(actor as Handle, options);\n\t\t\t} catch (err) {\n\t\t\t\tthrow new ActorResolutionError(`failed to resolve handle`, { cause: err });\n\t\t\t}\n\t\t}\n\n\t\tlet doc;\n\t\ttry {\n\t\t\tdoc = await this.didDocumentResolver.resolve(did, options);\n\t\t} catch (err) {\n\t\t\tthrow new ActorResolutionError(`failed to resolve did document`, { cause: err });\n\t\t}\n\n\t\tconst pds = getPdsEndpoint(doc);\n\t\tif (!pds) {\n\t\t\tthrow new ActorResolutionError(`missing pds endpoint`);\n\t\t}\n\n\t\tlet handle: Handle = 'handle.invalid';\n\t\tif (identifierIsDid) {\n\t\t\tconst writtenHandle = getAtprotoHandle(doc);\n\t\t\tif (writtenHandle) {\n\t\t\t\ttry {\n\t\t\t\t\tconst resolved = await this.handleResolver.resolve(writtenHandle, options);\n\n\t\t\t\t\tif (resolved === did) {\n\t\t\t\t\t\thandle = writtenHandle;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t} else if (getAtprotoHandle(doc) === actor) {\n\t\t\thandle = actor as Handle;\n\t\t}\n\n\t\treturn {\n\t\t\tdid: did,\n\t\t\thandle: handle,\n\t\t\tpds: new URL(pds).href,\n\t\t};\n\t}\n}\n","import type { Did } from '@atcute/lexicons/syntax';\n\n// #region DID document resolution errors\nexport class DidDocumentResolutionError extends Error {\n\toverride name = 'DidResolutionError';\n}\n\nexport class UnsupportedDidMethodError extends DidDocumentResolutionError {\n\toverride name = 'UnsupportedDidMethodError';\n\n\tconstructor(public did: Did) {\n\t\tsuper(`unsupported did method; did=${did}`);\n\t}\n}\n\nexport class ImproperDidError extends DidDocumentResolutionError {\n\toverride name = 'ImproperDidError';\n\n\tconstructor(public did: Did) {\n\t\tsuper(`improper did; did=${did}`);\n\t}\n}\n\nexport class DocumentNotFoundError extends DidDocumentResolutionError {\n\toverride name = 'DocumentNotFoundError';\n\n\tconstructor(public did: Did) {\n\t\tsuper(`did document not found; did=${did}`);\n\t}\n}\n\nexport class FailedDocumentResolutionError extends DidDocumentResolutionError {\n\toverride name = 'FailedDocumentResolutionError';\n\n\tconstructor(\n\t\tpublic did: Did,\n\t\toptions?: ErrorOptions,\n\t) {\n\t\tsuper(`failed to resolve did document; did=${did}`, options);\n\t}\n}\n// #endregion\n\n// #region Handle resolution errors\nexport class HandleResolutionError extends Error {\n\toverride name = 'HandleResolutionError';\n}\n\nexport class DidNotFoundError extends HandleResolutionError {\n\toverride name = 'DidNotFoundError';\n\n\tconstructor(public handle: string) {\n\t\tsuper(`handle returned no did; handle=${handle}`);\n\t}\n}\n\nexport class FailedHandleResolutionError extends HandleResolutionError {\n\toverride name = 'FailedHandleResolutionError';\n\n\tconstructor(\n\t\tpublic handle: string,\n\t\toptions?: ErrorOptions,\n\t) {\n\t\tsuper(`failed to resolve handle; handle=${handle}`, options);\n\t}\n}\n\nexport class InvalidResolvedHandleError extends HandleResolutionError {\n\toverride name = 'InvalidResolvedHandleError';\n\n\tconstructor(\n\t\tpublic handle: string,\n\t\tpublic did: string,\n\t) {\n\t\tsuper(`handle returned invalid did; handle=${handle}; did=${did}`);\n\t}\n}\n\nexport class AmbiguousHandleError extends HandleResolutionError {\n\toverride name = 'AmbiguousHandleError';\n\n\tconstructor(handle: string) {\n\t\tsuper(`handle returned multiple did values; handle=${handle}`);\n\t}\n}\n// #endregion\n\n// #region Actor resolution errors\nexport class ActorResolutionError extends Error {\n\toverride name = 'ActorResolutionError';\n}\n// #endregion\n","import { extractDidMethod, type DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons/syntax';\n\nimport * as err from '../errors.js';\nimport type { DidDocumentResolver, ResolveDidDocumentOptions } from '../types.js';\n\nexport interface CompositeDidDocumentResolverOptions\u003cM extends string\u003e {\n\tmethods: { [K in M]: DidDocumentResolver\u003cK\u003e };\n}\n\nexport class CompositeDidDocumentResolver\u003cM extends string\u003e implements DidDocumentResolver\u003cM\u003e {\n\t#methods: Map\u003cstring, DidDocumentResolver\u003cM\u003e\u003e;\n\n\tconstructor({ methods }: CompositeDidDocumentResolverOptions\u003cM\u003e) {\n\t\tthis.#methods = new Map(Object.entries(methods));\n\t}\n\n\tasync resolve(did: Did\u003cM\u003e, options?: ResolveDidDocumentOptions): Promise\u003cDidDocument\u003e {\n\t\tconst method = extractDidMethod(did);\n\n\t\tconst resolver = this.#methods.get(method);\n\t\tif (resolver === undefined) {\n\t\t\tthrow new err.UnsupportedDidMethodError(did);\n\t\t}\n\n\t\treturn await resolver.resolve(did, options);\n\t}\n}\n","import type { DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons/syntax';\nimport { FailedResponseError } from '@atcute/util-fetch';\n\nimport * as err from '../../errors.js';\nimport type { DidDocumentResolver, ResolveDidDocumentOptions } from '../../types.js';\nimport { fetchDocHandler } from '../utils.js';\n\nexport interface PlcDidDocumentResolverOptions {\n\tapiUrl?: string;\n\tfetch?: typeof fetch;\n}\n\nexport class PlcDidDocumentResolver implements DidDocumentResolver\u003c'plc'\u003e {\n\treadonly apiUrl: string;\n\t#fetch: typeof fetch;\n\n\tconstructor({\n\t\tapiUrl = 'https://plc.directory',\n\t\tfetch: fetchThis = fetch,\n\t}: PlcDidDocumentResolverOptions = {}) {\n\t\tthis.apiUrl = apiUrl;\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(did: Did\u003c'plc'\u003e, options?: ResolveDidDocumentOptions): Promise\u003cDidDocument\u003e {\n\t\t// quick sanity check\n\t\tif (!did.startsWith('did:plc:')) {\n\t\t\tthrow new err.UnsupportedDidMethodError(did);\n\t\t}\n\n\t\tlet json: DidDocument;\n\n\t\ttry {\n\t\t\tconst url = new URL(`/${encodeURIComponent(did)}`, this.apiUrl);\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\tredirect: 'manual',\n\t\t\t\theaders: { accept: 'application/did+ld+json,application/json' },\n\t\t\t});\n\n\t\t\tif (response.status \u003e= 300 \u0026\u0026 response.status \u003c 400) {\n\t\t\t\tthrow new TypeError(`unexpected redirect`);\n\t\t\t}\n\n\t\t\tconst handled = await fetchDocHandler(response);\n\n\t\t\tjson = handled.json;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError \u0026\u0026 cause.status === 404) {\n\t\t\t\tthrow new err.DocumentNotFoundError(did);\n\t\t\t}\n\n\t\t\tthrow new err.FailedDocumentResolutionError(did, { cause });\n\t\t}\n\n\t\treturn json;\n\t}\n}\n","import { defs } from '@atcute/identity';\nimport { isResponseOk, parseResponseAsJson, pipe, validateJsonWith } from '@atcute/util-fetch';\n\nexport const fetchDocHandler = pipe(\n\tisResponseOk,\n\tparseResponseAsJson(/^application\\/(did\\+ld\\+)?json$/, 20 * 1024),\n\tvalidateJsonWith(defs.didDocument, { mode: 'passthrough' }),\n);\n","import { webDidToDocumentUrl, type DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons/syntax';\nimport { FailedResponseError } from '@atcute/util-fetch';\n\nimport * as err from '../../errors.js';\nimport type { DidDocumentResolver, ResolveDidDocumentOptions } from '../../types.js';\nimport { fetchDocHandler } from '../utils.js';\n\nexport interface WebDidDocumentResolverOptions {\n\tfetch?: typeof fetch;\n}\n\nexport class WebDidDocumentResolver implements DidDocumentResolver\u003c'web'\u003e {\n\t#fetch: typeof fetch;\n\n\tconstructor({ fetch: fetchThis = fetch }: WebDidDocumentResolverOptions = {}) {\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(did: Did\u003c'web'\u003e, options?: ResolveDidDocumentOptions): Promise\u003cDidDocument\u003e {\n\t\t// quick sanity check\n\t\tif (!did.startsWith('did:web:')) {\n\t\t\tthrow new err.UnsupportedDidMethodError(did);\n\t\t}\n\n\t\tlet json: DidDocument;\n\n\t\ttry {\n\t\t\tconst url = webDidToDocumentUrl(did);\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\tredirect: 'manual',\n\t\t\t\theaders: { accept: 'application/did+ld+json,application/json' },\n\t\t\t});\n\n\t\t\tif (response.status \u003e= 300 \u0026\u0026 response.status \u003c 400) {\n\t\t\t\tthrow new TypeError(`unexpected redirect`);\n\t\t\t}\n\n\t\t\tconst handled = await fetchDocHandler(response);\n\n\t\t\tjson = handled.json;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError \u0026\u0026 cause.status === 404) {\n\t\t\t\tthrow new err.DocumentNotFoundError(did);\n\t\t\t}\n\n\t\t\tthrow new err.FailedDocumentResolutionError(did, { cause });\n\t\t}\n\n\t\treturn json;\n\t}\n}\n\nexport class AtprotoWebDidDocumentResolver implements DidDocumentResolver\u003c'web'\u003e {\n\t#fetch: typeof fetch;\n\n\tconstructor({ fetch: fetchThis = fetch }: WebDidDocumentResolverOptions = {}) {\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(did: Did\u003c'web'\u003e, options?: ResolveDidDocumentOptions): Promise\u003cDidDocument\u003e {\n\t\t// quick sanity check\n\t\tif (!did.startsWith('did:web:')) {\n\t\t\tthrow new err.UnsupportedDidMethodError(did);\n\t\t}\n\n\t\tconst [host, ...paths] = did.slice(8).split(':').map(decodeURIComponent);\n\t\tconst url = new URL(`https://${host}/.well-known/did.json`);\n\n\t\tif (paths.length \u003e 0) {\n\t\t\tthrow new err.ImproperDidError(did);\n\t\t}\n\n\t\tlet json: DidDocument;\n\n\t\ttry {\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\tredirect: 'manual',\n\t\t\t\theaders: { accept: 'application/did+ld+json,application/json' },\n\t\t\t});\n\n\t\t\tif (response.status \u003e= 300 \u0026\u0026 response.status \u003c 400) {\n\t\t\t\tthrow new TypeError(`unexpected redirect`);\n\t\t\t}\n\n\t\t\tconst handled = await fetchDocHandler(response);\n\n\t\t\tjson = handled.json;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError \u0026\u0026 cause.status === 404) {\n\t\t\t\tthrow new err.DocumentNotFoundError(did);\n\t\t\t}\n\n\t\t\tthrow new err.FailedDocumentResolutionError(did, { cause });\n\t\t}\n\n\t\treturn json;\n\t}\n}\n","import { defs, type DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons/syntax';\nimport {\n\tFailedResponseError,\n\tisResponseOk,\n\tparseResponseAsJson,\n\tpipe,\n\tvalidateJsonWith,\n} from '@atcute/util-fetch';\n\nimport * as v from '@badrap/valita';\n\nimport * as err from '../../errors.js';\nimport type { DidDocumentResolver, ResolveDidDocumentOptions } from '../../types.js';\n\nconst fetchXrpcHandler = pipe(\n\tisResponseOk,\n\tparseResponseAsJson(/^application\\/json$/, 20 * 1024 + 16),\n\tvalidateJsonWith(v.object({ didDoc: defs.didDocument }), { mode: 'passthrough' }),\n);\n\nexport interface XrpcDidDocumentResolverOptions {\n\tserviceUrl: string;\n\tfetch?: typeof fetch;\n}\n\nexport class XrpcDidDocumentResolver implements DidDocumentResolver\u003cstring\u003e {\n\treadonly serviceUrl: string;\n\t#fetch: typeof fetch;\n\n\tconstructor({ serviceUrl, fetch: fetchThis = fetch }: XrpcDidDocumentResolverOptions) {\n\t\tthis.serviceUrl = serviceUrl;\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(did: Did, options?: ResolveDidDocumentOptions): Promise\u003cDidDocument\u003e {\n\t\tlet json: DidDocument;\n\n\t\ttry {\n\t\t\tconst url = new URL(`/xrpc/com.atproto.identity.resolveDid`, this.serviceUrl);\n\t\t\turl.searchParams.set('did', did);\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\theaders: { accept: 'application/json' },\n\t\t\t});\n\n\t\t\tconst handled = await fetchXrpcHandler(response);\n\n\t\t\tjson = handled.json.didDoc;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError \u0026\u0026 cause.status === 404) {\n\t\t\t\tthrow new err.DocumentNotFoundError(did);\n\t\t\t}\n\n\t\t\tthrow new err.FailedDocumentResolutionError(did, { cause });\n\t\t}\n\n\t\treturn json;\n\t}\n}\n","import type { AtprotoDid, Handle } from '@atcute/lexicons/syntax';\n\nimport * as err from '../errors.js';\nimport type { HandleResolver, ResolveHandleOptions } from '../types.js';\n\nexport type CompositeStrategy = 'http-first' | 'dns-first' | 'race' | 'both';\n\nexport interface CompositeHandleResolverOptions {\n\t/** controls how the resolution is done, defaults to 'race' */\n\tstrategy?: CompositeStrategy;\n\t/** the methods to use for resolving the handle. */\n\tmethods: Record\u003c'http' | 'dns', HandleResolver\u003e;\n}\n\nexport class CompositeHandleResolver implements HandleResolver {\n\t#methods: Record\u003c'http' | 'dns', HandleResolver\u003e;\n\tstrategy: CompositeStrategy;\n\n\tconstructor({ methods, strategy = 'race' }: CompositeHandleResolverOptions) {\n\t\tthis.#methods = methods;\n\t\tthis.strategy = strategy;\n\t}\n\n\tasync resolve(handle: Handle, options?: ResolveHandleOptions): Promise\u003cAtprotoDid\u003e {\n\t\tconst { http, dns } = this.#methods;\n\n\t\tconst parentSignal = options?.signal;\n\t\tconst controller = new AbortController();\n\t\tif (parentSignal) {\n\t\t\tparentSignal.addEventListener('abort', () =\u003e controller.abort(), { signal: controller.signal });\n\t\t}\n\n\t\tconst dnsPromise = dns.resolve(handle, { ...options, signal: controller.signal });\n\t\tconst httpPromise = http.resolve(handle, { ...options, signal: controller.signal });\n\n\t\tswitch (this.strategy) {\n\t\t\tcase 'race': {\n\t\t\t\treturn new Promise((resolve) =\u003e {\n\t\t\t\t\tdnsPromise.then(\n\t\t\t\t\t\t(did) =\u003e {\n\t\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t\t\tresolve(did);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =\u003e resolve(httpPromise),\n\t\t\t\t\t);\n\n\t\t\t\t\thttpPromise.then(\n\t\t\t\t\t\t(did) =\u003e {\n\t\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t\t\tresolve(did);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =\u003e resolve(dnsPromise),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase 'dns-first': {\n\t\t\t\thttpPromise.catch(noop);\n\n\t\t\t\tconst resolved = await dnsPromise.catch(noop);\n\t\t\t\tif (resolved) {\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t\treturn resolved;\n\t\t\t\t}\n\n\t\t\t\treturn httpPromise;\n\t\t\t}\n\t\t\tcase 'http-first': {\n\t\t\t\tdnsPromise.catch(noop);\n\n\t\t\t\tconst resolved = await httpPromise.catch(noop);\n\t\t\t\tif (resolved) {\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t\treturn resolved;\n\t\t\t\t}\n\n\t\t\t\treturn dnsPromise;\n\t\t\t}\n\t\t\tcase 'both': {\n\t\t\t\tconst [dnsResponse, httpResponse] = await Promise.allSettled([dnsPromise, httpPromise]);\n\n\t\t\t\tconst dnsDid = dnsResponse.status === 'fulfilled' ? dnsResponse.value : undefined;\n\t\t\t\tconst httpDid = httpResponse.status === 'fulfilled' ? httpResponse.value : undefined;\n\n\t\t\t\tif (dnsDid \u0026\u0026 httpDid \u0026\u0026 dnsDid !== httpDid) {\n\t\t\t\t\tthrow new err.AmbiguousHandleError(handle);\n\t\t\t\t}\n\n\t\t\t\treturn dnsDid || httpDid || dnsPromise;\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst noop = () =\u003e {};\n","import { isAtprotoDid } from '@atcute/identity';\nimport type { AtprotoDid, Handle } from '@atcute/lexicons/syntax';\nimport { type DohJsonTxtResult, fetchDohJsonTxt } from '@atcute/util-fetch';\n\nimport * as err from '../../errors.js';\nimport type { HandleResolver, ResolveHandleOptions } from '../../types.js';\n\nconst SUBDOMAIN = '_atproto';\nconst PREFIX = 'did=';\n\nexport interface DohJsonHandleResolverOptions {\n\tdohUrl: string;\n\tfetch?: typeof fetch;\n}\n\nexport class DohJsonHandleResolver implements HandleResolver {\n\treadonly dohUrl: string;\n\t#fetch: typeof fetch;\n\n\tconstructor({ dohUrl, fetch: fetchThis = fetch }: DohJsonHandleResolverOptions) {\n\t\tthis.dohUrl = dohUrl;\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(handle: Handle, options?: ResolveHandleOptions): Promise\u003cAtprotoDid\u003e {\n\t\tlet json: DohJsonTxtResult;\n\n\t\ttry {\n\t\t\tconst url = new URL(this.dohUrl);\n\t\t\turl.searchParams.set('name', `${SUBDOMAIN}.${handle}`);\n\t\t\turl.searchParams.set('type', 'TXT');\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\theaders: { accept: 'application/dns-json' },\n\t\t\t});\n\n\t\t\tconst handled = await fetchDohJsonTxt(response);\n\n\t\t\tjson = handled.json;\n\t\t} catch (cause) {\n\t\t\tthrow new err.FailedHandleResolutionError(handle, { cause });\n\t\t}\n\n\t\tconst status = json.Status;\n\t\tconst answers = json.Answer;\n\n\t\tif (status !== 0 /* NOERROR */) {\n\t\t\tif (status === 3 /* NXDOMAIN */) {\n\t\t\t\tthrow new err.DidNotFoundError(handle);\n\t\t\t}\n\n\t\t\tthrow new err.FailedHandleResolutionError(handle, {\n\t\t\t\tcause: new TypeError(`dns returned ${status}`),\n\t\t\t});\n\t\t}\n\n\t\tfor (let i = 0, il = answers.length; i \u003c il; i++) {\n\t\t\tconst answer = answers[i];\n\t\t\tconst data = answer.data;\n\n\t\t\tif (!data.startsWith(PREFIX)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (let j = i + 1; j \u003c il; j++) {\n\t\t\t\tconst data = answers[j].data;\n\t\t\t\tif (data.startsWith(PREFIX)) {\n\t\t\t\t\tthrow new err.AmbiguousHandleError(handle);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst did = data.slice(PREFIX.length);\n\t\t\tif (!isAtprotoDid(did)) {\n\t\t\t\tthrow new err.InvalidResolvedHandleError(handle, did);\n\t\t\t}\n\n\t\t\treturn did;\n\t\t}\n\n\t\t// theoretically this shouldn't happen, it should've returned NXDOMAIN\n\t\tthrow new err.DidNotFoundError(handle);\n\t}\n}\n","import { isAtprotoDid } from '@atcute/identity';\nimport type { AtprotoDid, Handle } from '@atcute/lexicons/syntax';\nimport { FailedResponseError, isResponseOk, pipe, readResponseAsText } from '@atcute/util-fetch';\n\nimport * as err from '../../errors.js';\nimport type { HandleResolver, ResolveHandleOptions } from '../../types.js';\n\nexport interface WellKnownHandleResolverOptions {\n\tfetch?: typeof fetch;\n}\n\nconst fetchWellKnownHandler = pipe(isResponseOk, readResponseAsText(2048 + 16));\n\nexport class WellKnownHandleResolver implements HandleResolver {\n\t#fetch: typeof fetch;\n\n\tconstructor({ fetch: fetchThis = fetch }: WellKnownHandleResolverOptions = {}) {\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(handle: Handle, options?: ResolveHandleOptions): Promise\u003cAtprotoDid\u003e {\n\t\tlet text: string;\n\n\t\ttry {\n\t\t\tconst url = new URL('/.well-known/atproto-did', `https://${handle}`);\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\tredirect: 'manual',\n\t\t\t});\n\n\t\t\tif (response.status \u003e= 300 \u0026\u0026 response.status \u003c 400) {\n\t\t\t\tthrow new TypeError(`unexpected redirect`);\n\t\t\t}\n\n\t\t\tconst handled = await fetchWellKnownHandler(response);\n\n\t\t\ttext = handled.text;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError \u0026\u0026 cause.status === 404) {\n\t\t\t\tthrow new err.DidNotFoundError(handle);\n\t\t\t}\n\n\t\t\tthrow new err.FailedHandleResolutionError(handle, { cause });\n\t\t}\n\n\t\tconst did = text.split('\\n')[0]!.trim();\n\t\tif (!isAtprotoDid(did)) {\n\t\t\tthrow new err.InvalidResolvedHandleError(handle, did);\n\t\t}\n\n\t\treturn did;\n\t}\n}\n","import * as v from '@badrap/valita';\n\nimport { isAtprotoDid } from '@atcute/identity';\nimport type { AtprotoDid, Handle } from '@atcute/lexicons/syntax';\nimport {\n\tFailedResponseError,\n\tisResponseOk,\n\tparseResponseAsJson,\n\tpipe,\n\tvalidateJsonWith,\n} from '@atcute/util-fetch';\n\nimport * as err from '../../errors.js';\nimport type { HandleResolver, ResolveHandleOptions } from '../../types.js';\n\nconst response = v.object({\n\tdid: v.string().assert((input) =\u003e isAtprotoDid(input)),\n});\n\nconst fetchXrpcHandler = pipe(\n\tisResponseOk,\n\tparseResponseAsJson(/^application\\/json$/, 4 * 1024),\n\tvalidateJsonWith(response, { mode: 'passthrough' }),\n);\n\nexport interface XrpcHandleResolverOptions {\n\tserviceUrl: string;\n\tfetch?: typeof fetch;\n}\n\nexport class XrpcHandleResolver implements HandleResolver {\n\treadonly serviceUrl: string;\n\t#fetch: typeof fetch;\n\n\tconstructor({ serviceUrl, fetch: fetchThis = fetch }: XrpcHandleResolverOptions) {\n\t\tthis.serviceUrl = serviceUrl;\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(handle: Handle, options?: ResolveHandleOptions): Promise\u003cAtprotoDid\u003e {\n\t\tlet json: v.Infer\u003ctypeof response\u003e;\n\n\t\ttry {\n\t\t\tconst url = new URL(`/xrpc/com.atproto.identity.resolveHandle`, this.serviceUrl);\n\t\t\turl.searchParams.set('handle', handle);\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\theaders: { accept: 'application/json' },\n\t\t\t});\n\n\t\t\tconst handled = await fetchXrpcHandler(response);\n\n\t\t\tjson = handled.json;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError \u0026\u0026 cause.status === 400) {\n\t\t\t\tthrow new err.DidNotFoundError(handle);\n\t\t\t}\n\n\t\t\tthrow new err.FailedHandleResolutionError(handle, { cause });\n\t\t}\n\n\t\treturn json.did;\n\t}\n}\n"],"version":3}
-3
vendor/esm.sh/@atcute/identity@1.1.4/es2022/identity.mjs
··· 1 - /* esm.sh - @atcute/identity@1.1.4 */ 2 - var E=Object.defineProperty;var D=(e,t)=>{for(var o in t)E(e,o,{get:t[o],enumerable:!0})};var g={};D(g,{FRAGMENT_RE:()=>h,MULTIBASE_RE:()=>m,didDocument:()=>_,didRelativeUri:()=>f,didString:()=>d,multibaseString:()=>y,rfc3968UriSchema:()=>l,service:()=>x,verificationMethod:()=>u});import{isDid as R}from"../../lexicons@1.2.10/es2022/syntax.mjs";import*as r from"../../../@badrap/valita@0.4.6/es2022/valita.mjs";var h=/^#[^#]+$/,m=/^z[a-km-zA-HJ-NP-Z1-9]+$/,l=r.string().assert(e=>URL.canParse(e),"must be a url"),f=r.string().assert(e=>h.test(e)||URL.canParse(e),"must be a did relative uri"),y=r.string().assert(e=>m.test(e),"must be a base58 multibase"),d=r.string().assert(R,"must be a did"),u=r.object({id:f,type:r.string(),controller:d,publicKeyMultibase:y.optional(),publicKeyJwk:r.record().optional()}).chain(e=>{switch(e.type){case"Multikey":{if(e.publicKeyMultibase===void 0)return r.err({message:"missing multikey",path:["publicKeyMultibase"]});break}case"EcdsaSecp256k1VerificationKey2019":case"EcdsaSecp256r1VerificationKey2019":{if(e.publicKeyMultibase===void 0)return r.err({message:"missing multibase key",path:["publicKeyMultibase"]});break}}return r.ok(e)}),x=r.object({id:f,type:r.union(r.string(),r.array(r.string())),serviceEndpoint:r.union(l,r.record(l),r.array(r.union(l,r.record(l))))}),_=r.object({"@context":r.array(l).optional(),id:d,alsoKnownAs:r.array(l).chain(e=>{for(let t=0,o=e.length;t<o;t++){let n=e[t];for(let i=0;i<t;i++)if(n===e[i])return r.err({message:`duplicate "${n}" aka entry`,path:[t]})}return r.ok(e)}).optional(),verificationMethod:r.array(u).chain(e=>{for(let t=0,o=e.length;t<o;t++){let i=e[t].id;for(let s=0;s<t;s++)if(i===e[s].id)return r.err({message:`duplicate "${i}" verification method`,path:[t,"id"]})}return r.ok(e)}).optional(),service:r.array(x).optional(),controller:r.union(d,r.array(d)).optional(),authentication:r.array(r.union(f,u)).optional()}).chain(e=>{let{id:t,service:o}=e;if(o?.length){let n=o.length,i=new Array(n);for(let s=0;s<n;s++){let a=o[s].id;a[0]==="#"&&(a=t+a),i[s]=a}for(let s=0;s<n;s++){let c=i[s];for(let a=0;a<s;a++)if(c===i[a])return r.err({message:`duplicate "${c}" service`,path:["service",s,"id"]})}}return r.ok(e)});import{isHandle as M}from"../../lexicons@1.2.10/es2022/syntax.mjs";var $="parse"in URL,w=e=>{let t=null;if($)t=URL.parse(e);else try{t=new URL(e)}catch{}return t!==null&&(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/"&&t.search===""&&t.hash===""},b=(e,t)=>{let o=e.verificationMethod;if(!o)return;let n=`${e.id}${t}`;for(let i=0,s=o.length;i<s;i++){let{id:c,type:a,publicKeyMultibase:v}=o[i];if(c===n&&v!==void 0)return{type:a,publicKeyMultibase:v}}},W=e=>b(e,"#atproto"),F=e=>b(e,"#atproto_label"),N=e=>{let t=e.alsoKnownAs;if(!t)return null;let o="at://";for(let n=0,i=t.length;n<i;n++){let s=t[n];if(!s.startsWith(o))continue;let c=s.slice(o.length);return M(c)?c:void 0}return null},p=(e,t)=>{let o=e.service;if(o)for(let n=0,i=o.length;n<i;n++){let{id:s,type:c,serviceEndpoint:a}=o[n];if(!(s!==t.id&&s!==e.id+t.id)){if(t.type!==void 0){if(Array.isArray(c)){if(!c.includes(t.type))continue}else if(c!==t.type)continue}if(!(typeof a!="string"||!w(a)))return a}}},T=e=>p(e,{id:"#atproto_pds",type:"AtprotoPersonalDataServer"}),V=e=>p(e,{id:"#atproto_labeler",type:"AtprotoLabeler"}),H=e=>p(e,{id:"#bsky_chat",type:"BskyChatService"}),O=e=>p(e,{id:"#bsky_fg",type:"BskyFeedGenerator"}),G=e=>p(e,{id:"#bsky_notif",type:"BskyNotificationService"});var z=/^did:plc:([a-z2-7]{24})$/,A=e=>e.length===32&&z.test(e);var K=/^did:web:([a-zA-Z0-9%-]+(?:(?:\.[a-zA-Z0-9%-]+)*(?:\.[a-zA-Z]{2,}))?)?((?::[a-zA-Z0-9\-%.]+)+)?$/,U=/^did:web:([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,})|localhost(?:%3[aA]\d+)?)$/,Y=e=>e.length>=9&&K.test(e),k=e=>e.length>=12&&U.test(e),q=e=>{let[t,...o]=e.slice(8).split(":").map(decodeURIComponent),n=`did:web:${encodeURIComponent(t.toLowerCase())}`;return o.length>0&&(n+=`:${o.join(":")}`),n},Q=e=>{let[t,...o]=e.slice(8).split(":").map(decodeURIComponent),n="/"+o.join("/");n==="/"?n="/.well-known/did.json":n+="/did.json";let i=new URL(`https://${t}${n}`);return i.hostname==="localhost"&&(i.protocol="http:"),i};var L=/^(?:[A-Za-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})*$/,P=e=>A(e)||k(e),oe=e=>{if(e.length<14)return!1;let t=e.indexOf("#",12);return t===-1?!1:L.test(e.slice(t+1))&&P(e.slice(0,t))},ne=e=>{let t=e.indexOf(":",4);return e.slice(4,t)};var S=/^did:key:z[a-km-zA-HJ-NP-Z1-9]+$/,se=e=>e.length>=10&&S.test(e);export{U as ATPROTO_WEB_DID_RE,z as PLC_DID_RE,K as WEB_DID_RE,g as defs,ne as extractDidMethod,N as getAtprotoHandle,F as getAtprotoLabelerVerificationMaterial,p as getAtprotoServiceEndpoint,W as getAtprotoVerificationMaterial,H as getBlueskyChatEndpoint,O as getBlueskyFeedgenEndpoint,G as getBlueskyNotificationEndpoint,V as getLabelerEndpoint,T as getPdsEndpoint,b as getVerificationMaterial,oe as isAtprotoAudience,P as isAtprotoDid,w as isAtprotoServiceEndpoint,k as isAtprotoWebDid,se as isKeyDid,A as isPlcDid,Y as isWebDid,q as normalizeWebDid,Q as webDidToDocumentUrl}; 3 - //# sourceMappingURL=./identity.mjs.map
-1
vendor/esm.sh/@atcute/identity@1.1.4/es2022/identity.mjs.map
··· 1 - {"mappings":"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","names":["typedefs_exports","__export","FRAGMENT_RE","MULTIBASE_RE","didDocument","didRelativeUri","didString","multibaseString","rfc3968UriSchema","service","verificationMethod","isDid","v","FRAGMENT_RE","MULTIBASE_RE","rfc3968UriSchema","input","didRelativeUri","multibaseString","didString","isDid","verificationMethod","service","didDocument","i","len","aka","j","methodId","did","services","identifiers","id","isHandle","isUrlParseSupported","isAtprotoServiceEndpoint","input","url","getVerificationMaterial","doc","id","verificationMethods","expectedId","idx","len","type","publicKeyMultibase","getAtprotoVerificationMaterial","getAtprotoLabelerVerificationMaterial","getAtprotoHandle","alsoKnownAs","PREFIX","aka","raw","isHandle","getAtprotoServiceEndpoint","predicate","services","serviceEndpoint","getPdsEndpoint","getLabelerEndpoint","getBlueskyChatEndpoint","getBlueskyFeedgenEndpoint","getBlueskyNotificationEndpoint","PLC_DID_RE","isPlcDid","input","WEB_DID_RE","ATPROTO_WEB_DID_RE","isWebDid","input","isAtprotoWebDid","normalizeWebDid","did","host","paths","normalized","webDidToDocumentUrl","pathname","url","FRAGMENT_RE","isAtprotoDid","input","isPlcDid","isAtprotoWebDid","isAtprotoAudience","isep","extractDidMethod","did","KEY_DID_RE","isKeyDid","input"],"sources":["../esm/npm/@atcute/identity@1.1.4/node_modules/@atcute/identity/lib/typedefs.ts","../esm/npm/@atcute/identity@1.1.4/node_modules/@atcute/identity/lib/utils.ts","../esm/npm/@atcute/identity@1.1.4/node_modules/@atcute/identity/lib/methods/plc.ts","../esm/npm/@atcute/identity@1.1.4/node_modules/@atcute/identity/lib/methods/web.ts","../esm/npm/@atcute/identity@1.1.4/node_modules/@atcute/identity/lib/did.ts","../esm/npm/@atcute/identity@1.1.4/node_modules/@atcute/identity/lib/methods/key.ts"],"sourcesContent":["import { isDid } from '@atcute/lexicons/syntax';\n\nimport * as v from '@badrap/valita';\n\nimport * as t from './types.ts';\n\n/** @deprecated */\nexport const FRAGMENT_RE = /^#[^#]+$/;\n/** @deprecated */\nexport const MULTIBASE_RE = /^z[a-km-zA-HJ-NP-Z1-9]+$/;\n\nexport const rfc3968UriSchema = v.string().assert((input) =\u003e {\n\treturn URL.canParse(input);\n}, `must be a url`);\n\nexport const didRelativeUri = v.string().assert((input) =\u003e {\n\treturn FRAGMENT_RE.test(input) || URL.canParse(input);\n}, `must be a did relative uri`);\n\nexport const multibaseString = v.string().assert((input) =\u003e {\n\treturn MULTIBASE_RE.test(input);\n}, `must be a base58 multibase`);\n\nexport const didString = v.string().assert(isDid, `must be a did`);\n\nexport const verificationMethod: v.Type\u003ct.VerificationMethod\u003e = v\n\t.object({\n\t\tid: didRelativeUri,\n\t\ttype: v.string(),\n\t\tcontroller: didString,\n\t\tpublicKeyMultibase: multibaseString.optional(),\n\t\tpublicKeyJwk: v.record().optional(),\n\t})\n\t.chain((input) =\u003e {\n\t\tswitch (input.type) {\n\t\t\tcase 'Multikey': {\n\t\t\t\tif (input.publicKeyMultibase === undefined) {\n\t\t\t\t\treturn v.err({ message: `missing multikey`, path: ['publicKeyMultibase'] });\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'EcdsaSecp256k1VerificationKey2019':\n\t\t\tcase 'EcdsaSecp256r1VerificationKey2019': {\n\t\t\t\tif (input.publicKeyMultibase === undefined) {\n\t\t\t\t\treturn v.err({ message: `missing multibase key`, path: ['publicKeyMultibase'] });\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn v.ok(input);\n\t});\n\nexport const service: v.Type\u003ct.Service\u003e = v.object({\n\t// should've only been RFC3968, but did:plc uses relative URIs.\n\tid: didRelativeUri,\n\ttype: v.union(v.string(), v.array(v.string())),\n\tserviceEndpoint: v.union(\n\t\trfc3968UriSchema,\n\t\tv.record(rfc3968UriSchema),\n\t\tv.array(v.union(rfc3968UriSchema, v.record(rfc3968UriSchema))),\n\t),\n});\n\nexport const didDocument: v.Type\u003ct.DidDocument\u003e = v\n\t.object({\n\t\t'@context': v.array(rfc3968UriSchema).optional(),\n\n\t\tid: didString,\n\n\t\talsoKnownAs: v\n\t\t\t.array(rfc3968UriSchema)\n\t\t\t.chain((input) =\u003e {\n\t\t\t\tfor (let i = 0, len = input.length; i \u003c len; i++) {\n\t\t\t\t\tconst aka = input[i];\n\n\t\t\t\t\tfor (let j = 0; j \u003c i; j++) {\n\t\t\t\t\t\tif (aka === input[j]) {\n\t\t\t\t\t\t\treturn v.err({\n\t\t\t\t\t\t\t\tmessage: `duplicate \"${aka}\" aka entry`,\n\t\t\t\t\t\t\t\tpath: [i],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn v.ok(input);\n\t\t\t})\n\t\t\t.optional(),\n\t\tverificationMethod: v\n\t\t\t.array(verificationMethod)\n\t\t\t.chain((input) =\u003e {\n\t\t\t\tfor (let i = 0, len = input.length; i \u003c len; i++) {\n\t\t\t\t\tconst method = input[i];\n\t\t\t\t\tconst methodId = method.id;\n\n\t\t\t\t\tfor (let j = 0; j \u003c i; j++) {\n\t\t\t\t\t\tif (methodId === input[j].id) {\n\t\t\t\t\t\t\treturn v.err({\n\t\t\t\t\t\t\t\tmessage: `duplicate \"${methodId}\" verification method`,\n\t\t\t\t\t\t\t\tpath: [i, 'id'],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn v.ok(input);\n\t\t\t})\n\t\t\t.optional(),\n\t\tservice: v.array(service).optional(),\n\n\t\tcontroller: v.union(didString, v.array(didString)).optional(),\n\t\tauthentication: v.array(v.union(didRelativeUri, verificationMethod)).optional(),\n\t})\n\t.chain((input) =\u003e {\n\t\tconst { id: did, service: services } = input;\n\n\t\tif (services?.length) {\n\t\t\tconst len = services.length;\n\n\t\t\t// oxlint-disable-next-line no-new-array\n\t\t\tconst identifiers = new Array(len);\n\n\t\t\tfor (let i = 0; i \u003c len; i++) {\n\t\t\t\tconst service = services[i];\n\n\t\t\t\tlet id = service.id;\n\t\t\t\tif (id[0] === '#') {\n\t\t\t\t\tid = did + id;\n\t\t\t\t}\n\n\t\t\t\tidentifiers[i] = id;\n\t\t\t}\n\n\t\t\tfor (let i = 0; i \u003c len; i++) {\n\t\t\t\tconst id = identifiers[i];\n\n\t\t\t\tfor (let j = 0; j \u003c i; j++) {\n\t\t\t\t\tif (id === identifiers[j]) {\n\t\t\t\t\t\treturn v.err({\n\t\t\t\t\t\t\tmessage: `duplicate \"${id}\" service`,\n\t\t\t\t\t\t\tpath: ['service', i, 'id'],\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn v.ok(input);\n\t});\n","import type { Handle } from '@atcute/lexicons';\nimport { isHandle } from '@atcute/lexicons/syntax';\n\nimport * as t from './types.ts';\n\nexport interface VerificationMaterial {\n\ttype: string;\n\tpublicKeyMultibase: string;\n}\n\nconst isUrlParseSupported = 'parse' in URL;\n\nexport const isAtprotoServiceEndpoint = (input: string): boolean =\u003e {\n\tlet url: URL | null = null;\n\tif (isUrlParseSupported) {\n\t\turl = URL.parse(input);\n\t} else {\n\t\ttry {\n\t\t\turl = new URL(input);\n\t\t} catch {}\n\t}\n\n\treturn (\n\t\turl !== null \u0026\u0026\n\t\t(url.protocol === 'https:' || url.protocol === 'http:') \u0026\u0026\n\t\turl.pathname === '/' \u0026\u0026\n\t\turl.search === '' \u0026\u0026\n\t\turl.hash === ''\n\t);\n};\n\nexport const getVerificationMaterial = (\n\tdoc: t.DidDocument,\n\tid: `#${string}`,\n): VerificationMaterial | undefined =\u003e {\n\tconst verificationMethods = doc.verificationMethod;\n\tif (!verificationMethods) {\n\t\treturn;\n\t}\n\n\tconst expectedId = `${doc.id}${id}`;\n\n\tfor (let idx = 0, len = verificationMethods.length; idx \u003c len; idx++) {\n\t\tconst { id, type, publicKeyMultibase } = verificationMethods[idx];\n\n\t\tif (id !== expectedId) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (publicKeyMultibase === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn { type, publicKeyMultibase };\n\t}\n};\n\nexport const getAtprotoVerificationMaterial = (doc: t.DidDocument): VerificationMaterial | undefined =\u003e {\n\treturn getVerificationMaterial(doc, '#atproto');\n};\n\nexport const getAtprotoLabelerVerificationMaterial = (\n\tdoc: t.DidDocument,\n): VerificationMaterial | undefined =\u003e {\n\treturn getVerificationMaterial(doc, '#atproto_label');\n};\n\nexport const getAtprotoHandle = (doc: t.DidDocument): Handle | null | undefined =\u003e {\n\tconst alsoKnownAs = doc.alsoKnownAs;\n\tif (!alsoKnownAs) {\n\t\treturn null;\n\t}\n\n\tconst PREFIX = 'at://';\n\n\tfor (let idx = 0, len = alsoKnownAs.length; idx \u003c len; idx++) {\n\t\tconst aka = alsoKnownAs[idx];\n\n\t\tif (!aka.startsWith(PREFIX)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst raw = aka.slice(PREFIX.length);\n\n\t\tif (!isHandle(raw)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn raw;\n\t}\n\n\treturn null;\n};\n\nexport const getAtprotoServiceEndpoint = (\n\tdoc: t.DidDocument,\n\tpredicate: { id: `#${string}`; type?: string },\n): string | undefined =\u003e {\n\tconst services = doc.service;\n\tif (!services) {\n\t\treturn;\n\t}\n\n\tfor (let idx = 0, len = services.length; idx \u003c len; idx++) {\n\t\tconst { id, type, serviceEndpoint } = services[idx];\n\n\t\tif (id !== predicate.id \u0026\u0026 id !== doc.id + predicate.id) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (predicate.type !== undefined) {\n\t\t\tif (Array.isArray(type)) {\n\t\t\t\tif (!type.includes(predicate.type)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (type !== predicate.type) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof serviceEndpoint !== 'string' || !isAtprotoServiceEndpoint(serviceEndpoint)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn serviceEndpoint;\n\t}\n};\n\nexport const getPdsEndpoint = (doc: t.DidDocument): string | undefined =\u003e {\n\treturn getAtprotoServiceEndpoint(doc, {\n\t\tid: '#atproto_pds',\n\t\ttype: 'AtprotoPersonalDataServer',\n\t});\n};\n\nexport const getLabelerEndpoint = (doc: t.DidDocument): string | undefined =\u003e {\n\treturn getAtprotoServiceEndpoint(doc, {\n\t\tid: '#atproto_labeler',\n\t\ttype: 'AtprotoLabeler',\n\t});\n};\n\nexport const getBlueskyChatEndpoint = (doc: t.DidDocument): string | undefined =\u003e {\n\treturn getAtprotoServiceEndpoint(doc, {\n\t\tid: '#bsky_chat',\n\t\ttype: 'BskyChatService',\n\t});\n};\n\nexport const getBlueskyFeedgenEndpoint = (doc: t.DidDocument): string | undefined =\u003e {\n\treturn getAtprotoServiceEndpoint(doc, {\n\t\tid: '#bsky_fg',\n\t\ttype: 'BskyFeedGenerator',\n\t});\n};\n\nexport const getBlueskyNotificationEndpoint = (doc: t.DidDocument): string | undefined =\u003e {\n\treturn getAtprotoServiceEndpoint(doc, {\n\t\tid: '#bsky_notif',\n\t\ttype: 'BskyNotificationService',\n\t});\n};\n","import type { Did } from '@atcute/lexicons/syntax';\n\n/** @deprecated use `isPlcDid` instead */\nexport const PLC_DID_RE = /^did:plc:([a-z2-7]{24})$/;\n\n/**\n * checks if input is a did:plc identifier\n */\nexport const isPlcDid = (input: string): input is Did\u003c'plc'\u003e =\u003e {\n\treturn input.length === 32 \u0026\u0026 PLC_DID_RE.test(input);\n};\n","import type { Did } from '@atcute/lexicons/syntax';\n\n/** @deprecated use `isWebDid` instead */\nexport const WEB_DID_RE =\n\t/^did:web:([a-zA-Z0-9%-]+(?:(?:\\.[a-zA-Z0-9%-]+)*(?:\\.[a-zA-Z]{2,}))?)?((?::[a-zA-Z0-9\\-%.]+)+)?$/;\n\n/** @deprecated use `isAtprotoWebDid` instead */\nexport const ATPROTO_WEB_DID_RE =\n\t/^did:web:([a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:\\.[a-zA-Z]{2,})|localhost(?:%3[aA]\\d+)?)$/;\n\n/**\n * checks if input is a did:web identifier, note that you should probably use\n * `isAtprotoWebDid` for atproto-related cases as atproto only supports a subset\n * of the did:web specification (namely, no custom paths)\n */\nexport const isWebDid = (input: string): input is Did\u003c'web'\u003e =\u003e {\n\treturn input.length \u003e= 9 \u0026\u0026 WEB_DID_RE.test(input);\n};\n\n/**\n * checks if input is a did:web identifier that is supported by atproto\n */\nexport const isAtprotoWebDid = (input: string): input is Did\u003c'web'\u003e =\u003e {\n\treturn input.length \u003e= 12 \u0026\u0026 ATPROTO_WEB_DID_RE.test(input);\n};\n\n/**\n * normalize a did:web identifier\n */\nexport const normalizeWebDid = (did: Did\u003c'web'\u003e): Did\u003c'web'\u003e =\u003e {\n\tconst [host, ...paths] = did.slice(8).split(':').map(decodeURIComponent);\n\n\tlet normalized = `did:web:${encodeURIComponent(host.toLowerCase())}`;\n\tif (paths.length \u003e 0) {\n\t\tnormalized += `:${paths.join(':')}`;\n\t}\n\n\treturn normalized as Did\u003c'web'\u003e;\n};\n\n/**\n * converts did:web identifier into the DID document's URL\n */\nexport const webDidToDocumentUrl = (did: Did\u003c'web'\u003e): URL =\u003e {\n\tconst [host, ...paths] = did.slice(8).split(':').map(decodeURIComponent);\n\n\tlet pathname = '/' + paths.join('/');\n\tif (pathname === '/') {\n\t\tpathname = `/.well-known/did.json`;\n\t} else {\n\t\tpathname += `/did.json`;\n\t}\n\n\tconst url = new URL(`https://${host}${pathname}`);\n\tif (url.hostname === 'localhost') {\n\t\turl.protocol = 'http:';\n\t}\n\n\treturn url;\n};\n","import type { AtprotoAudience, AtprotoDid, Did } from '@atcute/lexicons/syntax';\n\nimport { isPlcDid } from './methods/plc.ts';\nimport { isAtprotoWebDid } from './methods/web.ts';\n\nconst FRAGMENT_RE = /^(?:[A-Za-z0-9\\-._~!$\u0026'()*+,;=:@/?]|%[0-9A-Fa-f]{2})*$/;\n\n/**\n * checks if it's a DID identifier that is supported by atproto\n */\nexport const isAtprotoDid = (input: string): input is AtprotoDid =\u003e {\n\treturn isPlcDid(input) || isAtprotoWebDid(input);\n};\n\nexport const isAtprotoAudience = (input: string): input is AtprotoAudience =\u003e {\n\t// 'did:web:a.co#f'\n\tif (input.length \u003c 14) {\n\t\treturn false;\n\t}\n\n\tconst isep = input.indexOf('#', 12);\n\tif (isep === -1) {\n\t\treturn false;\n\t}\n\n\treturn FRAGMENT_RE.test(input.slice(isep + 1)) \u0026\u0026 isAtprotoDid(input.slice(0, isep));\n};\n\n/**\n * returns the DID's method\n */\nexport const extractDidMethod = \u003cM extends string\u003e(did: Did\u003cM\u003e): M =\u003e {\n\tconst isep = did.indexOf(':', 4);\n\tconst method = did.slice(4, isep);\n\treturn method as M;\n};\n","import type { Did } from '@atcute/lexicons';\n\nconst KEY_DID_RE = /^did:key:z[a-km-zA-HJ-NP-Z1-9]+$/;\n\n/**\n * checks if input is a did:key identifier\n */\nexport const isKeyDid = (input: string): input is Did\u003c'key'\u003e =\u003e {\n\treturn input.length \u003e= 10 \u0026\u0026 KEY_DID_RE.test(input);\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/interfaces/bytes.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/dist/interfaces/bytes */ 2 - var s=Symbol.for("@atcute/bytes-wrapper"),n=t=>typeof t=="object"&&t!==null&&s in t,r=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}(?:==)?|[A-Za-z0-9+/]{3}=?)?$/,o=t=>typeof t!="string"?!1:r.test(t),c=t=>{let e=t;return typeof e=="object"&&e!==null&&(s in e||o(e.$bytes)&&Object.keys(e).length===1)};export{n as _isBytesWrapper,c as isBytes}; 3 - //# sourceMappingURL=./bytes.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/interfaces/bytes.mjs.map
··· 1 - {"mappings":";AAOA,IAAMA,EAAe,OAAO,IAAI,uBAAuB,EAmB1CC,EAAmBC,GACxB,OAAOA,GAAU,UAAYA,IAAU,MAAQF,KAAgBE,EAGjEC,EAAY,yEACZC,EAAYF,GACb,OAAOA,GAAU,SACb,GAGDC,EAAU,KAAKD,CAAK,EAIfG,EAAWH,GAAkC,CACzD,IAAMI,EAAIJ,EAEV,OACC,OAAOI,GAAM,UACbA,IAAM,OACLN,KAAgBM,GAAMF,EAASE,EAAE,MAAM,GAAK,OAAO,KAAKA,CAAC,EAAE,SAAW,EAEzE","names":["BYTES_SYMBOL","_isBytesWrapper","input","BASE64_RE","isBase64","isBytes","v"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/interfaces/bytes.ts"],"sourcesContent":["/**\n * represents an object containing raw binary data encoded as a base64 string\n */\nexport interface Bytes {\n\t$bytes: string;\n}\n\nconst BYTES_SYMBOL = Symbol.for('@atcute/bytes-wrapper');\n\n/**\n * this should match with {@link file://./../../../../utilities/cbor/lib/bytes.ts}\n * @internal\n */\nexport interface _BytesWrapper {\n\treadonly [BYTES_SYMBOL]: true;\n\n\treadonly buf: Uint8Array;\n\treadonly $bytes: string;\n\n\ttoJSON(): Bytes;\n}\n\n/**\n * @internal\n */\n// #__NO_SIDE_EFFECTS__\nexport const _isBytesWrapper = (input: unknown): input is _BytesWrapper =\u003e {\n\treturn typeof input === 'object' \u0026\u0026 input !== null \u0026\u0026 BYTES_SYMBOL in input;\n};\n\nconst BASE64_RE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}(?:==)?|[A-Za-z0-9+/]{3}=?)?$/;\nconst isBase64 = (input: unknown): input is string =\u003e {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\treturn BASE64_RE.test(input);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isBytes = (input: unknown): input is Bytes =\u003e {\n\tconst v = input as any;\n\n\treturn (\n\t\ttypeof v === 'object' \u0026\u0026\n\t\tv !== null \u0026\u0026\n\t\t(BYTES_SYMBOL in v || (isBase64(v.$bytes) \u0026\u0026 Object.keys(v).length === 1))\n\t);\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/at-identifier.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/dist/syntax/at-identifier */ 2 - import{isDid as i}from"./did.mjs";import{isHandle as o}from"./handle.mjs";var m=r=>i(r)||o(r);export{m as isActorIdentifier}; 3 - //# sourceMappingURL=./at-identifier.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/at-identifier.mjs.map
··· 1 - {"mappings":";AAAA,OAAS,SAAAA,MAAuB,YAChC,OAAS,YAAAC,MAA6B,eAS/B,IAAMC,EAAqBC,GAC1BH,EAAMG,CAAK,GAAKF,EAASE,CAAK","names":["isDid","isHandle","isActorIdentifier","input"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/at-identifier.ts"],"sourcesContent":["import { isDid, type Did } from './did.ts';\nimport { isHandle, type Handle } from './handle.ts';\n\n/**\n * represents an account's identifier, either a {@link Did} or a\n * {@link Handle}\n */\nexport type ActorIdentifier = Did | Handle;\n\n// #__NO_SIDE_EFFECTS__\nexport const isActorIdentifier = (input: unknown): input is ActorIdentifier =\u003e {\n\treturn isDid(input) || isHandle(input);\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/at-uri.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/dist/syntax/at-uri */ 2 - import{isActorIdentifier as u}from"./at-identifier.mjs";import{isDid as A}from"./did.mjs";import{isNsid as c}from"./nsid.mjs";import{isRecordKey as d}from"./record-key.mjs";import{isAsciiAlphaNum as _}from"./utils/ascii.mjs";var k=8,m=20,x=2884,g=/^at:\/\/([a-zA-Z0-9._:%-]+)(?:\/([a-zA-Z0-9-.]+)(?:\/([a-zA-Z0-9._~:@!$&%')(*+,;=-]+))?)?(?:#(\/[a-zA-Z0-9._~:@!$&%')(*+,;=\-[\]/\\]*))?$/,$=r=>_(r)||r===46||r===95||r===126||r===58||r===64||r===33||r===36||r===38||r===37||r===39||r===41||r===40||r===42||r===43||r===44||r===59||r===61||r===45||r===91||r===93||r===47||r===92,I=r=>{if(typeof r!="string")return!1;let s=r.length;if(s<k||s>x||r.charCodeAt(0)!==97||r.charCodeAt(1)!==116||r.charCodeAt(2)!==58||r.charCodeAt(3)!==47||r.charCodeAt(4)!==47)return!1;let n=r.indexOf("#",5),e=n===-1?s:n;if(n!==-1){let f=n+1;if(f>=s||r.charCodeAt(f)!==47)return!1;for(let a=f;a<s;a++)if(!$(r.charCodeAt(a)))return!1}let o=r.indexOf("/",5),t=e,i,l;if(o!==-1&&o<e){t=o;let f=o+1;if(f>=e)return!1;let a=r.indexOf("/",f);if(a!==-1&&a<e){if(a===f||a+1>=e)return!1;let h=r.indexOf("/",a+1);if(h!==-1&&h<e)return!1;i=r.substring(f,a),l=r.substring(a+1,e)}else i=r.substring(f,e)}if(t<=5)return!1;let C=r.substring(5,t);return u(C)&&(i===void 0||c(i))&&(l===void 0||d(l))},O=r=>{let s=r.length;if(s<k||s>x)return{ok:!1,error:`invalid at-uri: ${r}`};let n=g.exec(r);if(n===null)return{ok:!1,error:`invalid at-uri: ${r}`};let[,e,o,t,i]=n;return u(e)?o!==void 0&&!c(o)?{ok:!1,error:`invalid collection in at-uri: ${o}`}:t!==void 0&&!d(t)?{ok:!1,error:`invalid rkey in at-uri: ${t}`}:{ok:!0,value:{repo:e,collection:o,rkey:t,fragment:i}}:{ok:!1,error:`invalid repo in at-uri: ${e}`}},U=r=>{if(typeof r!="string")return!1;let s=r.length;if(s<m||s>x||r.charCodeAt(0)!==97||r.charCodeAt(1)!==116||r.charCodeAt(2)!==58||r.charCodeAt(3)!==47||r.charCodeAt(4)!==47)return!1;let n=r.indexOf("/",5);if(n===-1)return!1;let e=r.indexOf("/",n+1);if(e===-1)return!1;let o=r.indexOf("#",e+1),t=r.substring(5,n),i=r.substring(n+1,e),l=o===-1?r.substring(e+1):r.substring(e+1,o);return A(t)&&c(i)&&d(l)},S=r=>{let s=r.length;if(s<m||s>x)return{ok:!1,error:`invalid canonical-at-uri: ${r}`};let n=g.exec(r);if(n===null)return{ok:!1,error:`invalid canonical-at-uri: ${r}`};let[,e,o,t,i]=n;return A(e)?c(o)?d(t)?{ok:!0,value:{repo:e,collection:o,rkey:t,fragment:i}}:{ok:!1,error:`invalid rkey in canonical-at-uri: ${t}`}:{ok:!1,error:`invalid collection in canonical-at-uri: ${o}`}:{ok:!1,error:`invalid repo in canonical-at-uri: ${e}`}};export{U as isCanonicalResourceUri,I as isResourceUri,S as parseCanonicalResourceUri,O as parseResourceUri}; 3 - //# sourceMappingURL=./at-uri.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/at-uri.mjs.map
··· 1 - {"mappings":"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","names":["isActorIdentifier","isDid","isNsid","isRecordKey","isAsciiAlphaNum","AT_URI_MIN_LENGTH","CANONICAL_AT_URI_MIN_LENGTH","AT_URI_MAX_LENGTH","ATURI_RE","isFragmentChar","c","isResourceUri","input","len","hash","stop","fragmentStart","idx","firstSlash","repoEnd","collection","rkey","collectionStart","secondSlash","thirdSlash","repo","parseResourceUri","match","r","k","f","isCanonicalResourceUri","hashPos","parseCanonicalResourceUri"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/at-uri.ts"],"sourcesContent":["import { type Result } from '../utils.ts';\n\nimport { isActorIdentifier, type ActorIdentifier } from './at-identifier.ts';\nimport { isDid, type Did } from './did.ts';\nimport { isNsid, type Nsid } from './nsid.ts';\nimport { isRecordKey, type RecordKey } from './record-key.ts';\nimport { isAsciiAlphaNum } from './utils/ascii.ts';\n\n/**\n * represents a general AT Protocol URI, representing either an entire\n * repository, a specific collection within a repository, or a record.\n *\n * it allows using handles over DIDs, but this means that it won't be stable.\n */\nexport type ResourceUri =\n\t| `at://${ActorIdentifier}`\n\t| `at://${ActorIdentifier}/${Nsid}`\n\t| `at://${ActorIdentifier}/${Nsid}/${RecordKey}`;\n\nexport type ParsedResourceUri =\n\t| { repo: ActorIdentifier; collection: undefined; rkey: undefined; fragment: string | undefined }\n\t| { repo: ActorIdentifier; collection: Nsid; rkey: undefined; fragment: string | undefined }\n\t| { repo: ActorIdentifier; collection: Nsid; rkey: RecordKey; fragment: string | undefined };\n\n// minimum valid non-canonical at-uri is `at://a.a` (8 chars)\nconst AT_URI_MIN_LENGTH = 8;\n// minimum canonical at-uri is `at://did:m:v/a.b.c/x` (20 chars)\nconst CANONICAL_AT_URI_MIN_LENGTH = 5 + 7 + 1 + 5 + 1 + 1;\n// maximum structural length:\n// `at://` + DID (2048) + `/` + NSID (317) + `/` + rkey (512)\nconst AT_URI_MAX_LENGTH = 5 + 2048 + 1 + 317 + 1 + 512;\n\n// repo: [a-zA-Z0-9._:%-]\n// collection: [a-zA-Z0-9.-]\n// rkey: [a-zA-Z0-9._~:@!$\u0026%')(*+,;=-]\n// fragment: /[a-zA-Z0-9._~:@!$\u0026%')(*+,;=\\-[\\]/\\\\]*\nconst ATURI_RE =\n\t/^at:\\/\\/([a-zA-Z0-9._:%-]+)(?:\\/([a-zA-Z0-9-.]+)(?:\\/([a-zA-Z0-9._~:@!$\u0026%')(*+,;=-]+))?)?(?:#(\\/[a-zA-Z0-9._~:@!$\u0026%')(*+,;=\\-[\\]/\\\\]*))?$/;\n\nconst isFragmentChar = (c: number): boolean =\u003e {\n\treturn (\n\t\tisAsciiAlphaNum(c) ||\n\t\tc === 0x2e || // .\n\t\tc === 0x5f || // _\n\t\tc === 0x7e || // ~\n\t\tc === 0x3a || // :\n\t\tc === 0x40 || // @\n\t\tc === 0x21 || // !\n\t\tc === 0x24 || // $\n\t\tc === 0x26 || // \u0026\n\t\tc === 0x25 || // %\n\t\tc === 0x27 || // '\n\t\tc === 0x29 || // )\n\t\tc === 0x28 || // (\n\t\tc === 0x2a || // *\n\t\tc === 0x2b || // +\n\t\tc === 0x2c || // ,\n\t\tc === 0x3b || // ;\n\t\tc === 0x3d || // =\n\t\tc === 0x2d || // -\n\t\tc === 0x5b || // [\n\t\tc === 0x5d || // ]\n\t\tc === 0x2f || // /\n\t\tc === 0x5c // \\\n\t);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isResourceUri = (input: unknown): input is ResourceUri =\u003e {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst len = input.length;\n\tif (len \u003c AT_URI_MIN_LENGTH || len \u003e AT_URI_MAX_LENGTH) {\n\t\treturn false;\n\t}\n\n\tif (\n\t\tinput.charCodeAt(0) !== 0x61 ||\n\t\tinput.charCodeAt(1) !== 0x74 ||\n\t\tinput.charCodeAt(2) !== 0x3a ||\n\t\tinput.charCodeAt(3) !== 0x2f ||\n\t\tinput.charCodeAt(4) !== 0x2f\n\t) {\n\t\treturn false;\n\t}\n\n\tconst hash = input.indexOf('#', 5);\n\tconst stop = hash === -1 ? len : hash;\n\n\tif (hash !== -1) {\n\t\tconst fragmentStart = hash + 1;\n\t\tif (fragmentStart \u003e= len || input.charCodeAt(fragmentStart) !== 0x2f) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (let idx = fragmentStart; idx \u003c len; idx++) {\n\t\t\tif (!isFragmentChar(input.charCodeAt(idx))) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst firstSlash = input.indexOf('/', 5);\n\tlet repoEnd = stop;\n\tlet collection: string | undefined;\n\tlet rkey: string | undefined;\n\n\tif (firstSlash !== -1 \u0026\u0026 firstSlash \u003c stop) {\n\t\trepoEnd = firstSlash;\n\n\t\tconst collectionStart = firstSlash + 1;\n\t\tif (collectionStart \u003e= stop) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst secondSlash = input.indexOf('/', collectionStart);\n\t\tif (secondSlash !== -1 \u0026\u0026 secondSlash \u003c stop) {\n\t\t\tif (secondSlash === collectionStart || secondSlash + 1 \u003e= stop) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst thirdSlash = input.indexOf('/', secondSlash + 1);\n\t\t\tif (thirdSlash !== -1 \u0026\u0026 thirdSlash \u003c stop) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tcollection = input.substring(collectionStart, secondSlash);\n\t\t\trkey = input.substring(secondSlash + 1, stop);\n\t\t} else {\n\t\t\tcollection = input.substring(collectionStart, stop);\n\t\t}\n\t}\n\n\tif (repoEnd \u003c= 5) {\n\t\treturn false;\n\t}\n\n\tconst repo = input.substring(5, repoEnd);\n\n\treturn (\n\t\tisActorIdentifier(repo) \u0026\u0026\n\t\t(collection === undefined || isNsid(collection)) \u0026\u0026\n\t\t(rkey === undefined || isRecordKey(rkey))\n\t);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const parseResourceUri = (input: string): Result\u003cParsedResourceUri, string\u003e =\u003e {\n\tconst len = input.length;\n\tif (len \u003c AT_URI_MIN_LENGTH || len \u003e AT_URI_MAX_LENGTH) {\n\t\treturn { ok: false, error: `invalid at-uri: ${input}` };\n\t}\n\n\tconst match = ATURI_RE.exec(input);\n\tif (match === null) {\n\t\treturn { ok: false, error: `invalid at-uri: ${input}` };\n\t}\n\n\tconst [, r, c, k, f] = match;\n\n\tif (!isActorIdentifier(r)) {\n\t\treturn { ok: false, error: `invalid repo in at-uri: ${r}` };\n\t}\n\n\tif (c !== undefined \u0026\u0026 !isNsid(c)) {\n\t\treturn { ok: false, error: `invalid collection in at-uri: ${c}` };\n\t}\n\n\tif (k !== undefined \u0026\u0026 !isRecordKey(k)) {\n\t\treturn { ok: false, error: `invalid rkey in at-uri: ${k}` };\n\t}\n\n\treturn { ok: true, value: { repo: r, collection: c, rkey: k, fragment: f } };\n};\n\n/**\n * represents a canonical AT Protocol URI for a specific record.\n *\n * this URI format uses the account's DID as the authority, ensuring that\n * the URI remains valid even as the account changes handles, uniquely\n * identifying a specific piece of record within AT Protocol.\n */\nexport type CanonicalResourceUri = `at://${Did}/${Nsid}/${RecordKey}`;\n\nexport type ParsedCanonicalResourceUri = {\n\trepo: Did;\n\tcollection: Nsid;\n\trkey: RecordKey;\n\tfragment: string | undefined;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isCanonicalResourceUri = (input: unknown): input is CanonicalResourceUri =\u003e {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst len = input.length;\n\tif (len \u003c CANONICAL_AT_URI_MIN_LENGTH || len \u003e AT_URI_MAX_LENGTH) {\n\t\treturn false;\n\t}\n\n\t// must start with \"at://\"\n\tif (\n\t\tinput.charCodeAt(0) !== 0x61 ||\n\t\tinput.charCodeAt(1) !== 0x74 ||\n\t\tinput.charCodeAt(2) !== 0x3a ||\n\t\tinput.charCodeAt(3) !== 0x2f ||\n\t\tinput.charCodeAt(4) !== 0x2f\n\t) {\n\t\treturn false;\n\t}\n\n\tconst firstSlash = input.indexOf('/', 5);\n\tif (firstSlash === -1) {\n\t\treturn false;\n\t}\n\n\tconst secondSlash = input.indexOf('/', firstSlash + 1);\n\tif (secondSlash === -1) {\n\t\treturn false;\n\t}\n\n\t// check for fragment\n\tconst hashPos = input.indexOf('#', secondSlash + 1);\n\n\tconst repo = input.substring(5, firstSlash);\n\tconst collection = input.substring(firstSlash + 1, secondSlash);\n\tconst rkey = hashPos === -1 ? input.substring(secondSlash + 1) : input.substring(secondSlash + 1, hashPos);\n\n\treturn isDid(repo) \u0026\u0026 isNsid(collection) \u0026\u0026 isRecordKey(rkey);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const parseCanonicalResourceUri = (input: string): Result\u003cParsedCanonicalResourceUri, string\u003e =\u003e {\n\tconst len = input.length;\n\tif (len \u003c CANONICAL_AT_URI_MIN_LENGTH || len \u003e AT_URI_MAX_LENGTH) {\n\t\treturn { ok: false, error: `invalid canonical-at-uri: ${input}` };\n\t}\n\n\tconst match = ATURI_RE.exec(input);\n\tif (match === null) {\n\t\treturn { ok: false, error: `invalid canonical-at-uri: ${input}` };\n\t}\n\n\tconst [, r, c, k, f] = match;\n\n\tif (!isDid(r)) {\n\t\treturn { ok: false, error: `invalid repo in canonical-at-uri: ${r}` };\n\t}\n\n\tif (!isNsid(c)) {\n\t\treturn { ok: false, error: `invalid collection in canonical-at-uri: ${c}` };\n\t}\n\n\tif (!isRecordKey(k)) {\n\t\treturn { ok: false, error: `invalid rkey in canonical-at-uri: ${k}` };\n\t}\n\n\treturn { ok: true, value: { repo: r, collection: c, rkey: k, fragment: f } };\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/cid.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/dist/syntax/cid */ 2 - var e=/^baf[ky]rei[a-z2-7]{52}$/,r=t=>typeof t=="string"&&t.length===59&&e.test(t);export{r as isCid}; 3 - //# sourceMappingURL=./cid.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/cid.mjs.map
··· 1 - {"mappings":";AAKA,IAAMA,EAAc,2BAGPC,EAASC,GACd,OAAOA,GAAU,UAAYA,EAAM,SAAW,IAAMF,EAAY,KAAKE,CAAK","names":["DASL_CID_RE","isCid","input"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/cid.ts"],"sourcesContent":["/**\n * represents a content identifier (CID)\n */\nexport type Cid = string;\n\nconst DASL_CID_RE = /^baf[ky]rei[a-z2-7]{52}$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isCid = (input: unknown): input is Cid =\u003e {\n\treturn typeof input === 'string' \u0026\u0026 input.length === 59 \u0026\u0026 DASL_CID_RE.test(input);\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/did.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/dist/syntax/did */ 2 - var e=/^did:([a-z]+):([a-zA-Z0-9._:%-]*[a-zA-Z0-9._-])$/,s=t=>typeof t=="string"&&t.length>=7&&t.length<=2048&&e.test(t);export{s as isDid}; 3 - //# sourceMappingURL=./did.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/did.mjs.map
··· 1 - {"mappings":";AAYA,IAAMA,EAAS,mDAGFC,EAASC,GACd,OAAOA,GAAU,UAAYA,EAAM,QAAU,GAAKA,EAAM,QAAU,MAAQF,EAAO,KAAKE,CAAK","names":["DID_RE","isDid","input"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/did.ts"],"sourcesContent":["/**\n * represents a decentralized identifier (DID).\n */\nexport type Did\u003cMethod extends string = string\u003e = `did:${Method}:${string}`;\n\n/**\n * represents a decentralized identifier with methods supported in atproto\n */\nexport type AtprotoDid = Did\u003c'plc' | 'web'\u003e;\n\nexport type AtprotoAudience = `${AtprotoDid}#${string}`;\n\nconst DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%-]*[a-zA-Z0-9._-])$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isDid = (input: unknown): input is Did =\u003e {\n\treturn typeof input === 'string' \u0026\u0026 input.length \u003e= 7 \u0026\u0026 input.length \u003c= 2048 \u0026\u0026 DID_RE.test(input);\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/handle.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/dist/syntax/handle */ 2 - import{isAsciiAlpha as i,isAsciiAlphaNum as s}from"./utils/ascii.mjs";var c=(r,t,l)=>{let f=l-t;if(f===0||f>63)return!1;let a=r.charCodeAt(t);if(!s(a))return!1;if(f>1){if(!s(r.charCodeAt(l-1)))return!1;for(let e=t+1;e<l-1;e++){let o=r.charCodeAt(e);if(!s(o)&&o!==45)return!1}}return!0},A=r=>{if(typeof r!="string")return!1;let t=r.length;if(t<3||t>253)return!1;let l=0,f=0,a=0;for(let e=0;e<=t;e++)if(e===t||r.charCodeAt(e)===46){if(!c(r,l,e))return!1;a=l,l=e+1,f++}return f<2?!1:i(r.charCodeAt(a))};export{A as isHandle}; 3 - //# sourceMappingURL=./handle.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/handle.mjs.map
··· 1 - {"mappings":";AAAA,OAAS,gBAAAA,EAAc,mBAAAC,MAAuB,oBAS9C,IAAMC,EAAe,CAACC,EAAeC,EAAeC,IAAwB,CAC3E,IAAMC,EAAMD,EAAMD,EAClB,GAAIE,IAAQ,GAAKA,EAAM,GACtB,MAAO,GAGR,IAAMC,EAAQJ,EAAM,WAAWC,CAAK,EACpC,GAAI,CAACH,EAAgBM,CAAK,EACzB,MAAO,GAGR,GAAID,EAAM,EAAG,CACZ,GAAI,CAACL,EAAgBE,EAAM,WAAWE,EAAM,CAAC,CAAC,EAAG,MAAO,GACxD,QAASG,EAAIJ,EAAQ,EAAGI,EAAIH,EAAM,EAAGG,IAAK,CACzC,IAAMC,EAAIN,EAAM,WAAWK,CAAC,EAC5B,GAAI,CAACP,EAAgBQ,CAAC,GAAKA,IAAM,GAChC,MAAO,EAET,CACD,CAEA,MAAO,EACR,EAGaC,EAAYP,GAAmC,CAC3D,GAAI,OAAOA,GAAU,SACpB,MAAO,GAGR,IAAMG,EAAMH,EAAM,OAClB,GAAIG,EAAM,GAAKA,EAAM,IACpB,MAAO,GAGR,IAAIK,EAAa,EACbC,EAAa,EACbC,EAAiB,EAErB,QAASC,EAAI,EAAGA,GAAKR,EAAKQ,IACzB,GAAIA,IAAMR,GAAOH,EAAM,WAAWW,CAAC,IAAM,GAAM,CAC9C,GAAI,CAACZ,EAAaC,EAAOQ,EAAYG,CAAC,EACrC,MAAO,GAERD,EAAiBF,EACjBA,EAAaG,EAAI,EACjBF,GACD,CAID,OAAIA,EAAa,EACT,GAIDZ,EAAaG,EAAM,WAAWU,CAAc,CAAC,CACrD","names":["isAsciiAlpha","isAsciiAlphaNum","isValidLabel","input","start","end","len","first","j","c","isHandle","labelStart","labelCount","lastLabelStart","i"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/handle.ts"],"sourcesContent":["import { isAsciiAlpha, isAsciiAlphaNum } from './utils/ascii.ts';\n\n/**\n * represents an account's handle, using domains as a human-friendly\n * identifier.\n */\nexport type Handle = `${string}.${string}`;\n\n// validates a domain label: starts/ends with alphanumeric, middle allows hyphens, max 63 chars\nconst isValidLabel = (input: string, start: number, end: number): boolean =\u003e {\n\tconst len = end - start;\n\tif (len === 0 || len \u003e 63) {\n\t\treturn false;\n\t}\n\n\tconst first = input.charCodeAt(start);\n\tif (!isAsciiAlphaNum(first)) {\n\t\treturn false;\n\t}\n\n\tif (len \u003e 1) {\n\t\tif (!isAsciiAlphaNum(input.charCodeAt(end - 1))) return false;\n\t\tfor (let j = start + 1; j \u003c end - 1; j++) {\n\t\t\tconst c = input.charCodeAt(j);\n\t\t\tif (!isAsciiAlphaNum(c) \u0026\u0026 c !== 0x2d) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isHandle = (input: unknown): input is Handle =\u003e {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst len = input.length;\n\tif (len \u003c 3 || len \u003e 253) {\n\t\treturn false;\n\t}\n\n\tlet labelStart = 0;\n\tlet labelCount = 0;\n\tlet lastLabelStart = 0;\n\n\tfor (let i = 0; i \u003c= len; i++) {\n\t\tif (i === len || input.charCodeAt(i) === 0x2e) {\n\t\t\tif (!isValidLabel(input, labelStart, i)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlastLabelStart = labelStart;\n\t\t\tlabelStart = i + 1;\n\t\t\tlabelCount++;\n\t\t}\n\t}\n\n\t// need at least 2 labels (one dot)\n\tif (labelCount \u003c 2) {\n\t\treturn false;\n\t}\n\n\t// TLD must start with a letter\n\treturn isAsciiAlpha(input.charCodeAt(lastLabelStart));\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/nsid.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/dist/syntax/nsid */ 2 - import{isAsciiAlpha as h,isAsciiAlphaNum as a}from"./utils/ascii.mjs";var C=r=>{if(typeof r!="string")return!1;let t=r.length;if(t<5||t>317)return!1;let f=-1;for(let e=t-1;e>=0;e--)if(r.charCodeAt(e)===46){f=e;break}if(f===-1)return!1;let s=0,l=0;for(let e=0;e<=f;e++)if(e===f||r.charCodeAt(e)===46){let i=e-s;if(i===0||i>63)return!1;let A=r.charCodeAt(s);if(l===0){if(!h(A))return!1}else if(!a(A))return!1;if(i>1){if(!a(r.charCodeAt(e-1)))return!1;for(let n=s+1;n<e-1;n++){let d=r.charCodeAt(n);if(!a(d)&&d!==45)return!1}}s=e+1,l++}if(l<2)return!1;let o=f+1,c=t-o;if(c===0||c>63||!h(r.charCodeAt(o)))return!1;for(let e=o+1;e<t;e++)if(!a(r.charCodeAt(e)))return!1;return!0};export{C as isNsid}; 3 - //# sourceMappingURL=./nsid.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/nsid.mjs.map
··· 1 - {"mappings":";AAAA,OAAS,gBAAAA,EAAc,mBAAAC,MAAuB,oBAQvC,IAAMC,EAAUC,GAAiC,CACvD,GAAI,OAAOA,GAAU,SACpB,MAAO,GAGR,IAAMC,EAAMD,EAAM,OAClB,GAAIC,EAAM,GAAKA,EAAM,IACpB,MAAO,GAIR,IAAIC,EAAU,GACd,QAASC,EAAIF,EAAM,EAAGE,GAAK,EAAGA,IAC7B,GAAIH,EAAM,WAAWG,CAAC,IAAM,GAAM,CACjCD,EAAUC,EACV,KACD,CAED,GAAID,IAAY,GACf,MAAO,GAIR,IAAIE,EAAW,EACXC,EAAS,EACb,QAASC,EAAI,EAAGA,GAAKJ,EAASI,IAC7B,GAAIA,IAAMJ,GAAWF,EAAM,WAAWM,CAAC,IAAM,GAAM,CAClD,IAAMC,EAASD,EAAIF,EACnB,GAAIG,IAAW,GAAKA,EAAS,GAC5B,MAAO,GAGR,IAAMC,EAAQR,EAAM,WAAWI,CAAQ,EACvC,GAAIC,IAAW,GAEd,GAAI,CAACR,EAAaW,CAAK,EACtB,MAAO,WAIJ,CAACV,EAAgBU,CAAK,EACzB,MAAO,GAIT,GAAID,EAAS,EAAG,CACf,GAAI,CAACT,EAAgBE,EAAM,WAAWM,EAAI,CAAC,CAAC,EAC3C,MAAO,GAER,QAASH,EAAIC,EAAW,EAAGD,EAAIG,EAAI,EAAGH,IAAK,CAC1C,IAAMM,EAAIT,EAAM,WAAWG,CAAC,EAC5B,GAAI,CAACL,EAAgBW,CAAC,GAAKA,IAAM,GAChC,MAAO,EAET,CACD,CAEAL,EAAWE,EAAI,EACfD,GACD,CAID,GAAIA,EAAS,EACZ,MAAO,GAIR,IAAMK,EAAYR,EAAU,EACtBS,EAAUV,EAAMS,EAKtB,GAJIC,IAAY,GAAKA,EAAU,IAI3B,CAACd,EAAaG,EAAM,WAAWU,CAAS,CAAC,EAC5C,MAAO,GAER,QAASP,EAAIO,EAAY,EAAGP,EAAIF,EAAKE,IACpC,GAAI,CAACL,EAAgBE,EAAM,WAAWG,CAAC,CAAC,EACvC,MAAO,GAIT,MAAO,EACR","names":["isAsciiAlpha","isAsciiAlphaNum","isNsid","input","len","lastDot","j","segStart","segIdx","i","segLen","first","c","nameStart","nameLen"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/nsid.ts"],"sourcesContent":["import { isAsciiAlpha, isAsciiAlphaNum } from './utils/ascii.ts';\n\n/**\n * represents a namespace identifier (NSID)\n */\nexport type Nsid = `${string}.${string}.${string}`;\n\n// #__NO_SIDE_EFFECTS__\nexport const isNsid = (input: unknown): input is Nsid =\u003e {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst len = input.length;\n\tif (len \u003c 5 || len \u003e 317) {\n\t\treturn false;\n\t}\n\n\t// find the last dot to separate domain labels from the name segment\n\tlet lastDot = -1;\n\tfor (let j = len - 1; j \u003e= 0; j--) {\n\t\tif (input.charCodeAt(j) === 0x2e) {\n\t\t\tlastDot = j;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (lastDot === -1) {\n\t\treturn false;\n\t}\n\n\t// validate domain segments (before lastDot)\n\tlet segStart = 0;\n\tlet segIdx = 0;\n\tfor (let i = 0; i \u003c= lastDot; i++) {\n\t\tif (i === lastDot || input.charCodeAt(i) === 0x2e) {\n\t\t\tconst segLen = i - segStart;\n\t\t\tif (segLen === 0 || segLen \u003e 63) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst first = input.charCodeAt(segStart);\n\t\t\tif (segIdx === 0) {\n\t\t\t\t// first domain label must start with a letter\n\t\t\t\tif (!isAsciiAlpha(first)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// subsequent domain labels start with alphanumeric\n\t\t\t\tif (!isAsciiAlphaNum(first)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (segLen \u003e 1) {\n\t\t\t\tif (!isAsciiAlphaNum(input.charCodeAt(i - 1))) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfor (let j = segStart + 1; j \u003c i - 1; j++) {\n\t\t\t\t\tconst c = input.charCodeAt(j);\n\t\t\t\t\tif (!isAsciiAlphaNum(c) \u0026\u0026 c !== 0x2d) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsegStart = i + 1;\n\t\t\tsegIdx++;\n\t\t}\n\t}\n\n\t// need at least 2 domain segments\n\tif (segIdx \u003c 2) {\n\t\treturn false;\n\t}\n\n\t// name segment (after lastDot): starts with letter, rest alphanumeric, max 63\n\tconst nameStart = lastDot + 1;\n\tconst nameLen = len - nameStart;\n\tif (nameLen === 0 || nameLen \u003e 63) {\n\t\treturn false;\n\t}\n\n\tif (!isAsciiAlpha(input.charCodeAt(nameStart))) {\n\t\treturn false;\n\t}\n\tfor (let j = nameStart + 1; j \u003c len; j++) {\n\t\tif (!isAsciiAlphaNum(input.charCodeAt(j))) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/record-key.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/dist/syntax/record-key */ 2 - import{isAsciiAlphaNum as o}from"./utils/ascii.mjs";var a=r=>{if(typeof r!="string")return!1;let t=r.length;if(t<1||t>512||t<=2&&r.charCodeAt(0)===46&&(t===1||r.charCodeAt(1)===46))return!1;for(let f=0;f<t;f++){let e=r.charCodeAt(f);if(!o(e)&&e!==95&&e!==126&&e!==46&&e!==58&&e!==45)return!1}return!0};export{a as isRecordKey}; 3 - //# sourceMappingURL=./record-key.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/record-key.mjs.map
··· 1 - {"mappings":";AAAA,OAAS,mBAAAA,MAAuB,oBAQzB,IAAMC,EAAeC,GAAsC,CACjE,GAAI,OAAOA,GAAU,SACpB,MAAO,GAGR,IAAMC,EAAMD,EAAM,OAMlB,GALIC,EAAM,GAAKA,EAAM,KAKjBA,GAAO,GAAKD,EAAM,WAAW,CAAC,IAAM,KAASC,IAAQ,GAAKD,EAAM,WAAW,CAAC,IAAM,IACrF,MAAO,GAGR,QAASE,EAAI,EAAGA,EAAID,EAAKC,IAAK,CAC7B,IAAMC,EAAIH,EAAM,WAAWE,CAAC,EAE5B,GACC,CAACJ,EAAgBK,CAAC,GAClBA,IAAM,IACNA,IAAM,KACNA,IAAM,IACNA,IAAM,IACNA,IAAM,GAEN,MAAO,EAET,CAEA,MAAO,EACR","names":["isAsciiAlphaNum","isRecordKey","input","len","i","c"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/record-key.ts"],"sourcesContent":["import { isAsciiAlphaNum } from './utils/ascii.ts';\n\n/**\n * represents a record key\n */\nexport type RecordKey = string;\n\n// #__NO_SIDE_EFFECTS__\nexport const isRecordKey = (input: unknown): input is RecordKey =\u003e {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst len = input.length;\n\tif (len \u003c 1 || len \u003e 512) {\n\t\treturn false;\n\t}\n\n\t// reject \".\" and \"..\"\n\tif (len \u003c= 2 \u0026\u0026 input.charCodeAt(0) === 0x2e \u0026\u0026 (len === 1 || input.charCodeAt(1) === 0x2e)) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i \u003c len; i++) {\n\t\tconst c = input.charCodeAt(i);\n\t\t// [a-zA-Z0-9_~.:-]\n\t\tif (\n\t\t\t!isAsciiAlphaNum(c) \u0026\u0026\n\t\t\tc !== 0x5f \u0026\u0026 // _\n\t\t\tc !== 0x7e \u0026\u0026 // ~\n\t\t\tc !== 0x2e \u0026\u0026 // .\n\t\t\tc !== 0x3a \u0026\u0026 // :\n\t\t\tc !== 0x2d // -\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/utils/ascii.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/dist/syntax/utils/ascii */ 2 - var i=x=>x>=65&&x<=90||x>=97&&x<=122,r=x=>i(x)||x>=48&&x<=57;export{i as isAsciiAlpha,r as isAsciiAlphaNum}; 3 - //# sourceMappingURL=./ascii.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/syntax/utils/ascii.mjs.map
··· 1 - {"mappings":";AACO,IAAMA,EAAgBC,GACpBA,GAAK,IAAQA,GAAK,IAAUA,GAAK,IAAQA,GAAK,IAI1CC,EAAmBD,GACxBD,EAAaC,CAAC,GAAMA,GAAK,IAAQA,GAAK","names":["isAsciiAlpha","c","isAsciiAlphaNum"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/utils/ascii.ts"],"sourcesContent":["// #__NO_SIDE_EFFECTS__\nexport const isAsciiAlpha = (c: number): boolean =\u003e {\n\treturn (c \u003e= 0x41 \u0026\u0026 c \u003c= 0x5a) || (c \u003e= 0x61 \u0026\u0026 c \u003c= 0x7a);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isAsciiAlphaNum = (c: number): boolean =\u003e {\n\treturn isAsciiAlpha(c) || (c \u003e= 0x30 \u0026\u0026 c \u003c= 0x39);\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/utils.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/dist/utils */ 2 - var e=!1;var t=(r,o)=>{if(!r)throw e?new Error("Assertion failed"+(o?`: ${o}`:"")):new Error("Assertion failed")},f=(r,o)=>{t(!1,o)};export{t as assert,f as assertNever}; 3 - //# sourceMappingURL=./utils.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/dist/utils.mjs.map
··· 1 - {"mappings":";AAAA,IAA2CA,EAAE,GCItC,IAAMC,EAAoE,CAACC,EAAWC,IAAW,CACvG,GAAI,CAACD,EACJ,MAAIE,EACG,IAAI,MAAM,oBAAsBD,EAAU,KAAKA,CAAO,GAAK,GAAG,EAG/D,IAAI,MAAM,kBAAkB,CAEpC,EAEaE,EAAc,CAACC,EAAUH,IAA2B,CAChEF,EAAO,GAAOE,CAAO,CACtB","names":["o","assert","condition","message","o","assertNever","_"],"sources":["npm-replacement:esm-env","../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/utils.ts"],"sourcesContent":["const e=typeof window\u003c\"u\"\u0026\u0026typeof Deno\u003e\"u\",o=!1,n=!1;export{e as BROWSER,o as DEV,n as NODE};\n","import { DEV } from 'esm-env';\n\nexport type Result\u003cT, E\u003e = { ok: true; value: T } | { ok: false; error: E };\n\nexport const assert: { (condition: any, message?: string): asserts condition } = (condition, message) =\u003e {\n\tif (!condition) {\n\t\tif (DEV) {\n\t\t\tthrow new Error(`Assertion failed` + (message ? `: ${message}` : ``));\n\t\t}\n\n\t\tthrow new Error(`Assertion failed`);\n\t}\n};\n\nexport const assertNever = (_: never, message?: string): never =\u003e {\n\tassert(false, message);\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/interfaces.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/interfaces */ 2 - import{isCid as r}from"./dist/syntax/cid.mjs";var i=Symbol.for("@atcute/cid-link-wrapper");var o=t=>{let e=t;return typeof e=="object"&&e!==null&&(i in e||r(e.$link))};var n=t=>{let e=t;return typeof e=="object"&&e!==null&&e.$type==="blob"&&typeof e.mimeType=="string"&&Number.isSafeInteger(e.size)&&o(e.ref)&&Object.keys(e).length===4},s=t=>{let e=t;return typeof e=="object"&&e!==null&&typeof e.cid=="string"&&typeof e.mimeType=="string"&&Object.keys(e).length===2};import{isBytes as g}from"./dist/interfaces/bytes.mjs";export{n as isBlob,g as isBytes,o as isCidLink,s as isLegacyBlob}; 3 - //# sourceMappingURL=./interfaces.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/interfaces.mjs.map
··· 1 - {"mappings":";AAAA,OAAS,SAAAA,MAAuB,wBAShC,IAAMC,EAAkB,OAAO,IAAI,0BAA0B,EAsBtD,IAAMC,EAAaC,GAAoC,CAC7D,IAAMC,EAAID,EAEV,OAAO,OAAOC,GAAM,UAAYA,IAAM,OAASC,KAAmBD,GAAKE,EAAMF,EAAE,KAAK,EACrF,ECrBO,IAAMG,EAAUC,GAAiC,CACvD,IAAMC,EAAID,EAEV,OACC,OAAOC,GAAM,UACbA,IAAM,MACNA,EAAE,QAAU,QACZ,OAAOA,EAAE,UAAa,UACtB,OAAO,cAAcA,EAAE,IAAI,GAC3BC,EAAUD,EAAE,GAAG,GACf,OAAO,KAAKA,CAAC,EAAE,SAAW,CAE5B,EAUaE,EAAgBH,GAAuC,CACnE,IAAMC,EAAID,EAEV,OACC,OAAOC,GAAM,UACbA,IAAM,MACN,OAAOA,EAAE,KAAQ,UACjB,OAAOA,EAAE,UAAa,UACtB,OAAO,KAAKA,CAAC,EAAE,SAAW,CAE5B,EC7CA,OAAS,WAAAG,MAA2B","names":["isCid","CID_LINK_SYMBOL","isCidLink","input","v","CID_LINK_SYMBOL","isCid","isBlob","input","v","isCidLink","isLegacyBlob","isBytes"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/interfaces/cid-link.ts","../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/interfaces/blob.ts","../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/interfaces/index.ts"],"sourcesContent":["import { isCid, type Cid } from '../syntax/cid.ts';\n\n/**\n * represents a content identifier (CID) reference\n */\nexport interface CidLink {\n\t$link: Cid;\n}\n\nconst CID_LINK_SYMBOL = Symbol.for('@atcute/cid-link-wrapper');\n\n/**\n * this should match with {@link file://./../../../../utilities/cid/lib/cid-link.ts}\n * @internal\n */\nexport interface _CidLinkWrapper {\n\treadonly [CID_LINK_SYMBOL]: true;\n\n\treadonly bytes: Uint8Array;\n\treadonly $link: string;\n\n\ttoJSON(): CidLink;\n}\n\n/**\n * @internal\n */\nexport const _isCidLinkWrapper = (input: unknown): input is _CidLinkWrapper =\u003e {\n\treturn typeof input === 'object' \u0026\u0026 input !== null \u0026\u0026 CID_LINK_SYMBOL in input;\n};\n\nexport const isCidLink = (input: unknown): input is CidLink =\u003e {\n\tconst v = input as any;\n\n\treturn typeof v === 'object' \u0026\u0026 v !== null \u0026\u0026 (CID_LINK_SYMBOL in v || isCid(v.$link));\n};\n","import type { Cid } from '../syntax/cid.ts';\n\nimport { isCidLink, type CidLink } from './cid-link.ts';\n\n/**\n * represents a reference to a data blob\n */\nexport interface Blob\u003cTMime extends string = string\u003e {\n\t$type: 'blob';\n\tmimeType: TMime;\n\tref: CidLink;\n\tsize: number;\n}\n\nexport const isBlob = (input: unknown): input is Blob =\u003e {\n\tconst v = input as any;\n\n\treturn (\n\t\ttypeof v === 'object' \u0026\u0026\n\t\tv !== null \u0026\u0026\n\t\tv.$type === 'blob' \u0026\u0026\n\t\ttypeof v.mimeType === 'string' \u0026\u0026\n\t\tNumber.isSafeInteger(v.size) \u0026\u0026\n\t\tisCidLink(v.ref) \u0026\u0026\n\t\tObject.keys(v).length === 4\n\t);\n};\n\n/**\n * deprecated interface representing an interface to a data blob\n */\nexport interface LegacyBlob\u003cTMime extends string = string\u003e {\n\tcid: Cid;\n\tmimeType: TMime;\n}\n\nexport const isLegacyBlob = (input: unknown): input is LegacyBlob =\u003e {\n\tconst v = input as any;\n\n\treturn (\n\t\ttypeof v === 'object' \u0026\u0026\n\t\tv !== null \u0026\u0026\n\t\ttypeof v.cid === 'string' \u0026\u0026\n\t\ttypeof v.mimeType === 'string' \u0026\u0026\n\t\tObject.keys(v).length === 2\n\t);\n};\n","export { isBlob, isLegacyBlob, type Blob, type LegacyBlob } from './blob.ts';\nexport { isBytes, type Bytes } from './bytes.ts';\nexport { isCidLink, type CidLink } from './cid-link.ts';\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/syntax.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/syntax */ 2 - export*from"./dist/syntax/at-identifier.mjs";export*from"./dist/syntax/at-uri.mjs";export*from"./dist/syntax/cid.mjs";var t=/^((?!0{3})\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01]))T((?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d))(\.\d+)?(Z|(?!-00:00)[+-](?:[01]\d|2[0-3]):(?:[0-5]\d))$/,i=e=>typeof e=="string"&&e.length>=20&&e.length<=64&&t.test(e);export*from"./dist/syntax/did.mjs";export*from"./dist/syntax/handle.mjs";var o=/^((?<grandfathered>(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))|((?<language>([A-Za-z]{2,3}(-(?<extlang>[A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(-(?<script>[A-Za-z]{4}))?(-(?<region>[A-Za-z]{2}|[0-9]{3}))?(-(?<variant>[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(-(?<extension>[0-9A-WY-Za-wy-z](-[A-Za-z0-9]{2,8})+))*(-(?<privateUseA>x(-[A-Za-z0-9]{1,8})+))?)|(?<privateUseB>x(-[A-Za-z0-9]{1,8})+))$/,g=e=>typeof e=="string"&&e.length>=2&&o.test(e);export*from"./dist/syntax/nsid.mjs";export*from"./dist/syntax/record-key.mjs";var r=/^[234567abcdefghij][234567abcdefghijklmnopqrstuvwxyz]{12}$/,x=e=>typeof e=="string"&&e.length===13&&r.test(e);import{isUtf8LengthInRange as n}from"../../uint8array@1.1.1/es2022/uint8array.mjs";var a=/^\w+:(?:\/\/)?[^\s/][^\s]*$/,h=e=>typeof e!="string"||!n(e,3,8192)?!1:a.test(e);export{i as isDatetime,h as isGenericUri,g as isLanguageCode,x as isTid}; 3 - //# sourceMappingURL=./syntax.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/syntax.mjs.map
··· 1 - {"mappings":";AAAA,WAAc,kCACd,WAAc,2BACd,WAAc,wBCAd,IAAMA,EACL,iKAGYC,EAAcC,GACnB,OAAOA,GAAU,UAAYA,EAAM,QAAU,IAAMA,EAAM,QAAU,IAAMF,EAAa,KAAKE,CAAK,EDHxG,WAAc,wBACd,WAAc,2BEHd,IAAMC,EACL,olBAGYC,EAAkBC,GACvB,OAAOA,GAAU,UAAYA,EAAM,QAAU,GAAKF,EAAiB,KAAKE,CAAK,EFArF,WAAc,yBACd,WAAc,+BGHd,IAAMC,EAAS,6DAGFC,EAASC,GACd,OAAOA,GAAU,UAAYA,EAAM,SAAW,IAAMF,EAAO,KAAKE,CAAK,ECT7E,OAAS,uBAAAC,MAA2B,2CAOpC,IAAMC,EAAS,8BAGFC,EAAgBC,GACxB,OAAOA,GAAU,UAIjB,CAACH,EAAoBG,EAAO,EAAG,IAAI,EAC/B,GAGDF,EAAO,KAAKE,CAAK","names":["DATE_TIME_RE","isDatetime","input","LANGUAGE_CODE_RE","isLanguageCode","input","TID_RE","isTid","input","isUtf8LengthInRange","URI_RE","isGenericUri","input"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/index.ts","../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/datetime.ts","../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/language.ts","../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/tid.ts","../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/syntax/uri.ts"],"sourcesContent":["export * from './at-identifier.ts';\nexport * from './at-uri.ts';\nexport * from './cid.ts';\nexport * from './datetime.ts';\nexport * from './did.ts';\nexport * from './handle.ts';\nexport * from './language.ts';\nexport * from './nsid.ts';\nexport * from './record-key.ts';\nexport * from './tid.ts';\nexport * from './uri.ts';\n","export type Datetime = string;\n\nconst DATE_TIME_RE =\n\t/^((?!0{3})\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01]))T((?:[01]\\d|2[0-3]):(?:[0-5]\\d):(?:[0-5]\\d))(\\.\\d+)?(Z|(?!-00:00)[+-](?:[01]\\d|2[0-3]):(?:[0-5]\\d))$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isDatetime = (input: unknown): input is Datetime =\u003e {\n\treturn typeof input === 'string' \u0026\u0026 input.length \u003e= 20 \u0026\u0026 input.length \u003c= 64 \u0026\u0026 DATE_TIME_RE.test(input);\n};\n","export type LanguageCode = string;\n\nconst LANGUAGE_CODE_RE =\n\t/^((?\u003cgrandfathered\u003e(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))|((?\u003clanguage\u003e([A-Za-z]{2,3}(-(?\u003cextlang\u003e[A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(-(?\u003cscript\u003e[A-Za-z]{4}))?(-(?\u003cregion\u003e[A-Za-z]{2}|[0-9]{3}))?(-(?\u003cvariant\u003e[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(-(?\u003cextension\u003e[0-9A-WY-Za-wy-z](-[A-Za-z0-9]{2,8})+))*(-(?\u003cprivateUseA\u003ex(-[A-Za-z0-9]{1,8})+))?)|(?\u003cprivateUseB\u003ex(-[A-Za-z0-9]{1,8})+))$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isLanguageCode = (input: unknown): input is LanguageCode =\u003e {\n\treturn typeof input === 'string' \u0026\u0026 input.length \u003e= 2 \u0026\u0026 LANGUAGE_CODE_RE.test(input);\n};\n","/**\n * represents a timestamp identifier (TID)\n */\nexport type Tid = string;\n\nconst TID_RE = /^[234567abcdefghij][234567abcdefghijklmnopqrstuvwxyz]{12}$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isTid = (input: unknown): input is Tid =\u003e {\n\treturn typeof input === 'string' \u0026\u0026 input.length === 13 \u0026\u0026 TID_RE.test(input);\n};\n","import { isUtf8LengthInRange } from '@atcute/uint8array';\n\n/**\n * represents a generic URI\n */\nexport type GenericUri = `${string}:${string}`;\n\nconst URI_RE = /^\\w+:(?:\\/\\/)?[^\\s/][^\\s]*$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isGenericUri = (input: unknown): input is GenericUri =\u003e {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tif (!isUtf8LengthInRange(input, 3, 8192)) {\n\t\treturn false;\n\t}\n\n\treturn URI_RE.test(input);\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/validations.mjs
··· 1 - /* esm.sh - @atcute/lexicons@1.2.10/validations */ 2 - import{isUtf8LengthInRange as J}from"../../uint8array@1.1.1/es2022/uint8array.mjs";import{isGraphemeLengthInRange as X}from"../../util-text@1.2.0/es2022/util-text.mjs";import{_isBytesWrapper as q}from"./dist/interfaces/bytes.mjs";import*as $ from"./interfaces.mjs";import*as l from"./syntax.mjs";import{assert as I}from"./dist/utils.mjs";var u=(e,t,n)=>(Object.defineProperty(e,t,{value:n}),n),v=e=>({get value(){let t=e();return u(this,"value",t)}}),A=Array.isArray,E=e=>typeof e=="object"&&e!==null&&!A(e),R=v(()=>{if(typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{let e=Function;return new e(""),!0}catch{return!1}});var G=!1,S=(e,t)=>e?{ok:!1,code:"join",left:e,right:t}:t,k=(e,t)=>({ok:!1,code:"prepend",key:e,tree:t}),b=e=>({ok:!0,value:e}),O=0,_=1,Q=(e,t)=>{let{ok:n,msg:r,...s}=e;return{...s,path:t}},C=(e,t=[],n=[])=>{for(;;)switch(e.code){case"join":{C(e.left,t.slice(),n),e=e.right;continue}case"prepend":{t.push(e.key),e=e.tree;continue}default:return n.push(Q(e,t)),n}},M=e=>{let t=0;for(;;)switch(e.code){case"join":{t+=M(e.left),e=e.right;continue}case"prepend":{e=e.tree;continue}default:return t+1}},z=(e,t)=>{switch(e.length){case 0:return"nothing";case 1:return e[0];default:return`${e.slice(0,-1).join(", ")} ${t} ${e[e.length-1]}`}},D=e=>JSON.stringify(e),T=(e,t,n,r)=>{let s=`expected ${e} `;return n>0?r===n?s+=`${n}`:r!==1/0?s+=`between ${n} and ${r}`:s+=`at least ${n}`:s+=`at most ${r}`,s+=` ${t}(s)`,s},H=e=>{let t="",n=0;for(;;){switch(e.code){case"join":{n+=M(e.right),e=e.left;continue}case"prepend":{t+=`.${e.key}`,e=e.tree;continue}}break}let r=e.msg(),s=`${e.code} at ${t||"."} (${r})`;return n>0&&(s+=` (+${n} other issue(s))`),s},w=class extends Error{name="ValidationError";#e;constructor(t){super(),this.#e=t}get message(){return H(this.#e)}get issues(){return C(this.#e)}},N=class{ok=!1;#e;constructor(t){this.#e=t}get message(){return H(this.#e)}get issues(){return C(this.#e)}throw(){throw new w(this.#e)}},_e=(e,t)=>{let n=e["~run"](t,_);return n===void 0||n.ok},ke=(e,t)=>{let n=e["~run"](t,O);return n===void 0?b(t):n.ok?n:new N(n)},be=(e,t)=>{let n=e["~run"](t,O);if(n===void 0)return t;if(n.ok)return n.value;throw new w(n)},F=(e,t=[],n=[])=>{for(;;)switch(e.code){case"join":{F(e.left,t.slice(),n),e=e.right;continue}case"prepend":{t.push(e.key),e=e.tree;continue}default:return n.push({message:e.msg(),path:t.length>0?t:void 0}),n}},p=e=>({version:1,vendor:"@atcute/lexicons",validate(t){let n=e["~run"](t,O);return n===void 0?{value:t}:n.ok?{value:n.value}:{issues:F(n)}}}),ve=(e,t)=>{let n=t.length;return{...e,constraints:t,"~run"(r,s){let c=e["~run"](r,s),i;if(c===void 0)i=r;else if(c.ok)i=c.value;else return c;for(let o=0;o<n;o++){let a=t[o]["~run"](i,s);if(a!==void 0)if(a.ok)i=a.value,(c===void 0||c.ok)&&(c=a);else{if(s&_)return a;c===void 0||c.ok?c=a:c=S(c,a)}}return c}}},Se=e=>{let t={ok:!1,code:"invalid_literal",expected:[e],msg(){return`expected ${D(e)}`}};return{kind:"schema",type:"literal",expected:e,"~run"(n,r){if(n!==e)return t},get"~standard"(){return u(this,"~standard",p(this))}}},Ee=e=>{let t={ok:!1,code:"invalid_literal",expected:e,msg(){return`expected ${z(e.map(D),"or")}`}};return{kind:"schema",type:"literal_enum",expected:e,"~run"(n,r){if(!e.includes(n))return t},get"~standard"(){return u(this,"~standard",p(this))}}},Z={ok:!1,code:"invalid_type",expected:"boolean",msg(){return"expected boolean"}},V={kind:"schema",type:"boolean","~run"(e,t){if(typeof e!="boolean")return Z},get"~standard"(){return u(this,"~standard",p(this))}},Ie=()=>V,B={ok:!1,code:"invalid_type",expected:"integer",msg(){return"expected integer"}},ee={kind:"schema",type:"integer","~run"(e,t){if(typeof e!="number"||e<0||!Number.isSafeInteger(e))return B},get"~standard"(){return u(this,"~standard",p(this))}},we=()=>ee,Te=(e,t=1/0)=>{let n={ok:!1,code:"invalid_integer_range",min:e,max:t,msg(){let r="expected an integer ";return e>0?t===e?r+=`of exactly ${e}`:t!==1/0?r+=`between ${e} and ${t}`:r+=`of at least ${e}`:r+=`of at most ${t}`,r}};return{kind:"constraint",type:"integer_range",min:e,max:t,"~run"(r,s){if(r<e||r>t)return n}}},U={ok:!1,code:"invalid_type",expected:"string",msg(){return"expected string"}},te={kind:"schema",type:"string",format:null,"~run"(e,t){if(typeof e!="string")return U},get"~standard"(){return u(this,"~standard",p(this))}},je=()=>te,m=(e,t)=>{let n={ok:!1,code:"invalid_string_format",expected:e,msg(){return`expected a ${e} formatted string`}},r={kind:"schema",type:"string",format:e,"~run"(s,c){if(typeof s!="string")return U;if(!t(s))return n},get"~standard"(){return u(this,"~standard",p(this))}};return()=>r},Ae=m("at-identifier",l.isActorIdentifier),Ne=m("at-uri",l.isResourceUri),Pe=m("cid",l.isCid),Oe=m("datetime",l.isDatetime),Ce=m("did",l.isDid),Ue=m("handle",l.isHandle),Le=m("language",l.isLanguageCode),Re=m("nsid",l.isNsid),Be=m("record-key",l.isRecordKey),Ye=m("tid",l.isTid),Ge=m("uri",l.isGenericUri),Me=(e,t=1/0)=>{let n={ok:!1,code:"invalid_string_length",minLength:e,maxLength:t,msg(){return T("a string","character",e,t)}};return{kind:"constraint",type:"string_length",minLength:e,maxLength:t,"~run"(r,s){if(!J(r,e,t))return n}}},ze=(e,t=1/0)=>{let n={ok:!1,code:"invalid_string_graphemes",minGraphemes:e,maxGraphemes:t,msg(){return T("a string","grapheme",e,t)}};return{kind:"constraint",type:"string_graphemes",minGraphemes:e,maxGraphemes:t,"~run"(r,s){if(!X(r,e,t))return n}}},Y={ok:!1,code:"invalid_type",expected:"blob",msg(){return"expected blob"}},ne={kind:"schema",type:"blob","~run"(e,t){if(typeof e!="object"||e===null)return Y;if(!$.isBlob(e)){if($.isLegacyBlob(e)){let n={$type:"blob",mimeType:e.mimeType,ref:{$link:e.cid},size:-1};return b(n)}return Y}},get"~standard"(){return u(this,"~standard",p(this))}},De=()=>ne,re={ok:!1,code:"invalid_type",expected:"bytes",msg(){return"expected bytes"}},se={kind:"schema",type:"bytes","~run"(e,t){if(!$.isBytes(e))return re},get"~standard"(){return u(this,"~standard",p(this))}},He=()=>se,Fe=(e,t=1/0)=>{let n={ok:!1,code:"invalid_bytes_size",minSize:e,maxSize:t,msg(){return T("a byte array","byte",e,t)}};return{kind:"constraint",type:"bytes_size",minSize:e,maxSize:t,"~run"(r,s){let c;if(q(r))c=r.buf.length;else{let i=r.$bytes,o=i.length;i.charCodeAt(o-1)===61&&o--,o>1&&i.charCodeAt(o-1)===61&&o--,c=o*3>>>2}if(c<e||c>t)return n}}},ie={ok:!1,code:"invalid_type",expected:"cid-link",msg(){return"expected cid-link"}},oe={kind:"schema",type:"cid_link","~run"(e,t){if(!$.isCidLink(e))return ie},get"~standard"(){return u(this,"~standard",p(this))}},Ke=()=>oe,We=e=>({kind:"schema",type:"nullable",wrapped:e,"~run"(t,n){if(t!==null)return e["~run"](t,n)},get"~standard"(){return u(this,"~standard",p(this))}}),Je=(e,t)=>({kind:"schema",type:"optional",wrapped:e,default:t,"~run"(n,r){if(n===void 0){if(t===void 0)return;let s=typeof t=="function"?t():t;return b(s)}return e["~run"](n,r)},get"~standard"(){return u(this,"~standard",p(this))}}),ae=e=>e.type==="optional",ue={ok:!1,code:"invalid_type",expected:"array",msg(){return"expected array"}},Xe=e=>{let t=v(()=>typeof e=="function"?e():e);return{kind:"schema",type:"array",get item(){return u(this,"item",t.value)},get"~run"(){let n=t.value;return u(this,"~run",(s,c)=>{if(!A(s))return ue;let i,o;for(let a=0,d=s.length;a<d;a++){let g=s[a],f=n["~run"](g,c);if(f!==void 0){if(f.ok)o===void 0&&(o=s.slice()),o[a]=f.value;else if(i=S(i,k(a,f)),c&_)return i}}if(i!==void 0)return i;if(o!==void 0)return b(o)})},get"~standard"(){return u(this,"~standard",p(this))}}},qe=(e,t=1/0)=>{let n={ok:!1,code:"invalid_array_length",minLength:e,maxLength:t,msg(){return T("an array","item",e,t)}};return{kind:"constraint",type:"array_length",minLength:e,maxLength:t,"~run"(r,s){let c=r.length;if(c<e||c>t)return n}}},P={ok:!1,code:"invalid_type",expected:"object",msg(){return"expected object"}},K={ok:!1,code:"missing_value",msg(){return"missing value"}},ce=(e,t,n)=>{t==="__proto__"?Object.defineProperty(e,t,{value:n}):e[t]=n},Qe=e=>{let t=v(()=>{let n=[];for(let r in e){let s=e[r];n.push({key:r,schema:s,optional:ae(s),missing:k(r,K)})}return n});return{kind:"schema",type:"object",get shape(){let n=t.value,r={};for(let s of n)r[s.key]=s.schema;return u(this,"shape",r)},get"~run"(){let n=t.value,r=n.length,s=()=>{let i=[["$ok",b],["$joinIssues",S],["$prependPath",k]],o="let $iss,$out;";for(let d=0;d<r;d++){let g=n[d],f=g.key,h=JSON.stringify(f),y=`_${d}`;if(o+=`{const $val=$in[${h}];`,g.optional?o+="if($val!==undefined){":o+=`if($val!==undefined||${h} in $in){`,o+=`const $res=${y}$schema["~run"]($val,$flags);if($res!==undefined)if($res.ok)${f!=="__proto__"?`($out??={...$in})[${h}]=$res.value`:`Object.defineProperty($out??={...$in},${h},{value:$res.value})`};else if((($iss=$joinIssues($iss,$prependPath(${h},$res))),$flags&${_}))return $iss;}`,g.optional){let x=g.schema,W=x.wrapped,j=x.default;if(i.push([`${y}$schema`,W]),j!==void 0){let L=typeof j=="function"?`${y}$default()`:`${y}$default`;i.push([`${y}$default`,j]),o+=f!=="__proto__"?`else($out??={...$in})[${h}]=${L};`:`else Object.defineProperty($out??={...$in},${h},{value:${L}});`}}else i.push([`${y}$schema`,g.schema]),i.push([`${y}$missing`,g.missing]),o+=`else if((($iss=$joinIssues($iss,${y}$missing)),$flags&${_}))return $iss;`;o+="}"}return o+="if($iss!==undefined)return $iss;if($out!==undefined)return $ok($out);",new Function(`[${i.map(([d])=>d).join(",")}]`,`return function matcher($in,$flags){${o}}`)(i.map(([,d])=>d))};if(R.value){let i=s();return u(this,"~run",(a,d)=>E(a)?i(a,d):P)}return u(this,"~run",(i,o)=>{if(!E(i))return P;let a,d;for(let g=0;g<r;g++){let f=n[g],h=f.key,y=i[h];if(!f.optional&&y===void 0&&!(h in i)){if(a=S(a,f.missing),o&_)return a;continue}let x=f.schema["~run"](y,o);if(x!==void 0){if(x.ok)d===void 0&&(d={...i}),ce(d,h,x.value);else if(a=S(a,k(h,x)),o&_)return a}}if(a!==void 0)return a;if(d!==void 0)return b(d)})},get"~standard"(){return u(this,"~standard",p(this))}}},Ze=(e,t)=>{let n=v(()=>{let s=t.shape.$type;return I(s!==void 0,"expected $type in record to be defined"),s.type==="optional"&&(s=s.wrapped),I(s.type==="literal"&&typeof s.expected=="string","expected $type to be a string literal"),t});return{kind:"schema",type:"record",key:e,get object(){return u(this,"object",n.value)},"~run"(r,s){return u(this,"~run",n.value["~run"])(r,s)},get"~standard"(){return u(this,"~standard",p(this))}}},de=k("$type",K),le=k("$type",U),Ve=(e,t=!1)=>({kind:"schema",type:"variant",members:e,closed:t,get"~run"(){let n=[],r=[];for(let i=0,o=e.length;i<o;i++){let a=e[i],d=a.type==="record"?a.object:a,f=d.shape.$type;I(f!==void 0,`expected $type in variant member #${i} to be defined`),f.type==="optional"&&(f=f.wrapped),I(f.type==="literal"&&typeof f.expected=="string",`expected $type in variant member #${i} to be a string literal`),n.push(f.expected),r.push(d)}let s={ok:!1,code:"invalid_variant",expected:n,msg(){return`expected ${z(n,"or")}`}};return u(this,"~run",(i,o)=>{if(!E(i))return P;let a=i.$type;if(a===void 0&&!("$type"in i))return de;if(typeof a!="string")return t?s:le;for(let d=0,g=n.length;d<g;d++)if(n[d]===a)return r[d]["~run"](i,o);if(t)return s})},get"~standard"(){return u(this,"~standard",p(this))}}),fe={ok:!1,code:"invalid_type",expected:"unknown",msg(){return"expected unknown"}},pe={kind:"schema",type:"unknown","~run"(e,t){if(typeof e!="object"||e===null)return fe},get"~standard"(){return u(this,"~standard",p(this))}},et=()=>pe,tt=(e,t)=>(G=!0,{kind:"metadata",type:"xrpc_procedure",nsid:e,params:t.params,get input(){let n=t.input;return n?.type==="lex"&&(n={type:"lex",schema:n.schema}),u(this,"input",n)},get output(){let n=t.output;return n?.type==="lex"&&(n={type:"lex",schema:n.schema}),u(this,"output",n)}}),nt=(e,t)=>(G=!0,{kind:"metadata",type:"xrpc_query",nsid:e,params:t.params,get output(){let n=t.output;return n?.type==="lex"&&(n={type:"lex",schema:n.schema}),u(this,"output",n)}}),rt=(e,t)=>({kind:"metadata",type:"xrpc_subscription",nsid:e,params:t.params,get message(){return u(this,"message",t.message)}});export{_ as FLAG_ABORT_EARLY,O as FLAG_EMPTY,w as ValidationError,Ae as actorIdentifierString,Xe as array,qe as arrayLength,De as blob,Ie as boolean,He as bytes,Fe as bytesSize,Ke as cidLink,Pe as cidString,ve as constrain,Oe as datetimeString,Ce as didString,Ge as genericUriString,Ue as handleString,we as integer,Te as integerRange,_e as is,Le as languageCodeString,Se as literal,Ee as literalEnum,Re as nsidString,We as nullable,Qe as object,b as ok,Je as optional,be as parse,tt as procedure,nt as query,Ze as record,Be as recordKeyString,Ne as resourceUriString,ke as safeParse,je as string,ze as stringGraphemes,Me as stringLength,rt as subscription,Ye as tidString,et as unknown,Ve as variant,G as xrpcSchemaGenerated}; 3 - //# sourceMappingURL=./validations.mjs.map
-1
vendor/esm.sh/@atcute/lexicons@1.2.10/es2022/validations.mjs.map
··· 1 - {"mappings":"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","names":["isUtf8LengthInRange","isGraphemeLengthInRange","_isBytesWrapper","interfaces","syntax","assert","lazyProperty","obj","prop","value","lazy","getter","isArray","isObject","input","allowsEval","F","xrpcSchemaGenerated","joinIssues","left","right","prependPath","key","tree","ok","value","FLAG_EMPTY","FLAG_ABORT_EARLY","cloneIssueWithPath","issue","path","_ok","_fmt","clone","collectIssues","issues","countIssues","count","separatedList","list","sep","formatLiteral","formatRangeMessage","type","unit","min","max","message","formatIssueTree","msg","ValidationError","#issueTree","issueTree","ErrImpl","is","schema","input","r","safeParse","parse","collectStandardIssues","toStandardSchema","constrain","base","constraints","len","flags","result","current","idx","literal","_flags","lazyProperty","literalEnum","values","ISSUE_TYPE_BOOLEAN","BOOLEAN_SCHEMA","boolean","ISSUE_TYPE_INTEGER","INTEGER_SCHEMA","integer","integerRange","ISSUE_TYPE_STRING","STRING_SINGLETON","string","_formattedString","format","validate","actorIdentifierString","resourceUriString","cidString","datetimeString","didString","handleString","languageCodeString","nsidString","recordKeyString","tidString","genericUriString","stringLength","minLength","maxLength","isUtf8LengthInRange","stringGraphemes","minGraphemes","maxGraphemes","isGraphemeLengthInRange","ISSUE_EXPECTED_BLOB","BLOB_SCHEMA","blob","ISSUE_EXPECTED_BYTES","BYTES_SCHEMA","bytes","bytesSize","minSize","maxSize","size","_isBytesWrapper","str","ISSUE_EXPECTED_CID_LINK","CID_LINK_SCHEMA","cidLink","nullable","wrapped","optional","defaultValue","isOptionalSchema","ISSUE_TYPE_ARRAY","array","item","resolvedShape","lazy","shape","isArray","output","val","arrayLength","length","ISSUE_TYPE_OBJECT","ISSUE_MISSING","set","obj","object","resolvedEntries","resolved","entry","generateFastpass","fields","doc","esckey","id","innerSchema","calls","field","allowsEval","fastpass","isObject","record","validatedObject","t","assert","ISSUE_VARIANT_MISSING","ISSUE_VARIANT_TYPE","variant","members","closed","types","schemas","raw","member","ISSUE_TYPE_UNKNOWN","UNKNOWN_SCHEMA","unknown","procedure","nsid","options","query","subscription"],"sources":["../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/validations/index.ts","../esm/npm/@atcute/lexicons@1.2.10/node_modules/@atcute/lexicons/lib/validations/utils.ts"],"sourcesContent":["import { isUtf8LengthInRange } from '@atcute/uint8array';\nimport { isGraphemeLengthInRange } from '@atcute/util-text';\n\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\n\nimport { _isBytesWrapper } from '../interfaces/bytes.ts';\nimport * as interfaces from '../interfaces/index.ts';\nimport * as syntax from '../syntax/index.ts';\nimport type { $type } from '../types/brand.ts';\nimport { assert } from '../utils.ts';\n\nimport { allowsEval, isArray, isObject, lazy, lazyProperty } from './utils.ts';\n\n/**\n * flag indicating whether xrpc schema generation helpers are used. set to true\n * when query() or procedure() is called. this enables conditional tree-shaking\n * of validation code when schemas are not used.\n * @deprecated internal flag for tree-shaking, do not use directly\n */\nexport let xrpcSchemaGenerated = false;\n\ntype Identity\u003cT\u003e = T;\ntype Flatten\u003cT\u003e = Identity\u003c{ [K in keyof T]: T[K] }\u003e;\n\ntype InputType =\n\t| 'unknown'\n\t| 'null'\n\t| 'undefined'\n\t| 'string'\n\t| 'integer'\n\t| 'boolean'\n\t| 'blob'\n\t| 'bytes'\n\t| 'cid-link'\n\t| 'object'\n\t| 'array';\n\ntype StringFormatMap = {\n\t'at-identifier': syntax.ActorIdentifier;\n\t'at-uri': syntax.ResourceUri;\n\tcid: syntax.Cid;\n\tdatetime: syntax.Datetime;\n\tdid: syntax.Did;\n\thandle: syntax.Handle;\n\tlanguage: syntax.LanguageCode;\n\tnsid: syntax.Nsid;\n\t'record-key': syntax.RecordKey;\n\ttid: syntax.Tid;\n\turi: syntax.GenericUri;\n};\n\nexport type StringFormat = keyof StringFormatMap;\n\ntype Literal = string | number | boolean;\ntype Key = string | number;\n\ntype IssueFormatter = () =\u003e string;\n\n// #region Schema issue types\nexport type IssueLeaf = { ok: false; msg: IssueFormatter } \u0026 (\n\t| { code: 'missing_value' }\n\t| { code: 'invalid_literal'; expected: readonly Literal[] }\n\t| { code: 'invalid_type'; expected: InputType }\n\t| { code: 'invalid_variant'; expected: string[] }\n\t| { code: 'invalid_integer_range'; min: number; max: number }\n\t| { code: 'invalid_string_format'; expected: StringFormat }\n\t| { code: 'invalid_string_graphemes'; minGraphemes: number; maxGraphemes: number }\n\t| { code: 'invalid_string_length'; minLength: number; maxLength: number }\n\t| { code: 'invalid_array_length'; minLength: number; maxLength: number }\n\t| { code: 'invalid_bytes_size'; minSize: number; maxSize: number }\n);\n\nexport type IssueTree =\n\t| IssueLeaf\n\t| { ok: false; code: 'prepend'; key: Key; tree: IssueTree }\n\t| { ok: false; code: 'join'; left: IssueTree; right: IssueTree };\n\nexport type Issue =\n\t| { code: 'missing_value'; path: Key[] }\n\t| { code: 'invalid_literal'; path: Key[]; expected: readonly Literal[] }\n\t| { code: 'invalid_type'; path: Key[]; expected: InputType }\n\t| { code: 'invalid_variant'; path: Key[]; expected: string[] }\n\t| { code: 'invalid_integer_range'; path: Key[]; min: number; max: number }\n\t| { code: 'invalid_string_format'; path: Key[]; expected: StringFormat }\n\t| { code: 'invalid_string_graphemes'; path: Key[]; minGraphemes: number; maxGraphemes: number }\n\t| { code: 'invalid_string_length'; path: Key[]; minLength: number; maxLength: number }\n\t| { code: 'invalid_array_length'; path: Key[]; minLength: number; maxLength: number }\n\t| { code: 'invalid_bytes_size'; path: Key[]; minSize: number; maxSize: number };\n\n// #__NO_SIDE_EFFECTS__\nconst joinIssues = (left: IssueTree | undefined, right: IssueTree): IssueTree =\u003e {\n\treturn left ? { ok: false, code: 'join', left, right } : right;\n};\n\n// #__NO_SIDE_EFFECTS__\nconst prependPath = (key: Key, tree: IssueTree): IssueTree =\u003e {\n\treturn { ok: false, code: 'prepend', key, tree };\n};\n\n// #region Schema result types\n\nexport type Ok\u003cT\u003e = {\n\tok: true;\n\tvalue: T;\n};\nexport type Err = {\n\tok: false;\n\treadonly message: string;\n\treadonly issues: readonly Issue[];\n\tthrow(): never;\n};\n\nexport type ValidationResult\u003cT\u003e = Ok\u003cT\u003e | Err;\n\n// #__NO_SIDE_EFFECTS__\nexport const ok = \u003cT\u003e(value: T): Ok\u003cT\u003e =\u003e {\n\treturn { ok: true, value };\n};\n\n// #region Base schema\n\n// Private symbols meant to hold types\ndeclare const kType: unique symbol;\ntype kType = typeof kType;\n\n// None set\nexport const FLAG_EMPTY = 0;\n// Don't continue validation if an error is encountered\nexport const FLAG_ABORT_EARLY = 1 \u003c\u003c 0;\n\ntype MatcherResult = undefined | Ok\u003cunknown\u003e | IssueTree;\ntype Matcher = (input: unknown, flags: number) =\u003e MatcherResult;\n\ntype LexStandardSchemaResult\u003cT extends BaseSchema\u003e = StandardSchemaV1.Result\u003cInferOutput\u003cT\u003e\u003e;\n\ninterface LexStandardSchema\u003cT extends BaseSchema\u003e extends StandardSchemaV1.Props\u003cunknown\u003e {\n\treadonly validate: (value: unknown) =\u003e LexStandardSchemaResult\u003cT\u003e | Promise\u003cLexStandardSchemaResult\u003cT\u003e\u003e;\n\treadonly types?: StandardSchemaV1.Types\u003cInferInput\u003cT\u003e, InferOutput\u003cT\u003e\u003e;\n}\n\nexport interface BaseSchema\u003cTInput = unknown, TOutput = TInput\u003e {\n\treadonly kind: 'schema';\n\treadonly type: string;\n\treadonly '~run': Matcher;\n\treadonly '~standard': LexStandardSchema\u003cthis\u003e;\n\n\treadonly [kType]?: { in: TInput; out: TOutput };\n}\n\nexport type InferInput\u003cT extends BaseSchema\u003e = NonNullable\u003cT[kType]\u003e['in'];\n\nexport type InferOutput\u003cT extends BaseSchema\u003e = NonNullable\u003cT[kType]\u003e['out'];\n\n// #region Schema runner\nconst cloneIssueWithPath = (issue: IssueLeaf, path: Key[]): Issue =\u003e {\n\tconst { ok: _ok, msg: _fmt, ...clone } = issue;\n\n\treturn { ...clone, path };\n};\n\nconst collectIssues = (tree: IssueTree, path: Key[] = [], issues: Issue[] = []): Issue[] =\u003e {\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcollectIssues(tree.left, path.slice(), issues);\n\t\t\t\ttree = tree.right;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\tpath.push(tree.key);\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tissues.push(cloneIssueWithPath(tree, path));\n\t\t\t\treturn issues;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst countIssues = (tree: IssueTree): number =\u003e {\n\tlet count = 0;\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcount += countIssues(tree.left);\n\t\t\t\ttree = tree.right;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn count + 1;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst separatedList = (list: string[], sep: 'or' | 'and'): string =\u003e {\n\tswitch (list.length) {\n\t\tcase 0: {\n\t\t\treturn `nothing`;\n\t\t}\n\t\tcase 1: {\n\t\t\treturn list[0];\n\t\t}\n\t\tdefault: {\n\t\t\treturn `${list.slice(0, -1).join(', ')} ${sep} ${list[list.length - 1]}`;\n\t\t}\n\t}\n};\n\nconst formatLiteral = (value: Literal): string =\u003e {\n\treturn JSON.stringify(value);\n};\n\nconst formatRangeMessage = (\n\ttype: 'a string' | 'an array' | 'a byte array',\n\tunit: 'character' | 'grapheme' | 'item' | 'byte',\n\tmin: number,\n\tmax: number,\n): string =\u003e {\n\tlet message = `expected ${type} `;\n\n\tif (min \u003e 0) {\n\t\tif (max === min) {\n\t\t\tmessage += `${min}`;\n\t\t} else if (max !== Infinity) {\n\t\t\tmessage += `between ${min} and ${max}`;\n\t\t} else {\n\t\t\tmessage += `at least ${min}`;\n\t\t}\n\t} else {\n\t\tmessage += `at most ${max}`;\n\t}\n\n\tmessage += ` ${unit}(s)`;\n\treturn message;\n};\n\nconst formatIssueTree = (tree: IssueTree): string =\u003e {\n\tlet path = '';\n\tlet count = 0;\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcount += countIssues(tree.right);\n\t\t\t\ttree = tree.left;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\tpath += `.${tree.key}`;\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tbreak;\n\t}\n\n\tconst message = tree.msg();\n\n\tlet msg = `${tree.code} at ${path || '.'} (${message})`;\n\tif (count \u003e 0) {\n\t\tmsg += ` (+${count} other issue(s))`;\n\t}\n\n\treturn msg;\n};\n\nexport class ValidationError extends Error {\n\toverride readonly name = 'ValidationError';\n\n\t#issueTree: IssueTree;\n\n\tconstructor(issueTree: IssueTree) {\n\t\tsuper();\n\n\t\tthis.#issueTree = issueTree;\n\t}\n\n\toverride get message(): string {\n\t\treturn formatIssueTree(this.#issueTree);\n\t}\n\n\tget issues(): readonly Issue[] {\n\t\treturn collectIssues(this.#issueTree);\n\t}\n}\n\nclass ErrImpl implements Err {\n\treadonly ok = false;\n\n\t#issueTree: IssueTree;\n\n\tconstructor(issueTree: IssueTree) {\n\t\tthis.#issueTree = issueTree;\n\t}\n\n\tget message(): string {\n\t\treturn formatIssueTree(this.#issueTree);\n\t}\n\n\tget issues(): readonly Issue[] {\n\t\treturn collectIssues(this.#issueTree);\n\t}\n\n\tthrow(): never {\n\t\tthrow new ValidationError(this.#issueTree);\n\t}\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const is = \u003cconst TSchema extends BaseSchema\u003e(\n\tschema: TSchema,\n\tinput: unknown,\n): input is InferInput\u003cTSchema\u003e =\u003e {\n\tconst r = schema['~run'](input, FLAG_ABORT_EARLY);\n\treturn r === undefined || r.ok;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const safeParse = \u003cconst TSchema extends BaseSchema\u003e(\n\tschema: TSchema,\n\tinput: unknown,\n): ValidationResult\u003cInferOutput\u003cTSchema\u003e\u003e =\u003e {\n\tconst r = schema['~run'](input, FLAG_EMPTY);\n\n\tif (r === undefined) {\n\t\treturn ok(input as InferOutput\u003cTSchema\u003e);\n\t}\n\n\tif (r.ok) {\n\t\treturn r as Ok\u003cInferOutput\u003cTSchema\u003e\u003e;\n\t}\n\n\treturn new ErrImpl(r);\n};\n\nexport const parse = \u003cconst TSchema extends BaseSchema\u003e(\n\tschema: TSchema,\n\tinput: unknown,\n): InferOutput\u003cTSchema\u003e =\u003e {\n\tconst r = schema['~run'](input, FLAG_EMPTY);\n\n\tif (r === undefined) {\n\t\treturn input as InferOutput\u003cTSchema\u003e;\n\t}\n\n\tif (r.ok) {\n\t\treturn r.value as InferOutput\u003cTSchema\u003e;\n\t}\n\n\tthrow new ValidationError(r);\n};\n\n// #region Standard Schema support\n\nconst collectStandardIssues = (\n\ttree: IssueTree,\n\tpath: Key[] = [],\n\tissues: StandardSchemaV1.Issue[] = [],\n): StandardSchemaV1.Issue[] =\u003e {\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcollectStandardIssues(tree.left, path.slice(), issues);\n\t\t\t\ttree = tree.right;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\tpath.push(tree.key);\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tissues.push({ message: tree.msg(), path: path.length \u003e 0 ? path : undefined });\n\t\t\t\treturn issues;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst toStandardSchema = \u003cTSchema extends BaseSchema\u003e(schema: TSchema): LexStandardSchema\u003cTSchema\u003e =\u003e {\n\treturn {\n\t\tversion: 1,\n\t\tvendor: '@atcute/lexicons',\n\t\tvalidate(value) {\n\t\t\tconst r = schema['~run'](value, FLAG_EMPTY);\n\n\t\t\tif (r === undefined) {\n\t\t\t\treturn { value: value as InferOutput\u003cTSchema\u003e };\n\t\t\t}\n\n\t\t\tif (r.ok) {\n\t\t\t\treturn { value: r.value as InferOutput\u003cTSchema\u003e };\n\t\t\t}\n\n\t\t\treturn { issues: collectStandardIssues(r) };\n\t\t},\n\t};\n};\n\n// #region Base constraint\n\nexport interface BaseConstraint\u003cTType = unknown\u003e {\n\treadonly kind: 'constraint';\n\treadonly type: string;\n\treadonly '~run': (input: TType, flags: number) =\u003e MatcherResult;\n}\n\ntype ConstraintTuple\u003cT\u003e = readonly [BaseConstraint\u003cT\u003e, ...BaseConstraint\u003cT\u003e[]];\n\nexport type SchemaWithConstraint\u003c\n\tTItem extends BaseSchema,\n\tTConstraints extends ConstraintTuple\u003cInferOutput\u003cTItem\u003e\u003e,\n\u003e = TItem \u0026 {\n\treadonly constraints: TConstraints;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const constrain = \u003c\n\tTItem extends BaseSchema,\n\tconst TConstraints extends ConstraintTuple\u003cInferOutput\u003cTItem\u003e\u003e,\n\u003e(\n\tbase: TItem,\n\tconstraints: TConstraints,\n): SchemaWithConstraint\u003cTItem, TConstraints\u003e =\u003e {\n\tconst len = constraints.length;\n\n\treturn {\n\t\t...base,\n\t\tconstraints: constraints,\n\t\t'~run'(input, flags) {\n\t\t\tlet result = base['~run'](input, flags);\n\t\t\tlet current: any;\n\n\t\t\tif (result === undefined) {\n\t\t\t\tcurrent = input;\n\t\t\t} else if (result.ok) {\n\t\t\t\tcurrent = result.value;\n\t\t\t} else {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tfor (let idx = 0; idx \u003c len; idx++) {\n\t\t\t\tconst r = constraints[idx]['~run'](current, flags);\n\n\t\t\t\tif (r !== undefined) {\n\t\t\t\t\tif (r.ok) {\n\t\t\t\t\t\tcurrent = r.value;\n\n\t\t\t\t\t\tif (result === undefined || result.ok) {\n\t\t\t\t\t\t\tresult = r;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (flags \u0026 FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\treturn r;\n\t\t\t\t\t\t} else if (result === undefined || result.ok) {\n\t\t\t\t\t\t\tresult = r;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult = joinIssues(result, r);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t};\n};\n\n// #region Base metadata\n\nexport interface BaseMetadata {\n\treadonly kind: 'metadata';\n\treadonly type: string;\n}\n\n// #region Literal schema\n\nexport interface LiteralSchema\u003cT extends Literal = Literal\u003e extends BaseSchema\u003cT\u003e {\n\treadonly type: 'literal';\n\treadonly expected: T;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const literal = \u003cT extends Literal\u003e(value: T): LiteralSchema\u003cT\u003e =\u003e {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_literal',\n\t\texpected: [value],\n\t\tmsg() {\n\t\t\treturn `expected ${formatLiteral(value)}`;\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'literal',\n\t\texpected: value,\n\t\t'~run'(input, _flags) {\n\t\t\tif (input !== value) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\nexport interface LiteralEnumSchema\u003cTEnums extends readonly Literal[] = []\u003e extends BaseSchema\u003c\n\tTEnums[number]\n\u003e {\n\treadonly type: 'literal_enum';\n\treadonly expected: TEnums;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const literalEnum = \u003cconst TEnums extends readonly Literal[]\u003e(\n\tvalues: TEnums,\n): LiteralEnumSchema\u003cTEnums\u003e =\u003e {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_literal',\n\t\texpected: values,\n\t\tmsg() {\n\t\t\treturn `expected ${separatedList(values.map(formatLiteral), 'or')}`;\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'literal_enum',\n\t\texpected: values,\n\t\t'~run'(input, _flags) {\n\t\t\tif (!values.includes(input as any)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Boolean schema\n\nexport interface BooleanSchema extends BaseSchema\u003cboolean\u003e {\n\treadonly type: 'boolean';\n}\n\nconst ISSUE_TYPE_BOOLEAN: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'boolean',\n\tmsg() {\n\t\treturn `expected boolean`;\n\t},\n};\n\nconst BOOLEAN_SCHEMA: BooleanSchema = {\n\tkind: 'schema',\n\ttype: 'boolean',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'boolean') {\n\t\t\treturn ISSUE_TYPE_BOOLEAN;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const boolean = (): BooleanSchema =\u003e {\n\treturn BOOLEAN_SCHEMA;\n};\n\n// #region Integer schema\n\nexport interface IntegerSchema extends BaseSchema\u003cnumber\u003e {\n\treadonly type: 'integer';\n}\n\nconst ISSUE_TYPE_INTEGER: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'integer',\n\tmsg() {\n\t\treturn `expected integer`;\n\t},\n};\n\nconst INTEGER_SCHEMA: IntegerSchema = {\n\tkind: 'schema',\n\ttype: 'integer',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'number') {\n\t\t\treturn ISSUE_TYPE_INTEGER;\n\t\t}\n\n\t\tif (input \u003c 0 || !Number.isSafeInteger(input)) {\n\t\t\treturn ISSUE_TYPE_INTEGER;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const integer = (): IntegerSchema =\u003e {\n\treturn INTEGER_SCHEMA;\n};\n\n// #region Integer constraints\n\nexport interface IntegerRangeConstraint\u003c\n\tTMin extends number = number,\n\tTMax extends number = number,\n\u003e extends BaseConstraint\u003cnumber\u003e {\n\treadonly type: 'integer_range';\n\treadonly min: TMin;\n\treadonly max: TMax;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const integerRange: {\n\t\u003cconst TMin extends number\u003e(min: TMin): IntegerRangeConstraint\u003cTMin\u003e;\n\t\u003cconst TMin extends number, const TMax extends number\u003e(\n\t\tmin: TMin,\n\t\tmax: TMax,\n\t): IntegerRangeConstraint\u003cTMin, TMax\u003e;\n} = (min: number, max: number = Infinity): IntegerRangeConstraint =\u003e {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_integer_range',\n\t\tmin: min,\n\t\tmax: max,\n\t\tmsg() {\n\t\t\tlet message = `expected an integer `;\n\n\t\t\tif (min \u003e 0) {\n\t\t\t\tif (max === min) {\n\t\t\t\t\tmessage += `of exactly ${min}`;\n\t\t\t\t} else if (max !== Infinity) {\n\t\t\t\t\tmessage += `between ${min} and ${max}`;\n\t\t\t\t} else {\n\t\t\t\t\tmessage += `of at least ${min}`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmessage += `of at most ${max}`;\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'integer_range',\n\t\tmin: min,\n\t\tmax: max,\n\t\t'~run'(input, _flags) {\n\t\t\tif (input \u003c min) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\tif (input \u003e max) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region String schema\n\nexport interface StringSchema\u003cT extends string = string\u003e extends BaseSchema\u003cT\u003e {\n\treadonly type: 'string';\n\treadonly format: null;\n}\n\nexport interface FormattedStringSchema\u003c\n\tTFormat extends keyof StringFormatMap = keyof StringFormatMap,\n\u003e extends BaseSchema\u003cStringFormatMap[TFormat]\u003e {\n\treadonly type: 'string';\n\treadonly format: TFormat;\n}\n\nconst ISSUE_TYPE_STRING: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'string',\n\tmsg() {\n\t\treturn `expected string`;\n\t},\n};\n\nconst STRING_SINGLETON: StringSchema = {\n\tkind: 'schema',\n\ttype: 'string',\n\tformat: null,\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'string') {\n\t\t\treturn ISSUE_TYPE_STRING;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const string = \u003cT extends string = string\u003e(): StringSchema\u003cT\u003e =\u003e {\n\treturn STRING_SINGLETON as StringSchema\u003cT\u003e;\n};\n\n// #__NO_SIDE_EFFECTS__\nconst _formattedString = \u003cTFormat extends keyof StringFormatMap\u003e(\n\tformat: TFormat,\n\tvalidate: (input: string) =\u003e boolean,\n) =\u003e {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_string_format',\n\t\texpected: format,\n\t\tmsg() {\n\t\t\treturn `expected a ${format} formatted string`;\n\t\t},\n\t};\n\n\tconst schema: FormattedStringSchema\u003cTFormat\u003e = {\n\t\tkind: 'schema',\n\t\ttype: 'string',\n\t\tformat: format,\n\t\t'~run'(input, _flags) {\n\t\t\tif (typeof input !== 'string') {\n\t\t\t\treturn ISSUE_TYPE_STRING;\n\t\t\t}\n\n\t\t\tif (!validate(input)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n\n\treturn () =\u003e schema;\n};\n\n// prettier-ignore\nexport const actorIdentifierString = /*#__PURE__*/ _formattedString('at-identifier', syntax.isActorIdentifier);\nexport const resourceUriString = /*#__PURE__*/ _formattedString('at-uri', syntax.isResourceUri);\nexport const cidString = /*#__PURE__*/ _formattedString('cid', syntax.isCid);\nexport const datetimeString = /*#__PURE__*/ _formattedString('datetime', syntax.isDatetime);\nexport const didString = /*#__PURE__*/ _formattedString('did', syntax.isDid);\nexport const handleString = /*#__PURE__*/ _formattedString('handle', syntax.isHandle);\nexport const languageCodeString = /*#__PURE__*/ _formattedString('language', syntax.isLanguageCode);\nexport const nsidString = /*#__PURE__*/ _formattedString('nsid', syntax.isNsid);\nexport const recordKeyString = /*#__PURE__*/ _formattedString('record-key', syntax.isRecordKey);\nexport const tidString = /*#__PURE__*/ _formattedString('tid', syntax.isTid);\nexport const genericUriString = /*#__PURE__*/ _formattedString('uri', syntax.isGenericUri);\n\n// #region String constraints\n\nexport interface StringLengthConstraint\u003c\n\tTMinLength extends number = number,\n\tTMaxLength extends number = number,\n\u003e extends BaseConstraint\u003cstring\u003e {\n\treadonly type: 'string_length';\n\treadonly minLength: TMinLength;\n\treadonly maxLength: TMaxLength;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const stringLength: {\n\t\u003cconst TMinLength extends number\u003e(min: TMinLength): StringLengthConstraint\u003cTMinLength\u003e;\n\t\u003cconst TMinLength extends number, const TMaxLength extends number\u003e(\n\t\tmin: TMinLength,\n\t\tmax: TMaxLength,\n\t): StringLengthConstraint\u003cTMinLength, TMaxLength\u003e;\n} = (minLength: number, maxLength: number = Infinity): StringLengthConstraint =\u003e {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_string_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('a string', 'character', minLength, maxLength);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'string_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\t'~run'(input, _flags) {\n\t\t\tif (!isUtf8LengthInRange(input, minLength, maxLength)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\nexport interface StringGraphemesConstraint\u003c\n\tTMinGraphemes extends number = number,\n\tTMaxGraphemes extends number = number,\n\u003e extends BaseConstraint\u003cstring\u003e {\n\treadonly type: 'string_graphemes';\n\treadonly minGraphemes: TMinGraphemes;\n\treadonly maxGraphemes: TMaxGraphemes;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const stringGraphemes: {\n\t\u003cconst TMinGraphemes extends number\u003e(min: TMinGraphemes): StringGraphemesConstraint\u003cTMinGraphemes\u003e;\n\t\u003cconst TMinGraphemes extends number, const TMaxGraphemes extends number\u003e(\n\t\tmin: TMinGraphemes,\n\t\tmax: TMaxGraphemes,\n\t): StringGraphemesConstraint\u003cTMinGraphemes, TMaxGraphemes\u003e;\n} = (minGraphemes: number, maxGraphemes: number = Infinity): StringGraphemesConstraint =\u003e {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_string_graphemes',\n\t\tminGraphemes: minGraphemes,\n\t\tmaxGraphemes: maxGraphemes,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('a string', 'grapheme', minGraphemes, maxGraphemes);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'string_graphemes',\n\t\tminGraphemes: minGraphemes,\n\t\tmaxGraphemes: maxGraphemes,\n\t\t'~run'(input, _flags) {\n\t\t\tif (!isGraphemeLengthInRange(input, minGraphemes, maxGraphemes)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region Blob schema\n\nexport interface BlobSchema extends BaseSchema\u003cinterfaces.Blob | interfaces.LegacyBlob, interfaces.Blob\u003e {\n\treadonly type: 'blob';\n}\n\nconst ISSUE_EXPECTED_BLOB: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'blob',\n\tmsg() {\n\t\treturn `expected blob`;\n\t},\n};\n\nconst BLOB_SCHEMA: BlobSchema = {\n\tkind: 'schema',\n\ttype: 'blob',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\treturn ISSUE_EXPECTED_BLOB;\n\t\t}\n\n\t\tif (interfaces.isBlob(input)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (interfaces.isLegacyBlob(input)) {\n\t\t\tconst blob: interfaces.Blob = {\n\t\t\t\t$type: 'blob',\n\t\t\t\tmimeType: input.mimeType,\n\t\t\t\tref: { $link: input.cid },\n\t\t\t\tsize: -1,\n\t\t\t};\n\n\t\t\treturn ok(blob);\n\t\t}\n\n\t\treturn ISSUE_EXPECTED_BLOB;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const blob = (): BlobSchema =\u003e {\n\treturn BLOB_SCHEMA;\n};\n\n// #region IPLD bytes schema\n\nexport interface BytesSchema extends BaseSchema\u003cinterfaces.Bytes, interfaces.Bytes\u003e {\n\treadonly type: 'bytes';\n}\n\nconst ISSUE_EXPECTED_BYTES: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'bytes',\n\tmsg() {\n\t\treturn `expected bytes`;\n\t},\n};\n\nconst BYTES_SCHEMA: BytesSchema = {\n\tkind: 'schema',\n\ttype: 'bytes',\n\t'~run'(input, _flags) {\n\t\tif (!interfaces.isBytes(input)) {\n\t\t\treturn ISSUE_EXPECTED_BYTES;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const bytes = (): BytesSchema =\u003e {\n\treturn BYTES_SCHEMA;\n};\n\n// #region IPLD bytes constraint\nexport interface BytesSizeConstraint\u003c\n\tTMinLength extends number = number,\n\tTMaxLength extends number = number,\n\u003e extends BaseConstraint\u003cinterfaces.Bytes\u003e {\n\treadonly type: 'bytes_size';\n\treadonly minSize: TMinLength;\n\treadonly maxSize: TMaxLength;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const bytesSize: {\n\t\u003cconst TMinLength extends number\u003e(min: TMinLength): BytesSizeConstraint\u003cTMinLength\u003e;\n\t\u003cconst TMinLength extends number, const TMaxLength extends number\u003e(\n\t\tmin: TMinLength,\n\t\tmax: TMaxLength,\n\t): BytesSizeConstraint\u003cTMinLength, TMaxLength\u003e;\n} = (minSize: number, maxSize: number = Infinity): BytesSizeConstraint =\u003e {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_bytes_size',\n\t\tminSize: minSize,\n\t\tmaxSize: maxSize,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('a byte array', 'byte', minSize, maxSize);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'bytes_size',\n\t\tminSize: minSize,\n\t\tmaxSize: maxSize,\n\t\t'~run'(input, _flags) {\n\t\t\tlet size: number;\n\n\t\t\tif (_isBytesWrapper(input)) {\n\t\t\t\tsize = input.buf.length;\n\t\t\t} else {\n\t\t\t\tconst str = input.$bytes;\n\t\t\t\tlet bytes = str.length;\n\n\t\t\t\tif (str.charCodeAt(bytes - 1) === 0x3d) {\n\t\t\t\t\tbytes--;\n\t\t\t\t}\n\t\t\t\tif (bytes \u003e 1 \u0026\u0026 str.charCodeAt(bytes - 1) === 0x3d) {\n\t\t\t\t\tbytes--;\n\t\t\t\t}\n\n\t\t\t\tsize = (bytes * 3) \u003e\u003e\u003e 2;\n\t\t\t}\n\n\t\t\tif (size \u003c minSize) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\tif (size \u003e maxSize) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region IPLD CID type schema\n\nexport interface CidLinkSchema extends BaseSchema\u003cinterfaces.CidLink, interfaces.CidLink\u003e {\n\treadonly type: 'cid_link';\n}\n\nconst ISSUE_EXPECTED_CID_LINK: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'cid-link',\n\tmsg() {\n\t\treturn `expected cid-link`;\n\t},\n};\n\nconst CID_LINK_SCHEMA: CidLinkSchema = {\n\tkind: 'schema',\n\ttype: 'cid_link',\n\t'~run'(input, _flags) {\n\t\tif (!interfaces.isCidLink(input)) {\n\t\t\treturn ISSUE_EXPECTED_CID_LINK;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const cidLink = (): CidLinkSchema =\u003e {\n\treturn CID_LINK_SCHEMA;\n};\n\n// #region Nullable schema\n\nexport interface NullableSchema\u003cTItem extends BaseSchema = BaseSchema\u003e extends BaseSchema\u003c\n\tInferInput\u003cTItem\u003e | null,\n\tInferOutput\u003cTItem\u003e | null\n\u003e {\n\treadonly type: 'nullable';\n\treadonly wrapped: TItem;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const nullable = \u003cTItem extends BaseSchema\u003e(wrapped: TItem): NullableSchema\u003cTItem\u003e =\u003e {\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'nullable',\n\t\twrapped: wrapped,\n\t\t'~run'(input, flags) {\n\t\t\tif (input === null) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn wrapped['~run'](input, flags);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Optional schema\n\nexport type DefaultValue\u003cTItem extends BaseSchema\u003e =\n\t| InferOutput\u003cTItem\u003e\n\t| (() =\u003e InferOutput\u003cTItem\u003e)\n\t| undefined;\n\nexport type InferOptionalOutput\u003c\n\tTItem extends BaseSchema,\n\tTDefault extends DefaultValue\u003cTItem\u003e,\n\u003e = undefined extends TDefault ? InferOutput\u003cTItem\u003e | undefined : InferOutput\u003cTItem\u003e;\n\nexport interface OptionalSchema\u003c\n\tTItem extends BaseSchema = BaseSchema,\n\tTDefault extends DefaultValue\u003cTItem\u003e = DefaultValue\u003cTItem\u003e,\n\u003e extends BaseSchema\u003cInferInput\u003cTItem\u003e | undefined, InferOptionalOutput\u003cTItem, TDefault\u003e\u003e {\n\treadonly type: 'optional';\n\treadonly wrapped: TItem;\n\treadonly default: TDefault;\n}\n\ntype MaybeOptional\u003cTItem extends BaseSchema\u003e = TItem | OptionalSchema\u003cTItem, undefined\u003e;\n\n// #__NO_SIDE_EFFECTS__\nexport const optional: {\n\t\u003cTItem extends BaseSchema\u003e(wrapped: TItem): OptionalSchema\u003cTItem, undefined\u003e;\n\t\u003cTItem extends BaseSchema, TDefault extends DefaultValue\u003cTItem\u003e\u003e(\n\t\twrapped: TItem,\n\t\tdefaultValue: TDefault,\n\t): OptionalSchema\u003cTItem, TDefault\u003e;\n} = (wrapped: BaseSchema, defaultValue?: any): OptionalSchema\u003cany, any\u003e =\u003e {\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'optional',\n\t\twrapped: wrapped,\n\t\tdefault: defaultValue,\n\t\t'~run'(input, flags) {\n\t\t\tif (input === undefined) {\n\t\t\t\tif (defaultValue === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst value = typeof defaultValue === 'function' ? defaultValue() : defaultValue;\n\n\t\t\t\treturn ok(value);\n\t\t\t}\n\n\t\t\treturn wrapped['~run'](input, flags);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\nconst isOptionalSchema = (schema: BaseSchema): schema is OptionalSchema\u003cany, unknown\u003e =\u003e {\n\treturn schema.type === 'optional';\n};\n\n// #region Array schema\n\nexport interface ArraySchema\u003cTItem extends BaseSchema = BaseSchema\u003e extends BaseSchema\u003cunknown[], unknown[]\u003e {\n\treadonly type: 'array';\n\treadonly item: TItem;\n\n\treadonly [kType]?: { in: InferInput\u003cTItem\u003e[]; out: InferOutput\u003cTItem\u003e[] };\n}\n\nconst ISSUE_TYPE_ARRAY: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'array',\n\tmsg() {\n\t\treturn `expected array`;\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const array = \u003cTItem extends BaseSchema\u003e(item: TItem | (() =\u003e TItem)): ArraySchema\u003cTItem\u003e =\u003e {\n\tconst resolvedShape = lazy(() =\u003e {\n\t\treturn typeof item === 'function' ? item() : item;\n\t});\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'array',\n\t\tget item() {\n\t\t\treturn lazyProperty(this, 'item', resolvedShape.value);\n\t\t},\n\t\tget '~run'() {\n\t\t\tconst shape = resolvedShape.value;\n\n\t\t\tconst matcher: Matcher = (input, flags) =\u003e {\n\t\t\t\tif (!isArray(input)) {\n\t\t\t\t\treturn ISSUE_TYPE_ARRAY;\n\t\t\t\t}\n\n\t\t\t\tlet issues: IssueTree | undefined;\n\t\t\t\tlet output: any[] | undefined;\n\n\t\t\t\tfor (let idx = 0, len = input.length; idx \u003c len; idx++) {\n\t\t\t\t\tconst val = input[idx];\n\t\t\t\t\tconst r = shape['~run'](val, flags);\n\n\t\t\t\t\tif (r !== undefined) {\n\t\t\t\t\t\tif (r.ok) {\n\t\t\t\t\t\t\tif (output === undefined) {\n\t\t\t\t\t\t\t\toutput = input.slice();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toutput[idx] = r.value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tissues = joinIssues(issues, prependPath(idx, r));\n\n\t\t\t\t\t\t\tif (flags \u0026 FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\t\treturn issues;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (issues !== undefined) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\tif (output !== undefined) {\n\t\t\t\t\treturn ok(output);\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Array constraints\n\nexport interface ArrayLengthConstraint\u003c\n\tTMinLength extends number = number,\n\tTMaxLength extends number = number,\n\u003e extends BaseConstraint\u003cunknown[]\u003e {\n\treadonly type: 'array_length';\n\treadonly minLength: TMinLength;\n\treadonly maxLength: TMaxLength;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const arrayLength: {\n\t\u003cconst TMinLength extends number\u003e(min: TMinLength): ArrayLengthConstraint\u003cTMinLength\u003e;\n\t\u003cconst TMinLength extends number, const TMaxLength extends number\u003e(\n\t\tmin: TMinLength,\n\t\tmax: TMaxLength,\n\t): ArrayLengthConstraint\u003cTMinLength, TMaxLength\u003e;\n} = (minLength: number, maxLength: number = Infinity): ArrayLengthConstraint =\u003e {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_array_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('an array', 'item', minLength, maxLength);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'array_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\t'~run'(input, _flags) {\n\t\t\tconst length = input.length;\n\n\t\t\tif (length \u003c minLength) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\tif (length \u003e maxLength) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region Object schema\n\n// `ObjectSchema` accepts a `LooseObjectShape` instead of `ObjectShape` to allow\n// for circular references, and this means preventing TypeScript from attempting\n// to eagerly evaluate the shape, unfortunate that this means we can't throw a\n// type issue if you add a non-schema value into the shape though\n\nexport type LooseObjectShape = Record\u003cstring, any\u003e;\nexport type ObjectShape = Record\u003cstring, BaseSchema\u003e;\n\nexport type OptionalObjectInputKeys\u003cTShape extends ObjectShape\u003e = {\n\t[Key in keyof TShape]: TShape[Key] extends OptionalSchema\u003cany, any\u003e ? Key : never;\n}[keyof TShape];\n\nexport type OptionalObjectOutputKeys\u003cTShape extends ObjectShape\u003e = {\n\t[Key in keyof TShape]: TShape[Key] extends OptionalSchema\u003cany, infer Default\u003e\n\t\t? undefined extends Default\n\t\t\t? Key\n\t\t\t: never\n\t\t: never;\n}[keyof TShape];\n\ntype InferObjectInput\u003cTShape extends ObjectShape\u003e = Flatten\u003c\n\t{\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectInputKeys\u003cTShape\u003e ? never : Key]: InferInput\u003c\n\t\t\tTShape[Key]\n\t\t\u003e;\n\t} \u0026 {\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectInputKeys\u003cTShape\u003e ? Key : never]?: InferInput\u003c\n\t\t\tTShape[Key]\n\t\t\u003e;\n\t}\n\u003e;\n\ntype InferObjectOutput\u003cTShape extends ObjectShape\u003e = Flatten\u003c\n\t{\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectOutputKeys\u003cTShape\u003e\n\t\t\t? never\n\t\t\t: Key]: InferOutput\u003cTShape[Key]\u003e;\n\t} \u0026 {\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectOutputKeys\u003cTShape\u003e\n\t\t\t? Key\n\t\t\t: never]?: InferOutput\u003cTShape[Key]\u003e;\n\t}\n\u003e;\n\nexport interface ObjectSchema\u003cTShape extends LooseObjectShape = LooseObjectShape\u003e extends BaseSchema\u003c\n\tRecord\u003cstring, unknown\u003e\n\u003e {\n\treadonly type: 'object';\n\treadonly shape: Readonly\u003cTShape\u003e;\n\n\t// passing `InferObjectX` into `extends BaseSchema\u003c...\u003e` eagerly evaluates the\n\t// shape, however, passing it as a property means that it's only evaluated if\n\t// you attempt to grab the value.\n\treadonly [kType]?: { in: InferObjectInput\u003cTShape\u003e; out: InferObjectOutput\u003cTShape\u003e };\n}\n\ninterface ObjectEntry {\n\tkey: string;\n\tschema: BaseSchema;\n\toptional: boolean;\n\tmissing: IssueTree;\n}\n\nconst ISSUE_TYPE_OBJECT: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'object',\n\tmsg() {\n\t\treturn `expected object`;\n\t},\n};\n\nconst ISSUE_MISSING: IssueLeaf = {\n\tok: false,\n\tcode: 'missing_value',\n\tmsg() {\n\t\treturn `missing value`;\n\t},\n};\n\nconst set = (obj: Record\u003cstring, unknown\u003e, key: string, value: unknown): void =\u003e {\n\tif (key === '__proto__') {\n\t\tObject.defineProperty(obj, key, { value });\n\t} else {\n\t\tobj[key] = value;\n\t}\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const object = \u003cTShape extends LooseObjectShape\u003e(shape: TShape): ObjectSchema\u003cTShape\u003e =\u003e {\n\tconst resolvedEntries = lazy(() =\u003e {\n\t\tconst resolved: ObjectEntry[] = [];\n\n\t\tfor (const key in shape) {\n\t\t\tconst schema = shape[key];\n\n\t\t\tresolved.push({\n\t\t\t\tkey: key,\n\t\t\t\tschema: schema,\n\t\t\t\toptional: isOptionalSchema(schema),\n\t\t\t\tmissing: prependPath(key, ISSUE_MISSING),\n\t\t\t});\n\t\t}\n\n\t\treturn resolved;\n\t});\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'object',\n\t\tget shape() {\n\t\t\t// if we just return the shape as is then it wouldn't be the same exact\n\t\t\t// shape when getters are present.\n\t\t\tconst resolved = resolvedEntries.value;\n\t\t\tconst obj: any = {};\n\n\t\t\tfor (const entry of resolved) {\n\t\t\t\tobj[entry.key] = entry.schema;\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'shape', obj as TShape);\n\t\t},\n\t\tget '~run'() {\n\t\t\tconst shape = resolvedEntries.value;\n\t\t\tconst len = shape.length;\n\n\t\t\tconst generateFastpass = (): Matcher =\u003e {\n\t\t\t\tconst fields: [string, any][] = [\n\t\t\t\t\t['$ok', ok],\n\t\t\t\t\t['$joinIssues', joinIssues],\n\t\t\t\t\t['$prependPath', prependPath],\n\t\t\t\t];\n\n\t\t\t\tlet doc = `let $iss,$out;`;\n\n\t\t\t\tfor (let idx = 0; idx \u003c len; idx++) {\n\t\t\t\t\tconst entry = shape[idx];\n\n\t\t\t\t\tconst key = entry.key;\n\t\t\t\t\tconst esckey = JSON.stringify(key);\n\n\t\t\t\t\tconst id = `_${idx}`;\n\n\t\t\t\t\tdoc += `{const $val=$in[${esckey}];`;\n\n\t\t\t\t\tif (entry.optional) {\n\t\t\t\t\t\tdoc += `if($val!==undefined){`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdoc += `if($val!==undefined||${esckey} in $in){`;\n\t\t\t\t\t}\n\n\t\t\t\t\tdoc += `const $res=${id}$schema[\"~run\"]($val,$flags);if($res!==undefined)if($res.ok)${key !== '__proto__' ? `($out??={...$in})[${esckey}]=$res.value` : `Object.defineProperty($out??={...$in},${esckey},{value:$res.value})`};else if((($iss=$joinIssues($iss,$prependPath(${esckey},$res))),$flags\u0026${FLAG_ABORT_EARLY}))return $iss;}`;\n\n\t\t\t\t\tif (entry.optional) {\n\t\t\t\t\t\tconst schema = entry.schema as OptionalSchema;\n\t\t\t\t\t\tconst innerSchema = schema.wrapped;\n\t\t\t\t\t\tconst defaultValue = schema.default;\n\n\t\t\t\t\t\tfields.push([`${id}$schema`, innerSchema]);\n\n\t\t\t\t\t\tif (defaultValue !== undefined) {\n\t\t\t\t\t\t\tconst calls = typeof defaultValue === 'function' ? `${id}$default()` : `${id}$default`;\n\n\t\t\t\t\t\t\tfields.push([`${id}$default`, defaultValue]);\n\n\t\t\t\t\t\t\tdoc +=\n\t\t\t\t\t\t\t\tkey !== '__proto__'\n\t\t\t\t\t\t\t\t\t? `else($out??={...$in})[${esckey}]=${calls};`\n\t\t\t\t\t\t\t\t\t: `else Object.defineProperty($out??={...$in},${esckey},{value:${calls}});`;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfields.push([`${id}$schema`, entry.schema]);\n\t\t\t\t\t\tfields.push([`${id}$missing`, entry.missing]);\n\n\t\t\t\t\t\tdoc += `else if((($iss=$joinIssues($iss,${id}$missing)),$flags\u0026${FLAG_ABORT_EARLY}))return $iss;`;\n\t\t\t\t\t}\n\n\t\t\t\t\tdoc += `}`;\n\t\t\t\t}\n\n\t\t\t\tdoc += `if($iss!==undefined)return $iss;if($out!==undefined)return $ok($out);`;\n\n\t\t\t\tconst fn = new Function(\n\t\t\t\t\t`[${fields.map(([id]) =\u003e id).join(',')}]`,\n\t\t\t\t\t`return function matcher($in,$flags){${doc}}`,\n\t\t\t\t);\n\n\t\t\t\treturn fn(fields.map(([, field]) =\u003e field));\n\t\t\t};\n\n\t\t\tif (allowsEval.value) {\n\t\t\t\tconst fastpass = generateFastpass();\n\n\t\t\t\tconst matcher: Matcher = (input, flags) =\u003e {\n\t\t\t\t\tif (!isObject(input)) {\n\t\t\t\t\t\treturn ISSUE_TYPE_OBJECT;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn fastpass(input, flags);\n\t\t\t\t};\n\n\t\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t\t}\n\n\t\t\tconst matcher: Matcher = (input, flags) =\u003e {\n\t\t\t\tif (!isObject(input)) {\n\t\t\t\t\treturn ISSUE_TYPE_OBJECT;\n\t\t\t\t}\n\n\t\t\t\tlet issues: IssueTree | undefined;\n\t\t\t\tlet output: Record\u003cstring, unknown\u003e | undefined;\n\n\t\t\t\tfor (let idx = 0; idx \u003c len; idx++) {\n\t\t\t\t\tconst entry = shape[idx];\n\n\t\t\t\t\tconst key = entry.key;\n\t\t\t\t\tconst value = input[key];\n\n\t\t\t\t\tif (!entry.optional \u0026\u0026 value === undefined \u0026\u0026 !(key in input)) {\n\t\t\t\t\t\tissues = joinIssues(issues, entry.missing);\n\n\t\t\t\t\t\tif (flags \u0026 FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\treturn issues;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst r = entry.schema['~run'](value, flags);\n\n\t\t\t\t\tif (r !== undefined) {\n\t\t\t\t\t\tif (r.ok) {\n\t\t\t\t\t\t\tif (output === undefined) {\n\t\t\t\t\t\t\t\toutput = { ...input };\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/*#__INLINE__*/ set(output, key, r.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tissues = joinIssues(issues, prependPath(key, r));\n\n\t\t\t\t\t\t\tif (flags \u0026 FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\t\treturn issues;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (issues !== undefined) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\tif (output !== undefined) {\n\t\t\t\t\treturn ok(output);\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Record schema\n//\n// unfortunately, adapting for circular references has meant that we can't have\n// TypeScript check the object against a particular shape ($type field required)\n\nexport type RecordObjectShape = {\n\t$type: LiteralSchema\u003csyntax.Nsid\u003e;\n\t[key: string]: BaseSchema;\n};\n\nexport type RecordKeySchema = StringSchema | FormattedStringSchema | LiteralSchema\u003cstring\u003e;\nexport type RecordObjectSchema = ObjectSchema\u003cRecordObjectShape\u003e;\n\nexport interface RecordSchema\u003cTObject extends ObjectSchema, TKey extends RecordKeySchema\u003e extends BaseSchema\u003c\n\tRecord\u003cstring, unknown\u003e\n\u003e {\n\treadonly type: 'record';\n\treadonly key: TKey;\n\treadonly object: TObject;\n\n\treadonly [kType]?: { in: InferInput\u003cTObject\u003e; out: InferOutput\u003cTObject\u003e };\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const record = \u003cTKey extends RecordKeySchema, TObject extends ObjectSchema\u003e(\n\tkey: TKey,\n\tobject: TObject,\n): RecordSchema\u003cTObject, TKey\u003e =\u003e {\n\tconst validatedObject = lazy((): TObject =\u003e {\n\t\tconst shape = object.shape;\n\n\t\tlet t = shape.$type as MaybeOptional\u003cLiteralSchema\u003csyntax.Nsid\u003e\u003e | undefined;\n\n\t\tassert(t !== undefined, `expected $type in record to be defined`);\n\t\tif (t.type === 'optional') {\n\t\t\tt = t.wrapped;\n\t\t}\n\n\t\tassert(t.type === 'literal' \u0026\u0026 typeof t.expected === 'string', `expected $type to be a string literal`);\n\n\t\treturn object;\n\t});\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'record',\n\t\tkey: key,\n\t\tget object() {\n\t\t\treturn lazyProperty(this, 'object', validatedObject.value);\n\t\t},\n\t\t'~run'(input, flags) {\n\t\t\treturn lazyProperty(this, '~run', validatedObject.value['~run'])(input, flags);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Variant schema\n\ntype VariantMember = ObjectSchema\u003cany\u003e | RecordSchema\u003cObjectSchema\u003cany\u003e, RecordKeySchema\u003e;\ntype VariantTuple = readonly VariantMember[];\n\ntype InferVariantInput\u003cTMembers extends VariantTuple\u003e = $type.enforce\u003cInferInput\u003cTMembers[number]\u003e\u003e;\n\ntype InferVariantOutput\u003cTMembers extends VariantTuple\u003e = $type.enforce\u003cInferOutput\u003cTMembers[number]\u003e\u003e;\n\nexport interface VariantSchema\u003c\n\tTMembers extends VariantTuple = VariantTuple,\n\tTClosed extends boolean = boolean,\n\u003e extends BaseSchema\u003cRecord\u003cstring, unknown\u003e\u003e {\n\treadonly type: 'variant';\n\treadonly members: TMembers;\n\treadonly closed: TClosed;\n\n\treadonly [kType]?: { in: InferVariantInput\u003cTMembers\u003e; out: InferVariantOutput\u003cTMembers\u003e };\n}\n\nconst ISSUE_VARIANT_MISSING = /*#__PURE__*/ prependPath('$type', ISSUE_MISSING);\n\nconst ISSUE_VARIANT_TYPE = /*#__PURE__*/ prependPath('$type', ISSUE_TYPE_STRING);\n\n// #__NO_SIDE_EFFECTS__\nexport const variant: {\n\t\u003cconst TMembers extends VariantTuple\u003e(members: TMembers): VariantSchema\u003cTMembers\u003e;\n\t\u003cconst TMembers extends VariantTuple, TClosed extends boolean\u003e(\n\t\tmembers: TMembers,\n\t\tclosed: TClosed,\n\t): VariantSchema\u003cTMembers, TClosed\u003e;\n} = (members: VariantMember[], closed: boolean = false): VariantSchema\u003cany, any\u003e =\u003e {\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'variant',\n\t\tmembers: members,\n\t\tclosed: closed,\n\t\tget '~run'() {\n\t\t\tconst types: string[] = [];\n\t\t\tconst schemas: ObjectSchema[] = [];\n\n\t\t\tfor (let idx = 0, len = members.length; idx \u003c len; idx++) {\n\t\t\t\tconst raw = members[idx]!;\n\t\t\t\tconst member = raw.type === 'record' ? raw.object : raw;\n\t\t\t\tconst shape = member.shape;\n\n\t\t\t\tlet t = shape.$type as MaybeOptional\u003cLiteralSchema\u003csyntax.Nsid\u003e\u003e | undefined;\n\n\t\t\t\tassert(t !== undefined, `expected $type in variant member #${idx} to be defined`);\n\t\t\t\tif (t.type === 'optional') {\n\t\t\t\t\tt = t.wrapped;\n\t\t\t\t}\n\n\t\t\t\tassert(\n\t\t\t\t\tt.type === 'literal' \u0026\u0026 typeof t.expected === 'string',\n\t\t\t\t\t`expected $type in variant member #${idx} to be a string literal`,\n\t\t\t\t);\n\n\t\t\t\ttypes.push(t.expected);\n\t\t\t\tschemas.push(member);\n\t\t\t}\n\n\t\t\tconst issue: IssueLeaf = {\n\t\t\t\tok: false,\n\t\t\t\tcode: 'invalid_variant',\n\t\t\t\texpected: types,\n\t\t\t\tmsg() {\n\t\t\t\t\treturn `expected ${separatedList(types, 'or')}`;\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst matcher: Matcher = (input, flags) =\u003e {\n\t\t\t\tif (!isObject(input)) {\n\t\t\t\t\treturn ISSUE_TYPE_OBJECT;\n\t\t\t\t}\n\n\t\t\t\tconst type = input.$type;\n\n\t\t\t\tif (type === undefined \u0026\u0026 !('$type' in input)) {\n\t\t\t\t\treturn ISSUE_VARIANT_MISSING;\n\t\t\t\t}\n\n\t\t\t\tif (typeof type !== 'string') {\n\t\t\t\t\treturn closed ? issue : ISSUE_VARIANT_TYPE;\n\t\t\t\t}\n\n\t\t\t\tfor (let idx = 0, len = types.length; idx \u003c len; idx++) {\n\t\t\t\t\tif (types[idx] === type) {\n\t\t\t\t\t\treturn schemas[idx]!['~run'](input, flags);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (closed) {\n\t\t\t\t\treturn issue;\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Unknown schema\n\nexport interface UnknownSchema extends BaseSchema\u003cRecord\u003cstring, unknown\u003e\u003e {\n\treadonly type: 'unknown';\n}\n\nconst ISSUE_TYPE_UNKNOWN: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'unknown',\n\tmsg() {\n\t\treturn `expected unknown`;\n\t},\n};\n\nconst UNKNOWN_SCHEMA: UnknownSchema = {\n\tkind: 'schema',\n\ttype: 'unknown',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\treturn ISSUE_TYPE_UNKNOWN;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const unknown = (): UnknownSchema =\u003e {\n\treturn UNKNOWN_SCHEMA;\n};\n\n// #region XRPC types\n\nexport interface XRPCLexBodyParam\u003c\n\tTSchema extends ObjectSchema | VariantSchema = ObjectSchema | VariantSchema,\n\u003e {\n\treadonly type: 'lex';\n\treadonly schema: TSchema;\n}\n\nexport interface XRPCBlobBodyParam {\n\treadonly type: 'blob';\n\treadonly encoding?: string[];\n}\n\nexport type XRPCBodyParam = XRPCLexBodyParam | XRPCBlobBodyParam | null;\n\nexport type InferXRPCBodyInput\u003cT extends XRPCBodyParam\u003e =\n\tT extends XRPCLexBodyParam\u003cinfer Schema\u003e\n\t\t? InferInput\u003cSchema\u003e\n\t\t: T extends XRPCBlobBodyParam\n\t\t\t? Blob\n\t\t\t: T extends null\n\t\t\t\t? void\n\t\t\t\t: never;\n\nexport type InferXRPCBodyOutput\u003cT extends XRPCBodyParam\u003e =\n\tT extends XRPCLexBodyParam\u003cinfer Schema\u003e\n\t\t? InferOutput\u003cSchema\u003e\n\t\t: T extends XRPCBlobBodyParam\n\t\t\t? Blob\n\t\t\t: T extends null\n\t\t\t\t? void\n\t\t\t\t: never;\n\n// #region XRPC procedure metadata\n\nexport interface XRPCProcedureMetadata\u003c\n\tTParams extends ObjectSchema | null = ObjectSchema | null,\n\tTInput extends XRPCBodyParam = XRPCBodyParam,\n\tTOutput extends XRPCBodyParam = XRPCBodyParam,\n\tTNsid extends syntax.Nsid = syntax.Nsid,\n\u003e extends BaseMetadata {\n\treadonly type: 'xrpc_procedure';\n\treadonly nsid: TNsid;\n\treadonly params: TParams;\n\treadonly input: TInput;\n\treadonly output: TOutput;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const procedure = \u003c\n\tTNsid extends syntax.Nsid,\n\tTParams extends ObjectSchema | null,\n\tTInput extends XRPCBodyParam,\n\tTOutput extends XRPCBodyParam,\n\u003e(\n\tnsid: TNsid,\n\toptions: {\n\t\tparams: TParams;\n\t\tinput: TInput;\n\t\toutput: TOutput;\n\t},\n): XRPCProcedureMetadata\u003cTParams, TInput, TOutput, TNsid\u003e =\u003e {\n\t// `schema` can be a getter, and we'd have to resolve that getter.\n\n\txrpcSchemaGenerated = true;\n\n\treturn {\n\t\tkind: 'metadata',\n\t\ttype: 'xrpc_procedure',\n\t\tnsid: nsid,\n\t\tparams: options.params,\n\t\tget input() {\n\t\t\tlet val = options.input;\n\n\t\t\tswitch (val?.type) {\n\t\t\t\tcase 'lex': {\n\t\t\t\t\tval = {\n\t\t\t\t\t\ttype: 'lex',\n\t\t\t\t\t\tschema: val.schema,\n\t\t\t\t\t} as TInput;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'input', val);\n\t\t},\n\t\tget output() {\n\t\t\tlet val = options.output;\n\n\t\t\tswitch (val?.type) {\n\t\t\t\tcase 'lex': {\n\t\t\t\t\tval = {\n\t\t\t\t\t\ttype: 'lex',\n\t\t\t\t\t\tschema: val.schema,\n\t\t\t\t\t} as TOutput;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'output', val);\n\t\t},\n\t};\n};\n\n// #region XRPC query metadata\n\nexport interface XRPCQueryMetadata\u003c\n\tTParams extends ObjectSchema | null = ObjectSchema | null,\n\tTOutput extends XRPCBodyParam = XRPCBodyParam,\n\tTNsid extends syntax.Nsid = syntax.Nsid,\n\u003e extends BaseMetadata {\n\treadonly type: 'xrpc_query';\n\treadonly nsid: TNsid;\n\treadonly params: TParams;\n\treadonly output: TOutput;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const query = \u003c\n\tTNsid extends syntax.Nsid,\n\tTParams extends ObjectSchema | null,\n\tTOutput extends XRPCBodyParam,\n\u003e(\n\tnsid: TNsid,\n\toptions: {\n\t\tparams: TParams;\n\t\toutput: TOutput;\n\t},\n): XRPCQueryMetadata\u003cTParams, TOutput, TNsid\u003e =\u003e {\n\t// `schema` can be a getter, and we'd have to resolve that getter.\n\n\txrpcSchemaGenerated = true;\n\n\treturn {\n\t\tkind: 'metadata',\n\t\ttype: 'xrpc_query',\n\t\tnsid: nsid,\n\t\tparams: options.params,\n\t\tget output() {\n\t\t\tlet val = options.output;\n\n\t\t\tswitch (val?.type) {\n\t\t\t\tcase 'lex': {\n\t\t\t\t\tval = {\n\t\t\t\t\t\ttype: 'lex',\n\t\t\t\t\t\tschema: val.schema,\n\t\t\t\t\t} as TOutput;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'output', val);\n\t\t},\n\t};\n};\n\n// #region XRPC subscription metadata\n\nexport interface XRPCSubscriptionMetadata\u003c\n\tTParams extends ObjectSchema | null = ObjectSchema | null,\n\tTMessage extends ObjectSchema\u003cany\u003e | VariantSchema\u003cany, any\u003e | null =\n\t\t| ObjectSchema\u003cany\u003e\n\t\t| VariantSchema\u003cany, any\u003e\n\t\t| null,\n\tTNsid extends syntax.Nsid = syntax.Nsid,\n\u003e extends BaseMetadata {\n\treadonly type: 'xrpc_subscription';\n\treadonly nsid: TNsid;\n\treadonly params: TParams;\n\treadonly message: TMessage;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const subscription = \u003c\n\tTNsid extends syntax.Nsid,\n\tTParams extends ObjectSchema | null,\n\tTMessage extends ObjectSchema\u003cany\u003e | VariantSchema\u003cany, any\u003e | null,\n\u003e(\n\tnsid: TNsid,\n\toptions: {\n\t\tparams: TParams;\n\t\treadonly message: TMessage;\n\t},\n): XRPCSubscriptionMetadata\u003cTParams, TMessage, TNsid\u003e =\u003e {\n\t// `message` can be a getter, and we'd have to resolve that getter.\n\n\treturn {\n\t\tkind: 'metadata',\n\t\ttype: 'xrpc_subscription',\n\t\tnsid: nsid,\n\t\tparams: options.params,\n\t\tget message() {\n\t\t\treturn lazyProperty(this, 'message', options.message);\n\t\t},\n\t};\n};\n","// #__NO_SIDE_EFFECTS__\nexport const lazyProperty = \u003cT\u003e(obj: object, prop: string | number | symbol, value: T): T =\u003e {\n\tObject.defineProperty(obj, prop, { value });\n\treturn value;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const lazy = \u003cT\u003e(getter: () =\u003e T): { readonly value: T } =\u003e {\n\treturn {\n\t\tget value() {\n\t\t\tconst value = getter();\n\t\t\treturn lazyProperty(this, 'value', value);\n\t\t},\n\t};\n};\n\nexport const isArray = Array.isArray;\n\n// #__NO_SIDE_EFFECTS__\nexport const isObject = (input: unknown): input is Record\u003cstring, unknown\u003e =\u003e {\n\treturn typeof input === 'object' \u0026\u0026 input !== null \u0026\u0026 !isArray(input);\n};\n\nexport const allowsEval = /*#__PURE__*/ lazy((): boolean =\u003e {\n\tif (typeof navigator !== 'undefined' \u0026\u0026 navigator?.userAgent?.includes('Cloudflare')) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst F = Function;\n\t\t// oxlint-disable-next-line no-new -- intentional check for Function constructor availability\n\t\tnew F('');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n});\n"],"version":3}
-3
vendor/esm.sh/@atcute/multibase@1.2.0/es2022/multibase.mjs
··· 1 - /* esm.sh - @atcute/multibase@1.2.0 */ 2 - var H=t=>Uint8Array.fromHex(t),N=t=>t.toHex();import{alloc as T,allocUnsafe as b}from"../../uint8array@1.1.1/es2022/uint8array.mjs";var w=(t,a,i)=>x=>{let e=(1<<a)-1,B="",o=0,r=0;for(let n=0;n<x.length;++n)for(r=r<<8|x[n],o+=8;o>a;)o-=a,B+=t[e&r>>o];if(o!==0&&(B+=t[e&r<<a-o]),i)for(;(B.length*a&7)!==0;)B+="=";return B},E=(t,a,i)=>{let x={};for(let e=0;e<t.length;++e)x[t[e]]=e;return e=>{let B=e.length;for(;i&&e[B-1]==="=";)--B;let o=b(B*a/8|0),r=0,n=0,s=0;for(let f=0;f<B;++f){let l=x[e[f]];if(l===void 0)throw new SyntaxError("invalid base string");n=n<<a|l,r+=a,r>=8&&(r-=8,o[s++]=255&n>>r)}if(r>=a||(255&n<<8-r)!==0)throw new SyntaxError("unexpected end of data");return o}},_=t=>{if(t.length>=255)throw new RangeError("alphabet too long");let a=t.length,i=t.charAt(0),x=Math.log(256)/Math.log(a);return e=>{if(e.length===0)return"";let B=0,o=0,r=0,n=e.length;for(;r!==n&&e[r]===0;)r++,B++;let s=n-r,f=s*x+1>>>0,l=T(f);{let p=s%3,m=n-p;for(;r<m;){let d=e[r]<<16|e[r+1]<<8|e[r+2],A=0;for(let g=f-1;(d!==0||A<o)&&g!==-1;g--,A++)d=d+16777216*l[g],l[g]=d%a|0,d=d/a|0;o=A,r+=3}}for(;r!==n;){let p=e[r],m=0;for(let d=f-1;(p!==0||m<o)&&d!==-1;d--,m++)p=p+256*l[d],l[d]=p%a|0,p=p/a|0;o=m,r++}let c=f-o;for(;c!==f&&l[c]===0;)c++;let h=i.repeat(B);for(;c<f;++c)h+=t.charAt(l[c]);return h}},z=t=>{if(t.length>=255)throw new RangeError("alphabet too long");let a=new Uint8Array(128).fill(255);for(let o=0;o<t.length;o++){let r=t.charCodeAt(o);if(r>=128)throw new RangeError("non-ASCII character in alphabet");if(a[r]!==255)throw new RangeError(`${t[o]} is ambiguous`);a[r]=o}let i=t.length,x=i*i,e=t.charAt(0),B=Math.log(i)/Math.log(256);return o=>{if(o.length===0)return b(0);let r=0,n=0,s=0;for(;o[r]===e;)n++,r++;let f=o.length-r,l=f*B+1>>>0,c=T(l);{let m=f&1,d=o.length-m;for(;r<d;){let A=a[o.charCodeAt(r)],g=a[o.charCodeAt(r+1)];if(A===255||g===255)throw new Error("invalid string");let u=A*i+g,y=0;for(let C=l-1;(u!==0||y<s)&&C!==-1;C--,y++)u+=x*c[C],c[C]=u&255,u=(u-(u&255))/256;if(u!==0)throw new Error("non-zero carry");s=y,r+=2}}if(r<o.length){let m=a[o.charCodeAt(r)];if(m===255)throw new Error("invalid string");let d=0;for(let A=l-1;(m!==0||d<s)&&A!==-1;A--,d++)m+=i*c[A],c[A]=m&255,m=m>>>8;if(m!==0)throw new Error("non-zero carry");s=d}let h=l-s;for(;h!==l&&c[h]===0;)h++;if(h===n)return c;let p=b(n+(l-h));return p.fill(0,0,n),p.set(c.subarray(h),n),p}};var k="0123456789abcdef",D=E(k,4,!1),L=w(k,4,!1);var M="fromHex"in Uint8Array,rt=M?H:D,at=M?N:L;var I=t=>Uint8Array.fromBase64(t,{alphabet:"base64",lastChunkHandling:"loose"}),O=t=>t.toBase64({alphabet:"base64",omitPadding:!0}),j=t=>Uint8Array.fromBase64(t,{alphabet:"base64",lastChunkHandling:"strict"}),q=t=>t.toBase64({alphabet:"base64",omitPadding:!1}),F=t=>Uint8Array.fromBase64(t,{alphabet:"base64url",lastChunkHandling:"loose"}),V=t=>t.toBase64({alphabet:"base64url",omitPadding:!0}),G=t=>Uint8Array.fromBase64(t,{alphabet:"base64url",lastChunkHandling:"strict"}),J=t=>t.toBase64({alphabet:"base64url",omitPadding:!1});var S="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",R="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",K=E(S,6,!1),Q=w(S,6,!1),W=E(S,6,!0),X=w(S,6,!0),Y=E(R,6,!1),Z=w(R,6,!1),$=E(R,6,!0),tt=w(R,6,!0);var P="fromBase64"in Uint8Array,nt=P?I:K,st=P?O:Q,ft=P?j:W,lt=P?q:X,ct=P?F:Y,it=P?V:Z,Bt=P?G:$,dt=P?J:tt;import{allocUnsafe as ht}from"../../uint8array@1.1.1/es2022/uint8array.mjs";var xt="abcdefghijklmnopqrstuvwxyz234567",mt=(()=>{let t=new Uint8Array(32);for(let a=0;a<32;a++)t[a]=xt.charCodeAt(a);return t})(),v=String.fromCharCode,et=t=>{let a=t.length,i=a/5|0,x=a-i*5,e=mt,B="",o=0,r=i/2|0;for(let n=0;n<r;n++){let s=t[o],f=t[o+1],l=t[o+2],c=t[o+3],h=t[o+4],p=t[o+5],m=t[o+6],d=t[o+7],A=t[o+8],g=t[o+9];B+=v(e[s>>>3],e[(s<<2|f>>>6)&31],e[f>>>1&31],e[(f<<4|l>>>4)&31],e[(l<<1|c>>>7)&31],e[c>>>2&31],e[(c<<3|h>>>5)&31],e[h&31],e[p>>>3],e[(p<<2|m>>>6)&31],e[m>>>1&31],e[(m<<4|d>>>4)&31],e[(d<<1|A>>>7)&31],e[A>>>2&31],e[(A<<3|g>>>5)&31],e[g&31]),o+=10}if(i&1){let n=t[o],s=t[o+1],f=t[o+2],l=t[o+3],c=t[o+4];B+=v(e[n>>>3],e[(n<<2|s>>>6)&31],e[s>>>1&31],e[(s<<4|f>>>4)&31],e[(f<<1|l>>>7)&31],e[l>>>2&31],e[(l<<3|c>>>5)&31],e[c&31]),o+=5}if(x>0){let n=0,s=0;for(let f=o;f<a;f++)n=n<<8|t[f],s+=8;for(;s>=5;)s-=5,B+=v(e[n>>>s&31]);s>0&&(B+=v(e[n<<5-s&31]))}return B};var pt="abcdefghijklmnopqrstuvwxyz234567",U=(()=>{let t=new Uint8Array(128).fill(255);for(let a=0;a<32;a++)t[pt.charCodeAt(a)]=a;return t})(),At=t=>{let a=t.length,i=ht(a*5/8|0),x=0,e=0,B=a-a%8;for(;e<B;e+=8){let o=U[t.charCodeAt(e)],r=U[t.charCodeAt(e+1)],n=U[t.charCodeAt(e+2)],s=U[t.charCodeAt(e+3)],f=U[t.charCodeAt(e+4)],l=U[t.charCodeAt(e+5)],c=U[t.charCodeAt(e+6)],h=U[t.charCodeAt(e+7)];if((o|r|n|s|f|l|c|h)&224)throw new SyntaxError("invalid base string");i[x]=o<<3|r>>>2,i[x+1]=(r<<6|n<<1|s>>>4)&255,i[x+2]=(s<<4|f>>>1)&255,i[x+3]=(f<<7|l<<2|c>>>3)&255,i[x+4]=(c<<5|h)&255,x+=5}if(e<a){let o=0,r=0;for(;e<a;++e){let n=U[t.charCodeAt(e)];if(n&224)throw new SyntaxError("invalid base string");r=r<<5|n,o+=5,o>=8&&(o-=8,i[x++]=255&r>>o)}if(o>=5||(255&r<<8-o)!==0)throw new SyntaxError("unexpected end of data")}return i};var ot="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",gt=z(ot),Ut=_(ot);export{rt as fromBase16,At as fromBase32,gt as fromBase58Btc,nt as fromBase64,ft as fromBase64Pad,ct as fromBase64Url,Bt as fromBase64UrlPad,at as toBase16,et as toBase32,Ut as toBase58Btc,st as toBase64,lt as toBase64Pad,it as toBase64Url,dt as toBase64UrlPad}; 3 - //# sourceMappingURL=./multibase.mjs.map
-1
vendor/esm.sh/@atcute/multibase@1.2.0/es2022/multibase.mjs.map
··· 1 - {"mappings":"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","names":["fromBase16","str","toBase16","bytes","alloc","allocUnsafe","createRfc4648Encode","alphabet","bitsPerChar","pad","bytes","mask","str","bits","buffer","i","createRfc4648Decode","codes","end","written","value","createBtcBaseEncode","BASE","LEADER","iFACTOR","source","zeroes","length","pbegin","pend","dataLen","size","bN","rem","tripleEnd","carry","it1","it2","createBtcBaseDecode","BASE_MAP","xc","BASE2","FACTOR","psz","remaining","b256","pairEnd","c0","c1","it3","it4","vch","BASE16_CHARSET","fromBase16","createRfc4648Decode","toBase16","createRfc4648Encode","HAS_NATIVE_SUPPORT","fromBase16","toBase16","fromBase64","str","toBase64","bytes","fromBase64Pad","toBase64Pad","fromBase64Url","toBase64Url","fromBase64UrlPad","toBase64UrlPad","BASE64_CHARSET","BASE64URL_CHARSET","fromBase64","createRfc4648Decode","toBase64","createRfc4648Encode","fromBase64Pad","toBase64Pad","fromBase64Url","toBase64Url","fromBase64UrlPad","toBase64UrlPad","HAS_NATIVE_SUPPORT","fromBase64","toBase64","fromBase64Pad","toBase64Pad","fromBase64Url","toBase64Url","fromBase64UrlPad","toBase64UrlPad","allocUnsafe","ALPHABET","_cc","i","_fromCharCode","toBase32","bytes","len","full","rem","cc","str","ip","pairs","g","a0","a1","a2","a3","a4","b0","b1","b2","b3","b4","buffer","bits","ALPHABET","_decodeLut","i","fromBase32","str","end","bytes","allocUnsafe","written","fullGroups","c0","c1","c2","c3","c4","c5","c6","c7","bits","buffer","value","BASE58BTC_CHARSET","fromBase58Btc","createBtcBaseDecode","toBase58Btc","createBtcBaseEncode"],"sources":["../esm/npm/@atcute/multibase@1.2.0/node_modules/@atcute/multibase/lib/bases/base16-web-native.ts","../esm/npm/@atcute/multibase@1.2.0/node_modules/@atcute/multibase/lib/utils.ts","../esm/npm/@atcute/multibase@1.2.0/node_modules/@atcute/multibase/lib/bases/base16-web-polyfill.ts","../esm/npm/@atcute/multibase@1.2.0/node_modules/@atcute/multibase/lib/bases/base16-web.ts","../esm/npm/@atcute/multibase@1.2.0/node_modules/@atcute/multibase/lib/bases/base64-web-native.ts","../esm/npm/@atcute/multibase@1.2.0/node_modules/@atcute/multibase/lib/bases/base64-web-polyfill.ts","../esm/npm/@atcute/multibase@1.2.0/node_modules/@atcute/multibase/lib/bases/base64-web.ts","../esm/npm/@atcute/multibase@1.2.0/node_modules/@atcute/multibase/lib/bases/base32.ts","../esm/npm/@atcute/multibase@1.2.0/node_modules/@atcute/multibase/lib/bases/base32-encode.ts","../esm/npm/@atcute/multibase@1.2.0/node_modules/@atcute/multibase/lib/bases/base58.ts"],"sourcesContent":["export const fromBase16 = (str: string): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\treturn Uint8Array.fromHex(str) as Uint8Array\u003cArrayBuffer\u003e;\n};\n\nexport const toBase16 = (bytes: Uint8Array): string =\u003e {\n\treturn bytes.toHex();\n};\n","import { alloc, allocUnsafe } from '@atcute/uint8array';\n\nexport const createRfc4648Encode = (alphabet: string, bitsPerChar: number, pad: boolean) =\u003e {\n\treturn (bytes: Uint8Array): string =\u003e {\n\t\tconst mask = (1 \u003c\u003c bitsPerChar) - 1;\n\t\tlet str = '';\n\n\t\tlet bits = 0; // Number of bits currently in the buffer\n\t\tlet buffer = 0; // Bits waiting to be written out, MSB first\n\t\tfor (let i = 0; i \u003c bytes.length; ++i) {\n\t\t\t// Slurp data into the buffer:\n\t\t\tbuffer = (buffer \u003c\u003c 8) | bytes[i];\n\t\t\tbits += 8;\n\n\t\t\t// Write out as much as we can:\n\t\t\twhile (bits \u003e bitsPerChar) {\n\t\t\t\tbits -= bitsPerChar;\n\t\t\t\tstr += alphabet[mask \u0026 (buffer \u003e\u003e bits)];\n\t\t\t}\n\t\t}\n\n\t\t// Partial character:\n\t\tif (bits !== 0) {\n\t\t\tstr += alphabet[mask \u0026 (buffer \u003c\u003c (bitsPerChar - bits))];\n\t\t}\n\n\t\t// Add padding characters until we hit a byte boundary:\n\t\tif (pad) {\n\t\t\twhile (((str.length * bitsPerChar) \u0026 7) !== 0) {\n\t\t\t\tstr += '=';\n\t\t\t}\n\t\t}\n\n\t\treturn str;\n\t};\n};\n\nexport const createRfc4648Decode = (alphabet: string, bitsPerChar: number, pad: boolean) =\u003e {\n\t// Build the character lookup table:\n\tconst codes: Record\u003cstring, number\u003e = {};\n\tfor (let i = 0; i \u003c alphabet.length; ++i) {\n\t\tcodes[alphabet[i]] = i;\n\t}\n\n\treturn (str: string): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\t\t// Count the padding bytes:\n\t\tlet end = str.length;\n\t\t// oxlint-disable-next-line no-unmodified-loop-condition\n\t\twhile (pad \u0026\u0026 str[end - 1] === '=') {\n\t\t\t--end;\n\t\t}\n\n\t\t// Allocate the output:\n\t\tconst bytes = allocUnsafe(((end * bitsPerChar) / 8) | 0);\n\n\t\t// Parse the data:\n\t\tlet bits = 0; // Number of bits currently in the buffer\n\t\tlet buffer = 0; // Bits waiting to be written out, MSB first\n\t\tlet written = 0; // Next byte to write\n\t\tfor (let i = 0; i \u003c end; ++i) {\n\t\t\t// Read one character from the string:\n\t\t\tconst value = codes[str[i]];\n\t\t\tif (value === undefined) {\n\t\t\t\tthrow new SyntaxError(`invalid base string`);\n\t\t\t}\n\n\t\t\t// Append the bits to the buffer:\n\t\t\tbuffer = (buffer \u003c\u003c bitsPerChar) | value;\n\t\t\tbits += bitsPerChar;\n\n\t\t\t// Write out some bits if the buffer has a byte's worth:\n\t\t\tif (bits \u003e= 8) {\n\t\t\t\tbits -= 8;\n\t\t\t\tbytes[written++] = 0xff \u0026 (buffer \u003e\u003e bits);\n\t\t\t}\n\t\t}\n\n\t\t// Verify that we have received just enough bits:\n\t\tif (bits \u003e= bitsPerChar || (0xff \u0026 (buffer \u003c\u003c (8 - bits))) !== 0) {\n\t\t\tthrow new SyntaxError('unexpected end of data');\n\t\t}\n\n\t\treturn bytes;\n\t};\n};\n\nexport const createBtcBaseEncode = (alphabet: string) =\u003e {\n\tif (alphabet.length \u003e= 255) {\n\t\tthrow new RangeError(`alphabet too long`);\n\t}\n\n\tconst BASE = alphabet.length;\n\tconst LEADER = alphabet.charAt(0);\n\tconst iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n\n\treturn (source: Uint8Array): string =\u003e {\n\t\tif (source.length === 0) {\n\t\t\treturn '';\n\t\t}\n\n\t\t// Skip \u0026 count leading zeroes.\n\t\tlet zeroes = 0;\n\t\tlet length = 0;\n\t\tlet pbegin = 0;\n\t\tconst pend = source.length;\n\t\twhile (pbegin !== pend \u0026\u0026 source[pbegin] === 0) {\n\t\t\tpbegin++;\n\t\t\tzeroes++;\n\t\t}\n\n\t\t// Allocate enough space in big-endian base-N representation.\n\t\tconst dataLen = pend - pbegin;\n\t\tconst size = (dataLen * iFACTOR + 1) \u003e\u003e\u003e 0;\n\t\tconst bN = alloc(size);\n\n\t\t// Process 3 source bytes at a time where possible.\n\t\t// multiplier: 256^3 = 16777216. max carry: 16777216 * (BASE-1) + (BASE-1).\n\t\t// for BASE=58: 16777216 * 57 = 956301312, well within 2^32 - 1.\n\t\t{\n\t\t\tconst rem = dataLen % 3;\n\t\t\tconst tripleEnd = pend - rem;\n\n\t\t\twhile (pbegin \u003c tripleEnd) {\n\t\t\t\tlet carry = (source[pbegin] \u003c\u003c 16) | (source[pbegin + 1] \u003c\u003c 8) | source[pbegin + 2];\n\n\t\t\t\tlet i = 0;\n\t\t\t\tfor (let it1 = size - 1; (carry !== 0 || i \u003c length) \u0026\u0026 it1 !== -1; it1--, i++) {\n\t\t\t\t\tcarry = carry + 16777216 * bN[it1];\n\t\t\t\t\tbN[it1] = (carry % BASE) | 0;\n\t\t\t\t\tcarry = (carry / BASE) | 0;\n\t\t\t\t}\n\n\t\t\t\tlength = i;\n\t\t\t\tpbegin += 3;\n\t\t\t}\n\t\t}\n\n\t\t// Process remaining 0-2 bytes one at a time.\n\t\twhile (pbegin !== pend) {\n\t\t\tlet carry = source[pbegin];\n\n\t\t\tlet i = 0;\n\t\t\tfor (let it1 = size - 1; (carry !== 0 || i \u003c length) \u0026\u0026 it1 !== -1; it1--, i++) {\n\t\t\t\tcarry = carry + 256 * bN[it1];\n\t\t\t\tbN[it1] = (carry % BASE) | 0;\n\t\t\t\tcarry = (carry / BASE) | 0;\n\t\t\t}\n\n\t\t\tlength = i;\n\t\t\tpbegin++;\n\t\t}\n\n\t\t// Skip leading zeroes in base-N result.\n\t\tlet it2 = size - length;\n\t\twhile (it2 !== size \u0026\u0026 bN[it2] === 0) {\n\t\t\tit2++;\n\t\t}\n\n\t\t// Translate the result into a string.\n\t\tlet str = LEADER.repeat(zeroes);\n\t\tfor (; it2 \u003c size; ++it2) {\n\t\t\tstr += alphabet.charAt(bN[it2]);\n\t\t}\n\n\t\treturn str;\n\t};\n};\n\nexport const createBtcBaseDecode = (alphabet: string) =\u003e {\n\tif (alphabet.length \u003e= 255) {\n\t\tthrow new RangeError(`alphabet too long`);\n\t}\n\n\tconst BASE_MAP = new Uint8Array(128).fill(255);\n\tfor (let i = 0; i \u003c alphabet.length; i++) {\n\t\tconst xc = alphabet.charCodeAt(i);\n\n\t\tif (xc \u003e= 128) {\n\t\t\tthrow new RangeError(`non-ASCII character in alphabet`);\n\t\t}\n\t\tif (BASE_MAP[xc] !== 255) {\n\t\t\tthrow new RangeError(`${alphabet[i]} is ambiguous`);\n\t\t}\n\n\t\tBASE_MAP[xc] = i;\n\t}\n\n\tconst BASE = alphabet.length;\n\tconst BASE2 = BASE * BASE;\n\tconst LEADER = alphabet.charAt(0);\n\tconst FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n\n\treturn (source: string): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\t\tif (source.length === 0) {\n\t\t\treturn allocUnsafe(0);\n\t\t}\n\n\t\t// Skip and count leading leader characters.\n\t\tlet psz = 0;\n\t\tlet zeroes = 0;\n\t\tlet length = 0;\n\n\t\twhile (source[psz] === LEADER) {\n\t\t\tzeroes++;\n\t\t\tpsz++;\n\t\t}\n\n\t\t// Allocate enough space in big-endian base256 representation.\n\t\tconst remaining = source.length - psz;\n\t\tconst size = (remaining * FACTOR + 1) \u003e\u003e\u003e 0;\n\t\tconst b256 = alloc(size);\n\n\t\t// Process 2 source characters at a time where possible.\n\t\t// combined value: c0 * BASE + c1, multiplier: BASE^2.\n\t\t// max carry: BASE^2 * 255 + (BASE^2 - 1).\n\t\t// for BASE=58: 3364 * 255 + 3363 = 861183, well within safe integer range.\n\t\t{\n\t\t\tconst rem = remaining \u0026 1;\n\t\t\tconst pairEnd = source.length - rem;\n\n\t\t\twhile (psz \u003c pairEnd) {\n\t\t\t\tconst c0 = BASE_MAP[source.charCodeAt(psz)];\n\t\t\t\tconst c1 = BASE_MAP[source.charCodeAt(psz + 1)];\n\n\t\t\t\tif (c0 === 255 || c1 === 255) {\n\t\t\t\t\tthrow new Error(`invalid string`);\n\t\t\t\t}\n\n\t\t\t\tlet carry = c0 * BASE + c1;\n\n\t\t\t\tlet i = 0;\n\t\t\t\tfor (let it3 = size - 1; (carry !== 0 || i \u003c length) \u0026\u0026 it3 !== -1; it3--, i++) {\n\t\t\t\t\tcarry += BASE2 * b256[it3];\n\t\t\t\t\tb256[it3] = carry \u0026 0xff;\n\t\t\t\t\tcarry = (carry - (carry \u0026 0xff)) / 256;\n\t\t\t\t}\n\t\t\t\tif (carry !== 0) {\n\t\t\t\t\tthrow new Error('non-zero carry');\n\t\t\t\t}\n\t\t\t\tlength = i;\n\t\t\t\tpsz += 2;\n\t\t\t}\n\t\t}\n\n\t\t// Process remaining character if odd count.\n\t\tif (psz \u003c source.length) {\n\t\t\tlet carry = BASE_MAP[source.charCodeAt(psz)];\n\n\t\t\tif (carry === 255) {\n\t\t\t\tthrow new Error(`invalid string`);\n\t\t\t}\n\n\t\t\tlet i = 0;\n\t\t\tfor (let it3 = size - 1; (carry !== 0 || i \u003c length) \u0026\u0026 it3 !== -1; it3--, i++) {\n\t\t\t\tcarry += BASE * b256[it3];\n\t\t\t\tb256[it3] = carry \u0026 0xff;\n\t\t\t\tcarry = carry \u003e\u003e\u003e 8;\n\t\t\t}\n\t\t\tif (carry !== 0) {\n\t\t\t\tthrow new Error('non-zero carry');\n\t\t\t}\n\t\t\tlength = i;\n\t\t}\n\n\t\t// Skip leading zeroes in b256.\n\t\tlet it4 = size - length;\n\t\twhile (it4 !== size \u0026\u0026 b256[it4] === 0) {\n\t\t\tit4++;\n\t\t}\n\n\t\tif (it4 === zeroes) {\n\t\t\treturn b256;\n\t\t}\n\n\t\tconst vch = allocUnsafe(zeroes + (size - it4));\n\t\tvch.fill(0, 0, zeroes);\n\t\tvch.set(b256.subarray(it4), zeroes);\n\n\t\treturn vch;\n\t};\n};\n","// remove after September 2027\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/toHex\n\nimport { createRfc4648Decode, createRfc4648Encode } from '../utils.ts';\n\nconst BASE16_CHARSET = '0123456789abcdef';\n\nexport const fromBase16: (str: string) =\u003e Uint8Array\u003cArrayBuffer\u003e =\n\t/*#__PURE__*/ createRfc4648Decode(BASE16_CHARSET, 4, false);\nexport const toBase16: (bytes: Uint8Array) =\u003e string =\n\t/*#__PURE__*/ createRfc4648Encode(BASE16_CHARSET, 4, false);\n","import { fromBase16 as fromBase16Native, toBase16 as toBase16Native } from './base16-web-native.ts';\nimport { fromBase16 as fromBase16Polyfill, toBase16 as toBase16Polyfill } from './base16-web-polyfill.ts';\n\nconst HAS_NATIVE_SUPPORT = 'fromHex' in Uint8Array;\n\nexport const fromBase16 = !HAS_NATIVE_SUPPORT ? fromBase16Polyfill : fromBase16Native;\nexport const toBase16 = !HAS_NATIVE_SUPPORT ? toBase16Polyfill : toBase16Native;\n","// #region base64\nexport const fromBase64 = (str: string): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\treturn Uint8Array.fromBase64(str, {\n\t\talphabet: 'base64',\n\t\tlastChunkHandling: 'loose',\n\t}) as Uint8Array\u003cArrayBuffer\u003e;\n};\n\nexport const toBase64 = (bytes: Uint8Array): string =\u003e {\n\treturn bytes.toBase64({ alphabet: 'base64', omitPadding: true });\n};\n// #endregion\n\n// #region base64pad\nexport const fromBase64Pad = (str: string): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\treturn Uint8Array.fromBase64(str, {\n\t\talphabet: 'base64',\n\t\tlastChunkHandling: 'strict',\n\t}) as Uint8Array\u003cArrayBuffer\u003e;\n};\n\nexport const toBase64Pad = (bytes: Uint8Array): string =\u003e {\n\treturn bytes.toBase64({ alphabet: 'base64', omitPadding: false });\n};\n// #endregion\n\n// #region base64url\nexport const fromBase64Url = (str: string): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\treturn Uint8Array.fromBase64(str, {\n\t\talphabet: 'base64url',\n\t\tlastChunkHandling: 'loose',\n\t}) as Uint8Array\u003cArrayBuffer\u003e;\n};\n\nexport const toBase64Url = (bytes: Uint8Array): string =\u003e {\n\treturn bytes.toBase64({ alphabet: 'base64url', omitPadding: true });\n};\n// #endregion\n\n// #region base64urlpad\nexport const fromBase64UrlPad = (str: string): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\treturn Uint8Array.fromBase64(str, {\n\t\talphabet: 'base64url',\n\t\tlastChunkHandling: 'strict',\n\t}) as Uint8Array\u003cArrayBuffer\u003e;\n};\n\nexport const toBase64UrlPad = (bytes: Uint8Array): string =\u003e {\n\treturn bytes.toBase64({ alphabet: 'base64url', omitPadding: false });\n};\n// #endregion\n","// remove after September 2027\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/toBase64\n\nimport { createRfc4648Decode, createRfc4648Encode } from '../utils.ts';\n\nconst BASE64_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst BASE64URL_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n// #region base64\nexport const fromBase64: (str: string) =\u003e Uint8Array\u003cArrayBuffer\u003e =\n\t/*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, false);\nexport const toBase64: (bytes: Uint8Array) =\u003e string =\n\t/*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, false);\n// #endregion\n\n// #region base64pad\nexport const fromBase64Pad: (str: string) =\u003e Uint8Array\u003cArrayBuffer\u003e =\n\t/*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, true);\nexport const toBase64Pad: (bytes: Uint8Array) =\u003e string =\n\t/*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, true);\n// #endregion\n\n// #region base64url\nexport const fromBase64Url: (str: string) =\u003e Uint8Array\u003cArrayBuffer\u003e =\n\t/*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, false);\nexport const toBase64Url: (bytes: Uint8Array) =\u003e string =\n\t/*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, false);\n// #endregion\n\n// #region base64urlpad\nexport const fromBase64UrlPad: (str: string) =\u003e Uint8Array\u003cArrayBuffer\u003e =\n\t/*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, true);\nexport const toBase64UrlPad: (bytes: Uint8Array) =\u003e string =\n\t/*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, true);\n// #endregion\n","import {\n\tfromBase64 as fromBase64Native,\n\tfromBase64Pad as fromBase64PadNative,\n\tfromBase64Url as fromBase64UrlNative,\n\tfromBase64UrlPad as fromBase64UrlPadNative,\n\ttoBase64 as toBase64Native,\n\ttoBase64Pad as toBase64PadNative,\n\ttoBase64Url as toBase64UrlNative,\n\ttoBase64UrlPad as toBase64UrlPadNative,\n} from './base64-web-native.ts';\nimport {\n\tfromBase64Pad as fromBase64PadPolyfill,\n\tfromBase64 as fromBase64Polyfill,\n\tfromBase64UrlPad as fromBase64UrlPadPolyfill,\n\tfromBase64Url as fromBase64UrlPolyfill,\n\ttoBase64Pad as toBase64PadPolyfill,\n\ttoBase64 as toBase64Polyfill,\n\ttoBase64UrlPad as toBase64UrlPadPolyfill,\n\ttoBase64Url as toBase64UrlPolyfill,\n} from './base64-web-polyfill.ts';\n\nconst HAS_NATIVE_SUPPORT = 'fromBase64' in Uint8Array;\n\n// #region base64\nexport const fromBase64 = !HAS_NATIVE_SUPPORT ? fromBase64Polyfill : fromBase64Native;\nexport const toBase64 = !HAS_NATIVE_SUPPORT ? toBase64Polyfill : toBase64Native;\n// #endregion\n\n// #region base64pad\nexport const fromBase64Pad = !HAS_NATIVE_SUPPORT ? fromBase64PadPolyfill : fromBase64PadNative;\nexport const toBase64Pad = !HAS_NATIVE_SUPPORT ? toBase64PadPolyfill : toBase64PadNative;\n// #endregion\n\n// #region base64url\nexport const fromBase64Url = !HAS_NATIVE_SUPPORT ? fromBase64UrlPolyfill : fromBase64UrlNative;\nexport const toBase64Url = !HAS_NATIVE_SUPPORT ? toBase64UrlPolyfill : toBase64UrlNative;\n// #endregion\n\n// #region base64urlpad\nexport const fromBase64UrlPad = !HAS_NATIVE_SUPPORT ? fromBase64UrlPadPolyfill : fromBase64UrlPadNative;\nexport const toBase64UrlPad = !HAS_NATIVE_SUPPORT ? toBase64UrlPadPolyfill : toBase64UrlPadNative;\n// #endregion\n","import { allocUnsafe } from '@atcute/uint8array';\n\nexport { toBase32 } from '#bases/base32-encode';\n\nconst ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';\n\n// #region decode\n\n// charCode -\u003e 5-bit value lookup table, 0xff for invalid characters.\n// valid base32 chars: a-z (97-122) map to 0-25, 2-7 (50-55) map to 26-31.\nconst _decodeLut: Uint8Array = /*#__PURE__*/ (() =\u003e {\n\tconst t = new Uint8Array(128).fill(0xff);\n\tfor (let i = 0; i \u003c 32; i++) {\n\t\tt[ALPHABET.charCodeAt(i)] = i;\n\t}\n\treturn t;\n})();\n\n/**\n * decodes an unpadded RFC 4648 base32 (lowercase) string to a Uint8Array\n * @param str base32 encoded string\n * @returns decoded buffer\n * @throws {SyntaxError} on invalid characters or malformed trailing bits\n */\nexport const fromBase32 = (str: string): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\tconst end = str.length;\n\tconst bytes = allocUnsafe(((end * 5) / 8) | 0);\n\n\tlet written = 0;\n\tlet i = 0;\n\n\t// process 8-character groups (= 40 bits = 5 bytes each)\n\tconst fullGroups = end - (end % 8);\n\tfor (; i \u003c fullGroups; i += 8) {\n\t\tconst c0 = _decodeLut[str.charCodeAt(i)];\n\t\tconst c1 = _decodeLut[str.charCodeAt(i + 1)];\n\t\tconst c2 = _decodeLut[str.charCodeAt(i + 2)];\n\t\tconst c3 = _decodeLut[str.charCodeAt(i + 3)];\n\t\tconst c4 = _decodeLut[str.charCodeAt(i + 4)];\n\t\tconst c5 = _decodeLut[str.charCodeAt(i + 5)];\n\t\tconst c6 = _decodeLut[str.charCodeAt(i + 6)];\n\t\tconst c7 = _decodeLut[str.charCodeAt(i + 7)];\n\n\t\t// valid base32 values are 0-31 (5 bits), so any value with bits\n\t\t// outside the low 5 means 0xff was in the mix\n\t\tif ((c0 | c1 | c2 | c3 | c4 | c5 | c6 | c7) \u0026 0xe0) {\n\t\t\tthrow new SyntaxError(`invalid base string`);\n\t\t}\n\n\t\tbytes[written] = (c0 \u003c\u003c 3) | (c1 \u003e\u003e\u003e 2);\n\t\tbytes[written + 1] = ((c1 \u003c\u003c 6) | (c2 \u003c\u003c 1) | (c3 \u003e\u003e\u003e 4)) \u0026 0xff;\n\t\tbytes[written + 2] = ((c3 \u003c\u003c 4) | (c4 \u003e\u003e\u003e 1)) \u0026 0xff;\n\t\tbytes[written + 3] = ((c4 \u003c\u003c 7) | (c5 \u003c\u003c 2) | (c6 \u003e\u003e\u003e 3)) \u0026 0xff;\n\t\tbytes[written + 4] = ((c6 \u003c\u003c 5) | c7) \u0026 0xff;\n\t\twritten += 5;\n\t}\n\n\t// handle remaining 1-7 characters\n\tif (i \u003c end) {\n\t\tlet bits = 0;\n\t\tlet buffer = 0;\n\t\tfor (; i \u003c end; ++i) {\n\t\t\tconst value = _decodeLut[str.charCodeAt(i)];\n\t\t\tif (value \u0026 0xe0) {\n\t\t\t\tthrow new SyntaxError(`invalid base string`);\n\t\t\t}\n\t\t\tbuffer = (buffer \u003c\u003c 5) | value;\n\t\t\tbits += 5;\n\t\t\tif (bits \u003e= 8) {\n\t\t\t\tbits -= 8;\n\t\t\t\tbytes[written++] = 0xff \u0026 (buffer \u003e\u003e bits);\n\t\t\t}\n\t\t}\n\n\t\tif (bits \u003e= 5 || (0xff \u0026 (buffer \u003c\u003c (8 - bits))) !== 0) {\n\t\t\tthrow new SyntaxError(`unexpected end of data`);\n\t\t}\n\t}\n\n\treturn bytes;\n};\n\n// #endregion\n","const ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';\n\n// charCode lookup table: cc[i] = ALPHABET.charCodeAt(i) for i in 0..31\nconst _cc: Uint8Array = /*#__PURE__*/ (() =\u003e {\n\tconst t = new Uint8Array(32);\n\tfor (let i = 0; i \u003c 32; i++) {\n\t\tt[i] = ALPHABET.charCodeAt(i);\n\t}\n\treturn t;\n})();\n\nconst _fromCharCode = String.fromCharCode;\n\n/**\n * encodes a Uint8Array to an unpadded RFC 4648 base32 (lowercase) string\n * @param bytes source buffer\n * @returns base32 encoded string\n */\nexport const toBase32 = (bytes: Uint8Array): string =\u003e {\n\tconst len = bytes.length;\n\tconst full = (len / 5) | 0;\n\tconst rem = len - full * 5;\n\tconst cc = _cc;\n\n\tlet str = '';\n\tlet ip = 0;\n\n\t// process pairs of 5-byte groups (10 bytes → 16 base32 chars) at a time,\n\t// batching into a single String.fromCharCode call for fewer string concats\n\tconst pairs = (full / 2) | 0;\n\tfor (let g = 0; g \u003c pairs; g++) {\n\t\tconst a0 = bytes[ip],\n\t\t\ta1 = bytes[ip + 1],\n\t\t\ta2 = bytes[ip + 2],\n\t\t\ta3 = bytes[ip + 3],\n\t\t\ta4 = bytes[ip + 4];\n\t\tconst b0 = bytes[ip + 5],\n\t\t\tb1 = bytes[ip + 6],\n\t\t\tb2 = bytes[ip + 7],\n\t\t\tb3 = bytes[ip + 8],\n\t\t\tb4 = bytes[ip + 9];\n\n\t\tstr += _fromCharCode(\n\t\t\tcc[a0 \u003e\u003e\u003e 3],\n\t\t\tcc[((a0 \u003c\u003c 2) | (a1 \u003e\u003e\u003e 6)) \u0026 0x1f],\n\t\t\tcc[(a1 \u003e\u003e\u003e 1) \u0026 0x1f],\n\t\t\tcc[((a1 \u003c\u003c 4) | (a2 \u003e\u003e\u003e 4)) \u0026 0x1f],\n\t\t\tcc[((a2 \u003c\u003c 1) | (a3 \u003e\u003e\u003e 7)) \u0026 0x1f],\n\t\t\tcc[(a3 \u003e\u003e\u003e 2) \u0026 0x1f],\n\t\t\tcc[((a3 \u003c\u003c 3) | (a4 \u003e\u003e\u003e 5)) \u0026 0x1f],\n\t\t\tcc[a4 \u0026 0x1f],\n\t\t\tcc[b0 \u003e\u003e\u003e 3],\n\t\t\tcc[((b0 \u003c\u003c 2) | (b1 \u003e\u003e\u003e 6)) \u0026 0x1f],\n\t\t\tcc[(b1 \u003e\u003e\u003e 1) \u0026 0x1f],\n\t\t\tcc[((b1 \u003c\u003c 4) | (b2 \u003e\u003e\u003e 4)) \u0026 0x1f],\n\t\t\tcc[((b2 \u003c\u003c 1) | (b3 \u003e\u003e\u003e 7)) \u0026 0x1f],\n\t\t\tcc[(b3 \u003e\u003e\u003e 2) \u0026 0x1f],\n\t\t\tcc[((b3 \u003c\u003c 3) | (b4 \u003e\u003e\u003e 5)) \u0026 0x1f],\n\t\t\tcc[b4 \u0026 0x1f],\n\t\t);\n\t\tip += 10;\n\t}\n\n\t// remaining full group if odd count\n\tif (full \u0026 1) {\n\t\tconst b0 = bytes[ip],\n\t\t\tb1 = bytes[ip + 1],\n\t\t\tb2 = bytes[ip + 2],\n\t\t\tb3 = bytes[ip + 3],\n\t\t\tb4 = bytes[ip + 4];\n\n\t\tstr += _fromCharCode(\n\t\t\tcc[b0 \u003e\u003e\u003e 3],\n\t\t\tcc[((b0 \u003c\u003c 2) | (b1 \u003e\u003e\u003e 6)) \u0026 0x1f],\n\t\t\tcc[(b1 \u003e\u003e\u003e 1) \u0026 0x1f],\n\t\t\tcc[((b1 \u003c\u003c 4) | (b2 \u003e\u003e\u003e 4)) \u0026 0x1f],\n\t\t\tcc[((b2 \u003c\u003c 1) | (b3 \u003e\u003e\u003e 7)) \u0026 0x1f],\n\t\t\tcc[(b3 \u003e\u003e\u003e 2) \u0026 0x1f],\n\t\t\tcc[((b3 \u003c\u003c 3) | (b4 \u003e\u003e\u003e 5)) \u0026 0x1f],\n\t\t\tcc[b4 \u0026 0x1f],\n\t\t);\n\t\tip += 5;\n\t}\n\n\t// handle remaining 1-4 bytes\n\tif (rem \u003e 0) {\n\t\tlet buffer = 0;\n\t\tlet bits = 0;\n\t\tfor (let i = ip; i \u003c len; i++) {\n\t\t\tbuffer = (buffer \u003c\u003c 8) | bytes[i];\n\t\t\tbits += 8;\n\t\t}\n\t\twhile (bits \u003e= 5) {\n\t\t\tbits -= 5;\n\t\t\tstr += _fromCharCode(cc[(buffer \u003e\u003e\u003e bits) \u0026 0x1f]);\n\t\t}\n\t\tif (bits \u003e 0) {\n\t\t\tstr += _fromCharCode(cc[(buffer \u003c\u003c (5 - bits)) \u0026 0x1f]);\n\t\t}\n\t}\n\n\treturn str;\n};\n","import { createBtcBaseDecode, createBtcBaseEncode } from '../utils.ts';\n\nconst BASE58BTC_CHARSET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\nexport const fromBase58Btc: (source: string) =\u003e Uint8Array\u003cArrayBuffer\u003e =\n\t/*#__PURE__*/ createBtcBaseDecode(BASE58BTC_CHARSET);\n\nexport const toBase58Btc: (source: Uint8Array) =\u003e string =\n\t/*#__PURE__*/ createBtcBaseEncode(BASE58BTC_CHARSET);\n"],"version":3}
-3
vendor/esm.sh/@atcute/oauth-browser-client@3.0.0/es2022/oauth-browser-client.mjs
··· 1 - /* esm.sh - @atcute/oauth-browser-client@3.0.0 */ 2 - var b=typeof navigator<"u"?navigator.locks:void 0;var ee=t=>{if(t!=null){let e=JSON.parse(t);if(e!=null)return e}return{}},M=({name:t})=>{let e=new AbortController,r=e.signal,s=(o,i,a=!1)=>{let n,u=`${t}:${o}`,h=()=>n&&localStorage.setItem(u,JSON.stringify(n)),d=()=>{if(r.aborted)throw new Error("store closed");return n??=ee(localStorage.getItem(u))};{let p=c=>{c.key===u&&(n=void 0)};globalThis.addEventListener("storage",p,{signal:r})}{let p=async c=>{if(!c||r.aborted||(await new Promise(l=>setTimeout(l,1e4)),r.aborted))return;let f=Date.now(),y=!1;d();for(let l in n){let S=n[l].expiresAt;S!==null&&f>S&&(y=!0,delete n[l])}y&&h()};b?b.request(`${u}:cleanup`,{ifAvailable:!0},p):p(!0)}return{get(p){d();let c=n[p];if(!c)return;let f=c.expiresAt;if(f!==null&&Date.now()>f){delete n[p],h();return}return c.value},getWithLapsed(p){d();let c=n[p],f=Date.now();if(!c)return[void 0,1/0];let y=c.updatedAt;return y===void 0?[c.value,1/0]:[c.value,f-y]},set(p,c){d();let f={value:c,expiresAt:i(c),updatedAt:a?Date.now():void 0};n[p]=f,h()},delete(p){d(),n[p]!==void 0&&(delete n[p],h())},keys(){return d(),Object.keys(n)}}};return{dispose:()=>{e.abort()},sessions:s("sessions",({token:o})=>o.refresh?null:o.expires_at??null),states:s("states",o=>Date.now()+600*1e3),dpopNonces:s("dpopNonces",o=>Date.now()+1440*60*1e3,!0),inflightDpop:new Map}};var A,P,T,w,$,te=t=>{({identityResolver:$,fetchClientAssertion:T}=t),{client_id:A,redirect_uri:P}=t.metadata,w=M({name:t.storageName??"atcute-oauth"})};var x=class extends Error{name="LoginError"},I=class extends Error{name="AuthorizationError"},m=class extends Error{name="ResolverError"},v=class extends Error{sub;name="TokenRefreshError";constructor(e,r,s){super(r,s),this.sub=e}},E=class extends Error{response;data;name="OAuthResponseError";error;description;constructor(e,r){let s=W(B(r)?.error),o=W(B(r)?.error_description),i=s?`"${s}"`:"unknown",a=o?`: ${o}`:"",n=`OAuth ${i} error${a}`;super(n),this.response=e,this.data=r,this.error=s,this.description=o}get status(){return this.response.status}get headers(){return this.response.headers}},j=class extends Error{response;status;name="FetchResponseError";constructor(e,r,s){super(s),this.response=e,this.status=r}},W=t=>typeof t=="string"?t:void 0,B=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0;import{generateDpopKey as ye,generatePkce as ge}from"../../oauth-crypto@0.1.0/es2022/oauth-crypto.mjs";import{nanoid as _e}from"../../../nanoid@5.1.7/es2022/nanoid.mjs";var k=t=>t.get("content-type")?.split(";")[0];var re="parse"in URL,H=t=>{let e=null;if(re)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null?e.protocol==="https:"||e.protocol==="http:":!1};var L=async t=>{let e=await $.resolve(t);return{identity:e,metadata:await G(e.pds)}},J=async t=>{try{return{metadata:await G(t)}}catch(e){if(e instanceof m)try{return{metadata:await V(t)}}catch{}throw e}},se=async t=>{let e=new URL("/.well-known/oauth-protected-resource",t),r=await fetch(e.href,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||k(r.headers)!=="application/json")throw new m("unexpected response");let s=await r.json();if(s.resource!==e.origin)throw new m("unexpected issuer");return s},V=async t=>{let e=new URL("/.well-known/oauth-authorization-server",t),r=await fetch(e.href,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||k(r.headers)!=="application/json")throw new m("unexpected response");let s=await r.json();if(s.issuer!==e.origin)throw new m("unexpected issuer");if(!H(s.authorization_endpoint))throw new m("authorization server provided incorrect authorization endpoint");if(!s.client_id_metadata_document_supported)throw new m("authorization server does not support 'client_id_metadata_document'");if(!s.pushed_authorization_request_endpoint)throw new m("authorization server does not support 'pushed_authorization request'");if(s.response_types_supported&&!s.response_types_supported.includes("code"))throw new m("authorization server does not support 'code' response type");return s},G=async t=>{let e=await se(t);if(e.authorization_servers?.length!==1)throw new m("expected exactly one authorization server in the listing");let r=e.authorization_servers[0],s=await V(r);if(s.protected_resources&&!s.protected_resources.includes(e.resource))throw new m("server is not in authorization server's jurisdiction");return s};import{createDpopProofSigner as ae}from"../../oauth-crypto@0.1.0/es2022/oauth-crypto.mjs";import{createDpopProofSigner as oe,sha256Base64Url as ne}from"../../oauth-crypto@0.1.0/es2022/oauth-crypto.mjs";var U=(t,e)=>{let r=w.dpopNonces,s=w.inflightDpop,o=oe(t);return async(i,a)=>{let n=new Request(i,a),u=n.headers.get("authorization"),h=u?.startsWith("DPoP ")?await ne(u.slice(5)):void 0,{method:d,url:p}=n,{origin:c,pathname:f}=new URL(p),y=c+f,l=s.get(c);l&&(await l.promise,l=void 0);let z,S=!1;try{let[D,g]=r.getWithLapsed(c);z=D,S=g>180*1e3}catch{}S&&s.set(c,l=Promise.withResolvers());let R;try{let D=await o(d,y,z,h);n.headers.set("dpop",D);let g=await fetch(n);if(R=g.headers.get("dpop-nonce"),R===null||R===z)return g;try{r.set(c,R)}catch{}if(!await ie(g,e)||i===n||a?.body instanceof ReadableStream)return g}finally{l&&(s.delete(c),l.resolve())}{let D=await o(d,y,R,h),g=new Request(i,a);g.headers.set("dpop",D);let C=await fetch(g),O=C.headers.get("dpop-nonce");if(O!==null&&O!==R)try{r.set(c,O)}catch{}return C}}},ie=async(t,e)=>{if((e===void 0||e===!1)&&t.status===401){let r=t.headers.get("www-authenticate");if(r?.startsWith("DPoP"))return r.includes('error="use_dpop_nonce"')}if((e===void 0||e===!0)&&t.status===400&&k(t.headers)==="application/json")try{let r=await t.clone().json();return typeof r=="object"&&r?.error==="use_dpop_nonce"}catch{return!1}return!1};var Q=(t,e)=>{let r={};for(let s=0,o=e.length;s<o;s++){let i=e[s];r[i]=t[i]}return r};var _=class{#t;#e;#r;constructor(e,r){this.#e=e,this.#r=r,this.#t=U(r,!0)}async request(e,r){let s=this.#e[`${e}_endpoint`];if(!s)throw new Error(`no endpoint for ${e}`);if((e==="token"||e==="pushed_authorization_request")&&T!==void 0){let a=ae(this.#r),n=await T({aud:this.#e.issuer,createDpopProof:async(u,h)=>await a("POST",u,h,void 0)});r={...r,...n}}let o=await this.#t(s,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({...r,client_id:A})});if(k(o.headers)!=="application/json")throw new j(o,2,"unexpected content-type");let i=await o.json();if(o.ok)return i;throw new E(o,i)}async revoke(e){try{await this.request("revocation",{token:e})}catch{}}async exchangeCode(e,r){let s=await this.request("token",{grant_type:"authorization_code",redirect_uri:P,code:e,code_verifier:r});try{return await this.#o(s)}catch(o){throw await this.revoke(s.access_token),o}}async refresh({sub:e,token:r}){if(!r.refresh)throw new v(e,"no refresh token available");let s=await this.request("token",{grant_type:"refresh_token",refresh_token:r.refresh});try{if(e!==s.sub)throw new v(e,`sub mismatch in token response; got ${s.sub}`);return this.#s(s)}catch(o){throw await this.revoke(s.access_token),o}}#s(e){if(!e.sub)throw new TypeError("missing sub field in token response");if(!e.scope)throw new TypeError("missing scope field in token response");if(e.token_type!=="DPoP")throw new TypeError("token response returned a non-dpop token");return{scope:e.scope,refresh:e.refresh_token,access:e.access_token,type:e.token_type,expires_at:typeof e.expires_in=="number"?Date.now()+e.expires_in*1e3:void 0}}async#o(e){let r=e.sub;if(!r)throw new TypeError("missing sub field in token response");let s=this.#s(e),o=await L(r);if(o.metadata.issuer!==this.#e.issuer)throw new TypeError(`issuer mismatch; got ${o.metadata.issuer}`);return{token:s,info:{sub:r,aud:o.identity.pds,server:Q(o.metadata,["issuer","authorization_endpoint","introspection_endpoint","pushed_authorization_request_endpoint","revocation_endpoint","token_endpoint"])}}}};import{fromBase64Url as ce}from"../../multibase@1.2.0/es2022/multibase.mjs";var pe={name:"ECDSA",namedCurve:"P-256"},X=t=>typeof t.key=="string"&&typeof t.jwt=="string",Y=async t=>{let e=ce(t.key),r=await crypto.subtle.importKey("pkcs8",e,pe,!0,["sign"]),s=await crypto.subtle.exportKey("jwk",r);return s.alg="ES256",s};var q=new Map,K=async(t,e)=>{e?.signal?.throwIfAborted();let r=we;e?.noCache?r=le:e?.allowStale&&(r=de);let s;for(;s=q.get(t);){try{let{isFresh:n,value:u}=await s;if(n||r(u))return u}catch{}e?.signal?.throwIfAborted()}let o=async()=>{let n=await me(t,w.sessions.get(t));if(n&&r(n))return{isFresh:!1,value:n};let u=await he(t,n);return await F(t,u),{isFresh:!0,value:u}},i;if(b?i=b.request(`atcute-oauth:${t}`,o):i=o(),i=i.finally(()=>q.delete(t)),q.has(t))throw new Error("concurrent request for the same key");q.set(t,i);let{value:a}=await i;return a},F=async(t,e)=>{try{w.sessions.set(t,e)}catch(r){throw await fe(e),r}},N=t=>{w.sessions.delete(t)},ue=()=>w.sessions.keys(),de=()=>!0,le=()=>!1,he=async(t,e)=>{if(e===void 0)throw new v(t,"session deleted by another tab");let{dpopKey:r,info:s,token:o}=e,i=new _(s.server,r);try{let a=await i.refresh({sub:s.sub,token:o});return{dpopKey:r,info:s,token:a}}catch(a){throw a instanceof E&&a.status===400&&a.error==="invalid_grant"?new v(t,"session was revoked",{cause:a}):a}},fe=async({dpopKey:t,info:e,token:r})=>{await new _(e.server,t).revoke(r.refresh??r.access)},we=({token:t})=>{let e=t.expires_at;return e==null||Date.now()+6e4<=e},me=async(t,e)=>{if(!e||!X(e.dpopKey))return e;let r=await Y(e.dpopKey),s={...e,dpopKey:r};try{w.sessions.set(t,s)}catch{}return s};var ct=async t=>{let{target:e,scope:r,state:s=null,...o}=t,i;switch(e.type){case"account":{i=await L(e.identifier);break}case"pds":i=await J(e.serviceUrl)}let{identity:a,metadata:n}=i,u=a?a.handle!=="handle.invalid"?a.handle:a.did:void 0,h=_e(24),d=await ge(),p=await ye(["ES256"]),c={display:o.display,ui_locales:o.locale,prompt:o.prompt,redirect_uri:P,code_challenge:d.challenge,code_challenge_method:d.method,state:h,login_hint:u,response_mode:"fragment",response_type:"code",scope:r};w.states.set(h,{dpopKey:p,metadata:n,verifier:d.verifier,state:s});let y=await new _(n,p).request("pushed_authorization_request",c),l=new URL(n.authorization_endpoint);return l.searchParams.set("client_id",A),l.searchParams.set("request_uri",y.request_uri),l},pt=async t=>{let e=t.get("iss"),r=t.get("state"),s=t.get("code"),o=t.get("error");if(!r||!(s||o))throw new x("missing parameters");let i=w.states.get(r);if(i)w.states.delete(r);else throw new x("unknown state provided");if(o)throw new I(t.get("error_description")||o);if(!s)throw new x("missing code parameter");let a=i.dpopKey,n=i.metadata,u=i.state??null;if(e===null)throw new x("missing issuer parameter");if(e!==n.issuer)throw new x("issuer mismatch");let h=new _(n,a),{info:d,token:p}=await h.exchangeCode(s,i.verifier),c=d.sub,f={dpopKey:a,info:d,token:p};return await F(c,f),{session:f,state:u}};var Z=class{session;#t;#e;constructor(e){this.session=e,this.#t=U(e.dpopKey,!1)}get sub(){return this.session.info.sub}getSession(e){let r=K(this.session.info.sub,e);return r.then(s=>{this.session=s}).finally(()=>{this.#e=void 0}),this.#e=r}async signOut(){let e=this.session.info.sub;try{let{dpopKey:r,info:s,token:o}=await K(e,{allowStale:!0});await new _(s.server,r).revoke(o.refresh??o.access)}finally{N(e)}}async handle(e,r){await this.#e;let s=new Headers(r?.headers),o=this.session,i=new URL(e,o.info.aud);s.set("authorization",`${o.token.type} ${o.token.access}`);let a=await this.#t(i.href,{...r,headers:s});if(!xe(a))return a;try{this.#e?o=await this.#e:o=await this.getSession()}catch{return a}return r?.body instanceof ReadableStream?a:(i=new URL(e,o.info.aud),s.set("authorization",`${o.token.type} ${o.token.access}`),await this.#t(i.href,{...r,headers:s}))}},xe=t=>{if(t.status!==401)return!1;let e=t.headers.get("www-authenticate");return e!=null&&(e.startsWith("Bearer ")||e.startsWith("DPoP "))&&e.includes('error="invalid_token"')};export{I as AuthorizationError,j as FetchResponseError,x as LoginError,E as OAuthResponseError,Z as OAuthUserAgent,m as ResolverError,v as TokenRefreshError,te as configureOAuth,ct as createAuthorizationUrl,N as deleteStoredSession,pt as finalizeAuthorization,K as getSession,ue as listStoredSessions}; 3 - //# sourceMappingURL=./oauth-browser-client.mjs.map
-1
vendor/esm.sh/@atcute/oauth-browser-client@3.0.0/es2022/oauth-browser-client.mjs.map
··· 1 - {"mappings":"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","names":["locks","parse","raw","parsed","createOAuthDatabase","name","controller","signal","createStore","subname","expiresAt","persistUpdatedAt","store","storageKey","persist","read","listener","ev","cleanup","lock","resolve","now","changed","key","locks","item","updatedAt","value","token","_item","CLIENT_ID","REDIRECT_URI","fetchClientAssertion","database","identityResolver","configureOAuth","options","createOAuthDatabase","LoginError","AuthorizationError","ResolverError","TokenRefreshError","sub","message","options","OAuthResponseError","response","data","error","ifString","ifObject","errorDescription","messageError","messageDesc","FetchResponseError","status","v","generateDpopKey","generatePkce","nanoid","extractContentType","headers","isUrlParseSupported","isValidUrl","urlString","url","resolveFromIdentifier","ident","identity","identityResolver","getMetadataFromResourceServer","resolveFromService","host","err","ResolverError","getOAuthAuthorizationServerMetadata","getOAuthProtectedResourceMetadata","url","response","extractContentType","metadata","isValidUrl","input","rs_metadata","issuer","as_metadata","createDpopProofSigner","createDpopProofSigner","sha256Base64Url","createDPoPFetch","dpopKey","isAuthServer","nonces","database","pending","sign","createDpopProofSigner","input","init","request","authorizationHeader","ath","sha256Base64Url","method","url","origin","pathname","htu","deferred","initNonce","expiredOrMissing","nonce","lapsed","nextNonce","initProof","initResponse","isUseDpopNonceError","nextProof","nextRequest","retryResponse","retryNonce","response","wwwAuth","extractContentType","json","pick","obj","keys","cloned","idx","len","key","OAuthServerAgent","#fetch","#metadata","#dpopKey","metadata","dpopKey","createDPoPFetch","endpoint","payload","url","fetchClientAssertion","sign","createDpopProofSigner","assertion","nonce","response","CLIENT_ID","extractContentType","FetchResponseError","json","OAuthResponseError","token","code","verifier","REDIRECT_URI","#processExchangeResponse","err","sub","TokenRefreshError","#processTokenResponse","res","resolved","resolveFromIdentifier","pick","fromBase64Url","ES256_ALG","isLegacyDpopKey","key","migrateLegacyDpopKey","pkcs8","cryptoKey","jwk","pending","getSession","sub","options","allowStored","isTokenUsable","returnFalse","returnTrue","previousExecutionFlow","isFresh","value","run","storedSession","migrateSessionIfNeeded","database","newSession","refreshToken","storeSession","promise","locks","err","onRefreshError","deleteStoredSession","listStoredSessions","TokenRefreshError","dpopKey","info","token","server","OAuthServerAgent","newToken","cause","OAuthResponseError","expires","session","isLegacyDpopKey","migrateLegacyDpopKey","migrated","createAuthorizationUrl","options","target","scope","state","reqs","resolved","resolveFromIdentifier","resolveFromService","identity","metadata","loginHint","sid","nanoid","pkce","generatePkce","dpopKey","generateDpopKey","params","REDIRECT_URI","database","response","OAuthServerAgent","authUrl","CLIENT_ID","finalizeAuthorization","issuer","code","error","LoginError","stored","AuthorizationError","server","info","token","sub","session","storeSession","OAuthUserAgent","#fetch","#getSessionPromise","session","createDPoPFetch","options","promise","getSession","sub","dpopKey","info","token","OAuthServerAgent","deleteStoredSession","pathname","init","headers","url","response","isInvalidTokenResponse","auth"],"sources":["../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/utils/runtime.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/store/db.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/environment.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/errors.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/agents/exchange.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/utils/response.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/utils/strings.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/resolvers.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/agents/server-agent.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/dpop.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/utils/misc.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/utils/dpop-key.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/agents/sessions.ts","../esm/npm/@atcute/oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/agents/user-agent.ts"],"sourcesContent":["export const locks: LockManager | undefined = typeof navigator !== 'undefined' ? navigator.locks : undefined;\n","import type { Did } from '@atcute/lexicons';\nimport type { DpopPrivateJwk } from '@atcute/oauth-crypto';\nimport type { OAuthAuthorizationServerMetadata } from '@atcute/oauth-types';\n\nimport type { SimpleStore } from '../types/store.js';\nimport type { RawSession } from '../types/token.js';\nimport { locks } from '../utils/runtime.js';\n\nexport interface OAuthDatabaseOptions {\n\tname: string;\n}\n\ninterface SchemaItem\u003cT\u003e {\n\tvalue: T;\n\texpiresAt: number | null;\n\tupdatedAt?: number;\n}\n\ninterface Schema {\n\tsessions: {\n\t\tkey: Did;\n\t\tvalue: RawSession;\n\t\tindexes: {\n\t\t\texpiresAt: number;\n\t\t};\n\t};\n\tstates: {\n\t\tkey: string;\n\t\tvalue: {\n\t\t\tdpopKey: DpopPrivateJwk;\n\t\t\tmetadata: OAuthAuthorizationServerMetadata;\n\t\t\tverifier?: string;\n\t\t\tstate?: unknown;\n\t\t};\n\t};\n\n\tdpopNonces: {\n\t\tkey: string;\n\t\tvalue: string;\n\t};\n}\n\nconst parse = (raw: string | null) =\u003e {\n\tif (raw != null) {\n\t\tconst parsed = JSON.parse(raw);\n\t\tif (parsed != null) {\n\t\t\treturn parsed;\n\t\t}\n\t}\n\n\treturn {};\n};\n\nexport type OAuthDatabase = ReturnType\u003ctypeof createOAuthDatabase\u003e;\n\nexport const createOAuthDatabase = ({ name }: OAuthDatabaseOptions) =\u003e {\n\tconst controller = new AbortController();\n\tconst signal = controller.signal;\n\n\tconst createStore = \u003cN extends keyof Schema\u003e(\n\t\tsubname: N,\n\t\texpiresAt: (item: Schema[N]['value']) =\u003e null | number,\n\t\tpersistUpdatedAt = false,\n\t): SimpleStore\u003cSchema[N]['key'], Schema[N]['value']\u003e =\u003e {\n\t\tlet store: any;\n\n\t\tconst storageKey = `${name}:${subname}`;\n\n\t\tconst persist = () =\u003e store \u0026\u0026 localStorage.setItem(storageKey, JSON.stringify(store));\n\t\tconst read = () =\u003e {\n\t\t\tif (signal.aborted) {\n\t\t\t\tthrow new Error(`store closed`);\n\t\t\t}\n\n\t\t\treturn (store ??= parse(localStorage.getItem(storageKey)));\n\t\t};\n\n\t\t{\n\t\t\tconst listener = (ev: StorageEvent) =\u003e {\n\t\t\t\tif (ev.key === storageKey) {\n\t\t\t\t\tstore = undefined;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tglobalThis.addEventListener('storage', listener, { signal });\n\t\t}\n\n\t\t{\n\t\t\tconst cleanup = async (lock: Lock | true | null) =\u003e {\n\t\t\t\tif (!lock || signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait new Promise((resolve) =\u003e setTimeout(resolve, 10_000));\n\t\t\t\tif (signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet now = Date.now();\n\t\t\t\tlet changed = false;\n\n\t\t\t\tread();\n\n\t\t\t\tfor (const key in store) {\n\t\t\t\t\tconst item = store[key];\n\t\t\t\t\tconst expiresAt = item.expiresAt;\n\n\t\t\t\t\tif (expiresAt !== null \u0026\u0026 now \u003e expiresAt) {\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\tdelete store[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (changed) {\n\t\t\t\t\tpersist();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (locks) {\n\t\t\t\tlocks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup);\n\t\t\t} else {\n\t\t\t\tcleanup(true);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tget(key) {\n\t\t\t\tread();\n\n\t\t\t\tconst item: SchemaItem\u003cSchema[N]['value']\u003e = store[key];\n\t\t\t\tif (!item) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst expiresAt = item.expiresAt;\n\t\t\t\tif (expiresAt !== null \u0026\u0026 Date.now() \u003e expiresAt) {\n\t\t\t\t\tdelete store[key];\n\t\t\t\t\tpersist();\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\treturn item.value;\n\t\t\t},\n\t\t\tgetWithLapsed(key) {\n\t\t\t\tread();\n\n\t\t\t\tconst item: SchemaItem\u003cSchema[N]['value']\u003e = store[key];\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (!item) {\n\t\t\t\t\treturn [undefined, Infinity];\n\t\t\t\t}\n\n\t\t\t\tconst updatedAt = item.updatedAt;\n\t\t\t\tif (updatedAt === undefined) {\n\t\t\t\t\treturn [item.value, Infinity];\n\t\t\t\t}\n\n\t\t\t\treturn [item.value, now - updatedAt];\n\t\t\t},\n\t\t\tset(key, value) {\n\t\t\t\tread();\n\n\t\t\t\tconst item: SchemaItem\u003cSchema[N]['value']\u003e = {\n\t\t\t\t\tvalue: value,\n\t\t\t\t\texpiresAt: expiresAt(value),\n\t\t\t\t\tupdatedAt: persistUpdatedAt ? Date.now() : undefined,\n\t\t\t\t};\n\n\t\t\t\tstore[key] = item;\n\t\t\t\tpersist();\n\t\t\t},\n\t\t\tdelete(key) {\n\t\t\t\tread();\n\n\t\t\t\tif (store[key] !== undefined) {\n\t\t\t\t\tdelete store[key];\n\t\t\t\t\tpersist();\n\t\t\t\t}\n\t\t\t},\n\t\t\tkeys() {\n\t\t\t\tread();\n\n\t\t\t\treturn Object.keys(store);\n\t\t\t},\n\t\t};\n\t};\n\n\treturn {\n\t\tdispose: () =\u003e {\n\t\t\tcontroller.abort();\n\t\t},\n\n\t\tsessions: createStore('sessions', ({ token }) =\u003e {\n\t\t\tif (token.refresh) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn token.expires_at ?? null;\n\t\t}),\n\t\tstates: createStore('states', (_item) =\u003e Date.now() + 10 * 60 * 1_000), // 10 minutes\n\n\t\t// The reference PDS have nonces that expire after 3 minutes, while other\n\t\t// implementations can have varying expiration times.\n\t\t// Stored for 24 hours.\n\t\tdpopNonces: createStore('dpopNonces', (_item) =\u003e Date.now() + 24 * 60 * 60 * 1_000, true),\n\t\tinflightDpop: new Map\u003cstring, PromiseWithResolvers\u003cvoid\u003e\u003e(),\n\t};\n};\n","import type { ActorResolver } from '@atcute/identity-resolver';\n\nimport { createOAuthDatabase, type OAuthDatabase } from './store/db.js';\nimport type { ClientAssertionFetcher } from './types/client-assertion.js';\n\nexport let CLIENT_ID: string;\nexport let REDIRECT_URI: string;\n\nexport let fetchClientAssertion: ClientAssertionFetcher | undefined;\n\nexport let database: OAuthDatabase;\n\nexport let identityResolver: ActorResolver;\n\nexport interface ConfigureOAuthOptions {\n\t/**\n\t * client metadata, necessary to drive the whole request\n\t */\n\tmetadata: {\n\t\tclient_id: string;\n\t\tredirect_uri: string;\n\t};\n\n\t/** resolves actor identifiers into identity metadata */\n\tidentityResolver: ActorResolver;\n\n\t/**\n\t * optional function to fetch DPoP-bound client assertions from your backend.\n\t */\n\tfetchClientAssertion?: ClientAssertionFetcher;\n\n\t/**\n\t * name that will be used as prefix for storage keys needed to persist authentication.\n\t * @default \"atcute-oauth\"\n\t */\n\tstorageName?: string;\n}\n\nexport const configureOAuth = (options: ConfigureOAuthOptions) =\u003e {\n\t({ identityResolver, fetchClientAssertion } = options);\n\t({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata);\n\n\tdatabase = createOAuthDatabase({ name: options.storageName ?? 'atcute-oauth' });\n};\n","import type { Did } from '@atcute/lexicons';\n\nexport class LoginError extends Error {\n\toverride name = 'LoginError';\n}\n\nexport class AuthorizationError extends Error {\n\toverride name = 'AuthorizationError';\n}\n\nexport class ResolverError extends Error {\n\toverride name = 'ResolverError';\n}\n\nexport class TokenRefreshError extends Error {\n\toverride name = 'TokenRefreshError';\n\n\tconstructor(\n\t\tpublic readonly sub: Did,\n\t\tmessage: string,\n\t\toptions?: ErrorOptions,\n\t) {\n\t\tsuper(message, options);\n\t}\n}\n\nexport class OAuthResponseError extends Error {\n\toverride name = 'OAuthResponseError';\n\n\treadonly error: string | undefined;\n\treadonly description: string | undefined;\n\n\tconstructor(\n\t\tpublic readonly response: Response,\n\t\tpublic readonly data: any,\n\t) {\n\t\tconst error = ifString(ifObject(data)?.['error']);\n\t\tconst errorDescription = ifString(ifObject(data)?.['error_description']);\n\n\t\tconst messageError = error ? `\"${error}\"` : 'unknown';\n\t\tconst messageDesc = errorDescription ? `: ${errorDescription}` : '';\n\t\tconst message = `OAuth ${messageError} error${messageDesc}`;\n\n\t\tsuper(message);\n\n\t\tthis.error = error;\n\t\tthis.description = errorDescription;\n\t}\n\n\tget status() {\n\t\treturn this.response.status;\n\t}\n\n\tget headers() {\n\t\treturn this.response.headers;\n\t}\n}\n\nexport class FetchResponseError extends Error {\n\toverride name = 'FetchResponseError';\n\n\tconstructor(\n\t\tpublic readonly response: Response,\n\t\tpublic status: number,\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t}\n}\n\nconst ifString = (v: unknown): string | undefined =\u003e {\n\treturn typeof v === 'string' ? v : undefined;\n};\nconst ifObject = (v: unknown): Record\u003cstring, unknown\u003e | undefined =\u003e {\n\treturn typeof v === 'object' \u0026\u0026 v !== null \u0026\u0026 !Array.isArray(v) ? (v as any) : undefined;\n};\n","import type { ResolvedActor } from '@atcute/identity-resolver';\nimport type { ActorIdentifier } from '@atcute/lexicons';\nimport { generateDpopKey, generatePkce } from '@atcute/oauth-crypto';\nimport type { OAuthAuthorizationServerMetadata, OAuthPrompt } from '@atcute/oauth-types';\n\nimport { nanoid } from 'nanoid';\n\nimport { CLIENT_ID, database, REDIRECT_URI } from '../environment.js';\nimport { AuthorizationError, LoginError } from '../errors.js';\nimport { resolveFromIdentifier, resolveFromService } from '../resolvers.js';\nimport type { Session } from '../types/token.js';\n\nimport { OAuthServerAgent } from './server-agent.js';\nimport { storeSession } from './sessions.js';\n\nexport type AuthorizeTargetOptions =\n\t| { type: 'account'; identifier: ActorIdentifier }\n\t| { type: 'pds'; serviceUrl: string };\n\nexport interface AuthorizeOptions {\n\ttarget: AuthorizeTargetOptions;\n\tscope: string;\n\tstate?: unknown;\n\tprompt?: OAuthPrompt | (string \u0026 {});\n\tdisplay?: 'page' | 'popup' | 'touch' | 'wap';\n\tlocale?: string;\n}\n\n/**\n * Create authentication URL for authorization\n * @param options\n * @returns URL to redirect the user for authorization\n */\nexport const createAuthorizationUrl = async (options: AuthorizeOptions): Promise\u003cURL\u003e =\u003e {\n\tconst { target, scope, state = null, ...reqs } = options;\n\n\tlet resolved: { identity?: ResolvedActor; metadata: OAuthAuthorizationServerMetadata };\n\tswitch (target.type) {\n\t\tcase 'account': {\n\t\t\tresolved = await resolveFromIdentifier(target.identifier);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'pds': {\n\t\t\tresolved = await resolveFromService(target.serviceUrl);\n\t\t}\n\t}\n\n\tconst { identity, metadata } = resolved;\n\tconst loginHint = identity\n\t\t? identity.handle !== 'handle.invalid'\n\t\t\t? identity.handle\n\t\t\t: identity.did\n\t\t: undefined;\n\n\tconst sid = nanoid(24);\n\n\tconst pkce = await generatePkce();\n\tconst dpopKey = await generateDpopKey(['ES256']);\n\n\tconst params = {\n\t\tdisplay: reqs.display,\n\t\tui_locales: reqs.locale,\n\t\tprompt: reqs.prompt,\n\n\t\tredirect_uri: REDIRECT_URI,\n\t\tcode_challenge: pkce.challenge,\n\t\tcode_challenge_method: pkce.method,\n\t\tstate: sid,\n\t\tlogin_hint: loginHint,\n\t\tresponse_mode: 'fragment',\n\t\tresponse_type: 'code',\n\t\tscope: scope,\n\t} satisfies Record\u003cstring, string | undefined\u003e;\n\n\tdatabase.states.set(sid, {\n\t\tdpopKey: dpopKey,\n\t\tmetadata: metadata,\n\t\tverifier: pkce.verifier,\n\t\tstate: state,\n\t});\n\n\tconst server = new OAuthServerAgent(metadata, dpopKey);\n\tconst response = await server.request('pushed_authorization_request', params);\n\n\tconst authUrl = new URL(metadata.authorization_endpoint);\n\tauthUrl.searchParams.set('client_id', CLIENT_ID);\n\tauthUrl.searchParams.set('request_uri', response.request_uri);\n\n\treturn authUrl;\n};\n\n/**\n * Finalize authorization\n * @param params Search params\n * @returns Session object, which you can use to instantiate user agents\n */\nexport const finalizeAuthorization = async (params: URLSearchParams) =\u003e {\n\tconst issuer = params.get('iss');\n\tconst sid = params.get('state');\n\tconst code = params.get('code');\n\tconst error = params.get('error');\n\n\tif (!sid || !(code || error)) {\n\t\tthrow new LoginError(`missing parameters`);\n\t}\n\n\tconst stored = database.states.get(sid);\n\tif (stored) {\n\t\t// Delete now that we've caught it\n\t\tdatabase.states.delete(sid);\n\t} else {\n\t\tthrow new LoginError(`unknown state provided`);\n\t}\n\n\tif (error) {\n\t\tthrow new AuthorizationError(params.get('error_description') || error);\n\t}\n\tif (!code) {\n\t\tthrow new LoginError(`missing code parameter`);\n\t}\n\n\tconst dpopKey = stored.dpopKey;\n\tconst metadata = stored.metadata;\n\tconst state = stored.state ?? null;\n\n\tif (issuer === null) {\n\t\tthrow new LoginError(`missing issuer parameter`);\n\t} else if (issuer !== metadata.issuer) {\n\t\tthrow new LoginError(`issuer mismatch`);\n\t}\n\n\t// Retrieve authentication tokens\n\tconst server = new OAuthServerAgent(metadata, dpopKey);\n\tconst { info, token } = await server.exchangeCode(code, stored.verifier);\n\n\t// We're finished!\n\tconst sub = info.sub;\n\tconst session: Session = { dpopKey, info, token };\n\n\tawait storeSession(sub, session);\n\n\treturn { session, state };\n};\n","export const extractContentType = (headers: Headers): string | undefined =\u003e {\n\treturn headers.get('content-type')?.split(';')[0];\n};\n","const isUrlParseSupported = 'parse' in URL;\n\nexport const isValidUrl = (urlString: string): boolean =\u003e {\n\tlet url: URL | null = null;\n\tif (isUrlParseSupported) {\n\t\turl = URL.parse(urlString);\n\t} else {\n\t\ttry {\n\t\t\turl = new URL(urlString);\n\t\t} catch {}\n\t}\n\n\tif (url !== null) {\n\t\treturn url.protocol === 'https:' || url.protocol === 'http:';\n\t}\n\n\treturn false;\n};\n","import type { ResolvedActor } from '@atcute/identity-resolver';\nimport type { ActorIdentifier } from '@atcute/lexicons';\nimport type { OAuthAuthorizationServerMetadata, OAuthProtectedResourceMetadata } from '@atcute/oauth-types';\n\nimport { identityResolver } from './environment.js';\nimport { ResolverError } from './errors.js';\nimport { extractContentType } from './utils/response.js';\nimport { isValidUrl } from './utils/strings.js';\n\nexport const resolveFromIdentifier = async (\n\tident: ActorIdentifier,\n): Promise\u003c{ identity: ResolvedActor; metadata: OAuthAuthorizationServerMetadata }\u003e =\u003e {\n\tconst identity = await identityResolver.resolve(ident);\n\n\treturn {\n\t\tidentity: identity,\n\t\tmetadata: await getMetadataFromResourceServer(identity.pds),\n\t};\n};\n\nexport const resolveFromService = async (\n\thost: string,\n): Promise\u003c{ metadata: OAuthAuthorizationServerMetadata }\u003e =\u003e {\n\ttry {\n\t\tconst metadata = await getMetadataFromResourceServer(host);\n\t\treturn { metadata };\n\t} catch (err) {\n\t\tif (err instanceof ResolverError) {\n\t\t\ttry {\n\t\t\t\tconst metadata = await getOAuthAuthorizationServerMetadata(host);\n\t\t\t\treturn { metadata };\n\t\t\t} catch {}\n\t\t}\n\n\t\tthrow err;\n\t}\n};\n\nconst getOAuthProtectedResourceMetadata = async (host: string): Promise\u003cOAuthProtectedResourceMetadata\u003e =\u003e {\n\tconst url = new URL(`/.well-known/oauth-protected-resource`, host);\n\tconst response = await fetch(url.href, {\n\t\tredirect: 'manual',\n\t\theaders: {\n\t\t\taccept: 'application/json',\n\t\t},\n\t});\n\n\tif (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n\t\tthrow new ResolverError(`unexpected response`);\n\t}\n\n\tconst metadata = (await response.json()) as OAuthProtectedResourceMetadata;\n\tif (metadata.resource !== url.origin) {\n\t\tthrow new ResolverError(`unexpected issuer`);\n\t}\n\n\treturn metadata;\n};\n\nconst getOAuthAuthorizationServerMetadata = async (\n\thost: string,\n): Promise\u003cOAuthAuthorizationServerMetadata\u003e =\u003e {\n\tconst url = new URL(`/.well-known/oauth-authorization-server`, host);\n\tconst response = await fetch(url.href, {\n\t\tredirect: 'manual',\n\t\theaders: {\n\t\t\taccept: 'application/json',\n\t\t},\n\t});\n\n\tif (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n\t\tthrow new ResolverError(`unexpected response`);\n\t}\n\n\tconst metadata = (await response.json()) as OAuthAuthorizationServerMetadata;\n\tif (metadata.issuer !== url.origin) {\n\t\tthrow new ResolverError(`unexpected issuer`);\n\t}\n\tif (!isValidUrl(metadata.authorization_endpoint)) {\n\t\tthrow new ResolverError(`authorization server provided incorrect authorization endpoint`);\n\t}\n\tif (!metadata.client_id_metadata_document_supported) {\n\t\tthrow new ResolverError(`authorization server does not support 'client_id_metadata_document'`);\n\t}\n\tif (!metadata.pushed_authorization_request_endpoint) {\n\t\tthrow new ResolverError(`authorization server does not support 'pushed_authorization request'`);\n\t}\n\tif (metadata.response_types_supported) {\n\t\tif (!metadata.response_types_supported.includes('code')) {\n\t\t\tthrow new ResolverError(`authorization server does not support 'code' response type`);\n\t\t}\n\t}\n\n\treturn metadata;\n};\n\nconst getMetadataFromResourceServer = async (input: string) =\u003e {\n\tconst rs_metadata = await getOAuthProtectedResourceMetadata(input);\n\n\tif (rs_metadata.authorization_servers?.length !== 1) {\n\t\tthrow new ResolverError(`expected exactly one authorization server in the listing`);\n\t}\n\n\tconst issuer = rs_metadata.authorization_servers[0];\n\n\tconst as_metadata = await getOAuthAuthorizationServerMetadata(issuer);\n\n\tif (as_metadata.protected_resources) {\n\t\tif (!as_metadata.protected_resources.includes(rs_metadata.resource)) {\n\t\t\tthrow new ResolverError(`server is not in authorization server's jurisdiction`);\n\t\t}\n\t}\n\n\treturn as_metadata;\n};\n","import type { Did } from '@atcute/lexicons';\nimport { createDpopProofSigner, type DpopPrivateJwk } from '@atcute/oauth-crypto';\nimport type { AtprotoOAuthTokenResponse, OAuthParResponse } from '@atcute/oauth-types';\n\nimport { createDPoPFetch } from '../dpop.js';\nimport { CLIENT_ID, fetchClientAssertion, REDIRECT_URI } from '../environment.js';\nimport { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { resolveFromIdentifier } from '../resolvers.js';\nimport type { PersistedAuthorizationServerMetadata } from '../types/server.js';\nimport type { ExchangeInfo, TokenInfo } from '../types/token.js';\nimport { pick } from '../utils/misc.js';\nimport { extractContentType } from '../utils/response.js';\n\nexport class OAuthServerAgent {\n\t#fetch: typeof fetch;\n\t#metadata: PersistedAuthorizationServerMetadata;\n\t#dpopKey: DpopPrivateJwk;\n\n\tconstructor(metadata: PersistedAuthorizationServerMetadata, dpopKey: DpopPrivateJwk) {\n\t\tthis.#metadata = metadata;\n\t\tthis.#dpopKey = dpopKey;\n\t\tthis.#fetch = createDPoPFetch(dpopKey, true);\n\t}\n\n\tasync request(\n\t\tendpoint: 'pushed_authorization_request',\n\t\tpayload: Record\u003cstring, unknown\u003e,\n\t): Promise\u003cOAuthParResponse\u003e;\n\tasync request(endpoint: 'token', payload: Record\u003cstring, unknown\u003e): Promise\u003cAtprotoOAuthTokenResponse\u003e;\n\tasync request(endpoint: 'revocation', payload: Record\u003cstring, unknown\u003e): Promise\u003cany\u003e;\n\tasync request(endpoint: 'introspection', payload: Record\u003cstring, unknown\u003e): Promise\u003cany\u003e;\n\tasync request(endpoint: string, payload: Record\u003cstring, unknown\u003e): Promise\u003cany\u003e {\n\t\tconst url: string | undefined = (this.#metadata as any)[`${endpoint}_endpoint`];\n\t\tif (!url) {\n\t\t\tthrow new Error(`no endpoint for ${endpoint}`);\n\t\t}\n\n\t\tif (\n\t\t\t(endpoint === 'token' || endpoint === 'pushed_authorization_request') \u0026\u0026\n\t\t\tfetchClientAssertion !== undefined\n\t\t) {\n\t\t\tconst sign = createDpopProofSigner(this.#dpopKey);\n\n\t\t\tconst assertion = await fetchClientAssertion({\n\t\t\t\taud: this.#metadata.issuer,\n\t\t\t\tcreateDpopProof: async (url, nonce) =\u003e {\n\t\t\t\t\treturn await sign('POST', url, nonce, undefined);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tpayload = { ...payload, ...assertion };\n\t\t}\n\n\t\tconst response = await this.#fetch(url, {\n\t\t\tmethod: 'post',\n\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\tbody: JSON.stringify({ ...payload, client_id: CLIENT_ID }),\n\t\t});\n\n\t\tif (extractContentType(response.headers) !== 'application/json') {\n\t\t\tthrow new FetchResponseError(response, 2, `unexpected content-type`);\n\t\t}\n\n\t\tconst json = await response.json();\n\n\t\tif (response.ok) {\n\t\t\treturn json;\n\t\t} else {\n\t\t\tthrow new OAuthResponseError(response, json);\n\t\t}\n\t}\n\n\tasync revoke(token: string): Promise\u003cvoid\u003e {\n\t\ttry {\n\t\t\tawait this.request('revocation', { token: token });\n\t\t} catch {}\n\t}\n\n\tasync exchangeCode(code: string, verifier?: string): Promise\u003c{ info: ExchangeInfo; token: TokenInfo }\u003e {\n\t\tconst response = await this.request('token', {\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tredirect_uri: REDIRECT_URI,\n\t\t\tcode: code,\n\t\t\tcode_verifier: verifier,\n\t\t});\n\n\t\ttry {\n\t\t\treturn await this.#processExchangeResponse(response);\n\t\t} catch (err) {\n\t\t\tawait this.revoke(response.access_token);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync refresh({ sub, token }: { sub: Did; token: TokenInfo }): Promise\u003cTokenInfo\u003e {\n\t\tif (!token.refresh) {\n\t\t\tthrow new TokenRefreshError(sub, 'no refresh token available');\n\t\t}\n\n\t\tconst response = await this.request('token', {\n\t\t\tgrant_type: 'refresh_token',\n\t\t\trefresh_token: token.refresh,\n\t\t});\n\n\t\ttry {\n\t\t\tif (sub !== response.sub) {\n\t\t\t\tthrow new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`);\n\t\t\t}\n\n\t\t\treturn this.#processTokenResponse(response);\n\t\t} catch (err) {\n\t\t\tawait this.revoke(response.access_token);\n\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t#processTokenResponse(res: AtprotoOAuthTokenResponse): TokenInfo {\n\t\tif (!res.sub) {\n\t\t\tthrow new TypeError(`missing sub field in token response`);\n\t\t}\n\t\tif (!res.scope) {\n\t\t\tthrow new TypeError(`missing scope field in token response`);\n\t\t}\n\t\tif (res.token_type !== 'DPoP') {\n\t\t\tthrow new TypeError(`token response returned a non-dpop token`);\n\t\t}\n\n\t\treturn {\n\t\t\tscope: res.scope,\n\t\t\trefresh: res.refresh_token,\n\t\t\taccess: res.access_token,\n\t\t\ttype: res.token_type,\n\t\t\texpires_at: typeof res.expires_in === 'number' ? Date.now() + res.expires_in * 1_000 : undefined,\n\t\t};\n\t}\n\n\tasync #processExchangeResponse(\n\t\tres: AtprotoOAuthTokenResponse,\n\t): Promise\u003c{ info: ExchangeInfo; token: TokenInfo }\u003e {\n\t\tconst sub = res.sub;\n\t\tif (!sub) {\n\t\t\tthrow new TypeError(`missing sub field in token response`);\n\t\t}\n\n\t\tconst token = this.#processTokenResponse(res);\n\t\tconst resolved = await resolveFromIdentifier(sub as Did);\n\n\t\tif (resolved.metadata.issuer !== this.#metadata.issuer) {\n\t\t\tthrow new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`);\n\t\t}\n\n\t\treturn {\n\t\t\ttoken: token,\n\t\t\tinfo: {\n\t\t\t\tsub: sub as Did,\n\t\t\t\taud: resolved.identity.pds,\n\t\t\t\tserver: pick(resolved.metadata, [\n\t\t\t\t\t'issuer',\n\t\t\t\t\t'authorization_endpoint',\n\t\t\t\t\t'introspection_endpoint',\n\t\t\t\t\t'pushed_authorization_request_endpoint',\n\t\t\t\t\t'revocation_endpoint',\n\t\t\t\t\t'token_endpoint',\n\t\t\t\t]),\n\t\t\t},\n\t\t};\n\t}\n}\n","import { createDpopProofSigner, sha256Base64Url, type DpopPrivateJwk } from '@atcute/oauth-crypto';\n\nimport { database } from './environment.js';\nimport { extractContentType } from './utils/response.js';\n\nexport const createDPoPFetch = (dpopKey: DpopPrivateJwk, isAuthServer?: boolean): typeof fetch =\u003e {\n\tconst nonces = database.dpopNonces;\n\tconst pending = database.inflightDpop;\n\n\tconst sign = createDpopProofSigner(dpopKey);\n\n\treturn async (input, init) =\u003e {\n\t\tconst request = new Request(input, init);\n\n\t\tconst authorizationHeader = request.headers.get('authorization');\n\t\tconst ath = authorizationHeader?.startsWith('DPoP ')\n\t\t\t? await sha256Base64Url(authorizationHeader.slice(5))\n\t\t\t: undefined;\n\n\t\tconst { method, url } = request;\n\t\tconst { origin, pathname } = new URL(url);\n\n\t\tconst htu = origin + pathname;\n\n\t\tlet deferred = pending.get(origin);\n\t\tif (deferred) {\n\t\t\tawait deferred.promise;\n\t\t\tdeferred = undefined;\n\t\t}\n\n\t\tlet initNonce: string | undefined;\n\t\tlet expiredOrMissing = false;\n\t\ttry {\n\t\t\tconst [nonce, lapsed] = nonces.getWithLapsed(origin);\n\n\t\t\tinitNonce = nonce;\n\t\t\texpiredOrMissing = lapsed \u003e 3 * 60 * 1_000;\n\t\t} catch {\n\t\t\t// ignore read errors\n\t\t}\n\n\t\tif (expiredOrMissing) {\n\t\t\tpending.set(origin, (deferred = Promise.withResolvers()));\n\t\t}\n\n\t\tlet nextNonce: string | null;\n\t\ttry {\n\t\t\tconst initProof = await sign(method, htu, initNonce, ath);\n\t\t\trequest.headers.set('dpop', initProof);\n\n\t\t\tconst initResponse = await fetch(request);\n\n\t\t\tnextNonce = initResponse.headers.get('dpop-nonce');\n\t\t\tif (nextNonce === null || nextNonce === initNonce) {\n\t\t\t\treturn initResponse;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tnonces.set(origin, nextNonce);\n\t\t\t} catch {\n\t\t\t\t// ignore write errors\n\t\t\t}\n\n\t\t\tconst shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n\t\t\tif (!shouldRetry) {\n\t\t\t\treturn initResponse;\n\t\t\t}\n\n\t\t\tif (input === request || init?.body instanceof ReadableStream) {\n\t\t\t\treturn initResponse;\n\t\t\t}\n\t\t} finally {\n\t\t\tif (deferred) {\n\t\t\t\tpending.delete(origin);\n\t\t\t\tdeferred.resolve();\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tconst nextProof = await sign(method, htu, nextNonce, ath);\n\t\t\tconst nextRequest = new Request(input, init);\n\t\t\tnextRequest.headers.set('dpop', nextProof);\n\n\t\t\tconst retryResponse = await fetch(nextRequest);\n\n\t\t\tconst retryNonce = retryResponse.headers.get('dpop-nonce');\n\t\t\tif (retryNonce !== null \u0026\u0026 retryNonce !== nextNonce) {\n\t\t\t\ttry {\n\t\t\t\t\tnonces.set(origin, retryNonce);\n\t\t\t\t} catch {\n\t\t\t\t\t// ignore write errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn retryResponse;\n\t\t}\n\t};\n};\n\nconst isUseDpopNonceError = async (response: Response, isAuthServer?: boolean): Promise\u003cboolean\u003e =\u003e {\n\tif (isAuthServer === undefined || isAuthServer === false) {\n\t\tif (response.status === 401) {\n\t\t\tconst wwwAuth = response.headers.get('www-authenticate');\n\t\t\tif (wwwAuth?.startsWith('DPoP')) {\n\t\t\t\treturn wwwAuth.includes('error=\"use_dpop_nonce\"');\n\t\t\t}\n\t\t}\n\t}\n\n\tif (isAuthServer === undefined || isAuthServer === true) {\n\t\tif (response.status === 400 \u0026\u0026 extractContentType(response.headers) === 'application/json') {\n\t\t\ttry {\n\t\t\t\tconst json = await response.clone().json();\n\t\t\t\treturn typeof json === 'object' \u0026\u0026 json?.['error'] === 'use_dpop_nonce';\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n};\n","type UnwrapArray\u003cT\u003e = T extends (infer V)[] ? V : never;\n\nexport const pick = \u003cT, K extends (keyof T)[]\u003e(obj: T, keys: K): Pick\u003cT, UnwrapArray\u003cK\u003e\u003e =\u003e {\n\tconst cloned = {};\n\n\tfor (let idx = 0, len = keys.length; idx \u003c len; idx++) {\n\t\tconst key = keys[idx];\n\n\t\t// @ts-expect-error\n\t\tcloned[key] = obj[key];\n\t}\n\n\treturn cloned as Pick\u003cT, UnwrapArray\u003cK\u003e\u003e;\n};\n","import { fromBase64Url } from '@atcute/multibase';\nimport type { DpopPrivateJwk } from '@atcute/oauth-crypto';\n\nexport interface LegacyDpopKey {\n\ttyp: 'ES256';\n\tkey: string;\n\tjwt: string;\n\tjkt?: string;\n}\n\nconst ES256_ALG = { name: 'ECDSA', namedCurve: 'P-256' } as const;\n\nexport const isLegacyDpopKey = (key: DpopPrivateJwk | LegacyDpopKey): key is LegacyDpopKey =\u003e {\n\treturn typeof (key as LegacyDpopKey).key === 'string' \u0026\u0026 typeof (key as LegacyDpopKey).jwt === 'string';\n};\n\nexport const migrateLegacyDpopKey = async (key: LegacyDpopKey): Promise\u003cDpopPrivateJwk\u003e =\u003e {\n\tconst pkcs8 = fromBase64Url(key.key);\n\tconst cryptoKey = await crypto.subtle.importKey('pkcs8', pkcs8, ES256_ALG, true, ['sign']);\n\tconst jwk = (await crypto.subtle.exportKey('jwk', cryptoKey)) as DpopPrivateJwk;\n\tjwk.alg = 'ES256';\n\n\treturn jwk;\n};\n","import type { Did } from '@atcute/lexicons';\n\nimport { database } from '../environment.js';\nimport { OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport type { RawSession, Session } from '../types/token.js';\nimport { isLegacyDpopKey, migrateLegacyDpopKey } from '../utils/dpop-key.js';\nimport { locks } from '../utils/runtime.js';\n\nimport { OAuthServerAgent } from './server-agent.js';\n\nexport interface SessionGetOptions {\n\tsignal?: AbortSignal;\n\tnoCache?: boolean;\n\tallowStale?: boolean;\n}\n\ntype PendingItem\u003cV\u003e = Promise\u003c{ value: V; isFresh: boolean }\u003e;\nconst pending = new Map\u003cDid, Promise\u003cPendingItem\u003cSession\u003e\u003e\u003e();\n\nexport const getSession = async (sub: Did, options?: SessionGetOptions): Promise\u003cSession\u003e =\u003e {\n\toptions?.signal?.throwIfAborted();\n\n\tlet allowStored = isTokenUsable;\n\tif (options?.noCache) {\n\t\tallowStored = returnFalse;\n\t} else if (options?.allowStale) {\n\t\tallowStored = returnTrue;\n\t}\n\n\t// As long as concurrent requests are made for the same key, only one\n\t// request will be made to the cache \u0026 getter function at a time. This works\n\t// because there is no async operation between the while() loop and the\n\t// pending.set() call. Because of the \"single threaded\" nature of\n\t// JavaScript, the pending item will be set before the next iteration of the\n\t// while loop.\n\tlet previousExecutionFlow: Promise\u003cPendingItem\u003cSession\u003e\u003e | undefined;\n\twhile ((previousExecutionFlow = pending.get(sub))) {\n\t\ttry {\n\t\t\tconst { isFresh, value } = await previousExecutionFlow;\n\n\t\t\tif (isFresh || allowStored(value)) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors from previous execution flows (they will have been\n\t\t\t// propagated by that flow).\n\t\t}\n\n\t\toptions?.signal?.throwIfAborted();\n\t}\n\n\tconst run = async (): Promise\u003cPendingItem\u003cSession\u003e\u003e =\u003e {\n\t\tconst storedSession = await migrateSessionIfNeeded(sub, database.sessions.get(sub));\n\n\t\tif (storedSession \u0026\u0026 allowStored(storedSession)) {\n\t\t\t// Use the stored value as return value for the current execution\n\t\t\t// flow. Notify other concurrent execution flows (that should be\n\t\t\t// \"stuck\" in the loop before until this promise resolves) that we got\n\t\t\t// a value, but that it came from the store (isFresh = false).\n\t\t\treturn { isFresh: false, value: storedSession };\n\t\t}\n\n\t\tconst newSession = await refreshToken(sub, storedSession);\n\n\t\tawait storeSession(sub, newSession);\n\t\treturn { isFresh: true, value: newSession };\n\t};\n\n\tlet promise: Promise\u003cPendingItem\u003cSession\u003e\u003e;\n\n\tif (locks) {\n\t\tpromise = locks.request\u003cPendingItem\u003cSession\u003e\u003e(`atcute-oauth:${sub}`, run as any);\n\t} else {\n\t\tpromise = run();\n\t}\n\n\tpromise = promise.finally(() =\u003e pending.delete(sub));\n\n\tif (pending.has(sub)) {\n\t\t// This should never happen. Indeed, there must not be any 'await'\n\t\t// statement between this and the loop iteration check meaning that\n\t\t// this.pending.get returned undefined. It is there to catch bugs that\n\t\t// would occur in future changes to the code.\n\t\tthrow new Error('concurrent request for the same key');\n\t}\n\n\tpending.set(sub, promise);\n\n\tconst { value } = await promise;\n\treturn value;\n};\n\nexport const storeSession = async (sub: Did, newSession: Session): Promise\u003cvoid\u003e =\u003e {\n\ttry {\n\t\tdatabase.sessions.set(sub, newSession);\n\t} catch (err) {\n\t\tawait onRefreshError(newSession);\n\t\tthrow err;\n\t}\n};\n\nexport const deleteStoredSession = (sub: Did): void =\u003e {\n\tdatabase.sessions.delete(sub);\n};\n\nexport const listStoredSessions = (): Did[] =\u003e {\n\treturn database.sessions.keys();\n};\n\nconst returnTrue = () =\u003e true;\nconst returnFalse = () =\u003e false;\n\nconst refreshToken = async (sub: Did, storedSession: Session | undefined): Promise\u003cSession\u003e =\u003e {\n\tif (storedSession === undefined) {\n\t\tthrow new TokenRefreshError(sub, `session deleted by another tab`);\n\t}\n\n\tconst { dpopKey, info, token } = storedSession;\n\tconst server = new OAuthServerAgent(info.server, dpopKey);\n\n\ttry {\n\t\tconst newToken = await server.refresh({ sub: info.sub, token });\n\n\t\treturn { dpopKey, info, token: newToken };\n\t} catch (cause) {\n\t\tif (cause instanceof OAuthResponseError \u0026\u0026 cause.status === 400 \u0026\u0026 cause.error === 'invalid_grant') {\n\t\t\tthrow new TokenRefreshError(sub, `session was revoked`, { cause });\n\t\t}\n\n\t\tthrow cause;\n\t}\n};\n\nconst onRefreshError = async ({ dpopKey, info, token }: Session) =\u003e {\n\t// If the token data cannot be stored, let's revoke it\n\tconst server = new OAuthServerAgent(info.server, dpopKey);\n\tawait server.revoke(token.refresh ?? token.access);\n};\n\nconst isTokenUsable = ({ token }: Session): boolean =\u003e {\n\tconst expires = token.expires_at;\n\treturn expires == null || Date.now() + 60_000 \u003c= expires;\n};\n\nconst migrateSessionIfNeeded = async (\n\tsub: Did,\n\tsession: RawSession | undefined,\n): Promise\u003cSession | undefined\u003e =\u003e {\n\tif (!session || !isLegacyDpopKey(session.dpopKey)) {\n\t\treturn session as Session | undefined;\n\t}\n\n\tconst dpopKey = await migrateLegacyDpopKey(session.dpopKey);\n\tconst migrated = { ...session, dpopKey };\n\n\ttry {\n\t\tdatabase.sessions.set(sub, migrated);\n\t} catch {\n\t\t// ignore persistence errors\n\t}\n\n\treturn migrated;\n};\n","import type { FetchHandlerObject } from '@atcute/client';\nimport type { Did } from '@atcute/lexicons';\n\nimport { createDPoPFetch } from '../dpop.js';\nimport type { Session } from '../types/token.js';\n\nimport { OAuthServerAgent } from './server-agent.js';\nimport { type SessionGetOptions, deleteStoredSession, getSession } from './sessions.js';\n\nexport class OAuthUserAgent implements FetchHandlerObject {\n\t#fetch: typeof fetch;\n\t#getSessionPromise: Promise\u003cSession\u003e | undefined;\n\n\tconstructor(public session: Session) {\n\t\tthis.#fetch = createDPoPFetch(session.dpopKey, false);\n\t}\n\n\tget sub(): Did {\n\t\treturn this.session.info.sub;\n\t}\n\n\tgetSession(options?: SessionGetOptions): Promise\u003cSession\u003e {\n\t\tconst promise = getSession(this.session.info.sub, options);\n\n\t\tpromise\n\t\t\t.then((session) =\u003e {\n\t\t\t\tthis.session = session;\n\t\t\t})\n\t\t\t.finally(() =\u003e {\n\t\t\t\tthis.#getSessionPromise = undefined;\n\t\t\t});\n\n\t\treturn (this.#getSessionPromise = promise);\n\t}\n\n\tasync signOut(): Promise\u003cvoid\u003e {\n\t\tconst sub = this.session.info.sub;\n\n\t\ttry {\n\t\t\tconst { dpopKey, info, token } = await getSession(sub, { allowStale: true });\n\t\t\tconst server = new OAuthServerAgent(info.server, dpopKey);\n\n\t\t\tawait server.revoke(token.refresh ?? token.access);\n\t\t} finally {\n\t\t\tdeleteStoredSession(sub);\n\t\t}\n\t}\n\n\tasync handle(pathname: string, init?: RequestInit): Promise\u003cResponse\u003e {\n\t\tawait this.#getSessionPromise;\n\n\t\tconst headers = new Headers(init?.headers);\n\n\t\tlet session = this.session;\n\t\tlet url = new URL(pathname, session.info.aud);\n\n\t\theaders.set('authorization', `${session.token.type} ${session.token.access}`);\n\n\t\tlet response = await this.#fetch(url.href, { ...init, headers });\n\t\tif (!isInvalidTokenResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\ttry {\n\t\t\tif (this.#getSessionPromise) {\n\t\t\t\tsession = await this.#getSessionPromise;\n\t\t\t} else {\n\t\t\t\tsession = await this.getSession();\n\t\t\t}\n\t\t} catch {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Stream already consumed, can't retry.\n\t\tif (init?.body instanceof ReadableStream) {\n\t\t\treturn response;\n\t\t}\n\n\t\turl = new URL(pathname, session.info.aud);\n\t\theaders.set('authorization', `${session.token.type} ${session.token.access}`);\n\n\t\treturn await this.#fetch(url.href, { ...init, headers });\n\t}\n}\n\nconst isInvalidTokenResponse = (response: Response) =\u003e {\n\tif (response.status !== 401) {\n\t\treturn false;\n\t}\n\n\tconst auth = response.headers.get('www-authenticate');\n\n\treturn (\n\t\tauth != null \u0026\u0026\n\t\t(auth.startsWith('Bearer ') || auth.startsWith('DPoP ')) \u0026\u0026\n\t\tauth.includes('error=\"invalid_token\"')\n\t);\n};\n"],"version":3}
-4
vendor/esm.sh/@atcute/oauth-crypto@0.1.0/es2022/oauth-crypto.mjs
··· 1 - /* esm.sh - @atcute/oauth-crypto@0.1.0 */ 2 - import{nanoid as st}from"../../../nanoid@5.1.7/es2022/nanoid.mjs";import{fromBase64Pad as Z,toBase64Pad as tt}from"../../multibase@1.2.0/es2022/multibase.mjs";var z={ES256:"SHA-256",ES384:"SHA-384",ES512:"SHA-512",PS256:"SHA-256",PS384:"SHA-384",PS512:"SHA-512",RS256:"SHA-256",RS384:"SHA-384",RS512:"SHA-512"},Q={ES256:"P-256",ES384:"P-384",ES512:"P-521",PS256:null,PS384:null,PS512:null,RS256:null,RS384:null,RS512:null},u=t=>z[t],O=t=>Q[t],J=t=>t.startsWith("ES")?{name:"ECDSA",hash:{name:u(t)}}:t.startsWith("PS")?{name:"RSA-PSS",hash:{name:u(t)},saltLength:X(u(t))}:{name:"RSASSA-PKCS1-v1_5"},v=(t,e)=>{if(t.startsWith("ES")){let r=e??O(t);if(!r)throw new Error(`unable to determine curve for ${t}`);return{name:"ECDSA",namedCurve:r}}return t.startsWith("PS")?{name:"RSA-PSS",hash:{name:u(t)}}:{name:"RSASSA-PKCS1-v1_5",hash:{name:u(t)}}},A=t=>{let e=O(t);if(e)return{name:"ECDSA",namedCurve:e};let r={name:u(t)};return{name:t.startsWith("PS")?"RSA-PSS":"RSASSA-PKCS1-v1_5",hash:r,modulusLength:2048,publicExponent:new Uint8Array([1,0,1])}},X=t=>{switch(t){case"SHA-256":return 32;case"SHA-384":return 48;case"SHA-512":return 64}};var et=["ES256","ES384","ES512","PS256","PS384","PS512","RS256","RS384","RS512"];var $=t=>et.includes(t);var K=(t,e,r)=>{if(t.kty==="EC"){let{crv:o,x:n,y:s}=t;return{kty:"EC",crv:o,x:n,y:s,kid:e,alg:r,use:"sig"}}if(t.kty==="RSA"){let{n:o,e:n}=t;return{kty:"RSA",n:o,e:n,kid:e,alg:r,use:"sig"}}throw new Error("unsupported key type")},B=async(t,e)=>{if(!("d"in t)||!t.d)throw new Error("expected a private key (missing 'd' parameter)");if(t.kty==="EC"&&!e.startsWith("ES"))throw new Error(`algorithm ${e} does not match ec key`);if(t.kty==="RSA"&&e.startsWith("ES"))throw new Error(`algorithm ${e} does not match rsa key`);let r=v(e,t.kty==="EC"?t.crv:void 0),o=await crypto.subtle.importKey("jwk",t,r,!0,["sign"]);if(!(o instanceof CryptoKey))throw new Error("expected asymmetric key, got symmetric");return o},d=async(t,e,r)=>{let o=await crypto.subtle.exportKey("jwk",t);return o.alg=e,r&&(o.kid=r),o},M=async(t,e)=>{let r=rt(t),o=v(e),n=await crypto.subtle.importKey("pkcs8",r,o,!0,["sign"]);if(!(n instanceof CryptoKey))throw new Error("expected asymmetric key, got symmetric");return n},j=async t=>{let e=await crypto.subtle.exportKey("pkcs8",t),r=new Uint8Array(e),o=tt(r);return["-----BEGIN PRIVATE KEY-----",...ot(o),"-----END PRIVATE KEY-----",""].join(` 3 - `)},rt=t=>{let e=t.match(/-----BEGIN PRIVATE KEY-----([\s\S]*?)-----END PRIVATE KEY-----/);if(!e)throw new Error("invalid pkcs8 pem");let r=e[1].replace(/\s+/g,""),o=Z(r);return o.buffer.slice(o.byteOffset,o.byteOffset+o.byteLength)},ot=t=>{let e=[];for(let r=0;r<t.length;r+=64)e.push(t.slice(r,r+64));return e};var D=new WeakMap,g=async t=>{let e=D.get(t);if(e)return e;let{alg:r}=t,o=await B(t,r),n=K(t,t.kid,r),s={cryptoKey:o,publicJwk:n};return D.set(t,s),s},S=(t,e)=>{let r=K(t,t.kid,t.alg);D.set(t,{cryptoKey:e,publicJwk:r})};import{fromBase64Url as G,toBase64Url as L}from"../../multibase@1.2.0/es2022/multibase.mjs";import{decodeUtf8From as nt,encodeUtf8 as N}from"../../uint8array@1.1.1/es2022/uint8array.mjs";var b=async t=>{let{header:e,payload:r,key:o,alg:n}=t,s={...e,alg:n},a=F(s),m=F(r),p=`${a}.${m}`,c=await crypto.subtle.sign(J(n),o,N(p)),f=L(new Uint8Array(c));return`${p}.${f}`},T=async(t,e)=>{let{key:r,alg:o,typ:n}=e,s=t.split(".");if(s.length!==3)throw new Error("invalid jwt format");let a=W(s[0]);if(a.alg!==o)throw new Error("invalid jwt alg");if(n&&a.typ!==n)throw new Error("invalid jwt typ");let m=W(s[1]),p=G(s[2]),c=`${s[0]}.${s[1]}`;if(!await crypto.subtle.verify(J(o),r,p,N(c)))throw new Error("invalid jwt signature");return m},F=t=>L(N(JSON.stringify(t))),W=t=>{let e=G(t);return JSON.parse(nt(e))};var it=async t=>{let{client_id:e,aud:r,jkt:o,key:n}=t,{kid:s,alg:a}=n,{cryptoKey:m}=await g(n),p=Math.floor(Date.now()/1e3),c=o?{jkt:o}:void 0;return b({header:{alg:a,kid:s},payload:{iss:e,sub:e,aud:r,jti:st(24),iat:p,exp:p+60,cnf:c},key:m,alg:a})};var at=async(t,e="ES256")=>{let r=await crypto.subtle.generateKey(A(e),!0,["sign","verify"]),o=await d(r.privateKey,e,t);return S(o,r.privateKey),o};var ct=async(t,e)=>{let{kid:r,alg:o}=e,n=await M(t,o),s=await d(n,o,r);return S(s,n),s};import{toBase64Url as pt}from"../../multibase@1.2.0/es2022/multibase.mjs";import{encodeUtf8 as mt,toSha256 as ft}from"../../uint8array@1.1.1/es2022/uint8array.mjs";var E=async t=>{let e=mt(t),r=await ft(e);return pt(r)};import{nanoid as yt}from"../../../nanoid@5.1.7/es2022/nanoid.mjs";var U=t=>{let e=t.alg,r;return async(o,n,s,a)=>{r||=g(t);let{cryptoKey:m,publicJwk:p}=await r,c=Math.floor(Date.now()/1e3);return b({header:{typ:"dpop+jwt",jwk:p},payload:{htm:o,htu:n,iat:c,jti:yt(24),nonce:s,ath:a},key:m,alg:e})}};var ht=t=>{let{key:e,nonces:r,supportedAlgs:o,isAuthServer:n,fetch:s=globalThis.fetch}=t;ut(e,o);let a=U(e);return async(m,p)=>{let c=p==null&&m instanceof Request?m:new Request(m,p),f=c.headers.get("Authorization"),w=f?.startsWith("DPoP ")?await E(f.slice(5)):void 0,{origin:P}=new URL(c.url),h=c.method,k=lt(c.url),R;try{R=await r.get(P)}catch{}let q=await a(h,k,R,w);c.headers.set("DPoP",q);let l=await s(c),x=l.headers.get("DPoP-Nonce");if(!x||x===R)return l;try{await r.set(P,x)}catch{}if(!await dt(l,n)||m===c||p?.body instanceof ReadableStream)return l;await l.body?.cancel();let Y=await a(h,k,x,w),I=new Request(m,p);I.headers.set("DPoP",Y);let _=await s(I),C=_.headers.get("DPoP-Nonce");if(C&&C!==x)try{await r.set(P,C)}catch{}return _}},lt=t=>{let e=t.indexOf("#"),r=t.indexOf("?"),o=e===-1?r:r===-1?e:Math.min(e,r);return o===-1?t:t.slice(0,o)},ut=(t,e)=>{let r=t.alg;if(e?.length){if(e.includes(r))return r;throw new Error(`DPoP key algorithm ${r} not supported by server: ${e.join(", ")}`)}return r},dt=async(t,e)=>{if((e===void 0||e===!1)&&t.status===401){let r=t.headers.get("WWW-Authenticate");if(r?.startsWith("DPoP"))return r.includes('error="use_dpop_nonce"')}if((e===void 0||e===!0)&&t.status===400)try{let r=await t.clone().json();return typeof r=="object"&&r?.error==="use_dpop_nonce"}catch{return!1}return!1};var V=["ES256","ES384","ES512","PS256","PS384","PS512","RS256","RS384","RS512"],gt=t=>[...t].sort((e,r)=>{let o=V.indexOf(e),n=V.indexOf(r);return o===-1&&n===-1?0:o===-1?1:n===-1?-1:o-n}),St=async t=>{let e=t?.filter($)??[];if(t?.length&&e.length===0)throw new Error("no supported algorithms provided");let r=e.length?gt(e):["ES256"],o=[];for(let n of r)try{let s=await crypto.subtle.generateKey(A(n),!0,["sign","verify"]),a=await d(s.privateKey,n);return S(a,s.privateKey),a}catch(s){o.push(s)}throw new AggregateError(o,`failed to generate DPoP key for any of: ${r.join(", ")}`)};import{fromBase64Url as vt}from"../../multibase@1.2.0/es2022/multibase.mjs";import{decodeUtf8From as Et}from"../../uint8array@1.1.1/es2022/uint8array.mjs";import*as i from"../../../@badrap/valita@0.4.6/es2022/valita.mjs";import{toBase64Url as wt}from"../../multibase@1.2.0/es2022/multibase.mjs";import{encodeUtf8 as Pt,toSha256 as xt}from"../../uint8array@1.1.1/es2022/uint8array.mjs";var H=async t=>{let e;if(t.kty==="EC"){let{crv:n,x:s,y:a}=t;e={crv:n,kty:t.kty,x:s,y:a}}else{let{e:n,n:s}=t;e={e:n,kty:t.kty,n:s}}let r=JSON.stringify(e),o=await xt(Pt(r));return wt(o)};var kt=i.union(i.object({kty:i.literal("EC"),crv:i.union(i.literal("P-256"),i.literal("P-384"),i.literal("P-521")),x:i.string(),y:i.string()}),i.object({kty:i.literal("RSA"),e:i.string(),n:i.string()})),At=i.object({typ:i.literal("dpop+jwt"),alg:i.string().assert(t=>t!=="none",'alg must not be "none"'),jwk:kt}),Kt=i.object({htm:i.string(),htu:i.string(),iat:i.number(),jti:i.string(),nonce:i.string().optional()}),y=class extends Error{code;constructor(e,r){super(e),this.code=r,this.name="DpopVerifyError"}},bt=async(t,e)=>{if(!t)throw new y("missing dpop header","missing");let{method:r,url:o,nonce:n,maxClockSkew:s=60}=e,a=t.split(".");if(a.length!==3)throw new y("invalid dpop proof format","invalid");let m;try{m=At.parse(Jt(a[0]),{mode:"passthrough"})}catch{throw new y("invalid dpop header","invalid")}let{jwk:p,alg:c}=m;if(!Ct(c))throw new y("unsupported dpop alg","invalid");let f;try{let h=await Rt(p,c),k=await T(t,{key:h,alg:c,typ:"dpop+jwt"});f=Kt.parse(k,{mode:"passthrough"})}catch(h){throw h instanceof i.ValitaError?new y("invalid dpop payload","invalid"):new y("dpop signature verification failed","invalid")}if(f.htm!==r)throw new y(`dpop htm mismatch: expected ${r}, got ${f.htm}`,"invalid");if(f.htu!==o)throw new y(`dpop htu mismatch: expected ${o}, got ${f.htu}`,"invalid");let w=Math.floor(Date.now()/1e3);if(f.iat>w+s)throw new y("dpop proof issued in the future","invalid");if(f.iat<w-s)throw new y("dpop proof expired","expired");if(n&&(!f.nonce||!await n.check(f.nonce)))throw new y("invalid or missing dpop nonce","nonce_required");let P=await H(p);return{claims:f,jwk:p,jkt:P}},Rt=async(t,e)=>{let r=v(e,t.kty==="EC"?t.crv:void 0),o=await crypto.subtle.importKey("jwk",t,r,!0,["verify"]);if(!(o instanceof CryptoKey))throw new Error("expected asymmetric key, got symmetric");return o},Ct=t=>t==="ES256"||t==="ES384"||t==="ES512"||t==="PS256"||t==="PS384"||t==="PS512"||t==="RS256"||t==="RS384"||t==="RS512",Jt=t=>{let e=vt(t);return JSON.parse(Et(e))};import{nanoid as Dt}from"../../../nanoid@5.1.7/es2022/nanoid.mjs";var Nt=async(t=64)=>{let e=Dt(t),r=await E(e);return{verifier:e,challenge:r,method:"S256"}};var Ut=async t=>{let{cryptoKey:e}=await g(t);return j(e)};export{y as DpopVerifyError,H as computeJktFromJwk,it as createClientAssertion,ht as createDpopFetch,U as createDpopProofSigner,K as derivePublicJwk,Ut as exportPkcs8PrivateKey,at as generateClientAssertionKey,St as generateDpopKey,Nt as generatePkce,ct as importClientAssertionPkcs8,E as sha256Base64Url,b as signJwt,bt as verifyDpopProof,T as verifyJwt}; 4 - //# sourceMappingURL=./oauth-crypto.mjs.map
-1
vendor/esm.sh/@atcute/oauth-crypto@0.1.0/es2022/oauth-crypto.mjs.map
··· 1 - {"mappings":"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","names":["nanoid","fromBase64Pad","toBase64Pad","HASH_BY_ALG","CURVE_BY_ALG","getHashName","alg","getNamedCurve","getSignAlgorithm","getHashLength","getImportAlgorithm","curve","namedCurve","getGenerateAlgorithm","hash","SIGNING_ALGORITHMS","isSigningAlgorithm","alg","SIGNING_ALGORITHMS","derivePublicJwk","privateJwk","kid","alg","crv","x","y","n","e","importPrivateKeyFromJwk","jwk","algorithm","getImportAlgorithm","key","exportPrivateJwkFromKey","importPkcs8PrivateKey","pem","bytes","parsePkcs8Pem","exportPkcs8PrivateKey","pkcs8","base64","toBase64Pad","chunk64","match","fromBase64Pad","input","chunks","i","keyCache","getCachedKeyMaterial","jwk","cached","alg","cryptoKey","importPrivateKeyFromJwk","publicJwk","derivePublicJwk","material","setCachedKeyMaterial","fromBase64Url","toBase64Url","decodeUtf8From","encodeUtf8","signJwt","params","header","payload","key","alg","fullHeader","headerSegment","encodeSegment","payloadSegment","signingInput","signature","getSignAlgorithm","encodeUtf8","signatureSegment","toBase64Url","verifyJwt","jwt","options","typ","parts","decodeSegment","fromBase64Url","value","bytes","decodeUtf8From","createClientAssertion","options","client_id","aud","jkt","key","kid","alg","cryptoKey","getCachedKeyMaterial","now","cnf","signJwt","nanoid","generateClientAssertionKey","kid","alg","pair","getGenerateAlgorithm","jwk","exportPrivateJwkFromKey","setCachedKeyMaterial","importClientAssertionPkcs8","pem","options","kid","alg","cryptoKey","importPkcs8PrivateKey","jwk","exportPrivateJwkFromKey","setCachedKeyMaterial","toBase64Url","encodeUtf8","toSha256","sha256Base64Url","input","bytes","digest","nanoid","createDpopProofSigner","jwk","alg","materialPromise","htm","htu","nonce","ath","getCachedKeyMaterial","cryptoKey","publicJwk","now","signJwt","nanoid","createDpopFetch","options","key","nonces","supportedAlgs","isAuthServer","fetch","negotiateAlg","sign","createDpopProofSigner","input","init","request","authHeader","ath","sha256Base64Url","origin","htm","htu","buildHtu","initNonce","initProof","initResponse","nextNonce","isUseDpopNonceError","nextProof","nextRequest","retryResponse","retryNonce","url","fragmentIdx","queryIdx","end","keyAlg","response","wwwAuth","json","PREFERRED_ALGORITHMS","sortAlgorithms","algs","a","b","aIdx","bIdx","generateDpopKey","supportedAlgs","normalized","isSigningAlgorithm","errors","alg","pair","getGenerateAlgorithm","jwk","exportPrivateJwkFromKey","setCachedKeyMaterial","err","fromBase64Url","decodeUtf8From","v","toBase64Url","encodeUtf8","toSha256","computeJktFromJwk","jwk","canonical","crv","x","y","e","n","serialized","hash","dpopJwkSchema","dpopHeaderSchema","alg","dpopPayloadSchema","DpopVerifyError","message","code","verifyDpopProof","dpopHeader","options","method","url","dpopNonce","maxClockSkew","parts","header","decodeSegment","jwk","isSigningAlgorithm","payload","key","importPublicKey","raw","verifyJwt","err","now","jkt","computeJktFromJwk","algorithm","getImportAlgorithm","segment","bytes","fromBase64Url","decodeUtf8From","nanoid","generatePkce","length","verifier","nanoid","challenge","sha256Base64Url","exportPkcs8PrivateKey","jwk","cryptoKey","getCachedKeyMaterial"],"sources":["../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/client-assertion/create-client-assertion.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/internal/jwk.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/internal/crypto.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/internal/key-cache.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/jwt/index.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/client-assertion/generate-key.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/client-assertion/keys.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/hash/sha256.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/dpop/proof.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/dpop/fetch.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/dpop/generate-key.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/dpop/verify.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/jwk/compute-jkt.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/hash/pkce.ts","../esm/npm/@atcute/oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/jwk/keys.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\n\nimport { getCachedKeyMaterial } from '../internal/key-cache.js';\nimport { signJwt } from '../jwt/index.js';\n\nimport type { ClientAssertionPrivateJwk } from './types.js';\n\nexport interface CreateClientAssertionOptions {\n\t/** client id */\n\tclient_id: string;\n\t/** authorization server issuer */\n\taud: string;\n\t/** JWK thumbprint of the DPoP key to bind to (for CAB pattern) */\n\tjkt?: string;\n\t/** client assertion signing key */\n\tkey: ClientAssertionPrivateJwk;\n}\n\n/**\n * creates a DPoP-bound client assertion per RFC 7523.\n *\n * @param options creation options\n * @returns signed client assertion JWT\n */\nexport const createClientAssertion = async (options: CreateClientAssertionOptions): Promise\u003cstring\u003e =\u003e {\n\tconst { client_id, aud, jkt, key } = options;\n\tconst { kid, alg } = key;\n\tconst { cryptoKey } = await getCachedKeyMaterial(key);\n\n\tconst now = Math.floor(Date.now() / 1000);\n\tconst cnf = jkt ? { jkt } : undefined;\n\n\treturn signJwt({\n\t\theader: {\n\t\t\talg,\n\t\t\tkid,\n\t\t},\n\t\tpayload: {\n\t\t\tiss: client_id,\n\t\t\tsub: client_id,\n\t\t\taud: aud,\n\t\t\tjti: nanoid(24),\n\t\t\tiat: now,\n\t\t\texp: now + 60,\n\t\t\tcnf,\n\t\t},\n\t\tkey: cryptoKey,\n\t\talg,\n\t});\n};\n","import { fromBase64Pad, toBase64Pad } from '@atcute/multibase';\n\nimport type { PrivateJwk, PublicJwk, SigningAlgorithm } from '../jwk/types.js';\n\nimport { getImportAlgorithm } from './crypto.js';\n\nconst SIGNING_ALGORITHMS: readonly SigningAlgorithm[] = [\n\t'ES256',\n\t'ES384',\n\t'ES512',\n\t'PS256',\n\t'PS384',\n\t'PS512',\n\t'RS256',\n\t'RS384',\n\t'RS512',\n];\n\nconst CURVE_TO_ALG: Record\u003cstring, SigningAlgorithm\u003e = {\n\t'P-256': 'ES256',\n\t'P-384': 'ES384',\n\t'P-521': 'ES512',\n};\n\nexport const isSigningAlgorithm = (alg: string): alg is SigningAlgorithm =\u003e {\n\treturn (SIGNING_ALGORITHMS as readonly string[]).includes(alg);\n};\n\nexport const parsePrivateJwkInput = (input: PrivateJwk | string): PrivateJwk =\u003e {\n\tif (typeof input === 'string') {\n\t\ttry {\n\t\t\tconst jwk = JSON.parse(input) as PrivateJwk;\n\t\t\treturn jwk;\n\t\t} catch {\n\t\t\tthrow new Error(`invalid JSON string`);\n\t\t}\n\t}\n\n\tif (typeof input === 'object' \u0026\u0026 input !== null \u0026\u0026 'kty' in input) {\n\t\treturn input;\n\t}\n\n\tthrow new Error(`invalid input: expected JWK object or JSON string`);\n};\n\nexport const resolveSigningAlgorithm = (\n\tjwk: PrivateJwk,\n\toverride?: SigningAlgorithm,\n): SigningAlgorithm | undefined =\u003e {\n\tif (override) {\n\t\treturn override;\n\t}\n\n\tconst alg = jwk.alg;\n\tif (alg \u0026\u0026 isSigningAlgorithm(alg)) {\n\t\treturn alg;\n\t}\n\n\tif (jwk.kty === 'EC') {\n\t\tconst inferred = CURVE_TO_ALG[jwk.crv];\n\t\tif (inferred) {\n\t\t\treturn inferred;\n\t\t}\n\t}\n\n\treturn undefined;\n};\n\nexport const derivePublicJwk = (privateJwk: PrivateJwk, kid?: string, alg?: SigningAlgorithm): PublicJwk =\u003e {\n\tif (privateJwk.kty === 'EC') {\n\t\tconst { crv, x, y } = privateJwk;\n\t\treturn { kty: 'EC', crv, x, y, kid, alg, use: 'sig' };\n\t}\n\n\tif (privateJwk.kty === 'RSA') {\n\t\tconst { n, e } = privateJwk;\n\t\treturn { kty: 'RSA', n, e, kid, alg, use: 'sig' };\n\t}\n\n\tthrow new Error(`unsupported key type`);\n};\n\nexport const importPrivateKeyFromJwk = async (jwk: PrivateJwk, alg: SigningAlgorithm): Promise\u003cCryptoKey\u003e =\u003e {\n\tif (!('d' in jwk) || !jwk.d) {\n\t\tthrow new Error(`expected a private key (missing 'd' parameter)`);\n\t}\n\n\tif (jwk.kty === 'EC' \u0026\u0026 !alg.startsWith('ES')) {\n\t\tthrow new Error(`algorithm ${alg} does not match ec key`);\n\t}\n\tif (jwk.kty === 'RSA' \u0026\u0026 alg.startsWith('ES')) {\n\t\tthrow new Error(`algorithm ${alg} does not match rsa key`);\n\t}\n\n\tconst algorithm = getImportAlgorithm(alg, jwk.kty === 'EC' ? jwk.crv : undefined);\n\tconst key = await crypto.subtle.importKey('jwk', jwk, algorithm, true, ['sign']);\n\n\tif (!(key instanceof CryptoKey)) {\n\t\tthrow new Error(`expected asymmetric key, got symmetric`);\n\t}\n\n\treturn key;\n};\n\nexport const exportPrivateJwkFromKey = async (\n\tkey: CryptoKey,\n\talg: SigningAlgorithm,\n\tkid?: string,\n): Promise\u003cPrivateJwk\u003e =\u003e {\n\tconst jwk = (await crypto.subtle.exportKey('jwk', key)) as PrivateJwk;\n\tjwk.alg = alg;\n\tif (kid) {\n\t\tjwk.kid = kid;\n\t}\n\treturn jwk;\n};\n\nexport const importPkcs8PrivateKey = async (pem: string, alg: SigningAlgorithm): Promise\u003cCryptoKey\u003e =\u003e {\n\tconst bytes = parsePkcs8Pem(pem);\n\tconst algorithm = getImportAlgorithm(alg);\n\n\tconst key = await crypto.subtle.importKey('pkcs8', bytes, algorithm, true, ['sign']);\n\n\tif (!(key instanceof CryptoKey)) {\n\t\tthrow new Error(`expected asymmetric key, got symmetric`);\n\t}\n\n\treturn key;\n};\n\nexport const exportPkcs8PrivateKey = async (key: CryptoKey): Promise\u003cstring\u003e =\u003e {\n\tconst pkcs8 = await crypto.subtle.exportKey('pkcs8', key);\n\tconst bytes = new Uint8Array(pkcs8);\n\tconst base64 = toBase64Pad(bytes);\n\n\treturn ['-----BEGIN PRIVATE KEY-----', ...chunk64(base64), '-----END PRIVATE KEY-----', ''].join('\\n');\n};\n\nconst parsePkcs8Pem = (pem: string): ArrayBuffer =\u003e {\n\tconst match = pem.match(/-----BEGIN PRIVATE KEY-----([\\s\\S]*?)-----END PRIVATE KEY-----/);\n\tif (!match) {\n\t\tthrow new Error(`invalid pkcs8 pem`);\n\t}\n\n\tconst base64 = match[1].replace(/\\s+/g, '');\n\tconst bytes = fromBase64Pad(base64);\n\tconst buffer = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n\treturn buffer;\n};\n\nconst chunk64 = (input: string): string[] =\u003e {\n\tconst chunks: string[] = [];\n\tfor (let i = 0; i \u003c input.length; i += 64) {\n\t\tchunks.push(input.slice(i, i + 64));\n\t}\n\treturn chunks;\n};\n","import type { SigningAlgorithm } from '../jwk/types.js';\n\nconst HASH_BY_ALG: Record\u003cSigningAlgorithm, 'SHA-256' | 'SHA-384' | 'SHA-512'\u003e = {\n\tES256: 'SHA-256',\n\tES384: 'SHA-384',\n\tES512: 'SHA-512',\n\tPS256: 'SHA-256',\n\tPS384: 'SHA-384',\n\tPS512: 'SHA-512',\n\tRS256: 'SHA-256',\n\tRS384: 'SHA-384',\n\tRS512: 'SHA-512',\n};\n\nconst CURVE_BY_ALG: Record\u003cSigningAlgorithm, 'P-256' | 'P-384' | 'P-521' | null\u003e = {\n\tES256: 'P-256',\n\tES384: 'P-384',\n\tES512: 'P-521',\n\tPS256: null,\n\tPS384: null,\n\tPS512: null,\n\tRS256: null,\n\tRS384: null,\n\tRS512: null,\n};\n\nexport const getHashName = (alg: SigningAlgorithm): 'SHA-256' | 'SHA-384' | 'SHA-512' =\u003e {\n\treturn HASH_BY_ALG[alg];\n};\n\nexport const getNamedCurve = (alg: SigningAlgorithm): 'P-256' | 'P-384' | 'P-521' | null =\u003e {\n\treturn CURVE_BY_ALG[alg];\n};\n\nexport const getSignAlgorithm = (alg: SigningAlgorithm): AlgorithmIdentifier | EcdsaParams | RsaPssParams =\u003e {\n\tif (alg.startsWith('ES')) {\n\t\treturn { name: 'ECDSA', hash: { name: getHashName(alg) } };\n\t}\n\tif (alg.startsWith('PS')) {\n\t\treturn {\n\t\t\tname: 'RSA-PSS',\n\t\t\thash: { name: getHashName(alg) },\n\t\t\tsaltLength: getHashLength(getHashName(alg)),\n\t\t};\n\t}\n\treturn { name: 'RSASSA-PKCS1-v1_5' };\n};\n\nexport const getImportAlgorithm = (\n\talg: SigningAlgorithm,\n\tcurve?: 'P-256' | 'P-384' | 'P-521',\n): EcKeyImportParams | RsaHashedImportParams =\u003e {\n\tif (alg.startsWith('ES')) {\n\t\tconst namedCurve = curve ?? getNamedCurve(alg);\n\t\tif (!namedCurve) {\n\t\t\tthrow new Error(`unable to determine curve for ${alg}`);\n\t\t}\n\t\treturn { name: 'ECDSA', namedCurve };\n\t}\n\n\tif (alg.startsWith('PS')) {\n\t\treturn { name: 'RSA-PSS', hash: { name: getHashName(alg) } };\n\t}\n\n\treturn { name: 'RSASSA-PKCS1-v1_5', hash: { name: getHashName(alg) } };\n};\n\nexport const getGenerateAlgorithm = (alg: SigningAlgorithm): EcKeyGenParams | RsaHashedKeyGenParams =\u003e {\n\tconst curve = getNamedCurve(alg);\n\tif (curve) {\n\t\treturn { name: 'ECDSA', namedCurve: curve };\n\t}\n\n\tconst hash = { name: getHashName(alg) };\n\treturn {\n\t\tname: alg.startsWith('PS') ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5',\n\t\thash,\n\t\tmodulusLength: 2048,\n\t\tpublicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n\t};\n};\n\nconst getHashLength = (hash: 'SHA-256' | 'SHA-384' | 'SHA-512'): number =\u003e {\n\tswitch (hash) {\n\t\tcase 'SHA-256':\n\t\t\treturn 32;\n\t\tcase 'SHA-384':\n\t\t\treturn 48;\n\t\tcase 'SHA-512':\n\t\t\treturn 64;\n\t}\n};\n","import type { PrivateJwk, PublicJwk } from '../jwk/types.js';\n\nimport { derivePublicJwk, importPrivateKeyFromJwk } from './jwk.js';\n\n/**\n * cached key material for a JWK.\n */\nexport interface CachedKeyMaterial {\n\tcryptoKey: CryptoKey;\n\tpublicJwk: PublicJwk;\n}\n\n/**\n * cache for imported keys.\n * uses WeakMap so entries are garbage collected when JWK objects are no longer referenced.\n */\nconst keyCache = new WeakMap\u003cPrivateJwk, CachedKeyMaterial\u003e();\n\n/**\n * retrieves or creates cached key material for a JWK.\n *\n * @param jwk private JWK to get material for\n * @returns cached key material (CryptoKey and derived public JWK)\n */\nexport const getCachedKeyMaterial = async (jwk: PrivateJwk): Promise\u003cCachedKeyMaterial\u003e =\u003e {\n\tconst cached = keyCache.get(jwk);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst { alg } = jwk;\n\tconst cryptoKey = await importPrivateKeyFromJwk(jwk, alg);\n\tconst publicJwk = derivePublicJwk(jwk, jwk.kid, alg);\n\tconst material: CachedKeyMaterial = { cryptoKey, publicJwk };\n\n\tkeyCache.set(jwk, material);\n\n\treturn material;\n};\n\n/**\n * pre-populates the cache with already-imported key material.\n * useful for PKCS8 imports where we already have the CryptoKey.\n *\n * @param jwk private JWK to cache for\n * @param cryptoKey already-imported CryptoKey\n */\nexport const setCachedKeyMaterial = (jwk: PrivateJwk, cryptoKey: CryptoKey): void =\u003e {\n\tconst publicJwk = derivePublicJwk(jwk, jwk.kid, jwk.alg);\n\tkeyCache.set(jwk, { cryptoKey, publicJwk });\n};\n","import { fromBase64Url, toBase64Url } from '@atcute/multibase';\nimport { decodeUtf8From, encodeUtf8 } from '@atcute/uint8array';\n\nimport { getSignAlgorithm } from '../internal/crypto.js';\nimport type { SigningAlgorithm } from '../jwk/types.js';\n\n/**\n * signs a jwt using webcrypto.\n *\n * @param params signing parameters\n * @returns signed jwt\n */\nexport const signJwt = async (params: {\n\theader: Record\u003cstring, unknown\u003e;\n\tpayload: Record\u003cstring, unknown\u003e;\n\tkey: CryptoKey;\n\talg: SigningAlgorithm;\n}): Promise\u003cstring\u003e =\u003e {\n\tconst { header, payload, key, alg } = params;\n\tconst fullHeader = { ...header, alg };\n\tconst headerSegment = encodeSegment(fullHeader);\n\tconst payloadSegment = encodeSegment(payload);\n\tconst signingInput = `${headerSegment}.${payloadSegment}`;\n\n\tconst signature = await crypto.subtle.sign(\n\t\tgetSignAlgorithm(alg),\n\t\tkey,\n\t\tencodeUtf8(signingInput) as Uint8Array\u003cArrayBuffer\u003e,\n\t);\n\n\tconst signatureSegment = toBase64Url(new Uint8Array(signature));\n\n\treturn `${signingInput}.${signatureSegment}`;\n};\n\n/**\n * verifies a jwt and returns its payload.\n *\n * @param jwt jwt string\n * @param options verification options\n * @returns decoded payload\n */\nexport const verifyJwt = async (\n\tjwt: string,\n\toptions: { key: CryptoKey; alg: SigningAlgorithm; typ?: string },\n): Promise\u003cRecord\u003cstring, unknown\u003e\u003e =\u003e {\n\tconst { key, alg, typ } = options;\n\tconst parts = jwt.split('.');\n\tif (parts.length !== 3) {\n\t\tthrow new Error(`invalid jwt format`);\n\t}\n\n\tconst header = decodeSegment\u003cRecord\u003cstring, unknown\u003e\u003e(parts[0]);\n\tif (header.alg !== alg) {\n\t\tthrow new Error(`invalid jwt alg`);\n\t}\n\tif (typ \u0026\u0026 header.typ !== typ) {\n\t\tthrow new Error(`invalid jwt typ`);\n\t}\n\n\tconst payload = decodeSegment\u003cRecord\u003cstring, unknown\u003e\u003e(parts[1]);\n\tconst signature = fromBase64Url(parts[2]);\n\tconst signingInput = `${parts[0]}.${parts[1]}`;\n\n\tconst ok = await crypto.subtle.verify(\n\t\tgetSignAlgorithm(alg),\n\t\tkey,\n\t\tsignature,\n\t\tencodeUtf8(signingInput) as Uint8Array\u003cArrayBuffer\u003e,\n\t);\n\n\tif (!ok) {\n\t\tthrow new Error(`invalid jwt signature`);\n\t}\n\n\treturn payload;\n};\n\nconst encodeSegment = (value: unknown): string =\u003e {\n\treturn toBase64Url(encodeUtf8(JSON.stringify(value)));\n};\n\nconst decodeSegment = \u003cT\u003e(value: string): T =\u003e {\n\tconst bytes = fromBase64Url(value);\n\treturn JSON.parse(decodeUtf8From(bytes)) as T;\n};\n","import { getGenerateAlgorithm } from '../internal/crypto.js';\nimport { exportPrivateJwkFromKey } from '../internal/jwk.js';\nimport { setCachedKeyMaterial } from '../internal/key-cache.js';\nimport type { SigningAlgorithm } from '../jwk/types.js';\n\nimport type { ClientAssertionPrivateJwk } from './types.js';\n\n/**\n * generates a new client assertion private key.\n *\n * @param kid key id to assign\n * @param alg signing algorithm (defaults to es256)\n * @returns client assertion private JWK (with cache pre-warmed)\n */\nexport const generateClientAssertionKey = async (\n\tkid: string,\n\talg: SigningAlgorithm = 'ES256',\n): Promise\u003cClientAssertionPrivateJwk\u003e =\u003e {\n\tconst pair = await crypto.subtle.generateKey(getGenerateAlgorithm(alg), true, ['sign', 'verify']);\n\tconst jwk = (await exportPrivateJwkFromKey(pair.privateKey, alg, kid)) as ClientAssertionPrivateJwk;\n\n\t// pre-populate cache so we don't re-import\n\tsetCachedKeyMaterial(jwk, pair.privateKey);\n\n\treturn jwk;\n};\n","import { exportPrivateJwkFromKey, importPkcs8PrivateKey } from '../internal/jwk.js';\nimport { setCachedKeyMaterial } from '../internal/key-cache.js';\nimport type { SigningAlgorithm } from '../jwk/types.js';\n\nimport type { ClientAssertionPrivateJwk } from './types.js';\n\n/**\n * imports a client assertion private key from a pkcs8 pem string.\n *\n * @param pem pkcs8 pem string\n * @param options import options (kid + alg)\n * @returns client assertion private JWK (with cache pre-warmed)\n */\nexport const importClientAssertionPkcs8 = async (\n\tpem: string,\n\toptions: { kid: string; alg: SigningAlgorithm },\n): Promise\u003cClientAssertionPrivateJwk\u003e =\u003e {\n\tconst { kid, alg } = options;\n\tconst cryptoKey = await importPkcs8PrivateKey(pem, alg);\n\tconst jwk = (await exportPrivateJwkFromKey(cryptoKey, alg, kid)) as ClientAssertionPrivateJwk;\n\n\t// pre-populate cache so we don't re-import\n\tsetCachedKeyMaterial(jwk, cryptoKey);\n\n\treturn jwk;\n};\n","import { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\n\n/**\n * computes sha-256 hash and returns base64url-encoded result.\n *\n * @param input string to hash\n * @returns base64url-encoded sha-256 hash\n */\nexport const sha256Base64Url = async (input: string): Promise\u003cstring\u003e =\u003e {\n\tconst bytes = encodeUtf8(input);\n\tconst digest = await toSha256(bytes);\n\treturn toBase64Url(digest);\n};\n","import { nanoid } from 'nanoid';\n\nimport type { CachedKeyMaterial } from '../internal/key-cache.js';\nimport { getCachedKeyMaterial } from '../internal/key-cache.js';\nimport { signJwt } from '../jwt/index.js';\n\nimport type { DpopPrivateJwk } from './types.js';\n\n/**\n * creates a DPoP proof signer.\n *\n * @param jwk DPoP private JWK (with `alg` set)\n * @returns signing function for DPoP proofs\n */\nexport const createDpopProofSigner = (\n\tjwk: DpopPrivateJwk,\n): ((htm: string, htu: string, nonce?: string, ath?: string) =\u003e Promise\u003cstring\u003e) =\u003e {\n\tconst alg = jwk.alg;\n\n\t// lazily resolve key material on first sign\n\tlet materialPromise: Promise\u003cCachedKeyMaterial\u003e | undefined;\n\n\treturn async (htm: string, htu: string, nonce?: string, ath?: string) =\u003e {\n\t\tmaterialPromise ||= getCachedKeyMaterial(jwk);\n\t\tconst { cryptoKey, publicJwk } = await materialPromise;\n\n\t\tconst now = Math.floor(Date.now() / 1_000);\n\n\t\treturn signJwt({\n\t\t\theader: {\n\t\t\t\ttyp: 'dpop+jwt',\n\t\t\t\tjwk: publicJwk,\n\t\t\t},\n\t\t\tpayload: {\n\t\t\t\thtm,\n\t\t\t\thtu,\n\t\t\t\tiat: now,\n\t\t\t\tjti: nanoid(24),\n\t\t\t\tnonce,\n\t\t\t\tath,\n\t\t\t},\n\t\t\tkey: cryptoKey,\n\t\t\talg,\n\t\t});\n\t};\n};\n","import { sha256Base64Url } from '../hash/sha256.js';\n\nimport { createDpopProofSigner } from './proof.js';\nimport type { DpopPrivateJwk, DpopNonceCache } from './types.js';\n\nexport interface CreateDpopFetchOptions {\n\t/** DPoP private key (JWK with `alg` set) */\n\tkey: DpopPrivateJwk;\n\t/** nonce store, keyed by origin */\n\tnonces: DpopNonceCache;\n\t/** server's supported DPoP signing algorithms */\n\tsupportedAlgs?: readonly string[];\n\t/**\n\t * is the target an authorization server (true) or resource server (false)?\n\t * affects how `use_dpop_nonce` errors are detected.\n\t */\n\tisAuthServer?: boolean;\n\t/** custom fetch implementation */\n\tfetch?: typeof globalThis.fetch;\n}\n\n/**\n * creates a fetch wrapper that adds DPoP proofs to requests.\n *\n * @param options DPoP configuration\n * @returns fetch function with DPoP support\n */\nexport const createDpopFetch = (options: CreateDpopFetchOptions): typeof globalThis.fetch =\u003e {\n\tconst { key, nonces, supportedAlgs, isAuthServer, fetch = globalThis.fetch } = options;\n\n\tnegotiateAlg(key, supportedAlgs);\n\tconst sign = createDpopProofSigner(key);\n\n\treturn async (input, init) =\u003e {\n\t\tconst request: Request = init == null \u0026\u0026 input instanceof Request ? input : new Request(input, init);\n\n\t\tconst authHeader = request.headers.get('Authorization');\n\t\tconst ath = authHeader?.startsWith('DPoP ') ? await sha256Base64Url(authHeader.slice(5)) : undefined;\n\n\t\tconst { origin } = new URL(request.url);\n\t\tconst htm = request.method;\n\t\tconst htu = buildHtu(request.url);\n\n\t\tlet initNonce: string | undefined;\n\t\ttry {\n\t\t\tinitNonce = await nonces.get(origin);\n\t\t} catch {\n\t\t\t// ignore get errors\n\t\t}\n\n\t\tconst initProof = await sign(htm, htu, initNonce, ath);\n\t\trequest.headers.set('DPoP', initProof);\n\n\t\tconst initResponse = await fetch(request);\n\n\t\tconst nextNonce = initResponse.headers.get('DPoP-Nonce');\n\t\tif (!nextNonce || nextNonce === initNonce) {\n\t\t\treturn initResponse;\n\t\t}\n\n\t\ttry {\n\t\t\tawait nonces.set(origin, nextNonce);\n\t\t} catch {\n\t\t\t// ignore set errors\n\t\t}\n\n\t\tconst shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n\t\tif (!shouldRetry) {\n\t\t\treturn initResponse;\n\t\t}\n\n\t\tif (input === request || init?.body instanceof ReadableStream) {\n\t\t\treturn initResponse;\n\t\t}\n\n\t\tawait initResponse.body?.cancel();\n\n\t\tconst nextProof = await sign(htm, htu, nextNonce, ath);\n\t\tconst nextRequest = new Request(input, init);\n\t\tnextRequest.headers.set('DPoP', nextProof);\n\n\t\tconst retryResponse = await fetch(nextRequest);\n\n\t\tconst retryNonce = retryResponse.headers.get('DPoP-Nonce');\n\t\tif (retryNonce \u0026\u0026 retryNonce !== nextNonce) {\n\t\t\ttry {\n\t\t\t\tawait nonces.set(origin, retryNonce);\n\t\t\t} catch {\n\t\t\t\t// ignore set errors\n\t\t\t}\n\t\t}\n\n\t\treturn retryResponse;\n\t};\n};\n\nconst buildHtu = (url: string): string =\u003e {\n\tconst fragmentIdx = url.indexOf('#');\n\tconst queryIdx = url.indexOf('?');\n\tconst end = fragmentIdx === -1 ? queryIdx : queryIdx === -1 ? fragmentIdx : Math.min(fragmentIdx, queryIdx);\n\n\treturn end === -1 ? url : url.slice(0, end);\n};\n\nconst negotiateAlg = (key: DpopPrivateJwk, supportedAlgs?: readonly string[]): string =\u003e {\n\tconst keyAlg = key.alg;\n\n\tif (supportedAlgs?.length) {\n\t\tif (supportedAlgs.includes(keyAlg)) {\n\t\t\treturn keyAlg;\n\t\t}\n\t\tthrow new Error(`DPoP key algorithm ${keyAlg} not supported by server: ${supportedAlgs.join(', ')}`);\n\t}\n\n\treturn keyAlg;\n};\n\nconst isUseDpopNonceError = async (response: Response, isAuthServer?: boolean): Promise\u003cboolean\u003e =\u003e {\n\tif (isAuthServer === undefined || isAuthServer === false) {\n\t\tif (response.status === 401) {\n\t\t\tconst wwwAuth = response.headers.get('WWW-Authenticate');\n\t\t\tif (wwwAuth?.startsWith('DPoP')) {\n\t\t\t\treturn wwwAuth.includes('error=\"use_dpop_nonce\"');\n\t\t\t}\n\t\t}\n\t}\n\n\tif (isAuthServer === undefined || isAuthServer === true) {\n\t\tif (response.status === 400) {\n\t\t\ttry {\n\t\t\t\tconst json = await response.clone().json();\n\t\t\t\treturn typeof json === 'object' \u0026\u0026 json?.error === 'use_dpop_nonce';\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n};\n","import { getGenerateAlgorithm } from '../internal/crypto.js';\nimport { exportPrivateJwkFromKey, isSigningAlgorithm } from '../internal/jwk.js';\nimport { setCachedKeyMaterial } from '../internal/key-cache.js';\nimport type { SigningAlgorithm } from '../jwk/types.js';\n\nimport type { DpopPrivateJwk } from './types.js';\n\n/**\n * preferred algorithm order for DPoP key generation.\n */\nconst PREFERRED_ALGORITHMS: readonly SigningAlgorithm[] = [\n\t'ES256',\n\t'ES384',\n\t'ES512',\n\t'PS256',\n\t'PS384',\n\t'PS512',\n\t'RS256',\n\t'RS384',\n\t'RS512',\n];\n\nconst sortAlgorithms = (algs: readonly SigningAlgorithm[]): SigningAlgorithm[] =\u003e {\n\treturn [...algs].sort((a, b) =\u003e {\n\t\tconst aIdx = PREFERRED_ALGORITHMS.indexOf(a);\n\t\tconst bIdx = PREFERRED_ALGORITHMS.indexOf(b);\n\n\t\tif (aIdx === -1 \u0026\u0026 bIdx === -1) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (aIdx === -1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (bIdx === -1) {\n\t\t\treturn -1;\n\t\t}\n\n\t\treturn aIdx - bIdx;\n\t});\n};\n\n/**\n * generates a new DPoP private JWK with `alg` set.\n *\n * @param supportedAlgs server supported algorithms (optional)\n * @returns private JWK (with cache pre-warmed)\n */\nexport const generateDpopKey = async (supportedAlgs?: readonly string[]): Promise\u003cDpopPrivateJwk\u003e =\u003e {\n\tconst normalized = supportedAlgs?.filter(isSigningAlgorithm) ?? [];\n\tif (supportedAlgs?.length \u0026\u0026 normalized.length === 0) {\n\t\tthrow new Error(`no supported algorithms provided`);\n\t}\n\n\tconst algs: SigningAlgorithm[] = normalized.length ? sortAlgorithms(normalized) : ['ES256'];\n\tconst errors: unknown[] = [];\n\n\tfor (const alg of algs) {\n\t\ttry {\n\t\t\tconst pair = await crypto.subtle.generateKey(getGenerateAlgorithm(alg), true, ['sign', 'verify']);\n\t\t\tconst jwk = (await exportPrivateJwkFromKey(pair.privateKey, alg)) as DpopPrivateJwk;\n\n\t\t\t// pre-populate cache so we don't re-import\n\t\t\tsetCachedKeyMaterial(jwk, pair.privateKey);\n\n\t\t\treturn jwk;\n\t\t} catch (err) {\n\t\t\terrors.push(err);\n\t\t}\n\t}\n\n\tthrow new AggregateError(errors, `failed to generate DPoP key for any of: ${algs.join(', ')}`);\n};\n","import { fromBase64Url } from '@atcute/multibase';\nimport { decodeUtf8From } from '@atcute/uint8array';\n\nimport * as v from '@badrap/valita';\n\nimport { getImportAlgorithm } from '../internal/crypto.js';\nimport { computeJktFromJwk } from '../jwk/compute-jkt.js';\nimport type { PublicJwk, SigningAlgorithm } from '../jwk/types.js';\nimport { verifyJwt } from '../jwt/index.js';\n\nimport type { Awaitable } from './types.js';\n\nconst dpopJwkSchema = v.union(\n\tv.object({\n\t\tkty: v.literal('EC'),\n\t\tcrv: v.union(v.literal('P-256'), v.literal('P-384'), v.literal('P-521')),\n\t\tx: v.string(),\n\t\ty: v.string(),\n\t}),\n\tv.object({\n\t\tkty: v.literal('RSA'),\n\t\te: v.string(),\n\t\tn: v.string(),\n\t}),\n);\n\nconst dpopHeaderSchema = v.object({\n\ttyp: v.literal('dpop+jwt'),\n\talg: v.string().assert((alg) =\u003e alg !== 'none', 'alg must not be \"none\"'),\n\tjwk: dpopJwkSchema,\n});\n\nconst dpopPayloadSchema = v.object({\n\thtm: v.string(),\n\thtu: v.string(),\n\tiat: v.number(),\n\tjti: v.string(),\n\tnonce: v.string().optional(),\n});\n\nexport type DpopClaims = v.Infer\u003ctypeof dpopPayloadSchema\u003e;\ntype DpopJwk = v.Infer\u003ctypeof dpopJwkSchema\u003e;\n\nexport interface DpopVerifyResult {\n\tclaims: DpopClaims;\n\tjkt: string;\n\tjwk: PublicJwk;\n}\n\nexport interface DpopVerifyOptions {\n\tmethod: string;\n\turl: string;\n\tnonce?: { check(nonce: string): Awaitable\u003cboolean\u003e };\n\tmaxClockSkew?: number;\n}\n\n/**\n * error thrown when dpop verification fails.\n */\nexport class DpopVerifyError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic code: 'missing' | 'invalid' | 'expired' | 'nonce_required',\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'DpopVerifyError';\n\t}\n}\n\n/**\n * verifies a dpop proof from a request header.\n *\n * @param dpopHeader dpop header value\n * @param options verification options\n * @returns verification result with claims and jwk thumbprint\n * @throws {DpopVerifyError} if verification fails\n */\nexport const verifyDpopProof = async (\n\tdpopHeader: string | null | undefined,\n\toptions: DpopVerifyOptions,\n): Promise\u003cDpopVerifyResult\u003e =\u003e {\n\tif (!dpopHeader) {\n\t\tthrow new DpopVerifyError(`missing dpop header`, 'missing');\n\t}\n\n\tconst { method, url, nonce: dpopNonce, maxClockSkew = 60 } = options;\n\tconst parts = dpopHeader.split('.');\n\tif (parts.length !== 3) {\n\t\tthrow new DpopVerifyError(`invalid dpop proof format`, 'invalid');\n\t}\n\n\tlet header: v.Infer\u003ctypeof dpopHeaderSchema\u003e;\n\ttry {\n\t\theader = dpopHeaderSchema.parse(decodeSegment(parts[0]), { mode: 'passthrough' });\n\t} catch {\n\t\tthrow new DpopVerifyError(`invalid dpop header`, 'invalid');\n\t}\n\n\tconst { jwk, alg } = header;\n\tif (!isSigningAlgorithm(alg)) {\n\t\tthrow new DpopVerifyError(`unsupported dpop alg`, 'invalid');\n\t}\n\n\tlet payload: DpopClaims;\n\ttry {\n\t\tconst key = await importPublicKey(jwk, alg);\n\t\tconst raw = await verifyJwt(dpopHeader, { key, alg, typ: 'dpop+jwt' });\n\t\tpayload = dpopPayloadSchema.parse(raw, { mode: 'passthrough' });\n\t} catch (err) {\n\t\tif (err instanceof v.ValitaError) {\n\t\t\tthrow new DpopVerifyError(`invalid dpop payload`, 'invalid');\n\t\t}\n\t\tthrow new DpopVerifyError(`dpop signature verification failed`, 'invalid');\n\t}\n\n\tif (payload.htm !== method) {\n\t\tthrow new DpopVerifyError(`dpop htm mismatch: expected ${method}, got ${payload.htm}`, 'invalid');\n\t}\n\tif (payload.htu !== url) {\n\t\tthrow new DpopVerifyError(`dpop htu mismatch: expected ${url}, got ${payload.htu}`, 'invalid');\n\t}\n\n\tconst now = Math.floor(Date.now() / 1000);\n\tif (payload.iat \u003e now + maxClockSkew) {\n\t\tthrow new DpopVerifyError(`dpop proof issued in the future`, 'invalid');\n\t}\n\tif (payload.iat \u003c now - maxClockSkew) {\n\t\tthrow new DpopVerifyError(`dpop proof expired`, 'expired');\n\t}\n\n\tif (dpopNonce) {\n\t\tif (!payload.nonce || !(await dpopNonce.check(payload.nonce))) {\n\t\t\tthrow new DpopVerifyError(`invalid or missing dpop nonce`, 'nonce_required');\n\t\t}\n\t}\n\n\tconst jkt = await computeJktFromJwk(jwk as PublicJwk);\n\n\treturn { claims: payload, jwk: jwk as DpopJwk, jkt };\n};\n\nconst importPublicKey = async (jwk: PublicJwk, alg: SigningAlgorithm): Promise\u003cCryptoKey\u003e =\u003e {\n\tconst algorithm = getImportAlgorithm(alg, jwk.kty === 'EC' ? jwk.crv : undefined);\n\tconst key = await crypto.subtle.importKey('jwk', jwk, algorithm, true, ['verify']);\n\tif (!(key instanceof CryptoKey)) {\n\t\tthrow new Error(`expected asymmetric key, got symmetric`);\n\t}\n\n\treturn key;\n};\n\nconst isSigningAlgorithm = (alg: string): alg is SigningAlgorithm =\u003e {\n\treturn (\n\t\talg === 'ES256' ||\n\t\talg === 'ES384' ||\n\t\talg === 'ES512' ||\n\t\talg === 'PS256' ||\n\t\talg === 'PS384' ||\n\t\talg === 'PS512' ||\n\t\talg === 'RS256' ||\n\t\talg === 'RS384' ||\n\t\talg === 'RS512'\n\t);\n};\n\nconst decodeSegment = (segment: string): unknown =\u003e {\n\tconst bytes = fromBase64Url(segment);\n\treturn JSON.parse(decodeUtf8From(bytes));\n};\n","import { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\n\nimport type { PublicJwk } from './types.js';\n\n/**\n * computes the jwk thumbprint (rfc 7638) for a public key.\n *\n * @param jwk public jwk\n * @returns base64url-encoded sha-256 thumbprint\n */\nexport const computeJktFromJwk = async (jwk: PublicJwk): Promise\u003cstring\u003e =\u003e {\n\tlet canonical: Record\u003cstring, string\u003e;\n\n\tif (jwk.kty === 'EC') {\n\t\tconst { crv, x, y } = jwk;\n\t\tcanonical = { crv, kty: jwk.kty, x, y };\n\t} else {\n\t\tconst { e, n } = jwk;\n\t\tcanonical = { e, kty: jwk.kty, n };\n\t}\n\n\tconst serialized = JSON.stringify(canonical);\n\tconst hash = await toSha256(encodeUtf8(serialized));\n\n\treturn toBase64Url(hash);\n};\n","import { nanoid } from 'nanoid';\n\nimport { sha256Base64Url } from './sha256.js';\n\n/**\n * generates pkce verifier and challenge (s256).\n *\n * @param length verifier length (43-128 per rfc 7636)\n * @returns pkce values\n */\nexport const generatePkce = async (\n\tlength = 64,\n): Promise\u003c{ verifier: string; challenge: string; method: 'S256' }\u003e =\u003e {\n\tconst verifier = nanoid(length);\n\tconst challenge = await sha256Base64Url(verifier);\n\n\treturn { verifier, challenge, method: 'S256' };\n};\n","import { exportPkcs8PrivateKey as exportPkcs8 } from '../internal/jwk.js';\nimport { getCachedKeyMaterial } from '../internal/key-cache.js';\n\nimport type { PrivateJwk } from './types.js';\n\n/**\n * exports a private JWK to PKCS8 PEM format.\n *\n * @param jwk private JWK to export\n * @returns PKCS8 PEM string\n */\nexport const exportPkcs8PrivateKey = async (jwk: PrivateJwk): Promise\u003cstring\u003e =\u003e {\n\tconst { cryptoKey } = await getCachedKeyMaterial(jwk);\n\treturn exportPkcs8(cryptoKey);\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/uint8array@1.1.1/es2022/uint8array.mjs
··· 1 - /* esm.sh - @atcute/uint8array@1.1.1 */ 2 - var E=new TextEncoder,S=new TextDecoder,I=crypto.subtle,j=n=>new Uint8Array(n),D=j,L=(n,e)=>{let t=n.length,u=e.length;if(t>u)return 1;if(t<u)return-1;for(let r=0;r<t;r++){let c=n[r],o=e[r];if(c<o)return-1;if(c>o)return 1}return 0},R=(n,e)=>{if(n===e)return!0;let t;if((t=n.length)===e.length){for(;t--;)if(n[t]!==e[t])return!1}return t===-1},T=(n,e)=>{let t,u=0;if((t=n.length)===e.length)for(;t--;)u|=n[t]^e[t];return t===-1&&u===0},_=(n,e)=>{let t=0,u=n.length,r;if(e===void 0)for(r=e=0;r<u;r++){let o=n[r];e+=o.length}let c=new Uint8Array(e);for(r=0;r<u;r++){let o=n[r];c.set(o,t),t+=o.length}return c},B=n=>E.encode(n),F=(n,e,t,u)=>{let r;return t===void 0?r=n:u===void 0?r=n.subarray(t):r=n.subarray(t,t+u),E.encodeInto(e,r).written},s=String.fromCharCode,q=(n,e,t)=>{if(t<4){if(t<2){if(t===0)return"";let k=n[e];return k&128?null:s(k)}let l=n[e],x=n[e+1];if((l|x)&128)return null;if(t===2)return s(l,x);let h=n[e+2];return h&128?null:s(l,x,h)}let u=n[e],r=n[e+1],c=n[e+2],o=n[e+3];if((u|r|c|o)&128)return null;if(t<8){if(t===4)return s(u,r,c,o);let l=n[e+4];if(l&128)return null;if(t===5)return s(u,r,c,o,l);let x=n[e+5];if(x&128)return null;if(t===6)return s(u,r,c,o,l,x);let h=n[e+6];return h&128?null:s(u,r,c,o,l,x,h)}let i=n[e+4],f=n[e+5],d=n[e+6],a=n[e+7];if((i|f|d|a)&128)return null;if(t<12){if(t===8)return s(u,r,c,o,i,f,d,a);let l=n[e+8];if(l&128)return null;if(t===9)return s(u,r,c,o,i,f,d,a,l);let x=n[e+9];if(x&128)return null;if(t===10)return s(u,r,c,o,i,f,d,a,l,x);let h=n[e+10];return h&128?null:s(u,r,c,o,i,f,d,a,l,x,h)}let w=n[e+8],b=n[e+9],A=n[e+10],C=n[e+11];if((w|b|A|C)&128)return null;if(t===12)return s(u,r,c,o,i,f,d,a,w,b,A,C);let U=n[e+12];if(U&128)return null;if(t===13)return s(u,r,c,o,i,f,d,a,w,b,A,C,U);let y=n[e+13];if(y&128)return null;if(t===14)return s(u,r,c,o,i,f,d,a,w,b,A,C,U,y);let g=n[e+14];return g&128?null:s(u,r,c,o,i,f,d,a,w,b,A,C,U,y,g)},H=(n,e=0,t=n.length)=>{if(t<=15){let u=q(n,e,t);if(u!==null)return u}return e===0&&t===n.length?S.decode(n):S.decode(n.subarray(e,e+t))},V=n=>{let e=n.length,t=0,u=0;for(;t+3<e;){let r=n.charCodeAt(t),c=n.charCodeAt(t+1),o=n.charCodeAt(t+2),i=n.charCodeAt(t+3);if((r|c|o|i)>=128)break;t+=4,u+=4}for(;t<e;){let r=n.charCodeAt(t);r<128?(t+=1,u+=1):r<2048?(t+=1,u+=2):r<55296||r>56319?(t+=1,u+=3):(t+=2,u+=4)}return u},v=(n,e,t)=>{let u=n.length;if(u*3<e)return!1;if(u>=e&&u*3<=t)return!0;let r=0,c=0;for(;r<u;){let o=n.charCodeAt(r);if(o<128?(r+=1,c+=1):o<2048?(r+=1,c+=2):o<55296||o>56319?(r+=1,c+=3):(r+=2,c+=4),c>t)return!1}return c>=e},G=async n=>new Uint8Array(await I.digest("SHA-256",n)),J=n=>crypto.getRandomValues(new Uint8Array(n));export{j as alloc,D as allocUnsafe,L as compare,_ as concat,H as decodeUtf8From,B as encodeUtf8,F as encodeUtf8Into,R as equals,V as getUtf8Length,v as isUtf8LengthInRange,J as randomBytes,T as timingSafeEquals,G as toSha256}; 3 - //# sourceMappingURL=./uint8array.mjs.map
-1
vendor/esm.sh/@atcute/uint8array@1.1.1/es2022/uint8array.mjs.map
··· 1 - {"mappings":"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","names":["textEncoder","textDecoder","subtle","alloc","size","allocUnsafe","compare","a","b","alen","blen","i","ax","bx","equals","len","timingSafeEquals","out","concat","arrays","written","idx","chunk","buffer","encodeUtf8","str","encodeUtf8Into","to","offset","length","_fromCharCode","_shortString","from","p","c","d","e","f","g","h","j","k","l","m","n","o","decodeUtf8From","result","getUtf8Length","u16pos","u8pos","code","isUtf8LengthInRange","min","max","toSha256","randomBytes"],"sources":["../esm/npm/@atcute/uint8array@1.1.1/node_modules/@atcute/uint8array/lib/index.ts"],"sourcesContent":["const textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\nconst subtle = crypto.subtle;\n\n/**\n * creates an Uint8Array of the requested size, with the contents zeroed\n */\nexport const alloc = (size: number): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\treturn new Uint8Array(size);\n};\n\n/**\n * creates an Uint8Array of the requested size, where the contents may not be\n * zeroed out. only use if you're certain that the contents will be overwritten\n */\nexport const allocUnsafe = alloc;\n\n/**\n * compares two Uint8Array buffers\n */\nexport const compare = (a: Uint8Array, b: Uint8Array): number =\u003e {\n\tconst alen = a.length;\n\tconst blen = b.length;\n\n\tif (alen \u003e blen) {\n\t\treturn 1;\n\t}\n\tif (alen \u003c blen) {\n\t\treturn -1;\n\t}\n\n\tfor (let i = 0; i \u003c alen; i++) {\n\t\tconst ax = a[i];\n\t\tconst bx = b[i];\n\n\t\tif (ax \u003c bx) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (ax \u003e bx) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\treturn 0;\n};\n\n/**\n * checks if the two Uint8Array buffers are equal\n */\nexport const equals = (a: Uint8Array, b: Uint8Array): boolean =\u003e {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tlet len: number;\n\tif ((len = a.length) === b.length) {\n\t\twhile (len--) {\n\t\t\tif (a[len] !== b[len]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn len === -1;\n};\n\n/**\n * checks if the two Uint8Array buffers are equal, timing-safe version\n */\nexport const timingSafeEquals = (a: Uint8Array, b: Uint8Array): boolean =\u003e {\n\tlet len: number;\n\tlet out = 0;\n\tif ((len = a.length) === b.length) {\n\t\twhile (len--) {\n\t\t\tout |= a[len] ^ b[len];\n\t\t}\n\t}\n\n\treturn len === -1 \u0026\u0026 out === 0;\n};\n\n/**\n * concatenates multiple Uint8Array buffers into one\n */\nexport const concat = (arrays: Uint8Array[], size?: number): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\tlet written = 0;\n\n\tlet len = arrays.length;\n\tlet idx: number;\n\n\tif (size === undefined) {\n\t\tfor (idx = size = 0; idx \u003c len; idx++) {\n\t\t\tconst chunk = arrays[idx];\n\t\t\tsize += chunk.length;\n\t\t}\n\t}\n\n\tconst buffer = new Uint8Array(size);\n\n\tfor (idx = 0; idx \u003c len; idx++) {\n\t\tconst chunk = arrays[idx];\n\n\t\tbuffer.set(chunk, written);\n\t\twritten += chunk.length;\n\t}\n\n\treturn buffer;\n};\n\n/**\n * encodes a UTF-8 string\n */\nexport const encodeUtf8 = (str: string): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\treturn textEncoder.encode(str);\n};\n\n/**\n * encodes a UTF-8 string into a given buffer\n */\nexport const encodeUtf8Into = (to: Uint8Array, str: string, offset?: number, length?: number): number =\u003e {\n\tlet buffer: Uint8Array;\n\n\tif (offset === undefined) {\n\t\tbuffer = to;\n\t} else if (length === undefined) {\n\t\tbuffer = to.subarray(offset);\n\t} else {\n\t\tbuffer = to.subarray(offset, offset + length);\n\t}\n\n\tconst result = textEncoder.encodeInto(str, buffer);\n\n\treturn result.written;\n};\n\nconst _fromCharCode = String.fromCharCode;\n\n// fully unrolled short string decoder, inspired by cbor-x\n// returns null if non-ASCII byte encountered, signaling fallback to TextDecoder\nconst _shortString = (from: Uint8Array, p: number, length: number): string | null =\u003e {\n\tif (length \u003c 4) {\n\t\tif (length \u003c 2) {\n\t\t\tif (length === 0) return '';\n\t\t\tconst a = from[p];\n\t\t\tif (a \u0026 0x80) return null;\n\t\t\treturn _fromCharCode(a);\n\t\t}\n\t\tconst a = from[p];\n\t\tconst b = from[p + 1];\n\t\tif ((a | b) \u0026 0x80) return null;\n\t\tif (length === 2) return _fromCharCode(a, b);\n\t\tconst c = from[p + 2];\n\t\tif (c \u0026 0x80) return null;\n\t\treturn _fromCharCode(a, b, c);\n\t}\n\tconst a = from[p];\n\tconst b = from[p + 1];\n\tconst c = from[p + 2];\n\tconst d = from[p + 3];\n\tif ((a | b | c | d) \u0026 0x80) return null;\n\tif (length \u003c 8) {\n\t\tif (length === 4) return _fromCharCode(a, b, c, d);\n\t\tconst e = from[p + 4];\n\t\tif (e \u0026 0x80) return null;\n\t\tif (length === 5) return _fromCharCode(a, b, c, d, e);\n\t\tconst f = from[p + 5];\n\t\tif (f \u0026 0x80) return null;\n\t\tif (length === 6) return _fromCharCode(a, b, c, d, e, f);\n\t\tconst g = from[p + 6];\n\t\tif (g \u0026 0x80) return null;\n\t\treturn _fromCharCode(a, b, c, d, e, f, g);\n\t}\n\tconst e = from[p + 4];\n\tconst f = from[p + 5];\n\tconst g = from[p + 6];\n\tconst h = from[p + 7];\n\tif ((e | f | g | h) \u0026 0x80) return null;\n\tif (length \u003c 12) {\n\t\tif (length === 8) return _fromCharCode(a, b, c, d, e, f, g, h);\n\t\tconst i = from[p + 8];\n\t\tif (i \u0026 0x80) return null;\n\t\tif (length === 9) return _fromCharCode(a, b, c, d, e, f, g, h, i);\n\t\tconst j = from[p + 9];\n\t\tif (j \u0026 0x80) return null;\n\t\tif (length === 10) return _fromCharCode(a, b, c, d, e, f, g, h, i, j);\n\t\tconst k = from[p + 10];\n\t\tif (k \u0026 0x80) return null;\n\t\treturn _fromCharCode(a, b, c, d, e, f, g, h, i, j, k);\n\t}\n\tconst i = from[p + 8];\n\tconst j = from[p + 9];\n\tconst k = from[p + 10];\n\tconst l = from[p + 11];\n\tif ((i | j | k | l) \u0026 0x80) return null;\n\tif (length === 12) return _fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l);\n\tconst m = from[p + 12];\n\tif (m \u0026 0x80) return null;\n\tif (length === 13) return _fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m);\n\tconst n = from[p + 13];\n\tif (n \u0026 0x80) return null;\n\tif (length === 14) return _fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m, n);\n\tconst o = from[p + 14];\n\tif (o \u0026 0x80) return null;\n\treturn _fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);\n};\n\n/**\n * decodes a UTF-8 string from a given buffer\n * @param from source buffer\n * @param offset byte offset to start reading from\n * @param length number of bytes to read\n * @returns decoded string\n */\nexport const decodeUtf8From = (\n\tfrom: Uint8Array,\n\toffset: number = 0,\n\tlength: number = from.length,\n): string =\u003e {\n\tif (length \u003c= 15) {\n\t\tconst result = _shortString(from, offset, length);\n\t\tif (result !== null) return result;\n\t}\n\tif (offset === 0 \u0026\u0026 length === from.length) {\n\t\treturn textDecoder.decode(from);\n\t}\n\treturn textDecoder.decode(from.subarray(offset, offset + length));\n};\n\n/**\n * calculates the UTF-8 byte length of a string\n * @param str string to measure\n * @returns byte length when encoded as UTF-8\n */\nexport const getUtf8Length = (str: string): number =\u003e {\n\tconst len = str.length;\n\n\tlet u16pos = 0;\n\tlet u8pos = 0;\n\n\t// ASCII fast-path: batch process 4 chars at a time\n\twhile (u16pos + 3 \u003c len) {\n\t\tconst a = str.charCodeAt(u16pos);\n\t\tconst b = str.charCodeAt(u16pos + 1);\n\t\tconst c = str.charCodeAt(u16pos + 2);\n\t\tconst d = str.charCodeAt(u16pos + 3);\n\n\t\tif ((a | b | c | d) \u003e= 0x80) {\n\t\t\tbreak;\n\t\t}\n\n\t\tu16pos += 4;\n\t\tu8pos += 4;\n\t}\n\n\t// handle remaining chars\n\twhile (u16pos \u003c len) {\n\t\tconst code = str.charCodeAt(u16pos);\n\n\t\tif (code \u003c 0x80) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 1;\n\t\t} else if (code \u003c 0x800) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 2;\n\t\t} else if (code \u003c 0xd800 || code \u003e 0xdbff) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 3;\n\t\t} else {\n\t\t\tu16pos += 2;\n\t\t\tu8pos += 4;\n\t\t}\n\t}\n\n\treturn u8pos;\n};\n\n/**\n * checks if a string's UTF-8 byte length is within a given range.\n * includes early-exit optimization when exceeding max length.\n * @param str string to measure\n * @param min minimum byte length (inclusive)\n * @param max maximum byte length (inclusive)\n * @returns true if byte length is within [min, max]\n */\nexport const isUtf8LengthInRange = (str: string, min: number, max: number): boolean =\u003e {\n\tconst len = str.length;\n\n\t// fast path: if max possible UTF-8 length is below min, fail\n\tif (len * 3 \u003c min) {\n\t\treturn false;\n\t}\n\n\t// fast path: if UTF-16 length satisfies min and max possible satisfies max\n\tif (len \u003e= min \u0026\u0026 len * 3 \u003c= max) {\n\t\treturn true;\n\t}\n\n\tlet u16pos = 0;\n\tlet u8pos = 0;\n\n\twhile (u16pos \u003c len) {\n\t\tconst code = str.charCodeAt(u16pos);\n\n\t\tif (code \u003c 0x80) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 1;\n\t\t} else if (code \u003c 0x800) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 2;\n\t\t} else if (code \u003c 0xd800 || code \u003e 0xdbff) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 3;\n\t\t} else {\n\t\t\tu16pos += 2;\n\t\t\tu8pos += 4;\n\t\t}\n\n\t\t// early exit once we exceed max\n\t\tif (u8pos \u003e max) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn u8pos \u003e= min;\n};\n\n/**\n * get a SHA-256 digest of this buffer\n */\nexport const toSha256 = async (buffer: Uint8Array\u003cArrayBuffer\u003e): Promise\u003cUint8Array\u003cArrayBuffer\u003e\u003e =\u003e {\n\treturn new Uint8Array(await subtle.digest('SHA-256', buffer));\n};\n\n/**\n * generates cryptographically secure random bytes\n * @param size number of bytes to generate\n * @returns buffer filled with random bytes\n */\nexport const randomBytes = (size: number): Uint8Array\u003cArrayBuffer\u003e =\u003e {\n\treturn crypto.getRandomValues(new Uint8Array(size));\n};\n"],"version":3}
-3
vendor/esm.sh/@atcute/util-fetch@1.0.5/es2022/util-fetch.mjs
··· 1 - /* esm.sh - @atcute/util-fetch@1.0.5 */ 2 - import*as t from"../../../@badrap/valita@0.4.6/es2022/valita.mjs";function y(...e){return e.reduce(w)}var w=(e,r)=>n=>e(n).then(r);import"../../../@badrap/valita@0.4.6/es2022/valita.mjs";var p=class extends Error{name="FetchResponseError"},u=class extends p{response;name="FailedResponseError";constructor(r){super(`got http ${r.status}`),this.response=r}get status(){return this.response.status}},i=class extends p{contentType;name="ImproperContentTypeError";constructor(r,n){super(n),this.contentType=r}},a=class extends p{expectedSize;actualSize;name="ImproperContentLengthError";constructor(r,n,o){super(o),this.expectedSize=r,this.actualSize=n}},l=class extends p{name="ImproperResponseError";constructor(r,n){super(r,n)}};var m=class extends TransformStream{constructor(r){let n=0;super({transform(o,s){if(n+=o.length,n>r){s.error(new a(r,n,"response content-length too large"));return}s.enqueue(o)}})}};var v=async e=>{if(e.ok)return e;throw new u(e)},D=e=>async r=>{let n=await g(r,e);return{response:r,text:n}},x=(e,r)=>async n=>{await b(n,e);let o=await g(n,r);try{let s=JSON.parse(o);return{response:n,json:s}}catch(s){throw new l("unexpected json data",{cause:s})}},f=(e,r)=>async n=>{let o=e.parse(n.json,r);return{response:n.response,json:o}},b=async(e,r)=>{let n=e.headers.get("content-type")?.split(";",1)[0].trim();if(n===void 0)throw e.body&&await e.body.cancel(),new i(null,"missing response content-type");if(!r.test(n))throw e.body&&await e.body.cancel(),new i(n,"unexpected response content-type")},g=async(e,r)=>{let n=e.headers.get("content-length");if(n!==null){let c=Number(n);if(!Number.isSafeInteger(c)||c<=0)throw e.body?.cancel(),new a(r,null,"invalid response content-length");if(c>r)throw e.body?.cancel(),new a(r,c,"response content-length too large")}let o=e.body.pipeThrough(new m(r)).pipeThrough(new TextDecoderStream),s="";for await(let c of T(o))s+=c;return s},T=Symbol.asyncIterator in ReadableStream.prototype?e=>e[Symbol.asyncIterator]():e=>{let r=e.getReader();return{[Symbol.asyncIterator](){return this},next(){return r.read()},async return(){return await r.cancel(),{done:!0,value:void 0}},async throw(n){return await r.cancel(n),{done:!0,value:void 0}}}};var d=t.number().assert(e=>Number.isInteger(e)&&e>=0&&e<=2**32-1),R=t.object({name:t.string(),type:t.literal(16)}),I=t.object({name:t.string(),type:t.literal(16),TTL:d,data:t.string().chain(e=>t.ok(e.replace(/^"|"$/g,"").replace(/\\"/g,'"')))}),S=t.object({name:t.string(),type:d,TTL:d,data:t.string()}),j=t.object({Status:d,TC:t.boolean(),RD:t.boolean(),RA:t.boolean(),AD:t.boolean(),CD:t.boolean(),Question:t.tuple([R]),Answer:t.array(I).optional(()=>[]),Authority:t.array(S).optional(),Comment:t.union(t.string(),t.array(t.string())).optional()}),O=y(v,x(/^application\/(dns-)?json$/,16*1024),f(j,{mode:"passthrough"}));export{u as FailedResponseError,p as FetchResponseError,a as ImproperContentLengthError,i as ImproperContentTypeError,l as ImproperResponseError,j as dohJsonTxtResult,O as fetchDohJsonTxt,v as isResponseOk,x as parseResponseAsJson,y as pipe,D as readResponseAsText,f as validateJsonWith}; 3 - //# sourceMappingURL=./util-fetch.mjs.map
-1
vendor/esm.sh/@atcute/util-fetch@1.0.5/es2022/util-fetch.mjs.map
··· 1 - {"mappings":"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","names":["v","pipe","pipeline","pipeTwo","first","second","input","FetchResponseError","FailedResponseError","response","ImproperContentTypeError","contentType","reason","ImproperContentLengthError","expectedSize","actualSize","ImproperResponseError","options","SizeLimitStream","maxSize","bytesRead","chunk","controller","ImproperContentLengthError","isResponseOk","response","FailedResponseError","readResponseAsText","maxSize","text","readResponse","parseResponseAsJson","typeRegex","assertContentType","json","error","ImproperResponseError","validateJsonWith","schema","options","parsed","type","ImproperContentTypeError","rawSize","size","ImproperContentLengthError","stream","SizeLimitStream","chunk","createStreamIterator","reader","uint32","input","question","answer","authority","dohJsonTxtResult","fetchDohJsonTxt","pipe","isResponseOk","parseResponseAsJson","validateJsonWith"],"sources":["../esm/npm/@atcute/util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/doh-json.ts","../esm/npm/@atcute/util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/pipeline.ts","../esm/npm/@atcute/util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/transformers.ts","../esm/npm/@atcute/util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/errors.ts","../esm/npm/@atcute/util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/streams/size-limit.ts"],"sourcesContent":["import * as v from '@badrap/valita';\n\nimport { pipe } from './pipeline.js';\nimport { isResponseOk, parseResponseAsJson, validateJsonWith } from './transformers.js';\n\nconst uint32 = v.number().assert((input) =\u003e Number.isInteger(input) \u0026\u0026 input \u003e= 0 \u0026\u0026 input \u003c= 2 ** 32 - 1);\n\nconst question = v.object({\n\tname: v.string(),\n\ttype: v.literal(16), // TXT\n});\n\nconst answer = v.object({\n\tname: v.string(),\n\ttype: v.literal(16), // TXT\n\tTTL: uint32,\n\tdata: v.string().chain((input) =\u003e {\n\t\treturn v.ok(input.replace(/^\"|\"$/g, '').replace(/\\\\\"/g, '\"'));\n\t}),\n});\n\nconst authority = v.object({\n\tname: v.string(),\n\ttype: uint32,\n\tTTL: uint32,\n\tdata: v.string(),\n});\n\n/** DoH JSON response schema for TXT record queries */\nexport const dohJsonTxtResult = v.object({\n\t/** DNS response code */\n\tStatus: uint32,\n\t/** whether response is truncated */\n\tTC: v.boolean(),\n\t/** whether recursive desired bit is set, always true for Google and Cloudflare DoH */\n\tRD: v.boolean(),\n\t/** whether recursive available bit is set, always true for Google and Cloudflare DoH */\n\tRA: v.boolean(),\n\t/** whether response data was validated with DNSSEC */\n\tAD: v.boolean(),\n\t/** whether client asked to disable DNSSEC validation */\n\tCD: v.boolean(),\n\t/** requested records */\n\tQuestion: v.tuple([question]),\n\t/** answers */\n\tAnswer: v.array(answer).optional(() =\u003e []),\n\t/** authority */\n\tAuthority: v.array(authority).optional(),\n\t/** comment from the DNS server */\n\tComment: v.union(v.string(), v.array(v.string())).optional(),\n});\n\nexport type DohJsonTxtResult = v.Infer\u003ctypeof dohJsonTxtResult\u003e;\n\n/** fetch handler pipeline for DoH JSON TXT record responses */\nexport const fetchDohJsonTxt = pipe(\n\tisResponseOk,\n\tparseResponseAsJson(/^application\\/(dns-)?json$/, 16 * 1024),\n\tvalidateJsonWith(dohJsonTxtResult, { mode: 'passthrough' }),\n);\n","type Transformer\u003cI, O = I\u003e = (input: I) =\u003e Promise\u003cO\u003e;\n\ntype PipelineInput\u003cT extends readonly Transformer\u003cany\u003e[]\u003e = T extends [Transformer\u003cinfer I, any\u003e, ...any[]]\n\t? I\n\t: T extends Transformer\u003cinfer I, any\u003e[]\n\t\t? I\n\t\t: never;\n\ntype PipelineOutput\u003cT extends readonly Transformer\u003cany\u003e[]\u003e = T extends [...any[], Transformer\u003cany, infer O\u003e]\n\t? O\n\t: T extends Transformer\u003cany, infer O\u003e[]\n\t\t? O\n\t\t: never;\n\ntype Pipeline\u003c\n\tF extends readonly Transformer\u003cany\u003e[],\n\tAcc extends readonly Transformer\u003cany\u003e[] = [],\n\u003e = F extends [Transformer\u003cinfer I, infer O\u003e]\n\t? [...Acc, Transformer\u003cI, O\u003e]\n\t: F extends [Transformer\u003cinfer A, any\u003e, ...infer Tail]\n\t\t? Tail extends [Transformer\u003cinfer B, any\u003e, ...any[]]\n\t\t\t? Pipeline\u003cTail, [...Acc, Transformer\u003cA, B\u003e]\u003e\n\t\t\t: Acc\n\t\t: Acc;\n\nexport function pipe(): never;\nexport function pipe\u003cT extends readonly Transformer\u003cany\u003e[]\u003e(\n\t...pipeline: Pipeline\u003cT\u003e extends T ? T : Pipeline\u003cT\u003e\n): (input: PipelineInput\u003cT\u003e) =\u003e Promise\u003cPipelineOutput\u003cT\u003e\u003e;\nexport function pipe\u003cT extends readonly Transformer\u003cany\u003e[]\u003e(\n\t...pipeline: Pipeline\u003cT\u003e extends T ? T : Pipeline\u003cT\u003e\n): (input: PipelineInput\u003cT\u003e) =\u003e Promise\u003cPipelineOutput\u003cT\u003e\u003e {\n\treturn pipeline.reduce(pipeTwo);\n}\n\nconst pipeTwo = \u003cI, O, X = unknown\u003e(\n\tfirst: Transformer\u003cI, X\u003e,\n\tsecond: Transformer\u003cX, O\u003e,\n): ((input: I) =\u003e Promise\u003cO\u003e) =\u003e {\n\treturn (input) =\u003e first(input).then(second);\n};\n","import * as v from '@badrap/valita';\n\nimport * as err from './errors.js';\nimport { SizeLimitStream } from './streams/size-limit.js';\n\nexport type TextResponse = {\n\tresponse: Response;\n\ttext: string;\n};\n\nexport type ParsedJsonResponse\u003cT = unknown\u003e = {\n\tresponse: Response;\n\tjson: T;\n};\n\nexport const isResponseOk = async (response: Response): Promise\u003cResponse\u003e =\u003e {\n\tif (response.ok) {\n\t\treturn response;\n\t}\n\n\tthrow new err.FailedResponseError(response);\n};\n\nexport const readResponseAsText =\n\t(maxSize: number) =\u003e\n\tasync (response: Response): Promise\u003cTextResponse\u003e =\u003e {\n\t\tconst text = await readResponse(response, maxSize);\n\t\treturn { response, text };\n\t};\n\nexport const parseResponseAsJson =\n\t(typeRegex: RegExp, maxSize: number) =\u003e\n\tasync (response: Response): Promise\u003cParsedJsonResponse\u003e =\u003e {\n\t\tawait assertContentType(response, typeRegex);\n\n\t\tconst text = await readResponse(response, maxSize);\n\n\t\ttry {\n\t\t\tconst json = JSON.parse(text);\n\t\t\treturn { response, json };\n\t\t} catch (error) {\n\t\t\tthrow new err.ImproperResponseError(`unexpected json data`, { cause: error });\n\t\t}\n\t};\n\ntype ParseOptions = NonNullable\u003cParameters\u003cv.Type['parse']\u003e[1]\u003e;\n\nexport const validateJsonWith =\n\t\u003cT\u003e(schema: v.Type\u003cT\u003e, options?: ParseOptions) =\u003e\n\tasync (parsed: ParsedJsonResponse): Promise\u003cParsedJsonResponse\u003cT\u003e\u003e =\u003e {\n\t\tconst json = schema.parse(parsed.json, options);\n\t\treturn { response: parsed.response, json };\n\t};\n\nconst assertContentType = async (response: Response, typeRegex: RegExp): Promise\u003cvoid\u003e =\u003e {\n\tconst type = response.headers.get('content-type')?.split(';', 1)[0].trim();\n\n\tif (type === undefined) {\n\t\tif (response.body) {\n\t\t\tawait response.body.cancel();\n\t\t}\n\n\t\tthrow new err.ImproperContentTypeError(null, `missing response content-type`);\n\t}\n\n\tif (!typeRegex.test(type)) {\n\t\tif (response.body) {\n\t\t\tawait response.body.cancel();\n\t\t}\n\n\t\tthrow new err.ImproperContentTypeError(type, `unexpected response content-type`);\n\t}\n};\n\nconst readResponse = async (response: Response, maxSize: number): Promise\u003cstring\u003e =\u003e {\n\tconst rawSize = response.headers.get('content-length');\n\tif (rawSize !== null) {\n\t\tconst size = Number(rawSize);\n\n\t\tif (!Number.isSafeInteger(size) || size \u003c= 0) {\n\t\t\tresponse.body?.cancel();\n\t\t\tthrow new err.ImproperContentLengthError(maxSize, null, `invalid response content-length`);\n\t\t}\n\n\t\tif (size \u003e maxSize) {\n\t\t\tresponse.body?.cancel();\n\t\t\tthrow new err.ImproperContentLengthError(maxSize, size, `response content-length too large`);\n\t\t}\n\t}\n\n\tconst stream = response\n\t\t.body!.pipeThrough(new SizeLimitStream(maxSize))\n\t\t.pipeThrough(new TextDecoderStream());\n\n\tlet text = '';\n\tfor await (const chunk of createStreamIterator(stream)) {\n\t\ttext += chunk;\n\t}\n\n\treturn text;\n};\n\nconst createStreamIterator: \u003cT\u003e(stream: ReadableStream\u003cT\u003e) =\u003e AsyncIterableIterator\u003cT\u003e =\n\tSymbol.asyncIterator in ReadableStream.prototype\n\t\t? (stream) =\u003e stream[Symbol.asyncIterator]()\n\t\t: (stream) =\u003e {\n\t\t\t\tconst reader = stream.getReader();\n\n\t\t\t\treturn {\n\t\t\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t},\n\t\t\t\t\tnext() {\n\t\t\t\t\t\treturn reader.read() as Promise\u003cIteratorResult\u003cany\u003e\u003e;\n\t\t\t\t\t},\n\t\t\t\t\tasync return() {\n\t\t\t\t\t\tawait reader.cancel();\n\t\t\t\t\t\treturn { done: true, value: undefined };\n\t\t\t\t\t},\n\t\t\t\t\tasync throw(error: unknown) {\n\t\t\t\t\t\tawait reader.cancel(error);\n\t\t\t\t\t\treturn { done: true, value: undefined };\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t};\n","export class FetchResponseError extends Error {\n\toverride name = 'FetchResponseError';\n}\n\nexport class FailedResponseError extends FetchResponseError {\n\toverride name = 'FailedResponseError';\n\n\tconstructor(public response: Response) {\n\t\tsuper(`got http ${response.status}`);\n\t}\n\n\tget status(): number {\n\t\treturn this.response.status;\n\t}\n}\n\nexport class ImproperContentTypeError extends FetchResponseError {\n\toverride name = 'ImproperContentTypeError';\n\n\tconstructor(\n\t\tpublic contentType: string | null,\n\t\treason: string,\n\t) {\n\t\tsuper(reason);\n\t}\n}\n\nexport class ImproperContentLengthError extends FetchResponseError {\n\toverride name = 'ImproperContentLengthError';\n\n\tconstructor(\n\t\tpublic expectedSize: number,\n\t\tpublic actualSize: number | null,\n\t\treason: string,\n\t) {\n\t\tsuper(reason);\n\t}\n}\n\nexport class ImproperResponseError extends FetchResponseError {\n\toverride name = 'ImproperResponseError';\n\n\tconstructor(reason: string, options?: ErrorOptions) {\n\t\tsuper(reason, options);\n\t}\n}\n","import * as err from '../errors.js';\n\nexport class SizeLimitStream extends TransformStream\u003cUint8Array\u003cArrayBuffer\u003e, Uint8Array\u003cArrayBuffer\u003e\u003e {\n\tconstructor(maxSize: number) {\n\t\tlet bytesRead = 0;\n\n\t\tsuper({\n\t\t\ttransform(chunk, controller) {\n\t\t\t\tbytesRead += chunk.length;\n\n\t\t\t\tif (bytesRead \u003e maxSize) {\n\t\t\t\t\tcontroller.error(\n\t\t\t\t\t\tnew err.ImproperContentLengthError(maxSize, bytesRead, `response content-length too large`),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t},\n\t\t});\n\t}\n}\n"],"version":3}
-3
vendor/esm.sh/@atcute/util-text@1.2.0/es2022/util-text.mjs
··· 1 - /* esm.sh - @atcute/util-text@1.2.0 */ 2 - var c=t=>{let n=t.length,e=0;for(;e+3<n;){let r=t.charCodeAt(e),s=t.charCodeAt(e+1),o=t.charCodeAt(e+2),i=t.charCodeAt(e+3);if((r|s|o|i)>127||r===13||s===13||o===13||i===13)return!1;e+=4}for(;e<n;){let r=t.charCodeAt(e);if(r>127||r===13)return!1;e++}return!0};var h=new Intl.Segmenter,a=t=>{if(c(t))return t.length;let n=h.segment(t)[Symbol.iterator](),e=0;for(;!n.next().done;)e++;return e},d=(t,n,e)=>{let r=t.length;if(r<n)return!1;if(n===0&&r<=e)return!0;if(c(t))return r<=e;let s=h.segment(t)[Symbol.iterator](),o=0;for(;!s.next().done;)if(o++,o>e)return!1;return o>=n};export{a as getGraphemeLength,d as isGraphemeLengthInRange}; 3 - //# sourceMappingURL=./util-text.mjs.map
-1
vendor/esm.sh/@atcute/util-text@1.2.0/es2022/util-text.mjs.map
··· 1 - {"mappings":";AAAO,IAAMA,EAAoBC,GAAyB,CACzD,IAAMC,EAAMD,EAAK,OACbE,EAAM,EAEV,KAAOA,EAAM,EAAID,GAAK,CACrB,IAAME,EAAIH,EAAK,WAAWE,CAAG,EACvBE,EAAIJ,EAAK,WAAWE,EAAM,CAAC,EAC3BG,EAAIL,EAAK,WAAWE,EAAM,CAAC,EAC3BI,EAAIN,EAAK,WAAWE,EAAM,CAAC,EAEjC,IAAKC,EAAIC,EAAIC,EAAIC,GAAK,KAAQH,IAAM,IAAQC,IAAM,IAAQC,IAAM,IAAQC,IAAM,GAC7E,MAAO,GAGRJ,GAAO,CACR,CAEA,KAAOA,EAAMD,GAAK,CACjB,IAAMM,EAAOP,EAAK,WAAWE,CAAG,EAChC,GAAIK,EAAO,KAAQA,IAAS,GAC3B,MAAO,GAGRL,GACD,CAEA,MAAO,EACR,ECzBA,IAAMM,EAAY,IAAI,KAAK,UAOdC,EAAqBC,GAAwB,CACzD,GAAIC,EAAiBD,CAAI,EACxB,OAAOA,EAAK,OAGb,IAAME,EAAWJ,EAAU,QAAQE,CAAI,EAAE,OAAO,QAAQ,EAAC,EACrDG,EAAQ,EAEZ,KAAO,CAACD,EAAS,KAAI,EAAG,MACvBC,IAGD,OAAOA,CACR,EASaC,EAA0B,CAACJ,EAAcK,EAAaC,IAAwB,CAC1F,IAAMC,EAAWP,EAAK,OAGtB,GAAIO,EAAWF,EACd,MAAO,GAKR,GAAIA,IAAQ,GAAKE,GAAYD,EAC5B,MAAO,GAGR,GAAIL,EAAiBD,CAAI,EACxB,OAAOO,GAAYD,EAIpB,IAAMJ,EAAWJ,EAAU,QAAQE,CAAI,EAAE,OAAO,QAAQ,EAAC,EACrDG,EAAQ,EAEZ,KAAO,CAACD,EAAS,KAAI,EAAG,MAEvB,GADAC,IACIA,EAAQG,EACX,MAAO,GAIT,OAAOH,GAASE,CACjB","names":["isAsciiWithoutCr","text","len","idx","a","b","c","d","code","segmenter","getGraphemeLength","text","isAsciiWithoutCr","iterator","count","isGraphemeLengthInRange","min","max","utf16Len"],"sources":["../esm/npm/@atcute/util-text@1.2.0/node_modules/@atcute/util-text/lib/utils.ts","../esm/npm/@atcute/util-text@1.2.0/node_modules/@atcute/util-text/lib/index.ts"],"sourcesContent":["export const isAsciiWithoutCr = (text: string): boolean =\u003e {\n\tconst len = text.length;\n\tlet idx = 0;\n\n\twhile (idx + 3 \u003c len) {\n\t\tconst a = text.charCodeAt(idx);\n\t\tconst b = text.charCodeAt(idx + 1);\n\t\tconst c = text.charCodeAt(idx + 2);\n\t\tconst d = text.charCodeAt(idx + 3);\n\n\t\tif ((a | b | c | d) \u003e 0x7f || a === 0x0d || b === 0x0d || c === 0x0d || d === 0x0d) {\n\t\t\treturn false;\n\t\t}\n\n\t\tidx += 4;\n\t}\n\n\twhile (idx \u003c len) {\n\t\tconst code = text.charCodeAt(idx);\n\t\tif (code \u003e 0x7f || code === 0x0d) {\n\t\t\treturn false;\n\t\t}\n\n\t\tidx++;\n\t}\n\n\treturn true;\n};\n","import { isAsciiWithoutCr } from './utils.ts';\n\nconst segmenter = new Intl.Segmenter();\n\n/**\n * returns the grapheme length of a string\n * @param text string to count graphemes in\n * @returns grapheme count\n */\nexport const getGraphemeLength = (text: string): number =\u003e {\n\tif (isAsciiWithoutCr(text)) {\n\t\treturn text.length;\n\t}\n\n\tconst iterator = segmenter.segment(text)[Symbol.iterator]();\n\tlet count = 0;\n\n\twhile (!iterator.next().done) {\n\t\tcount++;\n\t}\n\n\treturn count;\n};\n\n/**\n * checks if the grapheme length of a string is within the specified range\n * @param text string to check\n * @param min minimum grapheme length (inclusive)\n * @param max maximum grapheme length (inclusive)\n * @returns true if the grapheme length is within range\n */\nexport const isGraphemeLengthInRange = (text: string, min: number, max: number): boolean =\u003e {\n\tconst utf16Len = text.length;\n\n\t// UTF-16 length \u003c min means grapheme count \u003c min\n\tif (utf16Len \u003c min) {\n\t\treturn false;\n\t}\n\n\t// if there's no minimum constraint and UTF-16 length is within max,\n\t// grapheme count is definitely within max\n\tif (min === 0 \u0026\u0026 utf16Len \u003c= max) {\n\t\treturn true;\n\t}\n\n\tif (isAsciiWithoutCr(text)) {\n\t\treturn utf16Len \u003c= max;\n\t}\n\n\t// count graphemes with early termination\n\tconst iterator = segmenter.segment(text)[Symbol.iterator]();\n\tlet count = 0;\n\n\twhile (!iterator.next().done) {\n\t\tcount++;\n\t\tif (count \u003e max) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn count \u003e= min;\n};\n"],"version":3}
-3
vendor/importmap.js
··· 2 2 importmap.type = "importmap"; 3 3 importmap.textContent = JSON.stringify({ 4 4 imports: { 5 - "@atcute/client": "/y-pds/vendor/esm.sh/@atcute/client@4.2.1/es2022/client.mjs", 6 - "@atcute/identity-resolver": "/y-pds/vendor/esm.sh/@atcute/identity-resolver@1.2.2/es2022/identity-resolver.mjs", 7 - "@atcute/oauth-browser-client": "/y-pds/vendor/esm.sh/@atcute/oauth-browser-client@3.0.0/es2022/oauth-browser-client.mjs", 8 5 "@preact/signals": "/y-pds/vendor/esm.sh/@preact/signals@2.9.0/X-ZXByZWFjdA/es2022/signals.mjs", 9 6 "actor-typeahead": "/y-pds/vendor/esm.sh/actor-typeahead@0.1.2/es2022/actor-typeahead.mjs", 10 7 "htm/preact": "/y-pds/vendor/esm.sh/htm@3.1.1/X-ZXByZWFjdA/es2022/preact.mjs",
-3
vendor/importmap.json
··· 1 1 { 2 2 "imports": { 3 - "@atcute/client": "/y-pds/vendor/esm.sh/@atcute/client@4.2.1/es2022/client.mjs", 4 - "@atcute/identity-resolver": "/y-pds/vendor/esm.sh/@atcute/identity-resolver@1.2.2/es2022/identity-resolver.mjs", 5 - "@atcute/oauth-browser-client": "/y-pds/vendor/esm.sh/@atcute/oauth-browser-client@3.0.0/es2022/oauth-browser-client.mjs", 6 3 "@preact/signals": "/y-pds/vendor/esm.sh/@preact/signals@2.9.0/X-ZXByZWFjdA/es2022/signals.mjs", 7 4 "actor-typeahead": "/y-pds/vendor/esm.sh/actor-typeahead@0.1.2/es2022/actor-typeahead.mjs", 8 5 "htm/preact": "/y-pds/vendor/esm.sh/htm@3.1.1/X-ZXByZWFjdA/es2022/preact.mjs",
-9
vendor/jsconfig.json
··· 1 1 { 2 2 "compilerOptions": { 3 3 "paths": { 4 - "@atcute/client": [ 5 - "./esm.sh/@atcute/client@4.2.1/es2022/client.mjs" 6 - ], 7 - "@atcute/identity-resolver": [ 8 - "./esm.sh/@atcute/identity-resolver@1.2.2/es2022/identity-resolver.mjs" 9 - ], 10 - "@atcute/oauth-browser-client": [ 11 - "./esm.sh/@atcute/oauth-browser-client@3.0.0/es2022/oauth-browser-client.mjs" 12 - ], 13 4 "@preact/signals": [ 14 5 "./esm.sh/@preact/signals@2.9.0/X-ZXByZWFjdA/es2022/signals.mjs" 15 6 ],
+38 -44
y-pds.js
··· 1 - import { Client, simpleFetchHandler } from "@atcute/client"; 2 1 import * as Y from "yjs"; 3 2 import { Awareness, encodeAwarenessUpdate, applyAwarenessUpdate } from "y-protocols/awareness"; 4 3 ··· 13 12 /** @type {Y.Doc} */ 14 13 #ydoc; 15 14 16 - /** @type {Map<string, Client>} */ 17 - #clients = new Map(); 15 + /** @type {Map<string, string>} */ 16 + #pds = new Map(); 18 17 19 18 /** @param {string} did */ 20 - async #getClient(did) { 21 - let client = this.#clients.get(did); 22 - if (client) return client; 19 + async #getPDS(did) { 20 + let pds = this.#pds.get(did); 21 + if (pds) return pds; 23 22 24 - // fetch the did document 25 23 const url = did.startsWith("did:web:") 26 - ? `https://${did.slice("did:web:".length)}/.well-known/did.json` 27 - : `https://plc.directory/${did}`, 28 - res = await fetch(url), 29 - doc = await res.json(); 24 + ? `https://${did.slice("did:web:".length)}/.well-known/did.json` 25 + : `https://plc.directory/${did}`; 26 + const doc = await fetch(url).then(r => r.json()); 30 27 31 - // find the PDS URL 32 - const pds = doc.service?.find(s => s.type === "AtprotoPersonalDataServer")?.serviceEndpoint; 28 + pds = doc.service?.find(s => s.type === "AtprotoPersonalDataServer")?.serviceEndpoint; 33 29 if (!pds) throw new Error(`no PDS found for ${did}`); 34 30 35 - // create a client for that PDS 36 - client = new Client({ handler: simpleFetchHandler({ service: pds }) }); 37 - 38 - this.#clients.set(did, client); 39 - return client; 31 + this.#pds.set(did, pds); 32 + return pds; 40 33 } 41 34 42 35 /** ··· 46 39 * @params {string} options.collection 47 40 */ 48 41 async #getRecord({ repo, collection, rkey }) { 49 - const client = await this.#getClient(repo); 50 - 51 - const res = await client.get("com.atproto.repo.getRecord", { 52 - params: { repo, collection, rkey }, 53 - }); 54 - if (!res.ok) throw new Error(res.data.message); 55 - return res.data; 42 + const pds = await this.#getPDS(repo); 43 + const params = new URLSearchParams({ repo, collection, rkey }); 44 + const res = await fetch(`${pds}/xrpc/com.atproto.repo.getRecord?${params}`); 45 + const data = await res.json(); 46 + if (!res.ok) throw new Error(data.message); 47 + return data; 56 48 } 57 49 58 50 /** ··· 62 54 * @params {string} [options.cursor] 63 55 */ 64 56 async #listRecords({ repo, collection, cursor }) { 65 - const client = await this.#getClient(repo); 66 - 67 - const res = await client.get("com.atproto.repo.listRecords", { 68 - params: { repo, collection, limit: 100, cursor }, 69 - }); 70 - 71 - if (!res.ok) throw new Error(res.data.message); 72 - return res.data; 57 + const pds = await this.#getPDS(repo); 58 + const params = new URLSearchParams({ repo, collection, limit: "100" }); 59 + if (cursor) params.set("cursor", cursor); 60 + const res = await fetch(`${pds}/xrpc/com.atproto.repo.listRecords?${params}`); 61 + const data = await res.json(); 62 + if (!res.ok) throw new Error(data.message); 63 + return data; 73 64 } 74 65 75 66 /** ··· 80 71 * @params {string} [options.rkey] 81 72 */ 82 73 async #upsertRecord({ repo, collection, rkey, record }) { 83 - const client = await this.#getClient(repo); 74 + const pds = await this.#getPDS(repo); 84 75 const verb = rkey ? "com.atproto.repo.putRecord" : "com.atproto.repo.createRecord"; 85 - 86 - const res = await client.post(verb, { 87 - params: {}, 88 - input: { repo, collection, rkey, record: { $type: collection, ...record } }, 76 + const res = await fetch(`${pds}/xrpc/${verb}`, { 77 + method: "POST", 78 + headers: { 79 + "content-type": "application/json", 80 + "x-atsw-did": repo, 81 + }, 82 + body: JSON.stringify({ repo, collection, rkey, record: { $type: collection, ...record } }), 89 83 }); 90 - 91 - if (!res.ok) throw new Error(res.data.message); 92 - return res.data; 84 + const data = await res.json(); 85 + if (!res.ok) throw new Error(data.message); 86 + return data; 93 87 } 94 88 95 89 #ownerDid = ""; ··· 109 103 /** 110 104 * @param {object} options 111 105 * @param {Y.Doc} options.ydoc 112 - * @param {Client} options.client 106 + * @param {string} options.pds 113 107 * @param {string} options.atUri 114 108 * @param {string} options.did 115 109 * @param {Awareness} [options.awareness] ··· 127 121 #awarenessDirty = false; 128 122 #awarenessTimerId = null; 129 123 130 - constructor({ ydoc, client, atUri, did, awareness, jetstream, throttle }) { 131 - this.#clients.set(did, client); 124 + constructor({ ydoc, pds, atUri, did, awareness, jetstream, throttle }) { 125 + this.#pds.set(did, pds); 132 126 this.#ydoc = ydoc; 133 127 134 128 const [ownerDid, , rkey] = atUri.slice("at://".length).split("/");