@keetanetwork/anchor 0.0.65 → 0.0.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/services/username/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { KeetaNet } from '../../client/index.js';\nimport type * as KeetaAnchorHTTPServer from '../../lib/http-server/index.js';\nimport type { KeetaAnchorMetadataServerConfig } from '../../lib/anchor-metadata-server.js';\nimport type {\n\tKeetaUsernameAnchorUsernameResolutionContext,\n\tKeetaUsernameAnchorAccountResolutionContext,\n\tKeetaUsernameAnchorClaimRequest,\n\tKeetaUsernameAnchorClaimRequestPayload,\n\tKeetaUsernameAnchorSearchRequestParameters,\n\tKeetaUsernameAnchorUsernameWithAccount,\n\tKeetaUsernameAnchorSearchResponseJSON,\n\tKeetaUsernameAnchorClaimContext\n} from './common.js';\nimport {\n\tgetUsernameClaimSignable,\n\tvalidateUsernameDefault,\n\tErrors,\n\tisKeetaNetPublicKeyString,\n\tassertKeetaUsernameAnchorClaimRequestJSON,\n\tgetUsernameTransferSignable,\n\tassertKeetaUsernameAnchorReleaseRequestJSON,\n\tgetUsernameReleaseSignable\n} from './common.js';\nimport type { ServiceMetadata, ServiceMetadataAuthenticationType } from '../../lib/resolver.ts';\nimport type { Routes } from '../../lib/http-server/index.ts';\nimport { KeetaAnchorMetadataServer } from '../../lib/anchor-metadata-server.js';\nimport { KeetaAnchorUserError, KeetaAnchorUserValidationError } from '../../lib/error.js';\nimport { verifyBodyAuth } from '../../lib/http-server/common.js';\nimport * as Signing from '../../lib/utils/signing.js';\n\nfunction normalizeUsernamePattern(pattern: string | RegExp): RegExp {\n\tif (typeof pattern === 'string') {\n\t\ttry {\n\t\t\treturn(new RegExp(pattern));\n\t\t} catch (error) {\n\t\t\tthrow(new Error(`Invalid usernamePattern regex: ${error instanceof Error ? error.message : String(error)}`));\n\t\t}\n\t}\n\n\tif (pattern.flags !== '') {\n\t\tthrow(new Error('usernamePattern RegExp must not specify flags')); // Flags cannot be reliably shared via metadata string\n\t}\n\n\treturn(new RegExp(pattern.source));\n}\n\ntype ClaimHandlerResponse = { ok: true; } | { ok: false; taken?: false; } | { ok: false; taken: true; };\ntype SearchHandlerResponse = { results: KeetaUsernameAnchorUsernameWithAccount[] };\n\nexport interface KeetaAnchorUsernameServerConfig extends KeetaAnchorMetadataServerConfig {\n\thomepage?: string | (() => Promise<string> | string);\n\tusernames: {\n\t\tresolveUsername: (input: KeetaUsernameAnchorUsernameResolutionContext) => Promise<{ account: InstanceType<typeof KeetaNet.lib.Account>; } | null>;\n\t\tresolveAccount: (input: KeetaUsernameAnchorAccountResolutionContext) => Promise<{ username: string; } | null>;\n\n\t\treleaseUsername?: (input: { account: InstanceType<typeof KeetaNet.lib.Account>; }) => Promise<{ ok: boolean; }>;\n\t\tclaim?: ((input: KeetaUsernameAnchorClaimContext) => Promise<ClaimHandlerResponse>);\n\n\t\tsearch?: ((input: KeetaUsernameAnchorSearchRequestParameters) => Promise<SearchHandlerResponse>);\n\t};\n\troutes?: Routes;\n\tusernamePattern?: string | RegExp;\n}\n\nexport class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorMetadataServer<NonNullable<ServiceMetadata['services']['username']>[string], KeetaAnchorUsernameServerConfig> {\n\treadonly homepage: NonNullable<KeetaAnchorUsernameServerConfig['homepage']>;\n\treadonly usernames: KeetaAnchorUsernameServerConfig['usernames'];\n\treadonly routes: NonNullable<KeetaAnchorUsernameServerConfig['routes']>;\n\treadonly #usernamePattern?: RegExp;\n\n\tconstructor(config: KeetaAnchorUsernameServerConfig) {\n\t\tsuper(config);\n\n\t\tthis.homepage = config.homepage ?? '';\n\t\tthis.usernames = config.usernames;\n\t\tthis.routes = config.routes ?? {};\n\t\tif (config.usernamePattern !== undefined) {\n\t\t\tthis.#usernamePattern = normalizeUsernamePattern(config.usernamePattern);\n\t\t}\n\t}\n\n\t#assertProviderIssuedNameValid(username: string, fieldPath = 'username'): void {\n\t\tvalidateUsernameDefault(username, {\n\t\t\tpattern: this.#usernamePattern,\n\t\t\tfieldPath: fieldPath\n\t\t});\n\t}\n\n\tprotected async initRoutes(config: KeetaAnchorUsernameServerConfig): Promise<KeetaAnchorHTTPServer.Routes> {\n\t\tconst routes: KeetaAnchorHTTPServer.Routes = { ...this.routes };\n\n\t\tif ('homepage' in config) {\n\t\t\troutes['GET /'] = async function() {\n\t\t\t\tlet homepageData: string;\n\t\t\t\tif (typeof config.homepage === 'string') {\n\t\t\t\t\thomepageData = config.homepage;\n\t\t\t\t} else {\n\t\t\t\t\tif (!config.homepage) {\n\t\t\t\t\t\tthrow(new Error('internal error: No homepage function provided'));\n\t\t\t\t\t}\n\n\t\t\t\t\thomepageData = await config.homepage();\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: homepageData,\n\t\t\t\t\tcontentType: 'text/html; charset=utf-8'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\troutes['GET /api/resolve/:toResolve'] = async (params) => {\n\t\t\tlet toResolve = params.get('toResolve');\n\t\t\tif (!toResolve) {\n\t\t\t\tthrow(new KeetaAnchorUserError('Missing toResolve parameter'));\n\t\t\t}\n\n\t\t\tlet resolution;\n\t\t\tlet account = null;\n\t\t\tlet username = null;\n\t\t\tif (isKeetaNetPublicKeyString(toResolve)) {\n\t\t\t\taccount = KeetaNet.lib.Account.fromPublicKeyString(toResolve);\n\t\t\t\tresolution = await this.usernames.resolveAccount({ account });\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\ttoResolve = decodeURIComponent(toResolve);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\t\t\t\tfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: 'toResolve',\n\t\t\t\t\t\t\t\tmessage: 'toResolve parameter is not a valid URI component',\n\t\t\t\t\t\t\t\treceivedValue: toResolve\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\tthis.#assertProviderIssuedNameValid(toResolve);\n\t\t\t\tusername = toResolve;\n\t\t\t\tresolution = await this.usernames.resolveUsername({ username });\n\t\t\t}\n\n\t\t\tif (!resolution) {\n\t\t\t\tthrow(new Errors.UserNotFound({ username: username ?? undefined, account: account ?? undefined }));\n\t\t\t}\n\n\t\t\tif ('account' in resolution) {\n\t\t\t\tif (account !== null && !(account.comparePublicKey(resolution.account))) {\n\t\t\t\t\tthrow(new Error('internal: Resolved account does not match requested account'));\n\t\t\t\t}\n\n\t\t\t\taccount = resolution.account;\n\t\t\t}\n\n\t\t\tif ('username' in resolution) {\n\t\t\t\tif (username !== null && username !== resolution.username) {\n\t\t\t\t\tthrow(new Error('internal: Resolved username does not match requested username'));\n\t\t\t\t}\n\n\t\t\t\tusername = resolution.username;\n\t\t\t}\n\n\t\t\tif (!account || !username) {\n\t\t\t\tthrow(new Error('internal: We should know both the account and username here'));\n\t\t\t}\n\n\t\t\treturn({\n\t\t\t\toutput: JSON.stringify({\n\t\t\t\t\tok: true,\n\t\t\t\t\taccount: KeetaNet.lib.Account.toPublicKeyString(account),\n\t\t\t\t\tusername: username\n\t\t\t\t}),\n\t\t\t\tcontentType: 'application/json'\n\t\t\t});\n\t\t};\n\n\t\tconst claimHandler = this.usernames.claim;\n\t\tif (claimHandler) {\n\t\t\troutes['POST /api/claim'] = async (_params, body) => {\n\t\t\t\tconst raw = assertKeetaUsernameAnchorClaimRequestJSON(body);\n\n\t\t\t\tthis.#assertProviderIssuedNameValid(raw.username);\n\n\t\t\t\tlet transfer: KeetaUsernameAnchorClaimRequest['transfer'];\n\t\t\t\tif (raw.transfer) {\n\t\t\t\t\tconst fromAccount = KeetaNet.lib.Account.toAccount(raw.transfer.from);\n\t\t\t\t\tconst toAccount = KeetaNet.lib.Account.toAccount(raw.account);\n\t\t\t\t\tconst transferSignable = getUsernameTransferSignable({\n\t\t\t\t\t\tusername: raw.username,\n\t\t\t\t\t\tfrom: fromAccount,\n\t\t\t\t\t\tto: toAccount\n\t\t\t\t\t});\n\n\t\t\t\t\tconst verifiedTransfer = await Signing.VerifySignedData(fromAccount, transferSignable, raw.transfer.signed);\n\t\t\t\t\tif (!verifiedTransfer) {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserError('Invalid username claim transfer signature'));\n\t\t\t\t\t}\n\n\t\t\t\t\ttransfer = { from: fromAccount, signed: raw.transfer.signed };\n\t\t\t\t}\n\n\t\t\t\tconst account = await verifyBodyAuth(raw, function(req) {\n\t\t\t\t\tconst claimAccount = KeetaNet.lib.Account.toAccount(req.account);\n\t\t\t\t\tconst claimPayload: KeetaUsernameAnchorClaimRequestPayload = {\n\t\t\t\t\t\tusername: req.username,\n\t\t\t\t\t\taccount: claimAccount\n\t\t\t\t\t};\n\t\t\t\t\tif (transfer) {\n\t\t\t\t\t\tclaimPayload.transfer = transfer;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn(getUsernameClaimSignable(claimPayload));\n\t\t\t\t}, this.resolvedCertificateChainRequirement);\n\n\t\t\t\tconst claimResponse = await claimHandler({\n\t\t\t\t\tusername: raw.username,\n\t\t\t\t\taccount,\n\t\t\t\t\tfromUser: transfer?.from ?? null\n\t\t\t\t});\n\n\t\t\t\tif (!claimResponse.ok) {\n\t\t\t\t\tif (claimResponse.taken) {\n\t\t\t\t\t\tthrow(new Errors.UsernameAlreadyTaken({ username: raw.username }));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserError('Username claim rejected'));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify({ ok: true }),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tconst releaseHandler = this.usernames.releaseUsername;\n\t\tif (releaseHandler) {\n\t\t\troutes['POST /api/release'] = async (_params, body) => {\n\t\t\t\tconst raw = assertKeetaUsernameAnchorReleaseRequestJSON(body);\n\t\t\t\tconst account = await verifyBodyAuth(raw, function(req) {\n\t\t\t\t\treturn(getUsernameReleaseSignable({ account: KeetaNet.lib.Account.toAccount(req.account) }));\n\t\t\t\t}, this.resolvedCertificateChainRequirement);\n\n\t\t\t\tconst releaseResponse = await releaseHandler({ account });\n\n\t\t\t\tif (!releaseResponse.ok) {\n\t\t\t\t\tthrow(new KeetaAnchorUserError('Release claim rejected'));\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify({ ok: true }),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tconst searchHandler = this.usernames.search;\n\t\tif (searchHandler) {\n\t\t\troutes['GET /api/search'] = async (_ignore_params, _ignore_body, _ignore_headers, url) => {\n\t\t\t\tconst request: KeetaUsernameAnchorSearchRequestParameters = (() => {\n\t\t\t\t\tconst searchParameter = url.searchParams.get('search');\n\n\t\t\t\t\tif (!searchParameter) {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\t\t\t\t\tfields: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath: 'search',\n\t\t\t\t\t\t\t\t\tmessage: 'Missing search parameter',\n\t\t\t\t\t\t\t\t\treceivedValue: searchParameter\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#assertProviderIssuedNameValid(searchParameter, 'search');\n\n\t\t\t\t\treturn({ search: searchParameter });\n\t\t\t\t})();\n\n\t\t\t\tconst searchResponse = await searchHandler(request);\n\n\t\t\t\tconst formatted: KeetaUsernameAnchorSearchResponseJSON = {\n\t\t\t\t\tok: true,\n\t\t\t\t\tresults: searchResponse.results.map(function(result) {\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\tusername: result.username,\n\t\t\t\t\t\t\taccount: result.account.publicKeyString.get()\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify(formatted),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\n\t\treturn(routes);\n\t}\n\n\tprotected async buildServiceMetadata(): Promise<NonNullable<ServiceMetadata['services']['username']>[string]> {\n\t\tconst acceptedIssuerDNs = this.acceptedIssuerDNs();\n\t\tconst operations: NonNullable<ServiceMetadata['services']['username']>[string]['operations'] = {\n\t\t\tresolve: (new URL('/api/resolve/{toResolve}', this.url)).toString()\n\t\t};\n\n\t\tconst authentication: ServiceMetadataAuthenticationType = {\n\t\t\tmethod: 'keeta-account',\n\t\t\ttype: 'required'\n\t\t}\n\n\t\tif (this.usernames.claim) {\n\t\t\toperations.claim = {\n\t\t\t\turl: (new URL('/api/claim', this.url)).toString(),\n\t\t\t\toptions: { authentication }\n\t\t\t};\n\t\t}\n\n\t\tif (this.usernames.releaseUsername) {\n\t\t\toperations.release = {\n\t\t\t\turl: (new URL('/api/release', this.url)).toString(),\n\t\t\t\toptions: { authentication }\n\t\t\t};\n\t\t}\n\n\t\tif (this.usernames.search) {\n\t\t\toperations.search = { url: (new URL('/api/search', this.url)).toString() };\n\t\t}\n\n\t\treturn({\n\t\t\toperations,\n\t\t\t...(this.#usernamePattern ? { usernamePattern: this.#usernamePattern.source } : {}),\n\t\t\t...(acceptedIssuerDNs !== undefined && { acceptedIssuerDNs })\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/services/username/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { KeetaNet } from '../../client/index.js';\nimport type * as KeetaAnchorHTTPServer from '../../lib/http-server/index.js';\nimport type { KeetaAnchorMetadataServerConfig } from '../../lib/anchor-metadata-server.js';\nimport type {\n\tKeetaUsernameAnchorUsernameResolutionContext,\n\tKeetaUsernameAnchorAccountResolutionContext,\n\tKeetaUsernameAnchorClaimRequest,\n\tKeetaUsernameAnchorClaimRequestPayload,\n\tKeetaUsernameAnchorSearchRequestParameters,\n\tKeetaUsernameAnchorUsernameWithAccount,\n\tKeetaUsernameAnchorSearchResponseJSON,\n\tKeetaUsernameAnchorClaimContext\n} from './common.js';\nimport {\n\tgetUsernameClaimSignable,\n\tvalidateUsernameDefault,\n\tErrors,\n\tisKeetaNetPublicKeyString,\n\tassertKeetaUsernameAnchorClaimRequestJSON,\n\tgetUsernameTransferSignable,\n\tassertKeetaUsernameAnchorReleaseRequestJSON,\n\tgetUsernameReleaseSignable\n} from './common.js';\nimport type { ServiceMetadata, ServiceMetadataAuthenticationType } from '../../lib/resolver.ts';\nimport type { Routes } from '../../lib/http-server/index.ts';\nimport { KeetaAnchorMetadataServer } from '../../lib/anchor-metadata-server.js';\nimport { KeetaAnchorUserError, KeetaAnchorUserValidationError } from '../../lib/error.js';\nimport { verifyBodyAuth } from '../../lib/http-server/common.js';\nimport * as Signing from '../../lib/utils/signing.js';\n\nfunction normalizeUsernamePattern(pattern: string | RegExp): RegExp {\n\tif (typeof pattern === 'string') {\n\t\ttry {\n\t\t\treturn(new RegExp(pattern));\n\t\t} catch (error) {\n\t\t\tthrow(new Error(`Invalid usernamePattern regex: ${error instanceof Error ? error.message : String(error)}`));\n\t\t}\n\t}\n\n\tif (pattern.flags !== '') {\n\t\tthrow(new Error('usernamePattern RegExp must not specify flags')); // Flags cannot be reliably shared via metadata string\n\t}\n\n\treturn(new RegExp(pattern.source));\n}\n\ntype ClaimHandlerResponse = { ok: true; } | { ok: false; taken?: false; } | { ok: false; taken: true; };\ntype SearchHandlerResponse = { results: KeetaUsernameAnchorUsernameWithAccount[] };\n\nexport interface KeetaAnchorUsernameServerConfig extends KeetaAnchorMetadataServerConfig {\n\thomepage?: string | (() => Promise<string> | string);\n\tusernames: {\n\t\tresolveUsername: (input: KeetaUsernameAnchorUsernameResolutionContext) => Promise<{ account: InstanceType<typeof KeetaNet.lib.Account>; } | null>;\n\t\tresolveAccount: (input: KeetaUsernameAnchorAccountResolutionContext) => Promise<{ username: string; } | null>;\n\n\t\treleaseUsername?: (input: { account: InstanceType<typeof KeetaNet.lib.Account>; }) => Promise<{ ok: boolean; }>;\n\t\tclaim?: ((input: KeetaUsernameAnchorClaimContext) => Promise<ClaimHandlerResponse>);\n\n\t\tsearch?: ((input: KeetaUsernameAnchorSearchRequestParameters) => Promise<SearchHandlerResponse>);\n\t};\n\troutes?: Routes;\n\tusernamePattern?: string | RegExp;\n}\n\nexport class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorMetadataServer<NonNullable<ServiceMetadata['services']['username']>[string], KeetaAnchorUsernameServerConfig> {\n\treadonly homepage: NonNullable<KeetaAnchorUsernameServerConfig['homepage']>;\n\treadonly usernames: KeetaAnchorUsernameServerConfig['usernames'];\n\treadonly routes: NonNullable<KeetaAnchorUsernameServerConfig['routes']>;\n\treadonly #usernamePattern?: RegExp;\n\n\tconstructor(config: KeetaAnchorUsernameServerConfig) {\n\t\tsuper(config);\n\n\t\tthis.homepage = config.homepage ?? '';\n\t\tthis.usernames = config.usernames;\n\t\tthis.routes = config.routes ?? {};\n\t\tif (config.usernamePattern !== undefined) {\n\t\t\tthis.#usernamePattern = normalizeUsernamePattern(config.usernamePattern);\n\t\t}\n\t}\n\n\t#assertProviderIssuedNameValid(username: string, fieldPath = 'username'): void {\n\t\tvalidateUsernameDefault(username, {\n\t\t\tpattern: this.#usernamePattern,\n\t\t\tfieldPath: fieldPath\n\t\t});\n\t}\n\n\tprotected async initRoutes(config: KeetaAnchorUsernameServerConfig): Promise<KeetaAnchorHTTPServer.Routes> {\n\t\tconst routes: KeetaAnchorHTTPServer.Routes = { ...this.routes };\n\n\t\tif ('homepage' in config) {\n\t\t\troutes['GET /'] = async function() {\n\t\t\t\tlet homepageData: string;\n\t\t\t\tif (typeof config.homepage === 'string') {\n\t\t\t\t\thomepageData = config.homepage;\n\t\t\t\t} else {\n\t\t\t\t\tif (!config.homepage) {\n\t\t\t\t\t\tthrow(new Error('internal error: No homepage function provided'));\n\t\t\t\t\t}\n\n\t\t\t\t\thomepageData = await config.homepage();\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: homepageData,\n\t\t\t\t\tcontentType: 'text/html; charset=utf-8'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\troutes['GET /api/resolve/:toResolve'] = async (params) => {\n\t\t\tlet toResolve = params.get('toResolve');\n\t\t\tif (!toResolve) {\n\t\t\t\tthrow(new KeetaAnchorUserError('Missing toResolve parameter'));\n\t\t\t}\n\n\t\t\tlet resolution;\n\t\t\tlet account = null;\n\t\t\tlet username = null;\n\t\t\tif (isKeetaNetPublicKeyString(toResolve)) {\n\t\t\t\taccount = KeetaNet.lib.Account.fromPublicKeyString(toResolve);\n\t\t\t\tresolution = await this.usernames.resolveAccount({ account });\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\ttoResolve = decodeURIComponent(toResolve);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\t\t\t\tfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: 'toResolve',\n\t\t\t\t\t\t\t\tmessage: 'toResolve parameter is not a valid URI component',\n\t\t\t\t\t\t\t\treceivedValue: toResolve\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\tthis.#assertProviderIssuedNameValid(toResolve);\n\t\t\t\tusername = toResolve;\n\t\t\t\tresolution = await this.usernames.resolveUsername({ username });\n\t\t\t}\n\n\t\t\tif (!resolution) {\n\t\t\t\tthrow(new Errors.UserNotFound({ username: username ?? undefined, account: account ?? undefined }));\n\t\t\t}\n\n\t\t\tif ('account' in resolution) {\n\t\t\t\tif (account !== null && !(account.comparePublicKey(resolution.account))) {\n\t\t\t\t\tthrow(new Error('internal: Resolved account does not match requested account'));\n\t\t\t\t}\n\n\t\t\t\taccount = resolution.account;\n\t\t\t}\n\n\t\t\tif ('username' in resolution) {\n\t\t\t\tif (username !== null && username !== resolution.username) {\n\t\t\t\t\tthrow(new Error('internal: Resolved username does not match requested username'));\n\t\t\t\t}\n\n\t\t\t\tusername = resolution.username;\n\t\t\t}\n\n\t\t\tif (!account || !username) {\n\t\t\t\tthrow(new Error('internal: We should know both the account and username here'));\n\t\t\t}\n\n\t\t\treturn({\n\t\t\t\toutput: JSON.stringify({\n\t\t\t\t\tok: true,\n\t\t\t\t\taccount: KeetaNet.lib.Account.toPublicKeyString(account),\n\t\t\t\t\tusername: username\n\t\t\t\t}),\n\t\t\t\tcontentType: 'application/json'\n\t\t\t});\n\t\t};\n\n\t\tconst claimHandler = this.usernames.claim;\n\t\tif (claimHandler) {\n\t\t\troutes['POST /api/claim'] = async (_params, body) => {\n\t\t\t\tconst raw = assertKeetaUsernameAnchorClaimRequestJSON(body);\n\n\t\t\t\tthis.#assertProviderIssuedNameValid(raw.username);\n\n\t\t\t\tlet transfer: KeetaUsernameAnchorClaimRequest['transfer'];\n\t\t\t\tif (raw.transfer) {\n\t\t\t\t\tconst fromAccount = KeetaNet.lib.Account.toAccount(raw.transfer.from);\n\t\t\t\t\tconst toAccount = KeetaNet.lib.Account.toAccount(raw.account);\n\t\t\t\t\tconst transferSignable = getUsernameTransferSignable({\n\t\t\t\t\t\tusername: raw.username,\n\t\t\t\t\t\tfrom: fromAccount,\n\t\t\t\t\t\tto: toAccount\n\t\t\t\t\t});\n\n\t\t\t\t\tconst verifiedTransfer = await Signing.VerifySignedData(fromAccount, transferSignable, raw.transfer.signed);\n\t\t\t\t\tif (!verifiedTransfer) {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserError('Invalid username claim transfer signature'));\n\t\t\t\t\t}\n\n\t\t\t\t\ttransfer = { from: fromAccount, signed: raw.transfer.signed };\n\t\t\t\t}\n\n\t\t\t\tconst account = await verifyBodyAuth(raw, function(req) {\n\t\t\t\t\tconst claimAccount = KeetaNet.lib.Account.toAccount(req.account);\n\t\t\t\t\tconst claimPayload: KeetaUsernameAnchorClaimRequestPayload = {\n\t\t\t\t\t\tusername: req.username,\n\t\t\t\t\t\taccount: claimAccount\n\t\t\t\t\t};\n\t\t\t\t\tif (transfer) {\n\t\t\t\t\t\tclaimPayload.transfer = transfer;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn(getUsernameClaimSignable(claimPayload));\n\t\t\t\t}, this.resolvedCertificateChainRequirement);\n\n\t\t\t\tconst claimResponse = await claimHandler({\n\t\t\t\t\tusername: raw.username,\n\t\t\t\t\taccount,\n\t\t\t\t\tfromUser: transfer?.from ?? null\n\t\t\t\t});\n\n\t\t\t\tif (!claimResponse.ok) {\n\t\t\t\t\tif (claimResponse.taken) {\n\t\t\t\t\t\tthrow(new Errors.UsernameAlreadyTaken({ username: raw.username }));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserError('Username claim rejected'));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify({ ok: true }),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tconst releaseHandler = this.usernames.releaseUsername;\n\t\tif (releaseHandler) {\n\t\t\troutes['POST /api/release'] = async (_params, body) => {\n\t\t\t\tconst raw = assertKeetaUsernameAnchorReleaseRequestJSON(body);\n\t\t\t\tconst account = await verifyBodyAuth(raw, function(req) {\n\t\t\t\t\treturn(getUsernameReleaseSignable({ account: KeetaNet.lib.Account.toAccount(req.account) }));\n\t\t\t\t}, this.resolvedCertificateChainRequirement);\n\n\t\t\t\tconst releaseResponse = await releaseHandler({ account });\n\n\t\t\t\tif (!releaseResponse.ok) {\n\t\t\t\t\tthrow(new KeetaAnchorUserError('Release claim rejected'));\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify({ ok: true }),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tconst searchHandler = this.usernames.search;\n\t\tif (searchHandler) {\n\t\t\troutes['GET /api/search'] = async (_ignore_params, _ignore_body, _ignore_headers, url) => {\n\t\t\t\tconst request: KeetaUsernameAnchorSearchRequestParameters = (() => {\n\t\t\t\t\tconst searchParameter = url.searchParams.get('search');\n\n\t\t\t\t\tif (!searchParameter) {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\t\t\t\t\tfields: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath: 'search',\n\t\t\t\t\t\t\t\t\tmessage: 'Missing search parameter',\n\t\t\t\t\t\t\t\t\treceivedValue: searchParameter\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#assertProviderIssuedNameValid(searchParameter, 'search');\n\n\t\t\t\t\treturn({ search: searchParameter });\n\t\t\t\t})();\n\n\t\t\t\tconst searchResponse = await searchHandler(request);\n\n\t\t\t\tconst formatted: KeetaUsernameAnchorSearchResponseJSON = {\n\t\t\t\t\tok: true,\n\t\t\t\t\tresults: searchResponse.results.map(function(result) {\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\tusername: result.username,\n\t\t\t\t\t\t\taccount: result.account.publicKeyString.get()\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify(formatted),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\n\t\treturn(routes);\n\t}\n\n\tprotected async buildServiceMetadata(): Promise<NonNullable<ServiceMetadata['services']['username']>[string]> {\n\t\tconst acceptedIssuerDNs = this.acceptedIssuerDNs();\n\t\tconst operations: NonNullable<ServiceMetadata['services']['username']>[string]['operations'] = {\n\t\t\tresolve: (new URL('/api/resolve', this.url)).toString() + '/{toResolve}'\n\t\t};\n\n\t\tconst authentication: ServiceMetadataAuthenticationType = {\n\t\t\tmethod: 'keeta-account',\n\t\t\ttype: 'required'\n\t\t}\n\n\t\tif (this.usernames.claim) {\n\t\t\toperations.claim = {\n\t\t\t\turl: (new URL('/api/claim', this.url)).toString(),\n\t\t\t\toptions: { authentication }\n\t\t\t};\n\t\t}\n\n\t\tif (this.usernames.releaseUsername) {\n\t\t\toperations.release = {\n\t\t\t\turl: (new URL('/api/release', this.url)).toString(),\n\t\t\t\toptions: { authentication }\n\t\t\t};\n\t\t}\n\n\t\tif (this.usernames.search) {\n\t\t\toperations.search = { url: (new URL('/api/search', this.url)).toString() };\n\t\t}\n\n\t\treturn({\n\t\t\toperations,\n\t\t\t...(this.#usernamePattern ? { usernamePattern: this.#usernamePattern.source } : {}),\n\t\t\t...(acceptedIssuerDNs !== undefined && { acceptedIssuerDNs })\n\t\t});\n\t}\n}\n"]}